diff --git a/.betterer.eslint.config.js b/.betterer.eslint.config.js index 5735cbaec0d..8d742ae5187 100644 --- a/.betterer.eslint.config.js +++ b/.betterer.eslint.config.js @@ -10,6 +10,7 @@ const testingLibraryPlugin = require('eslint-plugin-testing-library'); const grafanaConfig = require('@grafana/eslint-config/flat'); const grafanaPlugin = require('@grafana/eslint-plugin'); +const grafanaI18nPlugin = require('@grafana/i18n/eslint-plugin'); // Include the Grafana config and remove the rules, // as we just want to pull in all of the necessary configuration but not run the rules @@ -65,6 +66,7 @@ module.exports = [ 'no-barrel-files': barrelPlugin, '@grafana': grafanaPlugin, 'testing-library': testingLibraryPlugin, + '@grafana/i18n': grafanaI18nPlugin, }, linterOptions: { // This reports unused disable directives that we can clean up but @@ -122,11 +124,11 @@ module.exports = [ 'error', { selector: 'Identifier[name=localStorage]', - message: 'Direct usage of localStorage is not allowed. Use `Store` from @grafana/data instead.', + message: 'Direct usage of localStorage is not allowed. import store from @grafana/data instead', }, { selector: 'MemberExpression[object.name=localStorage]', - message: 'Direct usage of localStorage is not allowed. Use `Store` from @grafana/data instead.', + message: 'Direct usage of localStorage is not allowed. import store from @grafana/data instead', }, { selector: diff --git a/.betterer.results b/.betterer.results index 9c867b86097..02d1f01333c 100644 --- a/.betterer.results +++ b/.betterer.results @@ -12,15 +12,15 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], "e2e/old-arch/utils/support/localStorage.ts:5381": [ - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "0"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "1"] + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "0"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "1"] ], "e2e/old-arch/utils/support/types.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], "e2e/utils/support/localStorage.ts:5381": [ - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "0"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "1"] + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "0"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "1"] ], "e2e/utils/support/types.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] @@ -369,12 +369,12 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "0"] ], "packages/grafana-data/src/utils/store.ts:5381": [ - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "0"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "1"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "2"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "3"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "4"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "5"] + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "0"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "1"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "2"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "3"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "4"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "5"] ], "packages/grafana-data/src/utils/url.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], @@ -421,12 +421,12 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], "packages/grafana-prometheus/src/components/metrics-browser/useMetricsLabelsValues.ts:5381": [ - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "0"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "1"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "2"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "3"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "4"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "5"] + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "0"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "1"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "2"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "3"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "4"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "5"] ], "packages/grafana-prometheus/src/datasource.ts:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"], @@ -479,7 +479,7 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], "packages/grafana-runtime/src/config.ts:5381": [ - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "0"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "0"], [0, 0, 0, "Do not use any type assertions.", "1"], [0, 0, 0, "Do not use any type assertions.", "2"], [0, 0, 0, "Do not use any type assertions.", "3"], @@ -530,18 +530,18 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "0"] ], "packages/grafana-runtime/src/utils/userStorage.tsx:5381": [ - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "0"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "1"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "2"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "3"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "4"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "5"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "6"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "7"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "8"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "9"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "10"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "11"] + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "0"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "1"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "2"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "3"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "4"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "5"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "6"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "7"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "8"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "9"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "10"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "11"] ], "packages/grafana-schema/src/veneer/common.types.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] @@ -557,9 +557,13 @@ exports[`better eslint`] = { ], "packages/grafana-sql/src/components/configuration/ConnectionLimits.tsx:5381": [ [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"], - [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "1"], - [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "2"], - [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "3"] + [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "1"] + ], + "packages/grafana-sql/src/components/configuration/MaxLifetimeField.tsx:5381": [ + [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"] + ], + "packages/grafana-sql/src/components/configuration/MaxOpenConnectionsField.tsx:5381": [ + [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"] ], "packages/grafana-sql/src/components/configuration/TLSSecretsConfig.tsx:5381": [ [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"], @@ -644,9 +648,6 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "4"], [0, 0, 0, "Unexpected any. Specify a different type.", "5"] ], - "packages/grafana-ui/src/components/Select/ValueContainer.tsx:5381": [ - [0, 0, 0, "Unexpected any. Specify a different type.", "0"] - ], "packages/grafana-ui/src/components/Select/resetSelectStyles.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"], @@ -840,7 +841,7 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], "packages/grafana-ui/src/utils/logger.ts:5381": [ - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "0"] + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "0"] ], "packages/grafana-ui/src/utils/useAsyncDependency.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] @@ -959,9 +960,9 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], "public/app/core/reducers/appNotification.ts:5381": [ - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "0"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "1"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "2"] + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "0"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "1"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "2"] ], "public/app/core/services/ResponseQueue.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] @@ -987,6 +988,9 @@ exports[`better eslint`] = { "public/app/core/specs/backend_srv.test.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], + "public/app/core/store.ts:5381": [ + [0, 0, 0, "Do not re-export imported variable (\`store\`)", "0"] + ], "public/app/core/time_series2.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"], @@ -1185,11 +1189,6 @@ exports[`better eslint`] = { "public/app/features/alerting/unified/components/create-folder/CreateNewFolder.tsx:5381": [ [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"] ], - "public/app/features/alerting/unified/components/import-to-gma/ImportFromDSRules.tsx:5381": [ - [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"], - [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "1"], - [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "2"] - ], "public/app/features/alerting/unified/components/import-to-gma/NamespaceAndGroupFilter.tsx:5381": [ [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"], [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "1"] @@ -1319,14 +1318,14 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "0"] ], "public/app/features/alerting/unified/components/rule-editor/alert-rule-form/AlertRuleForm.tsx:5381": [ - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "0"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "1"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "2"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "3"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "4"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "5"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "6"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "7"] + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "0"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "1"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "2"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "3"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "4"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "5"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "6"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "7"] ], "public/app/features/alerting/unified/components/rule-editor/alert-rule-form/simplifiedRouting/contactPoint/ContactPointSelector.tsx:5381": [ [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"] @@ -1416,12 +1415,12 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], "public/app/features/alerting/unified/rule-editor/formDefaults.ts:5381": [ - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "0"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "1"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "2"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "3"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "4"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "5"] + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "0"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "1"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "2"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "3"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "4"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "5"] ], "public/app/features/alerting/unified/rule-list/FilterViewStatus.tsx:5381": [ [0, 0, 0, "Add noMargin prop to Card components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"] @@ -1484,8 +1483,8 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "0"] ], "public/app/features/browse-dashboards/api/useRecentlyDeletedStateManager.ts:5381": [ - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "0"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "1"] + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "0"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "1"] ], "public/app/features/browse-dashboards/components/BrowseActions/MoveModal.tsx:5381": [ [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"] @@ -1641,15 +1640,6 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "5"], [0, 0, 0, "Unexpected any. Specify a different type.", "6"] ], - "public/app/features/dashboard-scene/saving/provisioned/SaveProvisionedDashboardForm.tsx:5381": [ - [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"], - [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "1"], - [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "2"], - [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "3"], - [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "4"], - [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "5"], - [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "6"] - ], "public/app/features/dashboard-scene/scene/PanelMenuBehavior.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], @@ -1759,8 +1749,7 @@ exports[`better eslint`] = { [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"] ], "public/app/features/dashboard-scene/settings/variables/components/GroupByVariableForm.tsx:5381": [ - [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"], - [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "1"] + [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"] ], "public/app/features/dashboard-scene/settings/variables/components/QueryVariableForm.tsx:5381": [ [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"] @@ -2507,12 +2496,12 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "0"] ], "public/app/features/logs/utils.ts:5381": [ - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "0"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "1"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "2"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "3"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "4"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "5"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "0"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "1"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "2"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "3"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "4"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "5"], [0, 0, 0, "Do not use any type assertions.", "6"] ], "public/app/features/manage-dashboards/DashboardImportPage.tsx:5381": [ @@ -2739,26 +2728,12 @@ exports[`better eslint`] = { [0, 0, 0, "Add noMargin prop to Card components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "2"], [0, 0, 0, "Add noMargin prop to Card components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "3"] ], - "public/app/features/provisioning/Wizard/BootstrapStep.tsx:5381": [ - [0, 0, 0, "Add noMargin prop to Card components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"], - [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "1"] - ], - "public/app/features/provisioning/Wizard/ConnectStep.tsx:5381": [ - [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"], - [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "1"], - [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "2"], - [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "3"], - [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "4"] - ], "public/app/features/provisioning/Wizard/FinishStep.tsx:5381": [ [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"], [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "1"], [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "2"], [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "3"] ], - "public/app/features/provisioning/Wizard/SynchronizeStep.tsx:5381": [ - [0, 0, 0, "Add noMargin prop to Field components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"] - ], "public/app/features/provisioning/types.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], @@ -2806,10 +2781,10 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "2"] ], "public/app/features/scopes/selector/ScopesSelectorService.ts:5381": [ - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "0"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "1"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "2"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "3"] + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "0"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "1"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "2"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "3"] ], "public/app/features/search/page/components/columns.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] @@ -2826,31 +2801,31 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "0"] ], "public/app/features/search/state/SearchStateManager.ts:5381": [ - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "0"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "1"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "2"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "3"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "4"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "5"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "6"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "7"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "8"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "9"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "10"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "11"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "12"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "13"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "14"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "15"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "0"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "1"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "2"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "3"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "4"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "5"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "6"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "7"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "8"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "9"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "10"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "11"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "12"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "13"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "14"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "15"], [0, 0, 0, "Do not use any type assertions.", "16"] ], "public/app/features/search/types.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], "public/app/features/search/utils.ts:5381": [ - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "0"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "1"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "2"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "0"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "1"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "2"], [0, 0, 0, "Do not use any type assertions.", "3"] ], "public/app/features/serviceaccounts/ServiceAccountCreatePage.tsx:5381": [ @@ -3760,21 +3735,21 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], "public/app/plugins/datasource/loki/LogContextProvider.ts:5381": [ - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "0"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "1"] + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "0"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "1"] ], "public/app/plugins/datasource/loki/components/LokiContextUi.tsx:5381": [ - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "0"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "1"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "2"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "3"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "4"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "5"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "6"] + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "0"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "1"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "2"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "3"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "4"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "5"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "6"] ], "public/app/plugins/datasource/loki/components/LokiQueryEditor.tsx:5381": [ - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "0"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "1"] + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "0"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "1"] ], "public/app/plugins/datasource/loki/configuration/ConfigEditor.tsx:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] @@ -3801,12 +3776,12 @@ exports[`better eslint`] = { [0, 0, 0, "Add noMargin prop to Card components to remove built-in margins. Use layout components like Stack or Grid with the gap prop instead for consistent spacing.", "0"] ], "public/app/plugins/datasource/loki/querybuilder/state.ts:5381": [ - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "0"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "1"] + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "0"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "1"] ], "public/app/plugins/datasource/loki/shardQuerySplitting.ts:5381": [ - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "0"], - [0, 0, 0, "Direct usage of localStorage is not allowed. Use \`Store\` from @grafana/data instead.", "1"] + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "0"], + [0, 0, 0, "Direct usage of localStorage is not allowed. import store from @grafana/data instead", "1"] ], "public/app/plugins/datasource/loki/types.ts:5381": [ [0, 0, 0, "Do not re-export imported variable (\`LokiQueryDirection\`)", "0"], diff --git a/.citools/src/cog/go.mod b/.citools/src/cog/go.mod index 98dadf88546..1258685195e 100644 --- a/.citools/src/cog/go.mod +++ b/.citools/src/cog/go.mod @@ -17,7 +17,7 @@ require ( github.com/google/go-cmp v0.7.0 // indirect github.com/google/uuid v1.6.0 // indirect github.com/grafana/codejen v0.0.4-0.20230321061741-77f656893a3d // indirect - github.com/grafana/cog v0.0.28 // indirect + github.com/grafana/cog v0.0.34 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/huandu/xstrings v1.5.0 // indirect diff --git a/.citools/src/cog/go.sum b/.citools/src/cog/go.sum index 108db2d30d7..4a69777748f 100644 --- a/.citools/src/cog/go.sum +++ b/.citools/src/cog/go.sum @@ -27,8 +27,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/grafana/codejen v0.0.4-0.20230321061741-77f656893a3d h1:hrXbGJ5jgp6yNITzs5o+zXq0V5yT3siNJ+uM8LGwWKk= github.com/grafana/codejen v0.0.4-0.20230321061741-77f656893a3d/go.mod h1:zmwwM/DRyQB7pfuBjTWII3CWtxcXh8LTwAYGfDfpR6s= -github.com/grafana/cog v0.0.28 h1:0+FNuxyfNWm1OBZPPjgBIno3nzR4gOpSxsVe34hdN7g= -github.com/grafana/cog v0.0.28/go.mod h1:wZWsTLV7uX0jCbGpqvjawQ7JbaDVT9oW+PQhHwqanHc= +github.com/grafana/cog v0.0.34 h1:tXtjIB0A0Y6jeZ5iAQBJIAz5vkAJsV0iEFfX94PH/+Q= +github.com/grafana/cog v0.0.34/go.mod h1:UDstzYqMdgIROmbfkHL8fB9XWQO2lnf5z+4W/eJo4Dc= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 55285548803..c420738cfb2 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -259,7 +259,6 @@ /devenv/docker/blocks/etcd @grafana/grafana-app-platform-squad /devenv/docker/blocks/grafana/ @grafana/grafana-as-code /devenv/docker/blocks/graphite/ @grafana/partner-datasources -/devenv/docker/blocks/graphite09/ @grafana/partner-datasources /devenv/docker/blocks/graphite1/ @grafana/partner-datasources /devenv/docker/blocks/influxdb/ @grafana/partner-datasources /devenv/docker/blocks/influxdb1/ @grafana/partner-datasources @@ -774,7 +773,8 @@ embed.go @grafana/grafana-as-code /.github/workflows/auto-milestone.yml @grafana/grafana-developer-enablement-squad /.github/workflows/backend-code-checks.yml @grafana/grafana-backend-group /.github/workflows/backend-unit-tests.yml @grafana/grafana-backend-group -/.github/workflows/backport.yml @grafana/grafana-developer-enablement-squad +/.github/workflows/backport-trigger.yml @grafana/grafana-developer-enablement-squad +/.github/workflows/backport-workflow.yml @grafana/grafana-developer-enablement-squad /.github/workflows/bump-version.yml @grafana/grafana-developer-enablement-squad /.github/workflows/release-pr.yml @grafana/grafana-developer-enablement-squad /.github/workflows/release-comms.yml @grafana/grafana-developer-enablement-squad diff --git a/.github/actions/changelog/index.js b/.github/actions/changelog/index.js index b658caf349c..7bfcfc82148 100644 --- a/.github/actions/changelog/index.js +++ b/.github/actions/changelog/index.js @@ -1,6 +1,7 @@ -import { appendFileSync, writeFileSync } from 'fs'; -import { exec as execCallback } from 'node:child_process'; -import { promisify } from 'node:util'; +import {appendFileSync, writeFileSync} from 'fs'; +import {exec as execCallback} from 'node:child_process'; +import {promisify} from 'node:util'; +import {findPreviousVersion, semverParse} from "./semver.js"; // // Github Action core utils: logging (notice + debug log levels), must escape @@ -9,35 +10,6 @@ import { promisify } from 'node:util'; const escapeData = (s) => s.replace(/%/g, '%25').replace(/\r/g, '%0D').replace(/\n/g, '%0A'); const LOG = (msg) => console.log(`::notice::${escapeData(msg)}`); -// -// Semver utils: parse, compare, sort etc (using official regexp) -// https://regex101.com/r/Ly7O1x/3/ -// -const semverRegExp = - /^v?(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/; - -const semverParse = (tag) => { - const m = tag.match(semverRegExp); - if (!m) { - return; - } - const [_, major, minor, patch, prerelease] = m; - return [+major, +minor, +patch, prerelease, tag]; -}; - -// semverCompare takes two parsed semver tags and comparest them more or less -// according to the semver specs -const semverCompare = (a, b) => { - for (let i = 0; i < 3; i++) { - if (a[i] !== b[i]) { - return a[i] < b[i] ? 1 : -1; - } - } - if (a[3] !== b[3]) { - return a[3] < b[3] ? 1 : -1; - } - return 0; -}; // Using `git tag -l` output find the tag (version) that goes semantically // right before the given version. This might not work correctly with some @@ -45,29 +17,32 @@ const semverCompare = (a, b) => { // into this action explicitly to avoid this step. const getPreviousVersion = async (version) => { const exec = promisify(execCallback); - const { stdout } = await exec('git tag -l'); - const prev = stdout + const {stdout} = await exec('git for-each-ref --sort=-creatordate --format \'%(refname:short)\' refs/tags'); + + const parsedTags = stdout .split('\n') .map(semverParse) - .filter((tag) => tag) - .sort(semverCompare) - .find((tag) => semverCompare(tag, semverParse(version)) > 0); + .filter(Boolean); + + const parsedVersion = semverParse(version); + const prev = findPreviousVersion(parsedTags, parsedVersion); if (!prev) { throw `Could not find previous git tag for ${version}`; } - return prev[4]; + return prev[5]; }; + // A helper for Github GraphQL API endpoint const graphql = async (ghtoken, query, variables) => { - const { env } = process; + const {env} = process; const results = await fetch('https://api.github.com/graphql', { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${ghtoken}`, }, - body: JSON.stringify({ query, variables }), + body: JSON.stringify({query, variables}), }); const res = await results.json(); @@ -100,7 +75,7 @@ const getCommitishDate = async (name, owner, target) => { } } `, - { name, owner, target } + {name, owner, target} ); return result.repository.object.committedDate; }; @@ -160,7 +135,7 @@ const getHistory = async (name, owner, from, to) => { let cursor; let nodes = []; - for (;;) { + for (; ;) { const result = await graphql(ghtoken, query, { name, owner, @@ -170,7 +145,7 @@ const getHistory = async (name, owner, from, to) => { }); LOG(`GraphQL: ${JSON.stringify(result)}`); nodes = [...nodes, ...result.repository.ref.compare.commits.nodes]; - const { hasNextPage, endCursor } = result.repository.ref.compare.commits.pageInfo; + const {hasNextPage, endCursor} = result.repository.ref.compare.commits.pageInfo; if (!hasNextPage) { break; } @@ -186,7 +161,7 @@ const getHistory = async (name, owner, from, to) => { // PR grouping relies on Github labels only, not on the PR contents. const getChangeLogItems = async (name, owner, from, to) => { // check if a node contains a certain label - const hasLabel = ({ labels }, label) => labels.nodes.some(({ name }) => name === label); + const hasLabel = ({labels}, label) => labels.nodes.some(({name}) => name === label); // get all the PRs between the two "commitish" items const history = await getHistory(name, owner, from, to); @@ -197,17 +172,17 @@ const getChangeLogItems = async (name, owner, from, to) => { return []; } const item = changes[0]; - const { number, url, labels } = item; + const {number, url, labels} = item; const title = item.title.replace(/^\[[^\]]+\]:?\s*/, ''); // for changelog PRs try to find a suitable category. // Note that we can not detect "deprecation notices" like that // as there is no suitable label yet. - const isBug = /fix/i.test(title) || hasLabel({ labels }, 'type/bug'); - const isBreaking = hasLabel({ labels }, 'breaking change'); + const isBug = /fix/i.test(title) || hasLabel({labels}, 'type/bug'); + const isBreaking = hasLabel({labels}, 'breaking change'); const isPlugin = - hasLabel({ labels }, 'area/grafana/ui') || - hasLabel({ labels }, 'area/grafana/toolkit') || - hasLabel({ labels }, 'area/grafana/runtime'); + hasLabel({labels}, 'area/grafana/ui') || + hasLabel({labels}, 'area/grafana/toolkit') || + hasLabel({labels}, 'area/grafana/runtime'); const author = item.commits.nodes[0].commit.author.user?.login; return { repo: name, @@ -227,7 +202,7 @@ const getChangeLogItems = async (name, owner, from, to) => { // ====================================================== LOG(`Changelog action started`); - +console.log(process.argv); const ghtoken = process.env.GITHUB_TOKEN || process.env.INPUT_GITHUB_TOKEN; if (!ghtoken) { throw 'GITHUB_TOKEN is not set and "github_token" input is empty'; @@ -286,15 +261,15 @@ const markdown = (changelog) => { : `### ${title} ${items - .map( - (item) => - `- ${item.title.replace(/^([^:]*:)/gm, '**$1**')} ${ - item.repo === 'grafana-enterprise' - ? '(Enterprise)' - : `${pullRequestLink(item.number)}${item.author ? ', ' + userLink(item.author) : ''}` - }` - ) - .join('\n')} + .map( + (item) => + `- ${item.title.replace(/^([^:]*:)/gm, '**$1**')} ${ + item.repo === 'grafana-enterprise' + ? '(Enterprise)' + : `${pullRequestLink(item.number)}${item.author ? ', ' + userLink(item.author) : ''}` + }` + ) + .join('\n')} `; // Render all present sections for the given changelog diff --git a/.github/actions/changelog/semver.js b/.github/actions/changelog/semver.js new file mode 100644 index 00000000000..461ce5195c8 --- /dev/null +++ b/.github/actions/changelog/semver.js @@ -0,0 +1,92 @@ +// +// Semver utils: parse, compare, sort etc (using official regexp) +// https://regex101.com/r/Ly7O1x/3/ +// +const semverRegExp = + /^v?(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?$/; + +export function semverParse(tag) { + const m = tag.match(semverRegExp); + if (!m) { + return; + } + const [_, major, minor, patch, prerelease, build] = m; + return [+major, +minor, +patch, prerelease, build, tag]; +}; + +// semverCompare takes two parsed semver tags and comparest them more or less +// according to the semver specs +export function semverCompare(a, b) { + for (let i = 0; i < 3; i++) { + if (a[i] !== b[i]) { + return a[i] < b[i] ? 1 : -1; + } + } + if (a[3] !== b[3]) { + return a[3] < b[3] ? 1 : -1; + } + return 0; +}; + + +// Finds the highest version that is lower than the target version. +// +// This function relies on the following invariant: versions are sorted by the release date. +// It will produce wrong result if invariant doesn't hold. +export const findPreviousVersion = (versionByDate, target) => { + let prev = null; + + for (let i = 0; i < versionByDate.length; i++) { + const version = versionByDate[i]; + + // version is greater than the target + if (semverCompare(target, version) > 0) { + continue; + } + + // we came across the target version, all versions seen previously have greater release date. + if (semverCompare(target, version) === 0 && target[4] === version[4]) { + prev = null; + continue; + } + + if (prev == null) { + prev = version; + continue; + } + + if (semverCompare(prev, version) > 0) { + prev = version; + } + } + + return prev; +}; + + +const versionsByDate = [ + "v10.4.19", "v12.0.1", "v11.6.2", "v11.5.5", "v11.4.5", "v11.3.7", "v11.2.10", "v12.0.0+security-01", "v11.2.9+security-01", "v11.3.6+security-01", + "v11.6.1+security-01", "v11.4.4+security-01", "v11.5.4+security-01", "v10.4.18+security-01", "v12.0.0", "v11.6.1", + "v11.5.4", "v11.4.4", "v11.3.6", "v11.2.9", "v10.4.18", "v11.6.0+security-01", "v11.5.3+security-01", "v11.4.3+security-01", + "v11.3.5+security-01", "v11.2.8+security-01", "v10.4.17+security-01", "v11.2.8", "v11.6.0", "v11.5.2", "v11.4.2", + "v11.3.4", "v11.2.7", "v11.1.12", "v11.0.11", "v10.4.16", "v11.5.1", "v11.5.0", "v11.3.3", "v11.1.11", "v11.2.6", + "v11.0.10", "v10.4.15", "v11.4.1", "v11.4.0", "v11.3.2", "v11.2.5", "v11.1.10", "v11.0.9", "v10.4.14", "v11.3.1", + "v11.2.4", "v11.1.9", "v11.0.8", "v10.4.13", "v11.0.2", "v10.4.6", "v10.3.8", "v10.2.9", "v11.1.0", "v11.0.1", + "v10.4.5", "v10.3.7", "v10.2.8", "v9.5.20", "v10.4.4", "v9.5.19", "v10.1.10", "v10.2.7", "v10.3.6", "v10.4.3", + "v11.0.0", "v10.4.2", "v11.0.0-preview", "v10.1.9", "v10.0.13", "v9.2.0", "v9.1.8", +].map(semverParse); + +function test(version, expected) { + const v1 = semverParse(version); + const prev = findPreviousVersion(versionsByDate, v1); + + const failureMessage = `FAIILED. Expected ${expected}, but was ${prev[5]}`; + + console.log(`Test ${version}, ${prev[5] === expected ? 'PASSED' : failureMessage}`); +} + +test("v11.5.4+security-01", "v11.5.4"); +test("v11.5.4", "v11.5.3+security-01"); +test("v12.0.0", "v11.6.1"); +test("v12.0.0+security-01", "v12.0.0"); +test("v11.0.0", "v11.0.0-preview"); diff --git a/.github/workflows/backport-trigger.yml b/.github/workflows/backport-trigger.yml new file mode 100644 index 00000000000..3b3758c573b --- /dev/null +++ b/.github/workflows/backport-trigger.yml @@ -0,0 +1,47 @@ +# We need secrets to backport, but they're not available for actions ran by forks. +# So this workflow is used as a 'trigger', which the backport-workflow.yml will with +# via workflow_run + +name: Backport (trigger) +on: + pull_request: + types: + - closed + - labeled + +permissions: {} + +jobs: + trigger: + # Only run this job if the PR has been merged and has a label containing "backport v" + if: | + github.repository == 'grafana/grafana' && + github.event.pull_request.merged == true && + contains(join(github.event.pull_request.labels.*.name, ','), 'backport v') + runs-on: ubuntu-latest + steps: + # TODO: save this as job summary instead? + - name: Trigger + run: | + echo "Triggering workflow" + echo "See https://github.com/${{ github.repository }}/actions/workflows/workflow_run.yml for progress" + + # Create a JSON artifact with details of this PR to pass to the backport workflow. + # The { action: 'labelled', label: 'backport-1.23.x' } can only be determined from this event payload, + # and is needed to do a backport after a PR has been merged + # + # Important that we don't run *anything* from the PR which could modify the backport_data.json file + - name: Create action data + run: | + jq '{ + action: .action, + label: .label.name, + pr_number: .number, + }' "$GITHUB_EVENT_PATH" > /tmp/pr_info.json + + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: pr_info + path: /tmp/pr_info.json + retention-days: 1 diff --git a/.github/workflows/backport-workflow.yml b/.github/workflows/backport-workflow.yml new file mode 100644 index 00000000000..925c6c54bb3 --- /dev/null +++ b/.github/workflows/backport-workflow.yml @@ -0,0 +1,88 @@ +# Runs the actual backport, after being triggered by the backport-trigger.yml workflow. + +name: Backport (workflow) +run-name: "Backport for ${{ github.event.workflow_run.head_branch }} #${{ github.event.workflow_run.run_number }}" +on: + workflow_run: # zizmor: ignore[dangerous-triggers] backport-trigger.yml does not run any user code + workflows: ["Backport (trigger)"] + types: + - completed + +permissions: {} + +jobs: + backport: + # Only run this job if the triggering workflow was not skipped (and on grafana repo) + if: github.repository == 'grafana/grafana' && github.event.workflow_run.conclusion == 'success' + runs-on: ubuntu-latest + permissions: + id-token: write + actions: read + steps: + - name: Get vault secrets + id: secrets + uses: grafana/shared-workflows/actions/get-vault-secrets@main + with: + export_env: false + # Secrets placed in the ci/data/repo/grafana/grafana/delivery-bot-app path in Vault + repo_secrets: | + APP_PEM=delivery-bot-app:PRIVATE_KEY + + - name: Generate token + id: generate_token + uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92 + with: + app_id: ${{ vars.DELIVERY_BOT_APP_ID }} + private_key: ${{ fromJSON(steps.secrets.outputs.secrets).APP_PEM }} + + - name: Download PR info artifact + uses: actions/download-artifact@v4 + id: download-pr-info + with: + github-token: ${{ github.token }} + run-id: ${{ github.event.workflow_run.id }} + name: pr_info + + - name: Get PR info + id: pr-info + env: + PR_INFO_FILE: ${{ steps.download-pr-info.outputs.download-path }}/pr_info.json + # jq-magic to convert the JSON object into a list of key=value pairs for $GITHUB_OUTPUT + run: + jq -r 'to_entries[] | select(.value | type != "object") | "\(.key)=\(.value)"' "$PR_INFO_FILE" >> "$GITHUB_OUTPUT" + + - name: Print PR info + env: + PR_ACTION: ${{ steps.pr-info.outputs.action }} + PR_LABEL: ${{ steps.pr-info.outputs.label }} + PR_NUMBER: ${{ steps.pr-info.outputs.pr_number }} + run: | + echo "PR action: $PR_ACTION" + echo "PR label: $PR_LABEL" + echo "PR number: $PR_NUMBER" + + - name: Checkout Grafana + uses: actions/checkout@v4 + with: + ref: ${{ github.event.repository.default_branch }} + fetch-depth: 2 + fetch-tags: false + token: ${{ steps.generate_token.outputs.token }} + persist-credentials: true + + - name: Configure git user + run: | + git config --local user.name "github-actions[bot]" + git config --local user.email "github-actions[bot]@users.noreply.github.com" + git config --local --add --bool push.autoSetupRemote true + + - name: Run backport + uses: grafana/grafana-github-actions-go/backport@dev + with: + token: ${{ steps.generate_token.outputs.token }} + # If triggered by being labelled, only backport that label. + # Otherwise, the action will backport all labels. + pr_label: ${{ steps.pr-info.outputs.action == 'labeled' && steps.pr-info.outputs.label || '' }} + pr_number: ${{ steps.pr-info.outputs.pr_number }} + repo_owner: ${{ github.repository_owner }} + repo_name: ${{ github.event.repository.name }} diff --git a/.github/workflows/backport.yml b/.github/workflows/backport.yml deleted file mode 100644 index 1fc13807d3b..00000000000 --- a/.github/workflows/backport.yml +++ /dev/null @@ -1,50 +0,0 @@ -name: Backport PR Creator -on: - pull_request: - types: - - closed - - labeled - -jobs: - # TODO: This workflow won't work for forks because no secrets are available. - # This should, at the least, post the comment with manual backport instructions. - main: - if: github.repository == 'grafana/grafana' - runs-on: ubuntu-latest - permissions: - id-token: write - steps: - - name: Get vault secrets - id: vault-secrets - uses: grafana/shared-workflows/actions/get-vault-secrets@main - with: - # Secrets placed in the ci/data/repo/grafana/grafana/delivery-bot-app path in Vault - repo_secrets: | - GRAFANA_DELIVERY_BOT_APP_PEM=delivery-bot-app:PRIVATE_KEY - - - name: Generate token - id: generate_token - uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92 - with: - app_id: ${{ vars.DELIVERY_BOT_APP_ID }} - private_key: ${{ env.GRAFANA_DELIVERY_BOT_APP_PEM }} - - - name: Checkout Grafana - uses: actions/checkout@v4 - with: - ref: main - fetch-depth: 2 - fetch-tags: false - token: ${{ steps.generate_token.outputs.token }} - persist-credentials: true - - - name: Configure git user - run: | - git config --local user.name "github-actions[bot]" - git config --local user.email "github-actions[bot]@users.noreply.github.com" - git config --local --add --bool push.autoSetupRemote true - - - name: Run backport - uses: grafana/grafana-github-actions-go/backport@main - with: - token: ${{ steps.generate_token.outputs.token }} diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index e8833ee1cc1..e83ba74642e 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -22,6 +22,10 @@ on: required: false default: false type: boolean + work_branch: + required: false + type: string + description: "Use specific branch for changelog" workflow_dispatch: inputs: @@ -45,6 +49,10 @@ on: required: false default: false type: boolean + work_branch: + required: false + type: string + description: "Use specific branch for changelog" permissions: {} @@ -98,7 +106,20 @@ jobs: git config --local user.email "github-actions[bot]@users.noreply.github.com" git config --local --add --bool push.autoSetupRemote true - name: "Create branch" - run: git checkout -b "changelog/${RUN_ID}/${VERSION}" + run: | + if [[ "$WORK_BRANCH" == '' ]]; then + git switch -c "changelog/${RUN_ID}/${VERSION}" + exit 0 + fi + + # Checkout the changelog branch if exists, otherwise create a new one + if git show-ref --verify --quiet "refs/remotes/origin/$WORK_BRANCH"; then + git switch --track "origin/$WORK_BRANCH" + else + git switch -c "$WORK_BRANCH" + fi + env: + WORK_BRANCH: ${{ inputs.work_branch }} - name: "Generate changelog" id: changelog uses: ./.github/actions/changelog @@ -145,13 +166,26 @@ jobs: if: inputs.dry_run != true run: git push - name: "Create changelog PR" - run: > - gh pr create \ - --dry-run="${DRY_RUN}" \ - --label "no-backport" \ - --label "no-changelog" \ - -B "${TARGET}" \ - --title "Release: update changelog for ${VERSION}" \ - --body "Changelog changes for release ${VERSION}" + run: | + if gh pr view &>/dev/null; then + echo "Changelog pr has already been created" + else + + gh pr create \ + --dry-run="${DRY_RUN}" \ + --label "no-backport" \ + --label "no-changelog" \ + -B "${TARGET}" \ + --title "Release: update changelog for ${TARGET}" \ + --body "Changelog changes for release versions:" + fi + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - name: "Add release version to PR description" + if: inputs.dry_run != true + run: | + gh pr view --json body --jq .body > pr_body.md + echo " - ${VERSION}" >> pr_body.md + gh pr edit --body-file pr_body.md env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 28535c90de2..a07cb222898 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -35,7 +35,7 @@ jobs: # Override automatic language detection by changing the below list # Supported options are listed here # https://docs.github.com/en/code-security/code-scanning/creating-an-advanced-setup-for-code-scanning/customizing-your-advanced-setup-for-code-scanning#changing-the-languages-that-are-analyzed - language: ['actions', 'javascript', 'go', 'python'] + language: ['actions', 'javascript', 'go'] # Learn more... # https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection diff --git a/.github/workflows/dashboards-issue-add-label.yml b/.github/workflows/dashboards-issue-add-label.yml index 7eea1217941..2ea89c7a441 100644 --- a/.github/workflows/dashboards-issue-add-label.yml +++ b/.github/workflows/dashboards-issue-add-label.yml @@ -11,7 +11,7 @@ env: ORGANIZATION: ${{ github.repository_owner }} REPO: ${{ github.event.repository.name }} TARGET_PROJECT: 202 - LABEL_IDs: "LA_kwDOAOaWjc8AAAABT38U-A" + LABEL_IDS: "LA_kwDOAOaWjc8AAAABT38U-A" concurrency: group: issue-label-when-in-project-${{ github.event.number }} @@ -26,15 +26,15 @@ jobs: with: # Secrets placed in the ci/repo/grafana/grafana/plugins_platform_issue_commands_github_bot path in Vault repo_secrets: | - GH_APP_ID=plugins_platform_issue_commands_github_bot:app_id - GH_APP_PEM=plugins_platform_issue_commands_github_bot:app_pem + GITHUB_APP_ID=grafana_pr_automation_app:app_id + GITHUB_APP_PRIVATE_KEY=grafana_pr_automation_app:app_pem - - name: "Generate token" + - name: Generate token id: generate_token - uses: tibdex/github-app-token@b62528385c34dbc9f38e5f4225ac829252d1ea92 + uses: actions/create-github-app-token@3ff1caaa28b64c9cc276ce0a02e2ff584f3900c5 # v2.0.2 with: - app_id: ${{ env.GH_APP_ID }} - private_key: ${{ env.GH_APP_PEM }} + app-id: ${{ env.GITHUB_APP_ID }} + private-key: ${{ env.GITHUB_APP_PRIVATE_KEY }} - name: Check if issue is in target project env: GH_TOKEN: ${{ steps.generate_token.outputs.token }} @@ -43,9 +43,9 @@ jobs: run: | # shellcheck disable=SC2016 # we don't want the $s to be expanded gh api graphql -f query=' - query($org: String!, $repo: String!) { + query($org: String!, $repo: String!, $issueNumber: Int!) { repository(name: $repo, owner: $org) { - issue (number: $ISSUE_NUMBER) { + issue (number: $issueNumber) { id projectItems(first:20) { nodes { @@ -56,7 +56,7 @@ jobs: } } } - }' -f org="$ORGANIZATION" -f repo="$REPO" > projects_data.json + }' -f org="$ORGANIZATION" -f repo="$REPO" -F issueNumber="$ISSUE_NUMBER" > projects_data.json { echo "IN_TARGET_PROJ=$(jq '.data.repository.issue.projectItems.nodes[] | select(.project.number=='"$TARGET_PROJECT"') | .project != null' projects_data.json)" diff --git a/.github/workflows/i18n-crowdin-create-tasks.yml b/.github/workflows/i18n-crowdin-create-tasks.yml index ade6fd32028..1a5847d83da 100644 --- a/.github/workflows/i18n-crowdin-create-tasks.yml +++ b/.github/workflows/i18n-crowdin-create-tasks.yml @@ -3,8 +3,9 @@ name: Crowdin automatic task management on: workflow_dispatch: # once a week on Sunday at midnight - schedule: - - cron: "0 0 * * 0" + # TODO enable once we're ready to create tasks automatically + # schedule: + # - cron: "0 0 * * 0" jobs: create-tasks-in-crowdin: diff --git a/.github/workflows/pr-codeql-analysis-python.yml b/.github/workflows/pr-codeql-analysis-python.yml index c5fe4b6a10c..df9cbf18f45 100644 --- a/.github/workflows/pr-codeql-analysis-python.yml +++ b/.github/workflows/pr-codeql-analysis-python.yml @@ -25,11 +25,24 @@ jobs: fetch-depth: 2 persist-credentials: false + - name: Check for Python files + id: check-python + run: | + if [ -z "$(find . -name '*.py' -type f)" ]; then + echo "No Python files found, skipping analysis" + echo "skip=true" >> "$GITHUB_OUTPUT" + else + echo "Python files found, proceeding with analysis" + echo "skip=false" >> "$GITHUB_OUTPUT" + fi + # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL + if: steps.check-python.outputs.skip != 'true' uses: github/codeql-action/init@v3 with: languages: "python" - name: Perform CodeQL Analysis + if: steps.check-python.outputs.skip != 'true' uses: github/codeql-action/analyze@v3 diff --git a/.github/workflows/release-pr.yml b/.github/workflows/release-pr.yml index fb6a9f2058a..d384365acd8 100644 --- a/.github/workflows/release-pr.yml +++ b/.github/workflows/release-pr.yml @@ -32,25 +32,59 @@ on: required: false default: false type: boolean + release_date: + required: false + type: string + description: "Release date in format YYYY-MM-DD" permissions: contents: read id-token: write jobs: + capture-date: + runs-on: ubuntu-latest + outputs: + release_date: ${{ steps.set_release_date.outputs.release_date }} + steps: + - name: compute_release_date + run: | + if [ -n "$DATE" ]; then + echo "release_date=$DATE" >> "$GITHUB_ENV" + exit 0 + fi + + echo "Fetching workflow run creation date..." + created_at=$(gh run view "$GITHUB_RUN_ID" --repo "$GH_REPO" --json createdAt -q .createdAt) + formatted_date=$(date -d "$created_at" +%Y-%m-%d) + echo "release_date=$formatted_date" >> "$GITHUB_ENV" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + GH_REPO: ${{ github.repository }} + DATE: ${{ inputs.release_date }} + + - id: set_release_date + run: echo "release_date=$release_date" >> "$GITHUB_OUTPUT" + push-changelog-to-main: + needs: capture-date permissions: contents: write id-token: write pull-requests: write + name: Create PR to main to update the changelog uses: ./.github/workflows/changelog.yml + concurrency: + group: grafana-release-pr-update-changelog-main + cancel-in-progress: false with: previous_version: ${{inputs.previous_version}} version: ${{ inputs.version }} latest: ${{ inputs.latest }} dry_run: ${{ inputs.dry_run }} target: main + work_branch: changelog/update-changelog-${{ needs.capture-date.outputs.release_date }} create-prs: permissions: diff --git a/.gitignore b/.gitignore index 29fe8a788bd..9ffe2cf1e61 100644 --- a/.gitignore +++ b/.gitignore @@ -41,8 +41,6 @@ __debug_bin* # This is the new place of the block, but I leave the previous here for a while /devenv/docker/blocks/auth/saml-enterprise /devenv/docker/blocks/auth/signer -/devenv/docker/blocks/spanner_tests -/devenv/docker/blocks/spanner_tests_multi /devenv/docker/blocks/mt-db /tmp diff --git a/.ignore b/.ignore index 01e1bb8d6e2..e2253d1f69d 100644 --- a/.ignore +++ b/.ignore @@ -19,4 +19,3 @@ # This is the new place of the block, but I leave the previous here for a while !/devenv/docker/blocks/auth/saml-enterprise !/devenv/docker/blocks/auth/signer -!/devenv/docker/blocks/spanner_tests \ No newline at end of file diff --git a/apps/advisor/README.md b/apps/advisor/README.md new file mode 100644 index 00000000000..27c44711f43 --- /dev/null +++ b/apps/advisor/README.md @@ -0,0 +1,155 @@ +# Grafana Advisor - Implementing New Checks + +This guide explains how to implement new checks in the Grafana Advisor system. The Advisor system allows you to create custom checks that can validate various aspects of your Grafana instance. + +## Check Structure + +A check in Grafana Advisor consists of two main components: + +1. A main check struct that implements the [`checks.Check`](https://github.com/grafana/grafana/blob/269226cb50b970ad9f692f1fdd220e9822e90db8/apps/advisor/pkg/app/checks/ifaces.go#L11-L25) interface +2. One or more step structs that implement the [`checks.Step`](https://github.com/grafana/grafana/blob/269226cb50b970ad9f692f1fdd220e9822e90db8/apps/advisor/pkg/app/checks/ifaces.go#L28-L39) interface + +## Implementing a New Check + +### 1. Create the Check Package + +Create a new package in `pkg/app/checks/` for your check. For example, if you're creating a check for validating configuration fields, you might create `pkg/app/checks/configchecks/`. Add a `check.go` file to the package, there we will implement the check interface. Let's start by implementing the `Check` interface but without any steps yet: + +```go +package configchecks + +var _ checks.Check = (*check)(nil) + +type check struct{} + +func New() checks.Check { + return &check{} +} + +func (c *check) ID() string { + return "config" +} + +func (c *check) Name() string { + return "config setting" +} + +func (c *check) Items(ctx context.Context) ([]any, error) { + return nil, nil +} + +func (c *check) Item(ctx context.Context, id string) (any, error) { + return nil, nil +} + +func (c *check) Init(ctx context.Context) error { + return nil +} + +func (c *check) Steps() []checks.Step { + return []checks.Step{} +} + +``` + +### 2. Define Dependencies and Register the Check + +In order to be able to implement a check, it will likely need some dependencies in the form of `wire` services. This is the internal dependency injection system used in Grafana and it allows you to access the services you need. + +For our example, we will need access to the grafana settings, which are exposed by wire as `*setting.Cfg` (in this case is a pointer to a struct, not an interface but the idea is the same). So let's add it to our check as a parameter for our `New` function: + +```go +type check struct { + cfg *setting.Cfg +} + +func New(cfg *setting.Cfg) checks.Check { + return &check{ + cfg: cfg, + } +} +``` + +Now, to register our check in the `checkregistry` package, we need to add it to the `ProvideService` function. First, we need to verify that the services we need are available in the `ProvideService` function, and if not, add them. Then, we need to add our check to the `Checks` slice. + +```go +func ProvideService(..., cfg *setting.Cfg, +) *Service { + return &Service{ + ... + cfg: cfg, + } +} + +func (s *Service) Checks() []checks.Check { + return []checks.Check{ + ... + configchecks.New(s.cfg), + } +} +``` + +### 3. Complete the Check Implementation + +Now that we have our check registered, we can implement the rest of the check logic. + +#### 3.1. Implement the `Items` and `Item` methods + +The `Items` method is used to return a list of items that the check will be run on (e.g. all data sources, all plugins, etc). The `Item` method is used to return a single item by its ID. + +These functions can return `any` type, we will convert them to the expected type in the step `Run` method. + +In our case, we will implement the `Items` method to return a list of config sections that we want to check. The `Item` method will return a single config section by its name. + +```go +func (c *check) Items(ctx context.Context) ([]any, error) { + return []any{"security.secret_key"}, nil +} + +func (c *check) Item(ctx context.Context, id string) (any, error) { + return id, nil +} +``` + +Check other checks for examples of how to implement these methods in more interesting ways. + +#### 3.2. Implement the `Init` method + +The `Init` method is used to initialize the check. It is called when the check is first created. It should be used to gather any information that is needed to run the check and for the steps to have some shared context. + +In our case, we don't need to do anything special so we can just return `nil`. + +```go +func (c *check) Init(ctx context.Context) error { + return nil +} +``` + +One more interesting example is the `plugincheck`, where we gather all the plugin information from GCOM and store it in the check struct. + +### 4. Implement Steps + +Like the `Check` interface, each `Step` needs to return some information (metadata) about the step, which will be used to populate the UI, and the logic to `Run` the step. + +In our example, we will implement a step that will check if the `security.secret_key` is set correctly. In case it's not correct, we recommend the user to follow the documentation. + +Check [`security_config_step.go`](./pkg/app/checks/configchecks/security_config_step.go) for the full implementation. + +## Best Practices + +1. **Error Handling**: In general, avoid returning errors for known issues, these will mark the check report as failed and the UI will render an error page. Only unexpected errors should be returned. + +2. **Type Safety**: Use type assertions to ensure you're working with the correct type of item. + +3. **Severity Levels**: Use appropriate severity levels: + + - `CheckReportFailureSeverityHigh`: For critical issues that need immediate attention + - `CheckReportFailureSeverityLow`: For non-critical issues that can be addressed later + +4. **Resolution Links**: Provide helpful links in the `CheckErrorLink` slice to help users resolve issues. + +5. **Logging**: Use the provided logger to log important information and errors. + +## Testing + +Create tests for your check and its steps to ensure they work as expected. Test both successful and failure scenarios. diff --git a/apps/advisor/go.mod b/apps/advisor/go.mod index 6ba81b1ab0a..ef3c2710ba5 100644 --- a/apps/advisor/go.mod +++ b/apps/advisor/go.mod @@ -3,8 +3,8 @@ module github.com/grafana/grafana/apps/advisor go 1.24.3 require ( - github.com/grafana/grafana-app-sdk v0.35.1 - k8s.io/apimachinery v0.32.3 + github.com/grafana/grafana-app-sdk v0.38.2 + k8s.io/apimachinery v0.33.1 k8s.io/klog/v2 v2.130.1 k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff ) @@ -45,12 +45,12 @@ require ( github.com/modern-go/reflect2 v1.0.2 // indirect github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect - github.com/openfga/openfga v1.8.12 // indirect + github.com/openfga/openfga v1.8.13 // indirect github.com/perimeterx/marshmallow v1.1.5 // indirect github.com/prometheus/client_golang v1.22.0 // indirect github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common v0.62.0 // indirect - github.com/prometheus/procfs v0.16.0 // indirect + github.com/prometheus/procfs v0.16.1 // indirect github.com/puzpuzpuz/xsync/v2 v2.5.1 // indirect github.com/spf13/pflag v1.0.6 // indirect github.com/x448/float16 v0.8.4 // indirect @@ -74,13 +74,13 @@ require ( gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250428153025-10db94c68c34 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250428153025-10db94c68c34 // indirect - google.golang.org/grpc v1.72.0 // indirect + google.golang.org/grpc v1.72.1 // indirect google.golang.org/protobuf v1.36.6 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.32.3 // indirect - k8s.io/apiextensions-apiserver v0.32.3 // indirect - k8s.io/client-go v0.32.3 // indirect + k8s.io/api v0.33.1 // indirect + k8s.io/apiextensions-apiserver v0.33.1 // indirect + k8s.io/client-go v0.33.1 // indirect k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // indirect diff --git a/apps/advisor/go.sum b/apps/advisor/go.sum index 33afb79d615..164b5efcca3 100644 --- a/apps/advisor/go.sum +++ b/apps/advisor/go.sum @@ -107,6 +107,8 @@ github.com/onsi/gomega v1.35.1 h1:Cwbd75ZBPxFSuZ6T+rN/WCb/gOc6YgFBXLlZLhC7Ds4= github.com/onsi/gomega v1.35.1/go.mod h1:PvZbdDc8J6XJEpDK4HCuRBm8a6Fzp9/DmhC9C7yFlog= github.com/openfga/openfga v1.8.12 h1:xEirA6tFwaJfjBDtbHWCK0/Tw+B8XleRyhg9dcEpzHo= github.com/openfga/openfga v1.8.12/go.mod h1:fIZyekdNB+tWQ6zIiglZonAc5ErZiDGMeHue/BzRYRM= +github.com/openfga/openfga v1.8.13 h1:ROURkotKhbmtyBX3188+cNElN8AOZmTl0CMkxUqwawo= +github.com/openfga/openfga v1.8.13/go.mod h1:h1VGcVW81eY1YyDtFx5+gxxAIEhIiOGR9SRGgs/X/k8= github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -126,6 +128,7 @@ github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkq github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/prometheus/procfs v0.16.0/go.mod h1:8veyXUu3nGP7oaCxhX6yeaM5u4stL2FeMXnCqhDthZg= +github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= github.com/puzpuzpuz/xsync/v2 v2.5.1 h1:mVGYAvzDSu52+zaGyNjC+24Xw2bQi3kTr4QJ6N9pIIU= github.com/puzpuzpuz/xsync/v2 v2.5.1/go.mod h1:gD2H2krq/w52MfPLE+Uy64TzJDVY7lP2znR9qmR35kU= github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= @@ -259,6 +262,7 @@ google.golang.org/grpc v1.69.4 h1:MF5TftSMkd8GLw/m0KM6V8CMOCY6NZ1NQDPGFgbTt4A= google.golang.org/grpc v1.69.4/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= google.golang.org/grpc v1.71.0/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= google.golang.org/grpc v1.72.0/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= +google.golang.org/grpc v1.72.1/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= google.golang.org/protobuf v1.36.1 h1:yBPeRvTftaleIgM3PZ/WBIZ7XM/eEYAaEyCwvyjq/gk= google.golang.org/protobuf v1.36.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= google.golang.org/protobuf v1.36.3/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= diff --git a/apps/advisor/pkg/app/checkregistry/checkregistry.go b/apps/advisor/pkg/app/checkregistry/checkregistry.go index 181dff983f7..9fbf0ab66ef 100644 --- a/apps/advisor/pkg/app/checkregistry/checkregistry.go +++ b/apps/advisor/pkg/app/checkregistry/checkregistry.go @@ -3,6 +3,7 @@ package checkregistry import ( "github.com/grafana/grafana/apps/advisor/pkg/app/checks" "github.com/grafana/grafana/apps/advisor/pkg/app/checks/authchecks" + "github.com/grafana/grafana/apps/advisor/pkg/app/checks/configchecks" "github.com/grafana/grafana/apps/advisor/pkg/app/checks/datasourcecheck" "github.com/grafana/grafana/apps/advisor/pkg/app/checks/plugincheck" "github.com/grafana/grafana/pkg/plugins" @@ -27,19 +28,22 @@ type Service struct { pluginContextProvider *plugincontext.Provider pluginClient plugins.Client pluginRepo repo.Service + pluginErrorResolver plugins.ErrorResolver updateChecker pluginchecker.PluginUpdateChecker pluginPreinstall pluginchecker.Preinstall managedPlugins managedplugins.Manager provisionedPlugins provisionedplugins.Manager ssoSettingsSvc ssosettings.Service GrafanaVersion string + cfg *setting.Cfg } func ProvideService(datasourceSvc datasources.DataSourceService, pluginStore pluginstore.Store, pluginContextProvider *plugincontext.Provider, pluginClient plugins.Client, updateChecker pluginchecker.PluginUpdateChecker, pluginRepo repo.Service, pluginPreinstall pluginchecker.Preinstall, managedPlugins managedplugins.Manager, - provisionedPlugins provisionedplugins.Manager, ssoSettingsSvc ssosettings.Service, settings *setting.Cfg, + provisionedPlugins provisionedplugins.Manager, ssoSettingsSvc ssosettings.Service, cfg *setting.Cfg, + pluginErrorResolver plugins.ErrorResolver, ) *Service { return &Service{ datasourceSvc: datasourceSvc, @@ -47,12 +51,14 @@ func ProvideService(datasourceSvc datasources.DataSourceService, pluginStore plu pluginContextProvider: pluginContextProvider, pluginClient: pluginClient, pluginRepo: pluginRepo, + pluginErrorResolver: pluginErrorResolver, updateChecker: updateChecker, pluginPreinstall: pluginPreinstall, managedPlugins: managedPlugins, provisionedPlugins: provisionedPlugins, ssoSettingsSvc: ssoSettingsSvc, - GrafanaVersion: settings.BuildVersion, + GrafanaVersion: cfg.BuildVersion, + cfg: cfg, } } @@ -70,9 +76,11 @@ func (s *Service) Checks() []checks.Check { s.pluginStore, s.pluginRepo, s.updateChecker, + s.pluginErrorResolver, s.GrafanaVersion, ), authchecks.New(s.ssoSettingsSvc), + configchecks.New(s.cfg), } } diff --git a/apps/advisor/pkg/app/checks/authchecks/check.go b/apps/advisor/pkg/app/checks/authchecks/check.go index e1f9f0c204b..74f6a07e7f6 100644 --- a/apps/advisor/pkg/app/checks/authchecks/check.go +++ b/apps/advisor/pkg/app/checks/authchecks/check.go @@ -30,7 +30,7 @@ func (c *check) ID() string { } func (c *check) Name() string { - return "SSO Setting" + return "SSO setting" } func (c *check) Init(ctx context.Context) error { diff --git a/apps/advisor/pkg/app/checks/configchecks/check.go b/apps/advisor/pkg/app/checks/configchecks/check.go new file mode 100644 index 00000000000..3aad7eb7c0c --- /dev/null +++ b/apps/advisor/pkg/app/checks/configchecks/check.go @@ -0,0 +1,48 @@ +package configchecks + +import ( + "context" + + "github.com/grafana/grafana/apps/advisor/pkg/app/checks" + "github.com/grafana/grafana/pkg/setting" +) + +var _ checks.Check = (*check)(nil) + +type check struct { + cfg *setting.Cfg +} + +func New(cfg *setting.Cfg) checks.Check { + return &check{ + cfg: cfg, + } +} + +func (c *check) ID() string { + return "config" +} + +func (c *check) Name() string { + return "config setting" +} + +func (c *check) Items(ctx context.Context) ([]any, error) { + return []any{"security.secret_key"}, nil +} + +func (c *check) Item(ctx context.Context, id string) (any, error) { + return id, nil +} + +func (c *check) Init(ctx context.Context) error { + return nil +} + +func (c *check) Steps() []checks.Step { + return []checks.Step{ + &securityConfigStep{ + securitySection: c.cfg.SectionWithEnvOverrides("security"), + }, + } +} diff --git a/apps/advisor/pkg/app/checks/configchecks/security_config_step.go b/apps/advisor/pkg/app/checks/configchecks/security_config_step.go new file mode 100644 index 00000000000..39d5599cbf3 --- /dev/null +++ b/apps/advisor/pkg/app/checks/configchecks/security_config_step.go @@ -0,0 +1,73 @@ +package configchecks + +import ( + "context" + "fmt" + "strings" + + "github.com/grafana/grafana-app-sdk/logging" + advisor "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1" + "github.com/grafana/grafana/apps/advisor/pkg/app/checks" + "github.com/grafana/grafana/pkg/setting" +) + +const ( + // nolint:gosec // Defined in defaults.ini originally + defaultSecretKey = "SW2YcwTIb9zpOOhoPsMm" +) + +type securityConfigStep struct { + securitySection *setting.DynamicSection +} + +func (s *securityConfigStep) Title() string { + return "Security config check" +} + +func (s *securityConfigStep) Description() string { + return "Check if the Grafana security config is set correctly." +} + +func (s *securityConfigStep) Resolution() string { + return "Follow the documentation for each element." +} + +func (s *securityConfigStep) ID() string { + return "security_config" +} + +func (s *securityConfigStep) Run(ctx context.Context, log logging.Logger, _ *advisor.CheckSpec, it any) ([]advisor.CheckReportFailure, error) { + itemPath, ok := it.(string) + if !ok { + return nil, fmt.Errorf("invalid item type %T", it) + } + items := strings.Split(itemPath, ".") + if len(items) != 2 { + // Not interested in this item + return nil, nil + } + section, key := items[0], items[1] + if section != "security" { + // Only interested in security section + return nil, nil + } + if key == "secret_key" { + secretKey := s.securitySection.Key("secret_key").Value() + if secretKey == defaultSecretKey { + return []advisor.CheckReportFailure{checks.NewCheckReportFailure( + advisor.CheckReportFailureSeverityHigh, + s.ID(), + "secret_key", + itemPath, + []advisor.CheckErrorLink{ + { + Message: "Avoid default value", + Url: "https://grafana.com/docs/grafana/latest/setup-grafana/configure-security/configure-database-encryption/", + }, + }, + )}, nil + } + } + + return nil, nil +} diff --git a/apps/advisor/pkg/app/checks/configchecks/security_config_step_test.go b/apps/advisor/pkg/app/checks/configchecks/security_config_step_test.go new file mode 100644 index 00000000000..bf1e275e993 --- /dev/null +++ b/apps/advisor/pkg/app/checks/configchecks/security_config_step_test.go @@ -0,0 +1,33 @@ +package configchecks + +import ( + "context" + "testing" + + "github.com/grafana/grafana-app-sdk/logging" + "github.com/grafana/grafana/pkg/setting" + "github.com/stretchr/testify/require" +) + +func TestSecurityConfigStepSuccess(t *testing.T) { + cfg := setting.NewCfg() + step := &securityConfigStep{ + securitySection: cfg.SectionWithEnvOverrides("security"), + } + + errs, err := step.Run(context.Background(), logging.DefaultLogger, nil, "security.secret_key") + require.NoError(t, err) + require.Len(t, errs, 0) +} + +func TestSecurityConfigStepFailure(t *testing.T) { + cfg := setting.NewCfg() + cfg.SectionWithEnvOverrides("security").Key("secret_key").SetValue(defaultSecretKey) + step := &securityConfigStep{ + securitySection: cfg.SectionWithEnvOverrides("security"), + } + + errs, err := step.Run(context.Background(), logging.DefaultLogger, nil, "security.secret_key") + require.NoError(t, err) + require.Len(t, errs, 1) +} diff --git a/apps/advisor/pkg/app/checks/datasourcecheck/check.go b/apps/advisor/pkg/app/checks/datasourcecheck/check.go index 1cc2c6e2d9d..e5bdc4c4e2e 100644 --- a/apps/advisor/pkg/app/checks/datasourcecheck/check.go +++ b/apps/advisor/pkg/app/checks/datasourcecheck/check.go @@ -88,7 +88,7 @@ func (c *check) ID() string { } func (c *check) Name() string { - return "Data Source" + return "data source" } func (c *check) Init(ctx context.Context) error { diff --git a/apps/advisor/pkg/app/checks/plugincheck/check.go b/apps/advisor/pkg/app/checks/plugincheck/check.go index 08458df6e50..3d261f81b67 100644 --- a/apps/advisor/pkg/app/checks/plugincheck/check.go +++ b/apps/advisor/pkg/app/checks/plugincheck/check.go @@ -2,43 +2,42 @@ package plugincheck import ( "context" - "fmt" sysruntime "runtime" - "github.com/grafana/grafana-app-sdk/logging" - advisor "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1" "github.com/grafana/grafana/apps/advisor/pkg/app/checks" + "github.com/grafana/grafana/pkg/plugins" "github.com/grafana/grafana/pkg/plugins/repo" "github.com/grafana/grafana/pkg/services/pluginsintegration/pluginchecker" "github.com/grafana/grafana/pkg/services/pluginsintegration/pluginstore" ) const ( - CheckID = "plugin" - DeprecationStepID = "deprecation" - UpdateStepID = "update" + CheckID = "plugin" ) func New( pluginStore pluginstore.Store, pluginRepo repo.Service, updateChecker pluginchecker.PluginUpdateChecker, + pluginErrorResolver plugins.ErrorResolver, grafanaVersion string, ) checks.Check { return &check{ - PluginStore: pluginStore, - PluginRepo: pluginRepo, - GrafanaVersion: grafanaVersion, - updateChecker: updateChecker, + PluginStore: pluginStore, + PluginRepo: pluginRepo, + GrafanaVersion: grafanaVersion, + updateChecker: updateChecker, + pluginErrorResolver: pluginErrorResolver, } } type check struct { - PluginStore pluginstore.Store - PluginRepo repo.Service - updateChecker pluginchecker.PluginUpdateChecker - GrafanaVersion string - pluginIndex map[string]repo.PluginInfo + PluginStore pluginstore.Store + PluginRepo repo.Service + updateChecker pluginchecker.PluginUpdateChecker + pluginErrorResolver plugins.ErrorResolver + GrafanaVersion string + pluginIndex map[string]repo.PluginInfo } func (c *check) ID() string { @@ -46,15 +45,43 @@ func (c *check) ID() string { } func (c *check) Name() string { - return "Plugin" + return "plugin" +} + +type pluginItem struct { + Plugin *pluginstore.Plugin + Err *plugins.Error } func (c *check) Items(ctx context.Context) ([]any, error) { ps := c.PluginStore.Plugins(ctx) - res := make([]any, len(ps)) - for i, p := range ps { - res[i] = p + resMap := map[string]*pluginItem{} + for _, p := range ps { + resMap[p.ID] = &pluginItem{ + Plugin: &p, + Err: c.pluginErrorResolver.PluginError(ctx, p.ID), + } + } + + // Plugins with errors are not added to the plugin store but + // we still want to show them in the check results so we add them to the map + pluginErrors := c.pluginErrorResolver.PluginErrors(ctx) + for _, e := range pluginErrors { + if _, exists := resMap[e.PluginID]; exists { + resMap[e.PluginID].Err = e + } else { + resMap[e.PluginID] = &pluginItem{ + Plugin: nil, + Err: e, + } + } + } + + res := make([]any, 0, len(resMap)) + for _, p := range resMap { + res = append(res, p) } + return res, nil } @@ -63,7 +90,10 @@ func (c *check) Item(ctx context.Context, id string) (any, error) { if !exists { return nil, nil } - return p, nil + return &pluginItem{ + Plugin: &p, + Err: c.pluginErrorResolver.PluginError(ctx, p.ID), + }, nil } func (c *check) Init(ctx context.Context) error { @@ -99,117 +129,8 @@ func (c *check) Steps() []checks.Step { updateChecker: c.updateChecker, pluginIndex: c.pluginIndex, }, + &unsignedStep{ + pluginIndex: c.pluginIndex, + }, } } - -type deprecationStep struct { - GrafanaVersion string - updateChecker pluginchecker.PluginUpdateChecker - pluginIndex map[string]repo.PluginInfo -} - -func (s *deprecationStep) Title() string { - return "Deprecation check" -} - -func (s *deprecationStep) Description() string { - return "Check if any installed plugins are deprecated." -} - -func (s *deprecationStep) Resolution() string { - return "Check the documentation for recommended steps or delete the plugin." -} - -func (s *deprecationStep) ID() string { - return DeprecationStepID -} - -func (s *deprecationStep) Run(ctx context.Context, log logging.Logger, _ *advisor.CheckSpec, it any) ([]advisor.CheckReportFailure, error) { - p, ok := it.(pluginstore.Plugin) - if !ok { - return nil, fmt.Errorf("invalid item type %T", it) - } - - if !s.updateChecker.IsUpdatable(ctx, p) { - return nil, nil - } - - // Check if plugin is deprecated - i, ok := s.pluginIndex[p.ID] - if !ok { - // Unable to check deprecation status - return nil, nil - } - if i.Status == "deprecated" { - return []advisor.CheckReportFailure{checks.NewCheckReportFailure( - advisor.CheckReportFailureSeverityHigh, - s.ID(), - p.Name, - p.ID, - []advisor.CheckErrorLink{ - { - Message: "Admin", - Url: fmt.Sprintf("/plugins/%s", p.ID), - }, - }, - )}, nil - } - return nil, nil -} - -type updateStep struct { - GrafanaVersion string - updateChecker pluginchecker.PluginUpdateChecker - pluginIndex map[string]repo.PluginInfo -} - -func (s *updateStep) Title() string { - return "Update check" -} - -func (s *updateStep) Description() string { - return "Checks if an installed plugins has a newer version available." -} - -func (s *updateStep) Resolution() string { - return "Go to the plugin admin page and upgrade to the latest version." -} - -func (s *updateStep) ID() string { - return UpdateStepID -} - -func (s *updateStep) Run(ctx context.Context, log logging.Logger, _ *advisor.CheckSpec, i any) ([]advisor.CheckReportFailure, error) { - p, ok := i.(pluginstore.Plugin) - if !ok { - return nil, fmt.Errorf("invalid item type %T", i) - } - - if !s.updateChecker.IsUpdatable(ctx, p) { - return nil, nil - } - - // Check if plugin has a newer version available - info, ok := s.pluginIndex[p.ID] - if !ok { - // Unable to check updates - return nil, nil - } - if s.updateChecker.CanUpdate(p.ID, p.Info.Version, info.Version, false) { - return []advisor.CheckReportFailure{checks.NewCheckReportFailure( - advisor.CheckReportFailureSeverityLow, - s.ID(), - p.Name, - p.ID, - []advisor.CheckErrorLink{ - { - Message: "Upgrade", - Url: fmt.Sprintf("/plugins/%s?page=version-history", p.ID), - }, - }, - )}, nil - } - - return nil, nil -} diff --git a/apps/advisor/pkg/app/checks/plugincheck/check_test.go b/apps/advisor/pkg/app/checks/plugincheck/check_test.go index 09a566f03ca..60b49870af6 100644 --- a/apps/advisor/pkg/app/checks/plugincheck/check_test.go +++ b/apps/advisor/pkg/app/checks/plugincheck/check_test.go @@ -23,6 +23,7 @@ func TestRun(t *testing.T) { pluginPreinstalled []string pluginManaged []string pluginProvisioned []string + pluginErrors []*plugins.Error expectedFailures []advisor.CheckReportFailure }{ { @@ -47,7 +48,7 @@ func TestRun(t *testing.T) { Links: []advisor.CheckErrorLink{ { Url: "/plugins/plugin1", - Message: "Admin", + Message: "View plugin", }, }, }, @@ -119,6 +120,69 @@ func TestRun(t *testing.T) { pluginProvisioned: []string{"plugin5"}, expectedFailures: []advisor.CheckReportFailure{}, }, + { + name: "Invalid signatures", + plugins: []pluginstore.Plugin{ + {JSONData: plugins.JSONData{ID: "plugin6", Name: "Plugin 6", Info: plugins.Info{Version: "1.0.0"}}, Signature: plugins.SignatureStatusInvalid}, + {JSONData: plugins.JSONData{ID: "plugin7", Name: "Plugin 7", Info: plugins.Info{Version: "1.0.0"}}, Signature: plugins.SignatureStatusModified}, + {JSONData: plugins.JSONData{ID: "plugin8", Name: "Plugin 8", Info: plugins.Info{Version: "1.0.0"}}, Signature: plugins.SignatureStatusUnsigned}, + }, + pluginInfo: []repo.PluginInfo{ + {Status: "active", Slug: "plugin6", Version: "1.0.0"}, + {Status: "active", Slug: "plugin7", Version: "1.0.0"}, + {Status: "active", Slug: "plugin8", Version: "1.0.0"}, + }, + pluginErrors: []*plugins.Error{ + {PluginID: "plugin9", ErrorCode: plugins.ErrorCodeSignatureInvalid}, + {PluginID: "plugin10", ErrorCode: plugins.ErrorCodeSignatureModified}, + {PluginID: "plugin11", ErrorCode: plugins.ErrorCodeSignatureMissing}, + {PluginID: "plugin12", ErrorCode: plugins.ErrorCodeFailedBackendStart}, // This should be ignored atm + }, + expectedFailures: []advisor.CheckReportFailure{ + { + Severity: advisor.CheckReportFailureSeverityLow, + StepID: UnsignedStepID, + Item: "Plugin 6", + ItemID: "plugin6", + Links: []advisor.CheckErrorLink{{Url: "/plugins/plugin6", Message: "View plugin"}}, + }, + { + Severity: advisor.CheckReportFailureSeverityLow, + StepID: UnsignedStepID, + Item: "Plugin 7", + ItemID: "plugin7", + Links: []advisor.CheckErrorLink{{Url: "/plugins/plugin7", Message: "View plugin"}}, + }, + { + Severity: advisor.CheckReportFailureSeverityLow, + StepID: UnsignedStepID, + Item: "Plugin 8", + ItemID: "plugin8", + Links: []advisor.CheckErrorLink{{Url: "/plugins/plugin8", Message: "View plugin"}}, + }, + { + Severity: advisor.CheckReportFailureSeverityHigh, + StepID: UnsignedStepID, + Item: "plugin9", + ItemID: "plugin9", + Links: []advisor.CheckErrorLink{}, + }, + { + Severity: advisor.CheckReportFailureSeverityHigh, + StepID: UnsignedStepID, + Item: "plugin10", + ItemID: "plugin10", + Links: []advisor.CheckErrorLink{}, + }, + { + Severity: advisor.CheckReportFailureSeverityHigh, + StepID: UnsignedStepID, + Item: "plugin11", + ItemID: "plugin11", + Links: []advisor.CheckErrorLink{}, + }, + }, + }, } for _, tt := range tests { @@ -131,7 +195,8 @@ func TestRun(t *testing.T) { managedPlugins := &mockManagedPlugins{managed: tt.pluginManaged} provisionedPlugins := &mockProvisionedPlugins{provisioned: tt.pluginProvisioned} updateChecker := pluginchecker.ProvideService(managedPlugins, provisionedPlugins, pluginPreinstall) - check := New(pluginStore, pluginRepo, updateChecker, "12.0.0") + pluginErrorResolver := &mockPluginErrorResolver{pluginErrors: tt.pluginErrors} + check := New(pluginStore, pluginRepo, updateChecker, pluginErrorResolver, "12.0.0") items, err := check.Items(context.Background()) assert.NoError(t, err) @@ -148,8 +213,8 @@ func TestRun(t *testing.T) { } } assert.NoError(t, err) - assert.Equal(t, len(tt.plugins), len(items)) - assert.Equal(t, tt.expectedFailures, failures) + assert.Equal(t, len(tt.plugins)+len(tt.pluginErrors), len(items)) + assert.ElementsMatch(t, tt.expectedFailures, failures) }) } } @@ -222,3 +287,21 @@ type mockProvisionedPlugins struct { func (m *mockProvisionedPlugins) ProvisionedPlugins(ctx context.Context) ([]string, error) { return m.provisioned, nil } + +type mockPluginErrorResolver struct { + plugins.ErrorResolver + pluginErrors []*plugins.Error +} + +func (m *mockPluginErrorResolver) PluginErrors(ctx context.Context) []*plugins.Error { + return m.pluginErrors +} + +func (m *mockPluginErrorResolver) PluginError(ctx context.Context, id string) *plugins.Error { + for _, err := range m.pluginErrors { + if err.PluginID == id { + return err + } + } + return nil +} diff --git a/apps/advisor/pkg/app/checks/plugincheck/deprecation_step.go b/apps/advisor/pkg/app/checks/plugincheck/deprecation_step.go new file mode 100644 index 00000000000..b778e5d8979 --- /dev/null +++ b/apps/advisor/pkg/app/checks/plugincheck/deprecation_step.go @@ -0,0 +1,76 @@ +package plugincheck + +import ( + "context" + "fmt" + + "github.com/grafana/grafana-app-sdk/logging" + advisor "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1" + "github.com/grafana/grafana/apps/advisor/pkg/app/checks" + "github.com/grafana/grafana/pkg/plugins/repo" + "github.com/grafana/grafana/pkg/services/pluginsintegration/pluginchecker" +) + +const ( + DeprecationStepID = "deprecation" +) + +type deprecationStep struct { + GrafanaVersion string + updateChecker pluginchecker.PluginUpdateChecker + pluginIndex map[string]repo.PluginInfo +} + +func (s *deprecationStep) Title() string { + return "Deprecation check" +} + +func (s *deprecationStep) Description() string { + return "Check if any installed plugins are deprecated." +} + +func (s *deprecationStep) Resolution() string { + return "Check the documentation for recommended steps or delete the plugin." +} + +func (s *deprecationStep) ID() string { + return DeprecationStepID +} + +func (s *deprecationStep) Run(ctx context.Context, log logging.Logger, _ *advisor.CheckSpec, it any) ([]advisor.CheckReportFailure, error) { + pi, ok := it.(*pluginItem) + if !ok { + return nil, fmt.Errorf("invalid item type %T", it) + } + p := pi.Plugin + if p == nil { + return nil, nil + } + + if !s.updateChecker.IsUpdatable(ctx, *p) { + return nil, nil + } + + // Check if plugin is deprecated + i, ok := s.pluginIndex[p.ID] + if !ok { + // Unable to check deprecation status + return nil, nil + } + if i.Status == "deprecated" { + return []advisor.CheckReportFailure{checks.NewCheckReportFailure( + advisor.CheckReportFailureSeverityHigh, + s.ID(), + p.Name, + p.ID, + []advisor.CheckErrorLink{ + { + Message: "View plugin", + Url: fmt.Sprintf("/plugins/%s", p.ID), + }, + }, + )}, nil + } + return nil, nil +} diff --git a/apps/advisor/pkg/app/checks/plugincheck/unsigned_step.go b/apps/advisor/pkg/app/checks/plugincheck/unsigned_step.go new file mode 100644 index 00000000000..a0d212d0f02 --- /dev/null +++ b/apps/advisor/pkg/app/checks/plugincheck/unsigned_step.go @@ -0,0 +1,94 @@ +package plugincheck + +import ( + "context" + "fmt" + "slices" + + "github.com/grafana/grafana-app-sdk/logging" + advisor "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1" + "github.com/grafana/grafana/apps/advisor/pkg/app/checks" + "github.com/grafana/grafana/pkg/plugins" + "github.com/grafana/grafana/pkg/plugins/repo" +) + +const ( + UnsignedStepID = "unsigned" +) + +type unsignedStep struct { + pluginIndex map[string]repo.PluginInfo +} + +func (s *unsignedStep) Title() string { + return "Plugin signature check" +} + +func (s *unsignedStep) Description() string { + return "Checks has a missing or invalid signature." +} + +func (s *unsignedStep) Resolution() string { + return "For security, we recommend only installing plugins from the catalog. " + + "Review the plugin's status and verify your allowlist if appropriate." +} + +func (s *unsignedStep) ID() string { + return UnsignedStepID +} + +func (s *unsignedStep) Run(ctx context.Context, log logging.Logger, _ *advisor.CheckSpec, it any) ([]advisor.CheckReportFailure, error) { + pi, ok := it.(*pluginItem) + if !ok { + return nil, fmt.Errorf("invalid item type %T", it) + } + + p := pi.Plugin + invalidSignatureTypes := []plugins.SignatureStatus{ + plugins.SignatureStatusUnsigned, + plugins.SignatureStatusModified, + plugins.SignatureStatusInvalid, + } + if p != nil && slices.Contains(invalidSignatureTypes, p.Signature) { + // This will only happen in dev mode or if the plugin is in the unsigned allow list + links := []advisor.CheckErrorLink{} + if _, ok := s.pluginIndex[p.ID]; ok { + links = append(links, advisor.CheckErrorLink{ + Message: "View plugin", + Url: fmt.Sprintf("/plugins/%s", p.ID), + }) + } + return []advisor.CheckReportFailure{checks.NewCheckReportFailure( + advisor.CheckReportFailureSeverityLow, + s.ID(), + p.Name, + p.ID, + links, + )}, nil + } + + pluginErr := pi.Err + invalidErrorCodeTypes := []plugins.ErrorCode{ + plugins.ErrorCodeSignatureMissing, + plugins.ErrorCodeSignatureInvalid, + plugins.ErrorCodeSignatureModified, + } + if pluginErr != nil && slices.Contains(invalidErrorCodeTypes, pluginErr.ErrorCode) { + links := []advisor.CheckErrorLink{} + if _, ok := s.pluginIndex[pluginErr.PluginID]; ok { + links = append(links, advisor.CheckErrorLink{ + Message: "View plugin", + Url: fmt.Sprintf("/plugins/%s", pluginErr.PluginID), + }) + } + return []advisor.CheckReportFailure{checks.NewCheckReportFailure( + advisor.CheckReportFailureSeverityHigh, + s.ID(), + pluginErr.PluginID, + pluginErr.PluginID, + links, + )}, nil + } + + return nil, nil +} diff --git a/apps/advisor/pkg/app/checks/plugincheck/update_step.go b/apps/advisor/pkg/app/checks/plugincheck/update_step.go new file mode 100644 index 00000000000..38eb8cf545b --- /dev/null +++ b/apps/advisor/pkg/app/checks/plugincheck/update_step.go @@ -0,0 +1,76 @@ +package plugincheck + +import ( + "context" + "fmt" + + "github.com/grafana/grafana-app-sdk/logging" + advisor "github.com/grafana/grafana/apps/advisor/pkg/apis/advisor/v0alpha1" + "github.com/grafana/grafana/apps/advisor/pkg/app/checks" + "github.com/grafana/grafana/pkg/plugins/repo" + "github.com/grafana/grafana/pkg/services/pluginsintegration/pluginchecker" +) + +const ( + UpdateStepID = "update" +) + +type updateStep struct { + GrafanaVersion string + updateChecker pluginchecker.PluginUpdateChecker + pluginIndex map[string]repo.PluginInfo +} + +func (s *updateStep) Title() string { + return "Update check" +} + +func (s *updateStep) Description() string { + return "Checks if an installed plugins has a newer version available." +} + +func (s *updateStep) Resolution() string { + return "Go to the plugin admin page and upgrade to the latest version." +} + +func (s *updateStep) ID() string { + return UpdateStepID +} + +func (s *updateStep) Run(ctx context.Context, log logging.Logger, _ *advisor.CheckSpec, it any) ([]advisor.CheckReportFailure, error) { + pi, ok := it.(*pluginItem) + if !ok { + return nil, fmt.Errorf("invalid item type %T", it) + } + p := pi.Plugin + if p == nil { + return nil, nil + } + + if !s.updateChecker.IsUpdatable(ctx, *p) { + return nil, nil + } + + // Check if plugin has a newer version available + info, ok := s.pluginIndex[p.ID] + if !ok { + // Unable to check updates + return nil, nil + } + if s.updateChecker.CanUpdate(p.ID, p.Info.Version, info.Version, false) { + return []advisor.CheckReportFailure{checks.NewCheckReportFailure( + advisor.CheckReportFailureSeverityLow, + s.ID(), + p.Name, + p.ID, + []advisor.CheckErrorLink{ + { + Message: "Upgrade", + Url: fmt.Sprintf("/plugins/%s?page=version-history", p.ID), + }, + }, + )}, nil + } + + return nil, nil +} diff --git a/apps/advisor/pkg/app/checktyperegisterer/checktyperegisterer.go b/apps/advisor/pkg/app/checktyperegisterer/checktyperegisterer.go index f154a7afb51..5979ed2b2b4 100644 --- a/apps/advisor/pkg/app/checktyperegisterer/checktyperegisterer.go +++ b/apps/advisor/pkg/app/checktyperegisterer/checktyperegisterer.go @@ -72,9 +72,12 @@ func (r *Runner) createOrUpdate(ctx context.Context, log logging.Logger, obj res return err } currentAnnotations := current.GetAnnotations() + if currentAnnotations == nil { + currentAnnotations = make(map[string]string) + } annotations := obj.GetAnnotations() - maps.Copy(annotations, currentAnnotations) - obj.SetAnnotations(annotations) + maps.Copy(currentAnnotations, annotations) + obj.SetAnnotations(currentAnnotations) // This will update the annotations in the object _, err = r.client.Update(ctx, id, obj, resource.UpdateOptions{}) if err != nil { // Ignore the error, it's probably due to a race condition diff --git a/apps/alerting/notifications/Makefile b/apps/alerting/notifications/Makefile index df21119dbb6..d6addf6bd95 100644 --- a/apps/alerting/notifications/Makefile +++ b/apps/alerting/notifications/Makefile @@ -1,4 +1,4 @@ -APP_SDK_VERSION := v0.35.1 +APP_SDK_VERSION := v0.38.2 APP_SDK_DIR := $(shell go env GOPATH)/bin/app-sdk-$(APP_SDK_VERSION) APP_SDK_BIN := $(APP_SDK_DIR)/grafana-app-sdk diff --git a/apps/alerting/notifications/go.mod b/apps/alerting/notifications/go.mod index 6d41ff98c33..aac76670d3b 100644 --- a/apps/alerting/notifications/go.mod +++ b/apps/alerting/notifications/go.mod @@ -3,10 +3,10 @@ module github.com/grafana/grafana/apps/alerting/notifications go 1.24.3 require ( - github.com/grafana/grafana-app-sdk v0.35.1 - github.com/grafana/grafana-app-sdk/logging v0.35.1 - k8s.io/apimachinery v0.32.3 - k8s.io/apiserver v0.32.3 + github.com/grafana/grafana-app-sdk v0.38.2 + github.com/grafana/grafana-app-sdk/logging v0.38.2 + k8s.io/apimachinery v0.33.1 + k8s.io/apiserver v0.33.1 k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff ) @@ -20,7 +20,7 @@ require ( github.com/coreos/go-systemd/v22 v22.5.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect - github.com/evanphx/json-patch v5.6.0+incompatible // indirect + github.com/evanphx/json-patch v5.9.11+incompatible // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect github.com/getkin/kin-openapi v0.132.0 // indirect @@ -29,22 +29,18 @@ require ( github.com/go-openapi/jsonpointer v0.21.0 // indirect github.com/go-openapi/jsonreference v0.21.0 // indirect github.com/go-openapi/swag v0.23.0 // indirect + github.com/go-test/deep v1.1.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang-jwt/jwt/v4 v4.5.2 // indirect github.com/golang/protobuf v1.5.4 // indirect - github.com/google/btree v1.1.3 // indirect github.com/google/gnostic-models v0.6.9 // indirect github.com/google/go-cmp v0.7.0 // indirect - github.com/google/gofuzz v1.2.0 // indirect github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e // indirect github.com/google/uuid v1.6.0 // indirect - github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20191002090509-6af20e3a5340 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jonboulle/clockwork v0.5.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect @@ -61,18 +57,17 @@ require ( github.com/perimeterx/marshmallow v1.1.5 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/prometheus/client_golang v1.22.0 // indirect - github.com/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.63.0 // indirect - github.com/prometheus/procfs v0.16.0 // indirect + github.com/prometheus/procfs v0.16.1 // indirect github.com/puzpuzpuz/xsync/v2 v2.5.1 // indirect github.com/rogpeppe/go-internal v1.14.1 // indirect - github.com/spf13/cobra v1.9.1 // indirect github.com/spf13/pflag v1.0.6 // indirect github.com/x448/float16 v0.8.4 // indirect go.etcd.io/bbolt v1.4.0 // indirect - go.etcd.io/etcd/api/v3 v3.5.16 // indirect - go.etcd.io/etcd/client/pkg/v3 v3.5.16 // indirect - go.etcd.io/etcd/client/v3 v3.5.16 // indirect + go.etcd.io/etcd/api/v3 v3.5.21 // indirect + go.etcd.io/etcd/client/pkg/v3 v3.5.21 // indirect + go.etcd.io/etcd/client/v3 v3.5.21 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // indirect @@ -93,9 +88,8 @@ require ( golang.org/x/term v0.32.0 // indirect golang.org/x/text v0.25.0 // indirect golang.org/x/time v0.11.0 // indirect - golang.org/x/tools v0.33.0 // indirect gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect - google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4 // indirect + google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237 // indirect google.golang.org/grpc v1.72.1 // indirect @@ -103,13 +97,13 @@ require ( gopkg.in/evanphx/json-patch.v4 v4.12.0 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.32.3 // indirect - k8s.io/apiextensions-apiserver v0.32.3 // indirect - k8s.io/client-go v0.32.3 // indirect - k8s.io/component-base v0.32.3 // indirect + k8s.io/api v0.33.1 // indirect + k8s.io/apiextensions-apiserver v0.33.1 // indirect + k8s.io/client-go v0.33.1 // indirect + k8s.io/component-base v0.33.1 // indirect k8s.io/klog/v2 v2.130.1 // indirect k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect - sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.0 // indirect + sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 // indirect sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect sigs.k8s.io/randfill v1.0.0 // indirect sigs.k8s.io/structured-merge-diff/v4 v4.6.0 // indirect diff --git a/apps/alerting/notifications/go.sum b/apps/alerting/notifications/go.sum index f5da3d86ddb..4d64d624cff 100644 --- a/apps/alerting/notifications/go.sum +++ b/apps/alerting/notifications/go.sum @@ -19,7 +19,6 @@ github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -32,8 +31,8 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v5.9.11+incompatible h1:ixHHqfcGvxhWkniF1tWxBHA0yb4Z+d1UQi45df52xW8= +github.com/evanphx/json-patch v5.9.11+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= @@ -56,8 +55,8 @@ github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= -github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= -github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= +github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= +github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= @@ -79,18 +78,16 @@ github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= -github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs= github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 h1:JeSE6pjso5THxAzdVpqr6/geYxZytqFMBCOtn/ujyeo= github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674/go.mod h1:r4w70xmWCQKmi1ONH4KIaBptdivuRPyosB9RmPlGEwA= -github.com/grafana/grafana-app-sdk v0.35.1 h1:zEXubzsQrxGBOzXJJMBwhEClC/tvPi0sfK7NGmlX3RI= -github.com/grafana/grafana-app-sdk v0.35.1/go.mod h1:Zx5MkVppYK+ElSDUAR6+fjzOVo6I/cIgk+ty+LmNOxI= -github.com/grafana/grafana-app-sdk/logging v0.35.1 h1:taVpl+RoixTYl0JBJGhH+fPVmwA9wvdwdzJTZsv9buM= -github.com/grafana/grafana-app-sdk/logging v0.35.1/go.mod h1:Y/bvbDhBiV/tkIle9RW49pgfSPIPSON8Q4qjx3pyqDk= +github.com/grafana/grafana-app-sdk v0.38.2 h1:raQ1mqCmNJ2AyCSV3m6ehFC0TGVZcqRcM6iOIDT6ZIE= +github.com/grafana/grafana-app-sdk v0.38.2/go.mod h1:LhZ4i2IXGnW5FF/jAczX7SnGFNai7x2qwB8YHNZWiZI= +github.com/grafana/grafana-app-sdk/logging v0.38.2 h1:EdQTRxbbH72zdqJ09Z76zcSjfALJXkpPLgvKEPPnloc= +github.com/grafana/grafana-app-sdk/logging v0.38.2/go.mod h1:Y/bvbDhBiV/tkIle9RW49pgfSPIPSON8Q4qjx3pyqDk= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20191002090509-6af20e3a5340 h1:uGoIog/wiQHI9GAxXO5TJbT0wWKH3O9HhOJW1F9c3fY= @@ -104,8 +101,6 @@ github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jonboulle/clockwork v0.5.0 h1:Hyh9A8u51kptdkR+cqRpT1EebBwTn1oK9YfGYbdFz6I= github.com/jonboulle/clockwork v0.5.0/go.mod h1:3mZlmanh0g2NDKO5TWZVJAfofYk64M7XN3SzBPjZF60= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= @@ -161,30 +156,29 @@ github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8 github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k= github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.16.0 h1:xh6oHhKwnOJKMYiYBDWmkHqQPyiY40sny36Cmx2bbsM= -github.com/prometheus/procfs v0.16.0/go.mod h1:8veyXUu3nGP7oaCxhX6yeaM5u4stL2FeMXnCqhDthZg= +github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= +github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= github.com/puzpuzpuz/xsync/v2 v2.5.1 h1:mVGYAvzDSu52+zaGyNjC+24Xw2bQi3kTr4QJ6N9pIIU= github.com/puzpuzpuz/xsync/v2 v2.5.1/go.mod h1:gD2H2krq/w52MfPLE+Uy64TzJDVY7lP2znR9qmR35kU= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= -github.com/spf13/cobra v1.9.1 h1:CXSaggrXdbHK9CF+8ywj8Amf7PBRmPCOJugH954Nnlo= -github.com/spf13/cobra v1.9.1/go.mod h1:nDyEzZ8ogv936Cinf6g1RU9MRY64Ir93oCnqb9wxYW0= github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= @@ -203,20 +197,20 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= go.etcd.io/bbolt v1.4.0 h1:TU77id3TnN/zKr7CO/uk+fBCwF2jGcMuw2B/FMAzYIk= go.etcd.io/bbolt v1.4.0/go.mod h1:AsD+OCi/qPN1giOX1aiLAha3o1U8rAz65bvN4j0sRuk= -go.etcd.io/etcd/api/v3 v3.5.16 h1:WvmyJVbjWqK4R1E+B12RRHz3bRGy9XVfh++MgbN+6n0= -go.etcd.io/etcd/api/v3 v3.5.16/go.mod h1:1P4SlIP/VwkDmGo3OlOD7faPeP8KDIFhqvciH5EfN28= -go.etcd.io/etcd/client/pkg/v3 v3.5.16 h1:ZgY48uH6UvB+/7R9Yf4x574uCO3jIx0TRDyetSfId3Q= -go.etcd.io/etcd/client/pkg/v3 v3.5.16/go.mod h1:V8acl8pcEK0Y2g19YlOV9m9ssUe6MgiDSobSoaBAM0E= -go.etcd.io/etcd/client/v2 v2.305.16 h1:kQrn9o5czVNaukf2A2At43cE9ZtWauOtf9vRZuiKXow= -go.etcd.io/etcd/client/v2 v2.305.16/go.mod h1:h9YxWCzcdvZENbfzBTFCnoNumr2ax3F19sKMqHFmXHE= -go.etcd.io/etcd/client/v3 v3.5.16 h1:sSmVYOAHeC9doqi0gv7v86oY/BTld0SEFGaxsU9eRhE= -go.etcd.io/etcd/client/v3 v3.5.16/go.mod h1:X+rExSGkyqxvu276cr2OwPLBaeqFu1cIl4vmRjAD/50= -go.etcd.io/etcd/pkg/v3 v3.5.16 h1:cnavs5WSPWeK4TYwPYfmcr3Joz9BH+TZ6qoUtz6/+mc= -go.etcd.io/etcd/pkg/v3 v3.5.16/go.mod h1:+lutCZHG5MBBFI/U4eYT5yL7sJfnexsoM20Y0t2uNuY= -go.etcd.io/etcd/raft/v3 v3.5.16 h1:zBXA3ZUpYs1AwiLGPafYAKKl/CORn/uaxYDwlNwndAk= -go.etcd.io/etcd/raft/v3 v3.5.16/go.mod h1:P4UP14AxofMJ/54boWilabqqWoW9eLodl6I5GdGzazI= -go.etcd.io/etcd/server/v3 v3.5.16 h1:d0/SAdJ3vVsZvF8IFVb1k8zqMZ+heGcNfft71ul9GWE= -go.etcd.io/etcd/server/v3 v3.5.16/go.mod h1:ynhyZZpdDp1Gq49jkUg5mfkDWZwXnn3eIqCqtJnrD/s= +go.etcd.io/etcd/api/v3 v3.5.21 h1:A6O2/JDb3tvHhiIz3xf9nJ7REHvtEFJJ3veW3FbCnS8= +go.etcd.io/etcd/api/v3 v3.5.21/go.mod h1:c3aH5wcvXv/9dqIw2Y810LDXJfhSYdHQ0vxmP3CCHVY= +go.etcd.io/etcd/client/pkg/v3 v3.5.21 h1:lPBu71Y7osQmzlflM9OfeIV2JlmpBjqBNlLtcoBqUTc= +go.etcd.io/etcd/client/pkg/v3 v3.5.21/go.mod h1:BgqT/IXPjK9NkeSDjbzwsHySX3yIle2+ndz28nVsjUs= +go.etcd.io/etcd/client/v2 v2.305.21 h1:eLiFfexc2mE+pTLz9WwnoEsX5JTTpLCYVivKkmVXIRA= +go.etcd.io/etcd/client/v2 v2.305.21/go.mod h1:OKkn4hlYNf43hpjEM3Ke3aRdUkhSl8xjKjSf8eCq2J8= +go.etcd.io/etcd/client/v3 v3.5.21 h1:T6b1Ow6fNjOLOtM0xSoKNQt1ASPCLWrF9XMHcH9pEyY= +go.etcd.io/etcd/client/v3 v3.5.21/go.mod h1:mFYy67IOqmbRf/kRUvsHixzo3iG+1OF2W2+jVIQRAnU= +go.etcd.io/etcd/pkg/v3 v3.5.21 h1:jUItxeKyrDuVuWhdh0HtjUANwyuzcb7/FAeUfABmQsk= +go.etcd.io/etcd/pkg/v3 v3.5.21/go.mod h1:wpZx8Egv1g4y+N7JAsqi2zoUiBIUWznLjqJbylDjWgU= +go.etcd.io/etcd/raft/v3 v3.5.21 h1:dOmE0mT55dIUsX77TKBLq+RgyumsQuYeiRQnW/ylugk= +go.etcd.io/etcd/raft/v3 v3.5.21/go.mod h1:fmcuY5R2SNkklU4+fKVBQi2biVp5vafMrWUEj4TJ4Cs= +go.etcd.io/etcd/server/v3 v3.5.21 h1:9w0/k12majtgarGmlMVuhwXRI2ob3/d1Ik3X5TKo0yU= +go.etcd.io/etcd/server/v3 v3.5.21/go.mod h1:G1mOzdwuzKT1VRL7SqRchli/qcFrtLBTAQ4lV20sXXo= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw= @@ -323,8 +317,8 @@ google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4 h1:Pw6WnI9W/LIdRxqK7T6XGugGbHIRl5Q7q3BssH6xk4s= -google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4/go.mod h1:qbZzneIOXSq+KFAFut9krLfRLZiFLzZL5u2t8SV83EE= +google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb h1:ITgPrl429bc6+2ZraNSzMDk3I95nmQln2fuPstKwFDE= +google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:sAo5UzpjUwgFBCzupwhcLcxHVDK7vG5IqI30YnwX2eE= google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237 h1:Kog3KlB4xevJlAcbbbzPfRG0+X9fdoGM+UBRKVz6Wr0= google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237/go.mod h1:ezi0AVyMKDWy5xAncvjLWH7UcLBB5n7y2fQ8MzjJcto= google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237 h1:cJfm9zPbe1e873mHJzmQ1nwVEeRDU/T1wXDK2kUSU34= @@ -358,26 +352,26 @@ gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -k8s.io/api v0.32.3 h1:Hw7KqxRusq+6QSplE3NYG4MBxZw1BZnq4aP4cJVINls= -k8s.io/api v0.32.3/go.mod h1:2wEDTXADtm/HA7CCMD8D8bK4yuBUptzaRhYcYEEYA3k= -k8s.io/apiextensions-apiserver v0.32.3 h1:4D8vy+9GWerlErCwVIbcQjsWunF9SUGNu7O7hiQTyPY= -k8s.io/apiextensions-apiserver v0.32.3/go.mod h1:8YwcvVRMVzw0r1Stc7XfGAzB/SIVLunqApySV5V7Dss= -k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= -k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= -k8s.io/apiserver v0.32.3 h1:kOw2KBuHOA+wetX1MkmrxgBr648ksz653j26ESuWNY8= -k8s.io/apiserver v0.32.3/go.mod h1:q1x9B8E/WzShF49wh3ADOh6muSfpmFL0I2t+TG0Zdgc= -k8s.io/client-go v0.32.3 h1:RKPVltzopkSgHS7aS98QdscAgtgah/+zmpAogooIqVU= -k8s.io/client-go v0.32.3/go.mod h1:3v0+3k4IcT9bXTc4V2rt+d2ZPPG700Xy6Oi0Gdl2PaY= -k8s.io/component-base v0.32.3 h1:98WJvvMs3QZ2LYHBzvltFSeJjEx7t5+8s71P7M74u8k= -k8s.io/component-base v0.32.3/go.mod h1:LWi9cR+yPAv7cu2X9rZanTiFKB2kHA+JjmhkKjCZRpI= +k8s.io/api v0.33.1 h1:tA6Cf3bHnLIrUK4IqEgb2v++/GYUtqiu9sRVk3iBXyw= +k8s.io/api v0.33.1/go.mod h1:87esjTn9DRSRTD4fWMXamiXxJhpOIREjWOSjsW1kEHw= +k8s.io/apiextensions-apiserver v0.33.1 h1:N7ccbSlRN6I2QBcXevB73PixX2dQNIW0ZRuguEE91zI= +k8s.io/apiextensions-apiserver v0.33.1/go.mod h1:uNQ52z1A1Gu75QSa+pFK5bcXc4hq7lpOXbweZgi4dqA= +k8s.io/apimachinery v0.33.1 h1:mzqXWV8tW9Rw4VeW9rEkqvnxj59k1ezDUl20tFK/oM4= +k8s.io/apimachinery v0.33.1/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= +k8s.io/apiserver v0.33.1 h1:yLgLUPDVC6tHbNcw5uE9mo1T6ELhJj7B0geifra3Qdo= +k8s.io/apiserver v0.33.1/go.mod h1:VMbE4ArWYLO01omz+k8hFjAdYfc3GVAYPrhP2tTKccs= +k8s.io/client-go v0.33.1 h1:ZZV/Ks2g92cyxWkRRnfUDsnhNn28eFpt26aGc8KbXF4= +k8s.io/client-go v0.33.1/go.mod h1:JAsUrl1ArO7uRVFWfcj6kOomSlCv+JpvIsp6usAGefA= +k8s.io/component-base v0.33.1 h1:EoJ0xA+wr77T+G8p6T3l4efT2oNwbqBVKR71E0tBIaI= +k8s.io/component-base v0.33.1/go.mod h1:guT/w/6piyPfTgq7gfvgetyXMIh10zuXA6cRRm3rDuY= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4= k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff/go.mod h1:5jIi+8yX4RIb8wk3XwBo5Pq2ccx4FP10ohkbSKCZoK8= k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 h1:M3sRQVHv7vB20Xc2ybTt7ODCeFj6JSWYFzOFnYeS6Ro= k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.0 h1:CPT0ExVicCzcpeN4baWEV2ko2Z/AsiZgEdwgcfwLgMo= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 h1:jpcvIRr3GLoUoEKRkHKSmGjxb6lWwrBlJsXc+eUYQHM= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= diff --git a/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/constants.go b/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/constants.go index 6122c92cd43..bf2bced1a30 100644 --- a/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/constants.go +++ b/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/constants.go @@ -3,16 +3,16 @@ package v0alpha1 import "k8s.io/apimachinery/pkg/runtime/schema" const ( - // Group is the API group used by all kinds in this package - Group = "notifications.alerting.grafana.app" - // Version is the API version used by all kinds in this package - Version = "v0alpha1" + // APIGroup is the API group used by all kinds in this package + APIGroup = "notifications.alerting.grafana.app" + // APIVersion is the API version used by all kinds in this package + APIVersion = "v0alpha1" ) var ( // GroupVersion is a schema.GroupVersion consisting of the Group and Version constants for this package GroupVersion = schema.GroupVersion{ - Group: Group, - Version: Version, + Group: APIGroup, + Version: APIVersion, } ) diff --git a/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/receiver_metadata_gen.go b/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/receiver_metadata_gen.go index 65ecfeb76dd..9de6fc7e64b 100644 --- a/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/receiver_metadata_gen.go +++ b/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/receiver_metadata_gen.go @@ -24,5 +24,8 @@ type ReceiverMetadata struct { // NewReceiverMetadata creates a new ReceiverMetadata object. func NewReceiverMetadata() *ReceiverMetadata { - return &ReceiverMetadata{} + return &ReceiverMetadata{ + Finalizers: []string{}, + Labels: map[string]string{}, + } } diff --git a/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/receiver_spec_gen.go b/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/receiver_spec_gen.go index f94fbef7210..d43a3c51883 100644 --- a/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/receiver_spec_gen.go +++ b/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/receiver_spec_gen.go @@ -13,7 +13,9 @@ type ReceiverIntegration struct { // NewReceiverIntegration creates a new ReceiverIntegration object. func NewReceiverIntegration() *ReceiverIntegration { - return &ReceiverIntegration{} + return &ReceiverIntegration{ + Settings: map[string]interface{}{}, + } } // +k8s:openapi-gen=true @@ -24,5 +26,7 @@ type ReceiverSpec struct { // NewReceiverSpec creates a new ReceiverSpec object. func NewReceiverSpec() *ReceiverSpec { - return &ReceiverSpec{} + return &ReceiverSpec{ + Integrations: []ReceiverIntegration{}, + } } diff --git a/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/routingtree_metadata_gen.go b/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/routingtree_metadata_gen.go index 7b6cf237011..6391ce78f9f 100644 --- a/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/routingtree_metadata_gen.go +++ b/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/routingtree_metadata_gen.go @@ -24,5 +24,8 @@ type RoutingTreeMetadata struct { // NewRoutingTreeMetadata creates a new RoutingTreeMetadata object. func NewRoutingTreeMetadata() *RoutingTreeMetadata { - return &RoutingTreeMetadata{} + return &RoutingTreeMetadata{ + Finalizers: []string{}, + Labels: map[string]string{}, + } } diff --git a/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/routingtree_spec_gen.go b/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/routingtree_spec_gen.go index 2f6b2badb95..bd00f12ab68 100644 --- a/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/routingtree_spec_gen.go +++ b/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/routingtree_spec_gen.go @@ -57,6 +57,7 @@ type RoutingTreeSpec struct { func NewRoutingTreeSpec() *RoutingTreeSpec { return &RoutingTreeSpec{ Defaults: *NewRoutingTreeRouteDefaults(), + Routes: []RoutingTreeRoute{}, } } diff --git a/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/templategroup_metadata_gen.go b/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/templategroup_metadata_gen.go index 0f69a0d0a57..639ce76dcb8 100644 --- a/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/templategroup_metadata_gen.go +++ b/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/templategroup_metadata_gen.go @@ -24,5 +24,8 @@ type TemplateGroupMetadata struct { // NewTemplateGroupMetadata creates a new TemplateGroupMetadata object. func NewTemplateGroupMetadata() *TemplateGroupMetadata { - return &TemplateGroupMetadata{} + return &TemplateGroupMetadata{ + Finalizers: []string{}, + Labels: map[string]string{}, + } } diff --git a/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/timeinterval_metadata_gen.go b/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/timeinterval_metadata_gen.go index 6c3c20131a4..81ebbdf8cc9 100644 --- a/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/timeinterval_metadata_gen.go +++ b/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/timeinterval_metadata_gen.go @@ -24,5 +24,8 @@ type TimeIntervalMetadata struct { // NewTimeIntervalMetadata creates a new TimeIntervalMetadata object. func NewTimeIntervalMetadata() *TimeIntervalMetadata { - return &TimeIntervalMetadata{} + return &TimeIntervalMetadata{ + Finalizers: []string{}, + Labels: map[string]string{}, + } } diff --git a/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/timeinterval_spec_gen.go b/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/timeinterval_spec_gen.go index e8d11096d05..4f943026beb 100644 --- a/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/timeinterval_spec_gen.go +++ b/apps/alerting/notifications/pkg/apis/alerting/v0alpha1/timeinterval_spec_gen.go @@ -36,5 +36,7 @@ type TimeIntervalSpec struct { // NewTimeIntervalSpec creates a new TimeIntervalSpec object. func NewTimeIntervalSpec() *TimeIntervalSpec { - return &TimeIntervalSpec{} + return &TimeIntervalSpec{ + TimeIntervals: []TimeIntervalInterval{}, + } } diff --git a/apps/alerting/notifications/pkg/apis/alerting_manifest.go b/apps/alerting/notifications/pkg/apis/alerting_manifest.go index 9e40415b859..9b1e424d463 100644 --- a/apps/alerting/notifications/pkg/apis/alerting_manifest.go +++ b/apps/alerting/notifications/pkg/apis/alerting_manifest.go @@ -6,12 +6,13 @@ package apis import ( - "encoding/json" + "fmt" "github.com/grafana/grafana-app-sdk/app" -) + "github.com/grafana/grafana-app-sdk/resource" -var () + v0alpha1 "github.com/grafana/grafana/apps/alerting/notifications/pkg/apis/alerting/v0alpha1" +) var appManifestData = app.ManifestData{ AppName: "alerting", @@ -72,12 +73,6 @@ var appManifestData = app.ManifestData{ }, } -func jsonToMap(j string) map[string]any { - m := make(map[string]any) - json.Unmarshal([]byte(j), &j) - return m -} - func LocalManifest() app.Manifest { return app.NewEmbeddedManifest(appManifestData) } @@ -85,3 +80,17 @@ func LocalManifest() app.Manifest { func RemoteManifest() app.Manifest { return app.NewAPIServerManifest("alerting") } + +var kindVersionToGoType = map[string]resource.Kind{ + "Receiver/v0alpha1": v0alpha1.ReceiverKind(), + "RoutingTree/v0alpha1": v0alpha1.RoutingTreeKind(), + "TemplateGroup/v0alpha1": v0alpha1.TemplateGroupKind(), + "TimeInterval/v0alpha1": v0alpha1.TimeIntervalKind(), +} + +// ManifestGoTypeAssociator returns the associated resource.Kind instance for a given Kind and Version, if one exists. +// If there is no association for the provided Kind and Version, exists will return false. +func ManifestGoTypeAssociator(kind, version string) (goType resource.Kind, exists bool) { + goType, exists = kindVersionToGoType[fmt.Sprintf("%s/%s", kind, version)] + return goType, exists +} diff --git a/apps/dashboard/Makefile b/apps/dashboard/Makefile index 7ea4489a97c..9b7fc2955fe 100644 --- a/apps/dashboard/Makefile +++ b/apps/dashboard/Makefile @@ -1,4 +1,4 @@ -APP_SDK_VERSION := v0.35.1 +APP_SDK_VERSION := v0.38.2 APP_SDK_DIR := $(shell go env GOPATH)/bin/app-sdk-$(APP_SDK_VERSION) APP_SDK_BIN := $(APP_SDK_DIR)/grafana-app-sdk diff --git a/apps/dashboard/go.mod b/apps/dashboard/go.mod index fcc36e98d8a..dd46e08e462 100644 --- a/apps/dashboard/go.mod +++ b/apps/dashboard/go.mod @@ -4,11 +4,11 @@ go 1.24.3 require ( cuelang.org/go v0.11.1 - github.com/grafana/grafana-app-sdk v0.35.1 + github.com/grafana/grafana-app-sdk v0.38.2 github.com/grafana/grafana-plugin-sdk-go v0.277.0 - github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250422074709-7c8433fbb2c2 + github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250514132646-acbc7b54ed9e github.com/stretchr/testify v1.10.0 - k8s.io/apimachinery v0.32.3 + k8s.io/apimachinery v0.33.1 k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff ) @@ -26,7 +26,7 @@ require ( github.com/elazarl/goproxy v1.7.2 // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect github.com/fatih/color v1.18.0 // indirect - github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect github.com/getkin/kin-openapi v0.132.0 // indirect github.com/go-logr/logr v1.4.2 // indirect @@ -34,16 +34,17 @@ require ( github.com/go-openapi/jsonpointer v0.21.0 // indirect github.com/go-openapi/jsonreference v0.21.0 // indirect github.com/go-openapi/swag v0.23.0 // indirect + github.com/go-test/deep v1.1.1 // indirect github.com/goccy/go-json v0.10.5 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/protobuf v1.5.4 // indirect + github.com/golang/snappy v1.0.0 // indirect github.com/google/flatbuffers v25.2.10+incompatible // indirect github.com/google/gnostic-models v0.6.9 // indirect github.com/google/go-cmp v0.7.0 // indirect - github.com/google/gofuzz v1.2.0 // indirect github.com/google/uuid v1.6.0 // indirect github.com/gorilla/mux v1.8.1 // indirect - github.com/grafana/grafana-app-sdk/logging v0.35.1 // indirect + github.com/grafana/grafana-app-sdk/logging v0.38.2 // indirect github.com/grafana/otel-profiling-go v0.5.1 // indirect github.com/grafana/pyroscope-go/godeltaprof v0.1.8 // indirect github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 // indirect @@ -77,9 +78,9 @@ require ( github.com/pierrec/lz4/v4 v4.1.22 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_golang v1.22.0 // indirect - github.com/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.63.0 // indirect - github.com/prometheus/procfs v0.16.0 // indirect + github.com/prometheus/procfs v0.16.1 // indirect github.com/rivo/uniseg v0.4.7 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/smartystreets/goconvey v1.6.4 // indirect @@ -102,7 +103,7 @@ require ( go.opentelemetry.io/otel/sdk v1.35.0 // indirect go.opentelemetry.io/otel/trace v1.35.0 // indirect go.opentelemetry.io/proto/otlp v1.6.0 // indirect - golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 // indirect + golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // indirect golang.org/x/mod v0.24.0 // indirect golang.org/x/net v0.40.0 // indirect golang.org/x/oauth2 v0.29.0 // indirect @@ -113,6 +114,7 @@ require ( golang.org/x/time v0.11.0 // indirect golang.org/x/tools v0.33.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect + gonum.org/v1/gonum v0.16.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237 // indirect google.golang.org/grpc v1.72.1 // indirect @@ -120,7 +122,7 @@ require ( gopkg.in/fsnotify/fsnotify.v1 v1.4.7 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/client-go v0.32.3 // indirect + k8s.io/client-go v0.33.1 // indirect k8s.io/klog/v2 v2.130.1 // indirect k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect diff --git a/apps/dashboard/go.sum b/apps/dashboard/go.sum index ca981cf82b5..14cee45cf02 100644 --- a/apps/dashboard/go.sum +++ b/apps/dashboard/go.sum @@ -46,8 +46,8 @@ github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/ github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= -github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/getkin/kin-openapi v0.132.0 h1:3ISeLMsQzcb5v26yeJrBcdTCEQTag36ZjaGk7MIRUwk= @@ -66,16 +66,16 @@ github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+Gr github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= github.com/go-quicktest/qt v1.101.0 h1:O1K29Txy5P2OK0dGo59b7b0LR6wKfIhttaAhHUyn7eI= github.com/go-quicktest/qt v1.101.0/go.mod h1:14Bz/f7NwaXPtdYEgzsx46kqSxVwTbzVZsDC26tQJow= -github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= -github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= +github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= +github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4= github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw= @@ -85,8 +85,6 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= -github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -94,14 +92,14 @@ github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e h1:JKmoR8x90Iww1 github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/grafana/grafana-app-sdk v0.35.1 h1:zEXubzsQrxGBOzXJJMBwhEClC/tvPi0sfK7NGmlX3RI= -github.com/grafana/grafana-app-sdk v0.35.1/go.mod h1:Zx5MkVppYK+ElSDUAR6+fjzOVo6I/cIgk+ty+LmNOxI= -github.com/grafana/grafana-app-sdk/logging v0.35.1 h1:taVpl+RoixTYl0JBJGhH+fPVmwA9wvdwdzJTZsv9buM= -github.com/grafana/grafana-app-sdk/logging v0.35.1/go.mod h1:Y/bvbDhBiV/tkIle9RW49pgfSPIPSON8Q4qjx3pyqDk= +github.com/grafana/grafana-app-sdk v0.38.2 h1:raQ1mqCmNJ2AyCSV3m6ehFC0TGVZcqRcM6iOIDT6ZIE= +github.com/grafana/grafana-app-sdk v0.38.2/go.mod h1:LhZ4i2IXGnW5FF/jAczX7SnGFNai7x2qwB8YHNZWiZI= +github.com/grafana/grafana-app-sdk/logging v0.38.2 h1:EdQTRxbbH72zdqJ09Z76zcSjfALJXkpPLgvKEPPnloc= +github.com/grafana/grafana-app-sdk/logging v0.38.2/go.mod h1:Y/bvbDhBiV/tkIle9RW49pgfSPIPSON8Q4qjx3pyqDk= github.com/grafana/grafana-plugin-sdk-go v0.277.0 h1:VDU2F4Y5NeRS//ejctdZtsAshrGaEdbtW33FsK0EQss= github.com/grafana/grafana-plugin-sdk-go v0.277.0/go.mod h1:mAUWg68w5+1f5TLDqagIr8sWr1RT9h7ufJl5NMcWJAU= -github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250422074709-7c8433fbb2c2 h1:kvG92f3XbJlQPUcZfXlTNLziI4e8LYeA9Jv2ixmM5Ic= -github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250422074709-7c8433fbb2c2/go.mod h1:ll14OJrUGYgXApz3YX6zmxYjRMZHL+pgQjoKBuRzaRs= +github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250514132646-acbc7b54ed9e h1:BTKk7LHuG1kmAkucwTA7DuMbKpKvJTKrGdBmUNO4dfQ= +github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250514132646-acbc7b54ed9e/go.mod h1:IA4SOwun8QyST9c5UNs/fN37XL6boXXDvRYFcFwbipg= github.com/grafana/otel-profiling-go v0.5.1 h1:stVPKAFZSa7eGiqbYuG25VcqYksR6iWvF3YH66t4qL8= github.com/grafana/otel-profiling-go v0.5.1/go.mod h1:ftN/t5A/4gQI19/8MoWurBEtC6gFw8Dns1sJZ9W4Tls= github.com/grafana/pyroscope-go/godeltaprof v0.1.8 h1:iwOtYXeeVSAeYefJNaxDytgjKtUuKQbJqgAIjlnicKg= @@ -204,12 +202,12 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k= github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18= -github.com/prometheus/procfs v0.16.0 h1:xh6oHhKwnOJKMYiYBDWmkHqQPyiY40sny36Cmx2bbsM= -github.com/prometheus/procfs v0.16.0/go.mod h1:8veyXUu3nGP7oaCxhX6yeaM5u4stL2FeMXnCqhDthZg= +github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= +github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= github.com/protocolbuffers/txtpbfmt v0.0.0-20241112170944-20d2c9ebc01d h1:HWfigq7lB31IeJL8iy7jkUmU/PG1Sr8jVGhS749dbUA= github.com/protocolbuffers/txtpbfmt v0.0.0-20241112170944-20d2c9ebc01d/go.mod h1:jgxiZysxFPM+iWKwQwPR+y+Jvo54ARd4EisXxKYpB5c= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= @@ -299,8 +297,8 @@ go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 h1:nDVHiLt8aIbd/VzvPWN6kSOPE7+F/fNFDSXLVYkE/Iw= -golang.org/x/exp v0.0.0-20250305212735-054e65f0b394/go.mod h1:sIifuuw/Yco/y6yb6+bDNfyeQ/MdPUy/hKEMYQV17cM= +golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI= +golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.24.0 h1:ZfthKaKaT4NrhGVZHO1/WDTwGES4De8KtWO0SIbNJMU= @@ -353,8 +351,8 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da h1:noIWHXmPHxILtqtCOPIhSt0ABwskkZKjD3bXGnZGpNY= golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= -gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= -gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237 h1:Kog3KlB4xevJlAcbbbzPfRG0+X9fdoGM+UBRKVz6Wr0= google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237/go.mod h1:ezi0AVyMKDWy5xAncvjLWH7UcLBB5n7y2fQ8MzjJcto= google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237 h1:cJfm9zPbe1e873mHJzmQ1nwVEeRDU/T1wXDK2kUSU34= @@ -377,12 +375,12 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/api v0.32.3 h1:Hw7KqxRusq+6QSplE3NYG4MBxZw1BZnq4aP4cJVINls= -k8s.io/api v0.32.3/go.mod h1:2wEDTXADtm/HA7CCMD8D8bK4yuBUptzaRhYcYEEYA3k= -k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= -k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= -k8s.io/client-go v0.32.3 h1:RKPVltzopkSgHS7aS98QdscAgtgah/+zmpAogooIqVU= -k8s.io/client-go v0.32.3/go.mod h1:3v0+3k4IcT9bXTc4V2rt+d2ZPPG700Xy6Oi0Gdl2PaY= +k8s.io/api v0.33.1 h1:tA6Cf3bHnLIrUK4IqEgb2v++/GYUtqiu9sRVk3iBXyw= +k8s.io/api v0.33.1/go.mod h1:87esjTn9DRSRTD4fWMXamiXxJhpOIREjWOSjsW1kEHw= +k8s.io/apimachinery v0.33.1 h1:mzqXWV8tW9Rw4VeW9rEkqvnxj59k1ezDUl20tFK/oM4= +k8s.io/apimachinery v0.33.1/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= +k8s.io/client-go v0.33.1 h1:ZZV/Ks2g92cyxWkRRnfUDsnhNn28eFpt26aGc8KbXF4= +k8s.io/client-go v0.33.1/go.mod h1:JAsUrl1ArO7uRVFWfcj6kOomSlCv+JpvIsp6usAGefA= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4= diff --git a/apps/dashboard/kinds/v2alpha1/dashboard_spec.cue b/apps/dashboard/kinds/v2alpha1/dashboard_spec.cue index 04273371f01..3928838bd33 100644 --- a/apps/dashboard/kinds/v2alpha1/dashboard_spec.cue +++ b/apps/dashboard/kinds/v2alpha1/dashboard_spec.cue @@ -518,21 +518,8 @@ GridLayoutItemKind: { spec: GridLayoutItemSpec } -GridLayoutRowKind: { - kind: "GridLayoutRow" - spec: GridLayoutRowSpec -} - -GridLayoutRowSpec: { - y: int - collapsed: bool - title: string - elements: [...GridLayoutItemKind] // Grid items in the row will have their Y value be relative to the rows Y value. This means a panel positioned at Y: 0 in a row with Y: 10 will be positioned at Y: 11 (row header has a heigh of 1) in the dashboard. - repeat?: RowRepeatOptions -} - GridLayoutSpec: { - items: [...GridLayoutItemKind | GridLayoutRowKind] + items: [...GridLayoutItemKind] } GridLayoutKind: { diff --git a/apps/dashboard/pkg/apis/dashboard/v0alpha1/constants.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/constants.go index 90cb8b29db7..e0f4696af93 100644 --- a/apps/dashboard/pkg/apis/dashboard/v0alpha1/constants.go +++ b/apps/dashboard/pkg/apis/dashboard/v0alpha1/constants.go @@ -3,16 +3,16 @@ package v0alpha1 import "k8s.io/apimachinery/pkg/runtime/schema" const ( - // Group is the API group used by all kinds in this package - Group = "dashboard.grafana.app" - // Version is the API version used by all kinds in this package - Version = "v0alpha1" + // APIGroup is the API group used by all kinds in this package + APIGroup = "dashboard.grafana.app" + // APIVersion is the API version used by all kinds in this package + APIVersion = "v0alpha1" ) var ( // GroupVersion is a schema.GroupVersion consisting of the Group and Version constants for this package GroupVersion = schema.GroupVersion{ - Group: Group, - Version: Version, + Group: APIGroup, + Version: APIVersion, } ) diff --git a/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_metadata_gen.go b/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_metadata_gen.go index 6e22219dbf4..444662b8072 100644 --- a/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_metadata_gen.go +++ b/apps/dashboard/pkg/apis/dashboard/v0alpha1/dashboard_metadata_gen.go @@ -24,5 +24,8 @@ type DashboardMetadata struct { // NewDashboardMetadata creates a new DashboardMetadata object. func NewDashboardMetadata() *DashboardMetadata { - return &DashboardMetadata{} + return &DashboardMetadata{ + Finalizers: []string{}, + Labels: map[string]string{}, + } } diff --git a/apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.openapi_violation_exceptions.list b/apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.openapi_violation_exceptions.list index 68505c7d05d..5003217ce4e 100644 --- a/apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.openapi_violation_exceptions.list +++ b/apps/dashboard/pkg/apis/dashboard/v0alpha1/zz_generated.openapi_violation_exceptions.list @@ -7,3 +7,4 @@ API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/ API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1,SortBy,Descending API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1,SortableField,Field API rule violation: names_match,github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1,Unstructured,Object +API rule violation: streaming_list_type_json_tags,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1,DashboardList,ListMeta diff --git a/apps/dashboard/pkg/apis/dashboard/v1beta1/constants.go b/apps/dashboard/pkg/apis/dashboard/v1beta1/constants.go index d47d860d95f..f14b80cdecc 100644 --- a/apps/dashboard/pkg/apis/dashboard/v1beta1/constants.go +++ b/apps/dashboard/pkg/apis/dashboard/v1beta1/constants.go @@ -3,16 +3,16 @@ package v1beta1 import "k8s.io/apimachinery/pkg/runtime/schema" const ( - // Group is the API group used by all kinds in this package - Group = "dashboard.grafana.app" - // Version is the API version used by all kinds in this package - Version = "v1beta1" + // APIGroup is the API group used by all kinds in this package + APIGroup = "dashboard.grafana.app" + // APIVersion is the API version used by all kinds in this package + APIVersion = "v1beta1" ) var ( // GroupVersion is a schema.GroupVersion consisting of the Group and Version constants for this package GroupVersion = schema.GroupVersion{ - Group: Group, - Version: Version, + Group: APIGroup, + Version: APIVersion, } ) diff --git a/apps/dashboard/pkg/apis/dashboard/v1beta1/dashboard_metadata_gen.go b/apps/dashboard/pkg/apis/dashboard/v1beta1/dashboard_metadata_gen.go index dfad3b5cfe7..21f21f753b0 100644 --- a/apps/dashboard/pkg/apis/dashboard/v1beta1/dashboard_metadata_gen.go +++ b/apps/dashboard/pkg/apis/dashboard/v1beta1/dashboard_metadata_gen.go @@ -24,5 +24,8 @@ type DashboardMetadata struct { // NewDashboardMetadata creates a new DashboardMetadata object. func NewDashboardMetadata() *DashboardMetadata { - return &DashboardMetadata{} + return &DashboardMetadata{ + Finalizers: []string{}, + Labels: map[string]string{}, + } } diff --git a/apps/dashboard/pkg/apis/dashboard/v1beta1/zz_generated.openapi_violation_exceptions.list b/apps/dashboard/pkg/apis/dashboard/v1beta1/zz_generated.openapi_violation_exceptions.list index a4bab110b14..4bcb47dd752 100644 --- a/apps/dashboard/pkg/apis/dashboard/v1beta1/zz_generated.openapi_violation_exceptions.list +++ b/apps/dashboard/pkg/apis/dashboard/v1beta1/zz_generated.openapi_violation_exceptions.list @@ -1,3 +1,4 @@ API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1beta1,DashboardMetadata,Finalizers API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1beta1,LibraryPanelStatus,Warnings API rule violation: names_match,github.com/grafana/grafana/pkg/apimachinery/apis/common/v0alpha1,Unstructured,Object +API rule violation: streaming_list_type_json_tags,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1beta1,DashboardList,ListMeta diff --git a/apps/dashboard/pkg/apis/dashboard/v2alpha1/constants.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/constants.go index 84b030c8994..a05b38f3aac 100644 --- a/apps/dashboard/pkg/apis/dashboard/v2alpha1/constants.go +++ b/apps/dashboard/pkg/apis/dashboard/v2alpha1/constants.go @@ -3,16 +3,16 @@ package v2alpha1 import "k8s.io/apimachinery/pkg/runtime/schema" const ( - // Group is the API group used by all kinds in this package - Group = "dashboard.grafana.app" - // Version is the API version used by all kinds in this package - Version = "v2alpha1" + // APIGroup is the API group used by all kinds in this package + APIGroup = "dashboard.grafana.app" + // APIVersion is the API version used by all kinds in this package + APIVersion = "v2alpha1" ) var ( // GroupVersion is a schema.GroupVersion consisting of the Group and Version constants for this package GroupVersion = schema.GroupVersion{ - Group: Group, - Version: Version, + Group: APIGroup, + Version: APIVersion, } ) diff --git a/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_metadata_gen.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_metadata_gen.go index f4e92178780..235e26d307d 100644 --- a/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_metadata_gen.go +++ b/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_metadata_gen.go @@ -24,5 +24,8 @@ type DashboardMetadata struct { // NewDashboardMetadata creates a new DashboardMetadata object. func NewDashboardMetadata() *DashboardMetadata { - return &DashboardMetadata{} + return &DashboardMetadata{ + Finalizers: []string{}, + Labels: map[string]string{}, + } } diff --git a/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_spec.cue b/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_spec.cue index 38ec4bf46ce..a08f1f6eff6 100644 --- a/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_spec.cue +++ b/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_spec.cue @@ -522,21 +522,8 @@ GridLayoutItemKind: { spec: GridLayoutItemSpec } -GridLayoutRowKind: { - kind: "GridLayoutRow" - spec: GridLayoutRowSpec -} - -GridLayoutRowSpec: { - y: int - collapsed: bool - title: string - elements: [...GridLayoutItemKind] // Grid items in the row will have their Y value be relative to the rows Y value. This means a panel positioned at Y: 0 in a row with Y: 10 will be positioned at Y: 11 (row header has a heigh of 1) in the dashboard. - repeat?: RowRepeatOptions -} - GridLayoutSpec: { - items: [...GridLayoutItemKind | GridLayoutRowKind] + items: [...GridLayoutItemKind] } GridLayoutKind: { diff --git a/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_spec_gen.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_spec_gen.go index 45db16e7490..9fda0a85c6f 100644 --- a/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_spec_gen.go +++ b/apps/dashboard/pkg/apis/dashboard/v2alpha1/dashboard_spec_gen.go @@ -5,7 +5,6 @@ package v2alpha1 import ( json "encoding/json" errors "errors" - fmt "fmt" ) // +k8s:openapi-gen=true @@ -65,7 +64,9 @@ type DashboardDataQueryKind struct { // NewDashboardDataQueryKind creates a new DashboardDataQueryKind object. func NewDashboardDataQueryKind() *DashboardDataQueryKind { - return &DashboardDataQueryKind{} + return &DashboardDataQueryKind{ + Spec: map[string]interface{}{}, + } } // +k8s:openapi-gen=true @@ -80,6 +81,7 @@ type DashboardAnnotationPanelFilter struct { func NewDashboardAnnotationPanelFilter() *DashboardAnnotationPanelFilter { return &DashboardAnnotationPanelFilter{ Exclude: (func(input bool) *bool { return &input })(false), + Ids: []uint32{}, } } @@ -133,6 +135,7 @@ type DashboardPanelSpec struct { // NewDashboardPanelSpec creates a new DashboardPanelSpec object. func NewDashboardPanelSpec() *DashboardPanelSpec { return &DashboardPanelSpec{ + Links: []DashboardDataLink{}, Data: *NewDashboardQueryGroupKind(), VizConfig: *NewDashboardVizConfigKind(), } @@ -174,7 +177,9 @@ type DashboardQueryGroupSpec struct { // NewDashboardQueryGroupSpec creates a new DashboardQueryGroupSpec object. func NewDashboardQueryGroupSpec() *DashboardQueryGroupSpec { return &DashboardQueryGroupSpec{ - QueryOptions: *NewDashboardQueryOptionsSpec(), + Queries: []DashboardPanelQueryKind{}, + Transformations: []DashboardTransformationKind{}, + QueryOptions: *NewDashboardQueryOptionsSpec(), } } @@ -313,6 +318,7 @@ type DashboardVizConfigSpec struct { // NewDashboardVizConfigSpec creates a new DashboardVizConfigSpec object. func NewDashboardVizConfigSpec() *DashboardVizConfigSpec { return &DashboardVizConfigSpec{ + Options: map[string]interface{}{}, FieldConfig: *NewDashboardFieldConfigSource(), } } @@ -331,7 +337,8 @@ type DashboardFieldConfigSource struct { // NewDashboardFieldConfigSource creates a new DashboardFieldConfigSource object. func NewDashboardFieldConfigSource() *DashboardFieldConfigSource { return &DashboardFieldConfigSource{ - Defaults: *NewDashboardFieldConfig(), + Defaults: *NewDashboardFieldConfig(), + Overrides: []DashboardV2alpha1FieldConfigSourceOverrides{}, } } @@ -417,7 +424,8 @@ type DashboardValueMap struct { // NewDashboardValueMap creates a new DashboardValueMap object. func NewDashboardValueMap() *DashboardValueMap { return &DashboardValueMap{ - Type: DashboardMappingTypeValue, + Type: DashboardMappingTypeValue, + Options: map[string]DashboardValueMappingResult{}, } } @@ -526,7 +534,9 @@ type DashboardThresholdsConfig struct { // NewDashboardThresholdsConfig creates a new DashboardThresholdsConfig object. func NewDashboardThresholdsConfig() *DashboardThresholdsConfig { - return &DashboardThresholdsConfig{} + return &DashboardThresholdsConfig{ + Steps: []DashboardThreshold{}, + } } // +k8s:openapi-gen=true @@ -688,12 +698,14 @@ func NewDashboardGridLayoutKind() *DashboardGridLayoutKind { // +k8s:openapi-gen=true type DashboardGridLayoutSpec struct { - Items []DashboardGridLayoutItemKindOrGridLayoutRowKind `json:"items"` + Items []DashboardGridLayoutItemKind `json:"items"` } // NewDashboardGridLayoutSpec creates a new DashboardGridLayoutSpec object. func NewDashboardGridLayoutSpec() *DashboardGridLayoutSpec { - return &DashboardGridLayoutSpec{} + return &DashboardGridLayoutSpec{ + Items: []DashboardGridLayoutItemKind{}, + } } // +k8s:openapi-gen=true @@ -758,46 +770,6 @@ func NewDashboardRepeatOptions() *DashboardRepeatOptions { // +k8s:openapi-gen=true const DashboardRepeatMode = "variable" -// +k8s:openapi-gen=true -type DashboardGridLayoutRowKind struct { - Kind string `json:"kind"` - Spec DashboardGridLayoutRowSpec `json:"spec"` -} - -// NewDashboardGridLayoutRowKind creates a new DashboardGridLayoutRowKind object. -func NewDashboardGridLayoutRowKind() *DashboardGridLayoutRowKind { - return &DashboardGridLayoutRowKind{ - Kind: "GridLayoutRow", - Spec: *NewDashboardGridLayoutRowSpec(), - } -} - -// +k8s:openapi-gen=true -type DashboardGridLayoutRowSpec struct { - Y int64 `json:"y"` - Collapsed bool `json:"collapsed"` - Title string `json:"title"` - // Grid items in the row will have their Y value be relative to the rows Y value. This means a panel positioned at Y: 0 in a row with Y: 10 will be positioned at Y: 11 (row header has a heigh of 1) in the dashboard. - Elements []DashboardGridLayoutItemKind `json:"elements"` - Repeat *DashboardRowRepeatOptions `json:"repeat,omitempty"` -} - -// NewDashboardGridLayoutRowSpec creates a new DashboardGridLayoutRowSpec object. -func NewDashboardGridLayoutRowSpec() *DashboardGridLayoutRowSpec { - return &DashboardGridLayoutRowSpec{} -} - -// +k8s:openapi-gen=true -type DashboardRowRepeatOptions struct { - Mode string `json:"mode"` - Value string `json:"value"` -} - -// NewDashboardRowRepeatOptions creates a new DashboardRowRepeatOptions object. -func NewDashboardRowRepeatOptions() *DashboardRowRepeatOptions { - return &DashboardRowRepeatOptions{} -} - // +k8s:openapi-gen=true type DashboardRowsLayoutKind struct { Kind string `json:"kind"` @@ -819,7 +791,9 @@ type DashboardRowsLayoutSpec struct { // NewDashboardRowsLayoutSpec creates a new DashboardRowsLayoutSpec object. func NewDashboardRowsLayoutSpec() *DashboardRowsLayoutSpec { - return &DashboardRowsLayoutSpec{} + return &DashboardRowsLayoutSpec{ + Rows: []DashboardRowsLayoutRowKind{}, + } } // +k8s:openapi-gen=true @@ -877,7 +851,9 @@ type DashboardConditionalRenderingGroupSpec struct { // NewDashboardConditionalRenderingGroupSpec creates a new DashboardConditionalRenderingGroupSpec object. func NewDashboardConditionalRenderingGroupSpec() *DashboardConditionalRenderingGroupSpec { - return &DashboardConditionalRenderingGroupSpec{} + return &DashboardConditionalRenderingGroupSpec{ + Items: []DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeRangeSizeKind{}, + } } // +k8s:openapi-gen=true @@ -954,6 +930,17 @@ func NewDashboardConditionalRenderingTimeRangeSizeSpec() *DashboardConditionalRe return &DashboardConditionalRenderingTimeRangeSizeSpec{} } +// +k8s:openapi-gen=true +type DashboardRowRepeatOptions struct { + Mode string `json:"mode"` + Value string `json:"value"` +} + +// NewDashboardRowRepeatOptions creates a new DashboardRowRepeatOptions object. +func NewDashboardRowRepeatOptions() *DashboardRowRepeatOptions { + return &DashboardRowRepeatOptions{} +} + // +k8s:openapi-gen=true type DashboardAutoGridLayoutKind struct { Kind string `json:"kind"` @@ -984,6 +971,7 @@ func NewDashboardAutoGridLayoutSpec() *DashboardAutoGridLayoutSpec { return &DashboardAutoGridLayoutSpec{ MaxColumnCount: (func(input float64) *float64 { return &input })(3), FillScreen: (func(input bool) *bool { return &input })(false), + Items: []DashboardAutoGridLayoutItemKind{}, } } @@ -1047,7 +1035,9 @@ type DashboardTabsLayoutSpec struct { // NewDashboardTabsLayoutSpec creates a new DashboardTabsLayoutSpec object. func NewDashboardTabsLayoutSpec() *DashboardTabsLayoutSpec { - return &DashboardTabsLayoutSpec{} + return &DashboardTabsLayoutSpec{ + Tabs: []DashboardTabsLayoutTabKind{}, + } } // +k8s:openapi-gen=true @@ -1119,6 +1109,7 @@ type DashboardDashboardLink struct { // NewDashboardDashboardLink creates a new DashboardDashboardLink object. func NewDashboardDashboardLink() *DashboardDashboardLink { return &DashboardDashboardLink{ + Tags: []string{}, AsDropdown: false, TargetBlank: false, IncludeVars: false, @@ -1260,6 +1251,7 @@ func NewDashboardQueryVariableSpec() *DashboardQueryVariableSpec { SkipUrlSync: false, Query: *NewDashboardDataQueryKind(), Regex: "", + Options: []DashboardVariableOption{}, Multi: false, IncludeAll: false, AllowCustomValue: true, @@ -1475,6 +1467,7 @@ func NewDashboardDatasourceVariableSpec() *DashboardDatasourceVariableSpec { String: (func(input string) *string { return &input })(""), }, }, + Options: []DashboardVariableOption{}, Multi: false, IncludeAll: false, Hide: DashboardVariableHideDontHide, @@ -1528,6 +1521,7 @@ func NewDashboardIntervalVariableSpec() *DashboardIntervalVariableSpec { String: (func(input string) *string { return &input })(""), }, }, + Options: []DashboardVariableOption{}, Auto: false, AutoMin: "", AutoCount: 0, @@ -1575,6 +1569,7 @@ func NewDashboardCustomVariableSpec() *DashboardCustomVariableSpec { Name: "", Query: "", Current: *NewDashboardVariableOption(), + Options: []DashboardVariableOption{}, Multi: false, IncludeAll: false, Hide: DashboardVariableHideDontHide, @@ -1625,6 +1620,7 @@ func NewDashboardGroupByVariableSpec() *DashboardGroupByVariableSpec { String: (func(input string) *string { return &input })(""), }, }, + Options: []DashboardVariableOption{}, Multi: false, Hide: DashboardVariableHideDontHide, SkipUrlSync: false, @@ -1665,6 +1661,9 @@ type DashboardAdhocVariableSpec struct { func NewDashboardAdhocVariableSpec() *DashboardAdhocVariableSpec { return &DashboardAdhocVariableSpec{ Name: "", + BaseFilters: []DashboardAdHocFilterWithLabels{}, + Filters: []DashboardAdHocFilterWithLabels{}, + DefaultKeys: []DashboardMetricFindValue{}, Hide: DashboardVariableHideDontHide, SkipUrlSync: false, AllowCustomValue: true, @@ -1752,11 +1751,16 @@ type DashboardSpec struct { // NewDashboardSpec creates a new DashboardSpec object. func NewDashboardSpec() *DashboardSpec { return &DashboardSpec{ + Annotations: []DashboardAnnotationQueryKind{}, CursorSync: DashboardDashboardCursorSyncOff, Editable: (func(input bool) *bool { return &input })(true), + Elements: map[string]DashboardElement{}, Layout: *NewDashboardGridLayoutKindOrRowsLayoutKindOrAutoGridLayoutKindOrTabsLayoutKind(), + Links: []DashboardDashboardLink{}, Preload: false, + Tags: []string{}, TimeSettings: *NewDashboardTimeSettingsSpec(), + Variables: []DashboardVariableKind{}, } } @@ -1769,7 +1773,8 @@ type DashboardV2alpha1FieldConfigSourceOverrides struct { // NewDashboardV2alpha1FieldConfigSourceOverrides creates a new DashboardV2alpha1FieldConfigSourceOverrides object. func NewDashboardV2alpha1FieldConfigSourceOverrides() *DashboardV2alpha1FieldConfigSourceOverrides { return &DashboardV2alpha1FieldConfigSourceOverrides{ - Matcher: *NewDashboardMatcherConfig(), + Matcher: *NewDashboardMatcherConfig(), + Properties: []DashboardDynamicConfigValue{}, } } @@ -1900,6 +1905,7 @@ func (resource DashboardPanelKindOrLibraryPanelKind) MarshalJSON() ([]byte, erro if resource.LibraryPanelKind != nil { return json.Marshal(resource.LibraryPanelKind) } + return []byte("null"), nil } @@ -1917,7 +1923,7 @@ func (resource *DashboardPanelKindOrLibraryPanelKind) UnmarshalJSON(raw []byte) discriminator, found := parsedAsMap["kind"] if !found { - return errors.New("discriminator field 'kind' not found in payload") + return nil } switch discriminator { @@ -1939,7 +1945,7 @@ func (resource *DashboardPanelKindOrLibraryPanelKind) UnmarshalJSON(raw []byte) return nil } - return fmt.Errorf("could not unmarshal resource with `kind = %v`", discriminator) + return nil } // +k8s:openapi-gen=true @@ -1969,6 +1975,7 @@ func (resource DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap) MarshalJS if resource.SpecialValueMap != nil { return json.Marshal(resource.SpecialValueMap) } + return []byte("null"), nil } @@ -1986,7 +1993,7 @@ func (resource *DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap) Unmarsha discriminator, found := parsedAsMap["type"] if !found { - return errors.New("discriminator field 'type' not found in payload") + return nil } switch discriminator { @@ -2024,68 +2031,7 @@ func (resource *DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap) Unmarsha return nil } - return fmt.Errorf("could not unmarshal resource with `type = %v`", discriminator) -} - -// +k8s:openapi-gen=true -type DashboardGridLayoutItemKindOrGridLayoutRowKind struct { - GridLayoutItemKind *DashboardGridLayoutItemKind `json:"GridLayoutItemKind,omitempty"` - GridLayoutRowKind *DashboardGridLayoutRowKind `json:"GridLayoutRowKind,omitempty"` -} - -// NewDashboardGridLayoutItemKindOrGridLayoutRowKind creates a new DashboardGridLayoutItemKindOrGridLayoutRowKind object. -func NewDashboardGridLayoutItemKindOrGridLayoutRowKind() *DashboardGridLayoutItemKindOrGridLayoutRowKind { - return &DashboardGridLayoutItemKindOrGridLayoutRowKind{} -} - -// MarshalJSON implements a custom JSON marshalling logic to encode `DashboardGridLayoutItemKindOrGridLayoutRowKind` as JSON. -func (resource DashboardGridLayoutItemKindOrGridLayoutRowKind) MarshalJSON() ([]byte, error) { - if resource.GridLayoutItemKind != nil { - return json.Marshal(resource.GridLayoutItemKind) - } - if resource.GridLayoutRowKind != nil { - return json.Marshal(resource.GridLayoutRowKind) - } - return []byte("null"), nil -} - -// UnmarshalJSON implements a custom JSON unmarshalling logic to decode `DashboardGridLayoutItemKindOrGridLayoutRowKind` from JSON. -func (resource *DashboardGridLayoutItemKindOrGridLayoutRowKind) UnmarshalJSON(raw []byte) error { - if raw == nil { - return nil - } - - // FIXME: this is wasteful, we need to find a more efficient way to unmarshal this. - parsedAsMap := make(map[string]interface{}) - if err := json.Unmarshal(raw, &parsedAsMap); err != nil { - return err - } - - discriminator, found := parsedAsMap["kind"] - if !found { - return errors.New("discriminator field 'kind' not found in payload") - } - - switch discriminator { - case "GridLayoutItem": - var dashboardGridLayoutItemKind DashboardGridLayoutItemKind - if err := json.Unmarshal(raw, &dashboardGridLayoutItemKind); err != nil { - return err - } - - resource.GridLayoutItemKind = &dashboardGridLayoutItemKind - return nil - case "GridLayoutRow": - var dashboardGridLayoutRowKind DashboardGridLayoutRowKind - if err := json.Unmarshal(raw, &dashboardGridLayoutRowKind); err != nil { - return err - } - - resource.GridLayoutRowKind = &dashboardGridLayoutRowKind - return nil - } - - return fmt.Errorf("could not unmarshal resource with `kind = %v`", discriminator) + return nil } // +k8s:openapi-gen=true @@ -2115,6 +2061,7 @@ func (resource DashboardGridLayoutKindOrAutoGridLayoutKindOrTabsLayoutKindOrRows if resource.RowsLayoutKind != nil { return json.Marshal(resource.RowsLayoutKind) } + return []byte("null"), nil } @@ -2132,7 +2079,7 @@ func (resource *DashboardGridLayoutKindOrAutoGridLayoutKindOrTabsLayoutKindOrRow discriminator, found := parsedAsMap["kind"] if !found { - return errors.New("discriminator field 'kind' not found in payload") + return nil } switch discriminator { @@ -2170,7 +2117,7 @@ func (resource *DashboardGridLayoutKindOrAutoGridLayoutKindOrTabsLayoutKindOrRow return nil } - return fmt.Errorf("could not unmarshal resource with `kind = %v`", discriminator) + return nil } // +k8s:openapi-gen=true @@ -2196,6 +2143,7 @@ func (resource DashboardConditionalRenderingVariableKindOrConditionalRenderingDa if resource.ConditionalRenderingTimeRangeSizeKind != nil { return json.Marshal(resource.ConditionalRenderingTimeRangeSizeKind) } + return []byte("null"), nil } @@ -2213,7 +2161,7 @@ func (resource *DashboardConditionalRenderingVariableKindOrConditionalRenderingD discriminator, found := parsedAsMap["kind"] if !found { - return errors.New("discriminator field 'kind' not found in payload") + return nil } switch discriminator { @@ -2243,7 +2191,7 @@ func (resource *DashboardConditionalRenderingVariableKindOrConditionalRenderingD return nil } - return fmt.Errorf("could not unmarshal resource with `kind = %v`", discriminator) + return nil } // +k8s:openapi-gen=true @@ -2273,6 +2221,7 @@ func (resource DashboardGridLayoutKindOrRowsLayoutKindOrAutoGridLayoutKindOrTabs if resource.TabsLayoutKind != nil { return json.Marshal(resource.TabsLayoutKind) } + return []byte("null"), nil } @@ -2290,7 +2239,7 @@ func (resource *DashboardGridLayoutKindOrRowsLayoutKindOrAutoGridLayoutKindOrTab discriminator, found := parsedAsMap["kind"] if !found { - return errors.New("discriminator field 'kind' not found in payload") + return nil } switch discriminator { @@ -2328,7 +2277,7 @@ func (resource *DashboardGridLayoutKindOrRowsLayoutKindOrAutoGridLayoutKindOrTab return nil } - return fmt.Errorf("could not unmarshal resource with `kind = %v`", discriminator) + return nil } // +k8s:openapi-gen=true @@ -2374,6 +2323,7 @@ func (resource DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKin if resource.AdhocVariableKind != nil { return json.Marshal(resource.AdhocVariableKind) } + return []byte("null"), nil } @@ -2391,7 +2341,7 @@ func (resource *DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKi discriminator, found := parsedAsMap["kind"] if !found { - return errors.New("discriminator field 'kind' not found in payload") + return nil } switch discriminator { @@ -2461,7 +2411,7 @@ func (resource *DashboardQueryVariableKindOrTextVariableKindOrConstantVariableKi return nil } - return fmt.Errorf("could not unmarshal resource with `kind = %v`", discriminator) + return nil } // +k8s:openapi-gen=true diff --git a/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.openapi.go b/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.openapi.go index 20fd5a637cc..85b5a6f65cb 100644 --- a/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.openapi.go +++ b/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.openapi.go @@ -56,13 +56,10 @@ func GetOpenAPIDefinitions(ref common.ReferenceCallback) map[string]common.OpenA "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardFieldConfig": schema_pkg_apis_dashboard_v2alpha1_DashboardFieldConfig(ref), "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardFieldConfigSource": schema_pkg_apis_dashboard_v2alpha1_DashboardFieldConfigSource(ref), "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKind": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutItemKind(ref), - "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKindOrGridLayoutRowKind": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutItemKindOrGridLayoutRowKind(ref), "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutItemSpec(ref), "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKind": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutKind(ref), "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKindOrAutoGridLayoutKindOrTabsLayoutKindOrRowsLayoutKind": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutKindOrAutoGridLayoutKindOrTabsLayoutKindOrRowsLayoutKind(ref), "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutKindOrRowsLayoutKindOrAutoGridLayoutKindOrTabsLayoutKind": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutKindOrRowsLayoutKindOrAutoGridLayoutKindOrTabsLayoutKind(ref), - "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutRowKind": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutRowKind(ref), - "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutRowSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutRowSpec(ref), "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutSpec(ref), "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGroupByVariableKind": schema_pkg_apis_dashboard_v2alpha1_DashboardGroupByVariableKind(ref), "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGroupByVariableSpec": schema_pkg_apis_dashboard_v2alpha1_DashboardGroupByVariableSpec(ref), @@ -2057,30 +2054,6 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutItemKind(ref common.R } } -func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutItemKindOrGridLayoutRowKind(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "GridLayoutItemKind": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKind"), - }, - }, - "GridLayoutRowKind": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutRowKind"), - }, - }, - }, - }, - }, - Dependencies: []string{ - "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutRowKind"}, - } -} - func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutItemSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -2232,89 +2205,6 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutKindOrRowsLayoutKindO } } -func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutRowKind(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "kind": { - SchemaProps: spec.SchemaProps{ - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - "spec": { - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutRowSpec"), - }, - }, - }, - Required: []string{"kind", "spec"}, - }, - }, - Dependencies: []string{ - "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutRowSpec"}, - } -} - -func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutRowSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { - return common.OpenAPIDefinition{ - Schema: spec.Schema{ - SchemaProps: spec.SchemaProps{ - Type: []string{"object"}, - Properties: map[string]spec.Schema{ - "y": { - SchemaProps: spec.SchemaProps{ - Default: 0, - Type: []string{"integer"}, - Format: "int64", - }, - }, - "collapsed": { - SchemaProps: spec.SchemaProps{ - Default: false, - Type: []string{"boolean"}, - Format: "", - }, - }, - "title": { - SchemaProps: spec.SchemaProps{ - Default: "", - Type: []string{"string"}, - Format: "", - }, - }, - "elements": { - SchemaProps: spec.SchemaProps{ - Description: "Grid items in the row will have their Y value be relative to the rows Y value. This means a panel positioned at Y: 0 in a row with Y: 10 will be positioned at Y: 11 (row header has a heigh of 1) in the dashboard.", - Type: []string{"array"}, - Items: &spec.SchemaOrArray{ - Schema: &spec.Schema{ - SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKind"), - }, - }, - }, - }, - }, - "repeat": { - SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowRepeatOptions"), - }, - }, - }, - Required: []string{"y", "collapsed", "title", "elements"}, - }, - }, - Dependencies: []string{ - "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKind", "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardRowRepeatOptions"}, - } -} - func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutSpec(ref common.ReferenceCallback) common.OpenAPIDefinition { return common.OpenAPIDefinition{ Schema: spec.Schema{ @@ -2327,7 +2217,8 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutSpec(ref common.Refer Items: &spec.SchemaOrArray{ Schema: &spec.Schema{ SchemaProps: spec.SchemaProps{ - Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKindOrGridLayoutRowKind"), + Default: map[string]interface{}{}, + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKind"), }, }, }, @@ -2338,7 +2229,7 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardGridLayoutSpec(ref common.Refer }, }, Dependencies: []string{ - "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKindOrGridLayoutRowKind"}, + "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardGridLayoutItemKind"}, } } @@ -2390,6 +2281,11 @@ func schema_pkg_apis_dashboard_v2alpha1_DashboardGroupByVariableSpec(ref common. Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardDataSourceRef"), }, }, + "defaultValue": { + SchemaProps: spec.SchemaProps{ + Ref: ref("github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1.DashboardVariableOption"), + }, + }, "current": { SchemaProps: spec.SchemaProps{ Default: map[string]interface{}{}, diff --git a/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.openapi_violation_exceptions.list b/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.openapi_violation_exceptions.list index 889a4fcdfed..d0755a7cd1f 100644 --- a/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.openapi_violation_exceptions.list +++ b/apps/dashboard/pkg/apis/dashboard/v2alpha1/zz_generated.openapi_violation_exceptions.list @@ -12,7 +12,6 @@ API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/ API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardFieldConfig,Links API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardFieldConfig,Mappings API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardFieldConfigSource,Overrides -API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutRowSpec,Elements API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutSpec,Items API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGroupByVariableSpec,Options API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardIntervalVariableSpec,Options @@ -36,8 +35,6 @@ API rule violation: list_type_missing,github.com/grafana/grafana/apps/dashboard/ API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeRangeSizeKind,ConditionalRenderingDataKind API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeRangeSizeKind,ConditionalRenderingTimeRangeSizeKind API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardConditionalRenderingVariableKindOrConditionalRenderingDataKindOrConditionalRenderingTimeRangeSizeKind,ConditionalRenderingVariableKind -API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutItemKindOrGridLayoutRowKind,GridLayoutItemKind -API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutItemKindOrGridLayoutRowKind,GridLayoutRowKind API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrAutoGridLayoutKindOrTabsLayoutKindOrRowsLayoutKind,AutoGridLayoutKind API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrAutoGridLayoutKindOrTabsLayoutKindOrRowsLayoutKind,GridLayoutKind API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardGridLayoutKindOrAutoGridLayoutKindOrTabsLayoutKindOrRowsLayoutKind,RowsLayoutKind @@ -66,3 +63,4 @@ API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/ap API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap,RegexMap API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap,SpecialValueMap API rule violation: names_match,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardValueMapOrRangeMapOrRegexMapOrSpecialValueMap,ValueMap +API rule violation: streaming_list_type_json_tags,github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1,DashboardList,ListMeta diff --git a/apps/dashboard/pkg/apis/dashboard_manifest.go b/apps/dashboard/pkg/apis/dashboard_manifest.go index e8ebdfbc5ed..e9fa97d8017 100644 --- a/apps/dashboard/pkg/apis/dashboard_manifest.go +++ b/apps/dashboard/pkg/apis/dashboard_manifest.go @@ -6,13 +6,14 @@ package apis import ( - "encoding/json" - + "fmt" "github.com/grafana/grafana-app-sdk/app" + "github.com/grafana/grafana-app-sdk/resource" + v0alpha1 "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v0alpha1" + v1beta1 "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v1beta1" + v2alpha1 "github.com/grafana/grafana/apps/dashboard/pkg/apis/dashboard/v2alpha1" ) -var () - var appManifestData = app.ManifestData{ AppName: "dashboard", Group: "dashboard.grafana.app", @@ -38,12 +39,6 @@ var appManifestData = app.ManifestData{ }, } -func jsonToMap(j string) map[string]any { - m := make(map[string]any) - json.Unmarshal([]byte(j), &j) - return m -} - func LocalManifest() app.Manifest { return app.NewEmbeddedManifest(appManifestData) } @@ -51,3 +46,16 @@ func LocalManifest() app.Manifest { func RemoteManifest() app.Manifest { return app.NewAPIServerManifest("dashboard") } + +var kindVersionToGoType = map[string]resource.Kind{ + "Dashboard/v0alpha1": v0alpha1.DashboardKind(), + "Dashboard/v1beta1": v1beta1.DashboardKind(), + "Dashboard/v2alpha1": v2alpha1.DashboardKind(), +} + +// ManifestGoTypeAssociator returns the associated resource.Kind instance for a given Kind and Version, if one exists. +// If there is no association for the provided Kind and Version, exists will return false. +func ManifestGoTypeAssociator(kind, version string) (goType resource.Kind, exists bool) { + goType, exists = kindVersionToGoType[fmt.Sprintf("%s/%s", kind, version)] + return goType, exists +} diff --git a/apps/folder/Makefile b/apps/folder/Makefile index 95a9469d052..16180b36af0 100644 --- a/apps/folder/Makefile +++ b/apps/folder/Makefile @@ -1,4 +1,4 @@ -APP_SDK_VERSION := v0.35.1 +APP_SDK_VERSION := v0.38.2 APP_SDK_DIR := $(shell go env GOPATH)/bin/app-sdk-$(APP_SDK_VERSION) APP_SDK_BIN := $(APP_SDK_DIR)/grafana-app-sdk diff --git a/apps/folder/go.mod b/apps/folder/go.mod index 8db4e00dc83..84685631d82 100644 --- a/apps/folder/go.mod +++ b/apps/folder/go.mod @@ -3,9 +3,9 @@ module github.com/grafana/grafana/apps/folder go 1.24.3 require ( - github.com/grafana/grafana-app-sdk v0.35.1 - github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250422074709-7c8433fbb2c2 - k8s.io/apimachinery v0.32.3 + github.com/grafana/grafana-app-sdk v0.38.2 + github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250514132646-acbc7b54ed9e + k8s.io/apimachinery v0.33.1 k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff ) @@ -20,10 +20,10 @@ require ( github.com/go-openapi/jsonpointer v0.21.0 // indirect github.com/go-openapi/jsonreference v0.21.0 // indirect github.com/go-openapi/swag v0.23.0 // indirect + github.com/go-test/deep v1.1.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/gnostic-models v0.6.9 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/grafana/grafana-app-sdk/logging v0.35.1 // indirect + github.com/grafana/grafana-app-sdk/logging v0.38.2 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/mailru/easyjson v0.7.7 // indirect @@ -36,9 +36,9 @@ require ( github.com/perimeterx/marshmallow v1.1.5 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_golang v1.22.0 // indirect - github.com/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.63.0 // indirect - github.com/prometheus/procfs v0.16.0 // indirect + github.com/prometheus/procfs v0.16.1 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/stretchr/testify v1.10.0 // indirect github.com/x448/float16 v0.8.4 // indirect @@ -53,7 +53,7 @@ require ( google.golang.org/protobuf v1.36.6 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/client-go v0.32.3 // indirect + k8s.io/client-go v0.33.1 // indirect k8s.io/klog/v2 v2.130.1 // indirect k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect diff --git a/apps/folder/go.sum b/apps/folder/go.sum index 2c1ef4eb0cb..192c9f9f797 100644 --- a/apps/folder/go.sum +++ b/apps/folder/go.sum @@ -20,28 +20,24 @@ github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= -github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= -github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= +github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= +github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw= github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= -github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/grafana/grafana-app-sdk v0.35.1 h1:zEXubzsQrxGBOzXJJMBwhEClC/tvPi0sfK7NGmlX3RI= -github.com/grafana/grafana-app-sdk v0.35.1/go.mod h1:Zx5MkVppYK+ElSDUAR6+fjzOVo6I/cIgk+ty+LmNOxI= -github.com/grafana/grafana-app-sdk/logging v0.35.1 h1:taVpl+RoixTYl0JBJGhH+fPVmwA9wvdwdzJTZsv9buM= -github.com/grafana/grafana-app-sdk/logging v0.35.1/go.mod h1:Y/bvbDhBiV/tkIle9RW49pgfSPIPSON8Q4qjx3pyqDk= -github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250422074709-7c8433fbb2c2 h1:kvG92f3XbJlQPUcZfXlTNLziI4e8LYeA9Jv2ixmM5Ic= -github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250422074709-7c8433fbb2c2/go.mod h1:ll14OJrUGYgXApz3YX6zmxYjRMZHL+pgQjoKBuRzaRs= +github.com/grafana/grafana-app-sdk v0.38.2 h1:raQ1mqCmNJ2AyCSV3m6ehFC0TGVZcqRcM6iOIDT6ZIE= +github.com/grafana/grafana-app-sdk v0.38.2/go.mod h1:LhZ4i2IXGnW5FF/jAczX7SnGFNai7x2qwB8YHNZWiZI= +github.com/grafana/grafana-app-sdk/logging v0.38.2 h1:EdQTRxbbH72zdqJ09Z76zcSjfALJXkpPLgvKEPPnloc= +github.com/grafana/grafana-app-sdk/logging v0.38.2/go.mod h1:Y/bvbDhBiV/tkIle9RW49pgfSPIPSON8Q4qjx3pyqDk= +github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250514132646-acbc7b54ed9e h1:BTKk7LHuG1kmAkucwTA7DuMbKpKvJTKrGdBmUNO4dfQ= +github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250514132646-acbc7b54ed9e/go.mod h1:IA4SOwun8QyST9c5UNs/fN37XL6boXXDvRYFcFwbipg= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -80,12 +76,12 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k= github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18= -github.com/prometheus/procfs v0.16.0 h1:xh6oHhKwnOJKMYiYBDWmkHqQPyiY40sny36Cmx2bbsM= -github.com/prometheus/procfs v0.16.0/go.mod h1:8veyXUu3nGP7oaCxhX6yeaM5u4stL2FeMXnCqhDthZg= +github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= +github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= @@ -154,12 +150,12 @@ gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/api v0.32.3 h1:Hw7KqxRusq+6QSplE3NYG4MBxZw1BZnq4aP4cJVINls= -k8s.io/api v0.32.3/go.mod h1:2wEDTXADtm/HA7CCMD8D8bK4yuBUptzaRhYcYEEYA3k= -k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= -k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= -k8s.io/client-go v0.32.3 h1:RKPVltzopkSgHS7aS98QdscAgtgah/+zmpAogooIqVU= -k8s.io/client-go v0.32.3/go.mod h1:3v0+3k4IcT9bXTc4V2rt+d2ZPPG700Xy6Oi0Gdl2PaY= +k8s.io/api v0.33.1 h1:tA6Cf3bHnLIrUK4IqEgb2v++/GYUtqiu9sRVk3iBXyw= +k8s.io/api v0.33.1/go.mod h1:87esjTn9DRSRTD4fWMXamiXxJhpOIREjWOSjsW1kEHw= +k8s.io/apimachinery v0.33.1 h1:mzqXWV8tW9Rw4VeW9rEkqvnxj59k1ezDUl20tFK/oM4= +k8s.io/apimachinery v0.33.1/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= +k8s.io/client-go v0.33.1 h1:ZZV/Ks2g92cyxWkRRnfUDsnhNn28eFpt26aGc8KbXF4= +k8s.io/client-go v0.33.1/go.mod h1:JAsUrl1ArO7uRVFWfcj6kOomSlCv+JpvIsp6usAGefA= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4= diff --git a/apps/folder/pkg/apis/folder/v1beta1/constants.go b/apps/folder/pkg/apis/folder/v1beta1/constants.go index 9ff1a8be368..38d45074658 100644 --- a/apps/folder/pkg/apis/folder/v1beta1/constants.go +++ b/apps/folder/pkg/apis/folder/v1beta1/constants.go @@ -3,16 +3,16 @@ package v1beta1 import "k8s.io/apimachinery/pkg/runtime/schema" const ( - // Group is the API group used by all kinds in this package - Group = "folder.grafana.app" - // Version is the API version used by all kinds in this package - Version = "v1beta1" + // APIGroup is the API group used by all kinds in this package + APIGroup = "folder.grafana.app" + // APIVersion is the API version used by all kinds in this package + APIVersion = "v1beta1" ) var ( // GroupVersion is a schema.GroupVersion consisting of the Group and Version constants for this package GroupVersion = schema.GroupVersion{ - Group: Group, - Version: Version, + Group: APIGroup, + Version: APIVersion, } ) diff --git a/apps/folder/pkg/apis/folder/v1beta1/folder_metadata_gen.go b/apps/folder/pkg/apis/folder/v1beta1/folder_metadata_gen.go index 9f29f863e67..f9c9f5caf98 100644 --- a/apps/folder/pkg/apis/folder/v1beta1/folder_metadata_gen.go +++ b/apps/folder/pkg/apis/folder/v1beta1/folder_metadata_gen.go @@ -24,5 +24,8 @@ type FolderMetadata struct { // NewFolderMetadata creates a new FolderMetadata object. func NewFolderMetadata() *FolderMetadata { - return &FolderMetadata{} + return &FolderMetadata{ + Finalizers: []string{}, + Labels: map[string]string{}, + } } diff --git a/apps/folder/pkg/apis/folder/v1beta1/register.go b/apps/folder/pkg/apis/folder/v1beta1/register.go index 2ce4c2888ba..c660221124c 100644 --- a/apps/folder/pkg/apis/folder/v1beta1/register.go +++ b/apps/folder/pkg/apis/folder/v1beta1/register.go @@ -11,8 +11,8 @@ import ( ) const ( - GROUP = Group - VERSION = Version + GROUP = APIGroup + VERSION = APIVersion RESOURCE = "folders" APIVERSION = GROUP + "/" + VERSION RESOURCEGROUP = RESOURCE + "." + GROUP diff --git a/apps/folder/pkg/apis/folder/v1beta1/zz_generated.openapi_violation_exceptions.list b/apps/folder/pkg/apis/folder/v1beta1/zz_generated.openapi_violation_exceptions.list index 74df3d545ad..41cadea22c0 100644 --- a/apps/folder/pkg/apis/folder/v1beta1/zz_generated.openapi_violation_exceptions.list +++ b/apps/folder/pkg/apis/folder/v1beta1/zz_generated.openapi_violation_exceptions.list @@ -1,3 +1,4 @@ API rule violation: list_type_missing,github.com/grafana/grafana/apps/folder/pkg/apis/folder/v1beta1,DescendantCounts,Counts API rule violation: list_type_missing,github.com/grafana/grafana/apps/folder/pkg/apis/folder/v1beta1,FolderInfoList,Items API rule violation: list_type_missing,github.com/grafana/grafana/apps/folder/pkg/apis/folder/v1beta1,FolderMetadata,Finalizers +API rule violation: streaming_list_type_json_tags,github.com/grafana/grafana/apps/folder/pkg/apis/folder/v1beta1,FolderList,ListMeta diff --git a/apps/folder/pkg/apis/folder_manifest.go b/apps/folder/pkg/apis/folder_manifest.go index 7a78226361c..8491ddc6083 100644 --- a/apps/folder/pkg/apis/folder_manifest.go +++ b/apps/folder/pkg/apis/folder_manifest.go @@ -6,12 +6,13 @@ package apis import ( - "encoding/json" + "fmt" "github.com/grafana/grafana-app-sdk/app" -) + "github.com/grafana/grafana-app-sdk/resource" -var () + v1beta1 "github.com/grafana/grafana/apps/folder/pkg/apis/folder/v1beta1" +) var appManifestData = app.ManifestData{ AppName: "folder", @@ -30,12 +31,6 @@ var appManifestData = app.ManifestData{ }, } -func jsonToMap(j string) map[string]any { - m := make(map[string]any) - json.Unmarshal([]byte(j), &j) - return m -} - func LocalManifest() app.Manifest { return app.NewEmbeddedManifest(appManifestData) } @@ -43,3 +38,14 @@ func LocalManifest() app.Manifest { func RemoteManifest() app.Manifest { return app.NewAPIServerManifest("folder") } + +var kindVersionToGoType = map[string]resource.Kind{ + "Folder/v1beta1": v1beta1.FolderKind(), +} + +// ManifestGoTypeAssociator returns the associated resource.Kind instance for a given Kind and Version, if one exists. +// If there is no association for the provided Kind and Version, exists will return false. +func ManifestGoTypeAssociator(kind, version string) (goType resource.Kind, exists bool) { + goType, exists = kindVersionToGoType[fmt.Sprintf("%s/%s", kind, version)] + return goType, exists +} diff --git a/apps/iam/Makefile b/apps/iam/Makefile index d2f638ba83c..56de939d428 100644 --- a/apps/iam/Makefile +++ b/apps/iam/Makefile @@ -1,4 +1,4 @@ -APP_SDK_VERSION := v0.35.1 +APP_SDK_VERSION := v0.38.2 APP_SDK_DIR := $(shell go env GOPATH)/bin/app-sdk-$(APP_SDK_VERSION) APP_SDK_BIN := $(APP_SDK_DIR)/grafana-app-sdk diff --git a/apps/iam/go.mod b/apps/iam/go.mod index 2e60b3182ec..4501e755d56 100644 --- a/apps/iam/go.mod +++ b/apps/iam/go.mod @@ -3,8 +3,8 @@ module github.com/grafana/grafana/apps/iam go 1.24.3 require ( - github.com/grafana/grafana-app-sdk v0.35.1 - k8s.io/apimachinery v0.32.3 + github.com/grafana/grafana-app-sdk v0.38.2 + k8s.io/apimachinery v0.33.1 k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff ) @@ -19,10 +19,10 @@ require ( github.com/go-openapi/jsonpointer v0.21.0 // indirect github.com/go-openapi/jsonreference v0.21.0 // indirect github.com/go-openapi/swag v0.23.0 // indirect + github.com/go-test/deep v1.1.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/google/gnostic-models v0.6.9 // indirect - github.com/google/gofuzz v1.2.0 // indirect - github.com/grafana/grafana-app-sdk/logging v0.35.1 // indirect + github.com/grafana/grafana-app-sdk/logging v0.38.2 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/mailru/easyjson v0.7.7 // indirect @@ -34,9 +34,9 @@ require ( github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 // indirect github.com/perimeterx/marshmallow v1.1.5 // indirect github.com/prometheus/client_golang v1.22.0 // indirect - github.com/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.63.0 // indirect - github.com/prometheus/procfs v0.16.0 // indirect + github.com/prometheus/procfs v0.16.1 // indirect github.com/rogpeppe/go-internal v1.14.1 // indirect github.com/x448/float16 v0.8.4 // indirect go.opentelemetry.io/otel v1.35.0 // indirect @@ -50,7 +50,7 @@ require ( google.golang.org/protobuf v1.36.6 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/client-go v0.32.3 // indirect + k8s.io/client-go v0.33.1 // indirect k8s.io/klog/v2 v2.130.1 // indirect k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect diff --git a/apps/iam/go.sum b/apps/iam/go.sum index 3740adfbd82..21060a8fa64 100644 --- a/apps/iam/go.sum +++ b/apps/iam/go.sum @@ -20,26 +20,22 @@ github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= -github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= -github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= +github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= +github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= -github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= github.com/google/gnostic-models v0.6.9 h1:MU/8wDLif2qCXZmzncUQ/BOfxWfthHi63KqpoNbWqVw= github.com/google/gnostic-models v0.6.9/go.mod h1:CiWsm0s6BSQd1hRn8/QmxqB6BesYcbSZxsz9b0KuDBw= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= -github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/grafana/grafana-app-sdk v0.35.1 h1:zEXubzsQrxGBOzXJJMBwhEClC/tvPi0sfK7NGmlX3RI= -github.com/grafana/grafana-app-sdk v0.35.1/go.mod h1:Zx5MkVppYK+ElSDUAR6+fjzOVo6I/cIgk+ty+LmNOxI= -github.com/grafana/grafana-app-sdk/logging v0.35.1 h1:taVpl+RoixTYl0JBJGhH+fPVmwA9wvdwdzJTZsv9buM= -github.com/grafana/grafana-app-sdk/logging v0.35.1/go.mod h1:Y/bvbDhBiV/tkIle9RW49pgfSPIPSON8Q4qjx3pyqDk= +github.com/grafana/grafana-app-sdk v0.38.2 h1:raQ1mqCmNJ2AyCSV3m6ehFC0TGVZcqRcM6iOIDT6ZIE= +github.com/grafana/grafana-app-sdk v0.38.2/go.mod h1:LhZ4i2IXGnW5FF/jAczX7SnGFNai7x2qwB8YHNZWiZI= +github.com/grafana/grafana-app-sdk/logging v0.38.2 h1:EdQTRxbbH72zdqJ09Z76zcSjfALJXkpPLgvKEPPnloc= +github.com/grafana/grafana-app-sdk/logging v0.38.2/go.mod h1:Y/bvbDhBiV/tkIle9RW49pgfSPIPSON8Q4qjx3pyqDk= github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= @@ -78,17 +74,19 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k= github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18= -github.com/prometheus/procfs v0.16.0 h1:xh6oHhKwnOJKMYiYBDWmkHqQPyiY40sny36Cmx2bbsM= -github.com/prometheus/procfs v0.16.0/go.mod h1:8veyXUu3nGP7oaCxhX6yeaM5u4stL2FeMXnCqhDthZg= +github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= +github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= @@ -150,12 +148,12 @@ gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/api v0.32.3 h1:Hw7KqxRusq+6QSplE3NYG4MBxZw1BZnq4aP4cJVINls= -k8s.io/api v0.32.3/go.mod h1:2wEDTXADtm/HA7CCMD8D8bK4yuBUptzaRhYcYEEYA3k= -k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= -k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= -k8s.io/client-go v0.32.3 h1:RKPVltzopkSgHS7aS98QdscAgtgah/+zmpAogooIqVU= -k8s.io/client-go v0.32.3/go.mod h1:3v0+3k4IcT9bXTc4V2rt+d2ZPPG700Xy6Oi0Gdl2PaY= +k8s.io/api v0.33.1 h1:tA6Cf3bHnLIrUK4IqEgb2v++/GYUtqiu9sRVk3iBXyw= +k8s.io/api v0.33.1/go.mod h1:87esjTn9DRSRTD4fWMXamiXxJhpOIREjWOSjsW1kEHw= +k8s.io/apimachinery v0.33.1 h1:mzqXWV8tW9Rw4VeW9rEkqvnxj59k1ezDUl20tFK/oM4= +k8s.io/apimachinery v0.33.1/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= +k8s.io/client-go v0.33.1 h1:ZZV/Ks2g92cyxWkRRnfUDsnhNn28eFpt26aGc8KbXF4= +k8s.io/client-go v0.33.1/go.mod h1:JAsUrl1ArO7uRVFWfcj6kOomSlCv+JpvIsp6usAGefA= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4= diff --git a/apps/iam/pkg/apis/iam/v0alpha1/constants.go b/apps/iam/pkg/apis/iam/v0alpha1/constants.go index 1638a1ad4c9..f145b04b736 100644 --- a/apps/iam/pkg/apis/iam/v0alpha1/constants.go +++ b/apps/iam/pkg/apis/iam/v0alpha1/constants.go @@ -3,16 +3,16 @@ package v0alpha1 import "k8s.io/apimachinery/pkg/runtime/schema" const ( - // Group is the API group used by all kinds in this package - Group = "iam.grafana.app" - // Version is the API version used by all kinds in this package - Version = "v0alpha1" + // APIGroup is the API group used by all kinds in this package + APIGroup = "iam.grafana.app" + // APIVersion is the API version used by all kinds in this package + APIVersion = "v0alpha1" ) var ( // GroupVersion is a schema.GroupVersion consisting of the Group and Version constants for this package GroupVersion = schema.GroupVersion{ - Group: Group, - Version: Version, + Group: APIGroup, + Version: APIVersion, } ) diff --git a/apps/iam/pkg/apis/iam/v0alpha1/corerole_metadata_gen.go b/apps/iam/pkg/apis/iam/v0alpha1/corerole_metadata_gen.go index adf2e75275b..8f174cec316 100644 --- a/apps/iam/pkg/apis/iam/v0alpha1/corerole_metadata_gen.go +++ b/apps/iam/pkg/apis/iam/v0alpha1/corerole_metadata_gen.go @@ -24,5 +24,8 @@ type CoreRoleMetadata struct { // NewCoreRoleMetadata creates a new CoreRoleMetadata object. func NewCoreRoleMetadata() *CoreRoleMetadata { - return &CoreRoleMetadata{} + return &CoreRoleMetadata{ + Finalizers: []string{}, + Labels: map[string]string{}, + } } diff --git a/apps/iam/pkg/apis/iam/v0alpha1/corerole_spec_gen.go b/apps/iam/pkg/apis/iam/v0alpha1/corerole_spec_gen.go index 871045e8a96..eb2c1d52e40 100644 --- a/apps/iam/pkg/apis/iam/v0alpha1/corerole_spec_gen.go +++ b/apps/iam/pkg/apis/iam/v0alpha1/corerole_spec_gen.go @@ -30,5 +30,7 @@ type CoreRoleSpec struct { // NewCoreRoleSpec creates a new CoreRoleSpec object. func NewCoreRoleSpec() *CoreRoleSpec { - return &CoreRoleSpec{} + return &CoreRoleSpec{ + Permissions: []CoreRolespecPermission{}, + } } diff --git a/apps/iam/pkg/apis/iam/v0alpha1/globalrole_metadata_gen.go b/apps/iam/pkg/apis/iam/v0alpha1/globalrole_metadata_gen.go index ae02d2f4282..293082a4aaa 100644 --- a/apps/iam/pkg/apis/iam/v0alpha1/globalrole_metadata_gen.go +++ b/apps/iam/pkg/apis/iam/v0alpha1/globalrole_metadata_gen.go @@ -24,5 +24,8 @@ type GlobalRoleMetadata struct { // NewGlobalRoleMetadata creates a new GlobalRoleMetadata object. func NewGlobalRoleMetadata() *GlobalRoleMetadata { - return &GlobalRoleMetadata{} + return &GlobalRoleMetadata{ + Finalizers: []string{}, + Labels: map[string]string{}, + } } diff --git a/apps/iam/pkg/apis/iam/v0alpha1/globalrole_spec_gen.go b/apps/iam/pkg/apis/iam/v0alpha1/globalrole_spec_gen.go index 53ad9518ada..785d2d5724b 100644 --- a/apps/iam/pkg/apis/iam/v0alpha1/globalrole_spec_gen.go +++ b/apps/iam/pkg/apis/iam/v0alpha1/globalrole_spec_gen.go @@ -30,5 +30,7 @@ type GlobalRoleSpec struct { // NewGlobalRoleSpec creates a new GlobalRoleSpec object. func NewGlobalRoleSpec() *GlobalRoleSpec { - return &GlobalRoleSpec{} + return &GlobalRoleSpec{ + Permissions: []GlobalRolespecPermission{}, + } } diff --git a/apps/iam/pkg/apis/iam/v0alpha1/globalrolebinding_metadata_gen.go b/apps/iam/pkg/apis/iam/v0alpha1/globalrolebinding_metadata_gen.go index 4f48ef4702f..b4024454959 100644 --- a/apps/iam/pkg/apis/iam/v0alpha1/globalrolebinding_metadata_gen.go +++ b/apps/iam/pkg/apis/iam/v0alpha1/globalrolebinding_metadata_gen.go @@ -24,5 +24,8 @@ type GlobalRoleBindingMetadata struct { // NewGlobalRoleBindingMetadata creates a new GlobalRoleBindingMetadata object. func NewGlobalRoleBindingMetadata() *GlobalRoleBindingMetadata { - return &GlobalRoleBindingMetadata{} + return &GlobalRoleBindingMetadata{ + Finalizers: []string{}, + Labels: map[string]string{}, + } } diff --git a/apps/iam/pkg/apis/iam/v0alpha1/globalrolebinding_spec_gen.go b/apps/iam/pkg/apis/iam/v0alpha1/globalrolebinding_spec_gen.go index dc664a96bef..a60921ecab5 100644 --- a/apps/iam/pkg/apis/iam/v0alpha1/globalrolebinding_spec_gen.go +++ b/apps/iam/pkg/apis/iam/v0alpha1/globalrolebinding_spec_gen.go @@ -37,7 +37,8 @@ type GlobalRoleBindingSpec struct { // NewGlobalRoleBindingSpec creates a new GlobalRoleBindingSpec object. func NewGlobalRoleBindingSpec() *GlobalRoleBindingSpec { return &GlobalRoleBindingSpec{ - RoleRef: *NewGlobalRoleBindingspecRoleRef(), + Subjects: []GlobalRoleBindingspecSubject{}, + RoleRef: *NewGlobalRoleBindingspecRoleRef(), } } diff --git a/apps/iam/pkg/apis/iam/v0alpha1/resourcepermission_metadata_gen.go b/apps/iam/pkg/apis/iam/v0alpha1/resourcepermission_metadata_gen.go index 81ff6e8a2f5..93089079830 100644 --- a/apps/iam/pkg/apis/iam/v0alpha1/resourcepermission_metadata_gen.go +++ b/apps/iam/pkg/apis/iam/v0alpha1/resourcepermission_metadata_gen.go @@ -24,5 +24,8 @@ type ResourcePermissionMetadata struct { // NewResourcePermissionMetadata creates a new ResourcePermissionMetadata object. func NewResourcePermissionMetadata() *ResourcePermissionMetadata { - return &ResourcePermissionMetadata{} + return &ResourcePermissionMetadata{ + Finalizers: []string{}, + Labels: map[string]string{}, + } } diff --git a/apps/iam/pkg/apis/iam/v0alpha1/resourcepermission_spec_gen.go b/apps/iam/pkg/apis/iam/v0alpha1/resourcepermission_spec_gen.go index 5958268c98a..57a17ac1bf9 100644 --- a/apps/iam/pkg/apis/iam/v0alpha1/resourcepermission_spec_gen.go +++ b/apps/iam/pkg/apis/iam/v0alpha1/resourcepermission_spec_gen.go @@ -29,7 +29,9 @@ type ResourcePermissionspecPermission struct { // NewResourcePermissionspecPermission creates a new ResourcePermissionspecPermission object. func NewResourcePermissionspecPermission() *ResourcePermissionspecPermission { - return &ResourcePermissionspecPermission{} + return &ResourcePermissionspecPermission{ + Verbs: []string{}, + } } // +k8s:openapi-gen=true @@ -41,7 +43,8 @@ type ResourcePermissionSpec struct { // NewResourcePermissionSpec creates a new ResourcePermissionSpec object. func NewResourcePermissionSpec() *ResourcePermissionSpec { return &ResourcePermissionSpec{ - Resource: *NewResourcePermissionspecResource(), + Resource: *NewResourcePermissionspecResource(), + Permissions: []ResourcePermissionspecPermission{}, } } diff --git a/apps/iam/pkg/apis/iam/v0alpha1/role_metadata_gen.go b/apps/iam/pkg/apis/iam/v0alpha1/role_metadata_gen.go index b04a709f93f..f200cad25b5 100644 --- a/apps/iam/pkg/apis/iam/v0alpha1/role_metadata_gen.go +++ b/apps/iam/pkg/apis/iam/v0alpha1/role_metadata_gen.go @@ -24,5 +24,8 @@ type RoleMetadata struct { // NewRoleMetadata creates a new RoleMetadata object. func NewRoleMetadata() *RoleMetadata { - return &RoleMetadata{} + return &RoleMetadata{ + Finalizers: []string{}, + Labels: map[string]string{}, + } } diff --git a/apps/iam/pkg/apis/iam/v0alpha1/role_spec_gen.go b/apps/iam/pkg/apis/iam/v0alpha1/role_spec_gen.go index 0583785b596..f1a165dba4e 100644 --- a/apps/iam/pkg/apis/iam/v0alpha1/role_spec_gen.go +++ b/apps/iam/pkg/apis/iam/v0alpha1/role_spec_gen.go @@ -30,5 +30,7 @@ type RoleSpec struct { // NewRoleSpec creates a new RoleSpec object. func NewRoleSpec() *RoleSpec { - return &RoleSpec{} + return &RoleSpec{ + Permissions: []RolespecPermission{}, + } } diff --git a/apps/iam/pkg/apis/iam/v0alpha1/rolebinding_metadata_gen.go b/apps/iam/pkg/apis/iam/v0alpha1/rolebinding_metadata_gen.go index c57c940e6a5..9af43bab574 100644 --- a/apps/iam/pkg/apis/iam/v0alpha1/rolebinding_metadata_gen.go +++ b/apps/iam/pkg/apis/iam/v0alpha1/rolebinding_metadata_gen.go @@ -24,5 +24,8 @@ type RoleBindingMetadata struct { // NewRoleBindingMetadata creates a new RoleBindingMetadata object. func NewRoleBindingMetadata() *RoleBindingMetadata { - return &RoleBindingMetadata{} + return &RoleBindingMetadata{ + Finalizers: []string{}, + Labels: map[string]string{}, + } } diff --git a/apps/iam/pkg/apis/iam/v0alpha1/rolebinding_spec_gen.go b/apps/iam/pkg/apis/iam/v0alpha1/rolebinding_spec_gen.go index bc1c4daeb6a..cd214ca6cdd 100644 --- a/apps/iam/pkg/apis/iam/v0alpha1/rolebinding_spec_gen.go +++ b/apps/iam/pkg/apis/iam/v0alpha1/rolebinding_spec_gen.go @@ -37,7 +37,8 @@ type RoleBindingSpec struct { // NewRoleBindingSpec creates a new RoleBindingSpec object. func NewRoleBindingSpec() *RoleBindingSpec { return &RoleBindingSpec{ - RoleRef: *NewRoleBindingspecRoleRef(), + Subjects: []RoleBindingspecSubject{}, + RoleRef: *NewRoleBindingspecRoleRef(), } } diff --git a/apps/iam/pkg/apis/iam_manifest.go b/apps/iam/pkg/apis/iam_manifest.go index 4e8b9449e5f..b80f5e5eee3 100644 --- a/apps/iam/pkg/apis/iam_manifest.go +++ b/apps/iam/pkg/apis/iam_manifest.go @@ -6,12 +6,13 @@ package apis import ( - "encoding/json" + "fmt" "github.com/grafana/grafana-app-sdk/app" -) + "github.com/grafana/grafana-app-sdk/resource" -var () + v0alpha1 "github.com/grafana/grafana/apps/iam/pkg/apis/iam/v0alpha1" +) var appManifestData = app.ManifestData{ AppName: "iam", @@ -85,12 +86,6 @@ var appManifestData = app.ManifestData{ }, } -func jsonToMap(j string) map[string]any { - m := make(map[string]any) - json.Unmarshal([]byte(j), &j) - return m -} - func LocalManifest() app.Manifest { return app.NewEmbeddedManifest(appManifestData) } @@ -98,3 +93,19 @@ func LocalManifest() app.Manifest { func RemoteManifest() app.Manifest { return app.NewAPIServerManifest("iam") } + +var kindVersionToGoType = map[string]resource.Kind{ + "GlobalRole/v0alpha1": v0alpha1.GlobalRoleKind(), + "GlobalRoleBinding/v0alpha1": v0alpha1.GlobalRoleBindingKind(), + "CoreRole/v0alpha1": v0alpha1.CoreRoleKind(), + "Role/v0alpha1": v0alpha1.RoleKind(), + "RoleBinding/v0alpha1": v0alpha1.RoleBindingKind(), + "ResourcePermission/v0alpha1": v0alpha1.ResourcePermissionKind(), +} + +// ManifestGoTypeAssociator returns the associated resource.Kind instance for a given Kind and Version, if one exists. +// If there is no association for the provided Kind and Version, exists will return false. +func ManifestGoTypeAssociator(kind, version string) (goType resource.Kind, exists bool) { + goType, exists = kindVersionToGoType[fmt.Sprintf("%s/%s", kind, version)] + return goType, exists +} diff --git a/apps/investigations/go.mod b/apps/investigations/go.mod index 52ef9cfec12..a82f1b8b0ba 100644 --- a/apps/investigations/go.mod +++ b/apps/investigations/go.mod @@ -3,8 +3,8 @@ module github.com/grafana/grafana/apps/investigations go 1.24.3 require ( - github.com/grafana/grafana-app-sdk v0.35.1 - k8s.io/apimachinery v0.32.3 + github.com/grafana/grafana-app-sdk v0.38.2 + k8s.io/apimachinery v0.33.1 k8s.io/klog/v2 v2.130.1 k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff ) @@ -30,8 +30,8 @@ require ( github.com/google/go-cmp v0.7.0 // indirect github.com/google/gofuzz v1.2.0 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/grafana/grafana-app-sdk/logging v0.38.2 // indirect github.com/grafana/authlib v0.0.0-20250515162837-2f4a8263eabb // indirect - github.com/grafana/grafana-app-sdk/logging v0.35.1 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect @@ -47,12 +47,12 @@ require ( github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 // indirect github.com/onsi/ginkgo/v2 v2.22.2 // indirect github.com/onsi/gomega v1.36.2 // indirect - github.com/openfga/openfga v1.8.12 // indirect + github.com/openfga/openfga v1.8.13 // indirect github.com/perimeterx/marshmallow v1.1.5 // indirect github.com/prometheus/client_golang v1.22.0 // indirect github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common v0.63.0 // indirect - github.com/prometheus/procfs v0.16.0 // indirect + github.com/prometheus/procfs v0.16.1 // indirect github.com/puzpuzpuz/xsync/v2 v2.5.1 // indirect github.com/rogpeppe/go-internal v1.14.1 // indirect github.com/spf13/pflag v1.0.6 // indirect @@ -74,17 +74,17 @@ require ( golang.org/x/term v0.32.0 // indirect golang.org/x/text v0.25.0 // indirect golang.org/x/time v0.11.0 // indirect - golang.org/x/tools v0.32.0 // indirect + golang.org/x/tools v0.33.0 // indirect gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250428153025-10db94c68c34 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250428153025-10db94c68c34 // indirect - google.golang.org/grpc v1.72.0 // indirect + google.golang.org/grpc v1.72.1 // indirect google.golang.org/protobuf v1.36.6 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.32.3 // indirect - k8s.io/apiextensions-apiserver v0.32.3 // indirect - k8s.io/client-go v0.32.3 // indirect + k8s.io/api v0.33.1 // indirect + k8s.io/apiextensions-apiserver v0.33.1 // indirect + k8s.io/client-go v0.33.1 // indirect k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect sigs.k8s.io/randfill v1.0.0 // indirect diff --git a/apps/investigations/go.sum b/apps/investigations/go.sum index 7294d6784aa..08f6c1c3849 100644 --- a/apps/investigations/go.sum +++ b/apps/investigations/go.sum @@ -99,6 +99,8 @@ github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8= github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY= github.com/openfga/openfga v1.8.12 h1:xEirA6tFwaJfjBDtbHWCK0/Tw+B8XleRyhg9dcEpzHo= github.com/openfga/openfga v1.8.12/go.mod h1:fIZyekdNB+tWQ6zIiglZonAc5ErZiDGMeHue/BzRYRM= +github.com/openfga/openfga v1.8.13 h1:ROURkotKhbmtyBX3188+cNElN8AOZmTl0CMkxUqwawo= +github.com/openfga/openfga v1.8.13/go.mod h1:h1VGcVW81eY1YyDtFx5+gxxAIEhIiOGR9SRGgs/X/k8= github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -116,6 +118,7 @@ github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9 github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc= github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk= github.com/prometheus/procfs v0.16.0/go.mod h1:8veyXUu3nGP7oaCxhX6yeaM5u4stL2FeMXnCqhDthZg= +github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= github.com/puzpuzpuz/xsync/v2 v2.5.1 h1:mVGYAvzDSu52+zaGyNjC+24Xw2bQi3kTr4QJ6N9pIIU= github.com/puzpuzpuz/xsync/v2 v2.5.1/go.mod h1:gD2H2krq/w52MfPLE+Uy64TzJDVY7lP2znR9qmR35kU= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= @@ -200,6 +203,7 @@ golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.32.0 h1:Q7N1vhpkQv7ybVzLFtTjvQya2ewbwNDZzUgfXGqtMWU= golang.org/x/tools v0.32.0/go.mod h1:ZxrU41P/wAbZD8EDa6dDCa6XfpkhJ7HFMjHJXfBDu8s= +golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -215,6 +219,7 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20250428153025-10db94c68c34/go. google.golang.org/grpc v1.71.1 h1:ffsFWr7ygTUscGPI0KKK6TLrGz0476KUvvsbqWK0rPI= google.golang.org/grpc v1.71.1/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= google.golang.org/grpc v1.72.0/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= +google.golang.org/grpc v1.72.1/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= google.golang.org/protobuf v1.36.6 h1:z1NpPI8ku2WgiWnf+t9wTPsn6eP1L7ksHUlkfLvd9xY= google.golang.org/protobuf v1.36.6/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/apps/playlist/Makefile b/apps/playlist/Makefile index 7a5f1c99365..56de939d428 100644 --- a/apps/playlist/Makefile +++ b/apps/playlist/Makefile @@ -1,3 +1,29 @@ +APP_SDK_VERSION := v0.38.2 +APP_SDK_DIR := $(shell go env GOPATH)/bin/app-sdk-$(APP_SDK_VERSION) +APP_SDK_BIN := $(APP_SDK_DIR)/grafana-app-sdk + +.PHONY: install-app-sdk +install-app-sdk: $(APP_SDK_BIN) ## Install the Grafana App SDK + +$(APP_SDK_BIN): + @echo "Installing Grafana App SDK version $(APP_SDK_VERSION)" + @mkdir -p $(APP_SDK_DIR) + # The only way to install specific versions of binaries using `go install` + # is by setting GOBIN to the directory you want to install the binary to. + GOBIN=$(APP_SDK_DIR) go install github.com/grafana/grafana-app-sdk/cmd/grafana-app-sdk@$(APP_SDK_VERSION) + @touch $@ + +.PHONY: update-app-sdk +update-app-sdk: ## Update the Grafana App SDK dependency in go.mod + go get github.com/grafana/grafana-app-sdk@$(APP_SDK_VERSION) + go mod tidy + .PHONY: generate -generate: - @grafana-app-sdk generate -g ./pkg/apis --grouping=group --postprocess --defencoding=none +generate: install-app-sdk update-app-sdk ## Run Grafana App SDK code generation + @$(APP_SDK_BIN) generate \ + --source=./kinds/ \ + --gogenpath=./pkg/apis \ + --grouping=group \ + --defencoding=none \ + --noschemasinmanifest \ + --postprocess \ No newline at end of file diff --git a/apps/playlist/go.mod b/apps/playlist/go.mod index 1efb1117fcb..fd759ee3fdd 100644 --- a/apps/playlist/go.mod +++ b/apps/playlist/go.mod @@ -3,9 +3,9 @@ module github.com/grafana/grafana/apps/playlist go 1.24.3 require ( - github.com/grafana/grafana-app-sdk v0.35.1 - k8s.io/apimachinery v0.32.3 - k8s.io/client-go v0.32.3 + github.com/grafana/grafana-app-sdk v0.38.2 + k8s.io/apimachinery v0.33.1 + k8s.io/client-go v0.33.1 k8s.io/klog/v2 v2.130.1 k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff ) @@ -17,7 +17,7 @@ require ( github.com/cespare/xxhash/v2 v2.3.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect - github.com/evanphx/json-patch v5.6.0+incompatible // indirect + github.com/evanphx/json-patch v5.9.11+incompatible // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect github.com/getkin/kin-openapi v0.132.0 // indirect github.com/go-logr/logr v1.4.2 // indirect @@ -25,14 +25,13 @@ require ( github.com/go-openapi/jsonpointer v0.21.0 // indirect github.com/go-openapi/jsonreference v0.21.0 // indirect github.com/go-openapi/swag v0.23.0 // indirect + github.com/go-test/deep v1.1.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/protobuf v1.5.4 // indirect github.com/google/gnostic-models v0.6.9 // indirect github.com/google/go-cmp v0.7.0 // indirect - github.com/google/gofuzz v1.2.0 // indirect github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e // indirect github.com/google/uuid v1.6.0 // indirect - github.com/grafana/grafana-app-sdk/logging v0.35.1 // indirect + github.com/grafana/grafana-app-sdk/logging v0.38.2 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect @@ -49,9 +48,9 @@ require ( github.com/onsi/gomega v1.36.2 // indirect github.com/perimeterx/marshmallow v1.1.5 // indirect github.com/prometheus/client_golang v1.22.0 // indirect - github.com/prometheus/client_model v0.6.1 // indirect + github.com/prometheus/client_model v0.6.2 // indirect github.com/prometheus/common v0.63.0 // indirect - github.com/prometheus/procfs v0.16.0 // indirect + github.com/prometheus/procfs v0.16.1 // indirect github.com/puzpuzpuz/xsync/v2 v2.5.1 // indirect github.com/rogpeppe/go-internal v1.14.1 // indirect github.com/spf13/pflag v1.0.6 // indirect @@ -72,7 +71,6 @@ require ( golang.org/x/term v0.32.0 // indirect golang.org/x/text v0.25.0 // indirect golang.org/x/time v0.11.0 // indirect - golang.org/x/tools v0.33.0 // indirect gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237 // indirect @@ -80,8 +78,8 @@ require ( google.golang.org/protobuf v1.36.6 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect - k8s.io/api v0.32.3 // indirect - k8s.io/apiextensions-apiserver v0.32.3 // indirect + k8s.io/api v0.33.1 // indirect + k8s.io/apiextensions-apiserver v0.33.1 // indirect k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // indirect sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect sigs.k8s.io/randfill v1.0.0 // indirect diff --git a/apps/playlist/go.sum b/apps/playlist/go.sum index 758a61d457d..73a44c3f607 100644 --- a/apps/playlist/go.sum +++ b/apps/playlist/go.sum @@ -12,8 +12,8 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/emicklei/go-restful/v3 v3.11.0 h1:rAQeMHw1c7zTmncogyy8VvRZwtkmkZ4FxERmMY4rD+g= github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v5.9.11+incompatible h1:ixHHqfcGvxhWkniF1tWxBHA0yb4Z+d1UQi45df52xW8= +github.com/evanphx/json-patch v5.9.11+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/fxamacker/cbor/v2 v2.7.0 h1:iM5WgngdRBanHcxugY4JySA0nk1wZorNOpTgCMedv5E= github.com/fxamacker/cbor/v2 v2.7.0/go.mod h1:pxXPTn3joSm21Gbwsv0w9OSA2y1HFR9qXEeXQVeNoDQ= github.com/getkin/kin-openapi v0.132.0 h1:3ISeLMsQzcb5v26yeJrBcdTCEQTag36ZjaGk7MIRUwk= @@ -31,8 +31,8 @@ github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+Gr github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= -github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= -github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= +github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= +github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= @@ -43,16 +43,14 @@ github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= -github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e h1:ijClszYn+mADRFY17kjQEVQ1XRhq2/JR1M3sGqeJoxs= github.com/google/pprof v0.0.0-20250317173921-a4b03ec1a45e/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/grafana/grafana-app-sdk v0.35.1 h1:zEXubzsQrxGBOzXJJMBwhEClC/tvPi0sfK7NGmlX3RI= -github.com/grafana/grafana-app-sdk v0.35.1/go.mod h1:Zx5MkVppYK+ElSDUAR6+fjzOVo6I/cIgk+ty+LmNOxI= -github.com/grafana/grafana-app-sdk/logging v0.35.1 h1:taVpl+RoixTYl0JBJGhH+fPVmwA9wvdwdzJTZsv9buM= -github.com/grafana/grafana-app-sdk/logging v0.35.1/go.mod h1:Y/bvbDhBiV/tkIle9RW49pgfSPIPSON8Q4qjx3pyqDk= +github.com/grafana/grafana-app-sdk v0.38.2 h1:raQ1mqCmNJ2AyCSV3m6ehFC0TGVZcqRcM6iOIDT6ZIE= +github.com/grafana/grafana-app-sdk v0.38.2/go.mod h1:LhZ4i2IXGnW5FF/jAczX7SnGFNai7x2qwB8YHNZWiZI= +github.com/grafana/grafana-app-sdk/logging v0.38.2 h1:EdQTRxbbH72zdqJ09Z76zcSjfALJXkpPLgvKEPPnloc= +github.com/grafana/grafana-app-sdk/logging v0.38.2/go.mod h1:Y/bvbDhBiV/tkIle9RW49pgfSPIPSON8Q4qjx3pyqDk= github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo= github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -102,12 +100,12 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_golang v1.22.0 h1:rb93p9lokFEsctTys46VnV1kLCDpVZ0a/Y92Vm0Zc6Q= github.com/prometheus/client_golang v1.22.0/go.mod h1:R7ljNsLXhuQXYZYtw6GAE9AZg8Y7vEW5scdCXrWRXC0= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= github.com/prometheus/common v0.63.0 h1:YR/EIY1o3mEFP/kZCD7iDMnLPlGyuU2Gb3HIcXnA98k= github.com/prometheus/common v0.63.0/go.mod h1:VVFF/fBIoToEnWRVkYoXEkq3R3paCoxG9PXP74SnV18= -github.com/prometheus/procfs v0.16.0 h1:xh6oHhKwnOJKMYiYBDWmkHqQPyiY40sny36Cmx2bbsM= -github.com/prometheus/procfs v0.16.0/go.mod h1:8veyXUu3nGP7oaCxhX6yeaM5u4stL2FeMXnCqhDthZg= +github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= +github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= github.com/puzpuzpuz/xsync/v2 v2.5.1 h1:mVGYAvzDSu52+zaGyNjC+24Xw2bQi3kTr4QJ6N9pIIU= github.com/puzpuzpuz/xsync/v2 v2.5.1/go.mod h1:gD2H2krq/w52MfPLE+Uy64TzJDVY7lP2znR9qmR35kU= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= @@ -115,6 +113,8 @@ github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7 github.com/spf13/pflag v1.0.6 h1:jFzHGLGAlb3ruxLB8MhbI6A8+AQX/2eW4qeyNZXNp2o= github.com/spf13/pflag v1.0.6/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= @@ -206,14 +206,14 @@ gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -k8s.io/api v0.32.3 h1:Hw7KqxRusq+6QSplE3NYG4MBxZw1BZnq4aP4cJVINls= -k8s.io/api v0.32.3/go.mod h1:2wEDTXADtm/HA7CCMD8D8bK4yuBUptzaRhYcYEEYA3k= -k8s.io/apiextensions-apiserver v0.32.3 h1:4D8vy+9GWerlErCwVIbcQjsWunF9SUGNu7O7hiQTyPY= -k8s.io/apiextensions-apiserver v0.32.3/go.mod h1:8YwcvVRMVzw0r1Stc7XfGAzB/SIVLunqApySV5V7Dss= -k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= -k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= -k8s.io/client-go v0.32.3 h1:RKPVltzopkSgHS7aS98QdscAgtgah/+zmpAogooIqVU= -k8s.io/client-go v0.32.3/go.mod h1:3v0+3k4IcT9bXTc4V2rt+d2ZPPG700Xy6Oi0Gdl2PaY= +k8s.io/api v0.33.1 h1:tA6Cf3bHnLIrUK4IqEgb2v++/GYUtqiu9sRVk3iBXyw= +k8s.io/api v0.33.1/go.mod h1:87esjTn9DRSRTD4fWMXamiXxJhpOIREjWOSjsW1kEHw= +k8s.io/apiextensions-apiserver v0.33.1 h1:N7ccbSlRN6I2QBcXevB73PixX2dQNIW0ZRuguEE91zI= +k8s.io/apiextensions-apiserver v0.33.1/go.mod h1:uNQ52z1A1Gu75QSa+pFK5bcXc4hq7lpOXbweZgi4dqA= +k8s.io/apimachinery v0.33.1 h1:mzqXWV8tW9Rw4VeW9rEkqvnxj59k1ezDUl20tFK/oM4= +k8s.io/apimachinery v0.33.1/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= +k8s.io/client-go v0.33.1 h1:ZZV/Ks2g92cyxWkRRnfUDsnhNn28eFpt26aGc8KbXF4= +k8s.io/client-go v0.33.1/go.mod h1:JAsUrl1ArO7uRVFWfcj6kOomSlCv+JpvIsp6usAGefA= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4= diff --git a/apps/playlist/pkg/apis/playlist/v0alpha1/constants.go b/apps/playlist/pkg/apis/playlist/v0alpha1/constants.go index 3948d102966..ea5ccae1d63 100644 --- a/apps/playlist/pkg/apis/playlist/v0alpha1/constants.go +++ b/apps/playlist/pkg/apis/playlist/v0alpha1/constants.go @@ -3,16 +3,16 @@ package v0alpha1 import "k8s.io/apimachinery/pkg/runtime/schema" const ( - // Group is the API group used by all kinds in this package - Group = "playlist.grafana.app" - // Version is the API version used by all kinds in this package - Version = "v0alpha1" + // APIGroup is the API group used by all kinds in this package + APIGroup = "playlist.grafana.app" + // APIVersion is the API version used by all kinds in this package + APIVersion = "v0alpha1" ) var ( // GroupVersion is a schema.GroupVersion consisting of the Group and Version constants for this package GroupVersion = schema.GroupVersion{ - Group: Group, - Version: Version, + Group: APIGroup, + Version: APIVersion, } ) diff --git a/apps/playlist/pkg/apis/playlist/v0alpha1/playlist_metadata_gen.go b/apps/playlist/pkg/apis/playlist/v0alpha1/playlist_metadata_gen.go index 1858b2081cc..b9577db0559 100644 --- a/apps/playlist/pkg/apis/playlist/v0alpha1/playlist_metadata_gen.go +++ b/apps/playlist/pkg/apis/playlist/v0alpha1/playlist_metadata_gen.go @@ -24,5 +24,8 @@ type PlaylistMetadata struct { // NewPlaylistMetadata creates a new PlaylistMetadata object. func NewPlaylistMetadata() *PlaylistMetadata { - return &PlaylistMetadata{} + return &PlaylistMetadata{ + Finalizers: []string{}, + Labels: map[string]string{}, + } } diff --git a/apps/playlist/pkg/apis/playlist/v0alpha1/playlist_object_gen.go b/apps/playlist/pkg/apis/playlist/v0alpha1/playlist_object_gen.go index 5e6f1ff8224..d4c603b3531 100644 --- a/apps/playlist/pkg/apis/playlist/v0alpha1/playlist_object_gen.go +++ b/apps/playlist/pkg/apis/playlist/v0alpha1/playlist_object_gen.go @@ -18,8 +18,11 @@ import ( type Playlist struct { metav1.TypeMeta `json:",inline" yaml:",inline"` metav1.ObjectMeta `json:"metadata" yaml:"metadata"` - Spec PlaylistSpec `json:"spec" yaml:"spec"` - PlaylistStatus PlaylistStatus `json:"status" yaml:"status"` + + // Spec is the spec of the Playlist + Spec PlaylistSpec `json:"spec" yaml:"spec"` + + Status PlaylistStatus `json:"status" yaml:"status"` } func (o *Playlist) GetSpec() any { @@ -37,14 +40,14 @@ func (o *Playlist) SetSpec(spec any) error { func (o *Playlist) GetSubresources() map[string]any { return map[string]any{ - "status": o.PlaylistStatus, + "status": o.Status, } } func (o *Playlist) GetSubresource(name string) (any, bool) { switch name { case "status": - return o.PlaylistStatus, true + return o.Status, true default: return nil, false } @@ -57,7 +60,7 @@ func (o *Playlist) SetSubresource(name string, value any) error { if !ok { return fmt.Errorf("cannot set status type %#v, not of type PlaylistStatus", value) } - o.PlaylistStatus = cast + o.Status = cast return nil default: return fmt.Errorf("subresource '%s' does not exist", name) @@ -219,6 +222,20 @@ func (o *Playlist) DeepCopyObject() runtime.Object { return o.Copy() } +func (o *Playlist) DeepCopy() *Playlist { + cpy := &Playlist{} + o.DeepCopyInto(cpy) + return cpy +} + +func (o *Playlist) DeepCopyInto(dst *Playlist) { + dst.TypeMeta.APIVersion = o.TypeMeta.APIVersion + dst.TypeMeta.Kind = o.TypeMeta.Kind + o.ObjectMeta.DeepCopyInto(&dst.ObjectMeta) + o.Spec.DeepCopyInto(&dst.Spec) + o.Status.DeepCopyInto(&dst.Status) +} + // Interface compliance compile-time check var _ resource.Object = &Playlist{} @@ -262,5 +279,41 @@ func (o *PlaylistList) SetItems(items []resource.Object) { } } +func (o *PlaylistList) DeepCopy() *PlaylistList { + cpy := &PlaylistList{} + o.DeepCopyInto(cpy) + return cpy +} + +func (o *PlaylistList) DeepCopyInto(dst *PlaylistList) { + resource.CopyObjectInto(dst, o) +} + // Interface compliance compile-time check var _ resource.ListObject = &PlaylistList{} + +// Copy methods for all subresource types + +// DeepCopy creates a full deep copy of Spec +func (s *PlaylistSpec) DeepCopy() *PlaylistSpec { + cpy := &PlaylistSpec{} + s.DeepCopyInto(cpy) + return cpy +} + +// DeepCopyInto deep copies Spec into another Spec object +func (s *PlaylistSpec) DeepCopyInto(dst *PlaylistSpec) { + resource.CopyObjectInto(dst, s) +} + +// DeepCopy creates a full deep copy of PlaylistStatus +func (s *PlaylistStatus) DeepCopy() *PlaylistStatus { + cpy := &PlaylistStatus{} + s.DeepCopyInto(cpy) + return cpy +} + +// DeepCopyInto deep copies PlaylistStatus into another PlaylistStatus object +func (s *PlaylistStatus) DeepCopyInto(dst *PlaylistStatus) { + resource.CopyObjectInto(dst, s) +} diff --git a/apps/playlist/pkg/apis/playlist/v0alpha1/playlist_spec_gen.go b/apps/playlist/pkg/apis/playlist/v0alpha1/playlist_spec_gen.go index 280d7da6aee..8bcdaf08b83 100644 --- a/apps/playlist/pkg/apis/playlist/v0alpha1/playlist_spec_gen.go +++ b/apps/playlist/pkg/apis/playlist/v0alpha1/playlist_spec_gen.go @@ -30,7 +30,9 @@ type PlaylistSpec struct { // NewPlaylistSpec creates a new PlaylistSpec object. func NewPlaylistSpec() *PlaylistSpec { - return &PlaylistSpec{} + return &PlaylistSpec{ + Items: []PlaylistItem{}, + } } // +k8s:openapi-gen=true diff --git a/apps/playlist/pkg/apis/playlist/v0alpha1/zz_openapi_gen.go b/apps/playlist/pkg/apis/playlist/v0alpha1/zz_openapi_gen.go index 48df277c032..8dba9b173b6 100644 --- a/apps/playlist/pkg/apis/playlist/v0alpha1/zz_openapi_gen.go +++ b/apps/playlist/pkg/apis/playlist/v0alpha1/zz_openapi_gen.go @@ -49,8 +49,9 @@ func schema_pkg_apis_playlist_v0alpha1_Playlist(ref common.ReferenceCallback) co }, "spec": { SchemaProps: spec.SchemaProps{ - Default: map[string]interface{}{}, - Ref: ref("github.com/grafana/grafana/apps/playlist/pkg/apis/playlist/v0alpha1.PlaylistSpec"), + Description: "Spec is the spec of the Playlist", + Default: map[string]interface{}{}, + Ref: ref("github.com/grafana/grafana/apps/playlist/pkg/apis/playlist/v0alpha1.PlaylistSpec"), }, }, "status": { diff --git a/apps/playlist/pkg/apis/playlist_manifest.go b/apps/playlist/pkg/apis/playlist_manifest.go index 369f30a62fd..7973fdf4e6d 100644 --- a/apps/playlist/pkg/apis/playlist_manifest.go +++ b/apps/playlist/pkg/apis/playlist_manifest.go @@ -6,15 +6,12 @@ package apis import ( - "encoding/json" + "fmt" "github.com/grafana/grafana-app-sdk/app" -) + "github.com/grafana/grafana-app-sdk/resource" -var ( - rawSchemaPlaylistv0alpha1 = []byte(`{"spec":{"properties":{"interval":{"type":"string"},"items":{"items":{"properties":{"type":{"description":"type of the item.","enum":["dashboard_by_tag","dashboard_by_uid","dashboard_by_id"],"type":"string"},"value":{"description":"Value depends on type and describes the playlist item.\n - dashboard_by_id: The value is an internal numerical identifier set by Grafana. This\n is not portable as the numerical identifier is non-deterministic between different instances.\n Will be replaced by dashboard_by_uid in the future. (deprecated)\n - dashboard_by_tag: The value is a tag which is set on any number of dashboards. All\n dashboards behind the tag will be added to the playlist.\n - dashboard_by_uid: The value is the dashboard UID","type":"string"}},"required":["type","value"],"type":"object"},"type":"array"},"title":{"type":"string"}},"required":["title","interval","items"],"type":"object"},"status":{"properties":{"additionalFields":{"description":"additionalFields is reserved for future use","type":"object","x-kubernetes-preserve-unknown-fields":true},"operatorStates":{"additionalProperties":{"properties":{"descriptiveState":{"description":"descriptiveState is an optional more descriptive state field which has no requirements on format","type":"string"},"details":{"description":"details contains any extra information that is operator-specific","type":"object","x-kubernetes-preserve-unknown-fields":true},"lastEvaluation":{"description":"lastEvaluation is the ResourceVersion last evaluated","type":"string"},"state":{"description":"state describes the state of the lastEvaluation.\nIt is limited to three possible states for machine evaluation.","enum":["success","in_progress","failed"],"type":"string"}},"required":["lastEvaluation","state"],"type":"object"},"description":"operatorStates is a map of operator ID to operator state evaluations.\nAny operator which consumes this kind SHOULD add its state evaluation information to this field.","type":"object"}},"type":"object","x-kubernetes-preserve-unknown-fields":true}}`) - versionSchemaPlaylistv0alpha1 app.VersionSchema - _ = json.Unmarshal(rawSchemaPlaylistv0alpha1, &versionSchemaPlaylistv0alpha1) + v0alpha1 "github.com/grafana/grafana/apps/playlist/pkg/apis/playlist/v0alpha1" ) var appManifestData = app.ManifestData{ @@ -42,19 +39,12 @@ var appManifestData = app.ManifestData{ }, }, }, - Schema: &versionSchemaPlaylistv0alpha1, }, }, }, }, } -func jsonToMap(j string) map[string]any { - m := make(map[string]any) - json.Unmarshal([]byte(j), &j) - return m -} - func LocalManifest() app.Manifest { return app.NewEmbeddedManifest(appManifestData) } @@ -62,3 +52,14 @@ func LocalManifest() app.Manifest { func RemoteManifest() app.Manifest { return app.NewAPIServerManifest("playlist") } + +var kindVersionToGoType = map[string]resource.Kind{ + "Playlist/v0alpha1": v0alpha1.PlaylistKind(), +} + +// ManifestGoTypeAssociator returns the associated resource.Kind instance for a given Kind and Version, if one exists. +// If there is no association for the provided Kind and Version, exists will return false. +func ManifestGoTypeAssociator(kind, version string) (goType resource.Kind, exists bool) { + goType, exists = kindVersionToGoType[fmt.Sprintf("%s/%s", kind, version)] + return goType, exists +} diff --git a/conf/defaults.ini b/conf/defaults.ini index 7221a9e7e79..44ce0971d7b 100644 --- a/conf/defaults.ini +++ b/conf/defaults.ini @@ -812,6 +812,7 @@ client_id = some_client_id client_secret = managed_identity_client_id = federated_credential_audience = +workload_identity_token_file = /var/run/secrets/azure/tokens/azure-identity-token scopes = openid email profile auth_url = https://login.microsoftonline.com//oauth2/v2.0/authorize token_url = https://login.microsoftonline.com//oauth2/v2.0/token @@ -1538,23 +1539,13 @@ max_annotations_to_keep = rule_query_offset = 1m [recording_rules] -# Enable recording rules. You must provide write credentials below. -enabled = false - -# Target URL (including write path) for recording rules. -url = - -# Optional username for basic authentication on recording rule write requests. Can be left blank to disable basic auth -basic_auth_username = - -# Optional assword for basic authentication on recording rule write requests. Can be left blank. -basic_auth_password = +# Enable recording rules. +enabled = true # Request timeout for recording rule writes. timeout = 10s # Default data source UID to write to if not specified in the rule definition. -# Only has effect if the grafanaManagedRecordingRulesDatasources feature toggle is enabled. default_datasource_uid = # Optional custom headers to include in recording rule write requests. @@ -1841,7 +1832,7 @@ forward_host_env_vars = preinstall = # Comma separated list of plugin ids to install before the startup process # These will be installed before starting Grafana. Useful when used with provisioning. -preinstall_sync = +preinstall_sync = # Disables preinstall feature. It has the same effect as setting preinstall to an empty list. preinstall_disabled = false # Update strategy for plugins. diff --git a/conf/sample.ini b/conf/sample.ini index 4200522661e..af873ea3213 100644 --- a/conf/sample.ini +++ b/conf/sample.ini @@ -787,6 +787,7 @@ ;client_secret = some_client_secret ;managed_identity_client_id = ;federated_credential_audience = +;workload_identity_token_file = ;scopes = openid email profile ;auth_url = https://login.microsoftonline.com//oauth2/v2.0/authorize ;token_url = https://login.microsoftonline.com//oauth2/v2.0/token @@ -1517,23 +1518,13 @@ rule_query_offset = 1m #################################### Recording Rules ##################### [recording_rules] -# Enable recording rules. You must provide write credentials below. -enabled = false - -# Target URL (including write path) for recording rules. -url = - -# Optional username for basic authentication on recording rule write requests. Can be left blank to disable basic auth -basic_auth_username = - -# Optional assword for basic authentication on recording rule write requests. Can be left blank. -basic_auth_password = +# Enable recording rules. +enabled = true # Request timeout for recording rule writes. timeout = 30s # Default data source UID to write to if not specified in the rule definition. -# Only has effect if the grafanaManagedRecordingRulesDatasources feature toggle is enabled. default_datasource_uid = # Optional custom headers to include in recording rule write requests. @@ -1787,7 +1778,7 @@ default_datasource_uid = ; preinstall = # Comma separated list of plugin ids to install before the startup process # These will be installed before starting Grafana. Useful when used with provisioning. -; preinstall_sync = +; preinstall_sync = # Disables preinstall feature. It has the same effect as setting preinstall to an empty list. ; preinstall_disabled = false diff --git a/contribute/merge-pull-request.md b/contribute/merge-pull-request.md index 0e60768892f..6636daded45 100644 --- a/contribute/merge-pull-request.md +++ b/contribute/merge-pull-request.md @@ -118,9 +118,9 @@ In case the pull request introduces a breaking change you should document this. Backporting is the process of copying the pull request into the version branch of one or multiple previous releases. -Backporting is a rare exception, should only be done for _critical bug fixes_, and involves the intervention of a Grafana Labs employee. +Backporting should be a rare exception, reserved only for critical bug fixes, and must be initiated by a Grafana Labs employee. We generally avoid automatic backports, as these changes carry some risk: they typically receive less manual testing than changes included in regular point releases. -If your pull request fixes a critical bug and needs to be backported, add it to the "Critical Bug Release" form so the team can approve the backport and know that a release needs to be made. Specify the correct `backport vx.x` labels for the releases to which the fix needs to be backported. Once approved, the backporting process continues. +If a pull request addresses a critical bug and backporting is warranted, a Grafana Labs team member can apply the appropriate `backport vx.x` labels for the relevant release branches. The team will review and approve the backport before proceeding. When the pull request is merged, seperate backport PRs will automatically be creataed. #### Required labels diff --git a/devenv/docker/blocks/collectd/Dockerfile b/devenv/docker/blocks/collectd/Dockerfile index 00762cd0149..13768c86c04 100644 --- a/devenv/docker/blocks/collectd/Dockerfile +++ b/devenv/docker/blocks/collectd/Dockerfile @@ -1,16 +1,19 @@ -FROM ubuntu:xenial +FROM ubuntu:jammy ENV DEBIAN_FRONTEND=noninteractive RUN apt-get -y update -RUN apt-get -y install collectd curl python-pip +RUN apt-get -y install collectd curl python3-pip # add a fake mtab for host disk stats ADD etc_mtab /etc/mtab ADD collectd.conf.tpl /etc/collectd/collectd.conf.tpl -RUN pip install --no-cache-dir envtpl +# Install Python packages +ADD requirements.txt /tmp/requirements.txt +RUN pip3 install --require-hashes --no-cache-dir -r /tmp/requirements.txt + ADD start_container /usr/bin/start_container RUN chmod +x /usr/bin/start_container CMD start_container diff --git a/devenv/docker/blocks/collectd/requirements.txt b/devenv/docker/blocks/collectd/requirements.txt new file mode 100644 index 00000000000..7a77b9a89aa --- /dev/null +++ b/devenv/docker/blocks/collectd/requirements.txt @@ -0,0 +1,6 @@ +envtpl==0.7.0 \ + --hash=sha256:cfc5bec6c554fa2b1578980f4c2931dd0db128f14f5a7f4c91c3280167e30cf9 +Jinja2==3.1.6 \ + --hash=sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d +MarkupSafe==2.1.5 \ + --hash=sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b \ No newline at end of file diff --git a/devenv/docker/blocks/graphite09/Dockerfile b/devenv/docker/blocks/graphite09/Dockerfile deleted file mode 100644 index 9b78dfa7f8f..00000000000 --- a/devenv/docker/blocks/graphite09/Dockerfile +++ /dev/null @@ -1,53 +0,0 @@ -from ubuntu:14.04 - -run apt-get -y update - -run apt-get -y install libcairo2-dev libffi-dev pkg-config python-dev python-pip fontconfig apache2 libapache2-mod-wsgi git-core collectd memcached gcc g++ make supervisor nginx-light gunicorn - -run cd /usr/local/src && git clone https://github.com/graphite-project/graphite-web.git -run cd /usr/local/src && git clone https://github.com/graphite-project/carbon.git -run cd /usr/local/src && git clone https://github.com/graphite-project/whisper.git - -run pip install twisted==13.2.0 && pip install sphinx==1.5.2 && pip install cairocffi==0.9.0 -run cd /usr/local/src/whisper && git checkout master && python setup.py install -run cd /usr/local/src/carbon && git checkout 0.9.x && pip install -r requirements.txt && python setup.py install -run cd /usr/local/src/graphite-web && git checkout 0.9.x && pip install -r requirements.txt && python check-dependencies.py && python setup.py install - -# Add graphite config -add ./files/initial_data.json /opt/graphite/webapp/graphite/initial_data.json -add ./files/local_settings.py /opt/graphite/webapp/graphite/local_settings.py -add ./files/carbon.conf /opt/graphite/conf/carbon.conf -add ./files/storage-schemas.conf /opt/graphite/conf/storage-schemas.conf -add ./files/storage-aggregation.conf /opt/graphite/conf/storage-aggregation.conf -add ./files/events_views.py /opt/graphite/webapp/graphite/events/views.py - -run mkdir -p /opt/graphite/storage/whisper -run touch /opt/graphite/storage/graphite.db /opt/graphite/storage/index -run chown -R www-data /opt/graphite/storage -run chmod 0775 /opt/graphite/storage /opt/graphite/storage/whisper -run chmod 0664 /opt/graphite/storage/graphite.db -run cd /opt/graphite/webapp/graphite && python manage.py syncdb --noinput - -add ./files/my_htpasswd /etc/nginx/.htpasswd - -# Add system service config -add ./files/nginx.conf /etc/nginx/nginx.conf -add ./files/supervisord.conf /etc/supervisor/conf.d/supervisord.conf - -# Nginx -# -# graphite -expose 80 - -# Carbon line receiver port -expose 2003 - -# Carbon cache query port -expose 7002 - -VOLUME ["/opt/graphite/storage/whisper"] -VOLUME ["/var/lib/log/supervisor"] - -cmd ["/usr/bin/supervisord"] - -# vim:ts=8:noet: diff --git a/devenv/docker/blocks/graphite09/docker-compose.yaml b/devenv/docker/blocks/graphite09/docker-compose.yaml deleted file mode 100644 index abeb8183168..00000000000 --- a/devenv/docker/blocks/graphite09/docker-compose.yaml +++ /dev/null @@ -1,16 +0,0 @@ - graphite09: - build: docker/blocks/graphite09 - ports: - - "8380:80" - - "2303:2003" - - "2304:2004" - volumes: - - /etc/localtime:/etc/localtime:ro - - /etc/timezone:/etc/timezone:ro - - fake-graphite09-data: - image: grafana/fake-data-gen - environment: - FD_DATASOURCE: graphite - FD_PORT: 2303 - FD_GRAPHITE_VERSION: 0.9 diff --git a/devenv/docker/blocks/graphite09/files/carbon.conf b/devenv/docker/blocks/graphite09/files/carbon.conf deleted file mode 100644 index fc03aba6398..00000000000 --- a/devenv/docker/blocks/graphite09/files/carbon.conf +++ /dev/null @@ -1,76 +0,0 @@ -[cache] -LOCAL_DATA_DIR = /opt/graphite/storage/whisper/ - -# Specify the user to drop privileges to -# If this is blank carbon runs as the user that invokes it -# This user must have write access to the local data directory -USER = - -# Limit the size of the cache to avoid swapping or becoming CPU bound. -# Sorts and serving cache queries gets more expensive as the cache grows. -# Use the value "inf" (infinity) for an unlimited cache size. -MAX_CACHE_SIZE = inf - -# Limits the number of whisper update_many() calls per second, which effectively -# means the number of write requests sent to the disk. This is intended to -# prevent over-utilizing the disk and thus starving the rest of the system. -# When the rate of required updates exceeds this, then carbon's caching will -# take effect and increase the overall throughput accordingly. -MAX_UPDATES_PER_SECOND = 1000 - -# Softly limits the number of whisper files that get created each minute. -# Setting this value low (like at 50) is a good way to ensure your graphite -# system will not be adversely impacted when a bunch of new metrics are -# sent to it. The trade off is that it will take much longer for those metrics' -# database files to all get created and thus longer until the data becomes usable. -# Setting this value high (like "inf" for infinity) will cause graphite to create -# the files quickly but at the risk of slowing I/O down considerably for a while. -MAX_CREATES_PER_MINUTE = inf - -LINE_RECEIVER_INTERFACE = 0.0.0.0 -LINE_RECEIVER_PORT = 2003 - -PICKLE_RECEIVER_INTERFACE = 0.0.0.0 -PICKLE_RECEIVER_PORT = 2004 - -CACHE_QUERY_INTERFACE = 0.0.0.0 -CACHE_QUERY_PORT = 7002 - -LOG_UPDATES = False - -# Enable AMQP if you want to receive metrics using an amqp broker -# ENABLE_AMQP = False - -# Verbose means a line will be logged for every metric received -# useful for testing -# AMQP_VERBOSE = False - -# AMQP_HOST = localhost -# AMQP_PORT = 5672 -# AMQP_VHOST = / -# AMQP_USER = guest -# AMQP_PASSWORD = guest -# AMQP_EXCHANGE = graphite - -# Patterns for all of the metrics this machine will store. Read more at -# http://en.wikipedia.org/wiki/Advanced_Message_Queuing_Protocol#Bindings -# -# Example: store all sales, linux servers, and utilization metrics -# BIND_PATTERNS = sales.#, servers.linux.#, #.utilization -# -# Example: store everything -# BIND_PATTERNS = # - -# NOTE: you cannot run both a cache and a relay on the same server -# with the default configuration, you have to specify a distinict -# interfaces and ports for the listeners. - -[relay] -LINE_RECEIVER_INTERFACE = 0.0.0.0 -LINE_RECEIVER_PORT = 2003 - -PICKLE_RECEIVER_INTERFACE = 0.0.0.0 -PICKLE_RECEIVER_PORT = 2004 - -CACHE_SERVERS = server1, server2, server3 -MAX_QUEUE_SIZE = 10000 diff --git a/devenv/docker/blocks/graphite09/files/events_views.py b/devenv/docker/blocks/graphite09/files/events_views.py deleted file mode 100644 index 6c12987af3c..00000000000 --- a/devenv/docker/blocks/graphite09/files/events_views.py +++ /dev/null @@ -1,102 +0,0 @@ -import datetime -import time - -from django.utils.timezone import get_current_timezone -from django.core.urlresolvers import get_script_prefix -from django.http import HttpResponse -from django.shortcuts import render_to_response, get_object_or_404 -from pytz import timezone - -from graphite.util import json -from graphite.events import models -from graphite.render.attime import parseATTime - - -def to_timestamp(dt): - return time.mktime(dt.timetuple()) - - -class EventEncoder(json.JSONEncoder): - def default(self, obj): - if isinstance(obj, datetime.datetime): - return to_timestamp(obj) - return json.JSONEncoder.default(self, obj) - - -def view_events(request): - if request.method == "GET": - context = { 'events' : fetch(request), - 'slash' : get_script_prefix() - } - return render_to_response("events.html", context) - else: - return post_event(request) - -def detail(request, event_id): - e = get_object_or_404(models.Event, pk=event_id) - context = { 'event' : e, - 'slash' : get_script_prefix() - } - return render_to_response("event.html", context) - - -def post_event(request): - if request.method == 'POST': - event = json.loads(request.body) - assert isinstance(event, dict) - - values = {} - values["what"] = event["what"] - values["tags"] = event.get("tags", None) - values["when"] = datetime.datetime.fromtimestamp( - event.get("when", time.time())) - if "data" in event: - values["data"] = event["data"] - - e = models.Event(**values) - e.save() - - return HttpResponse(status=200) - else: - return HttpResponse(status=405) - -def get_data(request): - if 'jsonp' in request.REQUEST: - response = HttpResponse( - "%s(%s)" % (request.REQUEST.get('jsonp'), - json.dumps(fetch(request), cls=EventEncoder)), - mimetype='text/javascript') - else: - response = HttpResponse( - json.dumps(fetch(request), cls=EventEncoder), - mimetype="application/json") - return response - -def fetch(request): - #XXX we need to move to USE_TZ=True to get rid of naive-time conversions - def make_naive(dt): - if 'tz' in request.GET: - tz = timezone(request.GET['tz']) - else: - tz = get_current_timezone() - local_dt = dt.astimezone(tz) - if hasattr(local_dt, 'normalize'): - local_dt = local_dt.normalize() - return local_dt.replace(tzinfo=None) - - if request.GET.get("from", None) is not None: - time_from = make_naive(parseATTime(request.GET["from"])) - else: - time_from = datetime.datetime.fromtimestamp(0) - - if request.GET.get("until", None) is not None: - time_until = make_naive(parseATTime(request.GET["until"])) - else: - time_until = datetime.datetime.now() - - tags = request.GET.get("tags", None) - if tags is not None: - tags = request.GET.get("tags").split(" ") - - return [x.as_dict() for x in - models.Event.find_events(time_from, time_until, tags=tags)] diff --git a/devenv/docker/blocks/graphite09/files/initial_data.json b/devenv/docker/blocks/graphite09/files/initial_data.json deleted file mode 100644 index b3ac9b1ebb0..00000000000 --- a/devenv/docker/blocks/graphite09/files/initial_data.json +++ /dev/null @@ -1,20 +0,0 @@ -[ - { - "pk": 1, - "model": "auth.user", - "fields": { - "username": "admin", - "first_name": "", - "last_name": "", - "is_active": true, - "is_superuser": true, - "is_staff": true, - "last_login": "2011-09-20 17:02:14", - "groups": [], - "user_permissions": [], - "password": "sha1$1b11b$edeb0a67a9622f1f2cfeabf9188a711f5ac7d236", - "email": "root@example.com", - "date_joined": "2011-09-20 17:02:14" - } - } -] diff --git a/devenv/docker/blocks/graphite09/files/local_settings.py b/devenv/docker/blocks/graphite09/files/local_settings.py deleted file mode 100644 index 177d674e9dd..00000000000 --- a/devenv/docker/blocks/graphite09/files/local_settings.py +++ /dev/null @@ -1,42 +0,0 @@ -# Edit this file to override the default graphite settings, do not edit settings.py - -# Turn on debugging and restart apache if you ever see an "Internal Server Error" page -#DEBUG = True - -# Set your local timezone (django will try to figure this out automatically) -TIME_ZONE = 'UTC' - -# Setting MEMCACHE_HOSTS to be empty will turn off use of memcached entirely -#MEMCACHE_HOSTS = ['127.0.0.1:11211'] - -# Sometimes you need to do a lot of rendering work but cannot share your storage mount -#REMOTE_RENDERING = True -#RENDERING_HOSTS = ['fastserver01','fastserver02'] -#LOG_RENDERING_PERFORMANCE = True -#LOG_CACHE_PERFORMANCE = True - -# If you've got more than one backend server they should all be listed here -#CLUSTER_SERVERS = [] - -# Override this if you need to provide documentation specific to your graphite deployment -#DOCUMENTATION_URL = "http://wiki.mycompany.com/graphite" - -# Enable email-related features -#SMTP_SERVER = "mail.mycompany.com" - -# LDAP / ActiveDirectory authentication setup -#USE_LDAP_AUTH = True -#LDAP_SERVER = "ldap.mycompany.com" -#LDAP_PORT = 389 -#LDAP_SEARCH_BASE = "OU=users,DC=mycompany,DC=com" -#LDAP_BASE_USER = "CN=some_readonly_account,DC=mycompany,DC=com" -#LDAP_BASE_PASS = "readonly_account_password" -#LDAP_USER_QUERY = "(username=%s)" #For Active Directory use "(sAMAccountName=%s)" - -# If sqlite won't cut it, configure your real database here (don't forget to run manage.py syncdb!) -#DATABASE_ENGINE = 'mysql' # or 'postgres' -#DATABASE_NAME = 'graphite' -#DATABASE_USER = 'graphite' -#DATABASE_PASSWORD = 'graphite-is-awesome' -#DATABASE_HOST = 'mysql.mycompany.com' -#DATABASE_PORT = '3306' diff --git a/devenv/docker/blocks/graphite09/files/my_htpasswd b/devenv/docker/blocks/graphite09/files/my_htpasswd deleted file mode 100644 index 52a72d01b4c..00000000000 --- a/devenv/docker/blocks/graphite09/files/my_htpasswd +++ /dev/null @@ -1 +0,0 @@ -grafana:$apr1$4R/20xhC$8t37jPP5dbcLr48btdkU// diff --git a/devenv/docker/blocks/graphite09/files/nginx.conf b/devenv/docker/blocks/graphite09/files/nginx.conf deleted file mode 100644 index 5b5c562ce9d..00000000000 --- a/devenv/docker/blocks/graphite09/files/nginx.conf +++ /dev/null @@ -1,70 +0,0 @@ -daemon off; -user www-data; -worker_processes 1; -pid /var/run/nginx.pid; - -events { - worker_connections 1024; -} - -http { - sendfile on; - tcp_nopush on; - tcp_nodelay on; - keepalive_timeout 65; - types_hash_max_size 2048; - server_tokens off; - - server_names_hash_bucket_size 32; - - include /etc/nginx/mime.types; - default_type application/octet-stream; - - access_log /var/log/nginx/access.log; - error_log /var/log/nginx/error.log; - - gzip on; - gzip_disable "msie6"; - - server { - listen 80 default_server; - server_name _; - - open_log_file_cache max=1000 inactive=20s min_uses=2 valid=1m; - - location / { - proxy_pass http://127.0.0.1:8000; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header X-Forwarded-Server $host; - proxy_set_header X-Forwarded-Host $host; - proxy_set_header Host $host; - - client_max_body_size 10m; - client_body_buffer_size 128k; - - proxy_connect_timeout 90; - proxy_send_timeout 90; - proxy_read_timeout 90; - - proxy_buffer_size 4k; - proxy_buffers 4 32k; - proxy_busy_buffers_size 64k; - proxy_temp_file_write_size 64k; - } - - add_header Access-Control-Allow-Origin "*"; - add_header Access-Control-Allow-Methods "GET, OPTIONS"; - add_header Access-Control-Allow-Headers "origin, authorization, accept"; - - location /content { - alias /opt/graphite/webapp/content; - - } - - location /media { - alias /usr/share/pyshared/django/contrib/admin/media; - } - } -} diff --git a/devenv/docker/blocks/graphite09/files/statsd_config.js b/devenv/docker/blocks/graphite09/files/statsd_config.js deleted file mode 100644 index a03003dcd79..00000000000 --- a/devenv/docker/blocks/graphite09/files/statsd_config.js +++ /dev/null @@ -1,8 +0,0 @@ -{ - graphitePort: 2003, - graphiteHost: "127.0.0.1", - port: 8125, - mgmt_port: 8126, - backends: ['./backends/graphite'], - debug: true -} diff --git a/devenv/docker/blocks/graphite09/files/storage-aggregation.conf b/devenv/docker/blocks/graphite09/files/storage-aggregation.conf deleted file mode 100644 index 5c4bc19fde1..00000000000 --- a/devenv/docker/blocks/graphite09/files/storage-aggregation.conf +++ /dev/null @@ -1,19 +0,0 @@ -[min] -pattern = \.min$ -xFilesFactor = 0.1 -aggregationMethod = min - -[max] -pattern = \.max$ -xFilesFactor = 0.1 -aggregationMethod = max - -[sum] -pattern = \.count$ -xFilesFactor = 0 -aggregationMethod = sum - -[default_average] -pattern = .* -xFilesFactor = 0.5 -aggregationMethod = average diff --git a/devenv/docker/blocks/graphite09/files/storage-schemas.conf b/devenv/docker/blocks/graphite09/files/storage-schemas.conf deleted file mode 100644 index 7e28d3a6649..00000000000 --- a/devenv/docker/blocks/graphite09/files/storage-schemas.conf +++ /dev/null @@ -1,16 +0,0 @@ -[carbon] -pattern = ^carbon\..* -retentions = 1m:31d,10m:1y,1h:5y - -[highres] -pattern = ^highres.* -retentions = 1s:1d,1m:7d - -[statsd] -pattern = ^statsd.* -retentions = 1m:7d,10m:1y - -[default] -pattern = .* -retentions = 10s:1d,1m:7d,10m:1y - diff --git a/devenv/docker/blocks/graphite09/files/supervisord.conf b/devenv/docker/blocks/graphite09/files/supervisord.conf deleted file mode 100644 index c9812bb16dc..00000000000 --- a/devenv/docker/blocks/graphite09/files/supervisord.conf +++ /dev/null @@ -1,26 +0,0 @@ -[supervisord] -nodaemon = true -environment = GRAPHITE_STORAGE_DIR='/opt/graphite/storage',GRAPHITE_CONF_DIR='/opt/graphite/conf' - -[program:nginx] -command = /usr/sbin/nginx -stdout_logfile = /var/log/supervisor/%(program_name)s.log -stderr_logfile = /var/log/supervisor/%(program_name)s.log -autorestart = true - -[program:carbon-cache] -;user = www-data -command = /opt/graphite/bin/carbon-cache.py --debug start -stdout_logfile = /var/log/supervisor/%(program_name)s.log -stderr_logfile = /var/log/supervisor/%(program_name)s.log -autorestart = true - -[program:graphite-webapp] -;user = www-data -directory = /opt/graphite/webapp -environment = PYTHONPATH='/opt/graphite/webapp' -command = /usr/bin/gunicorn_django -b127.0.0.1:8000 -w2 graphite/settings.py -stdout_logfile = /var/log/supervisor/%(program_name)s.log -stderr_logfile = /var/log/supervisor/%(program_name)s.log -autorestart = true - diff --git a/devenv/docker/blocks/prometheus_high_card/go.mod b/devenv/docker/blocks/prometheus_high_card/go.mod index 4d973b48a12..6706105c5cc 100644 --- a/devenv/docker/blocks/prometheus_high_card/go.mod +++ b/devenv/docker/blocks/prometheus_high_card/go.mod @@ -12,7 +12,7 @@ require ( github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_model v0.6.1 // indirect github.com/prometheus/common v0.62.0 // indirect - github.com/prometheus/procfs v0.16.0 // indirect + github.com/prometheus/procfs v0.16.1 // indirect golang.org/x/sys v0.33.0 // indirect google.golang.org/protobuf v1.36.6 // indirect ) diff --git a/devenv/docker/blocks/prometheus_high_card/go.sum b/devenv/docker/blocks/prometheus_high_card/go.sum index 4e59e8a6b04..ebbd18eaeef 100644 --- a/devenv/docker/blocks/prometheus_high_card/go.sum +++ b/devenv/docker/blocks/prometheus_high_card/go.sum @@ -20,8 +20,8 @@ github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= -github.com/prometheus/procfs v0.16.0 h1:xh6oHhKwnOJKMYiYBDWmkHqQPyiY40sny36Cmx2bbsM= -github.com/prometheus/procfs v0.16.0/go.mod h1:8veyXUu3nGP7oaCxhX6yeaM5u4stL2FeMXnCqhDthZg= +github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= +github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= diff --git a/devenv/docker/blocks/prometheus_utf8/go.mod b/devenv/docker/blocks/prometheus_utf8/go.mod index b99dd43d67a..8e05b29a4ff 100644 --- a/devenv/docker/blocks/prometheus_utf8/go.mod +++ b/devenv/docker/blocks/prometheus_utf8/go.mod @@ -14,7 +14,7 @@ require ( github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_model v0.6.1 // indirect - github.com/prometheus/procfs v0.16.0 // indirect + github.com/prometheus/procfs v0.16.1 // indirect golang.org/x/sys v0.33.0 // indirect google.golang.org/protobuf v1.36.6 // indirect ) diff --git a/devenv/docker/blocks/prometheus_utf8/go.sum b/devenv/docker/blocks/prometheus_utf8/go.sum index 4e59e8a6b04..ebbd18eaeef 100644 --- a/devenv/docker/blocks/prometheus_utf8/go.sum +++ b/devenv/docker/blocks/prometheus_utf8/go.sum @@ -20,8 +20,8 @@ github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= github.com/prometheus/common v0.62.0 h1:xasJaQlnWAeyHdUBeGjXmutelfJHWMRr+Fg4QszZ2Io= github.com/prometheus/common v0.62.0/go.mod h1:vyBcEuLSvWos9B1+CyL7JZ2up+uFzXhkqml0W5zIY1I= -github.com/prometheus/procfs v0.16.0 h1:xh6oHhKwnOJKMYiYBDWmkHqQPyiY40sny36Cmx2bbsM= -github.com/prometheus/procfs v0.16.0/go.mod h1:8veyXUu3nGP7oaCxhX6yeaM5u4stL2FeMXnCqhDthZg= +github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= +github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= golang.org/x/sys v0.33.0 h1:q3i8TbbEz+JRD9ywIRlyRAQbM0qF7hu24q3teo2hbuw= diff --git a/docs/sources/administration/roles-and-permissions/access-control/rbac-fixed-basic-role-definitions/index.md b/docs/sources/administration/roles-and-permissions/access-control/rbac-fixed-basic-role-definitions/index.md index 6b00657fd54..10f2af5b991 100644 --- a/docs/sources/administration/roles-and-permissions/access-control/rbac-fixed-basic-role-definitions/index.md +++ b/docs/sources/administration/roles-and-permissions/access-control/rbac-fixed-basic-role-definitions/index.md @@ -54,13 +54,13 @@ The following tables list permissions associated with basic and fixed roles. Thi ## Basic role assignments -| Basic role | UID | Associated fixed roles | Description | -| ------------- | --------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Grafana Admin | `basic_grafana_admin` | `fixed:roles:reader`
`fixed:roles:writer`
`fixed:users:reader`
`fixed:users:writer`
`fixed:org.users:reader`
`fixed:org.users:writer`
`fixed:ldap:reader`
`fixed:ldap:writer`
`fixed:stats:reader`
`fixed:settings:reader`
`fixed:settings:writer`
`fixed:provisioning:writer`
`fixed:organization:reader`
`fixed:organization:maintainer`
`fixed:licensing:reader`
`fixed:licensing:writer`
`fixed:datasources.caching:reader`
`fixed:datasources.caching:writer`
`fixed:dashboards.insights:reader`
`fixed:datasources.insights:reader`
`fixed:plugins:maintainer`
`fixed:authentication.config:writer`
`fixed:library.panels:creator`
`fixed:library.panels:reader`
`fixed:library.panels:general.reader`
`fixed:library.panels:writer`
`fixed:library.panels:general.writer`
`fixed:migrationassistant:migrator` | Default [Grafana server administrator](/docs/grafana//administration/roles-and-permissions/#grafana-server-administrators) assignments. | -| Admin | `basic_admin` | `fixed:reports:reader`
`fixed:reports:writer`
`fixed:datasources:reader`
`fixed:datasources:writer`
`fixed:organization:writer`
`fixed:datasources.permissions:reader`
`fixed:datasources.permissions:writer`
`fixed:teams:writer`
`fixed:dashboards:reader`
`fixed:dashboards:writer`
`fixed:dashboards.permissions:reader`
`fixed:dashboards.permissions:writer`
`fixed:dashboards.public:writer`
`fixed:folders:reader`
`fixed:folders:writer`
`fixed:folders.permissions:reader`
`fixed:folders.permissions:writer`
`fixed:alerting:writer`
`fixed:apikeys:reader`
`fixed:apikeys:writer`
`fixed:alerting.provisioning.secrets:reader`
`fixed:alerting.provisioning:writer`
`fixed:datasources.caching:reader`
`fixed:datasources.caching:writer`
`fixed:dashboards.insights:reader`
`fixed:datasources.insights:reader`
`fixed:plugins:writer`
`fixed:library.panels:creator`
`fixed:library.panels:reader`
`fixed:library.panels:general.reader`
`fixed:library.panels:writer`
`fixed:library.panels:general.writer`
`fixed:alerting.provisioning.status:writer` | Default [Grafana organization administrator](ref:rbac-basic-roles) assignments. | -| Editor | `basic_editor` | `fixed:datasources:explorer`
`fixed:dashboards:creator`
`fixed:folders:creator`
`fixed:annotations:writer`
`fixed:alerting:writer`
`fixed:dashboards.insights:reader`
`fixed:datasources.insights:reader`
`fixed:library.panels:creator`
`fixed:library.panels:general.reader`
`fixed:library.panels:general.writer`
`fixed:alerting.provisioning.status:writer` | Default [Editor](ref:rbac-basic-roles) assignments. | -| Viewer | `basic_viewer` | `fixed:datasources.id:reader`
`fixed:organization:reader`
`fixed:annotations:reader`
`fixed:annotations.dashboard:writer`
`fixed:alerting:reader`
`fixed:plugins.app:reader`
`fixed:dashboards.insights:reader`
`fixed:datasources.insights:reader`
`fixed:library.panels:general.reader`
`fixed:folders.general:reader` | Default [Viewer](ref:rbac-basic-roles) assignments. | -| No Basic Role | n/a | | Default [No Basic Role](ref:rbac-basic-roles) | +| Basic role | UID | Associated fixed roles | Description | +| ------------- | --------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Grafana Admin | `basic_grafana_admin` | fixed:roles:writer`
`fixed:users:writer`
`fixed:org.users:writer`
`fixed:ldap:writer`
`fixed:stats:reader`
`fixed:settings:writer`
`fixed:provisioning:writer`
`fixed:organization:maintainer`
`fixed:licensing:writer`
`fixed:plugins:maintainer`
`fixed:authentication.config:writer`
`fixed:migrationassistant:migrator` | Default [Grafana server administrator](/docs/grafana//administration/roles-and-permissions/#grafana-server-administrators) assignments. | +| Admin | `basic_admin` | All roles assigned to Editor and `fixed:reports:writer`
`fixed:datasources:writer`
`fixed:organization:writer`
`fixed:datasources.permissions:writer`
`fixed:teams:writer`
`fixed:dashboards:writer`
`fixed:dashboards.permissions:writer`
`fixed:dashboards.public:writer`
`fixed:folders:writer`
`fixed:folders.permissions:writer`
`fixed:alerting:writer`
`fixed:apikeys:writer`
`fixed:alerting.provisioning.secrets:reader`
`fixed:alerting.provisioning:writer`
`fixed:datasources.caching:writer`
`fixed:plugins:writer`
`fixed:library.panels:writer` | Default [Grafana organization administrator](ref:rbac-basic-roles) assignments. | +| Editor | `basic_editor` | All roles assigned to Viewer and `fixed:datasources:explorer`
`fixed:dashboards:creator`
`fixed:folders:creator`
`fixed:annotations:writer`
`fixed:alerting:writer`
`fixed:library.panels:creator`
`fixed:library.panels:general.writer`
`fixed:alerting.provisioning.status:writer` | Default [Editor](ref:rbac-basic-roles) assignments. | +| Viewer | `basic_viewer` | `fixed:datasources.id:reader`
`fixed:organization:reader`
`fixed:annotations:reader`
`fixed:annotations.dashboard:writer`
`fixed:alerting:reader`
`fixed:plugins.app:reader`
`fixed:dashboards.insights:reader`
`fixed:datasources.insights:reader`
`fixed:library.panels:general.reader`
`fixed:folders.general:reader` | Default [Viewer](ref:rbac-basic-roles) assignments. | +| No Basic Role | n/a | | Default [No Basic Role](ref:rbac-basic-roles) | ## Fixed role definitions diff --git a/docs/sources/alerting/alerting-rules/alerting-migration/_index.md b/docs/sources/alerting/alerting-rules/alerting-migration/_index.md index 888f43d71d6..80359e10f1d 100644 --- a/docs/sources/alerting/alerting-rules/alerting-migration/_index.md +++ b/docs/sources/alerting/alerting-rules/alerting-migration/_index.md @@ -27,15 +27,12 @@ Grafana provides an internal tool in Alerting which allows you to import Mimir a ## Before you begin -The `alertingMigrationUI` [feature flag](/docs/grafana/latest/setup-grafana/configure-grafana/feature-toggles/) needs to be enabled to use this feature. -To import recording rules, they [must be configured](ref:configure-recording-rules), and the `grafanaManagedRecordingRulesDatasources` [feature flag](/docs/grafana/latest/setup-grafana/configure-grafana/feature-toggles/) must be enabled. - To use the migration tool, you need the following [RBAC permissions](/docs/grafana/latest/administration/roles-and-permissions/access-control/): - Alerting: Rules Writer - Alerting: Set provisioning status - Datasources: Reader -- Folders: Creator +- Folders: Creator {{< admonition type="note" >}} The Folders permission is optional and only necessary if you want to create new folders for your target namespace. If your account doesn't have permissions to view a namespace, the tool creates a new one. It is a best practice to prepare an import plan before you convert all your alert rules. {{< /admonition >}} diff --git a/docs/sources/alerting/alerting-rules/alerting-migration/migration-api.md b/docs/sources/alerting/alerting-rules/alerting-migration/migration-api.md index b1a1029ea5c..9c5b91d4cfc 100644 --- a/docs/sources/alerting/alerting-rules/alerting-migration/migration-api.md +++ b/docs/sources/alerting/alerting-rules/alerting-migration/migration-api.md @@ -22,8 +22,6 @@ You can convert data source-managed alert rules to Grafana-managed alert rules w ## Before you begin -To import recording rules, they [must be configured](ref:configure-recording-rules), and the `grafanaManagedRecordingRulesDatasources` [feature flag](/docs/grafana/latest/setup-grafana/configure-grafana/feature-toggles/) must be enabled. - To import data source-managed alert rules with Grafana Mimirtool, you need to have the Grafana Mimirtool command-line tool installed. You need a service account the following [RBAC permissions](/docs/grafana/latest/administration/roles-and-permissions/access-control/): diff --git a/docs/sources/alerting/alerting-rules/create-recording-rules/create-grafana-managed-recording-rules.md b/docs/sources/alerting/alerting-rules/create-recording-rules/create-grafana-managed-recording-rules.md index 2a37f3cf270..97d49ac5c32 100644 --- a/docs/sources/alerting/alerting-rules/create-recording-rules/create-grafana-managed-recording-rules.md +++ b/docs/sources/alerting/alerting-rules/create-recording-rules/create-grafana-managed-recording-rules.md @@ -63,30 +63,17 @@ To configure Grafana-managed recording rules, complete the following steps. This section only applies to Grafana OSS and Grafana Enterprise. -Enable the feature by setting `enabled = true` in the `[recording_rules]` section of the Grafana configuration file. Provide the URL of your Prometheus-compatible remote-write endpoint in the `url` field, along with optional credentials or headers. +If a rule does not explicitly specify a target data source for writing (for example, if it was created before Grafana 12.1), Grafana will fall back to the `default_datasource_uid` set in the configuration: ``` [recording_rules] -enabled = true -url = http://my-example-prometheus.local:9090/api/prom/push -basic_auth_username = my-user -basic_auth_password = my-pass - -[recording_rules.custom_headers] -X-My-Header = MyValue +default_datasource_uid = my-uid ``` -### Per-rule data source - -To choose the remote-write Prometheus data source individually for each recording rule, also enable the `grafanaManagedRecordingRulesDatasources` feature flag. +If you previously configured recording rules using the `url` and `basic_auth_*` configuration options, these are no longer supported. You must either: -When this flag is on, Grafana does not use the `url` defined in the configuration file, and the rule editor shows a dropdown to select the target data source. If a rule does not specify a target, for example it was created before the flag was enabled, Grafana writes to the data source identified by `default_datasource_uid` in the Grafana configuration: - -``` -[recording_rules] - -default_datasource_uid = my-uid -``` +- Set `default_datasource_uid` in the `[recording_rules]` section of the configuration file to point to the target data source +- Or, before upgrading to Grafana 12.1, enable the `grafanaManagedRecordingRulesDatasources` feature flag and update each recording rule individually to include a target data source ## Add new recording rule diff --git a/docs/sources/alerting/alerting-rules/templates/_index.md b/docs/sources/alerting/alerting-rules/templates/_index.md index 61258447f68..a2afde85de7 100644 --- a/docs/sources/alerting/alerting-rules/templates/_index.md +++ b/docs/sources/alerting/alerting-rules/templates/_index.md @@ -18,11 +18,11 @@ labels: title: Template annotations and labels weight: 500 refs: - shared-stale-alert-instances: + shared-dynamic-label-example: - pattern: /docs/grafana/ - destination: /docs/grafana//alerting/fundamentals/alert-rule-evaluation/stale-alert-instances/ + destination: /docs/grafana//alerting/best-practices/dynamic-labels/ - pattern: /docs/grafana-cloud/ - destination: /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/alert-rule-evaluation/stale-alert-instances/ + destination: /docs/grafana-cloud/alerting-and-irm/alerting/best-practices/dynamic-labels/ reference-labels: - pattern: /docs/grafana/ destination: /docs/grafana//alerting/alerting-rules/templates/reference/#labels @@ -198,7 +198,7 @@ In this example, the value of the `severity` label is determined by the query va > **Note:** An alert instance is uniquely identified by its set of labels. > > - Avoid displaying query values in labels, as this can create numerous alert instances—one for each distinct label set. Instead, use annotations for query values. -> - If a templated label's value changes, it maps to a different alert instance, and the previous instance is considered [stale (MissingSeries)](ref:shared-stale-alert-instances) when its label value is no longer present. +> - If a templated label's value changes, it maps to a different alert instance, and the previous instance is considered **stale**. Learn all the details in this [example using dynamic labels](ref:shared-dynamic-label-example). [//]: <> ({{< docs/shared lookup="alerts/note-dynamic-labels.md" source="grafana" version="" >}}) diff --git a/docs/sources/alerting/alerting-rules/templates/examples.md b/docs/sources/alerting/alerting-rules/templates/examples.md index 24b9078f88c..c718129b784 100644 --- a/docs/sources/alerting/alerting-rules/templates/examples.md +++ b/docs/sources/alerting/alerting-rules/templates/examples.md @@ -16,11 +16,11 @@ title: Labels and annotations template examples menuTitle: Examples weight: 102 refs: - shared-stale-alert-instances: + shared-dynamic-label-example: - pattern: /docs/grafana/ - destination: /docs/grafana//alerting/fundamentals/alert-rule-evaluation/stale-alert-instances/ + destination: /docs/grafana//alerting/best-practices/dynamic-labels/ - pattern: /docs/grafana-cloud/ - destination: /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/alert-rule-evaluation/stale-alert-instances/ + destination: /docs/grafana-cloud/alerting-and-irm/alerting/best-practices/dynamic-labels/ labels: - pattern: /docs/grafana/ destination: /docs/grafana//alerting/fundamentals/alert-rules/annotation-label/#labels @@ -217,7 +217,7 @@ You can then use the `severity` label to control how alerts are handled. For ins > **Note:** An alert instance is uniquely identified by its set of labels. > > - Avoid displaying query values in labels, as this can create numerous alert instances—one for each distinct label set. Instead, use annotations for query values. -> - If a templated label's value changes, it maps to a different alert instance, and the previous instance is considered [stale (MissingSeries)](ref:shared-stale-alert-instances) when its label value is no longer present. +> - If a templated label's value changes, it maps to a different alert instance, and the previous instance is considered **stale**. Learn all the details in this [example using dynamic labels](ref:shared-dynamic-label-example). [//]: <> ({{< docs/shared lookup="alerts/note-dynamic-labels.md" source="grafana" version="" >}}) diff --git a/docs/sources/alerting/best-practices/dynamic-labels.md b/docs/sources/alerting/best-practices/dynamic-labels.md new file mode 100644 index 00000000000..4c4078f7e2e --- /dev/null +++ b/docs/sources/alerting/best-practices/dynamic-labels.md @@ -0,0 +1,328 @@ +--- +canonical: https://grafana.com/docs/grafana/latest/alerting/best-practices/dynamic-labels +description: This example shows how to define dynamic labels based on query values, along with important behavior to keep in mind when using them. +keywords: + - grafana + - alerting + - examples +labels: + products: + - cloud + - enterprise + - oss +menuTitle: Examples of dynamic labels +title: Example of dynamic labels in alert instances +weight: 1104 +refs: + missing-data-guide: + - pattern: /docs/grafana/ + destination: /docs/grafana//alerting/best-practices/missing-data/ + - pattern: /docs/grafana-cloud/ + destination: /docs/grafana-cloud/alerting-and-irm/alerting/best-practices/missing-data/ + alert-rule-evaluation: + - pattern: /docs/grafana/ + destination: /docs/grafana//alerting/fundamentals/alert-rule-evaluation/ + - pattern: /docs/grafana-cloud/ + destination: /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/alert-rule-evaluation/ + pending-period: + - pattern: /docs/grafana/ + destination: /docs/grafana//alerting/fundamentals/notifications/notification-policies/ + - pattern: /docs/grafana-cloud/ + destination: /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/notifications/notification-policies/ + view-alert-state-history: + - pattern: /docs/grafana/ + destination: /docs/grafana//alerting/monitor-status/view-alert-state-history/ + - pattern: /docs/grafana-cloud/ + destination: /docs/grafana-cloud/alerting-and-irm/alerting/monitor-status/view-alert-state-history/ + stale-alert-instances: + - pattern: /docs/grafana/ + destination: /docs/grafana//alerting/fundamentals/alert-rule-evaluation/stale-alert-instances/ + - pattern: /docs/grafana-cloud/ + destination: /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/alert-rule-evaluation/stale-alert-instances/ + notification-policies: + - pattern: /docs/grafana/ + destination: /docs/grafana//alerting/fundamentals/notifications/notification-policies/ + - pattern: /docs/grafana-cloud/ + destination: /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/notifications/notification-policies/ + templating-labels-annotations: + - pattern: /docs/grafana/ + destination: /docs/grafana//alerting/alerting-rules/templates/ + - pattern: /docs/grafana-cloud/ + destination: /docs/grafana-cloud/alerting-and-irm/alerting/alerting-rules/templates/ + labels: + - pattern: /docs/grafana/ + destination: /docs/grafana//alerting/fundamentals/alert-rules/annotation-label/#labels + - pattern: /docs/grafana-cloud/ + destination: /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/alert-rules/alert-rules/annotation-label/#labels + testdata-data-source: + - pattern: /docs/grafana/ + destination: /docs/grafana//datasources/testdata/ + - pattern: /docs/grafana-cloud/ + destination: /docs/grafana-cloud/connect-externally-hosted/data-sources/testdata/ + multi-dimensional-example: + - pattern: /docs/grafana/ + destination: /docs/grafana//alerting/best-practices/multi-dimensional-alerts/ + - pattern: /docs/grafana-cloud/ + destination: /docs/grafana-cloud/alerting-and-irm/alerting/best-practices/multi-dimensional-alerts/ +--- + +# Example of dynamic labels in alert instances + +Labels are essential for scaling your alerting setup. They define metadata like `severity`, `team`, `category`, or `environment`, which you can use for alert routing. + +A label like `severity="critical"` can be set statically in the alert rule configuration, or dynamically based on a query value such as the current free disk space. Dynamic labels **adjust label values at runtime**, allowing you to reuse the same alert rule across different scenarios. + +This example shows how to define dynamic labels based on query values, along with key behavior to keep in mind when using them. + +First, it's important to understand how Grafana Alerting treats [labels](ref:labels). + +## Alert instances are defined by labels + +Each alert rule creates a separate alert instance for every unique combination of labels. + +This is called [multi-dimensional alerts](ref:multi-dimensional-example): one rule, many instances—**one per unique label set**. + +For example, a rule that queries CPU usage per host might return multiple series (or dimensions): + +- `{alertname="ServerHighCPU", instance="prod-server-1" }` +- `{alertname="ServerHighCPU", instance="prod-server-2" }` +- `{alertname="ServerHighCPU", instance="prod-server-3" }` + +Each unique label combination defines a distinct alert instance, with its own evaluation state and potential notifications. + +The full label set of an alert instance can include: + +- Labels from the query result (e.g., `instance`) +- Auto-generated labels (e.g., `alertname`) +- User-defined labels from the rule configuration + +## User-defined labels + +As shown earlier, alert instances automatically include labels from the query result, such as `instance` or `job`. To add more context or control alert routing, you can define _user-defined labels_ in the alert rule configuration: + +{{< figure src="/media/docs/alerting/example-dynamic-labels-edit-labels-v3.png" max-width="750px" alt="Edit labels UI in the alert rule configuration." >}} + +User-defined labels can be either: + +- **Fixed labels**: These have the same value for every alert instance. They are often used to include common metadata, such as team ownership. + +- **Templated labels**: These calculate their values based on the query result at evaluation time. + +## Templated labels + +Templated labels evaluate their values dynamically, based on the query result. This allows the label value to vary per alert instance. + +Use templated labels to inject additional context into alerts. To learn about syntax and use cases, refer to [Template annotations and labels](ref:templating-labels-annotations). + +You can define templated labels that produce either: + +- A fixed value per alert instance. +- A dynamic value per alert instance that changes based on the last query result. + +### Fixed values per alert instance + +You can use a known label value to enrich the alert with additional metadata not present in existing labels. For example, you can map the `instance` label to an `env` label that represents the deployment environment: + +```go +{{- if eq $labels.instance "prod-server-1" -}}production +{{- else if eq $labels.instance "stag-server-1" -}}staging +{{- else -}}development +{{- end -}} +``` + +This produces alert instances like: + +- `{alertname="ServerHighCPU", instance="prod-server-1", env="production"}` +- `{alertname="ServerHighCPU", instance="stag-server-1", env="staging"}` + +In this example, the `env` label is fixed for each alert instance and does not change during its lifecycle. + +### Dynamic values per alert instance + +You can define a label whose value depends on the numeric result of a query—mapping it to a predefined set of options. This is useful for representing `severity` levels within a single alert rule. + +Instead of defining three separate rules like: + +- _CPU ≥ 90_ → `severity=critical` +- _CPU ≥ 80_ → `severity=warning` +- _CPU ≥ 70_ → `severity=minor` + +You can define a single rule and assign `severity` dynamically using a template: + +```go +{{/* $values.B.Value refers to the numeric result from query B */}} +{{- if gt $values.B.Value 90.0 -}}critical +{{- else if gt $values.B.Value 80.0 -}}warning +{{- else if gt $values.B.Value 70.0 -}}minor +{{- else -}}none +{{- end -}} +``` + +This pattern lets you express multiple alerting scenarios in a single rule, while still routing based on the `severity` label value. + +## Example overview + +In the previous severity template, you can set the alert condition to `$B > 70` to prevent firing when `severity=none`, and then use the `severity` label to route distinct alert instances to different contact points. + +For example, configure a [notification policy](ref:notification-policies) that matches `alertname="ServerHighCPU"` with the following children policies: + +- `severity=critical` → escalate to an incident response and management solution (IRM). +- `severity=warning` → send to the team's Slack channel. +- `severity=minor` → send to a non-urgent queue or log-only dashboard. + +The resulting alerting flow might look like this: + +| Time | $B query | Alert instance | Routed to | +| :--- | :------- | :------------------------------------------------- | :------------------- | +| t1 | 65 | `{alertname="ServerHighCPU", severity="none"}` | `Not firing` | +| t2 | 75 | `{alertname="ServerHighCPU", severity="minor"}` | Non-urgent queue | +| t3 | 85 | `{alertname="ServerHighCPU", severity="warning"}` | Team Slack channel | +| t4 | 95 | `{alertname="ServerHighCPU", severity="critical"}` | IRM escalation chain | + +This alerting setup allows you to: + +- Use a single rule for multiple severity levels. +- Route alerts dynamically using the label value. +- Simplify alert rule maintenance and avoid duplication. + +However, dynamic labels can introduce unexpected behavior when label values change. The next section explains this. + +## Caveat: a label change affects a distinct alert instance + +Remember: **alert instances are defined by their labels**. + +If a dynamic label changes between evaluations, this new value affects a separate alert instance. + +Here's what happens if `severity` changes from `minor` to `warning`: + +1. The instance with `severity="minor"` disappears → it becomes a missing series. +1. A new instance with `severity="warning"` appears → it starts from scratch. +1. After two evaluations without data, the `minor` instance is **resolved and evicted**. + +Here’s a sequence example: + +| Time | Query value | Instance `severity="none"` | Instance `severity="minor"` | Instance `severity="warning"` | +| :--- | :---------- | :------------------------- | :-------------------------- | :---------------------------- | +| t0 | | | | | +| t1 | 75 | | 🔴 📩 | | +| t2 | 85 | | ⚠️ MissingSeries | 🔴 📩 | +| t3 | 85 | | ⚠️ MissingSeries | 🔴 | +| t4 | 50 | 🟢 | 📩 Resolved and evicted | ⚠️ MissingSeries | +| t5 | 50 | 🟢 | | ⚠️ MissingSeries | +| t6 | 50 | 🟢 | | 📩 Resolved and evicted | + +Learn more about this behavior in [Stale alert instances](ref:stale-alert-instances). + +In this example, the `minor` and `warning` alerts likely represent the same underlying issue, but Grafana treats them as distinct alert instances. As a result, this scenario generates two firing notifications and two resolved notifications, one for each instance. + +This behavior is important to keep in mind when dynamic label values change frequently. + +It can lead to multiple notifications firing and resolving in short intervals, resulting in **noisy and confusing notifications**. + +## Try it with TestData + +You can replicate this scenario using the [TestData data source](ref:testdata-data-source) to simulate an unstable signal—like monitoring a noisy sensor. + +This setup reproduces label flapping and shows how dynamic label values affect alert instance behavior. + +1. Add the **TestData** data source through the **Connections** menu. +1. Create an alert rule. + + Navigate to **Alerting** → **Alert rules** and click **New alert rule**. + +1. Simulate a query (`$A`) that returns a noisy signal. + + Select **TestData** as the data source and configure the scenario. + + - Scenario: Random Walk + - Series count: 1 + - Start value: 51 + - Min: 50, Max: 100 + - Spread: 100 (ensures large changes between consecutive data points) + +1. Add an expression. + + - Type: Reduce + - Input: A + - Function: Last (to get the most recent value) + - Name: B + +1. Define the alert condition. + + Use a threshold like `$B >= 50` (it always fires). + +1. Click **Edit Labels** to add a dynamic label. + + Create a new label `severity` and set its value to the following: + + ```go + {{/* $values.B.Value refers to the numeric result from query B */}} + {{- if gt $values.B.Value 90.0 -}}P1 + {{- else if gt $values.B.Value 80.0 -}}P2 + {{- else if gt $values.B.Value 70.0 -}}P3 + {{- else if gt $values.B.Value 60.0 -}}P4 + {{- else if gt $values.B.Value 50.0 -}}P5 + {{- else -}}none + {{- end -}} + ``` + +1. Set evaluation behavior. + + Set a short evaluation interval (e.g., `10s`) to observe quickly label flapping and alert instance transitions in the history. + +1. Preview alert routing to verify the label template. + + In **Configure notifications**, toggle **Advanced options**. + Click **Preview routing** and check the value of the `severity` label: + + {{< figure src="/media/docs/alerting/example-dynamic-labels-preview-label.png" max-width="750px" caption="Preview routing multiple times to verify how label values change over time." >}} + +1. Observe alert state changes. + + Click **Save rule and exit**, and open the [alert history view](ref:view-alert-state-history) to see how changes in `severity` affect the state of distinct alert instances. + + {{< figure src="/media/docs/alerting/example-dynamic-labels-alert-history-page.png" max-width="750px" caption="You can find multiple transitions over time as the label value fluctuates." >}} + + {{< docs/play title="this alert example" url="https://play.grafana.org/alerting/grafana/femr0gkp9vsowe/view" >}} + +## Considerations + +Dynamic labels lets you reuse a single alert rule across multiple escalation scenarios—but it also introduces complexity. When the label value depends on a noisy metric and changes frequently, it can lead to flapping alert instances and excessive notifications. + +These alerts often require tuning to stay reliable and benefit from continuous review. To get the most out of this pattern, consider the following: + +- **Tune evaluation settings and queries for stability** + + Increase the [evaluation interval and pending period](ref:alert-rule-evaluation) to reduce the frequency of state changes. Additionally, consider smoothing metrics with functions like `avg_over_time` to reduce flapping. + +- **Use wider threshold bands** + + Define broader ranges in your label template logic to prevent label switching caused by small value changes. + +- **Disable resolved notifications** + + When labels change frequently and alerts resolve quickly, you can reduce the number of notifications by disabling resolved notifications at the contact point. + +- **Disable the Missing series evaluations setting** + + The [Missing series evaluations setting](ref:stale-alert-instances) (default: 2) defines how many intervals without data are allowed before resolving an instance. Consider disabling it if it's unnecessary for your use case, as it can complicate alert troubleshooting. + +- **Preserve context across related alerts** + + Ensure alert metadata includes enough information to help correlate related alerts during investigation. + +- **Use separate alert rules and static labels when simpler** + + In some cases, defining separate rules with static labels may be easier to manage than one complex dynamic rule. This also allows you to customize alert queries for each specific case. + +## Learn more + +Here's a list of additional resources related to this example: + +- [Multi-dimensional alerting example](ref:multi-dimensional-example) – Explore how Grafana creates separate alert instances for each unique set of labels. +- [Labels](ref:labels) – Learn about the different types of labels and how they define alert instances. +- [Template labels in alert rules](ref:templating-labels-annotations) – Use templating to set label values dynamically based on query results. +- [Stale alert instances](ref:stale-alert-instances) – Understand how Grafana resolves and removes stale alert instances. +- [Handle missing data](ref:missing-data-guide) – Learn how Grafana distinguishes between missing series and `NoData`. +- [Notification policies and routing](ref:notification-policies) – Create multiple notification policies to route alerts based on label values like `severity` or `team`. +- [Dynamic label example in Grafana Play](https://play.grafana.org/alerting/grafana/femr0gkp9vsowe/view) - View this example in Grafana Play to explore alert instances and state transitions with dynamic labels. diff --git a/docs/sources/alerting/best-practices/dynamic-thresholds.md b/docs/sources/alerting/best-practices/dynamic-thresholds.md new file mode 100644 index 00000000000..c70eb8394d2 --- /dev/null +++ b/docs/sources/alerting/best-practices/dynamic-thresholds.md @@ -0,0 +1,229 @@ +--- +canonical: https://grafana.com/docs/grafana/latest/alerting/best-practices/dynamic-thresholds +description: This example shows how to use a distinct threshold value per dimension using multi-dimensional alerts and a Math expression. +keywords: + - grafana + - alerting + - examples +labels: + products: + - cloud + - enterprise + - oss +menuTitle: Examples of dynamic thresholds +title: Example of dynamic thresholds per dimension +weight: 1103 +refs: + testdata-data-source: + - pattern: /docs/grafana/ + destination: /docs/grafana//datasources/testdata/ + - pattern: /docs/grafana-cloud/ + destination: /docs/grafana-cloud/connect-externally-hosted/data-sources/testdata/ + math-expression: + - pattern: /docs/grafana/ + destination: /docs/grafana//alerting/fundamentals/alert-rules/queries-conditions/#math + - pattern: /docs/grafana-cloud/ + destination: /docs/grafana-cloud/alerting-and-irm/alerting/fundamentals/alert-rules/queries-conditions/#math + table-data-example: + - pattern: /docs/grafana/ + destination: /docs/grafana//alerting/best-practices/table-data/ + - pattern: /docs/grafana-cloud/ + destination: /docs/grafana-cloud/alerting-and-irm/alerting/best-practices/table-data/ + multi-dimensional-example: + - pattern: /docs/grafana/ + destination: /docs/grafana//alerting/best-practices/multi-dimensional-alerts/ + - pattern: /docs/grafana-cloud/ + destination: /docs/grafana-cloud/alerting-and-irm/alerting/best-practices/multi-dimensional-alerts/ + recording-rules: + - pattern: /docs/grafana/ + destination: /docs/grafana//alerting/alerting-rules/create-recording-rules/ + - pattern: /docs/grafana-cloud/ + destination: /docs/grafana-cloud/alerting-and-irm/alerting/alerting-rules/create-recording-rules/ +--- + +# Example of dynamic thresholds per dimension + +In Grafana Alerting, each alert rule supports only one condition expression. + +That's enough in many cases—most alerts use a fixed numeric threshold like `latency > 3s` or `error_rate > 5%` to determine their state. + +As your alerting setup grows, you may find that different targets require different threshold values. + +Instead of duplicating alert rules, you can assign a **different threshold value to each target**—while keeping the same condition. This simplifies alert maintenance. + +This example shows how to do that using [multi-dimensional alerts](ref:multi-dimensional-example) and a [Math expression](ref:math-expression). + +## Example overview + +You're monitoring latency across multiple API services. Initially, you want to get alerted if the 95th percentile latency (`p95_api_latency`) exceeds 3 seconds, so your alert rule uses a single static threshold: + +``` +p95_api_latency > 3 +``` + +But the team quickly finds that some services require stricter thresholds. For example, latency for payment APIs should stay under 1.5s, while background jobs can tolerate up to 5s. The team establishes different thresholds per service: + +- `p95_api_latency{service="checkout-api"}`: must stay under `1.5s`. +- `p95_api_latency{service="auth-api"}`: also strict, `1.5s`. +- `p95_api_latency{service="catalog-api"}`: less critical, `3s`. +- `p95_api_latency{service="async-tasks"}`: background jobs can tolerate up to `5s`. + +You want to avoid creating one alert rule per service—this is harder to maintain. + +In Grafana Alerting, you can define one alert rule that monitors multiple similar components like this scenario. This is called [multi-dimensional alerts](ref:multi-dimensional-example): one alert rule, many alert instances—**one per unique label set**. + +But there's an issue: Grafana supports only **one alert condition per rule**. + +``` +One alert rule +├─ One condition ( e.g., $A > 3) +│ └─ Applies to all returned series in $A +│ ├─ {service="checkout-api"} +│ ├─ {service="auth-api"} +│ ├─ {service="catalog-api"} +│ └─ {service="async-tasks"} +``` + +To evaluate per-service thresholds, you need a distinct threshold value for each returned series. + +## Dynamic thresholds using a Math expression + +You can create a dynamic alert condition by operating on two queries with a [Math expression](ref:math-expression). + +- `$A` for query results (e.g., `p95_api_latency`). +- `$B` for per-service thresholds (from CSV data or another query). +- `$A > $B` is the _Math_ expression that defines the alert condition. + +Grafana evaluates the _Math_ expression **per series**, by joining series from `$A` and `$B` based on their shared labels before applying the expression. + +Here’s an example of an arithmetic operation: + +{{< docs/shared lookup="alerts/math-example.md" source="grafana" version="" >}} + +In practice, you must align your threshold input with the label sets returned by your alert query. + +The following table illustrates how a per-service threshold is evaluated in the previous example: + +| $A: p95 latency query | $B: threshold value | $C: $A\>$B | State | +| :--------------------------- | :----------------------------- | :--------------------------- | :--------- | +| `{service="checkout-api"} 3` | `{service="checkout-api"} 1.5` | `{service="checkout-api"} 1` | **Firing** | +| `{service="auth-api"} 1` | `{service="auth-api"} 1.5` | `{service="auth-api"} 0` | **Normal** | +| `{service="catalog-api"} 2` | `{service="catalog-api"} 3` | `{service="catalog-api"} 0` | **Normal** | +| `{service="sync-work"} 3` | `{service="sync-work"} 5` | `{service="sync-work"} 0` | **Normal** | + +In this example: + +- `$A` comes from the `p95_api_latency` query. +- `$B` is manually defined with a threshold value for each series in `$A`. +- The alert condition compares `$A>$B` using a _Math_ relational operator (e.g., `>`, `<`, `>=`, `<=`, `==`, `!=`) that joins series by matching labels. +- Grafana evaluates the alert condition and sets the firing state where the condition is true. + +The _Math_ expression works as long as each series in `$A` can be matched with exactly one series in `$B`. They must align in a way that produces a one-to-one match between series in `$A` and `$B`. + +{{% admonition type="caution" %}} + +If a series in one query doesn’t match any series in the other, it’s excluded from the result and a warning message is displayed: + +_1 items **dropped from union(s)**: ["$A > $B": ($B: {service=payment-api})]_ + +{{% /admonition %}} + +**Labels in both series don’t need to be identical**. If labels are a subset of the other, they can join. For example: + +- `$A` returns series `{host="web01", job="event"}` 30 and `{host="web02", job="event"}` 20. +- `$B` returns series `{host="web01"}` 10 and `{host="web02"}` 0. +- `$A` + `$B` returns `{host="web01", job="event"}` 40 and `{host="web02", job="event"}` 20. + +## Try it with TestData + +You can use the [TestData data source](ref:testdata-data-source) to replicate this example: + +1. Add the **TestData** data source through the **Connections** menu. +1. Create an alert rule. + + Navigate to **Alerting** → **Alert rules** and click **New alert rule**. + +1. Simulate a query (`$A`) that returns latencies for each service. + + Select **TestData** as the data source and configure the scenario. + + - Scenario: Random Walk + - Alias: latency + - Labels: service=api-$seriesIndex + - Series count: 4 + - Start value: 1 + - Min: 1, Max: 4 + + This uses `$seriesIndex` to assign unique service labels: `api-0`, `api-1`, etc. + + {{< figure src="/media/docs/alerting/example-dynamic-thresholds-latency-series-v2.png" max-width="750px" alt="TestData data source returns 4 series to simulate latencies for distinct API services." >}} + +1. Define per-service thresholds with static data. + + Add a new query (`$B`) and select **TestData** as the data source. + + From **Scenario**, select **CSV Content** and paste this CSV: + + ``` + service,value + api-0,1.5 + api-1,1.5 + api-2,3 + api-3,5 + ``` + + The `service` column must match the labels from `$A`. + + The `value` column is a numeric value used for the alert comparison. + + For details on CSV format requirements, see [table data examples](ref:table-data-example). + +1. Add a new **Reduce** expression (`$C`). + + - Type: Reduce + - Input: A + - Function: Mean + - Name: C + + This calculates the average latency for each service: `api-0`, `api-1`, etc. + +1. Add a new **Math** expression. + + - Type: Math + - Expression: `$C > $B` + - Set this expression as the **alert condition**. + + This fires if the average latency (`$C`) exceeds the threshold from `$B` for any service. + +1. **Preview** the alert. + + {{< figure src="/media/docs/alerting/example-dynamic-thresholds-preview-v3.png" max-width="750px" caption="Alert preview evaluating multiple series with distinct threshold values" >}} + + {{< docs/play title="this alert example" url="https://play.grafana.org/alerting/grafana/demqzyodxrd34e/view" >}} + +## Other use cases + +This example showed how to build a single alert rule with different thresholds per series using [multi-dimensional alerts](ref:multi-dimensional-example) and [Math expressions](ref:math-expression). + +This approach scales well when monitoring similar components with distinct reliability goals. + +By aligning series from two queries, you can apply a dynamic threshold—one value per label set—without duplicating rules. + +While this example uses static CSV content to define thresholds, the same technique works in other scenarios: + +- **Dynamic thresholds from queries or recording rules**: Fetch threshold values from a real-time query, or from [custom recording rules](ref:recording-rules). +- **Combine multiple conditions**: Build more advanced threshold logic by combining multiple conditions—such as latency, error rate, or traffic volume. + +For example, you can define a PromQL expression that sets a latency threshold which adjusts based on traffic—allowing higher response times during periods of high-load. + +``` +( + // Fires when p95 latency > 2s during usual traffic (≤ 1000 req/s) + service:latency:p95 > 2 and service:request_rate:rate1m <= 1000 +) +or +( + // Fires when p95 latency > 4s during high traffic (> 1000 req/s) + service:latency:p95 > 4 and service:request_rate:rate1m > 1000 +) +``` diff --git a/docs/sources/alerting/best-practices/multi-dimensional-alerts.md b/docs/sources/alerting/best-practices/multi-dimensional-alerts.md index 2cc9c9e171d..1d3c1a9129c 100644 --- a/docs/sources/alerting/best-practices/multi-dimensional-alerts.md +++ b/docs/sources/alerting/best-practices/multi-dimensional-alerts.md @@ -117,12 +117,13 @@ You can quickly experiment with multi-dimensional alerts using the [**TestData** 1. Select **TestData** as the data source. 1. Configure the TestData scenario - 1. Scenario: **Random Walk** - 1. Series count: 3 - 1. Start value: 70, Max: 100 - 1. Labels: `cpu=cpu-$seriesIndex` + - Scenario: **Random Walk** + - Labels: `cpu=cpu-$seriesIndex` + - Series count: 3 + - Min: 70, Max: 100 + - Spread: 2 - {{< figure src="/media/docs/alerting/testdata-random-series.png" max-width="750px" alt="Generating random time series data using the TestData data source" >}} + {{< figure src="/media/docs/alerting/testdata-random-series-v2.png" max-width="750px" alt="Generating random time series data using the TestData data source" >}} ## Reduce time series data for comparison @@ -146,6 +147,8 @@ For demo purposes, this example uses the **Advanced mode** with a **Reduce** exp {{< figure src="/media/docs/alerting/using-expressions-with-multiple-series.png" max-width="750px" caption="The alert condition evaluates the reduced value for each alert instance and shows whether each instance is Firing or Normal." alt="Alert preview using a Reduce expression and a threshold condition" >}} + {{< docs/play title="this alert example" url="https://play.grafana.org/alerting/grafana/cemqwfn334npce/view" >}} + ## Learn more This example shows how Grafana Alerting implements a multi-dimensional alerting model: one rule, many alert instances and why reducing time series data to a single value is required for evaluation. diff --git a/docs/sources/alerting/best-practices/table-data.md b/docs/sources/alerting/best-practices/table-data.md index 314f46751d0..60a6cb341a9 100644 --- a/docs/sources/alerting/best-practices/table-data.md +++ b/docs/sources/alerting/best-practices/table-data.md @@ -22,6 +22,9 @@ refs: destination: /docs/grafana//alerting/best-practices/multi-dimensional-alerts/ - pattern: /docs/grafana-cloud/ destination: /docs/grafana-cloud/alerting-and-irm/alerting/best-practices/multi-dimensional-alerts/ + infinity-csv: + - pattern: /docs/grafana/ + destination: /docs/plugins/yesoreyeram-infinity-datasource/latest/csv/ --- # Example of alerting on tabular data @@ -115,7 +118,19 @@ To test this quickly, you can simulate the table using the [**TestData** data so {{< figure src="/media/docs/alerting/example-table-data-preview.png" max-width="750px" alt="Alert preview with tabular data using the TestData data source" >}} -## **Differences with time series data** + {{< docs/play title="this alert example" url="https://play.grafana.org/alerting/grafana/eemqylh1l8tfkf/view" >}} + +## CSV data with Infinity + +Note that when the [Infinity plugin fetches CSV data](ref:infinity-csv), all the columns are parsed and returned as strings. By default, this causes the query expression to fail in Alerting. + +To make it work, you need to format the CSV data as [expected by Grafana Alerting](#how-grafana-alerting-evaluates-tabular-data). + +In the query editor, specify the column names and their types to ensure that only one column is treated as a number. + +{{< figure src="/media/docs/alerting/example-table-data-infinity-csv-data.png" max-width="750px" alt="Using the Infinity data source plugin to fetch CSV data in Alerting" >}} + +## Differences with time series data Working with time series is similar—each series is treated as a separate alert instance, based on its label set. diff --git a/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/configure-opsgenie.md b/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/configure-opsgenie.md index feb4d406caa..339a725d641 100644 --- a/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/configure-opsgenie.md +++ b/docs/sources/alerting/configure-notifications/manage-contact-points/integrations/configure-opsgenie.md @@ -41,10 +41,12 @@ To create your Opsgenie integration in Grafana Alerting, complete the following 1. Enter a contact point name. 1. From the **Integration** list, select **Opsgenie**. 1. In the **API key** field, paste in your API key. -1. In the **Alert API URL**, enter `https://api.opsgenie.com/v2/alerts`. +1. Configure the **Alert API URL**. + 1. For Grafana Alertmanager, enter `https://api.opsgenie.com/v2/alerts`. + 1. For other Alertmanagers, enter the host for sending Opsgenie API requests, depending on the hosted region. 1. Click **Test** to check that your integration works. - ** For Grafana Alertmanager only.** + **For Grafana Alertmanager only.** A test alert notification is sent to the Alerts page in Opsgenie. diff --git a/docs/sources/alerting/fundamentals/alert-rule-evaluation/_index.md b/docs/sources/alerting/fundamentals/alert-rule-evaluation/_index.md index fd85f40d5ea..cf2576c1692 100644 --- a/docs/sources/alerting/fundamentals/alert-rule-evaluation/_index.md +++ b/docs/sources/alerting/fundamentals/alert-rule-evaluation/_index.md @@ -34,10 +34,11 @@ refs: # Alert rule evaluation -The criteria determining when an alert rule fires are based on two settings: +The criteria determining when an alert rule fires are based on three settings: - [Evaluation group](#evaluation-group): how frequently the alert rule is evaluated. - [Pending period](#pending-period): how long the condition must be met to start firing. +- [Keep firing for](#pending-period): how long the alert continues to fire after the condition is no longer met. {{< figure src="/media/docs/alerting/alert-rule-evaluation-2.png" max-width="750px" alt="Set the evaluation behavior of the alert rule in Grafana." caption="Set alert rule evaluation" >}} diff --git a/docs/sources/alerting/fundamentals/alert-rules/queries-conditions.md b/docs/sources/alerting/fundamentals/alert-rules/queries-conditions.md index a658dc06702..e958f5e1caa 100644 --- a/docs/sources/alerting/fundamentals/alert-rules/queries-conditions.md +++ b/docs/sources/alerting/fundamentals/alert-rules/queries-conditions.md @@ -17,6 +17,11 @@ labels: title: Queries and conditions weight: 104 refs: + dynamic-threshold-example: + - pattern: /docs/grafana/ + destination: /docs/grafana//alerting/best-practices/dynamic-thresholds/ + - pattern: /docs/grafana-cloud/ + destination: /docs/grafana-cloud/alerting-and-irm/alerting/best-practices/dynamic-thresholds/ alert-instance: - pattern: /docs/grafana/ destination: /docs/grafana//alerting/fundamentals/#alert-instances @@ -117,9 +122,7 @@ Performs free-form math functions/operations on time series data and numbers. Fo If queries being compared have **multiple series in their results**, series from different queries are matched(joined) if they have the same labels. For example: -- `$A` returns series `{host=web01} 30` and `{host=web02} 20` -- `$B` returns series `{host=web01} 10` and `{host=web02} 0` -- `$A + $B` returns `{host=web01} 40` and `{host=web02} 20`. +{{< docs/shared lookup="alerts/math-example.md" source="grafana" version="" >}} In this case, only series with matching labels are joined, and the operation is calculated between them. @@ -129,6 +132,7 @@ You can also use a Math expression to define the **alert condition**. For exampl - `$B > 70` should fire if the value of B (query or expression) is more than 70. - `$B < $C * 100` should fire if the value of B is less than the value of C multiplied by 100. +- Compare matching series from two queries, as shown in the [dynamic threshold example](ref:dynamic-threshold-example). ### Resample diff --git a/docs/sources/alerting/set-up/configure-high-availability/_index.md b/docs/sources/alerting/set-up/configure-high-availability/_index.md index 63dce1c6a7b..2823b2613bb 100644 --- a/docs/sources/alerting/set-up/configure-high-availability/_index.md +++ b/docs/sources/alerting/set-up/configure-high-availability/_index.md @@ -67,8 +67,13 @@ For a demo, see this [example using Docker Compose](https://github.com/grafana/a ## Enable alerting high availability using Redis -As an alternative to Memberlist, you can use Redis for high availability. This is useful if you want to have a central -database for HA and cannot support the meshing of all Grafana servers. +As an alternative to Memberlist, you can configure Redis to enable high availability. Only **Redis Server** and **Redis Cluster** modes are supported. + +{{% admonition type="note" %}} + +Memberlist is the preferred option for high availability. Use Redis only in environments where direct communication between Grafana servers is not possible, such as when TCP or UDP ports are blocked. + +{{% /admonition %}} 1. Make sure you have a Redis server that supports pub/sub. If you use a proxy in front of your Redis cluster, make sure the proxy supports pub/sub. 1. In your custom configuration file ($WORKING_DIR/conf/custom.ini), go to the `[unified_alerting]` section. diff --git a/docs/sources/developers/http_api/dashboard.md b/docs/sources/developers/http_api/dashboard.md index 21400aae528..b862fb7c4a6 100644 --- a/docs/sources/developers/http_api/dashboard.md +++ b/docs/sources/developers/http_api/dashboard.md @@ -474,7 +474,7 @@ Status Codes: Updates an existing dashboard via the dashboard uid. -- namespace: to read more about the namespace to use, see the [API overview]({{< ref "apis" >}}). +- namespace: to read more about the namespace to use, see the [API overview](https://grafana.com/docs/grafana//developers/http_api/apis/). - uid: the unique identifier of the dashboard to update. this will be the _name_ in the dashboard response **Required permissions** @@ -565,7 +565,7 @@ Status Codes: Gets a dashboard via the dashboard uid. -- namespace: to read more about the namespace to use, see the [API overview]({{< ref "apis" >}}). +- namespace: to read more about the namespace to use, see the [API overview](https://grafana.com/docs/grafana//developers/http_api/apis/). - uid: the unique identifier of the dashboard to update. this will be the _name_ in the dashboard response Note: For large dashboards, add `/dto` to the end of the URL to get the full dashboard body. @@ -634,9 +634,7 @@ Status Codes: Lists all dashboards in the given organization. You can control the maximum number of dashboards returned through the `limit` query parameter. You can then use the `continue` token returned to fetch the next page of dashboards. -- namespace: to read more about the namespace to use, see the [API overview]({{< ref "apis" >}}). - -Note: to read more about the namespace to use, see the [API overview]({{< ref "apis" >}}). +- namespace: to read more about the namespace to use, see the [API overview](https://grafana.com/docs/grafana//developers/http_api/apis/). **Required permissions** @@ -713,7 +711,7 @@ Status Codes: Deletes a dashboard via the dashboard uid. -- namespace: to read more about the namespace to use, see the [API overview]({{< ref "apis" >}}). +- namespace: to read more about the namespace to use, see the [API overview](https://grafana.com/docs/grafana//developers/http_api/apis/). - uid: the unique identifier of the dashboard to update. this will be the _name_ in the dashboard response **Required permissions** @@ -853,7 +851,7 @@ Content-Type: application/json ## Dashboard Search -See [Folder/Dashboard Search API]({{< relref "folder_dashboard_search/" >}}). +See [Folder/Dashboard Search API](../folder_dashboard_search/). ## APIs @@ -1096,94 +1094,3 @@ Status Codes: - **401** – Unauthorized - **403** – Access denied - **404** – Not found - -## Gets the home dashboard - -`GET /api/dashboards/home` - -Will return the home dashboard. - -**Example Request**: - -```http -GET /api/dashboards/home HTTP/1.1 -Accept: application/json -Content-Type: application/json -Authorization: Bearer eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk -``` - -**Example Response**: - -```http -HTTP/1.1 200 -Content-Type: application/json - -{ - "dashboard": { - "editable":false, - "nav":[ - { - "enable":false, - "type":"timepicker" - } - ], - "style":"dark", - "tags":[], - "templating":{ - "list":[ - ] - }, - "time":{ - }, - "timezone":"browser", - "title":"Home", - "version":5 - }, - "meta": { - "isHome":true, - "canSave":false, - "canEdit":false, - "canStar":false, - "url":"", - "expires":"0001-01-01T00:00:00Z", - "created":"0001-01-01T00:00:00Z" - } -} -``` - -## Tags for Dashboard - -`GET /api/dashboards/tags` - -Get all tags of dashboards - -**Example Request**: - -```http -GET /api/dashboards/tags HTTP/1.1 -Accept: application/json -Content-Type: application/json -Authorization: Bearer eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk -``` - -**Example Response**: - -```http -HTTP/1.1 200 -Content-Type: application/json - -[ - { - "term":"tag1", - "count":1 - }, - { - "term":"tag2", - "count":4 - } -] -``` - -## Dashboard Search - -See [Folder/Dashboard Search API](../folder_dashboard_search/). diff --git a/docs/sources/developers/plugins/plugin.schema.json b/docs/sources/developers/plugins/plugin.schema.json index a2c7d1af36f..d87e542bd05 100644 --- a/docs/sources/developers/plugins/plugin.schema.json +++ b/docs/sources/developers/plugins/plugin.schema.json @@ -172,7 +172,7 @@ "grafanaDependency": { "type": "string", "description": "Required Grafana version for this plugin. Validated using https://github.com/npm/node-semver.", - "pattern": "^(<=|>=|<|>|=|~|\\^)?([0-9]+)(\\.[0-9x\\*]+)?(\\.[0-9x\\*]+)?(\\s(<=|>=|<|=>)?([0-9]+)(\\.[0-9x\\*]+)?(\\.[0-9x\\*]+)?)?$" + "pattern": "^(<=|>=|<|>|=|~|\\^)?([0-9]+)(\\.[0-9x\\*]+)?(\\.[0-9x\\*]+)?(-[0-9A-Za-z-.]+)?(\\s(<=|>=|<|=>)?([0-9]+)(\\.[0-9x\\*]+)?(\\.[0-9x\\*]+)?(-[0-9A-Za-z-.]+)?)?$" }, "plugins": { "type": "array", diff --git a/docs/sources/observability-as-code/foundation-sdk/_index.md b/docs/sources/observability-as-code/foundation-sdk/_index.md index d6c52748f2e..a6fad7139fe 100644 --- a/docs/sources/observability-as-code/foundation-sdk/_index.md +++ b/docs/sources/observability-as-code/foundation-sdk/_index.md @@ -68,7 +68,7 @@ For other languages, refer to the Grafana Foundation SDK documentation for detai The following example demonstrates how you can create a simple dashboard using TypeScript: -```bash +```typescript import { DashboardBuilder, RowBuilder } from '@grafana/grafana-foundation-sdk/dashboard'; import { DataqueryBuilder } from '@grafana/grafana-foundation-sdk/prometheus'; import { PanelBuilder } from '@grafana/grafana-foundation-sdk/timeseries'; @@ -76,7 +76,7 @@ const builder = new DashboardBuilder('Sample Dashboard') .uid('sample-dashboard') .tags(['example', 'typescript']) .refresh('1m') - .time({from: 'now-30m', to: 'now'}) + .time({ from: 'now-30m', to: 'now' }) .timezone('browser') .withRow(new RowBuilder('Overview')) .withPanel( @@ -87,10 +87,9 @@ const builder = new DashboardBuilder('Sample Dashboard') .withTarget( new DataqueryBuilder() .expr('rate(node_network_receive_bytes_total{job="example-job", device!="lo"}[$__rate_interval]) * 8') - .legendFormat("{{ device }}") + .legendFormat('{{ device }}') ) - ) -; + ); console.log(JSON.stringify(builder.build(), null, 2)); ``` diff --git a/docs/sources/observability-as-code/get-started.md b/docs/sources/observability-as-code/get-started.md index 9ec4d4b949e..00b48501f95 100644 --- a/docs/sources/observability-as-code/get-started.md +++ b/docs/sources/observability-as-code/get-started.md @@ -84,5 +84,5 @@ If you're already using established Infrastructure as Code or other configuratio - Integrate with GitOps workflows for seamless version control and deployment. - [Crossplane](https://github.com/grafana/crossplane-provider-grafana) lets you manage Grafana resources using Kubernetes manifests with the Grafana Crossplane provider. -- [Grafonnet](https://github.com/grafana/grafonnet) is a Jsonnet library for generating Grafana dashboard JSON definitions programmatically. It is currently in the process of being deprecated. +- [Grafonnet](https://github.com/grafana/grafonnet) is a Jsonnet library for generating Grafana dashboard JSON definitions programmatically. - [Grizzly](https://grafana.com/docs/grafana-cloud/developer-resources/infrastructure-as-code/grizzly/dashboards-folders-datasources/) is a deprecated command-line tool that simplifies managing Grafana resources using Kubernetes-inspired YAML syntax. diff --git a/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md b/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md index 93a541a3843..0d2d76f4e52 100644 --- a/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md +++ b/docs/sources/setup-grafana/configure-grafana/feature-toggles/index.md @@ -21,68 +21,66 @@ For more information about feature release stages, refer to [Release life cycle Most [generally available](https://grafana.com/docs/release-life-cycle/#general-availability) features are enabled by default. You can disable these feature by setting the feature flag to "false" in the configuration. -| Feature toggle name | Description | Enabled by default | -| ----------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | ------------------ | -| `disableEnvelopeEncryption` | Disable envelope encryption (emergency only) | | -| `publicDashboardsScene` | Enables public dashboard rendering using scenes | Yes | -| `featureHighlights` | Highlight Grafana Enterprise features | | -| `correlations` | Correlations page | Yes | -| `cloudWatchCrossAccountQuerying` | Enables cross-account querying in CloudWatch datasources | Yes | -| `nestedFolders` | Enable folder nesting | Yes | -| `logsContextDatasourceUi` | Allow datasource to provide custom UI for context view | Yes | -| `lokiQuerySplitting` | Split large interval queries into subqueries with smaller time intervals | Yes | -| `influxdbBackendMigration` | Query InfluxDB InfluxQL without the proxy | Yes | -| `dataplaneFrontendFallback` | Support dataplane contract field name change for transformations and field name matchers where the name is different | Yes | -| `unifiedRequestLog` | Writes error logs to the request logger | Yes | -| `pluginsDetailsRightPanel` | Enables right panel for the plugins details page | Yes | -| `recordedQueriesMulti` | Enables writing multiple items from a single query within Recorded Queries | Yes | -| `logsExploreTableVisualisation` | A table visualisation for logs in Explore | Yes | -| `transformationsRedesign` | Enables the transformations redesign | Yes | -| `awsAsyncQueryCaching` | Enable caching for async queries for Redshift and Athena. Requires that the datasource has caching and async query support enabled | Yes | -| `angularDeprecationUI` | Display Angular warnings in dashboards and panels | Yes | -| `dashgpt` | Enable AI powered features in dashboards | Yes | -| `externalCorePlugins` | Allow core plugins to be loaded as external | Yes | -| `panelMonitoring` | Enables panel monitoring through logs and measurements | Yes | -| `formatString` | Enable format string transformer | Yes | -| `kubernetesClientDashboardsFolders` | Route the folder and dashboard service requests to k8s | Yes | -| `lokiStructuredMetadata` | Enables the loki data source to request structured metadata from the Loki server | Yes | -| `addFieldFromCalculationStatFunctions` | Add cumulative and window functions to the add field from calculation transformation | Yes | -| `annotationPermissionUpdate` | Change the way annotation permissions work by scoping them to folders and dashboards. | Yes | -| `dashboardSceneForViewers` | Enables dashboard rendering using Scenes for viewer roles | Yes | -| `dashboardSceneSolo` | Enables rendering dashboards using scenes for solo panels | Yes | -| `dashboardScene` | Enables dashboard rendering using scenes for all roles | Yes | -| `ssoSettingsApi` | Enables the SSO settings API and the OAuth configuration UIs in Grafana | Yes | -| `logsInfiniteScrolling` | Enables infinite scrolling for the Logs panel in Explore and Dashboards | Yes | -| `logRowsPopoverMenu` | Enable filtering menu displayed when text of a log line is selected | Yes | -| `lokiQueryHints` | Enables query hints for Loki | Yes | -| `alertingQueryOptimization` | Optimizes eligible queries in order to reduce load on datasources | | -| `onPremToCloudMigrations` | Enable the Grafana Migration Assistant, which helps you easily migrate various on-prem resources to your Grafana Cloud stack. | Yes | -| `groupToNestedTableTransformation` | Enables the group to nested table transformation | Yes | -| `newPDFRendering` | New implementation for the dashboard-to-PDF rendering | Yes | -| `tlsMemcached` | Use TLS-enabled memcached in the enterprise caching feature | Yes | -| `ssoSettingsSAML` | Use the new SSO Settings API to configure the SAML connector | Yes | -| `cloudWatchNewLabelParsing` | Updates CloudWatch label parsing to be more accurate | Yes | -| `newDashboardSharingComponent` | Enables the new sharing drawer design | Yes | -| `pluginProxyPreserveTrailingSlash` | Preserve plugin proxy trailing slash. | | -| `azureMonitorPrometheusExemplars` | Allows configuration of Azure Monitor as a data source that can provide Prometheus exemplars | Yes | -| `pinNavItems` | Enables pinning of nav items | Yes | -| `failWrongDSUID` | Throws an error if a data source has an invalid UIDs | Yes | -| `cloudWatchRoundUpEndTime` | Round up end time for metric queries to the next minute to avoid missing data | Yes | -| `newFiltersUI` | Enables new combobox style UI for the Ad hoc filters variable in scenes architecture | Yes | -| `alertingQueryAndExpressionsStepMode` | Enables step mode for alerting queries and expressions | Yes | -| `useSessionStorageForRedirection` | Use session storage for handling the redirection after login | Yes | -| `pluginsSriChecks` | Enables SRI checks for plugin assets | | -| `azureMonitorDisableLogLimit` | Disables the log limit restriction for Azure Monitor when true. The limit is enabled by default. | | -| `preinstallAutoUpdate` | Enables automatic updates for pre-installed plugins | Yes | -| `reportingUseRawTimeRange` | Uses the original report or dashboard time range instead of making an absolute transformation | Yes | -| `alertingUIOptimizeReducer` | Enables removing the reducer from the alerting UI when creating a new alert rule and using instant query | Yes | -| `azureMonitorEnableUserAuth` | Enables user auth for Azure Monitor datasource only | Yes | -| `alertingNotificationsStepMode` | Enables simplified step mode in the notifications section | Yes | -| `lokiLabelNamesQueryApi` | Defaults to using the Loki `/labels` API instead of `/series` | Yes | -| `grafanaManagedRecordingRulesDatasources` | Enables writing to data sources for Grafana-managed recording rules. | | -| `alertingMigrationUI` | Enables the alerting migration UI, to migrate data source-managed rules to Grafana-managed rules | Yes | -| `alertingImportYAMLUI` | Enables a UI feature for importing rules from a Prometheus file to Grafana-managed rules | Yes | -| `unifiedNavbars` | Enables unified navbars | | +| Feature toggle name | Description | Enabled by default | +| -------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | ------------------ | +| `disableEnvelopeEncryption` | Disable envelope encryption (emergency only) | | +| `publicDashboardsScene` | Enables public dashboard rendering using scenes | Yes | +| `featureHighlights` | Highlight Grafana Enterprise features | | +| `correlations` | Correlations page | Yes | +| `cloudWatchCrossAccountQuerying` | Enables cross-account querying in CloudWatch datasources | Yes | +| `nestedFolders` | Enable folder nesting | Yes | +| `logsContextDatasourceUi` | Allow datasource to provide custom UI for context view | Yes | +| `lokiQuerySplitting` | Split large interval queries into subqueries with smaller time intervals | Yes | +| `influxdbBackendMigration` | Query InfluxDB InfluxQL without the proxy | Yes | +| `dataplaneFrontendFallback` | Support dataplane contract field name change for transformations and field name matchers where the name is different | Yes | +| `unifiedRequestLog` | Writes error logs to the request logger | Yes | +| `pluginsDetailsRightPanel` | Enables right panel for the plugins details page | Yes | +| `recordedQueriesMulti` | Enables writing multiple items from a single query within Recorded Queries | Yes | +| `logsExploreTableVisualisation` | A table visualisation for logs in Explore | Yes | +| `transformationsRedesign` | Enables the transformations redesign | Yes | +| `awsAsyncQueryCaching` | Enable caching for async queries for Redshift and Athena. Requires that the datasource has caching and async query support enabled | Yes | +| `angularDeprecationUI` | Display Angular warnings in dashboards and panels | Yes | +| `dashgpt` | Enable AI powered features in dashboards | Yes | +| `externalCorePlugins` | Allow core plugins to be loaded as external | Yes | +| `panelMonitoring` | Enables panel monitoring through logs and measurements | Yes | +| `formatString` | Enable format string transformer | Yes | +| `kubernetesClientDashboardsFolders` | Route the folder and dashboard service requests to k8s | Yes | +| `lokiStructuredMetadata` | Enables the loki data source to request structured metadata from the Loki server | Yes | +| `addFieldFromCalculationStatFunctions` | Add cumulative and window functions to the add field from calculation transformation | Yes | +| `annotationPermissionUpdate` | Change the way annotation permissions work by scoping them to folders and dashboards. | Yes | +| `dashboardSceneForViewers` | Enables dashboard rendering using Scenes for viewer roles | Yes | +| `dashboardSceneSolo` | Enables rendering dashboards using scenes for solo panels | Yes | +| `dashboardScene` | Enables dashboard rendering using scenes for all roles | Yes | +| `ssoSettingsApi` | Enables the SSO settings API and the OAuth configuration UIs in Grafana | Yes | +| `logsInfiniteScrolling` | Enables infinite scrolling for the Logs panel in Explore and Dashboards | Yes | +| `logRowsPopoverMenu` | Enable filtering menu displayed when text of a log line is selected | Yes | +| `lokiQueryHints` | Enables query hints for Loki | Yes | +| `alertingQueryOptimization` | Optimizes eligible queries in order to reduce load on datasources | | +| `onPremToCloudMigrations` | Enable the Grafana Migration Assistant, which helps you easily migrate various on-prem resources to your Grafana Cloud stack. | Yes | +| `groupToNestedTableTransformation` | Enables the group to nested table transformation | Yes | +| `newPDFRendering` | New implementation for the dashboard-to-PDF rendering | Yes | +| `tlsMemcached` | Use TLS-enabled memcached in the enterprise caching feature | Yes | +| `ssoSettingsSAML` | Use the new SSO Settings API to configure the SAML connector | Yes | +| `cloudWatchNewLabelParsing` | Updates CloudWatch label parsing to be more accurate | Yes | +| `newDashboardSharingComponent` | Enables the new sharing drawer design | Yes | +| `pluginProxyPreserveTrailingSlash` | Preserve plugin proxy trailing slash. | | +| `azureMonitorPrometheusExemplars` | Allows configuration of Azure Monitor as a data source that can provide Prometheus exemplars | Yes | +| `pinNavItems` | Enables pinning of nav items | Yes | +| `failWrongDSUID` | Throws an error if a data source has an invalid UIDs | Yes | +| `cloudWatchRoundUpEndTime` | Round up end time for metric queries to the next minute to avoid missing data | Yes | +| `newFiltersUI` | Enables new combobox style UI for the Ad hoc filters variable in scenes architecture | Yes | +| `alertingQueryAndExpressionsStepMode` | Enables step mode for alerting queries and expressions | Yes | +| `useSessionStorageForRedirection` | Use session storage for handling the redirection after login | Yes | +| `pluginsSriChecks` | Enables SRI checks for plugin assets | | +| `azureMonitorDisableLogLimit` | Disables the log limit restriction for Azure Monitor when true. The limit is enabled by default. | | +| `preinstallAutoUpdate` | Enables automatic updates for pre-installed plugins | Yes | +| `alertingUIOptimizeReducer` | Enables removing the reducer from the alerting UI when creating a new alert rule and using instant query | Yes | +| `azureMonitorEnableUserAuth` | Enables user auth for Azure Monitor datasource only | Yes | +| `alertingNotificationsStepMode` | Enables simplified step mode in the notifications section | Yes | +| `lokiLabelNamesQueryApi` | Defaults to using the Loki `/labels` API instead of `/series` | Yes | +| `alertingMigrationUI` | Enables the alerting migration UI, to migrate data source-managed rules to Grafana-managed rules | Yes | +| `alertingImportYAMLUI` | Enables a UI feature for importing rules from a Prometheus file to Grafana-managed rules | Yes | +| `unifiedNavbars` | Enables unified navbars | | ## Public preview feature toggles diff --git a/docs/sources/setup-grafana/configure-security/_index.md b/docs/sources/setup-grafana/configure-security/_index.md index 54b45e67ed9..b03577d38dc 100644 --- a/docs/sources/setup-grafana/configure-security/_index.md +++ b/docs/sources/setup-grafana/configure-security/_index.md @@ -45,6 +45,16 @@ Self-hosted reverse proxy options include but are not limited to: - [NGINX](https://docs.nginx.com/nginx/) using their [guide on restricting access with HTTP basic authentication](https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-http-basic-authentication/) - [OAuth2 proxy](https://github.com/oauth2-proxy/oauth2-proxy) +### Configure CORS + +If you want to enable CORS for your Grafana instance, run Grafana behind a reverse proxy and configure the CORS headers in the reverse proxy. + +For more information, refer to [Run Grafana behind a reverse proxy](https://grafana.com/tutorials/run-grafana-behind-a-proxy/). + +{{< admonition type="note" >}} +Grafana doesn't recommend using wildcard values (`*`) as header values and recommends using a URL instead. +{{< /admonition >}} + ## Limit Viewer query permissions Users with the `Viewer role` can enter _any possible query_ in _any_ of the data sources available in the **organization**, not just the queries that are defined on the dashboards for which the user has Viewer permissions. diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/azuread/index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/azuread/index.md index bbaa685af3e..0b6cbec6a95 100644 --- a/docs/sources/setup-grafana/configure-security/configure-authentication/azuread/index.md +++ b/docs/sources/setup-grafana/configure-security/configure-authentication/azuread/index.md @@ -65,19 +65,53 @@ To enable the Azure AD/Entra ID OAuth, register your application with Entra ID. - **Federated credentials** - 1. Refer to [Configure an application to trust a managed identity (preview)](https://learn.microsoft.com/en-us/entra/workload-id/workload-identity-federation-config-app-trust-managed-identity?tabs=microsoft-entra-admin-center) for a complete guide on setting up a managed identity as a federated credential. - Add a new entry under Federated credentials with the following configuration. + - **_Managed Identity_** - - Federated credential scenario: Select **Other issuer**. - - Issuer: The OAuth 2.0 / OIDC issuer URL of the Microsoft Entra ID authority. For example: `https://login.microsoftonline.com/{tenantID}/v2.0`. - - Subject identifier: The Object (Principal) ID GUID of the Managed Identity. - - Name: A unique descriptive name for the credential. - - Description: Grafana OAuth. - - Audience: The audience value that must appear in the external token. For Public cloud, it would be `api://AzureADTokenExchange`. See mentioned documentation for the full list of available audiences. + 1. Refer to [Configure an application to trust a managed identity (preview)](https://learn.microsoft.com/en-us/entra/workload-id/workload-identity-federation-config-app-trust-managed-identity?tabs=microsoft-entra-admin-center) for a complete guide on setting up a managed identity as a federated credential. + Add a new entry under Federated credentials with the following configuration. - 1. Click **Add**, and then copy the Managed Identity Client ID and the federated credential Audience values. This is your OAuth 2.0 federated credential. + - Federated credential scenario: Select **Other issuer**. + - Issuer: The OAuth 2.0 / OIDC issuer URL of the Microsoft Entra ID authority. For example: `https://login.microsoftonline.com/{tenantID}/v2.0`. + - Subject identifier: The Object (Principal) ID GUID of the Managed Identity. + - Name: A unique descriptive name for the credential. + - Description: Grafana OAuth. + - Audience: The audience value that must appear in the external token. For Public cloud, it would be `api://AzureADTokenExchange`. See mentioned documentation for the full list of available audiences. - 1. You must have set `client_authentication` under `[auth.azuread]` to `managed_identity` in the Grafana server configuration for this to work. + 1. Click **Add**, and then copy the Managed Identity Client ID and the federated credential Audience values. This is your OAuth 2.0 federated credential. + + 1. You must have set `client_authentication` under `[auth.azuread]` to `managed_identity` in the Grafana server configuration for this to work. + + {{< admonition type="note" >}} + Managed identities as federated credentials are only applicable to workloads hosted in Azure. + + You can only add user-assigned managed identities as federated credentials on Entra ID applications. + {{< /admonition >}} + + - **_Workload Identity (K8s/AKS)_** + + 1. Refer to [Federated identity credential for an Azure AD application](https://azure.github.io/azure-workload-identity/docs/topics/federated-identity-credential.html#azure-portal-ui) for a complete guide on setting up a federated credential for workload identity. + Add a new entry under Federated credentials with the following configuration. + + - Federated credential scenario: Select **Kubernetes accessing Azure resources**. + - [Cluster issuer URL](https://learn.microsoft.com/en-us/azure/aks/use-oidc-issuer#get-the-oidc-issuer-url): The OIDC issuer URL that your cluster is integrated with. For example: `https://{region}.oic.prod-aks.azure.com/{tenant_id}/{uuid}`. + - Namespace: Namespace of your Grafana deployment. For example: `grafana`. + - Service account name: Service account name of your Grafana deployment. For example: `grafana`. + - Subject identifier: The expected identity (subject claim) from the OIDC token, which Azure uses to validate and authorize token issuance to the requesting workload. For example: `system:serviceaccount:grafana:grafana`. + - Name: A unique descriptive name for the credential. + - Description: Grafana OAuth. + - Audience: The audience value that must appear in the external token. For Public cloud, it would be `api://AzureADTokenExchange`. See mentioned documentation for the full list of available audiences. + + 1. You must have set `client_authentication` (env var `GF_AUTH_AZUREAD_CLIENT_AUTHENTICATION`) under `[auth.azuread]` to `workload_identity` in the Grafana server configuration for this to work. + + 1. You may optionally set `workload_identity_token_file` (env var `GF_AUTH_AZUREAD_WORKLOAD_IDENTITY_TOKEN_FILE`) under `[auth.azuread]` to `/var/run/secrets/azure/tokens/azure-identity-token` in the Grafana server configuration for this to work. (Optional, defaults to `/var/run/secrets/azure/tokens/azure-identity-token`) + + 1. You must have set `client_id` (env var `GF_AUTH_AZUREAD_CLIENT_ID`) under `[auth.azuread]` in the Grafana server configuration for this to work. This must match the Entra ID/Azure AD App Registration Application (client) ID. + + 1. You must have set `token_url` (env var `GF_AUTH_AZUREAD_TOKEN_URL`) under `[auth.azuread]` to `https://login.microsoftonline.com/{tenantID}/oauth2/v2.0/token` in the Grafana server configuration for this to work. + + 1. You must have set `auth_url` (env var `GF_AUTH_AZUREAD_AUTH_URL`) under `[auth.azuread]` to `https://login.microsoftonline.com/{tenantID}/oauth2/v2.0/authorize` in the Grafana server configuration for this to work. + + 1. You must have set `federated_credential_audience` (env var `GF_AUTH_AZUREAD_FEDERATED_CREDENTIAL_AUDIENCE`) under `[auth.azuread]` to `api://AzureADTokenExchange` in the Grafana server configuration for this to work. {{< admonition type="note" >}} Managed identities as federated credentials are only applicable to workloads hosted in Azure. @@ -498,32 +532,35 @@ skip_org_role_sync = true The following table outlines the various Azure AD/Entra ID configuration options. You can apply these options as environment variables, similar to any other configuration within Grafana. For more information, refer to [Override configuration with environment variables](../../../configure-grafana/#override-configuration-with-environment-variables). -| Setting | Required | Supported on Cloud | Description | Default | -| ---------------------------- | -------- | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------- | -| `enabled` | No | Yes | Enables Azure AD/Entra ID authentication. | `false` | -| `name` | No | Yes | Name that refers to the Azure AD/Entra ID authentication from the Grafana user interface. | `OAuth` | -| `icon` | No | Yes | Icon used for the Azure AD/Entra ID authentication in the Grafana user interface. | `signin` | -| `client_id` | Yes | Yes | Client ID of the App (`Application (client) ID` on the **App registration** dashboard). | | -| `client_secret` | Yes | Yes | Client secret of the App. | | -| `auth_url` | Yes | Yes | Authorization endpoint of the Azure AD/Entra ID OAuth2 provider. | | -| `token_url` | Yes | Yes | Endpoint used to obtain the OAuth2 access token. | | -| `auth_style` | No | Yes | Name of the [OAuth2 AuthStyle](https://pkg.go.dev/golang.org/x/oauth2#AuthStyle) to be used when ID token is requested from OAuth2 provider. It determines how `client_id` and `client_secret` are sent to Oauth2 provider. Available values are `AutoDetect`, `InParams` and `InHeader`. | `AutoDetect` | -| `scopes` | No | Yes | List of comma- or space-separated OAuth2 scopes. | `openid email profile` | -| `allow_sign_up` | No | Yes | Controls Grafana user creation through the Azure AD/Entra ID login. Only existing Grafana users can log in with Azure AD/Entra ID if set to `false`. | `true` | -| `auto_login` | No | Yes | Set to `true` to enable users to bypass the login screen and automatically log in. This setting is ignored if you configure multiple auth providers to use auto-login. | `false` | -| `role_attribute_strict` | No | Yes | Set to `true` to deny user login if the Grafana org role cannot be extracted using `role_attribute_path` or `org_mapping`. For more information on user role mapping, refer to [Map roles](#map-roles). | `false` | -| `org_attribute_path` | No | No | [JMESPath](http://jmespath.org/examples.html) expression to use for Grafana org to role lookup. Grafana will first evaluate the expression using the OAuth2 ID token. If no value is returned, the expression will be evaluated using the user information obtained from the UserInfo endpoint. The result of the evaluation will be mapped to org roles based on `org_mapping`. For more information on org to role mapping, refer to [Org roles mapping example](#org-roles-mapping-example). | | -| `org_mapping` | No | No | List of comma- or space-separated `::` mappings. Value can be `*` meaning "All users". Role is optional and can have the following values: `None`, `Viewer`, `Editor` or `Admin`. For more information on external organization to role mapping, refer to [Org roles mapping example](#org-roles-mapping-example). | | -| `allow_assign_grafana_admin` | No | No | Set to `true` to automatically sync the Grafana server administrator role. When enabled, if the Azure AD/Entra ID user's App role is `GrafanaAdmin`, Grafana grants the user server administrator privileges and the organization administrator role. If disabled, the user will only receive the organization administrator role. For more details on user role mapping, refer to [Map roles](#map-roles). | `false` | -| `skip_org_role_sync` | No | Yes | Set to `true` to stop automatically syncing user roles. This will allow you to set organization roles for your users from within Grafana manually. | `false` | -| `allowed_groups` | No | Yes | List of comma- or space-separated groups. The user should be a member of at least one group to log in. If you configure `allowed_groups`, you must also configure Azure AD/Entra ID to include the `groups` claim following [Configure group membership claims on the Azure Portal](#configure-group-membership-claims-on-the-azure-portal). | | -| `allowed_organizations` | No | Yes | List of comma- or space-separated Azure tenant identifiers. The user should be a member of at least one tenant to log in. | | -| `allowed_domains` | No | Yes | List of comma- or space-separated domains. The user should belong to at least one domain to log in. | | -| `tls_skip_verify_insecure` | No | No | If set to `true`, the client accepts any certificate presented by the server and any host name in that certificate. _You should only use this for testing_, because this mode leaves SSL/TLS susceptible to man-in-the-middle attacks. | `false` | -| `tls_client_cert` | No | No | The path to the certificate. | | -| `tls_client_key` | No | No | The path to the key. | | -| `tls_client_ca` | No | No | The path to the trusted certificate authority list. | | -| `use_pkce` | No | Yes | Set to `true` to use [Proof Key for Code Exchange (PKCE)](https://datatracker.ietf.org/doc/html/rfc7636). Grafana uses the SHA256 based `S256` challenge method and a 128 bytes (base64url encoded) code verifier. | `true` | -| `use_refresh_token` | No | Yes | Enables the use of refresh tokens and checks for access token expiration. When enabled, Grafana automatically adds the `offline_access` scope to the list of scopes. | `true` | -| `force_use_graph_api` | No | Yes | Set to `true` to always fetch groups from the Microsoft Graph API instead of the `id_token`. If a user belongs to more than 200 groups, the Microsoft Graph API will be used to retrieve the groups regardless of this setting. | `false` | -| `signout_redirect_url` | No | Yes | URL to redirect to after the user logs out. | | +| Setting | Required | Supported on Cloud | Description | Default | +| ------------------------------- | -------- | ------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------- | +| `enabled` | No | Yes | Enables Azure AD/Entra ID authentication. | `false` | +| `name` | No | Yes | Name that refers to the Azure AD/Entra ID authentication from the Grafana user interface. | `OAuth` | +| `icon` | No | Yes | Icon used for the Azure AD/Entra ID authentication in the Grafana user interface. | `signin` | +| `client_authentication` | Yes | Yes | Defines the client authentication method used to authenticate to the token endpoint. Supported values: `none`, `client_secret_post`, `managed_identity`, or `workload_identity`. | | +| `workload_identity_token_file` | No | Yes | The path to the token file used to authenticate to the OAuth2 provider. This is only required when `client_authentication` is set to `workload_identity`. The token file contains the service account token projected by Kubernetes. | `/var/run/secrets/azure/tokens/azure-identity-token` | +| `federated_credential_audience` | No | Yes | The audience of the federated identity credential of your OAuth2 app. Required when `client_authentication` is set to `managed_identity` or `workload_identity`. For public cloud, this is typically `api://AzureADTokenExchange`. | `api://AzureADTokenExchange` | +| `client_id` | Yes | Yes | Client ID of the App (`Application (client) ID` on the **App registration** dashboard). | | +| `client_secret` | Yes | Yes | Client secret of the App. | | +| `auth_url` | Yes | Yes | Authorization endpoint of the Azure AD/Entra ID OAuth2 provider. | | +| `token_url` | Yes | Yes | Endpoint used to obtain the OAuth2 access token. | | +| `auth_style` | No | Yes | Name of the [OAuth2 AuthStyle](https://pkg.go.dev/golang.org/x/oauth2#AuthStyle) to be used when ID token is requested from OAuth2 provider. It determines how `client_id` and `client_secret` are sent to Oauth2 provider. Available values are `AutoDetect`, `InParams` and `InHeader`. | `AutoDetect` | +| `scopes` | No | Yes | List of comma- or space-separated OAuth2 scopes. | `openid email profile` | +| `allow_sign_up` | No | Yes | Controls Grafana user creation through the Azure AD/Entra ID login. Only existing Grafana users can log in with Azure AD/Entra ID if set to `false`. | `true` | +| `auto_login` | No | Yes | Set to `true` to enable users to bypass the login screen and automatically log in. This setting is ignored if you configure multiple auth providers to use auto-login. | `false` | +| `role_attribute_strict` | No | Yes | Set to `true` to deny user login if the Grafana org role cannot be extracted using `role_attribute_path` or `org_mapping`. For more information on user role mapping, refer to [Map roles](#map-roles). | `false` | +| `org_attribute_path` | No | No | [JMESPath](http://jmespath.org/examples.html) expression to use for Grafana org to role lookup. Grafana will first evaluate the expression using the OAuth2 ID token. If no value is returned, the expression will be evaluated using the user information obtained from the UserInfo endpoint. The result of the evaluation will be mapped to org roles based on `org_mapping`. For more information on org to role mapping, refer to [Org roles mapping example](#org-roles-mapping-example). | | +| `org_mapping` | No | No | List of comma- or space-separated `::` mappings. Value can be `*` meaning "All users". Role is optional and can have the following values: `None`, `Viewer`, `Editor` or `Admin`. For more information on external organization to role mapping, refer to [Org roles mapping example](#org-roles-mapping-example). | | +| `allow_assign_grafana_admin` | No | No | Set to `true` to automatically sync the Grafana server administrator role. When enabled, if the Azure AD/Entra ID user's App role is `GrafanaAdmin`, Grafana grants the user server administrator privileges and the organization administrator role. If disabled, the user will only receive the organization administrator role. For more details on user role mapping, refer to [Map roles](#map-roles). | `false` | +| `skip_org_role_sync` | No | Yes | Set to `true` to stop automatically syncing user roles. This will allow you to set organization roles for your users from within Grafana manually. | `false` | +| `allowed_groups` | No | Yes | List of comma- or space-separated groups. The user should be a member of at least one group to log in. If you configure `allowed_groups`, you must also configure Azure AD/Entra ID to include the `groups` claim following [Configure group membership claims on the Azure Portal](#configure-group-membership-claims-on-the-azure-portal). | | +| `allowed_organizations` | No | Yes | List of comma- or space-separated Azure tenant identifiers. The user should be a member of at least one tenant to log in. | | +| `allowed_domains` | No | Yes | List of comma- or space-separated domains. The user should belong to at least one domain to log in. | | +| `tls_skip_verify_insecure` | No | No | If set to `true`, the client accepts any certificate presented by the server and any host name in that certificate. _You should only use this for testing_, because this mode leaves SSL/TLS susceptible to man-in-the-middle attacks. | `false` | +| `tls_client_cert` | No | No | The path to the certificate. | | +| `tls_client_key` | No | No | The path to the key. | | +| `tls_client_ca` | No | No | The path to the trusted certificate authority list. | | +| `use_pkce` | No | Yes | Set to `true` to use [Proof Key for Code Exchange (PKCE)](https://datatracker.ietf.org/doc/html/rfc7636). Grafana uses the SHA256 based `S256` challenge method and a 128 bytes (base64url encoded) code verifier. | `true` | +| `use_refresh_token` | No | Yes | Enables the use of refresh tokens and checks for access token expiration. When enabled, Grafana automatically adds the `offline_access` scope to the list of scopes. | `true` | +| `force_use_graph_api` | No | Yes | Set to `true` to always fetch groups from the Microsoft Graph API instead of the `id_token`. If a user belongs to more than 200 groups, the Microsoft Graph API will be used to retrieve the groups regardless of this setting. | `false` | +| `signout_redirect_url` | No | Yes | URL to redirect to after the user logs out. | | diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/generic-oauth/index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/generic-oauth/index.md index 7867cb4767b..17305e59a3f 100644 --- a/docs/sources/setup-grafana/configure-security/configure-authentication/generic-oauth/index.md +++ b/docs/sources/setup-grafana/configure-security/configure-authentication/generic-oauth/index.md @@ -209,6 +209,10 @@ You can use the `org_attribute_path` and `org_mapping` configuration options to To ease configuration of a proper JMESPath expression, go to [JMESPath](http://jmespath.org/) to test and evaluate expressions with custom payloads. +{{< admonition type="note" >}} +When using `org_attribute_path`, the value returned by the JMESPath expression must be an array, not a string. +{{< /admonition >}} + #### Role mapping examples This section includes examples of JMESPath expressions used for role mapping. diff --git a/docs/sources/setup-grafana/configure-security/configure-authentication/keycloak/index.md b/docs/sources/setup-grafana/configure-security/configure-authentication/keycloak/index.md index e73bae66348..f6c1a496f42 100644 --- a/docs/sources/setup-grafana/configure-security/configure-authentication/keycloak/index.md +++ b/docs/sources/setup-grafana/configure-security/configure-authentication/keycloak/index.md @@ -147,7 +147,7 @@ To enable Single Logout, you need to add the following option to the configurati ```ini [auth.generic_oauth] -signout_redirect_url = https:///auth/realms//protocol/openid-connect/logout?post_logout_redirect_uri=https%3A%2F%2F%2Flogin +signout_redirect_url = https:///realms//protocol/openid-connect/logout?post_logout_redirect_uri=https%3A%2F%2F%2Flogin ``` As an example, `` can be `keycloak-demo.grafana.org`, diff --git a/docs/sources/setup-grafana/configure-security/configure-scim-provisioning/_index.md b/docs/sources/setup-grafana/configure-security/configure-scim-provisioning/_index.md index d00e99cface..99deb0331b5 100644 --- a/docs/sources/setup-grafana/configure-security/configure-scim-provisioning/_index.md +++ b/docs/sources/setup-grafana/configure-security/configure-scim-provisioning/_index.md @@ -85,7 +85,7 @@ The table below describes all SCIM configuration options. Like any other Grafana - SCIM group sync (`group_sync_enabled = true`) and Team Sync cannot be enabled simultaneously - You can use SCIM user sync (`user_sync_enabled = true`) alongside Team Sync -- For more details about migration and compatibility, see [SCIM vs Team Sync](./manage-users-teams/_index.md#scim-vs-team-sync) +- For more details about migration and compatibility, see [SCIM vs Team Sync](https://grafana.com/docs/grafana//setup-grafana/configure-security/configure-scim-provisioning/manage-users-teams/#scim-vs-team-sync) {{< /admonition >}} ### Example SCIM configuration @@ -134,5 +134,5 @@ The following table compares SCIM with other synchronization methods to help you ## Next steps - [Manage users and teams with SCIM provisioning](manage-users-teams/) -- [Configure SCIM with Azure AD](azuread/) -- [Configure SCIM with Okta](okta/) +- [Configure SCIM with Azure AD](https://grafana.com/docs/grafana//setup-grafana/configure-security/configure-scim-provisioning/configure-scim-with-azuread/) +- [Configure SCIM with Okta](https://grafana.com/docs/grafana//setup-grafana/configure-security/configure-scim-provisioning/configure-scim-with-okta/) diff --git a/docs/sources/shared/alerts/alerting_provisioning.md b/docs/sources/shared/alerts/alerting_provisioning.md index 2e6ef9a905b..4628dbfee0f 100644 --- a/docs/sources/shared/alerts/alerting_provisioning.md +++ b/docs/sources/shared/alerts/alerting_provisioning.md @@ -382,17 +382,16 @@ By default, you cannot edit API-provisioned alerting resources in Grafana. To enable editing these resources in the Grafana UI, add the **`X-Disable-Provenance: true`** header to the following API requests: -- `POST /api/v1/provisioning/alert-rules` -- `PUT /api/v1/provisioning/folder/{FolderUID}/rule-groups/{Group}` _(This endpoint changes provenance for all alert rules in the alert group)_ - -- `POST /api/v1/provisioning/contact-points` -- `POST /api/v1/provisioning/mute-timings` -- `PUT /api/v1/provisioning/templates/{name}` -- `PUT /api/v1/provisioning/policies` +- [`PUT /api/v1/provisioning/folder/{FolderUID}/rule-groups/{Group}`](#route-put-alert-rule-group): This action also sets the provenance for the rule group and all its alert rules. +- [`POST /api/v1/provisioning/alert-rules`](#route-post-alert-rule): The provenance of the new alert rule must match the provenance value configured for its rule group. +- [`POST /api/v1/provisioning/contact-points`](##route-post-contactpoints) +- [`POST /api/v1/provisioning/mute-timings`](#route-post-mute-timing) +- [`PUT /api/v1/provisioning/templates/{name}`](#route-put-template) +- [`PUT /api/v1/provisioning/policies`](#route-put-policy-tree) To reset the notification policy tree to the default and unlock it for editing in the Grafana UI, use: -- `DELETE /api/v1/provisioning/policies` +- [`DELETE /api/v1/provisioning/policies`](#route-reset-policy-tree) ## Data source-managed resources @@ -1080,6 +1079,10 @@ Status: OK POST /api/v1/provisioning/alert-rules ``` +This action creates a new alert rule. + +The provenance (`X-Disable-Provenance`) of the new rule must match the provenance configured for its rule group. Mixing provisioned and unprovisioned alert rules within the same rule group is not allowed. + #### Parameters {{% responsive-table %}} @@ -1251,16 +1254,18 @@ Status: Bad Request PUT /api/v1/provisioning/folder/:folderUid/rule-groups/:group ``` +This action also changes the provenance setting (`X-Disable-Provenance`) for all alert rules in the alert group. + #### Parameters {{% responsive-table %}} -| Name | Source | Type | Go type | Required | Default | Description | -| ---------------------------- | ------ | ----------------------------------- | ----------------------- | :------: | ------- | ------------------------------------------------------------------------------------------------------- | -| `FolderUID` | path | string | string | ✓ | | | -| `Group` | path | string | string | ✓ | | | -| `X-Disable-Provenance: true` | header | string | string | | | Allows editing of provisioned resources in the Grafana UI | -| `Body` | body | [AlertRuleGroup](#alert-rule-group) | `models.AlertRuleGroup` | | | This action is idempotent and rules included in this body will overwrite configured rules for the group | +| Name | Source | Type | Go type | Required | Default | Description | +| ---------------------------- | ------ | ----------------------------------- | ----------------------- | :------: | ------- | ----------------------------------------------------------------------------------------------------------------------- | +| `FolderUID` | path | string | string | ✓ | | | +| `Group` | path | string | string | ✓ | | | +| `X-Disable-Provenance: true` | header | string | string | | | Allows editing of provisioned resources in the Grafana UI. This also applies to all alert rules within the alert group. | +| `Body` | body | [AlertRuleGroup](#alert-rule-group) | `models.AlertRuleGroup` | | | This action is idempotent and rules included in this body will overwrite configured rules for the group | {{% /responsive-table %}} diff --git a/docs/sources/shared/alerts/math-example.md b/docs/sources/shared/alerts/math-example.md new file mode 100644 index 00000000000..05c29f2cd2a --- /dev/null +++ b/docs/sources/shared/alerts/math-example.md @@ -0,0 +1,10 @@ +--- +labels: + products: + - oss +title: 'Math example' +--- + +- `$A` returns series `{host="web01"} 30` and `{host="web02"} 20`. +- `$B` returns series `{host="web01"} 10` and `{host="web02"} 0`. +- `$A + $B` returns `{host="web01"} 40` and `{host="web02"} 20`. diff --git a/docs/sources/shared/alerts/note-dynamic-labels.md b/docs/sources/shared/alerts/note-dynamic-labels.md index d657c4249a6..cf8b34820fe 100644 --- a/docs/sources/shared/alerts/note-dynamic-labels.md +++ b/docs/sources/shared/alerts/note-dynamic-labels.md @@ -5,10 +5,4 @@ labels: title: 'Note Dynamic labels' --- -{{% admonition type="note" %}} - -An alert instance is uniquely identified by its set of labels. - -- Avoid displaying query values in labels, as this can create numerous alert instances—one for each distinct label set. Instead, use annotations for query values. -- If a templated label's value changes, it maps to a different alert instance, and the previous instance transitions to the `No data` state when its label value is no longer present. - {{% /admonition %}} +Pending diff --git a/docs/sources/tutorials/alerting-get-started-pt2/index.md b/docs/sources/tutorials/alerting-get-started-pt2/index.md index 3beabdf0369..8559c75b8c7 100644 --- a/docs/sources/tutorials/alerting-get-started-pt2/index.md +++ b/docs/sources/tutorials/alerting-get-started-pt2/index.md @@ -2,7 +2,7 @@ Feedback Link: https://github.com/grafana/tutorials/issues/new categories: - alerting -description: Learn to use alert instances and route notifications by labels to contacts, building on your alerting skills in Grafana for more advanced workflows — Part 2. +description: Learn to use alert instances and route notifications by labels to contacts. labels: products: - enterprise @@ -10,20 +10,18 @@ labels: - cloud tags: - beginner -title: Get started with Grafana Alerting - Part 2 -weight: 50 +title: Get started with Grafana Alerting - Multi-dimensional alerts and how to route them +weight: 63 killercoda: - title: Get started with Grafana Alerting - Part 2 - description: Learn to use alert instances and route notifications by labels to contacts, building on your alerting skills in Grafana for more advanced workflows — Part 2. + title: Get started with Grafana Alerting - Multi-dimensional alerts and how to route them + description: Learn to use alert instances and route notifications by labels to contacts. backend: imageid: ubuntu --- -# Get started with Grafana Alerting - Part 2 - -The Get started with Grafana Alerting tutorial Part 2 is a continuation of [Get started with Grafana Alerting tutorial Part 1](http://www.grafana.com/tutorials/alerting-get-started/). +This tutorial is a continuation of the [Grafana Alerting - Create and receive your first alert](http://www.grafana.com/tutorials/alerting-get-started/) tutorial. In this guide, we dig into more complex yet equally fundamental elements of Grafana Alerting: **alert instances** and **notification policies**. @@ -58,7 +56,7 @@ There are different ways you can follow along with this tutorial. - **Interactive learning environment** - - Alternatively, you can try out this example in our interactive learning environment: [Get started with Grafana Alerting - Part 2](https://killercoda.com/grafana-labs/course/grafana/alerting-get-started-pt2/). It's a fully configured environment with all the dependencies already installed. + - Alternatively, you can try out this example in our interactive learning environment: [Get started with Grafana Alerting - Alert routing](https://killercoda.com/grafana-labs/course/grafana/alerting-get-started-pt2/). It's a fully configured environment with all the dependencies already installed. - **Grafana OSS** @@ -223,7 +221,7 @@ The alert rule that you are about to create is meant to monitor web traffic page ### Create an alert rule 1. Navigate to **Alerts & IRM > Alerting > Alert rules**. -1. Click **New alert rule**. +1. Click **+ New alert rule**. ### Enter an alert rule name @@ -249,7 +247,7 @@ Grafana includes a [test data source](https://grafana.com/docs/grafana/latest/da 1. In the **Alert condition** section: - - Keep `Last` as the value for the reducer function (`WHEN`), and `1000` as the threshold value. This is the value above which the alert rule should trigger. + - Keep `Last` as the value for the reducer function (`WHEN`), and `IS ABOVE 1000` as the threshold value. This is the value above which the alert rule should trigger. 1. Click **Preview alert rule condition** to run the queries. @@ -270,15 +268,16 @@ In the [life cycle](http://grafana.com/docs/grafana/next/alerting/fundamentals/a To set up evaluation behavior: -1. In **Evaluation group and interval**, repeat the above step to create a new evaluation group. Name it `1m` (referring to “1 minute”). +1. In the **Evaluation group and interval**, enter a name. For example:  `1m-evaluation`. 1. Choose an **Evaluation interval** (how often the alert will be evaluated). Choose `1m`. 1. Set the **pending period** to `0s` (zero seconds), so the alert rule fires the moment the condition is met. +1. Set **Keep firing for** to, `0s`, so the alert stops firing immediately after the condition is no longer true. ### Configure notifications In this section, you can select how you want to route your alert instances. Since we want to route by notification policy, we need to ensure that the labels match the alert instance. -1. Choose **Use notification policy**. +1. Toggle the **Advanced options** button to display matching Notification policies. 1. Click **Preview routing**. Based on the existing labels, you should see a preview of what policies are matching with the alerts. There should be two alert instances matching the labels that were previously setup in each notification policy: `device=desktop`, `device=mobile`. These [types of labels](https://grafana.com/docs/grafana/latest/alerting/fundamentals/alert-rules/annotation-label/#label-types) are generated by the data source query and they can be leveraged to match our notification policies without needing to manually add them to the alert rule. @@ -322,13 +321,13 @@ In this tutorial, you have learned how Grafana Alerting can route individual ale If you run into any problems, you are welcome to post questions in our [Grafana Community forum](https://community.grafana.com/). -## Learn more in [Grafana Alerting Part 3](http://www.grafana.com/tutorials/alerting-get-started-pt3/) +## Learn more in [Grafana Alerting: Group alert notifications](http://www.grafana.com/tutorials/alerting-get-started-pt3/) {{< admonition type="tip" >}} -In [Get started with Grafana Alerting - Part 3](http://www.grafana.com/tutorials/alerting-get-started-pt3/) you learn how to group alert notifications effectively. +In [Get started with Grafana Alerting: Group alert notifications](http://www.grafana.com/tutorials/alerting-get-started-pt3/) you learn how to group alert notifications effectively. {{< /admonition >}} @@ -336,7 +335,7 @@ In [Get started with Grafana Alerting - Part 3](http://www.grafana.com/tutorials {{< docs/ignore >}} -In [Get started with Grafana Alerting - Part 3](http://www.grafana.com/tutorials/alerting-get-started-pt3/) you learn how to group alert notifications effectively. +In [Get started with Grafana Alerting: Group alert notifications](http://www.grafana.com/tutorials/alerting-get-started-pt3/) you learn how to group alert notifications effectively. {{< /docs/ignore >}} diff --git a/docs/sources/tutorials/alerting-get-started-pt3/index.md b/docs/sources/tutorials/alerting-get-started-pt3/index.md index e2c29a3acab..c03c6c0bb8f 100644 --- a/docs/sources/tutorials/alerting-get-started-pt3/index.md +++ b/docs/sources/tutorials/alerting-get-started-pt3/index.md @@ -2,7 +2,7 @@ Feedback Link: https://github.com/grafana/tutorials/issues/new categories: - alerting -description: Learn how to group alert notifications effectively to reduce noise and streamline communication in Grafana Alerting — Part 3. +description: Learn how to group alert notifications effectively to reduce noise and streamline communication in Grafana Alerting. labels: products: - enterprise @@ -10,11 +10,11 @@ labels: - cloud tags: - intermediate -title: Get started with Grafana Alerting - Part 3 -weight: 60 +title: Get started with Grafana Alerting - Group alert notifications +weight: 64 killercoda: - title: Get started with Grafana Alerting - Part 3 - description: Learn how to group alert notifications effectively to reduce noise and streamline communication in Grafana Alerting — Part 3. + title: Get started with Grafana Alerting - Group alert notifications + description: Learn how to group alert notifications effectively to reduce noise and streamline communication in Grafana Alerting. backend: imageid: ubuntu refs: @@ -37,9 +37,7 @@ refs: -# Get started with Grafana Alerting - Part 3 - -The Get started with Grafana Alerting tutorial Part 3 is a continuation of [Get started with Grafana Alerting tutorial Part 2](http://www.grafana.com/tutorials/alerting-get-started-pt2/). +This tutorial is a continuation of the [Get started with Grafana Alerting - Alert routing](http://www.grafana.com/tutorials/alerting-get-started-pt2/) tutorial. Grouping in Grafana Alerting reduces notification noise by combining related alert instances into a single, concise notification. This is useful for on-call engineers, ensuring they focus on resolving incidents instead of sorting through a flood of notifications. @@ -77,7 +75,7 @@ There are different ways you can follow along with this tutorial. - **Interactive learning environment** - - Alternatively, you can try out this example in our interactive learning environment: [Get started with Grafana Alerting - Part 3](https://killercoda.com/grafana-labs/course/grafana/alerting-get-started-pt3/). It's a fully configured environment with all the dependencies already installed. + - Alternatively, you can try out this example in our interactive learning environment: [Get started with Grafana Alerting - Grouping](https://killercoda.com/grafana-labs/course/grafana/alerting-get-started-pt3/). It's a fully configured environment with all the dependencies already installed. - **Grafana OSS** @@ -339,7 +337,7 @@ Following the above example, [notification policies](ref:notification-policies) In this section we configure an alert rule based on our application monitoring example. 1. Navigate to **Alerts & IRM > Alerting > Alert rules**. -2. Click **New alert rule**. +2. Click **+ New alert rule**. ### Enter an alert rule name @@ -375,7 +373,7 @@ Grafana includes a [test data source](https://grafana.com/docs/grafana/latest/da 1. In the **Alert condition** section: - - Keep `Last` as the value for the reducer function (`WHEN`), and `75` as the threshold value. This is the value above which the alert rule should trigger. + - Keep `Last` as the value for the reducer function (`WHEN`), and `IS ABOVE 75` as the threshold value. This is the value above which the alert rule should trigger. 1. Click **Preview alert rule condition** to run the queries. @@ -391,9 +389,10 @@ Grafana includes a [test data source](https://grafana.com/docs/grafana/latest/da Every alert rule is assigned to an evaluation group. You can assign the alert rule to an existing evaluation group or create a new one. -1. In the **Evaluation group and interval**, repeat the above step to create a new evaluation group. Name it `Multi-region group`. +1. In the **Evaluation group and interval**, enter a name. For example: `Multi-region group`. 1. Choose an **Evaluation interval** (how often the alert are evaluated). Choose `1m`. 1. Set the **pending period** to `0s` (zero seconds), so the alert rule fires the moment the condition is met (this minimizes the waiting time for the demonstration). +1. Set **Keep firing for** to, `0s`, so the alert stops firing immediately after the condition is no longer true. ### Configure notifications @@ -511,13 +510,13 @@ _Detail of memory alert instances grouped into a separate notification for us-ea By configuring **notification policies** and using **labels** (such as _region_), you can group alert notifications based on specific criteria and route them to the appropriate teams. Fine-tuning **timing options**—including group wait, group interval, and repeat interval—further can reduce noise and ensures notifications remain actionable without overwhelming on-call engineers. -## Learn more in [Grafana Alerting Part 4](http://www.grafana.com/tutorials/alerting-get-started-pt4/) +## Learn more in [Grafana Alerting: Template your alert notifications](http://www.grafana.com/tutorials/alerting-get-started-pt4/) {{< admonition type="tip" >}} -In [Get started with Grafana Alerting - Part 4](http://www.grafana.com/tutorials/alerting-get-started-pt4/) you learn how to use templates to create customized and concise notifications. +In [Get started with Grafana Alerting: Template your alert notifications](http://www.grafana.com/tutorials/alerting-get-started-pt4/) you learn how to use templates to create customized and concise notifications. {{< /admonition >}} @@ -525,7 +524,7 @@ In [Get started with Grafana Alerting - Part 4](http://www.grafana.com/tutorials {{< docs/ignore >}} -In [Get started with Grafana Alerting - Part 4](http://www.grafana.com/tutorials/alerting-get-started-pt4/) you learn how to use templates to create customized and concise notifications. +In [Get started with Grafana Alerting: Template your alert notifications](http://www.grafana.com/tutorials/alerting-get-started-pt4/) you learn how to use templates to create customized and concise notifications. {{< /docs/ignore >}} diff --git a/docs/sources/tutorials/alerting-get-started-pt4/index.md b/docs/sources/tutorials/alerting-get-started-pt4/index.md index 1b480d375b8..ce34258da51 100644 --- a/docs/sources/tutorials/alerting-get-started-pt4/index.md +++ b/docs/sources/tutorials/alerting-get-started-pt4/index.md @@ -2,7 +2,7 @@ Feedback Link: https://github.com/grafana/tutorials/issues/new categories: - alerting -description: Learn how to use templates to create customized and concise notifications — Part 4 +description: Learn how to use templates to create customized and concise notifications. labels: products: - enterprise @@ -10,11 +10,11 @@ labels: - cloud tags: - intermediate -title: Get started with Grafana Alerting - Part 4 -weight: 60 +title: Get started with Grafana Alerting - Template your alert notifications +weight: 65 killercoda: - title: Get started with Grafana Alerting - Part 4 - description: Learn how to use templates to create customized and concise notifications — Part 4. + title: Get started with Grafana Alerting - Template your alert notifications + description: Learn how to use templates to create customized and concise notifications. backend: imageid: ubuntu refs: @@ -72,9 +72,7 @@ refs: -# Get started with Grafana Alerting - Part 4 - -The Get started with Grafana Alerting tutorial Part 4 is a continuation of [Get started with Grafana Alerting tutorial Part 3](http://www.grafana.com/tutorials/alerting-get-started-pt3/). +This tutorial is a continuation of the [Get started with Grafana Alerting - Grouping notifications](http://www.grafana.com/tutorials/alerting-get-started-pt3/) tutorial. In this tutorial, you will learn: @@ -109,7 +107,7 @@ There are different ways you can follow along with this tutorial. - **Interactive learning environment** - - Alternatively, you can try out this example in our interactive learning environment: [Get started with Grafana Alerting - Part 4](https://killercoda.com/grafana-labs/course/grafana/alerting-get-started-pt4/). It's a fully configured environment with all the dependencies already installed. + - Alternatively, you can try out this example in our interactive learning environment: [Get started with Grafana Alerting - Templating](https://killercoda.com/grafana-labs/course/grafana/alerting-get-started-pt4/). It's a fully configured environment with all the dependencies already installed. - **Grafana OSS** @@ -246,7 +244,7 @@ Now that we've introduced how templating works, let’s move on to the next step 1. **Alert condition** section: - - Keep Last as the value for the reducer function (`WHEN`), and `75` as the threshold value, representing CPU usage above 75% .This is the value above which the alert rule should trigger. + - Keep Last as the value for the reducer function (`WHEN`), and `IS ABOVE 75` as the threshold value, representing CPU usage above 75% .This is the value above which the alert rule should trigger. - Click **Preview alert rule condition** to run the queries. It should return 3 series in Firing state, and 1 in Normal state. @@ -260,9 +258,10 @@ Now that we've introduced how templating works, let’s move on to the next step Note: while it's possible to template labels here, in this tutorial, we focus on templating the summary and annotations fields instead. 1. **Set evaluation behaviour** section: - - In the **Evaluation group and interval**, repeat the above step to create a new evaluation group. Name it `High usage`. + - In the **Evaluation group and interval**, enter a name. For example: `High usage`. - Choose an **Evaluation interval** (how often the alert will be evaluated). Choose `1m`. - Set the **pending period** to 0s (zero seconds), so the alert rule fires the moment the condition is met (this minimizes the waiting time for the demonstration.). + - Set **Keep firing for** to, `0s`, so the alert stops firing immediately after the condition is no longer true. 1. **Configure notifications** section: Select who should receive a notification when an alert rule fires. @@ -420,13 +419,13 @@ To deepen your understanding of Grafana’s templating, explore the following re - [**Notification template reference**](https://grafana.com/docs/grafana/latest/alerting/configure-notifications/template-notifications/reference/): Lists the data available for use in notification templates and explores specific functions. - [**Alert rule template reference**](https://grafana.com/docs/grafana/latest/alerting/alerting-rules/templates/reference/): Covers the specifics of creating dynamic labels and annotations for alert rules using elements such as variables and functions. -## Learn more in [Grafana Alerting Part 5](http://www.grafana.com/tutorials/alerting-get-started-pt5/) +## Learn more in [Grafana Alerting: Route alerts using dynamic labels](http://www.grafana.com/tutorials/alerting-get-started-pt5/) {{< admonition type="tip" >}} -In [Get started with Grafana Alerting - Part 5](http://www.grafana.com/tutorials/alerting-get-started-pt5/) you learn how to dynamically route alerts and link them to dashboards. +In [Get started with Grafana Alerting: Route alerts using dynamic labels](http://www.grafana.com/tutorials/alerting-get-started-pt5/) you learn how to dynamically route alerts and link them to dashboards. {{< /admonition >}} @@ -434,7 +433,7 @@ In [Get started with Grafana Alerting - Part 5](http://www.grafana.com/tutorials {{< docs/ignore >}} -In [Get started with Grafana Alerting - Part 5](http://www.grafana.com/tutorials/alerting-get-started-pt5/) you learn how to dynamically route alerts and link them to dashboards. +In [Get started with Grafana Alerting: Route alerts using dynamic labels](http://www.grafana.com/tutorials/alerting-get-started-pt5/) you learn how to dynamically route alerts and link them to dashboards. {{< /docs/ignore >}} diff --git a/docs/sources/tutorials/alerting-get-started-pt5/index.md b/docs/sources/tutorials/alerting-get-started-pt5/index.md index e2049b494ca..91a1c1e4141 100644 --- a/docs/sources/tutorials/alerting-get-started-pt5/index.md +++ b/docs/sources/tutorials/alerting-get-started-pt5/index.md @@ -2,7 +2,7 @@ Feedback Link: https://github.com/grafana/tutorials/issues/new categories: - alerting -description: Learn how to dynamically route alerts and link them to dashboards — Part 5. +description: Learn how to dynamically route alert notifications. labels: products: - enterprise @@ -10,28 +10,24 @@ labels: - cloud tags: - intermediate -title: Get started with Grafana Alerting - Part 5 -weight: 60 +title: Get started with Grafana Alerting - Route alerts using dynamic labels +weight: 66 killercoda: - title: Get started with Grafana Alerting - Part 5 - description: Learn how to dynamically route alerts and link them to dashboards — Part 5. + title: Get started with Grafana Alerting - Route alerts using dynamic labels + description: Learn how to dynamically route alert notifications. backend: imageid: ubuntu --- -# Get started with Grafana Alerting - Part 5 - -The Get started with Grafana Alerting tutorial Part 5 is a continuation of [Get started with Grafana Alerting tutorial Part 4](http://www.grafana.com/tutorials/alerting-get-started-pt4/). +The Get started with Grafana Alerting - Dynamic routing tutorial is a continuation of the [Get started with Grafana Alerting - Templating](http://www.grafana.com/tutorials/alerting-get-started-pt4/) tutorial. -In this tutorial, we focus on optimizing your alerting strategy using Grafana for monitoring system health, particularly when working with [Prometheus](https://grafana.com/docs/grafana/latest/datasources/prometheus/). Imagine you are managing a web application or a fleet of servers, tracking critical metrics such as CPU, memory, and disk usage. While monitoring is essential, managing alerts allows your team to act on issues without necessarily feeling overwhelmed by the noise. +Imagine you are managing a web application or a fleet of servers, tracking critical metrics such as CPU, memory, and disk usage. While monitoring is essential, managing alerts allows your team to act on issues without necessarily feeling overwhelmed by the noise. In this tutorial you will learn how to: - Leverage notification policies for **dynamic routing based on query values**: Use notification policies to route alerts based on dynamically generated labels, in a way that critical alerts reach the on-call team and less urgent ones go to a general monitoring channel. -- Set **mute timings** to suppress certain alerts during maintenance or weekends. -- **Link alerts to dashboards** to provide more context to resolve issues. @@ -132,7 +128,7 @@ If you already have Grafana, Loki, or Prometheus running on your system, you mig -## Use case: Monitoring and alerting for system health with Prometheus and Grafana +## Use case: monitoring and alerting for system health with Prometheus and Grafana In this use case, we focus on monitoring the system's CPU, memory, and disk usage as part of a monitoring setup. This example is based on the [Grafana Prometheus Alerting Demo](https://github.com/tonypowa/grafana-prometheus-alerting-demo), which collects and visualizes system metrics via Prometheus and Grafana. @@ -140,7 +136,6 @@ Your team is responsible for ensuring the health of your servers, and you want t - Set who should receive an alert notification based on query value. - Suppress alerts based on query value. -- Integrate alert rules into visualizations for better context. ### Scenario @@ -151,68 +146,37 @@ In the provided demo setup, you're monitoring: You have a mixture of critical alerts (e.g., CPU usage over `75%`) and warning alerts (e.g., memory usage over `60%`). -At times, you also have scheduled maintenance windows, where you might temporarily suppress certain alerts during planned downtime. - - - - -## Create a visualization to monitor metrics - -To keep track of these metrics and understand system behavior across different environments, you can set up a visualization for CPU usage and memory consumption. This will make it easier to see how the system is performing and how alerts are distributed based on the environment label, including during scheduled maintenance windows. - -The time-series visualization supports alert rules to provide more context in the form of annotations and alert rule state. Follow these steps to create a visualization to monitor the application’s metrics. - -1. Log in to Grafana: - - - Navigate to [http://localhost:3000](http://localhost:3000), where Grafana should be running. - - Username and password: `admin` - -1. Create a time series panel: - - - Navigate to **Dashboards**. - - Click **New**. - - Select **New Dashboard**. - - Click **+ Add visualization**. - - Select **Prometheus** as the data source (provided with the demo). - - Enter a title for your panel, e.g., **CPU and Memory Usage**. - -1. Add queries for metrics: - - - In the query area, copy and paste the following PromQL query: +This Flask-based Python script simulates a service that: - ** switch to **Code** mode if not already selected ** +- Generates random CPU and memory usage values (10% to 100%) every **10 seconds** +- Exposes them as Prometheus metrics +- Each metric includes a default instance label based on the scrape target: + - `instance="flask-prod:5000"` + - `instance="flask-staging:5000"` +- A custom deployment label added explicitly in the app logic (this serves as an additional example for dynamically routing production instances): + - `deployment="prod-us-cs30"` + - `deployment="staging-us-cs20"` - ```promql - flask_app_cpu_usage{environment="prod"} - ``` +### Objective - - Click **Run queries**. +Use templates to dynamically populate a custom label that matches a notification policy, and therefore routes alerts to the correct contact point. - This query should display the simulated CPU usage data in the **prod** environment. +We'll automatically determine the environment associated with each firing alert by inspecting system metrics (e.g., CPU, memory) and extracting keywords using regular expressions with the Go templating language. -1. Add memory usage query: - - - Click **+ Add query**. - - In the query area, paste the following PromQL query: - - ```promql - flask_app_memory_usage{environment="prod"} - ``` - - {{< figure src="/media/docs/alerting/time-series_cpu_mem_usage_metrics.png" max-width="1200px" caption="Time-series panel displaying CPU and memory usage metrics in production." >}} + - Both metrics return labels that we’ll use later to link alert instances with the appropriate routing. These labels help define how alerts are routed based on their environment or other criteria. + -1. Click **Save dashboard**. +## Step 1: Create Notification Policies - We have our time-series panel ready. Feel free to combine metrics with labels such as `environment = “staging”`. +Notification policies route alert instances to contact points via label matchers. Since we know what labels our application returns (e.g., `job`, `instance`, `deployment`), we can use them to match alert rules and define appropriate notification routing. - - +Although our application doesn't explicitly include an `environment` label, we can rely on other labels like `instance` or `deployment`, which may contain keywords (like prod or staging) that indicate the environment. -## Create Notification Policies +1. Sign in to Grafana: -Notification policies route alert instances to contact points via label matchers. Since we know what labels our application returns (i.e., `environment`, `job`, `instance`), we can use these labels to match alert rules. + - **Grafana Cloud** users: Log in via Grafana Cloud. + - **OSS users**: Go to [http://localhost:3000](http://localhost:3000). 1. Navigate to **Alerts & IRM > Alerting > Notification Policies**. @@ -242,10 +206,10 @@ Notification policies route alert instances to contact points via label matchers Now that the labels are defined, we can create alert rules for CPU and memory metrics. These alert rules will use the labels from the collected and stored metrics in Prometheus. - - + + -## Create alert rules to monitor CPU and memory usage +## Step 2: Create alert rules to monitor CPU and memory usage Follow these steps to manually create alert rules and link them to a visualization. @@ -256,7 +220,7 @@ Follow these steps to manually create alert rules and link them to a visualizati ### Enter alert rule name -Make it short and descriptive, as this will appear in your alert notification. For instance, `CPU usage` . +Make it short and descriptive, as this will appear in your alert notification. For instance, `cpu-usage` . ### Define query and alert condition @@ -271,39 +235,48 @@ Make it short and descriptive, as this will appear in your alert notification. F 1. **Alert condition** section: - - Enter 75 as the value for **WHEN QUERY IS ABOVE** to set the threshold for the alert. + - Enter `75` as the value for **WHEN QUERY IS ABOVE** to set the threshold for the alert. - Click **Preview alert rule condition** to run the queries. - {{< figure src="/media/docs/alerting/promql-returning-metrics.png" max-width="1200px" caption="Preview of a query returning alert instances in Grafana." >}} + {{< figure src="/media/docs/alerting/flask-app-metrics.png" max-width="1200px" caption="Preview of a query returning alert instances in Grafana." >}} - Among the labels returned for `flask_app_cpu_usage`, the environment label is particularly important, as it enables dynamic alert routing based on the environment value, ensuring the right team receives the relevant notifications. + Among the labels returned for `flask_app_cpu_usage`, the labels `instance` and `deployment` contain values that include the term _prod_ and _staging_. We will create a template later to detect these keywords, so that any firing alert instances are routed to the relevant contact points (e.g., alerts-prod, alerts-staging). ### Add folders and labels In this section we add a [templated label based on query value](https://grafana.com/docs/grafana/latest/alerting/alerting-rules/templates/examples/#based-on-query-value) to map to the notification policies. -1. In **Folder**, click _+ New folder_ and enter a name. For example: `App metrics` . This folder contains our alerts. + + + +1. In **Folder**, click _+ New folder_ and enter a name. For example: `app-metrics` . This folder contains our alerts. 1. Click **+ Add labels**. 1. **Key** field: `environment` . 1. In the **value** field copy in the following template: ```go - {{- if eq $labels.environment "prod" -}} + {{- $env := reReplaceAll ".*([pP]rod|[sS]taging|[dD]ev).*" "${1}" $labels.instance -}} + {{- if eq $env "prod" -}} production - {{- else if eq $labels.environment "staging" -}} + {{- else if eq $env "staging" -}} staging {{- else -}} development {{- end -}} ``` - In this context, the template is used to route alert notifications based on the `environment` label. When a metric like CPU usage exceeds a threshold, the template checks the environment (e.g., `prod`, `staging`, or any other value). It then generates a label based on query value (e.g., _production_, _staging_, or _development_). This label is used in the alert notification policy to route alerts to the appropriate team, so that notifications are directed to the right group, making the process more efficient and avoiding unnecessary overlap. + This template uses a regular expression to extract `prod`, `staging`, or `dev` from the instance label (`$labels.instance`) and maps it to a more readable label (like "production" for "prod"). + +As result, when alerts exceed a threshold, the template checks the labels, such as `instance="flask-prod:5000"`, `instance="flask-staging:5000"`, or custom labels like `deployment="prod-us-cs30"`, and assigns a value of production, staging or development to the custom environment **environment** label. + +This label is then used by the alert notification policy to route alerts to the appropriate team, so that notifications are delivered efficiently, and reducing unnecessary noise. ### Set evaluation behaviour -1. Click + **New evaluation group**. Name it `System usage`. -1. Choose an **Evaluation interval** (how often the alert will be evaluated). Choose `1m`. Click Create. +1. Click + **New evaluation group**. Name it `system-usage`. +1. Choose an **Evaluation interval** (how often the alert will be evaluated). Choose `1m`. 1. Set the **pending period** to `0s` (zero seconds), so the alert rule fires the moment the condition is met (this minimizes the waiting time for the demonstration.). +1. Set **Keep firing for** to, `0s`, so the alert stops firing immediately after the condition is no longer true. ### Configure notifications @@ -313,71 +286,72 @@ Select who should receive a notification when an alert rule fires. 1. Click **Preview routing**. The preview should display which firing alerts are routed to contact points based on notification policies that match the `environment` label. - {{< figure src="/media/docs/alerting/routing-preview-cpu-metrics.png" max-width="1200px" caption="Notification policies matched by the environment label matcher." >}} + {{< figure src="/media/docs/alerting/dynamic-routing-preview-prod-staging.png" max-width="1200px" caption="Notification policies matched by the environment label matcher." >}} The environment label matcher should map to the notification policies created earlier. This makes sure that firing alert instances are routed to the appropriate contact points associated with each policy. -### Configure notification message - -Link your dashboard panel to this alert rule to display alert annotations in your visualization whenever the alert rule triggers or resolves. - -1. Click **Link dashboard and panel**. -1. Find the panel that you created earlier. -1. Click **Confirm**. - -## Create a second alert rule for memory usage +## Step 3: Create a second alert rule for memory usage 1. Duplicate the existing alert rule (**More > Duplicate**), or create a new alert rule for memory usage, defining a threshold condition (e.g., memory usage exceeding `60%`). +1. Give it a name. For example: `memory-usage` 1. Query: `flask_app_memory_usage{}` 1. Link to the same visualization to obtain memory usage annotations whenever the alert rule triggers or resolves. -Now that the CPU and memory alert rules are set up, they are linked to the notification policies through the custom label matcher we added. The value of the label dynamically changes based on the environment template, using `$labels.environment`. This ensures that the label value will be set to production, staging, or development, depending on the environment. +Now that the CPU and memory alert rules are set up, they are linked to the notification policies through the custom label matcher we added. The value of the label dynamically changes based on the environment template, using `$labels.instance`. This ensures that the label value will be set to production, staging, or development, depending on the environment. -## Visualizing metrics and alert annotations +## Done! Your alerts are now dynamically routed -Check how your dashboard looks now that both alerts have been linked to your dashboard panel. +Based on your query's `instance` label values (which contain keywords like _prod_ or _staging_ ), Grafana dynamically assigns the value `production`, `staging` or `development` to the custom **environment** label using the template. This dynamic label then matches the label matchers in your notification policies, which route alerts to the correct contact points. -{{< figure src="/media/docs/alerting/time-series_cpu_with_alert.png" max-width="1200px" caption="Time series panel displaying health indicators and annotations." >}} +To see this in action go to **Alerts & IRM > Alerting > Active notifications** -After the alert rules are created, they should appear as **health indicators** (colored heart icons: red heart when the alert is in **Alerting** state, and green heart when in **Normal** state.) on the linked panel. In addition, the annotations include helpful context, such as the time the alert was triggered. +This page shows grouped alerts that are currently triggering notifications. If you click on any alert group to view its label set, contact point, and number of alert instances. Notice that the **environment** label has been dynamically populated with values like `production`. - - +{{< figure src="/media/docs/alerting/routing-active-notification-detail.png" max-width="1200px" caption="Expanded alert in Active notifications section" >}} -## Create mute timings +Finally, you should receive notifications at the contact point associated with either `prod` or `staging`. -Now that we've set up notification policies, we can demonstrate how to mute alerts for recurring periods of time. You can mute notifications for either the production or staging policies, depending on your needs. +Feel free to experiment by changing the template to match other labels that contain any of the watched keywords. For example, you could reference: -Mute timings are useful for suppressing alerts with certain labels during maintenance windows or weekends. +```go +$labels.deployment +``` + +The template should be flexible enough to capture the target keywords (e.g., prod, staging) by adjusting which label the[`$labels`](https://grafana.com/docs/grafana/latest/alerting/alerting-rules/templates/reference/#labels) is referencing. + + -1. Navigate to **Alerts & IRM > Alerting > Notification Policies**. - - Enter a name, e.g. `Planned downtime` or `Non-business hours`. - - Select **Sat** and **Sun**, to apply the mute timing to all Saturdays and Sundays. - - Click **Save mute timing**. -1. Add mute timing to the desired policy: - - Go to the notification policy that routes instances with the `staging` label. - - Select **More > Edit**. - - Choose the mute timing from the drop-down menu - - Click **Update policy**. - -This mute timing will apply to any alerts from the staging environment that trigger on Saturdays and Sundays. - - ## Conclusion -By using notification policies, you can route alerts based on query values, directing them to the appropriate teams. Integrating alerts into dashboards provides more context, and mute timings allow you to suppress alerts during maintenance or low-priority periods. +By using notification policies, you can route alerts based on query values, directing them to the appropriate teams. + +## Learn more in [Grafana Alerting - Link alerts to visualizations](http://www.grafana.com/tutorials/alerting-get-started-pt6/) -## Learn more + + +{{< admonition type="tip" >}} + +In [Grafana Alerting - Link alerts to visualizations](http://www.grafana.com/tutorials/alerting-get-started-pt6/) you will create alerts using Prometheus data and link them to your graphs. + +{{< /admonition >}} + + + +{{< docs/ignore >}} + +In [Grafana Alerting - Link alerts to visualizations](http://www.grafana.com/tutorials/alerting-get-started-pt6/) you will create alerts using Prometheus data and link them to your graphs. + +{{< /docs/ignore >}} Explore related topics covered in this tutorial: -- Understand how alert routing works in [Get started with Grafana Alerting - Part 2](http://www.grafana.com/tutorials/alerting-get-started-pt2/). -- Learn how templating works in [Get started with Grafana Alerting - Part 4](http://www.grafana.com/tutorials/alerting-get-started-pt4/). +- Understand how alert routing works in [Get started with Grafana Alerting - Alert routing](http://www.grafana.com/tutorials/alerting-get-started-pt2/). +- Learn how templating works in [Get started with Grafana Alerting - Templating](http://www.grafana.com/tutorials/alerting-get-started-pt4/). - More [examples on templating labels](https://grafana.com/docs/grafana/latest/alerting/alerting-rules/templates/examples/). diff --git a/docs/sources/tutorials/alerting-get-started-pt6/index.md b/docs/sources/tutorials/alerting-get-started-pt6/index.md new file mode 100644 index 00000000000..b3ef9aa89d3 --- /dev/null +++ b/docs/sources/tutorials/alerting-get-started-pt6/index.md @@ -0,0 +1,315 @@ +--- +Feedback Link: https://github.com/grafana/tutorials/issues/new +categories: + - alerting +description: Create alerts using Prometheus data and link them to your visualizations. +labels: + products: + - enterprise + - oss + - cloud +tags: + - beginner +title: Get started with Grafana Alerting - Link alerts to visualizations +weight: 67 +killercoda: + title: Get started with Grafana Alerting - Link alerts to visualizations + description: Create alerts using Prometheus data and link them to your visualizations. + backend: + imageid: ubuntu +--- + + + +This tutorial is a continuation of the [Get started with Grafana Alerting - Route alerts using dynamic labels](http://www.grafana.com/tutorials/alerting-get-started-pt5/) tutorial. + + + +In this tutorial you will learn how to: + +- Link alert rules to time series panels for better visualization +- View alert annotations directly on dashboards for better context +- Write Prometheus queries + + + + + + +## Before you begin + +- **Interactive learning environment** + + - Alternatively, you can [try out this example in our interactive learning environment](https://killercoda.com/grafana-labs/course/grafana/alerting-get-started-pt6/). It’s a fully configured environment with all the dependencies already installed. + +- **Grafana OSS** + - If you opt to run a Grafana stack locally, ensure you have the following applications installed: + - Docker Compose (included in Docker for Desktop for macOS and Windows) + - Git + + + +### Set up the Grafana stack + +To observe data using the Grafana stack, download and run the following files. + +1. Clone the [tutorial environment repository](https://github.com/tonypowa/grafana-prometheus-alerting-demo.git). + + ```bash + git clone https://github.com/tonypowa/grafana-prometheus-alerting-demo.git + ``` + +1. Change to the directory where you cloned the repository: + + ```bash + cd grafana-prometheus-alerting-demo + ``` + +1. Build the Grafana stack: + + + + ``` + docker compose build + ``` + + + + {{< docs/ignore >}} + + + + ```bash + docker-compose build + ``` + + + + {{< /docs/ignore >}} + +1. Bring up the containers: + + + + ``` + docker compose up -d + ``` + + + + {{< docs/ignore >}} + + + + ```bash + docker-compose up -d + ``` + + + + {{< /docs/ignore >}} + + The first time you run `docker compose up -d`, Docker downloads all the necessary resources for the tutorial. This might take a few minutes, depending on your internet connection. + + + +{{< admonition type="note" >}} +If you already have Grafana, Loki, or Prometheus running on your system, you might see errors, because the Docker image is trying to use ports that your local installations are already using. If this is the case, stop the services, then run the command again. +{{< /admonition >}} + + + +{{< docs/ignore >}} + +NOTE: + +If you already have Grafana, Loki, or Prometheus running on your system, you might see errors, because the Docker image is trying to use ports that your local installations are already using. If this is the case, stop the services, then run the command again. + +{{< /docs/ignore >}} + + + + +## Use case: monitoring and alerting for system health with Prometheus and Grafana + +In this use case, we focus on monitoring the system's CPU, memory, and disk usage as part of a monitoring setup. The [demo app](https://github.com/tonypowa/grafana-prometheus-alerting-demo), launches a stack that includes a Python script to simulate metrics, which Grafana collects and visualizes as a time-series visualization. + +The script simulates random CPU and memory usage values (10% to 100%) every **10 seconds** and exposes them as Prometheus metrics. + +### Objective + +You'll build a time series visualization to monitor CPU and memory usage, define alert rules with threshold-based conditions, and link those alerts to your dashboards to display real-time annotations when thresholds are breached. + + + + +## Step 1: Create a visualization to monitor metrics + +To keep track of these metrics you can set up a visualization for CPU usage and memory consumption. This will make it easier to see how the system is performing. + +The time-series visualization supports alert rules to provide more context in the form of annotations and alert rule state. Follow these steps to create a visualization to monitor the application’s metrics. + +1. Log in to Grafana: + + - Navigate to [http://localhost:3000](http://localhost:3000), where Grafana should be running. + - Username and password: `admin` + +1. Create a time series panel: + + - Navigate to **Dashboards**. + - Click **+ Create dashboard**. + - Click **+ Add visualization**. + - Select **Prometheus** as the data source (provided with the demo). + - Enter a title for your panel, e.g., **CPU and Memory Usage**. + +1. Add queries for metrics: + + - In the query area, copy and paste the following PromQL query: + + ** switch to **Code** mode if not already selected ** + + ```promql + flask_app_cpu_usage{instance="flask-prod:5000"} + ``` + + - Click **Run queries**. + + This query should display the simulated CPU usage data for the **prod** environment. + +1. Add memory usage query: + + - Click **+ Add query**. + - In the query area, paste the following PromQL query: + + ```promql + flask_app_memory_usage{instance="flask-prod:5000"} + ``` + + {{< figure src="/media/docs/alerting/cpu-mem-dash.png" max-width="1200px" caption="Time-series panel displaying CPU and memory usage metrics in production." >}} + +1. Click **Save dashboard**. Name it: `cpu-and-memory-metrics`. + +We have our time-series panel ready. Feel free to combine metrics with labels such as `flask_app_cpu_usage{instance=“flask-staging:5000”}`, or other labels like `deployment`. + + + + +## Step 2: Create alert rules to monitor CPU and memory usage + +Follow these steps to manually create alert rules and link them to a visualization. + +## Create an alert rule for CPU usage + +1. Navigate to **Alerts & IRM > Alerting > Alert rules** from the Grafana sidebar. +1. Click **+ New alert rule** rule to create a new alert. + +### Enter alert rule name + +Make it short and descriptive, as this will appear in your alert notification. For instance, `cpu-usage` . + +### Define query and alert condition + +1. Select **Prometheus** data source from the drop-down menu. +1. In the query section, enter the following query: + + ** switch to **Code** mode if not already selected ** + + ``` + flask_app_cpu_usage{instance="flask-prod:5000"} + ``` + +1. **Alert condition** + + - Enter 75 as the value for **WHEN QUERY IS ABOVE** to set the threshold for the alert. + - Click **Preview alert rule condition** to run the queries. + + {{< figure src="/media/docs/alerting/alert-condition-details-prod.png" max-width="1200px" caption="Preview of a query returning alert instances in Grafana." >}} + + The query returns the CPU usage of the Flask application in the production environment. In this case, the usage is `86.01%`, which exceeds the configured threshold of `75%`, causing the alert to fire. + + + + +### Add folders and labels + +1. In **Folder**, click **+ New folder** and enter a name. For example: `system-metrics` . This folder contains our alert rules. + +### Set evaluation behaviour + +1. Click + **New evaluation group**. Name it `system-usage`. +1. Choose an **Evaluation interval** (how often the alert will be evaluated). Choose `1m`. +1. Set the **pending period** to `0s` (None), so the alert rule fires the moment the condition is met (this minimizes the waiting time for the demonstration.). +1. Set **Keep firing for** to, `0s`, so the alert stops firing immediately after the condition is no longer true. + +### Configure notifications + +- Select a **Contact point**. If you don’t have any contact points, add a [Contact point](https://grafana.com/docs/grafana/latest/alerting/configure-notifications/manage-contact-points/#add-a-contact-point). + + For a quick test, you can use a public webhook from [webhook.site](https://webhook.site/) to capture and inspect alert notifications. If you choose this method, select **Webhook** from the drop-down menu in contact points. + +### Configure notification message + +To link this alert rule to our visualization click [**Link dashboard and panel**](https://grafana.com/docs/grafana/latest/alerting/alerting-rules/link-alert-rules-to-panels/#link-alert-rules-to-panels) + +- Select the folder that contains the dashboard. In this case: **system-metrics** +- Select the **cpu-and-memory-metrics** visualization +- Click **confirm** + +You have successfully linked this alert rule to your visualization! + +When the CPU usage exceeds the defined threshold, an annotation should appear on the graph to mark the event. Similarly, when the alert is resolved, another annotation is added to indicate the moment it returned to normal. + + + + +## (Optional) Step 3: Create a second alert rule for memory usage + +1. Duplicate the existing alert rule (**More > Duplicate**), or create a new alert rule for memory usage, defining a threshold condition (e.g., memory usage exceeding `60%`). +1. Give it a name. For example: `memory-usage` +1. Query: `flask_app_memory_usage{instance="flask-prod:5000"}` +1. Link to the same visualization to obtain memory usage annotations + +Check how your dashboard looks now that both alerts have been linked to your dashboard panel. + + + + +## Visualizing metrics and alert annotations + +{{< figure src="/media/docs/alerting/panel-2-queries-and-alerts.png" max-width="1200px" caption="Time series panel displaying health indicators and annotations." >}} + +After the alert rules are created, they should appear as **health indicators** (colored heart icons: a red heart when the alert is in **Alerting** state, and a green heart when in **Normal** state) on the linked panel. In addition, annotations provide helpful context, such as the time the alert was triggered. + +Finally, as part of the alerting process, you should receive notifications at the associated contact point. + +``` +{ + "receiver": "prod-alerts", + "status": "firing", + "alerts": [ + { + "status": "firing", + "labels": { + "alertname": "cpu-usage", + "deployment": "prod-us-cs30", + "grafana_folder": "sys-metrics", + "instance": "flask-prod:5000", + "job": "flask" + }, + "annotations": {}, + "silenceURL": "http://localhost:3000/alerting/silence/new? + "dashboardURL": "http://localhost:3000/d/dc203378-1ef9-410b-a636-b533a0dd3bd8?from=1748934450000&orgId=1&to=1748938080006", + "panelURL": "http://localhost:3000/d/dc203378-1ef9-410b-a636-b533a0dd3bd8?from=1748934450000&orgId=1&to=1748938080006&viewPanel=2", + +... } +``` + +_Received alert notification in webhook Contact point_ + +It’s worth mentioning that alert rules that are linked to a panel include a link to said visualization in the alert notifications. In the alert notification example above, the message includes useful information such as the summary, description, and a link to the relevant dashboard for the firing or resolved alert (i.e. `dashboardURL`). This helps responders quickly navigate to the appropriate context for investigation. + +You can extend this functionality by adding a custom annotation to your alert rules and creating a notification template that [includes a link to a dashboard with a time range.](https://grafana.com/docs/grafana/latest/alerting/configure-notifications/template-notifications/examples/#print-a-link-to-a-dashboard-with-time-range). The URL will include a time range based on the alert’s timing—starting from one hour before the alert started (`from`) to either the alert’s end time or the current time (`to`), depending on whether the alert is resolved or still firing. + +The final URL is constructed using a custom annotation (e.g., `MyDashboardURL`) along with the `from` and `to` parameters, which are calculated in the notification template. + + diff --git a/docs/sources/tutorials/alerting-get-started/index.md b/docs/sources/tutorials/alerting-get-started/index.md index 507bc4050f7..23f3894a84e 100644 --- a/docs/sources/tutorials/alerting-get-started/index.md +++ b/docs/sources/tutorials/alerting-get-started/index.md @@ -11,20 +11,18 @@ labels: - cloud tags: - beginner -title: Get started with Grafana Alerting - Part 1 -weight: 50 +title: Get started with Grafana Alerting - Create and receive your first alert +weight: 60 killercoda: - title: Get started with Grafana Alerting - Part 1 - description: Get started with Grafana Alerting by creating your first alert rule, sending notifications to a webhook, and generating data to test it live — Part 1. + title: Get started with Grafana Alerting - Create and receive your first alert + description: Get started with Grafana Alerting by creating your first alert rule, sending notifications to a webhook, and generating data to test it live. backend: imageid: ubuntu --- -# Get started with Grafana Alerting - Part 1 - -In this guide, we walk you through the process of setting up your first alert in just a few minutes. You'll witness your alert in action with real-time data, as well as sending alert notifications. +In this tutorial, we walk you through the process of setting up your first alert in just a few minutes. You'll witness your alert in action with real-time data, as well as sending alert notifications. In this tutorial you will: @@ -36,7 +34,7 @@ In this tutorial you will: {{< admonition type="tip" >}} -Once you have completed Part 1, don’t forget to explore the advanced but essential alerting topics in [Part 2 Alert instances and notification routing](http://www.grafana.com/tutorials/alerting-get-started-pt2/). +After you have completed Part 1, don’t forget to explore the advanced but essential alerting topics in [Multi-dimensional alerts and how to route them](http://www.grafana.com/tutorials/alerting-get-started-pt2/). {{< /admonition >}} @@ -44,7 +42,7 @@ Once you have completed Part 1, don’t forget to explore the advanced but essen {{< docs/ignore >}} -> Once you have completed Part 1, don’t forget to explore the advanced but essential alerting topics in [Part 2 Alert instances and notification routing](http://www.grafana.com/tutorials/alerting-get-started-pt2/). +> After you have completed Part 1, don’t forget to explore the advanced but essential alerting topics in [Multi-dimensional alerts and how to route them](http://www.grafana.com/tutorials/alerting-get-started-pt2/). {{< /docs/ignore >}} @@ -181,7 +179,7 @@ We have created a dummy Webhook endpoint and created a new Alerting contact poin Next, we establish an [alert rule](https://grafana.com/docs/grafana/latest/alerting/alerting-rules/create-grafana-managed-rule/) within Grafana Alerting to notify us whenever alert rules are triggered and resolved. -1. In Grafana, navigate to **Alerts & IRM > Alerting > Alert rules**. Click on **New alert rule**. +1. In Grafana, navigate to **Alerts & IRM > Alerting > Alert rules**. Click on **+ New alert rule**. 1. Enter alert rule name for your alert rule. Make it short and descriptive as this appears in your alert notification. For instance, **database-metrics** @@ -195,7 +193,8 @@ Grafana includes a [test data source](https://grafana.com/docs/grafana/latest/da 1. In the **Alert condition** section: - - Keep `Last` as the value for the reducer function (`WHEN`), and `0` as the threshold value. This is the value above which the alert rule should trigger. + - Keep **Random Walk** as the _Scenario_. + - Keep `Last` as the value for the reducer function (`WHEN`), and `IS ABOVE 0` as the threshold value. This is the value above which the alert rule should trigger. 1. Click **Preview alert rule condition** to run the query. @@ -214,13 +213,15 @@ The [alert rule evaluation](https://grafana.com/docs/grafana/latest/alerting/fun - **Evaluation group**: every alert rule is assigned to an evaluation group. You can assign the alert rule to an existing evaluation group or create a new one. - **Evaluation interval**: determines how frequently the alert rule is checked. For instance, the evaluation may occur every 10s, 30s, 1m, 10m, etc. - **Pending period**: how long the condition must be met to trigger the alert rule. +- **Keep firing for**: defines how long an alert should remain in the Firing state after the alert condition stops being true. During this time, the alert enters a _Recovering_ state, suppressing additional notifications but keeping the alert active. It helps prevent alert flapping, where alerts rapidly switch between firing and resolved due to noisy or unstable metrics. To set up the evaluation: -1. In the **Evaluation group and interval**, repeat the above step to create a new evaluation group. Name it _1m-evaluation_. +1. In the **Evaluation group and interval**, enter a name. For example: `1m-evaluation`. 1. Choose an **Evaluation interval** (how often the alert are evaluated). For example, every `1m` (1 minute). 1. Set the **pending period** to, `0s` (zero seconds), so the alert rule fires the moment the condition is met. +1. Set **Keep firing for** to, `0s`, so the alert stops firing immediately after the condition is no longer true. Use this when you want alerts to be resolved as soon as the system is healthy again. ### Configure notifications @@ -263,13 +264,13 @@ By incrementing the threshold, the condition is no longer met, and after the eva -## Learn more in [Grafana Alerting Part 2](http://www.grafana.com/tutorials/alerting-get-started-pt2/) +## Learn more in [Grafana Alerting: Multi-dimensional alerts and how to route them](http://www.grafana.com/tutorials/alerting-get-started-pt2/) {{< admonition type="tip" >}} -In [Get started with Grafana Alerting - Part 2](http://www.grafana.com/tutorials/alerting-get-started-pt2/) you can advance your skills by exploring alert instances and notification routing. +In [Grafana Alerting: Multi-dimensional alerts and how to route them](http://www.grafana.com/tutorials/alerting-get-started-pt2/) you'll learn to use alert instances and route notifications by labels to contacts {{< /admonition >}} @@ -277,7 +278,7 @@ In [Get started with Grafana Alerting - Part 2](http://www.grafana.com/tutorials {{< docs/ignore >}} -In [Get started with Grafana Alerting - Part 2](http://www.grafana.com/tutorials/alerting-get-started-pt2/) you can advance your skills by exploring alert instances and notification routing. +In [Grafana Alerting: Multi-dimensional alerts and how to route them](http://www.grafana.com/tutorials/alerting-get-started-pt2/) you'll learn to use alert instances and route notifications by labels to contacts. {{< /docs/ignore >}} diff --git a/e2e/dashboard-new-layouts/dashboards-add-panel.spec.ts b/e2e/dashboard-new-layouts/dashboards-add-panel.spec.ts index 2c653deda74..9997351cfdd 100644 --- a/e2e/dashboard-new-layouts/dashboards-add-panel.spec.ts +++ b/e2e/dashboard-new-layouts/dashboards-add-panel.spec.ts @@ -9,7 +9,6 @@ describe('Dashboard panels', () => { }); it('can add a new panel', () => { - e2e.pages.Dashboards.visit(); e2e.flows.openDashboard({ uid: `${PAGE_UNDER_TEST}?orgId=1` }); cy.contains(DASHBOARD_NAME).should('be.visible'); diff --git a/e2e/dashboard-new-layouts/dashboards-edit-adhoc-variables.spec.ts b/e2e/dashboard-new-layouts/dashboards-edit-adhoc-variables.spec.ts index 6a35cedbe9a..f7350331978 100644 --- a/e2e/dashboard-new-layouts/dashboards-edit-adhoc-variables.spec.ts +++ b/e2e/dashboard-new-layouts/dashboards-edit-adhoc-variables.spec.ts @@ -11,8 +11,6 @@ describe('Dashboard edit - Ad hoc variables', () => { }); it('can add a new adhoc variable', () => { - e2e.pages.Dashboards.visit(); - e2e.flows.openDashboard({ uid: `${PAGE_UNDER_TEST}?orgId=1` }); cy.contains(DASHBOARD_NAME).should('be.visible'); diff --git a/e2e/dashboard-new-layouts/dashboards-edit-datasource-variables.spec.ts b/e2e/dashboard-new-layouts/dashboards-edit-datasource-variables.spec.ts new file mode 100644 index 00000000000..25b8b8608ac --- /dev/null +++ b/e2e/dashboard-new-layouts/dashboards-edit-datasource-variables.spec.ts @@ -0,0 +1,49 @@ +import { e2e } from '../utils'; + +import { flows, Variable } from './dashboard-edit-flows'; + +const PAGE_UNDER_TEST = 'kVi2Gex7z/test-variable-output'; +const DASHBOARD_NAME = 'Test variable output'; + +describe('Dashboard edit - datasource variables', () => { + beforeEach(() => { + e2e.flows.login(Cypress.env('USERNAME'), Cypress.env('PASSWORD')); + }); + + it('can add a new datasource variable', () => { + e2e.pages.Dashboards.visit(); + + e2e.flows.openDashboard({ uid: `${PAGE_UNDER_TEST}?orgId=1` }); + cy.contains(DASHBOARD_NAME).should('be.visible'); + + const dsType = 'cloudwatch'; + + const variable: Variable = { + type: 'datasource', + name: 'VariableUnderTest', + label: 'VariableUnderTest', + value: `gdev-${dsType}`, + }; + + // Common steps to add a new variable + flows.newEditPaneVariableClick(); + flows.newEditPanelCommonVariableInputs(variable); + + e2e.pages.Dashboard.Settings.Variables.Edit.DatasourceVariable.datasourceSelect().should('be.visible').click(); + cy.get(`#combobox-option-${dsType}`).click(); + + const regexFilter = 'cloud'; + e2e.pages.Dashboard.Settings.Variables.Edit.DatasourceVariable.nameFilter().should('be.visible').type(regexFilter); + + // Assert the variable dropdown is visible with correct label + e2e.pages.Dashboard.SubMenu.submenuItemLabels(variable.label).should('be.visible').contains(variable.label); + + // Assert the variable values are correctly displayed in the panel + e2e.components.Panels.Panel.content() + .should('be.visible') + .first() + .within(() => { + cy.get('.markdown-html').should('include.text', `${variable.name}: ${variable.value}`); + }); + }); +}); diff --git a/e2e/dashboard-new-layouts/dashboards-edit-panel-title-description.spec.ts b/e2e/dashboard-new-layouts/dashboards-edit-panel-title-description.spec.ts index 3b522db3c8d..a7122c53902 100644 --- a/e2e/dashboard-new-layouts/dashboards-edit-panel-title-description.spec.ts +++ b/e2e/dashboard-new-layouts/dashboards-edit-panel-title-description.spec.ts @@ -10,7 +10,6 @@ describe('Dashboard', () => { }); it('can edit panel title and description', () => { - e2e.pages.Dashboards.visit(); e2e.flows.openDashboard({ uid: `${PAGE_UNDER_TEST}?orgId=1` }); e2e.flows.scenes.toggleEditMode(); diff --git a/e2e/dashboard-new-layouts/dashboards-edit-panel-transparent-bg.spec.ts b/e2e/dashboard-new-layouts/dashboards-edit-panel-transparent-bg.spec.ts index 7e7bb717b75..ca6c5df485b 100644 --- a/e2e/dashboard-new-layouts/dashboards-edit-panel-transparent-bg.spec.ts +++ b/e2e/dashboard-new-layouts/dashboards-edit-panel-transparent-bg.spec.ts @@ -8,7 +8,6 @@ describe('Dashboard', () => { }); it('can toggle transparent background switch', () => { - e2e.pages.Dashboards.visit(); e2e.flows.openDashboard({ uid: `${PAGE_UNDER_TEST}?orgId=1` }); e2e.flows.scenes.toggleEditMode(); diff --git a/e2e/dashboard-new-layouts/dashboards-edit-query-variables.spec.ts b/e2e/dashboard-new-layouts/dashboards-edit-query-variables.spec.ts index 86843243ad4..47e445a3421 100644 --- a/e2e/dashboard-new-layouts/dashboards-edit-query-variables.spec.ts +++ b/e2e/dashboard-new-layouts/dashboards-edit-query-variables.spec.ts @@ -11,8 +11,6 @@ describe('Dashboard edit - Query variable', () => { }); it('can add a new query variable', () => { - e2e.pages.Dashboards.visit(); - e2e.flows.openDashboard({ uid: `${PAGE_UNDER_TEST}?orgId=1` }); cy.contains(DASHBOARD_NAME).should('be.visible'); diff --git a/e2e/dashboard-new-layouts/dashboards-edit-variables.spec.ts b/e2e/dashboard-new-layouts/dashboards-edit-variables.spec.ts index fdb2d177fd7..37737b65c6a 100644 --- a/e2e/dashboard-new-layouts/dashboards-edit-variables.spec.ts +++ b/e2e/dashboard-new-layouts/dashboards-edit-variables.spec.ts @@ -11,8 +11,6 @@ describe('Dashboard edit - variables', () => { }); it('can add a new custom variable', () => { - e2e.pages.Dashboards.visit(); - e2e.flows.openDashboard({ uid: `${PAGE_UNDER_TEST}?orgId=1` }); cy.contains(DASHBOARD_NAME).should('be.visible'); @@ -34,11 +32,13 @@ describe('Dashboard edit - variables', () => { e2e.pages.Dashboard.SubMenu.submenuItemLabels(variable.label).should('be.visible').contains(variable.label); const values = variable.value.split(','); e2e.pages.Dashboard.SubMenu.submenuItemValueDropDownValueLinkTexts(values[0]).should('be.visible'); + + // check that variable deletion works + e2e.components.EditPaneHeader.deleteButton().click(); + e2e.pages.Dashboard.SubMenu.submenuItemLabels(variable.label).should('not.exist'); }); it('can add a new constant variable', () => { - e2e.pages.Dashboards.visit(); - e2e.flows.openDashboard({ uid: `${PAGE_UNDER_TEST}?orgId=1` }); cy.contains(DASHBOARD_NAME).should('be.visible'); @@ -69,8 +69,6 @@ describe('Dashboard edit - variables', () => { }); it('can add a new textbox variable', () => { - e2e.pages.Dashboards.visit(); - e2e.flows.openDashboard({ uid: `${PAGE_UNDER_TEST}?orgId=1` }); cy.contains(DASHBOARD_NAME).should('be.visible'); @@ -105,8 +103,6 @@ describe('Dashboard edit - variables', () => { }); it('can add a new interval variable', () => { - e2e.pages.Dashboards.visit(); - e2e.flows.openDashboard({ uid: `${PAGE_UNDER_TEST}?orgId=1` }); cy.contains(DASHBOARD_NAME).should('be.visible'); diff --git a/e2e/dashboard-new-layouts/dashboards-move-panel.spec.ts b/e2e/dashboard-new-layouts/dashboards-move-panel.spec.ts index 43cdf132b18..431a75dd54b 100644 --- a/e2e/dashboard-new-layouts/dashboards-move-panel.spec.ts +++ b/e2e/dashboard-new-layouts/dashboards-move-panel.spec.ts @@ -8,7 +8,6 @@ describe('Dashboard', () => { }); it('can drag and drop panels', () => { - e2e.pages.Dashboards.visit(); e2e.flows.openDashboard({ uid: `${PAGE_UNDER_TEST}?orgId=1` }); e2e.flows.scenes.toggleEditMode(); @@ -31,4 +30,30 @@ describe('Dashboard', () => { .should('be.higherThan', panel3); }); }); + + // Note, moving a panel from a nested row to a parent row currently just deletes the panel + // This test will need to be updated once the correct behavior is implemented. + it('can move panel from nested row to parent row', () => { + e2e.flows.openDashboard({ uid: `${PAGE_UNDER_TEST}?orgId=1` }); + + e2e.flows.scenes.toggleEditMode(); + + e2e.flows.scenes.groupIntoRow(); + e2e.flows.scenes.groupIntoRow(); + + cy.get('[data-testid="data-testid dashboard-row-title-New row"]') + .first() + .then((el) => { + const rect = el.offset(); + e2e.components.Panels.Panel.headerContainer() + .contains(/^Panel one$/) + .trigger('pointerdown', { which: 1 }) + .trigger('pointermove', { clientX: rect.left, clientY: rect.top }) + .trigger('pointerup'); + }); + + e2e.components.Panels.Panel.headerContainer() + .contains(/^Panel one$/) + .should('not.exist'); + }); }); diff --git a/e2e/dashboard-new-layouts/dashboards-remove-panel.spec.ts b/e2e/dashboard-new-layouts/dashboards-remove-panel.spec.ts index 6bdd01601d4..7256a4f4740 100644 --- a/e2e/dashboard-new-layouts/dashboards-remove-panel.spec.ts +++ b/e2e/dashboard-new-layouts/dashboards-remove-panel.spec.ts @@ -8,7 +8,6 @@ describe('Dashboard panels', () => { }); it('can remove a panel', () => { - e2e.pages.Dashboards.visit(); e2e.flows.openDashboard({ uid: `${PAGE_UNDER_TEST}?orgId=1` }); e2e.flows.scenes.toggleEditMode(); @@ -22,7 +21,6 @@ describe('Dashboard panels', () => { }); it('can remove several panels at once', () => { - e2e.pages.Dashboards.visit(); e2e.flows.openDashboard({ uid: `${PAGE_UNDER_TEST}?orgId=1` }); e2e.flows.scenes.toggleEditMode(); diff --git a/e2e/dashboard-new-layouts/dashboards-title-description.spec.ts b/e2e/dashboard-new-layouts/dashboards-title-description.spec.ts index 0d82fb9f086..2ae8eb28f3e 100644 --- a/e2e/dashboard-new-layouts/dashboards-title-description.spec.ts +++ b/e2e/dashboard-new-layouts/dashboards-title-description.spec.ts @@ -8,7 +8,6 @@ describe('Dashboard', () => { }); it('can change dashboard description and title', () => { - e2e.pages.Dashboards.visit(); e2e.flows.openDashboard({ uid: `${PAGE_UNDER_TEST}?orgId=1` }); e2e.flows.scenes.toggleEditMode(); diff --git a/e2e/panels-suite/panelEdit_base.spec.ts b/e2e/panels-suite/panelEdit_base.spec.ts index 97eebe35777..67717fb06b3 100644 --- a/e2e/panels-suite/panelEdit_base.spec.ts +++ b/e2e/panels-suite/panelEdit_base.spec.ts @@ -16,9 +16,16 @@ describe('Panel edit tests', () => { e2e.flows.openDashboard({ uid: 'TkZXxlNG3' }); cy.wait('@query'); + e2e.components.Panels.Panel.title('Lines 500 data points') + .should('be.visible') + .within(() => { + e2e.components.Panels.Panel.loadingBar().should('not.exist'); + cy.get('[data-testid="uplot-main-div"]').first().should('be.visible'); + }); + e2e.flows.openPanelMenuItem(e2e.flows.PanelMenuItems.Edit, PANEL_UNDER_TEST); - // // New panel editor opens when navigating from Panel menu + // New panel editor opens when navigating from Panel menu e2e.components.PanelEditor.General.content().should('be.visible'); // Queries tab is rendered and open by default @@ -31,7 +38,6 @@ describe('Panel edit tests', () => { e2e.components.Tab.active().within((li: JQuery) => { expect(li.text()).equals('Queries1'); // there's already a query so therefore Query + 1 }); - // cy.get('[data-testid]="query-editor-rows"').should('be.visible'); cy.get(`[data-testid="${selectors.components.QueryTab.content}"]`).should('be.visible'); e2e.components.TransformTab.content().should('not.exist'); e2e.components.AlertTab.content().should('not.exist'); diff --git a/eslint.config.js b/eslint.config.js index 39937809dfc..28bc0da1adb 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -13,13 +13,18 @@ const unicornPlugin = require('eslint-plugin-unicorn'); const grafanaConfig = require('@grafana/eslint-config/flat'); const grafanaPlugin = require('@grafana/eslint-plugin'); +const grafanaI18nPlugin = require('@grafana/i18n/eslint-plugin'); const bettererConfig = require('./.betterer.eslint.config'); const getEnvConfig = require('./scripts/webpack/env-util'); const envConfig = getEnvConfig(); const enableBettererRules = envConfig.frontend_dev_betterer_eslint_rules; -const pluginsToTranslate = ['public/app/plugins/datasource/azuremonitor', 'public/app/plugins/datasource/mssql']; +const pluginsToTranslate = [ + 'public/app/plugins/panel', + 'public/app/plugins/datasource/azuremonitor', + 'public/app/plugins/datasource/mssql', +]; /** * @type {Array} @@ -130,6 +135,11 @@ module.exports = [ importNames: ['Trans'], message: 'Please import from @grafana/i18n instead', }, + { + regex: '\\.test$', + message: + 'Do not import test files. If you require reuse of constants/mocks across files, create a separate file with no tests', + }, ], paths: [ { @@ -289,16 +299,23 @@ module.exports = [ name: 'grafana/i18n-overrides', plugins: { '@grafana': grafanaPlugin, + '@grafana/i18n': grafanaI18nPlugin, }, files: [ 'public/app/!(plugins)/**/*.{ts,tsx,js,jsx}', 'packages/grafana-ui/**/*.{ts,tsx,js,jsx}', ...pluginsToTranslate.map((plugin) => `${plugin}/**/*.{ts,tsx,js,jsx}`), ], - ignores: ['**/*.story.tsx', '**/*.{test,spec}.{ts,tsx}', '**/__mocks__/', 'public/test', '**/spec/**/*.{ts,tsx}'], + ignores: [ + 'public/test/**', + '**/*.{test,spec,story}.{ts,tsx}', + '**/{tests,__mocks__,__tests__,fixtures,spec,mocks}/**', + '**/{test-utils,testHelpers,mocks}.{ts,tsx}', + '**/mock*.{ts,tsx}', + ], rules: { - '@grafana/no-untranslated-strings': 'error', - '@grafana/no-translation-top-level': 'error', + '@grafana/i18n/no-untranslated-strings': ['error', { calleesToIgnore: ['^css$', 'use[A-Z].*'] }], + '@grafana/i18n/no-translation-top-level': 'error', }, }, { diff --git a/go.mod b/go.mod index 535d3382128..63bafca0da7 100644 --- a/go.mod +++ b/go.mod @@ -5,16 +5,15 @@ go 1.24.3 require ( buf.build/gen/go/parca-dev/parca/connectrpc/go v1.17.0-20240902100956-02fd72488966.1 // @grafana/observability-traces-and-profiling buf.build/gen/go/parca-dev/parca/protocolbuffers/go v1.34.2-20240902100956-02fd72488966.2 // @grafana/observability-traces-and-profiling - cloud.google.com/go/kms v1.20.5 // @grafana/grafana-backend-group - cloud.google.com/go/spanner v1.75.0 // @grafana/grafana-search-and-storage - cloud.google.com/go/storage v1.50.0 // @grafana/grafana-backend-group - connectrpc.com/connect v1.17.0 // @grafana/observability-traces-and-profiling + cloud.google.com/go/kms v1.21.0 // @grafana/grafana-backend-group + cloud.google.com/go/storage v1.52.0 // @grafana/grafana-backend-group + connectrpc.com/connect v1.18.1 // @grafana/observability-traces-and-profiling cuelang.org/go v0.11.1 // @grafana/grafana-as-code filippo.io/age v1.2.1 // @grafana/identity-access-team github.com/1NCE-GmbH/grpc-go-pool v0.0.0-20231117122434-2a5bb974daa2 // @grafana/grafana-search-and-storage github.com/Azure/azure-sdk-for-go v68.0.0+incompatible // @grafana/partner-datasources - github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 // @grafana/identity-access-team - github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.1 // @grafana/grafana-backend-group + github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 // @grafana/identity-access-team + github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.9.0 // @grafana/grafana-backend-group github.com/Azure/azure-sdk-for-go/sdk/keyvault/azkeys v0.10.0 // @grafana/grafana-backend-group github.com/Azure/azure-storage-blob-go v0.15.0 // @grafana/grafana-backend-group github.com/Azure/go-autorest/autorest v0.11.29 // @grafana/grafana-backend-group @@ -26,11 +25,11 @@ require ( github.com/Masterminds/sprig/v3 v3.3.0 // @grafana/grafana-backend-group github.com/ProtonMail/go-crypto v1.1.6 // @grafana/plugins-platform-backend github.com/VividCortex/mysqlerr v0.0.0-20170204212430-6c6b55f8796f // @grafana/grafana-backend-group - github.com/alicebob/miniredis/v2 v2.33.0 // @grafana/alerting-backend + github.com/alicebob/miniredis/v2 v2.34.0 // @grafana/alerting-backend github.com/andybalholm/brotli v1.1.1 // @grafana/partner-datasources github.com/apache/arrow-go/v18 v18.2.0 // @grafana/plugins-platform-backend github.com/armon/go-radix v1.0.0 // @grafana/grafana-app-platform-squad - github.com/aws/aws-sdk-go v1.55.6 // @grafana/aws-datasources + github.com/aws/aws-sdk-go v1.55.7 // @grafana/aws-datasources github.com/beevik/etree v1.4.1 // @grafana/grafana-backend-group github.com/benbjohnson/clock v1.3.5 // @grafana/alerting-backend github.com/blang/semver/v4 v4.0.0 // indirect; @grafana/grafana-developer-enablement-squad @@ -68,14 +67,13 @@ require ( github.com/golang-migrate/migrate/v4 v4.7.0 // @grafana/grafana-backend-group github.com/golang/mock v1.7.0-rc.1 // @grafana/alerting-backend github.com/golang/protobuf v1.5.4 // @grafana/grafana-backend-group - github.com/golang/snappy v0.0.4 // @grafana/alerting-backend + github.com/golang/snappy v1.0.0 // @grafana/alerting-backend github.com/google/go-cmp v0.7.0 // @grafana/grafana-backend-group github.com/google/go-github/v70 v70.0.0 // @grafana/grafana-app-platform-squad github.com/google/go-querystring v1.1.0 // indirect; @grafana/oss-big-tent github.com/google/uuid v1.6.0 // @grafana/grafana-backend-group github.com/google/wire v0.6.0 // @grafana/grafana-backend-group github.com/googleapis/gax-go/v2 v2.14.1 // @grafana/grafana-backend-group - github.com/googleapis/go-sql-spanner v1.11.1 // @grafana/grafana-search-and-storage github.com/gorilla/mux v1.8.1 // @grafana/grafana-backend-group github.com/gorilla/websocket v1.5.4-0.20250319132907-e064f32e3674 // @grafana/grafana-app-platform-squad github.com/grafana/alerting v0.0.0-20250521131632-6e476b0b04c3 // @grafana/alerting-backend @@ -83,14 +81,14 @@ require ( github.com/grafana/authlib/types v0.0.0-20250325095148-d6da9c164a7d // @grafana/identity-access-team github.com/grafana/dataplane/examples v0.0.1 // @grafana/observability-metrics github.com/grafana/dataplane/sdata v0.0.9 // @grafana/observability-metrics - github.com/grafana/dskit v0.0.0-20241105154643-a6b453a88040 // @grafana/grafana-backend-group + github.com/grafana/dskit v0.0.0-20250317084829-9cdd36a91f10 // @grafana/grafana-backend-group github.com/grafana/e2e v0.1.1 // @grafana-app-platform-squad github.com/grafana/gofpdf v0.0.0-20250307124105-3b9c5d35577f // @grafana/sharing-squad - github.com/grafana/gomemcache v0.0.0-20240805133030-fdaf6a95408e // @grafana/grafana-operator-experience-squad + github.com/grafana/gomemcache v0.0.0-20250228145437-da7b95fd2ac1 // @grafana/grafana-operator-experience-squad github.com/grafana/grafana-api-golang-client v0.27.0 // @grafana/alerting-backend - github.com/grafana/grafana-app-sdk v0.35.1 // @grafana/grafana-app-platform-squad - github.com/grafana/grafana-app-sdk/logging v0.35.1 // @grafana/grafana-app-platform-squad - github.com/grafana/grafana-aws-sdk v0.38.1 // @grafana/aws-datasources + github.com/grafana/grafana-app-sdk v0.38.2 // @grafana/grafana-app-platform-squad + github.com/grafana/grafana-app-sdk/logging v0.38.2 // @grafana/grafana-app-platform-squad + github.com/grafana/grafana-aws-sdk v0.38.2 // @grafana/aws-datasources github.com/grafana/grafana-azure-sdk-go/v2 v2.1.6 // @grafana/partner-datasources github.com/grafana/grafana-cloud-migration-snapshot v1.6.0 // @grafana/grafana-operator-experience-squad github.com/grafana/grafana-google-sdk-go v0.2.1 // @grafana/partner-datasources @@ -99,8 +97,8 @@ require ( github.com/grafana/loki/v3 v3.2.1 // @grafana/observability-logs github.com/grafana/otel-profiling-go v0.5.1 // @grafana/grafana-backend-group github.com/grafana/pyroscope-go/godeltaprof v0.1.8 // @grafana/observability-traces-and-profiling - github.com/grafana/pyroscope/api v1.0.0 // @grafana/observability-traces-and-profiling - github.com/grafana/tempo v1.5.1-0.20241001135150-ed943d7a56b2 // @grafana/observability-traces-and-profiling + github.com/grafana/pyroscope/api v1.2.1-0.20250415190842-3ff7247547ae // @grafana/observability-traces-and-profiling + github.com/grafana/tempo v1.5.1-0.20250529124718-87c2dc380cec // @grafana/observability-traces-and-profiling github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 // @grafana/plugins-platform-backend github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2 // @grafana/grafana-backend-group github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 // @grafana/identity-access-team @@ -135,15 +133,15 @@ require ( github.com/open-feature/go-sdk-contrib/providers/go-feature-flag v0.2.3 // @grafana/grafana-backend-group github.com/openfga/api/proto v0.0.0-20250127102726-f9709139a369 // @grafana/identity-access-team github.com/openfga/language/pkg/go v0.2.0-beta.2.0.20250220223040-ed0cfba54336 // @grafana/identity-access-team - github.com/openfga/openfga v1.8.12 // @grafana/identity-access-team + github.com/openfga/openfga v1.8.13 // @grafana/identity-access-team github.com/openzipkin/zipkin-go v0.4.3 // @grafana/oss-big-tent github.com/patrickmn/go-cache v2.1.0+incompatible // @grafana/alerting-backend github.com/phpdave11/gofpdi v1.0.14 // @grafana/sharing-squad - github.com/prometheus/alertmanager v0.27.0 // @grafana/alerting-backend + github.com/prometheus/alertmanager v0.28.0 // @grafana/alerting-backend github.com/prometheus/client_golang v1.22.0 // @grafana/alerting-backend - github.com/prometheus/client_model v0.6.1 // @grafana/grafana-backend-group + github.com/prometheus/client_model v0.6.2 // @grafana/grafana-backend-group github.com/prometheus/common v0.63.0 // @grafana/alerting-backend - github.com/prometheus/prometheus v0.301.0 // @grafana/alerting-backend + github.com/prometheus/prometheus v0.303.1 // @grafana/alerting-backend github.com/redis/go-redis/v9 v9.7.3 // @grafana/alerting-backend github.com/robfig/cron/v3 v3.0.1 // @grafana/grafana-backend-group github.com/rs/cors v1.11.1 // @grafana/identity-access-team @@ -161,7 +159,7 @@ require ( github.com/xlab/treeprint v1.2.0 // @grafana/observability-traces-and-profiling github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // @grafana/grafana-operator-experience-squad github.com/yudai/gojsondiff v1.0.0 // @grafana/grafana-backend-group - go.opentelemetry.io/collector/pdata v1.22.0 // @grafana/grafana-backend-group + go.opentelemetry.io/collector/pdata v1.30.0 // @grafana/grafana-backend-group go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 // @grafana/plugins-platform-backend go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.60.0 // @grafana/grafana-operator-experience-squad go.opentelemetry.io/contrib/propagators/jaeger v1.35.0 // @grafana/grafana-backend-group @@ -177,7 +175,7 @@ require ( go.uber.org/zap v1.27.0 // @grafana/identity-access-team gocloud.dev v0.40.0 // @grafana/grafana-app-platform-squad golang.org/x/crypto v0.38.0 // @grafana/grafana-backend-group - golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 // @grafana/alerting-backend + golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 // @grafana/alerting-backend golang.org/x/mod v0.24.0 // indirect; @grafana/grafana-backend-group golang.org/x/net v0.40.0 // @grafana/oss-big-tent @grafana/partner-datasources golang.org/x/oauth2 v0.29.0 // @grafana/identity-access-team @@ -185,21 +183,21 @@ require ( golang.org/x/text v0.25.0 // @grafana/grafana-backend-group golang.org/x/time v0.11.0 // @grafana/grafana-backend-group golang.org/x/tools v0.33.0 // indirect; @grafana/grafana-as-code - gonum.org/v1/gonum v0.15.1 // @grafana/oss-big-tent - google.golang.org/api v0.223.0 // @grafana/grafana-backend-group + gonum.org/v1/gonum v0.16.0 // @grafana/oss-big-tent + google.golang.org/api v0.229.0 // @grafana/grafana-backend-group google.golang.org/grpc v1.72.1 // @grafana/plugins-platform-backend google.golang.org/protobuf v1.36.6 // @grafana/plugins-platform-backend gopkg.in/ini.v1 v1.67.0 // @grafana/alerting-backend gopkg.in/mail.v2 v2.3.1 // @grafana/grafana-backend-group gopkg.in/yaml.v2 v2.4.0 // @grafana/alerting-backend gopkg.in/yaml.v3 v3.0.1 // @grafana/alerting-backend - k8s.io/api v0.32.3 // @grafana/grafana-app-platform-squad - k8s.io/apimachinery v0.32.3 // @grafana/grafana-app-platform-squad - k8s.io/apiserver v0.32.3 // @grafana/grafana-app-platform-squad - k8s.io/client-go v0.32.3 // @grafana/grafana-app-platform-squad - k8s.io/component-base v0.32.3 // @grafana/grafana-app-platform-squad + k8s.io/api v0.33.1 // @grafana/grafana-app-platform-squad + k8s.io/apimachinery v0.33.1 // @grafana/grafana-app-platform-squad + k8s.io/apiserver v0.33.1 // @grafana/grafana-app-platform-squad + k8s.io/client-go v0.33.1 // @grafana/grafana-app-platform-squad + k8s.io/component-base v0.33.1 // @grafana/grafana-app-platform-squad k8s.io/klog/v2 v2.130.1 // @grafana/grafana-app-platform-squad - k8s.io/kube-aggregator v0.32.0 // @grafana/grafana-app-platform-squad + k8s.io/kube-aggregator v0.33.1 // @grafana/grafana-app-platform-squad k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff // @grafana/grafana-app-platform-squad k8s.io/utils v0.0.0-20241104100929-3ea5e8cea738 // @grafana/partner-datasources sigs.k8s.io/randfill v1.0.0 // @grafana/grafana-app-platform-squad @@ -208,42 +206,39 @@ require ( ) require ( - github.com/grafana/grafana/apps/advisor v0.0.0-20250506052906-7a2fc797fb4a // @grafana/plugins-platform-backend - github.com/grafana/grafana/apps/alerting/notifications v0.0.0-20250508142345-620260fabcfb // @grafana/alerting-backend - github.com/grafana/grafana/apps/dashboard v0.0.0-20250506052906-7a2fc797fb4a // @grafana/grafana-app-platform-squad @grafana/dashboards-squad - github.com/grafana/grafana/apps/folder v0.0.0-20250506052906-7a2fc797fb4a // @grafana/grafana-search-and-storage - github.com/grafana/grafana/apps/investigations v0.0.0-20250506052906-7a2fc797fb4a // @fcjack @matryer - github.com/grafana/grafana/apps/playlist v0.0.0-20250506052906-7a2fc797fb4a // @grafana/grafana-app-platform-squad - github.com/grafana/grafana/pkg/aggregator v0.0.0-20250506052906-7a2fc797fb4a // @grafana/grafana-app-platform-squad - github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250506052906-7a2fc797fb4a // @grafana/grafana-app-platform-squad - github.com/grafana/grafana/pkg/apis/secret v0.0.0-20250506052906-7a2fc797fb4a // @grafana/grafana-operator-experience-squad - github.com/grafana/grafana/pkg/apiserver v0.0.0-20250506052906-7a2fc797fb4a // @grafana/grafana-app-platform-squad + github.com/grafana/grafana/apps/advisor v0.0.0-20250527064921-326081cdb7a1 // @grafana/plugins-platform-backend + github.com/grafana/grafana/apps/alerting/notifications v0.0.0-20250527064921-326081cdb7a1 // @grafana/alerting-backend + github.com/grafana/grafana/apps/dashboard v0.0.0-20250527064921-326081cdb7a1 // @grafana/grafana-app-platform-squad @grafana/dashboards-squad + github.com/grafana/grafana/apps/folder v0.0.0-20250527064921-326081cdb7a1 // @grafana/grafana-search-and-storage + github.com/grafana/grafana/apps/investigations v0.0.0-20250527064921-326081cdb7a1 // @fcjack @matryer + github.com/grafana/grafana/apps/playlist v0.0.0-20250527064921-326081cdb7a1 // @grafana/grafana-app-platform-squad + github.com/grafana/grafana/pkg/aggregator v0.0.0-20250527064921-326081cdb7a1 // @grafana/grafana-app-platform-squad + github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250527064921-326081cdb7a1 // @grafana/grafana-app-platform-squad + github.com/grafana/grafana/pkg/apis/secret v0.0.0-20250527064921-326081cdb7a1 // @grafana/grafana-operator-experience-squad + github.com/grafana/grafana/pkg/apiserver v0.0.0-20250527064921-326081cdb7a1 // @grafana/grafana-app-platform-squad // This needs to be here for other projects that import grafana/grafana // For local development grafana/grafana will always use the local files // Check go.work file for details github.com/grafana/grafana/pkg/promlib v0.0.8 // @grafana/oss-big-tent - github.com/grafana/grafana/pkg/semconv v0.0.0-20250422074709-7c8433fbb2c2 // @grafana/grafana-app-platform-squad - github.com/grafana/grafana/pkg/storage/unified/apistore v0.0.0-20250506052906-7a2fc797fb4a // @grafana/grafana-search-and-storage - github.com/grafana/grafana/pkg/storage/unified/resource v0.0.0-20250506052906-7a2fc797fb4a // @grafana/grafana-search-and-storage - github.com/grafana/grafana/pkg/storage/unified/resourcepb v0.0.0-20250516070222-10994220504a // @grafana/grafana-search-and-storage + github.com/grafana/grafana/pkg/semconv v0.0.0-20250527064921-326081cdb7a1 // @grafana/grafana-app-platform-squad ) require ( cel.dev/expr v0.23.1 // indirect - cloud.google.com/go v0.118.2 // indirect - cloud.google.com/go/auth v0.15.0 // indirect - cloud.google.com/go/auth/oauth2adapt v0.2.7 // indirect + cloud.google.com/go v0.120.0 // indirect + cloud.google.com/go/auth v0.16.0 // indirect + cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect cloud.google.com/go/compute/metadata v0.6.0 // indirect - cloud.google.com/go/iam v1.3.1 // indirect - cloud.google.com/go/longrunning v0.6.4 // indirect - cloud.google.com/go/monitoring v1.23.0 // indirect + cloud.google.com/go/iam v1.5.0 // indirect + cloud.google.com/go/longrunning v0.6.6 // indirect + cloud.google.com/go/monitoring v1.24.0 // indirect cuelabs.dev/go/oci/ociregistry v0.0.0-20240906074133-82eb438dd565 // indirect dario.cat/mergo v1.0.1 // indirect github.com/Azure/azure-pipeline-go v0.2.3 // indirect - github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect + github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 // indirect github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.7.1 // indirect - github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.2 // indirect + github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.1 // indirect github.com/Azure/go-autorest v14.2.0+incompatible // indirect github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect @@ -251,12 +246,12 @@ require ( github.com/Azure/go-autorest/logger v0.2.1 // indirect github.com/Azure/go-autorest/tracing v0.6.0 // indirect github.com/Azure/go-ntlmssp v0.0.0-20220621081337-cb9428e4ac1e // indirect - github.com/AzureAD/microsoft-authentication-library-for-go v1.3.2 // indirect + github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 // indirect github.com/FZambia/eagle v0.2.0 // indirect - github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.2 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.26.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.49.0 // indirect - github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.49.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 // indirect + github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0 // indirect + github.com/HdrHistogram/hdrhistogram-go v1.1.2 // indirect github.com/Masterminds/goutils v1.1.1 // indirect github.com/Masterminds/squirrel v1.5.4 // indirect github.com/Microsoft/go-winio v0.6.2 // indirect @@ -266,7 +261,7 @@ require ( github.com/Yiling-J/theine-go v0.6.1 // indirect github.com/agext/levenshtein v1.2.1 // indirect github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b // indirect - github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a // indirect + github.com/alicebob/gopher-json v0.0.0-20230218143504-906a9b012302 // indirect github.com/antlr4-go/antlr/v4 v4.13.1 // indirect github.com/apache/thrift v0.21.0 // indirect github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect @@ -274,24 +269,24 @@ require ( github.com/armon/go-metrics v0.4.1 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/at-wat/mqtt-go v0.19.4 // indirect - github.com/aws/aws-sdk-go-v2 v1.36.1 // indirect + github.com/aws/aws-sdk-go-v2 v1.36.3 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.3 // indirect github.com/aws/aws-sdk-go-v2/config v1.29.4 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.17.57 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.27 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.17.66 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 // indirect github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.10 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.31 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.31 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.2 // indirect github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.15 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.2 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 // indirect github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.17 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.12 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 // indirect github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.15 // indirect github.com/aws/aws-sdk-go-v2/service/s3 v1.58.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.24.14 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.13 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.33.12 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.25.3 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.33.18 // indirect github.com/aws/smithy-go v1.22.2 // indirect github.com/axiomhq/hyperloglog v0.0.0-20240507144631-af9851f82b27 // indirect github.com/bahlo/generic-list-go v0.2.0 // indirect @@ -342,7 +337,7 @@ require ( github.com/dolthub/go-icu-regex v0.0.0-20250327004329-6799764f2dad // indirect github.com/dolthub/jsonpath v0.0.2-0.20240227200619-19675ab05c71 // indirect github.com/dolthub/maphash v0.1.0 // indirect - github.com/dustin/go-humanize v1.0.1 // indirect + github.com/dustin/go-humanize v1.0.1 // @grafana/observability-traces-and-profiling github.com/edsrzf/mmap-go v1.2.0 // indirect github.com/elazarl/goproxy v1.7.2 // indirect github.com/emicklei/go-restful/v3 v3.11.0 // indirect @@ -352,7 +347,7 @@ require ( github.com/envoyproxy/protoc-gen-validate v1.2.1 // indirect github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb // indirect github.com/felixge/httpsnoop v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.8.0 // indirect + github.com/fsnotify/fsnotify v1.9.0 // indirect github.com/fxamacker/cbor/v2 v2.7.0 // indirect github.com/gammazero/deque v0.2.1 // indirect github.com/go-asn1-ber/asn1-ber v1.5.4 // indirect @@ -382,32 +377,30 @@ require ( github.com/google/flatbuffers v25.2.10+incompatible // indirect github.com/google/gnostic-models v0.6.9 // indirect github.com/google/go-github/v64 v64.0.0 // indirect - github.com/google/gofuzz v1.2.0 // indirect github.com/google/s2a-go v0.1.9 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect github.com/grafana/jsonparser v0.0.0-20240425183733-ea80629e1a32 // indirect github.com/grafana/loki/pkg/push v0.0.0-20231124142027-e52380921608 // indirect github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc // indirect github.com/grafana/sqlds/v4 v4.2.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // @grafana/grafana-search-and-storage github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20191002090509-6af20e3a5340 // indirect - github.com/hashicorp/consul/api v1.30.0 // indirect + github.com/hashicorp/consul/api v1.31.2 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect - github.com/hashicorp/go-msgpack v1.1.5 // indirect github.com/hashicorp/go-rootcerts v1.0.2 // indirect - github.com/hashicorp/go-sockaddr v1.0.6 // indirect + github.com/hashicorp/go-sockaddr v1.0.7 // indirect github.com/hashicorp/go-uuid v1.0.3 // indirect github.com/hashicorp/golang-lru v1.0.2 // indirect - github.com/hashicorp/memberlist v0.5.0 // indirect + github.com/hashicorp/memberlist v0.5.1 // indirect github.com/hashicorp/serf v0.10.1 // indirect github.com/hashicorp/yamux v0.1.1 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/invopop/jsonschema v0.13.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect - github.com/jackc/pgx/v5 v5.7.4 // @grafana/grafana-search-and-storage + github.com/jackc/pgx/v5 v5.7.5 // @grafana/grafana-search-and-storage github.com/jackc/puddle/v2 v2.2.2 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/jcmturner/aescts/v2 v2.0.0 // indirect @@ -422,6 +415,7 @@ require ( github.com/josharian/intern v1.0.0 // indirect github.com/jpillora/backoff v1.0.0 // indirect github.com/jszwedko/go-datemath v0.1.1-0.20230526204004-640a500621d6 // indirect + github.com/jtolds/gls v4.20.0+incompatible // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect github.com/klauspost/asmfmt v1.3.2 // indirect github.com/klauspost/compress v1.18.0 // indirect @@ -442,7 +436,7 @@ require ( github.com/mdlayher/socket v0.4.1 // indirect github.com/mdlayher/vsock v1.2.1 // indirect github.com/mfridman/interpolate v0.0.2 // indirect - github.com/miekg/dns v1.1.62 // indirect + github.com/miekg/dns v1.1.63 // indirect github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 // indirect github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect @@ -469,7 +463,7 @@ require ( github.com/open-feature/go-sdk-contrib/providers/ofrep v0.1.5 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.0 // indirect - github.com/opentracing-contrib/go-grpc v0.0.0-20210225150812-73cb765af46e // @grafana/grafana-search-and-storage + github.com/opentracing-contrib/go-grpc v0.1.1 // @grafana/grafana-search-and-storage github.com/opentracing-contrib/go-stdlib v1.0.0 // indirect github.com/opentracing/opentracing-go v1.2.0 // @grafana/grafana-search-and-storage github.com/pelletier/go-toml/v2 v2.2.3 // indirect @@ -481,11 +475,11 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/pressly/goose/v3 v3.24.2 // indirect + github.com/pressly/goose/v3 v3.24.3 // indirect github.com/prometheus/common/sigv4 v0.1.0 // indirect - github.com/prometheus/exporter-toolkit v0.13.2 // indirect - github.com/prometheus/procfs v0.16.0 // indirect - github.com/prometheus/sigv4 v0.1.0 // @grafana/alerting-backend + github.com/prometheus/exporter-toolkit v0.14.0 // indirect + github.com/prometheus/procfs v0.16.1 // indirect + github.com/prometheus/sigv4 v0.1.2 // @grafana/alerting-backend github.com/protocolbuffers/txtpbfmt v0.0.0-20241112170944-20d2c9ebc01d // indirect github.com/puzpuzpuz/xsync/v2 v2.5.1 // indirect github.com/redis/rueidis v1.0.56 // indirect @@ -533,13 +527,13 @@ require ( github.com/zeebo/errs v1.4.0 // indirect github.com/zeebo/xxh3 v1.0.2 // indirect go.etcd.io/bbolt v1.4.0 // indirect - go.etcd.io/etcd/api/v3 v3.5.16 // indirect - go.etcd.io/etcd/client/pkg/v3 v3.5.16 // indirect - go.etcd.io/etcd/client/v3 v3.5.16 // indirect + go.etcd.io/etcd/api/v3 v3.5.21 // indirect + go.etcd.io/etcd/client/pkg/v3 v3.5.21 // indirect + go.etcd.io/etcd/client/v3 v3.5.21 // indirect go.mongodb.org/mongo-driver v1.16.1 // indirect go.opencensus.io v0.24.0 // @grafana/grafana-backend-group go.opentelemetry.io/auto/sdk v1.1.0 // indirect - go.opentelemetry.io/contrib/detectors/gcp v1.34.0 // indirect + go.opentelemetry.io/contrib/detectors/gcp v1.35.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 // @grafana/sharing-squad go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.35.0 // indirect go.opentelemetry.io/otel/metric v1.35.0 // indirect @@ -552,7 +546,7 @@ require ( golang.org/x/term v0.32.0 // indirect golang.org/x/xerrors v0.0.0-20240903120638-7835f813f4da // indirect gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect - google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4 // indirect + google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb // indirect google.golang.org/genproto/googleapis/api v0.0.0-20250519155744-55703ea1f237 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250519155744-55703ea1f237 // indirect gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect @@ -562,17 +556,19 @@ require ( gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/src-d/go-errors.v1 v1.0.0 // indirect gopkg.in/warnings.v0 v0.1.2 // indirect - k8s.io/apiextensions-apiserver v0.32.3 // indirect - k8s.io/kms v0.32.3 // indirect - modernc.org/libc v1.62.1 // indirect + k8s.io/apiextensions-apiserver v0.33.1 // indirect + k8s.io/kms v0.33.1 // indirect + modernc.org/libc v1.65.0 // indirect modernc.org/mathutil v1.7.1 // indirect - modernc.org/memory v1.9.1 // indirect + modernc.org/memory v1.10.0 // indirect modernc.org/sqlite v1.37.0 // indirect - sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.0 // indirect + sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 // indirect sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 // indirect sigs.k8s.io/yaml v1.4.0 // indirect ) +require github.com/hashicorp/go-msgpack/v2 v2.1.1 // indirect + // Use fork of crewjam/saml with fixes for some issues until changes get merged into upstream replace github.com/crewjam/saml => github.com/grafana/saml v0.4.15-0.20240917091248-ae3bbdad8a56 @@ -593,6 +589,3 @@ exclude github.com/prometheus/prometheus v1.8.2-0.20221021121301-51a44e6657c3 // This was retracted, but seems to be known by the Go module proxy, and is // otherwise pulled in as a transitive dependency. exclude k8s.io/client-go v12.0.0+incompatible - -// k8s.io/apiserver fails due to incompatibility with cel-go 0.23, can be removed once apiserver v0.33.x is released. -replace github.com/google/cel-go => github.com/google/cel-go v0.22.1 diff --git a/go.sum b/go.sum index b73237ae465..20561c1ee3e 100644 --- a/go.sum +++ b/go.sum @@ -46,8 +46,8 @@ cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFO cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I= cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY= cloud.google.com/go v0.110.2/go.mod h1:k04UEeEtb6ZBRTv3dZz4CeJC3jKGxyhl0sAiVVquxiw= -cloud.google.com/go v0.118.2 h1:bKXO7RXMFDkniAAvvuMrAPtQ/VHrs9e7J5UT3yrGdTY= -cloud.google.com/go v0.118.2/go.mod h1:CFO4UPEPi8oV21xoezZCrd3d81K4fFkDTEJu4R8K+9M= +cloud.google.com/go v0.120.0 h1:wc6bgG9DHyKqF5/vQvX1CiZrtHnxJjBlKUyF9nP6meA= +cloud.google.com/go v0.120.0/go.mod h1:/beW32s8/pGRuj4IILWQNd4uuebeT4dkOhKmkfit64Q= cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4= cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw= cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E= @@ -109,10 +109,10 @@ cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVo cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo= cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0= cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E= -cloud.google.com/go/auth v0.15.0 h1:Ly0u4aA5vG/fsSsxu98qCQBemXtAtJf+95z9HK+cxps= -cloud.google.com/go/auth v0.15.0/go.mod h1:WJDGqZ1o9E9wKIL+IwStfyn/+s59zl4Bi+1KQNVXLZ8= -cloud.google.com/go/auth/oauth2adapt v0.2.7 h1:/Lc7xODdqcEw8IrZ9SvwnlLX6j9FHQM74z6cBk9Rw6M= -cloud.google.com/go/auth/oauth2adapt v0.2.7/go.mod h1:NTbTTzfvPl1Y3V1nPpOgl2w6d/FjO7NNUQaWSox6ZMc= +cloud.google.com/go/auth v0.16.0 h1:Pd8P1s9WkcrBE2n/PhAwKsdrR35V3Sg2II9B+ndM3CU= +cloud.google.com/go/auth v0.16.0/go.mod h1:1howDHJ5IETh/LwYs3ZxvlkXF48aSqqJUM+5o02dNOI= +cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc= +cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c= cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0= cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8= cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8= @@ -187,7 +187,6 @@ cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvj cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA= cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs= cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU= -cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE= cloud.google.com/go/compute v1.19.3/go.mod h1:qxvISKp/gYnXkSAD1ppcSOveRAmzxicEv/JlizULFrI= cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU= @@ -330,8 +329,8 @@ cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGE cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY= cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY= cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0= -cloud.google.com/go/iam v1.3.1 h1:KFf8SaT71yYq+sQtRISn90Gyhyf4X8RGgeAVC8XGf3E= -cloud.google.com/go/iam v1.3.1/go.mod h1:3wMtuyT4NcbnYNPLMBzYRFiEfjKfJlLVLrisE7bwm34= +cloud.google.com/go/iam v1.5.0 h1:QlLcVMhbLGOjRcGe6VTGGTyQib8dRLK2B/kYNV0+2xs= +cloud.google.com/go/iam v1.5.0/go.mod h1:U+DOtKQltF/LxPEtcDLoobcsZMilSRwR7mgNL7knOpo= cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc= cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A= cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk= @@ -351,8 +350,8 @@ cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4 cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w= cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24= cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI= -cloud.google.com/go/kms v1.20.5 h1:aQQ8esAIVZ1atdJRxihhdxGQ64/zEbJoJnCz/ydSmKg= -cloud.google.com/go/kms v1.20.5/go.mod h1:C5A8M1sv2YWYy1AE6iSrnddSG9lRGdJq5XEdBy28Lmw= +cloud.google.com/go/kms v1.21.0 h1:x3EeWKuYwdlo2HLse/876ZrKjk2L5r7Uexfm8+p6mSI= +cloud.google.com/go/kms v1.21.0/go.mod h1:zoFXMhVVK7lQ3JC9xmhHMoQhnjEDZFoLAr5YMwzBLtk= cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic= cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI= cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE= @@ -368,8 +367,8 @@ cloud.google.com/go/logging v1.13.0/go.mod h1:36CoKh6KA/M0PbhPKMq6/qety2DCAErbhX cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE= cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc= cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo= -cloud.google.com/go/longrunning v0.6.4 h1:3tyw9rO3E2XVXzSApn1gyEEnH2K9SynNQjMlBi3uHLg= -cloud.google.com/go/longrunning v0.6.4/go.mod h1:ttZpLCe6e7EXvn9OxpBRx7kZEB0efv8yBO6YnVMfhJs= +cloud.google.com/go/longrunning v0.6.6 h1:XJNDo5MUfMM05xK3ewpbSdmt7R2Zw+aQEMbdQR65Rbw= +cloud.google.com/go/longrunning v0.6.6/go.mod h1:hyeGJUrPHcx0u2Uu1UFSoYZLn4lkMrccJig0t4FI7yw= cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE= cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM= cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA= @@ -393,8 +392,8 @@ cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhI cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4= cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w= cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw= -cloud.google.com/go/monitoring v1.23.0 h1:M3nXww2gn9oZ/qWN2bZ35CjolnVHM3qnSbu6srCPgjk= -cloud.google.com/go/monitoring v1.23.0/go.mod h1:034NnlQPDzrQ64G2Gavhl0LUHZs9H3rRmhtnp7jiJgg= +cloud.google.com/go/monitoring v1.24.0 h1:csSKiCJ+WVRgNkRzzz3BPoGjFhjPY23ZTcaenToJxMM= +cloud.google.com/go/monitoring v1.24.0/go.mod h1:Bd1PRK5bmQBQNnuGwHBfUamAV1ys9049oEPHnn4pcsc= cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA= cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o= cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM= @@ -541,8 +540,6 @@ cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+ cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos= cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk= cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M= -cloud.google.com/go/spanner v1.75.0 h1:2zrltTJv/4P3pCgpYgde4Eb1vN8Cgy1fNy7pbTnOovg= -cloud.google.com/go/spanner v1.75.0/go.mod h1:TLFZBvPQmx3We7sGh12eTk9lLsRLczzZaiweqfMpR80= cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM= cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ= cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0= @@ -560,8 +557,8 @@ cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeL cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s= cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y= cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4= -cloud.google.com/go/storage v1.50.0 h1:3TbVkzTooBvnZsk7WaAQfOsNrdoM8QHusXA1cpk6QJs= -cloud.google.com/go/storage v1.50.0/go.mod h1:l7XeiD//vx5lfqE3RavfmU9yvk5Pp0Zhcv482poyafY= +cloud.google.com/go/storage v1.52.0 h1:ROpzMW/IwipKtatA69ikxibdzQSiXJrY9f6IgBa9AlA= +cloud.google.com/go/storage v1.52.0/go.mod h1:4wrBAbAYUvYkbrf19ahGm4I5kDQhESSqN3CGEkMGvOY= cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w= cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I= cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4= @@ -629,8 +626,8 @@ cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoIS cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M= cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA= cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw= -connectrpc.com/connect v1.17.0 h1:W0ZqMhtVzn9Zhn2yATuUokDLO5N+gIuBWMOnsQrfmZk= -connectrpc.com/connect v1.17.0/go.mod h1:0292hj1rnx8oFrStN7cB4jjVBeqs+Yx5yDIC2prWDO8= +connectrpc.com/connect v1.18.1 h1:PAg7CjSAGvscaf6YZKUefjoih5Z/qYkyaTrBW8xvYPw= +connectrpc.com/connect v1.18.1/go.mod h1:0292hj1rnx8oFrStN7cB4jjVBeqs+Yx5yDIC2prWDO8= contrib.go.opencensus.io/exporter/ocagent v0.6.0/go.mod h1:zmKjrJcdo0aYcVS7bmEeSEBLPA9YJp5bjrofdU3pIXs= cuelabs.dev/go/oci/ociregistry v0.0.0-20240906074133-82eb438dd565 h1:R5wwEcbEZSBmeyg91MJZTxfd7WpBo2jPof3AYjRbxwY= cuelabs.dev/go/oci/ociregistry v0.0.0-20240906074133-82eb438dd565/go.mod h1:5A4xfTzHTXfeVJBU6RAUf+QrlfTCW+017q/QiW+sMLg= @@ -650,14 +647,14 @@ github.com/Azure/azure-pipeline-go v0.2.3/go.mod h1:x841ezTBIMG6O3lAcl8ATHnsOPVl github.com/Azure/azure-sdk-for-go v23.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go v68.0.0+incompatible h1:fcYLmCpyNYRnvJbPerq7U0hS+6+I79yEDJBqVNcqUzU= github.com/Azure/azure-sdk-for-go v68.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0 h1:g0EZJwz7xkXQiZAI5xi9f3WWFYBlX1CPTrR+NDToRkQ= -github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.0/go.mod h1:XCW7KnZet0Opnr7HccfUw1PLc4CjHqpcaxW8DHklNkQ= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.1 h1:1mvYtZfWQAnwNah/C+Z+Jb9rQH95LPE2vlmMuWAHJk8= -github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.1/go.mod h1:75I/mXtme1JyWFtz8GocPHVFyH421IBoZErnO16dd0k= -github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.1 h1:Bk5uOhSAenHyR5P61D/NzeQCv+4fEVV8mOkJ82NqpWw= -github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.1/go.mod h1:QZ4pw3or1WPmRBxf0cHd1tknzrT54WPBOQoGutCPvSU= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 h1:ywEEhmNahHBihViHepv3xPBn1663uRv2t2q/ESv9seY= -github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0/go.mod h1:iZDifYGJTIgIIkYRNWPENUnqx6bJ2xnSDFI2tjwZNuY= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0 h1:Gt0j3wceWMwPmiazCa8MzMA0MfhmPIz0Qp0FJ6qcM0U= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.0/go.mod h1:Ot/6aikWnKWi4l9QB7qVSwa8iMphQNqkWALMoNT3rzM= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.9.0 h1:OVoM452qUFBrX+URdH3VpR299ma4kfom0yB0URYky9g= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.9.0/go.mod h1:kUjrAo8bgEwLeZ/CmHqNl3Z/kPm7y6FKfxxK0izYUg4= +github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2 h1:yz1bePFlP5Vws5+8ez6T3HWXPmwOK7Yvq8QxDBD3SKY= +github.com/Azure/azure-sdk-for-go/sdk/azidentity/cache v0.3.2/go.mod h1:Pa9ZNPuoNu/GztvBSKk9J1cDJW6vk/n0zLtV4mgd8N8= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 h1:FPKJS1T+clwv+OLGt13a8UjqeRuh0O4SJ3lUriThc+4= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1/go.mod h1:j2chePtV91HrC22tGoRX3sGY42uF13WzmmV80/OdVAA= github.com/Azure/azure-sdk-for-go/sdk/keyvault/azkeys v0.10.0 h1:m/sWOGCREuSBqg2htVQTBY8nOZpyajYztF0vUvSZTuM= github.com/Azure/azure-sdk-for-go/sdk/keyvault/azkeys v0.10.0/go.mod h1:Pu5Zksi2KrU7LPbZbNINx6fuVrUp/ffvpxdDj+i8LeE= github.com/Azure/azure-sdk-for-go/sdk/keyvault/internal v0.7.1 h1:FbH3BbSb4bvGluTesZZ+ttN/MDsnMmQP36OSnDuSXqw= @@ -666,14 +663,14 @@ github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7 github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/compute/armcompute/v5 v5.7.0/go.mod h1:QyiQdW4f4/BIfB8ZutZ2s+28RAgfa/pT+zS++ZHyM1I= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0 h1:bXwSugBiSbgtz7rOtbfGf+woewp4f06orW9OP5BjHLA= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/network/armnetwork/v4 v4.3.0/go.mod h1:Y/HgrePTmGy9HjdSGTqZNa+apUpTVIEVKXJyARP2lrk= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.5.0 h1:AifHbc4mg0x9zW52WOpKbsHaDKuRhlI7TVl47thgQ70= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.5.0/go.mod h1:T5RfihdXtBDxt1Ch2wobif3TvzTdumDy29kahv6AV9A= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.8.0 h1:LR0kAX9ykz8G4YgLCaRDVJ3+n43R8MneB5dTy2konZo= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.8.0/go.mod h1:DWAciXemNf++PQJLeXUB4HHH5OpsAh12HZnu2wXE1jA= github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1 h1:MyVTgWR8qd/Jw1Le0NZebGBUCLbtak3bJ3z1OlqZBpw= github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/azkeys v1.0.1/go.mod h1:GpPjLhVR9dnUoJMyHWSPy71xY9/lcmpzIPZXmF0FCVY= github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0 h1:D3occbWoio4EBLkbkevetNMAVX197GkzbUMtqjGWn80= github.com/Azure/azure-sdk-for-go/sdk/security/keyvault/internal v1.0.0/go.mod h1:bTSOgj05NGRuHHhQwAdPnYr9TOdNmKlZTgGLL6nyAdI= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.2 h1:YUUxeiOWgdAQE3pXt2H7QXzZs0q8UBjgRbl56qo8GYM= -github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.3.2/go.mod h1:dmXQgZuiSubAecswZE+Sm8jkvEa7kQgTPVRvwL/nd0E= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.1 h1:lhZdRq7TIx0GJQvSyX2Si406vrYsov2FXGp/RnSEtcs= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.1/go.mod h1:8cl44BDmi+effbARHMQjgOKA2AYvcohNm7KEt42mSV8= github.com/Azure/azure-storage-blob-go v0.15.0 h1:rXtgp8tN1p29GvpGgfJetavIG0V7OgcSXPpwp3tx6qk= github.com/Azure/azure-storage-blob-go v0.15.0/go.mod h1:vbjsVbX0dlxnRc4FFMPsS9BsJWPcne7GB7onqlPvz58= github.com/Azure/go-ansiterm v0.0.0-20170929234023-d6e3b3328b78/go.mod h1:LmzpDX56iTiv29bbRTIsUNlaFfuhWRQBWjQdVyAevI8= @@ -703,8 +700,8 @@ github.com/Azure/go-ntlmssp v0.0.0-20220621081337-cb9428e4ac1e h1:NeAW1fUYUEWhft github.com/Azure/go-ntlmssp v0.0.0-20220621081337-cb9428e4ac1e/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU= github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1 h1:WJTmL004Abzc5wDB5VtZG2PJk5ndYDgVacGqfirKxjM= github.com/AzureAD/microsoft-authentication-extensions-for-go/cache v0.1.1/go.mod h1:tCcJZ0uHAmvjsVYzEFivsRTN00oz5BEsRgQHu5JZ9WE= -github.com/AzureAD/microsoft-authentication-library-for-go v1.3.2 h1:kYRSnvJju5gYVyhkij+RTJ/VR6QIUaCfWeaFm2ycsjQ= -github.com/AzureAD/microsoft-authentication-library-for-go v1.3.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= +github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 h1:oygO0locgZJe7PpYPXT5A29ZkwJaPqcva7BVeemZOZs= +github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.4.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/BurntSushi/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg= @@ -718,16 +715,14 @@ github.com/DataDog/datadog-go v2.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3 github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/FZambia/eagle v0.2.0 h1:1kQaZpJvbkvAXFRE/9K2ucBMuVqo+E29EMLYB74hIis= github.com/FZambia/eagle v0.2.0/go.mod h1:LKMYBwGYhao5sJI0TppvQ4SvvldFj9gITxrl8NvGwG0= -github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.2 h1:DBjmt6/otSdULyJdVg2BlG0qGZO5tKL4VzOs0jpvw5Q= -github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.2/go.mod h1:dppbR7CwXD4pgtV9t3wD1812RaLDcBjtblcDF5f1vI0= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.26.0 h1:f2Qw/Ehhimh5uO1fayV0QIW7DShEQqhtUfhYc+cBPlw= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.26.0/go.mod h1:2bIszWvQRlJVmJLiuLhukLImRjKPcYdzzsx6darK02A= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.49.0 h1:o90wcURuxekmXrtxmYWTyNla0+ZEHhud6DI1ZTxd1vI= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.49.0/go.mod h1:6fTWu4m3jocfUZLYF5KsZC1TUfRvEjs7lM4crme/irw= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.49.0 h1:jJKWl98inONJAr/IZrdFQUWcwUO95DLY1XMD1ZIut+g= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.49.0/go.mod h1:l2fIqmwB+FKSfvn3bAD/0i+AXAxhIZjTK2svT/mgUXs= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.49.0 h1:GYUJLfvd++4DMuMhCFLgLXvFwofIxh/qOwoGuS/LTew= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.49.0/go.mod h1:wRbFgBQUVm1YXrvWKofAEmq9HNJTDphbAaJSSX01KUI= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0 h1:ErKg/3iS1AKcTkf3yixlZ54f9U1rljCkQyEXWUnIUxc= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.27.0/go.mod h1:yAZHSGnqScoU556rBOVkwLze6WP5N+U11RHuWaGVxwY= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0 h1:fYE9p3esPxA/C0rQ0AHhP0drtPXDRhaWiwg1DPqO7IU= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.51.0/go.mod h1:BnBReJLvVYx2CS/UHOgVz2BXKXD9wsQPxZug20nZhd0= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0 h1:OqVGm6Ei3x5+yZmSJG1Mh2NwHvpVmZ08CB5qJhT9Nuk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.51.0/go.mod h1:SZiPHWGOOk3bl8tkevxkoiwPgsIl6CwrWcbwjfHZpdM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0 h1:6/0iUd0xrnX7qt+mLNRwg5c0PGv8wpE8K90ryANQwMI= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.51.0/go.mod h1:otE2jQekW/PqXk1Awf5lmfokJx4uwuqcj1ab5SpGeW0= github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk= @@ -795,10 +790,10 @@ github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk5 github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b h1:mimo19zliBX/vSQ6PWWSL9lK8qwHozUj03+zLoEB8O0= github.com/alecthomas/units v0.0.0-20240927000941-0f3dac36c52b/go.mod h1:fvzegU4vN3H1qMT+8wDmzjAcDONcgo2/SZ/TyfdUOFs= -github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a h1:HbKu58rmZpUGpz5+4FfNmIU+FmZg2P3Xaj2v2bfNWmk= -github.com/alicebob/gopher-json v0.0.0-20200520072559-a9ecdc9d1d3a/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc= -github.com/alicebob/miniredis/v2 v2.33.0 h1:uvTF0EDeu9RLnUEG27Db5I68ESoIxTiXbNUiji6lZrA= -github.com/alicebob/miniredis/v2 v2.33.0/go.mod h1:MhP4a3EU7aENRi9aO+tHfTBZicLqQevyi/DJpoj6mi0= +github.com/alicebob/gopher-json v0.0.0-20230218143504-906a9b012302 h1:uvdUDbHQHO85qeSydJtItA4T55Pw6BtAejd0APRJOCE= +github.com/alicebob/gopher-json v0.0.0-20230218143504-906a9b012302/go.mod h1:SGnFV6hVsYE877CKEZ6tDNTjaSXYUk6QqoIK6PrAtcc= +github.com/alicebob/miniredis/v2 v2.34.0 h1:mBFWMaJSNL9RwdGRyEDoAAv8OQc5UlEhLDQggTglU/0= +github.com/alicebob/miniredis/v2 v2.34.0/go.mod h1:kWShP4b58T1CW0Y5dViCd5ztzrDqRWqM3nksiyXk5s8= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= @@ -841,44 +836,44 @@ github.com/aws/aws-sdk-go v1.17.7/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN github.com/aws/aws-sdk-go v1.22.4/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.38.35/go.mod h1:hcU610XS61/+aQV88ixoOzUoG7v3b31pl2zKMmprdro= github.com/aws/aws-sdk-go v1.50.29/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= -github.com/aws/aws-sdk-go v1.55.6 h1:cSg4pvZ3m8dgYcgqB97MrcdjUmZ1BeMYKUxMMB89IPk= -github.com/aws/aws-sdk-go v1.55.6/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= -github.com/aws/aws-sdk-go-v2 v1.36.1 h1:iTDl5U6oAhkNPba0e1t1hrwAo02ZMqbrGq4k5JBWM5E= -github.com/aws/aws-sdk-go-v2 v1.36.1/go.mod h1:5PMILGVKiW32oDzjj6RU52yrNrDPUHcbZQYr1sM7qmM= +github.com/aws/aws-sdk-go v1.55.7 h1:UJrkFq7es5CShfBwlWAC8DA077vp8PyVbQd3lqLiztE= +github.com/aws/aws-sdk-go v1.55.7/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= +github.com/aws/aws-sdk-go-v2 v1.36.3 h1:mJoei2CxPutQVxaATCzDUjcZEjVRdpsiiXi2o38yqWM= +github.com/aws/aws-sdk-go-v2 v1.36.3/go.mod h1:LLXuLpgzEbD766Z5ECcRmi8AzSwfZItDtmABVkRLGzg= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.3 h1:tW1/Rkad38LA15X4UQtjXZXNKsCgkshC3EbmcUmghTg= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.3/go.mod h1:UbnqO+zjqk3uIt9yCACHJ9IVNhyhOCnYk8yA19SAWrM= github.com/aws/aws-sdk-go-v2/config v1.29.4 h1:ObNqKsDYFGr2WxnoXKOhCvTlf3HhwtoGgc+KmZ4H5yg= github.com/aws/aws-sdk-go-v2/config v1.29.4/go.mod h1:j2/AF7j/qxVmsNIChw1tWfsVKOayJoGRDjg1Tgq7NPk= -github.com/aws/aws-sdk-go-v2/credentials v1.17.57 h1:kFQDsbdBAR3GZsB8xA+51ptEnq9TIj3tS4MuP5b+TcQ= -github.com/aws/aws-sdk-go-v2/credentials v1.17.57/go.mod h1:2kerxPUUbTagAr/kkaHiqvj/bcYHzi2qiJS/ZinllU0= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.27 h1:7lOW8NUwE9UZekS1DYoiPdVAqZ6A+LheHWb+mHbNOq8= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.27/go.mod h1:w1BASFIPOPUae7AgaH4SbjNbfdkxuggLyGfNFTn8ITY= +github.com/aws/aws-sdk-go-v2/credentials v1.17.66 h1:aKpEKaTy6n4CEJeYI1MNj97oSDLi4xro3UzQfwf5RWE= +github.com/aws/aws-sdk-go-v2/credentials v1.17.66/go.mod h1:xQ5SusDmHb/fy55wU0QqTy0yNfLqxzec59YcsRZB+rI= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30 h1:x793wxmUWVDhshP8WW2mlnXuFrO4cOd3HLBroh1paFw= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.30/go.mod h1:Jpne2tDnYiFascUEs2AWHJL9Yp7A5ZVy3TNyxaAjD6M= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.10 h1:zeN9UtUlA6FTx0vFSayxSX32HDw73Yb6Hh2izDSFxXY= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.10/go.mod h1:3HKuexPDcwLWPaqpW2UR/9n8N/u/3CKcGAzSs8p8u8g= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.31 h1:lWm9ucLSRFiI4dQQafLrEOmEDGry3Swrz0BIRdiHJqQ= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.31/go.mod h1:Huu6GG0YTfbPphQkDSo4dEGmQRTKb9k9G7RdtyQWxuI= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.31 h1:ACxDklUKKXb48+eg5ROZXi1vDgfMyfIA/WyvqHcHI0o= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.31/go.mod h1:yadnfsDwqXeVaohbGc/RaD287PuyRw2wugkh5ZL2J6k= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34 h1:ZK5jHhnrioRkUNOc+hOgQKlUL5JeC3S6JgLxtQ+Rm0Q= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.34/go.mod h1:p4VfIceZokChbA9FzMbRGz5OV+lekcVtHlPKEO0gSZY= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34 h1:SZwFm17ZUNNg5Np0ioo/gq8Mn6u9w19Mri8DnJ15Jf0= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.34/go.mod h1:dFZsC0BLo346mvKQLWmoJxT+Sjp+qcVR1tRVHQGOH9Q= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.2 h1:Pg9URiobXy85kgFev3og2CuOZ8JZUBENF+dcgWBaYNk= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.2/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.15 h1:Z5r7SycxmSllHYmaAZPpmN8GviDrSGhMS6bldqtXZPw= github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.15/go.mod h1:CetW7bDE00QoGEmPUoZuRog07SGVAUVW6LFpNP0YfIg= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.2 h1:D4oz8/CzT9bAEYtVhSBmFj2dNOtaHOtMKc2vHBwYizA= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.2/go.mod h1:Za3IHqTQ+yNcRHxu1OFucBh0ACZT4j4VQFF0BqpZcLY= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 h1:eAh2A4b5IzM/lum78bZ590jy36+d/aFLgKF/4Vd1xPE= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3/go.mod h1:0yKJC/kb8sAnmlYa6Zs3QVYqaC8ug2AbnNChv5Ox3uA= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.17 h1:YPYe6ZmvUfDDDELqEKtAd6bo8zxhkm+XEFEzQisqUIE= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.17/go.mod h1:oBtcnYua/CgzCWYN7NZ5j7PotFDaFSUjCYVTtfyn7vw= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.12 h1:O+8vD2rGjfihBewr5bT+QUfYUHIxCVgG61LHoT59shM= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.12/go.mod h1:usVdWJaosa66NMvmCrr08NcWDBRv4E6+YFG2pUdw1Lk= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15 h1:dM9/92u2F1JbDaGooxTq18wmmFzbJRfXfVfy96/1CXM= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.15/go.mod h1:SwFBy2vjtA0vZbjjaFtfN045boopadnoVPhu4Fv66vY= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.15 h1:246A4lSTXWJw/rmlQI+TT2OcqeDMKBdyjEQrafMaQdA= github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.15/go.mod h1:haVfg3761/WF7YPuJOER2MP0k4UAXyHaLclKXB6usDg= github.com/aws/aws-sdk-go-v2/service/s3 v1.58.3 h1:hT8ZAZRIfqBqHbzKTII+CIiY8G2oC9OpLedkZ51DWl8= github.com/aws/aws-sdk-go-v2/service/s3 v1.58.3/go.mod h1:Lcxzg5rojyVPU/0eFwLtcyTaek/6Mtic5B1gJo7e/zE= -github.com/aws/aws-sdk-go-v2/service/sso v1.24.14 h1:c5WJ3iHz7rLIgArznb3JCSQT3uUMiz9DLZhIX+1G8ok= -github.com/aws/aws-sdk-go-v2/service/sso v1.24.14/go.mod h1:+JJQTxB6N4niArC14YNtxcQtwEqzS3o9Z32n7q33Rfs= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.13 h1:f1L/JtUkVODD+k1+IiSJUUv8A++2qVr+Xvb3xWXETMU= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.13/go.mod h1:tvqlFoja8/s0o+UruA1Nrezo/df0PzdunMDDurUfg6U= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.12 h1:fqg6c1KVrc3SYWma/egWue5rKI4G2+M4wMQN2JosNAA= -github.com/aws/aws-sdk-go-v2/service/sts v1.33.12/go.mod h1:7Yn+p66q/jt38qMoVfNvjbm3D89mGBnkwDcijgtih8w= +github.com/aws/aws-sdk-go-v2/service/sso v1.25.3 h1:1Gw+9ajCV1jogloEv1RRnvfRFia2cL6c9cuKV2Ps+G8= +github.com/aws/aws-sdk-go-v2/service/sso v1.25.3/go.mod h1:qs4a9T5EMLl/Cajiw2TcbNt2UNo/Hqlyp+GiuG4CFDI= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1 h1:hXmVKytPfTy5axZ+fYbR5d0cFmC3JvwLm5kM83luako= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.30.1/go.mod h1:MlYRNmYu/fGPoxBQVvBYr9nyr948aY/WLUvwBMBJubs= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.18 h1:xz7WvTMfSStb9Y8NpCT82FXLNC3QasqBfuAFHY4Pk5g= +github.com/aws/aws-sdk-go-v2/service/sts v1.33.18/go.mod h1:cQnB8CUnxbMU82JvlqjKR2HBOm3fe9pWorWBza6MBJ4= github.com/aws/smithy-go v1.22.2 h1:6D9hW43xKFrRx/tXXfAlIZc4JI+yQe6snnWcQyxSyLQ= github.com/aws/smithy-go v1.22.2/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= github.com/axiomhq/hyperloglog v0.0.0-20191112132149-a4c4c47bc57f/go.mod h1:2stgcRjl6QmW+gU2h5E7BQXg4HU0gzxKWDuT5HviN9s= @@ -1019,7 +1014,6 @@ github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20230310173818-32f1caf87195/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20250121191232-2f005788dc42 h1:Om6kYQYDUk5wWbT0t0q6pvyM49i9XZAv9dDrkDA7gjk= github.com/cncf/xds/go v0.0.0-20250121191232-2f005788dc42/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= @@ -1068,8 +1062,8 @@ github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/r github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dgryski/go-sip13 v0.0.0-20190329191031-25c5027a8c7b/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dhui/dktest v0.3.0/go.mod h1:cyzIUfGsBEbZ6BT7tnXqAShHSXCZhSNmFl70sZ7c1yc= -github.com/digitalocean/godo v1.132.0 h1:n0x6+ZkwbyQBtIU1wwBhv26EINqHg0wWQiBXlwYg/HQ= -github.com/digitalocean/godo v1.132.0/go.mod h1:PU8JB6I1XYkQIdHFop8lLAY9ojp6M0XcU0TWaQSxbrc= +github.com/digitalocean/godo v1.136.0 h1:DTxugljFJSMBPfEGq4KeXpnKeAHicggNqogcrw/YdZw= +github.com/digitalocean/godo v1.136.0/go.mod h1:PU8JB6I1XYkQIdHFop8lLAY9ojp6M0XcU0TWaQSxbrc= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/dlmiddlecote/sqlstats v1.0.2 h1:gSU11YN23D/iY50A2zVYwgXgy072khatTsIW6UPjUtI= @@ -1133,7 +1127,6 @@ github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go. github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE= github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34= github.com/envoyproxy/go-control-plane v0.11.0/go.mod h1:VnHyVMpzcLvCFt9yUz1UnCwHLhwx1WguiVDV7pTG/tI= -github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q= github.com/envoyproxy/go-control-plane v0.13.4 h1:zEqyPVyku6IvWCFwux4x9RxkLOMUL+1vC9xUFv5l2/M= github.com/envoyproxy/go-control-plane v0.13.4/go.mod h1:kDfuBlDVsSj2MjrLEtRWtHlsWIFcGyB2RMO44Dc5GZA= github.com/envoyproxy/go-control-plane/envoy v1.32.4 h1:jb83lalDRZSpPWW2Z7Mck/8kXZ5CQAFYVjQcdVIr83A= @@ -1144,13 +1137,12 @@ github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7 github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo= github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w= github.com/envoyproxy/protoc-gen-validate v0.10.0/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= -github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss= github.com/envoyproxy/protoc-gen-validate v1.2.1 h1:DEo3O99U8j4hBFwbJfrz9VtgcDfUKS7KJ7spH3d86P8= github.com/envoyproxy/protoc-gen-validate v1.2.1/go.mod h1:d/C80l/jxXLdfEIhX1W2TmLfsJ31lvEjwamM4DxlWXU= github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/evanphx/json-patch v4.5.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= -github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/evanphx/json-patch v5.9.11+incompatible h1:ixHHqfcGvxhWkniF1tWxBHA0yb4Z+d1UQi45df52xW8= +github.com/evanphx/json-patch v5.9.11+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb h1:IT4JYU7k4ikYg1SCxNI1/Tieq/NFvh6dzLdgi7eu0tM= github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb/go.mod h1:bH6Xx7IW64qjjJq8M2u4dxNaBiDfKK+z/3eGDpXEQhc= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= @@ -1169,8 +1161,8 @@ github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHk github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= -github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= -github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= +github.com/fsnotify/fsnotify v1.9.0 h1:2Ml+OJNzbYCTzsxtv8vKSFD9PbJjmhYF14k/jKC7S9k= +github.com/fsnotify/fsnotify v1.9.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/fsouza/fake-gcs-server v1.7.0/go.mod h1:5XIRs4YvwNbNoz+1JF8j6KLAyDh7RHGAyAK3EP2EsNk= github.com/fullstorydev/grpchan v1.1.1 h1:heQqIJlAv5Cnks9a70GRL2EJke6QQoUB25VGR6TZQas= github.com/fullstorydev/grpchan v1.1.1/go.mod h1:f4HpiV8V6htfY/K44GWV1ESQzHBTq7DinhzqQ95lpgc= @@ -1327,8 +1319,8 @@ github.com/go-quicktest/qt v1.101.0 h1:O1K29Txy5P2OK0dGo59b7b0LR6wKfIhttaAhHUyn7 github.com/go-quicktest/qt v1.101.0/go.mod h1:14Bz/f7NwaXPtdYEgzsx46kqSxVwTbzVZsDC26tQJow= github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= -github.com/go-resty/resty/v2 v2.15.3 h1:bqff+hcqAflpiF591hhJzNdkRsFhlB96CYfBwSFvql8= -github.com/go-resty/resty/v2 v2.15.3/go.mod h1:0fHAoK7JoBy/Ch36N8VFeMsK7xQOHhvWaC3iOktwmIU= +github.com/go-resty/resty/v2 v2.16.3 h1:zacNT7lt4b8M/io2Ahj6yPypL7bqx9n1iprfQuodV+E= +github.com/go-resty/resty/v2 v2.16.3/go.mod h1:hkJtXbA2iKHzJheXYvQ8snQES5ZLGKMwQ07xAwp/fiA= github.com/go-sourcemap/sourcemap v2.1.4+incompatible h1:a+iTbH5auLKxaNwQFg0B+TCYl6lbukKPc7b5x0n1s6Q= github.com/go-sourcemap/sourcemap v2.1.4+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI= @@ -1339,8 +1331,8 @@ github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= -github.com/go-test/deep v1.0.8 h1:TDsG77qcSprGbC6vTN8OuXp5g+J+b5Pcguhf7Zt61VM= -github.com/go-test/deep v1.0.8/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= +github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= +github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/go-xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:9wScpmSP5A3Bk8V3XHWUcJmYTh+ZnlHVyc+A4oZYS3Y= @@ -1432,14 +1424,15 @@ github.com/golang/snappy v0.0.0-20170215233205-553a64147049/go.mod h1:/XxbfmMg8l github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v1.0.0 h1:Oy607GVXHs7RtbggtPBnr2RmDArIsAefDwvrdWvRhGs= +github.com/golang/snappy v1.0.0/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.1.3 h1:CVpQJjYgC4VbzxeGVHfvZrv1ctoYCAI8vbl07Fcxlyg= github.com/google/btree v1.1.3/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= -github.com/google/cel-go v0.22.1 h1:AfVXx3chM2qwoSbM7Da8g8hX8OVSkBFwX+rz2+PcK40= -github.com/google/cel-go v0.22.1/go.mod h1:BuznPXXfQDpXKWQ9sPW3TzlAJN5zzFe+i9tIs0yC4s8= +github.com/google/cel-go v0.25.0 h1:jsFw9Fhn+3y2kBbltZR4VEz5xKkcIFRPDnuEzAGv5GY= +github.com/google/cel-go v0.25.0/go.mod h1:hjEb6r5SuOSlhCHmFoLzu8HGCERvIsDAbxDAyNU/MmI= github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/flatbuffers v25.2.10+incompatible h1:F3vclr7C3HpB1k9mxCGRMXq6FdUalZ6H/pNX4FP1v0Q= github.com/google/flatbuffers v25.2.10+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= @@ -1477,8 +1470,6 @@ github.com/google/go-replayers/httpreplay v1.2.0 h1:VM1wEyyjaoU53BwrOnaf9VhAyQQE github.com/google/go-replayers/httpreplay v1.2.0/go.mod h1:WahEFFZZ7a1P4VM1qEeHy+tME4bwyqPcwWbNlUI1Mcg= github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= -github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -1528,8 +1519,8 @@ github.com/googleapis/enterprise-certificate-proxy v0.1.0/go.mod h1:17drOmN3MwGY github.com/googleapis/enterprise-certificate-proxy v0.2.0/go.mod h1:8C0jb7/mgJe/9KK8Lm7X9ctZC2t60YyIpYEI16jx0Qg= github.com/googleapis/enterprise-certificate-proxy v0.2.1/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw= -github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA= +github.com/googleapis/enterprise-certificate-proxy v0.3.6 h1:GW/XbdyBFQ8Qe+YAmFU9uHLo7OnF5tL52HFAgMmyrf4= +github.com/googleapis/enterprise-certificate-proxy v0.3.6/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= @@ -1549,13 +1540,12 @@ github.com/googleapis/gax-go/v2 v2.14.1/go.mod h1:Hb/NubMaVM88SrNkvl8X/o8XWwDJEP github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.3.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= -github.com/googleapis/go-sql-spanner v1.11.1 h1:z3ThtKV5HFvaNv9UGc26+ggS+lS0dsCAkaFduKL7vws= -github.com/googleapis/go-sql-spanner v1.11.1/go.mod h1:fuA5q4yMS3SZiVfRr5bvksPNk7zUn/irbQW62H/ffZw= github.com/googleapis/go-type-adapters v1.0.0/go.mod h1:zHW75FOG2aur7gAO2B+MLby+cLsWGBF62rFAi7WjWO4= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gophercloud/gophercloud v0.3.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= -github.com/gophercloud/gophercloud v1.14.1 h1:DTCNaTVGl8/cFu58O1JwWgis9gtISAFONqpMKNg/Vpw= -github.com/gophercloud/gophercloud v1.14.1/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= +github.com/gophercloud/gophercloud v1.13.0 h1:8iY9d1DAbzMW6Vok1AxbbK5ZaUjzMp0tdyt4fX9IeJ0= +github.com/gophercloud/gophercloud/v2 v2.6.0 h1:XJKQ0in3iHOZHVAFMXq/OhjCuvvG+BKR0unOqRfG1EI= +github.com/gophercloud/gophercloud/v2 v2.6.0/go.mod h1:Ki/ILhYZr/5EPebrPL9Ej+tUg4lqx71/YH2JWVeU+Qk= github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e h1:JKmoR8x90Iww1ks85zJ1lfDGgIiMDuIptTOhJq+zKyg= github.com/gopherjs/gopherjs v0.0.0-20181103185306-d547d1d9531e/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= @@ -1579,22 +1569,22 @@ github.com/grafana/dataplane/examples v0.0.1 h1:K9M5glueWyLoL4//H+EtTQq16lXuHLmO github.com/grafana/dataplane/examples v0.0.1/go.mod h1:h5YwY8s407/17XF5/dS8XrUtsTVV2RnuW8+m1Mp46mg= github.com/grafana/dataplane/sdata v0.0.9 h1:AGL1LZnCUG4MnQtnWpBPbQ8ZpptaZs14w6kE/MWfg7s= github.com/grafana/dataplane/sdata v0.0.9/go.mod h1:Jvs5ddpGmn6vcxT7tCTWAZ1mgi4sbcdFt9utQx5uMAU= -github.com/grafana/dskit v0.0.0-20241105154643-a6b453a88040 h1:IR+UNYHqaU31t8/TArJk8K/GlDwOyxMpGNkWCXeZ28g= -github.com/grafana/dskit v0.0.0-20241105154643-a6b453a88040/go.mod h1:SPLNCARd4xdjCkue0O6hvuoveuS1dGJjDnfxYe405YQ= +github.com/grafana/dskit v0.0.0-20250317084829-9cdd36a91f10 h1:trIyc2EXciif3LGhcC4JlWT/EcJdkiOlitJGU8AgK48= +github.com/grafana/dskit v0.0.0-20250317084829-9cdd36a91f10/go.mod h1:GYazi+gM2La64jui4nDKrD6b8Drb8QDsUqyzBuiy1Ag= github.com/grafana/e2e v0.1.1 h1:/b6xcv5BtoBnx8cZnCiey9DbjEc8z7gXHO5edoeRYxc= github.com/grafana/e2e v0.1.1/go.mod h1:RpNLgae5VT+BUHvPE+/zSypmOXKwEu4t+tnEMS1ATaE= github.com/grafana/gofpdf v0.0.0-20250307124105-3b9c5d35577f h1:5xkjl5Y/j2QefJKOtTfyD1wXlVsQ2yEXmd0u82h5obs= github.com/grafana/gofpdf v0.0.0-20250307124105-3b9c5d35577f/go.mod h1:+O5QxOwwgP10jedZHapzXY+IPKTnzHBtIs5UUb9G+kI= -github.com/grafana/gomemcache v0.0.0-20240805133030-fdaf6a95408e h1:UlEET0InuoFautfaFp8lDrNF7rPHYXuBMrzwWx9XqFY= -github.com/grafana/gomemcache v0.0.0-20240805133030-fdaf6a95408e/go.mod h1:IGRj8oOoxwJbHBYl1+OhS9UjQR0dv6SQOep7HqmtyFU= +github.com/grafana/gomemcache v0.0.0-20250228145437-da7b95fd2ac1 h1:vR5nELq+KtGO+IiGW+AclWeQ7uhLHCEz/zyQwbQVNnQ= +github.com/grafana/gomemcache v0.0.0-20250228145437-da7b95fd2ac1/go.mod h1:j/s0jkda4UXTemDs7Pgw/vMT06alWc42CHisvYac0qw= github.com/grafana/grafana-api-golang-client v0.27.0 h1:zIwMXcbCB4n588i3O2N6HfNcQogCNTd/vPkEXTr7zX8= github.com/grafana/grafana-api-golang-client v0.27.0/go.mod h1:uNLZEmgKtTjHBtCQMwNn3qsx2mpMb8zU+7T4Xv3NR9Y= -github.com/grafana/grafana-app-sdk v0.35.1 h1:zEXubzsQrxGBOzXJJMBwhEClC/tvPi0sfK7NGmlX3RI= -github.com/grafana/grafana-app-sdk v0.35.1/go.mod h1:Zx5MkVppYK+ElSDUAR6+fjzOVo6I/cIgk+ty+LmNOxI= -github.com/grafana/grafana-app-sdk/logging v0.35.1 h1:taVpl+RoixTYl0JBJGhH+fPVmwA9wvdwdzJTZsv9buM= -github.com/grafana/grafana-app-sdk/logging v0.35.1/go.mod h1:Y/bvbDhBiV/tkIle9RW49pgfSPIPSON8Q4qjx3pyqDk= -github.com/grafana/grafana-aws-sdk v0.38.1 h1:4fU28F/UIs3YYuS52bBzTOKpFIIYGJZmgM6PO7IEj90= -github.com/grafana/grafana-aws-sdk v0.38.1/go.mod h1:j3vi+cXYHEFqjhBGrI6/lw1TNM+dl0Y3f0cSnDOPy+s= +github.com/grafana/grafana-app-sdk v0.38.2 h1:raQ1mqCmNJ2AyCSV3m6ehFC0TGVZcqRcM6iOIDT6ZIE= +github.com/grafana/grafana-app-sdk v0.38.2/go.mod h1:LhZ4i2IXGnW5FF/jAczX7SnGFNai7x2qwB8YHNZWiZI= +github.com/grafana/grafana-app-sdk/logging v0.38.2 h1:EdQTRxbbH72zdqJ09Z76zcSjfALJXkpPLgvKEPPnloc= +github.com/grafana/grafana-app-sdk/logging v0.38.2/go.mod h1:Y/bvbDhBiV/tkIle9RW49pgfSPIPSON8Q4qjx3pyqDk= +github.com/grafana/grafana-aws-sdk v0.38.2 h1:TzQD0OpWsNjtldi5G5TLDlBRk8OyDf+B5ujcoAu4Dp0= +github.com/grafana/grafana-aws-sdk v0.38.2/go.mod h1:j3vi+cXYHEFqjhBGrI6/lw1TNM+dl0Y3f0cSnDOPy+s= github.com/grafana/grafana-azure-sdk-go/v2 v2.1.6 h1:OfCkitCuomzZKW1WYHrG8MxKwtMhALb7jqoj+487eTg= github.com/grafana/grafana-azure-sdk-go/v2 v2.1.6/go.mod h1:V7y2BmsWxS3A9Ohebwn4OiSfJJqi//4JQydQ8fHTduo= github.com/grafana/grafana-cloud-migration-snapshot v1.6.0 h1:S4kHwr//AqhtL9xHBtz1gqVgZQeCRGTxjgsRBAkpjKY= @@ -1605,36 +1595,30 @@ github.com/grafana/grafana-openapi-client-go v0.0.0-20231213163343-bd475d63fb79 github.com/grafana/grafana-openapi-client-go v0.0.0-20231213163343-bd475d63fb79/go.mod h1:wc6Hbh3K2TgCUSfBC/BOzabItujtHMESZeFk5ZhdxhQ= github.com/grafana/grafana-plugin-sdk-go v0.277.0 h1:VDU2F4Y5NeRS//ejctdZtsAshrGaEdbtW33FsK0EQss= github.com/grafana/grafana-plugin-sdk-go v0.277.0/go.mod h1:mAUWg68w5+1f5TLDqagIr8sWr1RT9h7ufJl5NMcWJAU= -github.com/grafana/grafana/apps/advisor v0.0.0-20250506052906-7a2fc797fb4a h1:pcrnyCVvShv7XXdOKpLswEqigk0sYkBeEskYpb3Xnf8= -github.com/grafana/grafana/apps/advisor v0.0.0-20250506052906-7a2fc797fb4a/go.mod h1:xOL9buMMbQg+3m0jPfrza4/5iwe4EBrnur/aJGAA1pM= -github.com/grafana/grafana/apps/alerting/notifications v0.0.0-20250508142345-620260fabcfb h1:8EYzQWdva4DhkXWIjM089N1lsyUxAK+7eG1+Ol55owE= -github.com/grafana/grafana/apps/alerting/notifications v0.0.0-20250508142345-620260fabcfb/go.mod h1:t+FXs1v6c+HRAtnWhd4OHi1hOjTtiUr/8ZfBD4UOEZA= -github.com/grafana/grafana/apps/dashboard v0.0.0-20250506052906-7a2fc797fb4a h1:Op8IaMLc8GyltYqTHbBJqEJE53K7u/kgeRRKldnbIoU= -github.com/grafana/grafana/apps/dashboard v0.0.0-20250506052906-7a2fc797fb4a/go.mod h1:Jm+oN15Mz5zLomueCvg7JTzc0bU5TDf8FVEsVYRbivU= -github.com/grafana/grafana/apps/folder v0.0.0-20250506052906-7a2fc797fb4a h1:/P+/CCZQ76reMtSvUdyTKSXBQjX+DDNBa1MXgXRRHy8= -github.com/grafana/grafana/apps/folder v0.0.0-20250506052906-7a2fc797fb4a/go.mod h1:hYtCxd1P5H0oBU42yf3iy8usA/0amreOaOaETRKqG/4= -github.com/grafana/grafana/apps/investigations v0.0.0-20250506052906-7a2fc797fb4a h1:x8Bmzx0QuG50c8pbkIGQMtZNY2mVRY0XCtUApleKBnA= -github.com/grafana/grafana/apps/investigations v0.0.0-20250506052906-7a2fc797fb4a/go.mod h1:pI3xLwHRhaMTYO5pgA34/ros5suc5J1H+HAdRfwlbx4= -github.com/grafana/grafana/apps/playlist v0.0.0-20250506052906-7a2fc797fb4a h1:6DXQ84Hen7lY73uf2iB8gEEokAKJQWMi0NUhLA0Dqzg= -github.com/grafana/grafana/apps/playlist v0.0.0-20250506052906-7a2fc797fb4a/go.mod h1:9U44mptAJW8bkvgPgCxsnki58/nz3wKPgDayeyeFWJs= -github.com/grafana/grafana/pkg/aggregator v0.0.0-20250506052906-7a2fc797fb4a h1:BuI54sGZ50y2bJzLUIfVTyVADoT15j00vJ4UE8lXiS4= -github.com/grafana/grafana/pkg/aggregator v0.0.0-20250506052906-7a2fc797fb4a/go.mod h1:lR9iC/cP9HjGEuuGdmY12srQWxnJ57apBR3wjs8Nu24= -github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250506052906-7a2fc797fb4a h1:fifgkG+6ZtI+S7NRrtTCA1+Ue3AApN3mxyAJEORrtDE= -github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250506052906-7a2fc797fb4a/go.mod h1:3MwgP0ISxGviTy3ZUJZsNz/56NNtHztMlH+gcxDt6Tw= -github.com/grafana/grafana/pkg/apis/secret v0.0.0-20250506052906-7a2fc797fb4a h1:yiirQj9r2M+imIwsexRV+uk5ZYaEZ1eJiQ+PFHbWVg4= -github.com/grafana/grafana/pkg/apis/secret v0.0.0-20250506052906-7a2fc797fb4a/go.mod h1:L6lSC6q+tugol2mX0So7X1p4r8Z1+/j3yJd3dANpQiM= -github.com/grafana/grafana/pkg/apiserver v0.0.0-20250506052906-7a2fc797fb4a h1:HCOrXGvdPolbZ/Cw9AoT1p1de1PInZTB3ri0Y9K0E18= -github.com/grafana/grafana/pkg/apiserver v0.0.0-20250506052906-7a2fc797fb4a/go.mod h1:Ex2YDQIZ4MQ2btNuCGs8c8aDb6CG3oJ3X0vLtejAfPM= +github.com/grafana/grafana/apps/advisor v0.0.0-20250527064921-326081cdb7a1 h1:k7Gj+eevux9Z3u4t/oWiogCoFe5IpW13aCTGpKT862s= +github.com/grafana/grafana/apps/advisor v0.0.0-20250527064921-326081cdb7a1/go.mod h1:T4eaJioKjG8GQJS6sf8xMrzWV1QZrcOjxrSf4hbBiXM= +github.com/grafana/grafana/apps/alerting/notifications v0.0.0-20250527064921-326081cdb7a1 h1:aE74WuajAAxB3FwMlIDjpsGoGLRsk4OOMvEDBLd+fmk= +github.com/grafana/grafana/apps/alerting/notifications v0.0.0-20250527064921-326081cdb7a1/go.mod h1:u5uyB/n3LAUJzQyvacslofKbqpmaJlbNhf5D5DuqqfQ= +github.com/grafana/grafana/apps/dashboard v0.0.0-20250527064921-326081cdb7a1 h1:PvFgi427ucHJ1mn1kvsJ+EeekI9QLbAY21ZB3SDdkvk= +github.com/grafana/grafana/apps/dashboard v0.0.0-20250527064921-326081cdb7a1/go.mod h1:+lc/5QaSsFUDRc+/3hp6Puua3yqxXF3OUH3rxhDNpK4= +github.com/grafana/grafana/apps/folder v0.0.0-20250527064921-326081cdb7a1 h1:SkVUcSlXIUi46gSGfe5/Xqn2p51c/unmkZRDX+274Os= +github.com/grafana/grafana/apps/folder v0.0.0-20250527064921-326081cdb7a1/go.mod h1:z9u5VFG9q1CcIt62c9RIP8dEWHX81NdiPCjtpKKeuFU= +github.com/grafana/grafana/apps/investigations v0.0.0-20250527064921-326081cdb7a1 h1:IN+KiBwtvJ3JCLdsPyAmGKJupWckH3h5iXpELd78rPo= +github.com/grafana/grafana/apps/investigations v0.0.0-20250527064921-326081cdb7a1/go.mod h1:/uuCYrNS3VOTZ7gTD+cBHD9WBIYhqj7bK6EnX3TP1wg= +github.com/grafana/grafana/apps/playlist v0.0.0-20250527064921-326081cdb7a1 h1:GNPPHXhUv++4qKdrUJg/Mfi/HJPGlc5u+/FjElYAcOM= +github.com/grafana/grafana/apps/playlist v0.0.0-20250527064921-326081cdb7a1/go.mod h1:vs6jlF70+L9Uqy0KsjCtL/2+2GaNDYFcwot9IegHPYM= +github.com/grafana/grafana/pkg/aggregator v0.0.0-20250527064921-326081cdb7a1 h1:vuA+oUuoHMMY5I0cHoaxxvP4eGXF85FzYfcRHR3h7Kg= +github.com/grafana/grafana/pkg/aggregator v0.0.0-20250527064921-326081cdb7a1/go.mod h1:Jl4g/MgBMPJMOB6kwHwM2uzr4QL9UmXp04rTQOlea2I= +github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250527064921-326081cdb7a1 h1:BvtPNSVy2+MuZdQFBGDbWR6/+Lp7Ijl+bH8wNptLx9U= +github.com/grafana/grafana/pkg/apimachinery v0.0.0-20250527064921-326081cdb7a1/go.mod h1:p1Q8MY8UW4+BxfL5TpjhFurNSO6tllA19WztfV9qC8Y= +github.com/grafana/grafana/pkg/apis/secret v0.0.0-20250527064921-326081cdb7a1 h1:gD091aZUUq8Ib1lok1cw1r2gNWo4+QTO9Nr0yN49SnY= +github.com/grafana/grafana/pkg/apis/secret v0.0.0-20250527064921-326081cdb7a1/go.mod h1:Fq5yeCrxqwbvhvHLXekhDVzpK5P2a0tgV2JfLUDOCM8= +github.com/grafana/grafana/pkg/apiserver v0.0.0-20250527064921-326081cdb7a1 h1:KYmCdYLJ2sBJtvwApasjp6XSONrZJrJPOYpqn1uSivA= +github.com/grafana/grafana/pkg/apiserver v0.0.0-20250527064921-326081cdb7a1/go.mod h1:sDbqUtVpLKw6/zVawXnauo/eqgBL0IvvLONMa2brWg0= github.com/grafana/grafana/pkg/promlib v0.0.8 h1:VUWsqttdf0wMI4j9OX9oNrykguQpZcruudDAFpJJVw0= github.com/grafana/grafana/pkg/promlib v0.0.8/go.mod h1:U1ezG/MGaEPoThqsr3lymMPN5yIPdVTJnDZ+wcXT+ao= -github.com/grafana/grafana/pkg/semconv v0.0.0-20250422074709-7c8433fbb2c2 h1:uKOBkqzjMwimPJvTOjlo0bFrrR17w8U5l3HtDETPacQ= -github.com/grafana/grafana/pkg/semconv v0.0.0-20250422074709-7c8433fbb2c2/go.mod h1:w5oIOh8JhAEY/GwiIrLGBBRv2w0D7Ngv+dznv4k8Tek= -github.com/grafana/grafana/pkg/storage/unified/apistore v0.0.0-20250506052906-7a2fc797fb4a h1:2g/anKApzZYtClnHryXpURF3gPyGHbJs1pyU4Y6u55A= -github.com/grafana/grafana/pkg/storage/unified/apistore v0.0.0-20250506052906-7a2fc797fb4a/go.mod h1:/eXW4g4cROVmDxH0OhCoXmp9n+xULrmnncMUyFHXxP0= -github.com/grafana/grafana/pkg/storage/unified/resource v0.0.0-20250506052906-7a2fc797fb4a h1:7QIwgb9nZmVPRjSi+UQDhjxrAWmEVExXLh4+TfoN/MU= -github.com/grafana/grafana/pkg/storage/unified/resource v0.0.0-20250506052906-7a2fc797fb4a/go.mod h1:fs8tmn4kliX1914EZfGOL+A6BUqejjbdL+7Dj9ZmZPA= -github.com/grafana/grafana/pkg/storage/unified/resourcepb v0.0.0-20250516070222-10994220504a h1:fWG9hWi5V7Lj/x1/SZwbvHOpVpGixUcdV7Prc6wO2uk= -github.com/grafana/grafana/pkg/storage/unified/resourcepb v0.0.0-20250516070222-10994220504a/go.mod h1:hKusgccNxdAcv1x3cMSM46XYcUeLB7tWjnPP6m9tbG4= +github.com/grafana/grafana/pkg/semconv v0.0.0-20250527064921-326081cdb7a1 h1:H37QjQ9bMNzR8R6OCmc6b8WCDfas27oQ0Vmkur2ar/M= +github.com/grafana/grafana/pkg/semconv v0.0.0-20250527064921-326081cdb7a1/go.mod h1:96h4xqAlVxlz+d7ZvocyxED/HojMyed0dD7z7tN76Yk= github.com/grafana/jsonparser v0.0.0-20240425183733-ea80629e1a32 h1:NznuPwItog+rwdVg8hAuGKP29ndRSzJAwhxKldkP8oQ= github.com/grafana/jsonparser v0.0.0-20240425183733-ea80629e1a32/go.mod h1:796sq+UcONnSlzA3RtlBZ+b/hrerkZXiEmO8oMjyRwY= github.com/grafana/loki/pkg/push v0.0.0-20231124142027-e52380921608 h1:ZYk42718kSXOiIKdjZKljWLgBpzL5z1yutKABksQCMg= @@ -1647,16 +1631,16 @@ github.com/grafana/prometheus-alertmanager v0.25.1-0.20250417181314-6d0f5436a1fb github.com/grafana/prometheus-alertmanager v0.25.1-0.20250417181314-6d0f5436a1fb/go.mod h1:FGdGvhI40Dq+CTQaSzK9evuve774cgOUdGfVO04OXkw= github.com/grafana/pyroscope-go/godeltaprof v0.1.8 h1:iwOtYXeeVSAeYefJNaxDytgjKtUuKQbJqgAIjlnicKg= github.com/grafana/pyroscope-go/godeltaprof v0.1.8/go.mod h1:2+l7K7twW49Ct4wFluZD3tZ6e0SjanjcUUBPVD/UuGU= -github.com/grafana/pyroscope/api v1.0.0 h1:RWK3kpv8EAnB7JpOqnf//xwE84DdKF03N/iFxpFAoHY= -github.com/grafana/pyroscope/api v1.0.0/go.mod h1:CUrgOgSZDnx4M1mlRoxhrVKkTuKIse9p4FtuPbrGA04= +github.com/grafana/pyroscope/api v1.2.1-0.20250415190842-3ff7247547ae h1:35W3Wjp9KWnSoV/DuymmyIj5aHE0CYlDQ5m2KeXUPAc= +github.com/grafana/pyroscope/api v1.2.1-0.20250415190842-3ff7247547ae/go.mod h1:6CJ1uXmLZ13ufpO9xE4pST+DyaBt0uszzrV0YnoaVLQ= github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc h1:GN2Lv3MGO7AS6PrRoT6yV5+wkrOpcszoIsO4+4ds248= github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc/go.mod h1:+JKpmjMGhpgPL+rXZ5nsZieVzvarn86asRlBg4uNGnk= github.com/grafana/saml v0.4.15-0.20240917091248-ae3bbdad8a56 h1:SDGrP81Vcd102L3UJEryRd1eestRw73wt+b8vnVEFe0= github.com/grafana/saml v0.4.15-0.20240917091248-ae3bbdad8a56/go.mod h1:S4+611dxnKt8z/ulbvaJzcgSHsuhjVc1QHNTcr1R7Fw= github.com/grafana/sqlds/v4 v4.2.0 h1:7qZmuTzLMZFtszX14NyefU3R6WVtx27i7WduRDLKKOE= github.com/grafana/sqlds/v4 v4.2.0/go.mod h1:OyEREvYCd2U/qXiIK/iprQ/4VUF2TTemIixFdUeGsOc= -github.com/grafana/tempo v1.5.1-0.20241001135150-ed943d7a56b2 h1:XMreZ1SPjLpd9zhql5FXKFYwAcgBzS2E2MOPx4n+FyY= -github.com/grafana/tempo v1.5.1-0.20241001135150-ed943d7a56b2/go.mod h1:UKONJhBCxmL+0ri27VMledCVzZIJqnl6Ah24A5vCRzs= +github.com/grafana/tempo v1.5.1-0.20250529124718-87c2dc380cec h1:wnzJov9RhSHGaTYGzTygL4qq986fLen8xSqnQgaMd28= +github.com/grafana/tempo v1.5.1-0.20250529124718-87c2dc380cec/go.mod h1:j1IY7J2rUz7TcTjFVVx6HCpyTlYOJPtXuGRZ7sI+vSo= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.1 h1:qnpSQwGEnkcRpTqNOIR6bJbR0gAorgP9CSALpRcKoAA= @@ -1674,12 +1658,11 @@ github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4Zs github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3 h1:5ZPtiqj0JL5oKWmcsq4VMaAW5ukBEgSGXEN89zeH1Jo= github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.3/go.mod h1:ndYquD05frm2vACXE1nsccT4oJzjhw2arTS2cpUD1PI= -github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= -github.com/hashicorp/consul/api v1.30.0 h1:ArHVMMILb1nQv8vZSGIwwQd2gtc+oSQZ6CalyiyH2XQ= -github.com/hashicorp/consul/api v1.30.0/go.mod h1:B2uGchvaXVW2JhFoS8nqTxMD5PBykr4ebY4JWHTTeLM= +github.com/hashicorp/consul/api v1.31.2 h1:NicObVJHcCmyOIl7Z9iHPvvFrocgTYo9cITSGg0/7pw= +github.com/hashicorp/consul/api v1.31.2/go.mod h1:Z8YgY0eVPukT/17ejW+l+C7zJmKwgPHtjU1q16v/Y40= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/consul/sdk v0.16.1 h1:V8TxTnImoPD5cj0U9Spl0TUxcytjcbbJeADFF07KdHg= @@ -1705,6 +1688,8 @@ github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iP github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-msgpack v1.1.5 h1:9byZdVjKTe5mce63pRVNP1L7UAmdHOTEMGehn6KvJWs= github.com/hashicorp/go-msgpack v1.1.5/go.mod h1:gWVc3sv/wbDmR3rQsj1CAktEZzoz1YNK9NfGLXJ69/4= +github.com/hashicorp/go-msgpack/v2 v2.1.1 h1:xQEY9yB2wnHitoSzk/B9UjXWRQ67QKu5AOm8aFp8N3I= +github.com/hashicorp/go-msgpack/v2 v2.1.1/go.mod h1:upybraOAblm4S7rx0+jeNy+CWWhzywQsSRV5033mMu4= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= @@ -1719,8 +1704,9 @@ github.com/hashicorp/go-rootcerts v1.0.1/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR3 github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-sockaddr v1.0.6 h1:RSG8rKU28VTUTvEKghe5gIhIQpv8evvNpnDEyqO4u9I= github.com/hashicorp/go-sockaddr v1.0.6/go.mod h1:uoUUmtwU7n9Dv3O4SNLeFvg0SxQ3lyjsj6+CCykpaxI= +github.com/hashicorp/go-sockaddr v1.0.7 h1:G+pTkSO01HpR5qCxg7lxfsFEZaG+C0VssTy/9dbT+Fw= +github.com/hashicorp/go-sockaddr v1.0.7/go.mod h1:FZQbEYa1pxkQ7WLpyXJ6cbjpT8q0YgQaK/JakXqGyWw= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= @@ -1747,8 +1733,9 @@ github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/ github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.1.4/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= -github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= +github.com/hashicorp/memberlist v0.5.1 h1:mk5dRuzeDNis2bi6LLoQIXfMH7JQvAzt3mQD0vNZZUo= +github.com/hashicorp/memberlist v0.5.1/go.mod h1:zGDXV6AqbDTKTM6yxW0I4+JtFzZAJVoIPvss4hV8F24= github.com/hashicorp/nomad/api v0.0.0-20241218080744-e3ac00f30eec h1:+YBzb977VrmffaCX/OBm17dEVJUcWn5dW+eqs3aIJ/A= github.com/hashicorp/nomad/api v0.0.0-20241218080744-e3ac00f30eec/go.mod h1:svtxn6QnrQ69P23VvIWMR34tg3vmwLz4UdUzm1dSCgE= github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= @@ -1759,8 +1746,8 @@ github.com/hashicorp/serf v0.10.1 h1:Z1H2J60yRKvfDYAOZLd2MU0ND4AH/WDz7xYHDWQsIPY github.com/hashicorp/serf v0.10.1/go.mod h1:yL2t6BqATOLGc5HF7qbFkTfXoPIY0WZdWHfEvMqbG+4= github.com/hashicorp/yamux v0.1.1 h1:yrQxtgseBDrq9Y652vSRDvsKCJKOUD+GzTS4Y0Y8pvE= github.com/hashicorp/yamux v0.1.1/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= -github.com/hetznercloud/hcloud-go/v2 v2.17.1 h1:DPi019dv0WCiECEmtcuTgc//hBvnxESb6QlJnAb4a04= -github.com/hetznercloud/hcloud-go/v2 v2.17.1/go.mod h1:6ygmBba+FdawR2lLp/d9uJljY2k0dTYthprrI8usdLw= +github.com/hetznercloud/hcloud-go/v2 v2.19.1 h1:UU/7h3uc/rdgspM8xkQF7wokmwZXePWDXcLqrQRRzzY= +github.com/hetznercloud/hcloud-go/v2 v2.19.1/go.mod h1:r5RTzv+qi8IbLcDIskTzxkFIji7Ovc8yNgepQR9M+UA= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= github.com/huandu/xstrings v1.3.1/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= github.com/huandu/xstrings v1.3.2/go.mod h1:y5/lhBue+AyNmUVz9RLU9xbLR0o4KIIExikq4ovT0aE= @@ -1783,16 +1770,16 @@ github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf h1:7JTmne github.com/influxdata/line-protocol v0.0.0-20210922203350-b1ad95c89adf/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/invopop/jsonschema v0.13.0 h1:KvpoAJWEjR3uD9Kbm2HWJmqsEaHt8lBUpd0qHcIi21E= github.com/invopop/jsonschema v0.13.0/go.mod h1:ffZ5Km5SWWRAIN6wbDXItl95euhFz2uON45H2qjYt+0= -github.com/ionos-cloud/sdk-go/v6 v6.3.0 h1:/lTieTH9Mo/CWm3cTlFLnK10jgxjUGkAqRffGqvPteY= -github.com/ionos-cloud/sdk-go/v6 v6.3.0/go.mod h1:SXrO9OGyWjd2rZhAhEpdYN6VUAODzzqRdqA9BCviQtI= +github.com/ionos-cloud/sdk-go/v6 v6.3.2 h1:2mUmrZZz6cPyT9IRX0T8fBLc/7XU/eTxP2Y5tS7/09k= +github.com/ionos-cloud/sdk-go/v6 v6.3.2/go.mod h1:SXrO9OGyWjd2rZhAhEpdYN6VUAODzzqRdqA9BCviQtI= github.com/jackc/fake v0.0.0-20150926172116-812a484cc733/go.mod h1:WrMFNQdiFJ80sQsxDoMokWK1W5TQtxBFNpzWTD84ibQ= github.com/jackc/pgpassfile v1.0.0 h1:/6Hmqy13Ss2zCq62VdNG8tM1wchn8zjSGOBJ6icpsIM= github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 h1:iCEnooe7UlwOQYpKFhBabPMi4aNAfoODPEFNiAnClxo= github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= github.com/jackc/pgx v3.2.0+incompatible/go.mod h1:0ZGrqGqkRlliWnWB4zKnWtjbSWbGkVEFm4TeybAXq+I= -github.com/jackc/pgx/v5 v5.7.4 h1:9wKznZrhWa2QiHL+NjTSPP6yjl3451BX3imWDnokYlg= -github.com/jackc/pgx/v5 v5.7.4/go.mod h1:ncY89UGWxg82EykZUwSpUKEfccBGGYq1xjrOpsbsfGQ= +github.com/jackc/pgx/v5 v5.7.5 h1:JHGfMnQY+IEtGM63d+NGMjoRpysB2JBwDr5fsngwmJs= +github.com/jackc/pgx/v5 v5.7.5/go.mod h1:aruU7o91Tc2q2cFp5h4uP3f6ztExVpyVv88Xl/8Vl8M= github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo= github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= @@ -1859,8 +1846,8 @@ github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALr github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6 h1:IsMZxCuZqKuao2vNdfD82fjjgPLfyHLpR41Z88viRWs= -github.com/keybase/go-keychain v0.0.0-20231219164618-57a3676c3af6/go.mod h1:3VeWNIJaW+O5xpRQbPp0Ybqu1vJd/pm7s2F473HRrkw= +github.com/keybase/go-keychain v0.0.1 h1:way+bWYa6lDppZoZcgMbYsvC7GxljxrskdNInRtuthU= +github.com/keybase/go-keychain v0.0.1/go.mod h1:PdEILRW3i9D8JcdM+FmY6RwkHGnhHxXwkPPMeUgOK1k= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= @@ -1912,8 +1899,8 @@ github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw= github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/linode/linodego v1.43.0 h1:sGeBB3caZt7vKBoPS5p4AVzmlG4JoqQOdigIibx3egk= -github.com/linode/linodego v1.43.0/go.mod h1:n4TMFu1UVNala+icHqrTEFFaicYSF74cSAUG5zkTwfA= +github.com/linode/linodego v1.47.0 h1:6MFNCyzWbr8Rhl4r7d5DwZLwxvFIsM4ARH6W0KS/R0U= +github.com/linode/linodego v1.47.0/go.mod h1:vyklQRzZUWhFVBZdYx4dcYJU/gG9yKB9VUcUs6ub0Lk= github.com/lyft/protoc-gen-star v0.6.0/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= github.com/lyft/protoc-gen-star v0.6.1/go.mod h1:TGAoBVkt8w7MPG72TrKIu85MIdXwDuzJYeZuUPFPNwA= github.com/lyft/protoc-gen-star/v2 v2.0.1/go.mod h1:RcCdONR2ScXaYnQC5tUzxzlpA3WVYF7/opLeUgcQs/o= @@ -1984,18 +1971,20 @@ github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3N github.com/miekg/dns v1.1.15/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= -github.com/miekg/dns v1.1.62 h1:cN8OuEF1/x5Rq6Np+h1epln8OiyPWV+lROx9LxcGgIQ= -github.com/miekg/dns v1.1.62/go.mod h1:mvDlcItzm+br7MToIKqkglaGhlFMHJ9DTNNWONWXbNQ= +github.com/miekg/dns v1.1.63 h1:8M5aAw6OMZfFXTT7K5V0Eu5YiiL8l7nUAkyN6C9YwaY= +github.com/miekg/dns v1.1.63/go.mod h1:6NGHfjhpmr5lt3XPLuyfDJi5AXbNIPM9PY6H6sF1Nfs= github.com/migueleliasweb/go-github-mock v1.1.0 h1:GKaOBPsrPGkAKgtfuWY8MclS1xR6MInkx1SexJucMwE= github.com/migueleliasweb/go-github-mock v1.1.0/go.mod h1:pYe/XlGs4BGMfRY4vmeixVsODHnVDDhJ9zoi0qzSMHc= github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= +github.com/minio/crc64nvme v1.0.1 h1:DHQPrYPdqK7jQG/Ls5CTBZWeex/2FMS3G5XGkycuFrY= +github.com/minio/crc64nvme v1.0.1/go.mod h1:eVfm2fAzLlxMdUGc0EEBGSMmPwmXD5XiNRpnu9J3bvg= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= -github.com/minio/minio-go/v7 v7.0.75 h1:0uLrB6u6teY2Jt+cJUVi9cTvDRuBKWSRzSAcznRkwlE= -github.com/minio/minio-go/v7 v7.0.75/go.mod h1:qydcVzV8Hqtj1VtEocfxbmVFa2siu6HGa+LDEPogjD8= +github.com/minio/minio-go/v7 v7.0.91 h1:tWLZnEfo3OZl5PoXQwcwTAPNNrjyWwOh6cbZitW5JQc= +github.com/minio/minio-go/v7 v7.0.91/go.mod h1:uvMUcGrpgeSAAI6+sD3818508nUyMULw94j2Nxku/Go= github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/cli v1.1.5/go.mod h1:v8+iFts2sPIKUV1ltktPXMCC8fumSKFItNcD2cLtRR4= @@ -2106,10 +2095,10 @@ github.com/openfga/api/proto v0.0.0-20250127102726-f9709139a369 h1:wEsCZ4oBuu8Lf github.com/openfga/api/proto v0.0.0-20250127102726-f9709139a369/go.mod h1:m74TNgnAAIJ03gfHcx+xaRWnr+IbQy3y/AVNwwCFrC0= github.com/openfga/language/pkg/go v0.2.0-beta.2.0.20250220223040-ed0cfba54336 h1:pYuYanFfgYrvDoSu/nnThT9P60mw5Yx7PMEI7FYychM= github.com/openfga/language/pkg/go v0.2.0-beta.2.0.20250220223040-ed0cfba54336/go.mod h1:IWRgDIekw3UGSWINwmCALHpMmn6NEJzz6e7KZGm+xQ4= -github.com/openfga/openfga v1.8.12 h1:xEirA6tFwaJfjBDtbHWCK0/Tw+B8XleRyhg9dcEpzHo= -github.com/openfga/openfga v1.8.12/go.mod h1:fIZyekdNB+tWQ6zIiglZonAc5ErZiDGMeHue/BzRYRM= -github.com/opentracing-contrib/go-grpc v0.0.0-20210225150812-73cb765af46e h1:4cPxUYdgaGzZIT5/j0IfqOrrXmq6bG8AwvwisMXpdrg= -github.com/opentracing-contrib/go-grpc v0.0.0-20210225150812-73cb765af46e/go.mod h1:DYR5Eij8rJl8h7gblRrOZ8g0kW1umSpKqYIBTgeDtLo= +github.com/openfga/openfga v1.8.13 h1:ROURkotKhbmtyBX3188+cNElN8AOZmTl0CMkxUqwawo= +github.com/openfga/openfga v1.8.13/go.mod h1:h1VGcVW81eY1YyDtFx5+gxxAIEhIiOGR9SRGgs/X/k8= +github.com/opentracing-contrib/go-grpc v0.1.1 h1:Ws7IN1zyiL1DFqKQPhRXuKe5pLYzMfdxnC1qtajE2PE= +github.com/opentracing-contrib/go-grpc v0.1.1/go.mod h1:Nu6sz+4zzgxXu8rvKfnwjBEmHsuhTigxRwV2RhELrS8= github.com/opentracing-contrib/go-stdlib v0.0.0-20190519235532-cf7a6c988dc9/go.mod h1:PLldrQSroqzH70Xl+1DQcGnefIbqsKR7UDaiux3zV+w= github.com/opentracing-contrib/go-stdlib v1.0.0 h1:TBS7YuVotp8myLon4Pv7BtCBzOTo1DeZCld0Z63mW2w= github.com/opentracing-contrib/go-stdlib v1.0.0/go.mod h1:qtI1ogk+2JhVPIXVc6q+NHziSmy2W5GbdQZFUHADCBU= @@ -2119,8 +2108,8 @@ github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYr github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= github.com/openzipkin/zipkin-go v0.4.3 h1:9EGwpqkgnwdEIJ+Od7QVSEIH+ocmm5nPat0G7sjsSdg= github.com/openzipkin/zipkin-go v0.4.3/go.mod h1:M9wCJZFWCo2RiY+o1eBCEMe0Dp2S5LDHcMZmk3RmK7c= -github.com/ovh/go-ovh v1.6.0 h1:ixLOwxQdzYDx296sXcgS35TOPEahJkpjMGtzPadCjQI= -github.com/ovh/go-ovh v1.6.0/go.mod h1:cTVDnl94z4tl8pP1uZ/8jlVxntjSIf09bNcQ5TJSC7c= +github.com/ovh/go-ovh v1.7.0 h1:V14nF7FwDjQrZt9g7jzcvAAQ3HN6DNShRFRMC3jLoPw= +github.com/ovh/go-ovh v1.7.0/go.mod h1:cTVDnl94z4tl8pP1uZ/8jlVxntjSIf09bNcQ5TJSC7c= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -2165,8 +2154,8 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= -github.com/pressly/goose/v3 v3.24.2 h1:c/ie0Gm8rnIVKvnDQ/scHErv46jrDv9b4I0WRcFJzYU= -github.com/pressly/goose/v3 v3.24.2/go.mod h1:kjefwFB0eR4w30Td2Gj2Mznyw94vSP+2jJYkOVNbD1k= +github.com/pressly/goose/v3 v3.24.3 h1:DSWWNwwggVUsYZ0X2VitiAa9sKuqtBfe+Jr9zFGwWlM= +github.com/pressly/goose/v3 v3.24.3/go.mod h1:v9zYL4xdViLHCUUJh/mhjnm6JrK7Eul8AS93IxiZM4E= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM= github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= @@ -2195,8 +2184,8 @@ github.com/prometheus/client_model v0.3.0/go.mod h1:LDGWKZIo7rky3hgvBe+caln+Dr3d github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/client_model v0.4.1-0.20230718164431-9a2bf3000d16/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= -github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E= -github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY= +github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= +github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= github.com/prometheus/common v0.0.0-20181126121408-4724e9255275/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= @@ -2218,8 +2207,8 @@ github.com/prometheus/common/assets v0.2.0/go.mod h1:D17UVUE12bHbim7HzwUvtqm6gwB github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= github.com/prometheus/exporter-toolkit v0.11.0/go.mod h1:BVnENhnNecpwoTLiABx7mrPB/OLRIgN74qlQbV+FK1Q= -github.com/prometheus/exporter-toolkit v0.13.2 h1:Z02fYtbqTMy2i/f+xZ+UK5jy/bl1Ex3ndzh06T/Q9DQ= -github.com/prometheus/exporter-toolkit v0.13.2/go.mod h1:tCqnfx21q6qN1KA4U3Bfb8uWzXfijIrJz3/kTIqMV7g= +github.com/prometheus/exporter-toolkit v0.14.0 h1:NMlswfibpcZZ+H0sZBiTjrA3/aBFHkNZqE+iCj5EmRg= +github.com/prometheus/exporter-toolkit v0.14.0/go.mod h1:Gu5LnVvt7Nr/oqTBUC23WILZepW0nffNo10XdhQcwWA= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20181204211112-1dc9a6cbc91a/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -2233,13 +2222,13 @@ github.com/prometheus/procfs v0.8.0/go.mod h1:z7EfXMXOkbkqb9IINtpCn86r/to3BnA0ua github.com/prometheus/procfs v0.9.0/go.mod h1:+pB4zwohETzFnmlpe6yd2lSc+0/46IYZRB/chUwxUZY= github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= -github.com/prometheus/procfs v0.16.0 h1:xh6oHhKwnOJKMYiYBDWmkHqQPyiY40sny36Cmx2bbsM= -github.com/prometheus/procfs v0.16.0/go.mod h1:8veyXUu3nGP7oaCxhX6yeaM5u4stL2FeMXnCqhDthZg= +github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= +github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= github.com/prometheus/prometheus v0.0.0-20190818123050-43acd0e2e93f/go.mod h1:rMTlmxGCvukf2KMu3fClMDKLLoJ5hl61MhcJ7xKakf0= -github.com/prometheus/prometheus v0.301.0 h1:0z8dgegmILivNomCd79RKvVkIols8vBGPKmcIBc7OyY= -github.com/prometheus/prometheus v0.301.0/go.mod h1:BJLjWCKNfRfjp7Q48DrAjARnCi7GhfUVvUFEAWTssZM= -github.com/prometheus/sigv4 v0.1.0 h1:FgxH+m1qf9dGQ4w8Dd6VkthmpFQfGTzUeavMoQeG1LA= -github.com/prometheus/sigv4 v0.1.0/go.mod h1:doosPW9dOitMzYe2I2BN0jZqUuBrGPbXrNsTScN18iU= +github.com/prometheus/prometheus v0.303.1 h1:He/2jRE6sB23Ew38AIoR1WRR3fCMgPlJA2E0obD2WSY= +github.com/prometheus/prometheus v0.303.1/go.mod h1:WEq2ogBPZoLjj9x5K67VEk7ECR0nRD9XCjaOt1lsYck= +github.com/prometheus/sigv4 v0.1.2 h1:R7570f8AoM5YnTUPFm3mjZH5q2k4D+I/phCWvZ4PXG8= +github.com/prometheus/sigv4 v0.1.2/go.mod h1:GF9fwrvLgkQwDdQ5BXeV9XUSCH/IPNqzvAoaohfjqMU= github.com/protocolbuffers/txtpbfmt v0.0.0-20241112170944-20d2c9ebc01d h1:HWfigq7lB31IeJL8iy7jkUmU/PG1Sr8jVGhS749dbUA= github.com/protocolbuffers/txtpbfmt v0.0.0-20241112170944-20d2c9ebc01d/go.mod h1:jgxiZysxFPM+iWKwQwPR+y+Jvo54ARd4EisXxKYpB5c= github.com/puzpuzpuz/xsync/v2 v2.5.1 h1:mVGYAvzDSu52+zaGyNjC+24Xw2bQi3kTr4QJ6N9pIIU= @@ -2270,8 +2259,8 @@ github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7 github.com/rs/cors v1.10.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= -github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= +github.com/rs/xid v1.6.0 h1:fV591PaemRlL6JfRxGDEPl69wICngIQ3shQtzfy2gxU= +github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0= github.com/russellhaering/goxmldsig v1.4.0 h1:8UcDh/xGyQiyrW+Fq5t8f+l2DLB1+zlhYzkPUJ7Qhys= github.com/russellhaering/goxmldsig v1.4.0/go.mod h1:gM4MDENBQf7M+V824SGfyIUVFWydB7n0KkEubVJl+Tw= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= @@ -2287,8 +2276,8 @@ github.com/sagikazarmark/locafero v0.7.0 h1:5MqpDsTGNDhY8sGp0Aowyf0qKsPrhewaLSsF github.com/sagikazarmark/locafero v0.7.0/go.mod h1:2za3Cg5rMaTMoG/2Ulr9AwtFaIppKXTRYnozin4aB5k= github.com/samuel/go-zookeeper v0.0.0-20190810000440-0ceca61e4d75/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.30 h1:yoKAVkEVwAqbGbR8n87rHQ1dulL25rKloGadb3vm770= -github.com/scaleway/scaleway-sdk-go v1.0.0-beta.30/go.mod h1:sH0u6fq6x4R5M7WxkoQFY/o7UaiItec0o1LinLCJNq8= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.32 h1:4+LP7qmsLSGbmc66m1s5dKRMBwztRppfxFKlYqYte/c= +github.com/scaleway/scaleway-sdk-go v1.0.0-beta.32/go.mod h1:kzh+BSAvpoyHHdHBCDhmSWtBc1NbLMZ2lWHqnBoxFks= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys= @@ -2392,7 +2381,6 @@ github.com/stretchr/testify v1.7.5/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= @@ -2493,23 +2481,23 @@ gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b/go.mod h1:T3BPAOm2 go.etcd.io/bbolt v1.4.0 h1:TU77id3TnN/zKr7CO/uk+fBCwF2jGcMuw2B/FMAzYIk= go.etcd.io/bbolt v1.4.0/go.mod h1:AsD+OCi/qPN1giOX1aiLAha3o1U8rAz65bvN4j0sRuk= go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= -go.etcd.io/etcd/api/v3 v3.5.16 h1:WvmyJVbjWqK4R1E+B12RRHz3bRGy9XVfh++MgbN+6n0= -go.etcd.io/etcd/api/v3 v3.5.16/go.mod h1:1P4SlIP/VwkDmGo3OlOD7faPeP8KDIFhqvciH5EfN28= +go.etcd.io/etcd/api/v3 v3.5.21 h1:A6O2/JDb3tvHhiIz3xf9nJ7REHvtEFJJ3veW3FbCnS8= +go.etcd.io/etcd/api/v3 v3.5.21/go.mod h1:c3aH5wcvXv/9dqIw2Y810LDXJfhSYdHQ0vxmP3CCHVY= go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= -go.etcd.io/etcd/client/pkg/v3 v3.5.16 h1:ZgY48uH6UvB+/7R9Yf4x574uCO3jIx0TRDyetSfId3Q= -go.etcd.io/etcd/client/pkg/v3 v3.5.16/go.mod h1:V8acl8pcEK0Y2g19YlOV9m9ssUe6MgiDSobSoaBAM0E= +go.etcd.io/etcd/client/pkg/v3 v3.5.21 h1:lPBu71Y7osQmzlflM9OfeIV2JlmpBjqBNlLtcoBqUTc= +go.etcd.io/etcd/client/pkg/v3 v3.5.21/go.mod h1:BgqT/IXPjK9NkeSDjbzwsHySX3yIle2+ndz28nVsjUs= go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= -go.etcd.io/etcd/client/v2 v2.305.16 h1:kQrn9o5czVNaukf2A2At43cE9ZtWauOtf9vRZuiKXow= -go.etcd.io/etcd/client/v2 v2.305.16/go.mod h1:h9YxWCzcdvZENbfzBTFCnoNumr2ax3F19sKMqHFmXHE= +go.etcd.io/etcd/client/v2 v2.305.21 h1:eLiFfexc2mE+pTLz9WwnoEsX5JTTpLCYVivKkmVXIRA= +go.etcd.io/etcd/client/v2 v2.305.21/go.mod h1:OKkn4hlYNf43hpjEM3Ke3aRdUkhSl8xjKjSf8eCq2J8= go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= -go.etcd.io/etcd/client/v3 v3.5.16 h1:sSmVYOAHeC9doqi0gv7v86oY/BTld0SEFGaxsU9eRhE= -go.etcd.io/etcd/client/v3 v3.5.16/go.mod h1:X+rExSGkyqxvu276cr2OwPLBaeqFu1cIl4vmRjAD/50= -go.etcd.io/etcd/pkg/v3 v3.5.16 h1:cnavs5WSPWeK4TYwPYfmcr3Joz9BH+TZ6qoUtz6/+mc= -go.etcd.io/etcd/pkg/v3 v3.5.16/go.mod h1:+lutCZHG5MBBFI/U4eYT5yL7sJfnexsoM20Y0t2uNuY= -go.etcd.io/etcd/raft/v3 v3.5.16 h1:zBXA3ZUpYs1AwiLGPafYAKKl/CORn/uaxYDwlNwndAk= -go.etcd.io/etcd/raft/v3 v3.5.16/go.mod h1:P4UP14AxofMJ/54boWilabqqWoW9eLodl6I5GdGzazI= -go.etcd.io/etcd/server/v3 v3.5.16 h1:d0/SAdJ3vVsZvF8IFVb1k8zqMZ+heGcNfft71ul9GWE= -go.etcd.io/etcd/server/v3 v3.5.16/go.mod h1:ynhyZZpdDp1Gq49jkUg5mfkDWZwXnn3eIqCqtJnrD/s= +go.etcd.io/etcd/client/v3 v3.5.21 h1:T6b1Ow6fNjOLOtM0xSoKNQt1ASPCLWrF9XMHcH9pEyY= +go.etcd.io/etcd/client/v3 v3.5.21/go.mod h1:mFYy67IOqmbRf/kRUvsHixzo3iG+1OF2W2+jVIQRAnU= +go.etcd.io/etcd/pkg/v3 v3.5.21 h1:jUItxeKyrDuVuWhdh0HtjUANwyuzcb7/FAeUfABmQsk= +go.etcd.io/etcd/pkg/v3 v3.5.21/go.mod h1:wpZx8Egv1g4y+N7JAsqi2zoUiBIUWznLjqJbylDjWgU= +go.etcd.io/etcd/raft/v3 v3.5.21 h1:dOmE0mT55dIUsX77TKBLq+RgyumsQuYeiRQnW/ylugk= +go.etcd.io/etcd/raft/v3 v3.5.21/go.mod h1:fmcuY5R2SNkklU4+fKVBQi2biVp5vafMrWUEj4TJ4Cs= +go.etcd.io/etcd/server/v3 v3.5.21 h1:9w0/k12majtgarGmlMVuhwXRI2ob3/d1Ik3X5TKo0yU= +go.etcd.io/etcd/server/v3 v3.5.21/go.mod h1:G1mOzdwuzKT1VRL7SqRchli/qcFrtLBTAQ4lV20sXXo= go.mongodb.org/mongo-driver v1.0.3/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.0.4/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= go.mongodb.org/mongo-driver v1.1.0/go.mod h1:u7ryQJ+DOzQmeO7zB6MHyr8jkEQvC8vH7qLUO4lqsUM= @@ -2528,10 +2516,10 @@ go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= -go.opentelemetry.io/collector/pdata v1.22.0 h1:3yhjL46NLdTMoP8rkkcE9B0pzjf2973crn0KKhX5UrI= -go.opentelemetry.io/collector/pdata v1.22.0/go.mod h1:nLLf6uDg8Kn5g3WNZwGyu8+kf77SwOqQvMTb5AXEbEY= -go.opentelemetry.io/contrib/detectors/gcp v1.34.0 h1:JRxssobiPg23otYU5SbWtQC//snGVIM3Tx6QRzlQBao= -go.opentelemetry.io/contrib/detectors/gcp v1.34.0/go.mod h1:cV4BMFcscUR/ckqLkbfQmF0PRsq8w/lMGzdbCSveBHo= +go.opentelemetry.io/collector/pdata v1.30.0 h1:j3jyq9um436r6WzWySzexP2nLnFdmL5uVBYAlyr9nDM= +go.opentelemetry.io/collector/pdata v1.30.0/go.mod h1:0Bxu1ktuj4wE7PIASNSvd0SdBscQ1PLtYasymJ13/Cs= +go.opentelemetry.io/contrib/detectors/gcp v1.35.0 h1:bGvFt68+KTiAKFlacHW6AhA56GF2rS0bdD3aJYEnmzA= +go.opentelemetry.io/contrib/detectors/gcp v1.35.0/go.mod h1:qGWP8/+ILwMRIUf9uIVLloR1uo5ZYAslM4O6OqUi1DA= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0/go.mod h1:rg+RlpR5dKwaS95IyyZqj5Wd4E13lk/msnTS0Xl9lJM= go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.55.0/go.mod h1:rsg1EO8LXSs2po50PB5CeY/MSVlhghuKBgXlKnqm6ks= @@ -2557,8 +2545,8 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.35.0 h1:m639+ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.35.0/go.mod h1:LjReUci/F4BUyv+y4dwnq3h/26iNOeC3wAIqgvTIZVo= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.35.0 h1:xJ2qHD0C1BeYVTLLR9sX12+Qb95kfeD/byKj6Ky1pXg= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.35.0/go.mod h1:u5BF1xyjstDowA1R5QAO9JHzqK+ublenEW/dyqTjBVk= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0 h1:WDdP9acbMYjbKIyJUhTvtzj601sVJOqgWdUxSdR/Ysc= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0/go.mod h1:BLbf7zbNIONBLPwvFnwNHGj4zge8uTCM/UPIVW1Mq2I= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.35.0 h1:PB3Zrjs1sG1GBX51SXyTSoOTqcDglmsk7nT6tkKPb/k= +go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.35.0/go.mod h1:U2R3XyVPzn0WX7wOIypPuptulsMcPDPs/oiSVOMVnHY= go.opentelemetry.io/otel/metric v1.17.0/go.mod h1:h4skoxdZI17AxwITdmdZjjYJQH5nzijUUjm+wtPph5o= go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= go.opentelemetry.io/otel/metric v1.30.0/go.mod h1:aXTfST94tswhWEb+5QjlSqG+cZlmyXy/u8jFpor3WqQ= @@ -2654,8 +2642,8 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20220827204233-334a2380cb91/go.mod h1:cyybsKvd6eL0RnXn6p/Grxp8F5bW7iYuBgsNCOHpMYE= -golang.org/x/exp v0.0.0-20250305212735-054e65f0b394 h1:nDVHiLt8aIbd/VzvPWN6kSOPE7+F/fNFDSXLVYkE/Iw= -golang.org/x/exp v0.0.0-20250305212735-054e65f0b394/go.mod h1:sIifuuw/Yco/y6yb6+bDNfyeQ/MdPUy/hKEMYQV17cM= +golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6 h1:y5zboxd6LQAqYIhHnB48p0ByQ/GnQx2BE33L8BOHQkI= +golang.org/x/exp v0.0.0-20250506013437-ce4c2cf36ca6/go.mod h1:U6Lno4MTRCDY+Ba7aCcauB9T60gsv5s4ralQzP72ZoQ= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -2726,7 +2714,6 @@ golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190921015927-1a5e07d1ff72/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191112182307-2180aed22343/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -3032,7 +3019,6 @@ golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3 golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190424220101-1e8e1cfdf96b/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190425222832-ad9eeb80039a/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= @@ -3116,8 +3102,8 @@ gonum.org/v1/gonum v0.7.0/go.mod h1:L02bwd0sqlsvRv41G7wGWFCsVNZFv/k1xzGIxeANHGM= gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= gonum.org/v1/gonum v0.9.3/go.mod h1:TZumC3NeyVQskjXqmyWt4S3bINhy7B4eYwW69EbyX+0= gonum.org/v1/gonum v0.11.0/go.mod h1:fSG4YDCxxUZQJ7rKsQrj0gMOg00Il0Z96/qMA4bVQhA= -gonum.org/v1/gonum v0.15.1 h1:FNy7N6OUZVUaWG9pTiD+jlhdQ3lMP+/LcTpJ6+a8sQ0= -gonum.org/v1/gonum v0.15.1/go.mod h1:eZTZuRFrzu5pcyjN5wJhcIhnUdNijYxX1T2IcrOGY0o= +gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= +gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= gonum.org/v1/plot v0.9.0/go.mod h1:3Pcqqmp6RHvJI72kgb8fThyUnav364FOsdDo2aGW5lY= @@ -3187,8 +3173,8 @@ google.golang.org/api v0.118.0/go.mod h1:76TtD3vkgmZ66zZzp72bUUklpmQmKlhh6sYtIjY google.golang.org/api v0.122.0/go.mod h1:gcitW0lvnyWjSp9nKxAbdHKIZ6vF4aajGueeslZOyms= google.golang.org/api v0.124.0/go.mod h1:xu2HQurE5gi/3t1aFCvhPD781p0a3p11sdunTJ2BlP4= google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= -google.golang.org/api v0.223.0 h1:JUTaWEriXmEy5AhvdMgksGGPEFsYfUKaPEYXd4c3Wvc= -google.golang.org/api v0.223.0/go.mod h1:C+RS7Z+dDwds2b+zoAk5hN/eSfsiCn0UDrYof/M4d2M= +google.golang.org/api v0.229.0 h1:p98ymMtqeJ5i3lIBMj5MpR9kzIIgzpHHh8vQ+vgAzx8= +google.golang.org/api v0.229.0/go.mod h1:wyDfmq5g1wYJWn29O22FDWN48P7Xcz0xz+LBpptYvB0= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -3339,8 +3325,8 @@ google.golang.org/genproto v0.0.0-20230403163135-c38d8f061ccd/go.mod h1:UUQDJDOl google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1/go.mod h1:nKE/iIaLqn2bQwXBg8f1g2Ylh6r5MN5CmZvuzZCgsCU= google.golang.org/genproto v0.0.0-20230525234025-438c736192d0/go.mod h1:9ExIQyXL5hZrHzQceCwuSYwZZ5QZBazOcprJ5rgs3lY= google.golang.org/genproto v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:xZnkP7mREFX5MORlOPEzLMr+90PPZQ2QWzrVTWfAq64= -google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4 h1:Pw6WnI9W/LIdRxqK7T6XGugGbHIRl5Q7q3BssH6xk4s= -google.golang.org/genproto v0.0.0-20250122153221-138b5a5a4fd4/go.mod h1:qbZzneIOXSq+KFAFut9krLfRLZiFLzZL5u2t8SV83EE= +google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb h1:ITgPrl429bc6+2ZraNSzMDk3I95nmQln2fuPstKwFDE= +google.golang.org/genproto v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:sAo5UzpjUwgFBCzupwhcLcxHVDK7vG5IqI30YnwX2eE= google.golang.org/genproto/googleapis/api v0.0.0-20230525234020-1aefcd67740a/go.mod h1:ts19tUU+Z0ZShN1y3aPyq2+O3d5FUNNgT6FtOzmrNn8= google.golang.org/genproto/googleapis/api v0.0.0-20230525234035-dd9d682886f9/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= google.golang.org/genproto/googleapis/api v0.0.0-20230526203410-71b5a4ffd15e/go.mod h1:vHYtlOoi6TsQ3Uk2yxR7NI5z8uoV+3pZtR4jmHIkRig= @@ -3363,7 +3349,6 @@ google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ij google.golang.org/grpc v1.22.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= @@ -3398,11 +3383,9 @@ google.golang.org/grpc v1.50.0/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCD google.golang.org/grpc v1.50.1/go.mod h1:ZgQEeidpAuNRZ8iRrlBKXZQP1ghovWIVhdJRyCDK+GI= google.golang.org/grpc v1.51.0/go.mod h1:wgNDFcnuBGmxLKI/qn4T+m5BtEBYXJPvibbUPsAIPww= google.golang.org/grpc v1.52.0/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= -google.golang.org/grpc v1.52.3/go.mod h1:pu6fVzoFb+NBYNAvQL08ic+lvB2IojljRYuun5vorUY= google.golang.org/grpc v1.53.0/go.mod h1:OnIrk0ipVdj4N5d9IUoFUx72/VlD7+jUsHwZgwSMQpw= google.golang.org/grpc v1.54.0/go.mod h1:PUSEXI6iWghWaB6lXM4knEgpJNu2qUcKfDtNci3EC2g= google.golang.org/grpc v1.55.0/go.mod h1:iYEXKGkEBhg1PjZQvoYEVPTDkHo1/bjTnfwTeGONTY8= -google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/grpc v1.72.1 h1:HR03wO6eyZ7lknl75XlxABNVLLFc2PAb6mHlYh756mA= google.golang.org/grpc v1.72.1/go.mod h1:wH5Aktxcg25y1I3w7H69nHfXdOG3UiadoBtjh3izSDM= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= @@ -3486,19 +3469,19 @@ honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= k8s.io/api v0.0.0-20190813020757-36bff7324fb7/go.mod h1:3Iy+myeAORNCLgjd/Xu9ebwN7Vh59Bw0vh9jhoX+V58= -k8s.io/api v0.32.3 h1:Hw7KqxRusq+6QSplE3NYG4MBxZw1BZnq4aP4cJVINls= -k8s.io/api v0.32.3/go.mod h1:2wEDTXADtm/HA7CCMD8D8bK4yuBUptzaRhYcYEEYA3k= -k8s.io/apiextensions-apiserver v0.32.3 h1:4D8vy+9GWerlErCwVIbcQjsWunF9SUGNu7O7hiQTyPY= -k8s.io/apiextensions-apiserver v0.32.3/go.mod h1:8YwcvVRMVzw0r1Stc7XfGAzB/SIVLunqApySV5V7Dss= +k8s.io/api v0.33.1 h1:tA6Cf3bHnLIrUK4IqEgb2v++/GYUtqiu9sRVk3iBXyw= +k8s.io/api v0.33.1/go.mod h1:87esjTn9DRSRTD4fWMXamiXxJhpOIREjWOSjsW1kEHw= +k8s.io/apiextensions-apiserver v0.33.1 h1:N7ccbSlRN6I2QBcXevB73PixX2dQNIW0ZRuguEE91zI= +k8s.io/apiextensions-apiserver v0.33.1/go.mod h1:uNQ52z1A1Gu75QSa+pFK5bcXc4hq7lpOXbweZgi4dqA= k8s.io/apimachinery v0.0.0-20190809020650-423f5d784010/go.mod h1:Waf/xTS2FGRrgXCkO5FP3XxTOWh0qLf2QhL1qFZZ/R8= -k8s.io/apimachinery v0.32.3 h1:JmDuDarhDmA/Li7j3aPrwhpNBA94Nvk5zLeOge9HH1U= -k8s.io/apimachinery v0.32.3/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= -k8s.io/apiserver v0.32.3 h1:kOw2KBuHOA+wetX1MkmrxgBr648ksz653j26ESuWNY8= -k8s.io/apiserver v0.32.3/go.mod h1:q1x9B8E/WzShF49wh3ADOh6muSfpmFL0I2t+TG0Zdgc= -k8s.io/client-go v0.32.3 h1:RKPVltzopkSgHS7aS98QdscAgtgah/+zmpAogooIqVU= -k8s.io/client-go v0.32.3/go.mod h1:3v0+3k4IcT9bXTc4V2rt+d2ZPPG700Xy6Oi0Gdl2PaY= -k8s.io/component-base v0.32.3 h1:98WJvvMs3QZ2LYHBzvltFSeJjEx7t5+8s71P7M74u8k= -k8s.io/component-base v0.32.3/go.mod h1:LWi9cR+yPAv7cu2X9rZanTiFKB2kHA+JjmhkKjCZRpI= +k8s.io/apimachinery v0.33.1 h1:mzqXWV8tW9Rw4VeW9rEkqvnxj59k1ezDUl20tFK/oM4= +k8s.io/apimachinery v0.33.1/go.mod h1:BHW0YOu7n22fFv/JkYOEfkUYNRN0fj0BlvMFWA7b+SM= +k8s.io/apiserver v0.33.1 h1:yLgLUPDVC6tHbNcw5uE9mo1T6ELhJj7B0geifra3Qdo= +k8s.io/apiserver v0.33.1/go.mod h1:VMbE4ArWYLO01omz+k8hFjAdYfc3GVAYPrhP2tTKccs= +k8s.io/client-go v0.33.1 h1:ZZV/Ks2g92cyxWkRRnfUDsnhNn28eFpt26aGc8KbXF4= +k8s.io/client-go v0.33.1/go.mod h1:JAsUrl1ArO7uRVFWfcj6kOomSlCv+JpvIsp6usAGefA= +k8s.io/component-base v0.33.1 h1:EoJ0xA+wr77T+G8p6T3l4efT2oNwbqBVKR71E0tBIaI= +k8s.io/component-base v0.33.1/go.mod h1:guT/w/6piyPfTgq7gfvgetyXMIh10zuXA6cRRm3rDuY= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= @@ -3506,10 +3489,10 @@ k8s.io/klog v0.3.1/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= k8s.io/klog v0.4.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= -k8s.io/kms v0.32.3 h1:HhHw5+pRCzEJp3oFFJ1q5W2N6gAI7YkUg4ay4Z0dgwM= -k8s.io/kms v0.32.3/go.mod h1:Bk2evz/Yvk0oVrvm4MvZbgq8BD34Ksxs2SRHn4/UiOM= -k8s.io/kube-aggregator v0.32.0 h1:5ZyMW3QwAbmkasQrROcpa5we3et938DQuyUYHeXSPao= -k8s.io/kube-aggregator v0.32.0/go.mod h1:6OKivf6Ypx44qu2v1ZUMrxH8kRp/8LKFKeJU72J18lU= +k8s.io/kms v0.33.1 h1:jJKrFhsbVofpyLF+G8k+drwOAF9CMQpxilHa5Uilb8Q= +k8s.io/kms v0.33.1/go.mod h1:C1I8mjFFBNzfUZXYt9FZVJ8MJl7ynFbGgZFbBzkBJ3E= +k8s.io/kube-aggregator v0.33.1 h1:PigQUqAvd6Y4hBjQAqhKz3lEJC2VHLL4bSOEuS06a40= +k8s.io/kube-aggregator v0.33.1/go.mod h1:16/wlU5Lj7hNJSv7JSu5FLvxyrgiJVLCHzfVoECAsuI= k8s.io/kube-openapi v0.0.0-20190709113604-33be087ad058/go.mod h1:nfDlWeOsu3pUf4yWGL+ERqohP4YsZcBJXWMK+gkzOA4= k8s.io/kube-openapi v0.0.0-20190722073852-5e22f3d471e6/go.mod h1:RZvgC8MSN6DjiMV6oIfEE9pDL9CYXokkfaCKZeHm3nc= k8s.io/kube-openapi v0.0.0-20250318190949-c8a335a9a2ff h1:/usPimJzUKKu+m+TE36gUyGcf03XZEP0ZIKgKj35LS4= @@ -3522,19 +3505,19 @@ lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl modernc.org/cc/v3 v3.36.0/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= modernc.org/cc/v3 v3.36.2/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= modernc.org/cc/v3 v3.36.3/go.mod h1:NFUHyPn4ekoC/JHeZFfZurN6ixxawE1BnVonP/oahEI= -modernc.org/cc/v4 v4.25.2 h1:T2oH7sZdGvTaie0BRNFbIYsabzCxUQg8nLqCdQ2i0ic= -modernc.org/cc/v4 v4.25.2/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= +modernc.org/cc/v4 v4.26.0 h1:QMYvbVduUGH0rrO+5mqF/PSPPRZNpRtg2CLELy7vUpA= +modernc.org/cc/v4 v4.26.0/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0= modernc.org/ccgo/v3 v3.0.0-20220428102840-41399a37e894/go.mod h1:eI31LL8EwEBKPpNpA4bU1/i+sKOwOrQy8D87zWUcRZc= modernc.org/ccgo/v3 v3.0.0-20220430103911-bc99d88307be/go.mod h1:bwdAnOoaIt8Ax9YdWGjxWsdkPcZyRPHqrOvJxaKAKGw= modernc.org/ccgo/v3 v3.16.4/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= modernc.org/ccgo/v3 v3.16.6/go.mod h1:tGtX0gE9Jn7hdZFeU88slbTh1UtCYKusWOoCJuvkWsQ= modernc.org/ccgo/v3 v3.16.8/go.mod h1:zNjwkizS+fIFDrDjIAgBSCLkWbJuHF+ar3QRn+Z9aws= modernc.org/ccgo/v3 v3.16.9/go.mod h1:zNMzC9A9xeNUepy6KuZBbugn3c0Mc9TeiJO4lgvkJDo= -modernc.org/ccgo/v4 v4.25.1 h1:TFSzPrAGmDsdnhT9X2UrcPMI3N/mJ9/X9ykKXwLhDsU= -modernc.org/ccgo/v4 v4.25.1/go.mod h1:njjuAYiPflywOOrm3B7kCB444ONP5pAVr8PIEoE0uDw= +modernc.org/ccgo/v4 v4.26.0 h1:gVzXaDzGeBYJ2uXTOpR8FR7OlksDOe9jxnjhIKCsiTc= +modernc.org/ccgo/v4 v4.26.0/go.mod h1:Sem8f7TFUtVXkG2fiaChQtyyfkqhJBg/zjEJBkmuAVY= modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= -modernc.org/fileutil v1.3.0 h1:gQ5SIzK3H9kdfai/5x41oQiKValumqNTDXMvKo62HvE= -modernc.org/fileutil v1.3.0/go.mod h1:XatxS8fZi3pS8/hKG2GH/ArUogfxjpEKs3Ku3aK4JyQ= +modernc.org/fileutil v1.3.1 h1:8vq5fe7jdtEvoCf3Zf9Nm0Q05sH6kGx0Op2CPx1wTC8= +modernc.org/fileutil v1.3.1/go.mod h1:HxmghZSZVAz/LXcMNwZPA/DRrQZEVP9VX0V4LQGQFOc= modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI= modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito= modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= @@ -3545,8 +3528,8 @@ modernc.org/libc v1.16.17/go.mod h1:hYIV5VZczAmGZAnG15Vdngn5HSF5cSkbvfz2B7GRuVU= modernc.org/libc v1.16.19/go.mod h1:p7Mg4+koNjc8jkqwcoFBJx7tXkpj00G77X7A72jXPXA= modernc.org/libc v1.17.0/go.mod h1:XsgLldpP4aWlPlsjqKRdHPqCxCjISdHfM/yeWC5GyW0= modernc.org/libc v1.17.1/go.mod h1:FZ23b+8LjxZs7XtFMbSzL/EhPxNbfZbErxEHc7cbD9s= -modernc.org/libc v1.62.1 h1:s0+fv5E3FymN8eJVmnk0llBe6rOxCu/DEU+XygRbS8s= -modernc.org/libc v1.62.1/go.mod h1:iXhATfJQLjG3NWy56a6WVU73lWOcdYVxsvwCgoPljuo= +modernc.org/libc v1.65.0 h1:e183gLDnAp9VJh6gWKdTy0CThL9Pt7MfcR/0bgb7Y1Y= +modernc.org/libc v1.65.0/go.mod h1:7m9VzGq7APssBTydds2zBcxGREwvIGpuUBaKTXdm2Qs= modernc.org/mathutil v1.2.2/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/mathutil v1.4.1/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= @@ -3555,8 +3538,8 @@ modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJ modernc.org/memory v1.1.1/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= modernc.org/memory v1.2.0/go.mod h1:/0wo5ibyrQiaoUoH7f9D8dnglAmILJ5/cxZlRECf+Nw= modernc.org/memory v1.2.1/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/memory v1.9.1 h1:V/Z1solwAVmMW1yttq3nDdZPJqV1rM05Ccq6KMSZ34g= -modernc.org/memory v1.9.1/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw= +modernc.org/memory v1.10.0 h1:fzumd51yQ1DxcOxSO+S6X7+QTuVU+n8/Aj7swYjFfC4= +modernc.org/memory v1.10.0/go.mod h1:/JP4VbVC+K5sU2wZi9bHoq2MAkCnrt2r98UGeSK7Mjw= modernc.org/opt v0.1.1/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0= modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8= @@ -3579,8 +3562,8 @@ rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8 rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.0 h1:CPT0ExVicCzcpeN4baWEV2ko2Z/AsiZgEdwgcfwLgMo= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2 h1:jpcvIRr3GLoUoEKRkHKSmGjxb6lWwrBlJsXc+eUYQHM= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.2/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3 h1:/Rv+M11QRah1itp8VhT6HoVx1Ray9eB4DBr+K+/sCJ8= sigs.k8s.io/json v0.0.0-20241010143419-9aa6b5e7a4b3/go.mod h1:18nIHnGi6636UCz6m8i4DhaJ65T6EruyzmoQqI2BVDo= sigs.k8s.io/randfill v0.0.0-20250304075658-069ef1bbf016/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= diff --git a/go.work b/go.work index 237e0c52b9f..d6ca6eb3a49 100644 --- a/go.work +++ b/go.work @@ -22,9 +22,6 @@ use ( ./pkg/plugins/codegen ./pkg/promlib ./pkg/semconv - ./pkg/storage/unified/apistore - ./pkg/storage/unified/resource - ./pkg/storage/unified/resourcepb ) replace github.com/prometheus/alertmanager => github.com/grafana/prometheus-alertmanager v0.25.1-0.20250331083058-4563aec7a975 diff --git a/go.work.sum b/go.work.sum index 84895460656..1610e0fbc26 100644 --- a/go.work.sum +++ b/go.work.sum @@ -21,6 +21,7 @@ cel.dev/expr v0.16.1/go.mod h1:AsGA5zb3WruAEQeQng1RZdGEXmBj0jvMWh6l5SnNuC8= cel.dev/expr v0.18.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= cel.dev/expr v0.19.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= cel.dev/expr v0.19.1/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= +cel.dev/expr v0.19.2/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= cel.dev/expr v0.20.0/go.mod h1:MrpN08Q+lEBs+bGYdLxxHkZoUSsCp0nSKTs0nTymJgw= cloud.google.com/go v0.110.10/go.mod h1:v1OoFqYxiBkUrruItNM3eT4lLByNjxmJSV/xDKJNnic= cloud.google.com/go v0.112.1/go.mod h1:+Vbu+Y1UU+I1rjmzeMOb/8RfkKJK2Gyxi1X6jJCZLo4= @@ -29,6 +30,7 @@ cloud.google.com/go v0.116.0/go.mod h1:cEPSRWPzZEswwdr9BxE6ChEn01dWlTaF05LiC2Xs7 cloud.google.com/go v0.117.0/go.mod h1:ZbwhVTb1DBGt2Iwb3tNO6SEK4q+cplHZmLWH+DelYYc= cloud.google.com/go v0.118.0/go.mod h1:zIt2pkedt/mo+DQjcT4/L3NDxzHPR29j5HcclNH+9PM= cloud.google.com/go v0.118.1/go.mod h1:CFO4UPEPi8oV21xoezZCrd3d81K4fFkDTEJu4R8K+9M= +cloud.google.com/go v0.118.3/go.mod h1:Lhs3YLnBlwJ4KA6nuObNMZ/fCbOQBPuWKPoE0Wa/9Vc= cloud.google.com/go/accessapproval v1.8.1 h1:WC6pA5Gyqkrvdc18AHvriShwk8wgMe9EWvBAQSLxTc8= cloud.google.com/go/accessapproval v1.8.1/go.mod h1:3HAtm2ertsWdwgjSGObyas6fj3ZC/3zwV2WVZXO53sU= cloud.google.com/go/accessapproval v1.8.3 h1:axlU03FRiXDNupsmPG7LKzuS4Enk1gf598M62lWVB74= @@ -43,10 +45,14 @@ cloud.google.com/go/aiplatform v1.68.0 h1:EPPqgHDJpBZKRvv+OsB3cr0jYz3EL2pZ+802rB cloud.google.com/go/aiplatform v1.68.0/go.mod h1:105MFA3svHjC3Oazl7yjXAmIR89LKhRAeNdnDKJczME= cloud.google.com/go/aiplatform v1.70.0 h1:vnqsPkgcwlDEpWl9t6C3/HLfHeweuGXs2gcYTzH6dMs= cloud.google.com/go/aiplatform v1.70.0/go.mod h1:1cewyC4h+yvRs0qVvlCuU3V6j1pJ41doIcroYX3uv8o= +cloud.google.com/go/aiplatform v1.74.0 h1:rE2P5H7FOAFISAZilmdkapbk4CVgwfVs6FDWlhGfuy0= +cloud.google.com/go/aiplatform v1.74.0/go.mod h1:hVEw30CetNut5FrblYd1AJUWRVSIjoyIvp0EVUh51HA= cloud.google.com/go/analytics v0.25.1 h1:tMlK9KGTwHYASagAHXXbIPUVCRknA0Yv4jquim5HdRE= cloud.google.com/go/analytics v0.25.1/go.mod h1:hrAWcN/7tqyYwF/f60Nph1yz5UE3/PxOPzzFsJgtU+Y= cloud.google.com/go/analytics v0.25.3 h1:hX6JAsNbXd2uVjqjIuMcKpmhIybKrEunBiGxK4SwEFI= cloud.google.com/go/analytics v0.25.3/go.mod h1:pWoYg4yEr0iYg83LZRAicjDDdv54+Z//RyhzWwKbavI= +cloud.google.com/go/analytics v0.26.0 h1:O2kWr2Sd4ep3I+YJ4aiY0G4+zWz6sp4eTce+JVns9TM= +cloud.google.com/go/analytics v0.26.0/go.mod h1:KZWJfs8uX/+lTjdIjvT58SFa86V9KM6aPXwZKK6uNVI= cloud.google.com/go/apigateway v1.7.1 h1:BeR+5NtpGxsUoK8wa/IPkanORjqZdlyNmXZ8ke3tOhc= cloud.google.com/go/apigateway v1.7.1/go.mod h1:5JBcLrl7GHSGRzuDaISd5u0RKV05DNFiq4dRdfrhCP0= cloud.google.com/go/apigateway v1.7.3 h1:Mn7cC5iWJz+cSMS/Hb+N2410CpZ6c8XpJKaexBl0Gxs= @@ -100,6 +106,8 @@ cloud.google.com/go/batch v1.11.1 h1:50TRhaaZv7QDCb60KcZUPkGx1oO46srDp5076wZkgI8 cloud.google.com/go/batch v1.11.1/go.mod h1:4GbJXfdxU8GH6uuo8G47y5tEFOgTLCL9pMKCUcn7VxE= cloud.google.com/go/batch v1.11.5 h1:TLfFZJXu+89CGbDK2mMql8f6HHFXarr8uUsaQ6wKatU= cloud.google.com/go/batch v1.11.5/go.mod h1:HUxnmZqnkG7zIZuF3NYCfUIrOMU3+SPArR5XA6NGu5s= +cloud.google.com/go/batch v1.12.0 h1:lXuTaELvU0P0ARbTFxxdpOC/dFnZZeGglSw06BtO//8= +cloud.google.com/go/batch v1.12.0/go.mod h1:CATSBh/JglNv+tEU/x21Z47zNatLQ/gpGnpyKOzbbcM= cloud.google.com/go/beyondcorp v1.1.1 h1:owviaab14M9ySEvCj3EZdfzkRLnE+5j4JIkqVaQtEUU= cloud.google.com/go/beyondcorp v1.1.1/go.mod h1:L09o0gLkgXMxCZs4qojrgpI2/dhWtasMc71zPPiHMn4= cloud.google.com/go/beyondcorp v1.1.3 h1:ezavJc0Gzh4N8zBskO/DnUVMWPa8lqH/tmQSyaknmCA= @@ -108,10 +116,14 @@ cloud.google.com/go/bigquery v1.63.1 h1:/6syiWrSpardKNxdvldS5CUTRJX1iIkSPXCjLjiG cloud.google.com/go/bigquery v1.63.1/go.mod h1:ufaITfroCk17WTqBhMpi8CRjsfHjMX07pDrQaRKKX2o= cloud.google.com/go/bigquery v1.66.0 h1:cDM3xEUUTf6RDepFEvNZokCysGFYoivHHTIZOWXbV2E= cloud.google.com/go/bigquery v1.66.0/go.mod h1:Cm1hMRzZ8teV4Nn8KikgP8bT9jd54ivP8fvXWZREmG4= +cloud.google.com/go/bigquery v1.66.2 h1:EKOSqjtO7jPpJoEzDmRctGea3c2EOGoexy8VyY9dNro= +cloud.google.com/go/bigquery v1.66.2/go.mod h1:+Yd6dRyW8D/FYEjUGodIbu0QaoEmgav7Lwhotup6njo= cloud.google.com/go/bigtable v1.33.0 h1:2BDaWLRAwXO14DJL/u8crbV2oUbMZkIa2eGq8Yao1bk= cloud.google.com/go/bigtable v1.33.0/go.mod h1:HtpnH4g25VT1pejHRtInlFPnN5sjTxbQlsYBjh9t5l0= cloud.google.com/go/bigtable v1.34.0 h1:eIgi3QLcN4aq8p6n9U/zPgmHeBP34sm9FiKq4ik/ZoY= cloud.google.com/go/bigtable v1.34.0/go.mod h1:p94uLf6cy6D73POkudMagaFF3x9c7ktZjRnOUVGjZAw= +cloud.google.com/go/bigtable v1.35.0 h1:UEacPwaejN2mNbz67i1Iy3G812rxtgcs6ePj1TAg7dw= +cloud.google.com/go/bigtable v1.35.0/go.mod h1:EabtwwmTcOJFXp+oMZAT/jZkyDIjNwrv53TrS4DGrrM= cloud.google.com/go/billing v1.19.1 h1:BtbMCM9QDWiszfNXEAcq0MB6vgCuc0/yzP3vye2Kz3U= cloud.google.com/go/billing v1.19.1/go.mod h1:c5l7ORJjOLH/aASJqUqNsEmwrhfjWZYHX+z0fIhuVpo= cloud.google.com/go/billing v1.20.1 h1:xMlO3hc5BI0s23tRB40bL40xSpxUR1x3E07Y5/VWcjU= @@ -132,10 +144,14 @@ cloud.google.com/go/cloudbuild v1.18.0 h1:82f6g0AzacK1bbO0E5ZqixWc4nRzWu4ichIQ0Q cloud.google.com/go/cloudbuild v1.18.0/go.mod h1:KCHWGIoS/5fj+By9YmgIQnUiDq8P6YURWOjX3hoc6As= cloud.google.com/go/cloudbuild v1.20.0 h1:0BRKyrCnWMHlnkwtNKdEwcvpgPm3OA3NqQhzDS5c7ek= cloud.google.com/go/cloudbuild v1.20.0/go.mod h1:TgSGCsKojPj2JZuYNw5Ur6Pw7oCJ9iK60PuMnaUps7s= +cloud.google.com/go/cloudbuild v1.22.0 h1:zmDznviZpvkCla0adbp7jJsMYZ9bABCbcPK2cBUHwg8= +cloud.google.com/go/cloudbuild v1.22.0/go.mod h1:p99MbQrzcENHb/MqU3R6rpqFRk/X+lNG3PdZEIhM95Y= cloud.google.com/go/clouddms v1.8.1 h1:vf5R4/FoLHxEP2BBKEafLHfYFWa6Zd9gwrXe/FjrwUg= cloud.google.com/go/clouddms v1.8.1/go.mod h1:bmW2eDFH1LjuwkHcKKeeppcmuBGS0r6Qz6TXanehKP0= cloud.google.com/go/clouddms v1.8.3 h1:T/rkkKE0KhQFMcO3+QWL82xakA9kRumLXY1lq5adIts= cloud.google.com/go/clouddms v1.8.3/go.mod h1:wn8O2KhhJWcOlQk0pMC7F/4TaJRS5sN6KdNWM8A7o6c= +cloud.google.com/go/clouddms v1.8.4 h1:CDOd1nwmP4uek+nZhl4bhRIpzj8jMqoMRqKAfKlgLhw= +cloud.google.com/go/clouddms v1.8.4/go.mod h1:RadeJ3KozRwy4K/gAs7W74ZU3GmGgVq5K8sRqNs3HfA= cloud.google.com/go/cloudtasks v1.13.1 h1:s1JTLBD+WbzQwxYPAwa2WIxPT3kOiv7MSKyvSEgNQtg= cloud.google.com/go/cloudtasks v1.13.1/go.mod h1:dyRD7tEEkLMbHLagb7UugkDa77UVJp9d/6O9lm3ModI= cloud.google.com/go/cloudtasks v1.13.3 h1:rXdznKjCa7WpzmvR2plrn2KJ+RZC1oYxPiRWNQjjf3k= @@ -147,6 +163,8 @@ cloud.google.com/go/compute v1.28.1 h1:XwPcZjgMCnU2tkwY10VleUjSAfpTj9RDn+kGrbYsi cloud.google.com/go/compute v1.28.1/go.mod h1:b72iXMY4FucVry3NR3Li4kVyyTvbMDE7x5WsqvxjsYk= cloud.google.com/go/compute v1.31.1 h1:SObuy8Fs6woazArpXp1fsHCw+ZH4iJ/8dGGTxUhHZQA= cloud.google.com/go/compute v1.31.1/go.mod h1:hyOponWhXviDptJCJSoEh89XO1cfv616wbwbkde1/+8= +cloud.google.com/go/compute v1.34.0 h1:+k/kmViu4TEi97NGaxAATYtpYBviOWJySPZ+ekA95kk= +cloud.google.com/go/compute v1.34.0/go.mod h1:zWZwtLwZQyonEvIQBuIa0WvraMYK69J5eDCOw9VZU4g= cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= cloud.google.com/go/compute/metadata v0.5.0/go.mod h1:aHnloV2TPI38yx4s9+wAZhHykWvVCfu7hQbF+9CWoiY= cloud.google.com/go/compute/metadata v0.5.2/go.mod h1:C66sj2AluDcIqakBq/M8lw8/ybHgOZqin2obFxa/E5k= @@ -158,6 +176,8 @@ cloud.google.com/go/container v1.40.0 h1:JVoEg/4RvoGW37r2Eja/cTBc3X9c2loGWYq7QDs cloud.google.com/go/container v1.40.0/go.mod h1:wNI1mOUivm+ZkpHMbouutgbD4sQxyphMwK31X5cThY4= cloud.google.com/go/container v1.42.1 h1:eaMrgOl6NCk+Blhh29GgUVe3QGo7IiJQlP0w/EwLoV0= cloud.google.com/go/container v1.42.1/go.mod h1:5huIxYuOD8Ocuj0KbcyRq9MzB3J1mQObS0KSWHTYceY= +cloud.google.com/go/container v1.42.2 h1:8ncSEBjkng6ucCICauaUGzBomoM2VyYzleAum1OFcow= +cloud.google.com/go/container v1.42.2/go.mod h1:y71YW7uR5Ck+9Vsbst0AF2F3UMgqmsN4SP8JR9xEsR8= cloud.google.com/go/containeranalysis v0.13.1 h1:opZRo0HEVLm4ylTbbXw/H68M3vQjdkYOSMfUY63+D+0= cloud.google.com/go/containeranalysis v0.13.1/go.mod h1:bmd9H880BNR4Hc8JspEg8ge9WccSQfO+/N+CYvU3sEA= cloud.google.com/go/containeranalysis v0.13.3 h1:1D8U75BeotZxrG4jR6NYBtOt+uAeBsWhpBZmSYLakQw= @@ -186,11 +206,15 @@ cloud.google.com/go/dataplex v1.19.1 h1:0pgI0DwijXZq8vyLuGnQXSi9JB6eUaVqzpzhN2ve cloud.google.com/go/dataplex v1.19.1/go.mod h1:WzoQ+vcxrAyM0cjJWmluEDVsg7W88IXXCfuy01BslKE= cloud.google.com/go/dataplex v1.21.0 h1:oswf105Cr2EwHrW2n7wk3nRZQf7hCe3apE/GqJ8yjvY= cloud.google.com/go/dataplex v1.21.0/go.mod h1:KXALVHwHdMBhz90IJAUSKh2gK0fEKB6CRjs4f6MrbMU= +cloud.google.com/go/dataplex v1.22.0 h1:j4hD6opb+gq9CJNPFIlIggoW8Kjymg8Wmy2mdHmQoiw= +cloud.google.com/go/dataplex v1.22.0/go.mod h1:g166QMCGHvwc3qlTG4p34n+lHwu7JFfaNpMfI2uO7b8= cloud.google.com/go/dataproc v1.12.0 h1:W47qHL3W4BPkAIbk4SWmIERwsWBaNnWm0P2sdx3YgGU= cloud.google.com/go/dataproc/v2 v2.9.0 h1:9fSMjWgFKQfmfKu7V10C5foxU/2iDa8bVkiBB8uh1EU= cloud.google.com/go/dataproc/v2 v2.9.0/go.mod h1:i4365hSwNP6Bx0SAUnzCC6VloeNxChDjJWH6BfVPcbs= cloud.google.com/go/dataproc/v2 v2.10.1 h1:2vOv471LrcSn91VNzijcH+OkDRLa3kdyymOfKqbwZ4c= cloud.google.com/go/dataproc/v2 v2.10.1/go.mod h1:fq+LSN/HYUaaV2EnUPFVPxfe1XpzGVqFnL0TTXs8juk= +cloud.google.com/go/dataproc/v2 v2.11.0 h1:6aRpyoRfNOP+r2+pGb7HeHtF+SYQID8kzztfHuK0plk= +cloud.google.com/go/dataproc/v2 v2.11.0/go.mod h1:9vgGrn57ra7KBqz+B2KD+ltzEXvnHAUClFgq/ryU99g= cloud.google.com/go/dataqna v0.9.1 h1:ptKKT+CNwp9Q+9Zxr+npUO7qUwKfyq/oF7/nS7CC6sc= cloud.google.com/go/dataqna v0.9.1/go.mod h1:86DNLE33yEfNDp5F2nrITsmTYubMbsF7zQRzC3CcZrY= cloud.google.com/go/dataqna v0.9.3 h1:lGUj2FYs650EUPDMV6plWBAoh8qH9Bu1KCz1PUYF2VY= @@ -203,22 +227,32 @@ cloud.google.com/go/datastream v1.11.1 h1:YKY2qGKoxPpAvsDMtmJlIwL59SzhEm1DHM2uM4 cloud.google.com/go/datastream v1.11.1/go.mod h1:a4j5tnptIxdZ132XboR6uQM/ZHcuv/hLqA6hH3NJWgk= cloud.google.com/go/datastream v1.12.1 h1:j5cIRYJHjx/058aHa4Slip7fl62UTGHCJc4GL9bxQLQ= cloud.google.com/go/datastream v1.12.1/go.mod h1:GxPeRBsokZ8ylxVJBp9Q39QG+z4Iri5QIBRJrKuzJVQ= +cloud.google.com/go/datastream v1.13.0 h1:C5AeEdze55feJVb17a40QmlnyH/aMhn/uf3Go3hIqPA= +cloud.google.com/go/datastream v1.13.0/go.mod h1:GrL2+KC8mV4GjbVG43Syo5yyDXp3EH+t6N2HnZb1GOQ= cloud.google.com/go/deploy v1.23.0 h1:Bmh5UYEeakXtjggRkjVIawXfSBbQsTgDlm96pCw9D3k= cloud.google.com/go/deploy v1.23.0/go.mod h1:O7qoXcg44Ebfv9YIoFEgYjPmrlPsXD4boYSVEiTqdHY= cloud.google.com/go/deploy v1.26.1 h1:Hm3pXBzMFJFPOdwtDkg5e/LP53bXqIpwQpjwsVasjhU= cloud.google.com/go/deploy v1.26.1/go.mod h1:PwF9RP0Jh30Qd+I71wb52oM42LgfRKXRMSg87wKpK3I= +cloud.google.com/go/deploy v1.26.2 h1:1c2Cd3jdb0mrKHHfyzSQ5DRmxgYd07tIZZzuMNrwDxU= +cloud.google.com/go/deploy v1.26.2/go.mod h1:XpS3sG/ivkXCfzbzJXY9DXTeCJ5r68gIyeOgVGxGNEs= cloud.google.com/go/dialogflow v1.58.0 h1:RTpoVCJHkgNLK8Co/f7F8ipyg3h8fJIaQzdaAbyg788= cloud.google.com/go/dialogflow v1.58.0/go.mod h1:sWcyFLdUrg+TWBJVq/OtwDyjcyDOfirTF0Gx12uKy7o= cloud.google.com/go/dialogflow v1.64.1 h1:6fU4IKLpvgpXqiUCE8gUp8eV5u629SCtiyXMudXtZSg= cloud.google.com/go/dialogflow v1.64.1/go.mod h1:jkv4vTiGhEUPBzmk1sJ+S1Duu2epCOBNHoWUImHkO5U= +cloud.google.com/go/dialogflow v1.66.0 h1:/kfpZw20/3v4sC8czEIuvn3Bu3qOne5aHDYlRYHbu18= +cloud.google.com/go/dialogflow v1.66.0/go.mod h1:BPiRTnnXP/tHLot5h/U62Xcp+i6ekRj/bq6uq88p+Lw= cloud.google.com/go/dlp v1.19.0 h1:AJB26PpDG0gOkf6wxQqbBXs9G+jOVnCjCagOlNiroKM= cloud.google.com/go/dlp v1.19.0/go.mod h1:cr8dKBq8un5LALiyGkz4ozcwzt3FyTlOwA4/fFzJ64c= cloud.google.com/go/dlp v1.20.1 h1:qAEGTTtC97zuDm6YPBozNvy4BLBszVCJah3efNytl3g= cloud.google.com/go/dlp v1.20.1/go.mod h1:NO0PLy43RQV0QI6vZcPiNTR9eiKu9pFzawaueBlDwz8= +cloud.google.com/go/dlp v1.21.0 h1:9kz7+gaB/0gBZsDUnNT1asDihNZSrRFSeUTBcBdUAkk= +cloud.google.com/go/dlp v1.21.0/go.mod h1:Y9HOVtPoArpL9sI1O33aN/vK9QRwDERU9PEJJfM8DvE= cloud.google.com/go/documentai v1.34.0 h1:gmBmrTLzbpZkllu2xExISZg2Hh/ai0y605SWdheWHvI= cloud.google.com/go/documentai v1.34.0/go.mod h1:onJlbHi4ZjQTsANSZJvW7fi2M8LZJrrupXkWDcy4gLY= cloud.google.com/go/documentai v1.35.1 h1:52RfiUsoblXcE57CfKJGnITWLxRM30BcqNk/BKZl2LI= cloud.google.com/go/documentai v1.35.1/go.mod h1:WJjwUAQfwQPJORW8fjz7RODprMULDzEGLA2E6WxenFw= +cloud.google.com/go/documentai v1.35.2 h1:hswVobCWUTXtmn+4QqUIVkai7sDOe0QS2KB3IpqLkik= +cloud.google.com/go/documentai v1.35.2/go.mod h1:oh/0YXosgEq3hVhyH4ZQ7VNXPaveRO4eLVM3tBSZOsI= cloud.google.com/go/domains v0.10.1 h1:HvZOm7Bx1fQY/MHQAbE5f8YwfJlc0NJVOGh0A0eWckc= cloud.google.com/go/domains v0.10.1/go.mod h1:RjDl3K8iq/ZZHMVqfZzRuBUr5t85gqA6LEXQBeBL5F4= cloud.google.com/go/domains v0.10.3 h1:wnqN5YwMrtLSjn+HB2sChgmZ6iocOta4Q41giQsiRjY= @@ -278,8 +312,11 @@ cloud.google.com/go/gsuiteaddons v1.7.1 h1:YLh58kzaK+1Q/CHe8Cjp3hf9ZjNdJkQMavjrJ cloud.google.com/go/gsuiteaddons v1.7.1/go.mod h1:SxM63xEPFf0p/plgh4dP82mBSKtp2RWskz5DpVo9jh8= cloud.google.com/go/gsuiteaddons v1.7.3 h1:QafYhVhyFGpidBUUlVhy6lUHFogFOycVYm9DV7MinhA= cloud.google.com/go/gsuiteaddons v1.7.3/go.mod h1:0rR+LC21v1Sx1Yb6uohHI/F8DF3h2arSJSHvfi3GmyQ= +cloud.google.com/go/gsuiteaddons v1.7.4 h1:f3eMYsCDdg2AeldIPdKmBRxN1WoiTpE3RvX5orcm/I8= +cloud.google.com/go/gsuiteaddons v1.7.4/go.mod h1:gpE2RUok+HUhuK7RPE/fCOEgnTffS0lCHRaAZLxAMeE= cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= cloud.google.com/go/iam v1.2.2/go.mod h1:0Ys8ccaZHdI1dEUilwzqng/6ps2YB6vRsjIe00/+6JY= +cloud.google.com/go/iam v1.4.0/go.mod h1:gMBgqPaERlriaOV0CUl//XUzDhSfXevn4OEUbg6VRs4= cloud.google.com/go/iap v1.10.1 h1:YF4jmMwEWXYrbfZZz024ozBXnWxUxJHzmkM6ccIzM0A= cloud.google.com/go/iap v1.10.1/go.mod h1:UKetCEzOZ4Zj7l9TSN/wzRNwbgIYzm4VM4bStaQ/tFc= cloud.google.com/go/iap v1.10.3 h1:OWNYFHPyIBNHEAEFdVKOltYWe0g3izSrpFJW6Iidovk= @@ -313,6 +350,8 @@ cloud.google.com/go/maps v1.14.0 h1:bLT2nvuOm4ye6YRgIJQ0L9zbKcbBj+TCg8k2g3c2Qlk= cloud.google.com/go/maps v1.14.0/go.mod h1:UepOes9un0UP7i8JBiaqgh8jqUaZAHVRXCYjrVlhSC8= cloud.google.com/go/maps v1.17.1 h1:u7U/DieTxYYMDyvHQ00la5ayXLjDImTfnhdAsyPZXyY= cloud.google.com/go/maps v1.17.1/go.mod h1:lGZCm2ILmN06GQyrRQwA1rScqQZuApQsCTX+0v+bdm8= +cloud.google.com/go/maps v1.19.0 h1:deVm1ZFyCrUwxG11CdvtBz350VG5JUQ/LHTLnQrBgrM= +cloud.google.com/go/maps v1.19.0/go.mod h1:goHUXrmzoZvQjUVd0KGhH8t3AYRm17P8b+fsyR1UAmQ= cloud.google.com/go/mediatranslation v0.9.1 h1:7X1cA4TWO0+r1RT0JTT0RE+SyO41eoFUmBDw17Oi9T8= cloud.google.com/go/mediatranslation v0.9.1/go.mod h1:vQH1amULNhSGryBjbjLb37g54rxrOwVxywS8WvUCsIU= cloud.google.com/go/mediatranslation v0.9.3 h1:nRBjeaMLipw05Br+qDAlSCcCQAAlat4mvpafztbEVgc= @@ -327,6 +366,7 @@ cloud.google.com/go/metastore v1.14.3 h1:jDqeCw6NGDRAPT9+2Y/EjnWAB0BfCcUfmPLOyhB cloud.google.com/go/metastore v1.14.3/go.mod h1:HlbGVOvg0ubBLVFRk3Otj3gtuzInuzO/TImOBwsKlG4= cloud.google.com/go/monitoring v1.21.1/go.mod h1:Rj++LKrlht9uBi8+Eb530dIrzG/cU/lB8mt+lbeFK1c= cloud.google.com/go/monitoring v1.21.2/go.mod h1:hS3pXvaG8KgWTSz+dAdyzPrGUYmi2Q+WFX8g2hqVEZU= +cloud.google.com/go/monitoring v1.22.1/go.mod h1:AuZZXAoN0WWWfsSvET1Cpc4/1D8LXq8KRDU87fMS6XY= cloud.google.com/go/networkconnectivity v1.15.1 h1:EizN+cFGHzRAyiFTK8jT1PqTo+cSnbc2IGh6OmllS7Y= cloud.google.com/go/networkconnectivity v1.15.1/go.mod h1:tYAcT4Ahvq+BiePXL/slYipf/8FF0oNJw3MqFhBnSPI= cloud.google.com/go/networkconnectivity v1.16.1 h1:YsVhG71ZC4FkqCP2oCI55x/JeGFyd7738Lt8iNTrzJw= @@ -379,6 +419,8 @@ cloud.google.com/go/pubsub v1.44.0 h1:pLaMJVDTlnUDIKT5L0k53YyLszfBbGoUBo/IqDK/fE cloud.google.com/go/pubsub v1.44.0/go.mod h1:BD4a/kmE8OePyHoa1qAHEw1rMzXX+Pc8Se54T/8mc3I= cloud.google.com/go/pubsub v1.45.3 h1:prYj8EEAAAwkp6WNoGTE4ahe0DgHoyJd5Pbop931zow= cloud.google.com/go/pubsub v1.45.3/go.mod h1:cGyloK/hXC4at7smAtxFnXprKEFTqmMXNNd9w+bd94Q= +cloud.google.com/go/pubsub v1.47.0 h1:Ou2Qu4INnf7ykrFjGv2ntFOjVo8Nloh/+OffF4mUu9w= +cloud.google.com/go/pubsub v1.47.0/go.mod h1:LaENesmga+2u0nDtLkIOILskxsfvn/BXX9Ak1NFxOs8= cloud.google.com/go/pubsublite v1.8.2 h1:jLQozsEVr+c6tOU13vDugtnaBSUy/PD5zK6mhm+uF1Y= cloud.google.com/go/pubsublite v1.8.2/go.mod h1:4r8GSa9NznExjuLPEJlF1VjOPOpgf3IT6k8x/YgaOPI= cloud.google.com/go/recaptchaenterprise v1.3.1 h1:u6EznTGzIdsyOsvm+Xkw0aSuKFXQlyjGE9a4exk6iNQ= @@ -398,6 +440,8 @@ cloud.google.com/go/redis v1.17.1 h1:E7TeGsvyoFB+m59bqFKrQ5GSH7+uW8cUDk6Y7iqGjJ0 cloud.google.com/go/redis v1.17.1/go.mod h1:YJHeYfSoW/agIMeCvM5rszxu75mVh5DOhbu3AEZEIQM= cloud.google.com/go/redis v1.17.3 h1:ROQXi5dCDSJCVezt/2nD1g+Ym0T6sio3DIzZ56NgMZI= cloud.google.com/go/redis v1.17.3/go.mod h1:23OoThXAU5bvhg4/oKsEcdVfq3wmyTEPNA9FP/t9xGo= +cloud.google.com/go/redis v1.18.0 h1:xcu35SCyHSp+nKV6QNIklgkBKTH1qb0aLUXjl0mSR8I= +cloud.google.com/go/redis v1.18.0/go.mod h1:fJ8dEQJQ7DY+mJRMkSafxQCuc8nOyPUwo9tXJqjvNEY= cloud.google.com/go/resourcemanager v1.10.1 h1:fO/QoSJ1lepmTM9dCbSXYWgTIhecmQkpY0mM1X9OGN0= cloud.google.com/go/resourcemanager v1.10.1/go.mod h1:A/ANV/Sv7y7fcjd4LSH7PJGTZcWRkO/69yN5UhYUmvE= cloud.google.com/go/resourcemanager v1.10.3 h1:SHOMw0kX0xWratC5Vb5VULBeWiGlPYAs82kiZqNtWpM= @@ -414,14 +458,20 @@ cloud.google.com/go/run v1.6.0 h1:LRJvntufFKJ0Jcwt7BbIHwf/0Ipq4twzyJcH1qSEs84= cloud.google.com/go/run v1.6.0/go.mod h1:DXkPPa8bZ0jfRGLT+EKIlPbHvosBYBMdxTgo9EBbXZE= cloud.google.com/go/run v1.8.1 h1:aeVLygw0BGLH+Zbj8v3K3nEHvKlgoq+j8fcRJaYZtxY= cloud.google.com/go/run v1.8.1/go.mod h1:wR5IG8Nujk9pyyNai187K4p8jzSLeqCKCAFBrZ2Sd4c= +cloud.google.com/go/run v1.9.0 h1:9WeTqeEcriXqRViXMNwczjFJjixOSBlSlk/fW3lfKPg= +cloud.google.com/go/run v1.9.0/go.mod h1:Dh0+mizUbtBOpPEzeXMM22t8qYQpyWpfmUiWQ0+94DU= cloud.google.com/go/scheduler v1.11.1 h1:uGaM4mRrGkJ0LLBMyxD8qbvIko4y+UlSOwJQqRd/lW8= cloud.google.com/go/scheduler v1.11.1/go.mod h1:ptS76q0oOS8hCHOH4Fb/y8YunPEN8emaDdtw0D7W1VE= cloud.google.com/go/scheduler v1.11.3 h1:p6+h8BoYJC+TvUijGBfORN6nuhOvJ3EwZ2H84CZ1ZEU= cloud.google.com/go/scheduler v1.11.3/go.mod h1:Io2+gcvUjLX1GdymwaSPJ6ZYxHN9/NNGL5kIV3Ax5+Q= +cloud.google.com/go/scheduler v1.11.4 h1:ewVvigBnEnrr9Ih8CKnLVoB5IiULaWfYU5nEnnfVAto= +cloud.google.com/go/scheduler v1.11.4/go.mod h1:0ylvH3syJnRi8EDVo9ETHW/vzpITR/b+XNnoF+GPSz4= cloud.google.com/go/secretmanager v1.14.1 h1:xlWSIg8rtBn5qCr2f3XtQP19+5COyf/ll49SEvi/0vM= cloud.google.com/go/secretmanager v1.14.1/go.mod h1:L+gO+u2JA9CCyXpSR8gDH0o8EV7i/f0jdBOrUXcIV0U= cloud.google.com/go/secretmanager v1.14.3 h1:XVGHbcXEsbrgi4XHzgK5np81l1eO7O72WOXHhXUemrM= cloud.google.com/go/secretmanager v1.14.3/go.mod h1:Pwzcfn69Ni9Lrk1/XBzo1H9+MCJwJ6CDCoeoQUsMN+c= +cloud.google.com/go/secretmanager v1.14.5 h1:W++V0EL9iL6T2+ec24Dm++bIti0tI6Gx6sCosDBters= +cloud.google.com/go/secretmanager v1.14.5/go.mod h1:GXznZF3qqPZDGZQqETZwZqHw4R6KCaYVvcGiRBA+aqY= cloud.google.com/go/security v1.18.1 h1:w7XbMR90Ir0y8NUxKJ3uyRHuHYWPUxVI5Z/sGqbrdAQ= cloud.google.com/go/security v1.18.1/go.mod h1:5P1q9rqwt0HuVeL9p61pTqQ6Lgio1c64jL2ZMWZV21Y= cloud.google.com/go/security v1.18.3 h1:ya9gfY1ign6Yy25VMMMgZ9xy7D/TczDB0ElXcyWmEVE= @@ -430,6 +480,8 @@ cloud.google.com/go/securitycenter v1.35.1 h1:unUyFDeSHv89W7FPBMk10mf3R7+taAJ+1o cloud.google.com/go/securitycenter v1.35.1/go.mod h1:UDeknPuHWi15TaxrJCIv3aN1VDTz9nqWVUmW2vGayTo= cloud.google.com/go/securitycenter v1.35.3 h1:H8UvBpcvs1OjI4jZuXX8xsN1IZo88a9PezHXkU2sGps= cloud.google.com/go/securitycenter v1.35.3/go.mod h1:kjsA8Eg4jlMHW1JwxbMC8148I+gcjgkWPdbDycatoRQ= +cloud.google.com/go/securitycenter v1.36.0 h1:IdDiAa7gYtL7Gdx+wEaNHimudk3ZkEGNhdz9FuEuxWM= +cloud.google.com/go/securitycenter v1.36.0/go.mod h1:AErAQqIvrSrk8cpiItJG1+ATl7SD7vQ6lgTFy/Tcs4Q= cloud.google.com/go/servicecontrol v1.11.1 h1:d0uV7Qegtfaa7Z2ClDzr9HJmnbJW7jn0WhZ7wOX6hLE= cloud.google.com/go/servicedirectory v1.12.1 h1:LjbIXEZiyqsIADrj6Y81FnbSlaHPQHJ8UDQQnUegowc= cloud.google.com/go/servicedirectory v1.12.1/go.mod h1:d2H6joDMjnTQ4cUUCZn6k9NgZFbXjLVJbHETjoJR9k0= @@ -442,7 +494,10 @@ cloud.google.com/go/shell v1.8.1/go.mod h1:jaU7OHeldDhTwgs3+clM0KYEDYnBAPevUI6wN cloud.google.com/go/shell v1.8.3 h1:mjYgUsOtV3jl9xvDmcvlRRmA64deEPf52zOfuc68b/g= cloud.google.com/go/shell v1.8.3/go.mod h1:OYcrgWF6JSp/uk76sNTtYFlMD0ho2+Cdzc7U3P/bF54= cloud.google.com/go/spanner v1.70.0/go.mod h1:X5T0XftydYp0K1adeJQDJtdWpbrOeJ7wHecM4tK6FiE= +cloud.google.com/go/spanner v1.73.0 h1:0bab8QDn6MNj9lNK6XyGAVFhMlhMU2waePPa6GZNoi8= cloud.google.com/go/spanner v1.73.0/go.mod h1:mw98ua5ggQXVWwp83yjwggqEmW9t8rjs9Po1ohcUGW4= +cloud.google.com/go/spanner v1.76.1 h1:vYbVZuXfnFwvNcvH3lhI2PeUA+kHyqKmLC7mJWaC4Ok= +cloud.google.com/go/spanner v1.76.1/go.mod h1:YtwoE+zObKY7+ZeDCBtZ2ukM+1/iPaMfUM+KnTh/sx0= cloud.google.com/go/speech v1.25.1 h1:iGZJS3wrdkje/Vqiacx1+r+zVwUZoXVMdklYIVsvfNw= cloud.google.com/go/speech v1.25.1/go.mod h1:WgQghvghkZ1htG6BhYn98mP7Tg0mti8dBFDLMVXH/vM= cloud.google.com/go/speech v1.26.0 h1:qvURtJs7BQzQhbxWxwai0pT79S8KLVKJ/4W8igVkt1Y= @@ -511,6 +566,12 @@ cloud.google.com/go/workflows v1.13.1 h1:DkxrZ4HyXvjQLZWsYAUOV1w7d2a43XscM9dmkIG cloud.google.com/go/workflows v1.13.1/go.mod h1:xNdYtD6Sjoug+khNCAtBMK/rdh8qkjyL6aBas2XlkNc= cloud.google.com/go/workflows v1.13.3 h1:lNFDMranJymDEB7cTI7DI9czbc1WU0RWY9KCEv9zuDY= cloud.google.com/go/workflows v1.13.3/go.mod h1:Xi7wggEt/ljoEcyk+CB/Oa1AHBCk0T1f5UH/exBB5CE= +codeberg.org/go-fonts/liberation v0.5.0 h1:SsKoMO1v1OZmzkG2DY+7ZkCL9U+rrWI09niOLfQ5Bo0= +codeberg.org/go-fonts/liberation v0.5.0/go.mod h1:zS/2e1354/mJ4pGzIIaEtm/59VFCFnYC7YV6YdGl5GU= +codeberg.org/go-latex/latex v0.1.0 h1:hoGO86rIbWVyjtlDLzCqZPjNykpWQ9YuTZqAzPcfL3c= +codeberg.org/go-latex/latex v0.1.0/go.mod h1:LA0q/AyWIYrqVd+A9Upkgsb+IqPcmSTKc9Dny04MHMw= +codeberg.org/go-pdf/fpdf v0.10.0 h1:u+w669foDDx5Ds43mpiiayp40Ov6sZalgcPMDBcZRd4= +codeberg.org/go-pdf/fpdf v0.10.0/go.mod h1:Y0DGRAdZ0OmnZPvjbMp/1bYxmIPxm0ws4tfoPOc4LjU= contrib.go.opencensus.io/exporter/aws v0.0.0-20230502192102-15967c811cec h1:CSNP8nIEQt4sZEo2sGUiWSmVJ9c5QdyIQvwzZAsn+8Y= contrib.go.opencensus.io/exporter/aws v0.0.0-20230502192102-15967c811cec/go.mod h1:uu1P0UCM/6RbsMrgPa98ll8ZcHM858i/AD06a9aLRCA= contrib.go.opencensus.io/exporter/ocagent v0.6.0 h1:Z1n6UAyr0QwM284yUuh5Zd8JlvxUGAhFZcgMJkMPrGM= @@ -525,20 +586,29 @@ filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4 gioui.org v0.0.0-20210308172011-57750fc8a0a6 h1:K72hopUosKG3ntOPNG4OzzbuhxGuVf06fa2la1/H/Ho= git.sr.ht/~sbinet/gg v0.5.0 h1:6V43j30HM623V329xA9Ntq+WJrMjDxRjuAB1LFWF5m8= git.sr.ht/~sbinet/gg v0.5.0/go.mod h1:G2C0eRESqlKhS7ErsNey6HHrqU1PwsnCQlekFi9Q2Oo= +git.sr.ht/~sbinet/gg v0.6.0 h1:RIzgkizAk+9r7uPzf/VfbJHBMKUr0F5hRFxTUGMnt38= +git.sr.ht/~sbinet/gg v0.6.0/go.mod h1:uucygbfC9wVPQIfrmwM2et0imr8L7KQWywX0xpFMm94= github.com/99designs/basicauth-go v0.0.0-20160802081356-2a93ba0f464d h1:j6oB/WPCigdOkxtuPl1VSIiLpy7Mdsu6phQffbF19Ng= github.com/99designs/httpsignatures-go v0.0.0-20170731043157-88528bf4ca7e h1:rl2Aq4ZODqTDkeSqQBy+fzpZPamacO1Srp8zq7jf2Sc= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/Azure/azure-amqp-common-go/v3 v3.2.3 h1:uDF62mbd9bypXWi19V1bN5NZEO84JqgmI5G73ibAmrk= github.com/Azure/azure-amqp-common-go/v3 v3.2.3/go.mod h1:7rPmbSfszeovxGfc5fSAXE4ehlXQZHpMja2OtxC2Tas= +github.com/Azure/azure-sdk-for-go/sdk/azcore v1.17.1/go.mod h1:zGqV2R4Cr/k8Uye5w+dgQ06WJtEcbQG/8J7BB6hnCr4= +github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.8.2/go.mod h1:SqINnQ9lVVdRlyC8cd1lCI0SdX4n2paeABd2K8ggfnE= +github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.0/go.mod h1:j2chePtV91HrC22tGoRX3sGY42uF13WzmmV80/OdVAA= github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus v1.7.1 h1:o/Ws6bEqMeKZUfj1RRm3mQ51O8JGU5w+Qdg2AhHib6A= github.com/Azure/azure-sdk-for-go/sdk/messaging/azservicebus v1.7.1/go.mod h1:6QAMYBAbQeeKX+REFJMZ1nFWu9XLw/PPcjYpuc9RDFs= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0/go.mod h1:LRr2FzBTQlONPPa5HREE5+RjSCTXl7BwOvYOaWTqCaI= +github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.1.1/go.mod h1:c/wcGeGx5FUPbM/JltUYHZcKmigwyVLJlDq+4HdtXaw= github.com/Azure/go-amqp v1.0.5 h1:po5+ljlcNSU8xtapHTe8gIc8yHxCzC03E8afH2g1ftU= github.com/Azure/go-amqp v1.0.5/go.mod h1:vZAogwdrkbyK3Mla8m/CxSc/aKdnTZ4IbPxl51Y5WZE= +github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest/autorest/azure/auth v0.5.13 h1:Ov8avRZi2vmrE2JcXw+tu5K/yB41r7xK9GZDiBF7NdM= github.com/Azure/go-autorest/autorest/azure/auth v0.5.13/go.mod h1:5BAVfWLWXihP47vYrPuBKKf4cS0bXI+KM9Qx6ETDJYo= github.com/Azure/go-autorest/autorest/azure/cli v0.4.6 h1:w77/uPk80ZET2F+AfQExZyEWtn+0Rk/uw17m9fv5Ajc= github.com/Azure/go-autorest/autorest/azure/cli v0.4.6/go.mod h1:piCfgPho7BiIDdEQ1+g4VmKyD5y+p/XtSNqE6Hc4QD0= +github.com/AzureAD/microsoft-authentication-library-for-go v1.3.3/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI= github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= github.com/ClickHouse/ch-go v0.61.5 h1:zwR8QbYI0tsMiEcze/uIMK+Tz1D3XZXLdNrlaOpeEI4= @@ -549,6 +619,8 @@ github.com/ClickHouse/clickhouse-go/v2 v2.30.0 h1:AG4D/hW39qa58+JHQIFOSnxyL46H6h github.com/ClickHouse/clickhouse-go/v2 v2.30.0/go.mod h1:i9ZQAojcayW3RsdCb3YR+n+wC2h65eJsZCscZ1Z1wyo= github.com/ClickHouse/clickhouse-go/v2 v2.33.1 h1:Z5nO/AnmUywcw0AvhAD0M1C2EaMspnXRK9vEOLxgmI0= github.com/ClickHouse/clickhouse-go/v2 v2.33.1/go.mod h1:cb1Ss8Sz8PZNdfvEBwkMAdRhoyB6/HiB6o3We5ZIcE4= +github.com/ClickHouse/clickhouse-go/v2 v2.34.0 h1:Y4rqkdrRHgExvC4o/NTbLdY5LFQ3LHS77/RNFxFX3Co= +github.com/ClickHouse/clickhouse-go/v2 v2.34.0/go.mod h1:yioSINoRLVZkLyDzdMXPLRIqhDvel8iLBlwh6Iefso8= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53 h1:sR+/8Yb4slttB4vD+b9btVEnWgL3Q00OBTzVT8B9C0c= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= github.com/CloudyKit/jet/v6 v6.2.0 h1:EpcZ6SR9n28BUGtNJSvlBqf90IpjeFr36Tizxhn/oME= @@ -557,14 +629,20 @@ github.com/DATA-DOG/go-sqlmock v1.5.0/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dXCilEuNEeAn20fdD4= github.com/DataDog/sketches-go v1.4.6 h1:acd5fb+QdUzGrosfNLwrIhqyrbMORpvBy7mE+vHlT3I= github.com/DataDog/sketches-go v1.4.6/go.mod h1:7Y8GN8Jf66DLyDhc94zuWA3uHEt/7ttt8jHOBWWrSOg= +github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= +github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= github.com/DmitriyVTitov/size v1.5.0 h1:/PzqxYrOyOUX1BXj6J9OuVRVGe+66VL4D9FlUaW515g= github.com/DmitriyVTitov/size v1.5.0/go.mod h1:le6rNI4CoLQV1b9gzp1+3d7hMAD/uu2QcJ+aYbNgiU0= github.com/GoogleCloudPlatform/cloudsql-proxy v1.36.0 h1:kAtNAWwvTt5+iew6baV0kbOrtjYTXPtWNSyOFlcxkBU= github.com/GoogleCloudPlatform/cloudsql-proxy v1.36.0/go.mod h1:VRKXU8C7Y/aUKjRBTGfw0Ndv4YqNxlB8zAPJJDxbASE= github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.0/go.mod h1:dppbR7CwXD4pgtV9t3wD1812RaLDcBjtblcDF5f1vI0= +github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.2/go.mod h1:dppbR7CwXD4pgtV9t3wD1812RaLDcBjtblcDF5f1vI0= github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0/go.mod h1:obipzmGjfSjam60XLwGfqUkJsfiheAl+TUjG+4yzyPM= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.26.0/go.mod h1:2bIszWvQRlJVmJLiuLhukLImRjKPcYdzzsx6darK02A= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.48.1/go.mod h1:jyqM3eLpJ3IbIFDTKVz2rF9T/xWGW0rIriGwnz8l9Tk= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.50.0/go.mod h1:ZV4VOm0/eHR06JLrXWe09068dHpr3TRpY9Uo7T+anuA= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.48.1/go.mod h1:viRWSEhtMZqz1rhwmOVKkWl6SwmVowfL9O2YR5gI2PE= +github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.50.0/go.mod h1:otE2jQekW/PqXk1Awf5lmfokJx4uwuqcj1ab5SpGeW0= github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= github.com/IBM/go-sdk-core/v5 v5.17.4 h1:VGb9+mRrnS2HpHZFM5hy4J6ppIWnwNrw0G+tLSgcJLc= github.com/IBM/go-sdk-core/v5 v5.17.4/go.mod h1:KsAAI7eStAWwQa4F96MLy+whYSh39JzNjklZRbN/8ns= @@ -573,11 +651,15 @@ github.com/IBM/ibm-cos-sdk-go v1.11.0/go.mod h1:FnWOym0CvrPM0nHoXvceClOEvGVXecPp github.com/IBM/sarama v1.43.1/go.mod h1:GG5q1RURtDNPz8xxJs3mgX6Ytak8Z9eLhAkJPObe2xE= github.com/IBM/sarama v1.43.2 h1:HABeEqRUh32z8yzY2hGB/j8mHSzC/HA9zlEjqFNCzSw= github.com/IBM/sarama v1.43.2/go.mod h1:Kyo4WkF24Z+1nz7xeVUFWIuKVV8RS3wM8mkvPKMdXFQ= +github.com/IBM/sarama v1.45.1 h1:nY30XqYpqyXOXSNoe2XCgjj9jklGM1Ye94ierUb1jQ0= +github.com/IBM/sarama v1.45.1/go.mod h1:qifDhA3VWSrQ1TjSMyxDl3nYL3oX2C83u+G6L79sq4w= github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c h1:RGWPOewvKIROun94nF7v2cua9qP+thov/7M50KEoeSU= github.com/Joker/jade v1.1.3 h1:Qbeh12Vq6BxURXT1qZBRHsDxeURB8ztcL6f3EXSGeHk= github.com/Joker/jade v1.1.3/go.mod h1:T+2WLyt7VH6Lp0TRxQrUYEs64nRc83wkMQrfeIQKduM= github.com/KimMachineGun/automemlimit v0.6.1 h1:ILa9j1onAAMadBsyyUJv5cack8Y1WT26yLj/V+ulKp8= github.com/KimMachineGun/automemlimit v0.6.1/go.mod h1:T7xYht7B8r6AG/AqFcUdc7fzd2bIdBKmepfP2S1svPY= +github.com/KimMachineGun/automemlimit v0.7.1 h1:QcG/0iCOLChjfUweIMC3YL5Xy9C3VBeNmCZHrZfJMBw= +github.com/KimMachineGun/automemlimit v0.7.1/go.mod h1:QZxpHaGOQoYvFhv/r4u3U0JTC2ZcOwbSr11UZF46UBM= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/MarvinJWendt/testza v0.1.0/go.mod h1:7AxNvlfeHP7Z/hDQ5JtE3OKYT3XFUeLCDE2DQninSqs= github.com/MarvinJWendt/testza v0.2.1/go.mod h1:God7bhG8n6uQxwdScay+gjm9/LnO4D3kkcZX4hv9Rp8= @@ -591,6 +673,7 @@ github.com/MarvinJWendt/testza v0.5.2/go.mod h1:xu53QFE5sCdjtMCKk8YMQ2MnymimEctc github.com/Masterminds/semver/v3 v3.3.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/MicahParks/keyfunc/v2 v2.1.0 h1:6ZXKb9Rp6qp1bDbJefnG7cTH8yMN1IC/4nf+GVjO99k= github.com/MicahParks/keyfunc/v2 v2.1.0/go.mod h1:rW42fi+xgLJ2FRRXAfNx9ZA8WpD4OeE/yHVMteCkw9k= +github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/Microsoft/hcsshim v0.9.6 h1:VwnDOgLeoi2du6dAznfmspNqTiwczvjv4K7NxuY9jsY= github.com/Microsoft/hcsshim v0.9.6/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= @@ -607,6 +690,8 @@ github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV github.com/RaveNoX/go-jsoncommentstrip v1.0.0 h1:t527LHHE3HmiHrq74QMpNPZpGCIJzTx+apLkMKt4HC0= github.com/RoaringBitmap/gocroaring v0.4.0 h1:5nufXUgWpBEUNEJXw7926YAA58ZAQRpWPrQV1xCoSjc= github.com/RoaringBitmap/real-roaring-datasets v0.0.0-20190726190000-eb7c87156f76 h1:ZYlhPbqQFU+AHfgtCdHGDTtRW1a8geZyiE8c6Q+Sl1s= +github.com/Sereal/Sereal/Go/sereal v0.0.0-20231009093132-b9187f1a92c6 h1:5kUcJJAKWWI82Xnp/CaU0eu5hLlHkmm9acjowSkwCd0= +github.com/Sereal/Sereal/Go/sereal v0.0.0-20231009093132-b9187f1a92c6/go.mod h1:JwrycNnC8+sZPDyzM3MQ86LvaGzSpfxg885KOOwFRW4= github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06 h1:KkH3I3sJuOLP3TjA/dfr4NAY8bghDwnXiU7cTKxQqo0= github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM= github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d h1:UrqY+r/OJnIp5u0s1SbQ8dVfLCZJsnvazdBP5hS4iRs= @@ -628,8 +713,12 @@ github.com/alecthomas/chroma v0.10.0/go.mod h1:jtJATyUxlIORhUOFNA9NZDWGAQ8wpxQQq github.com/alecthomas/kingpin/v2 v2.4.0 h1:f48lwail6p8zpO1bC4TxtqACaGqHYA22qkHjHpqDjYY= github.com/alecthomas/kong v0.8.0 h1:ryDCzutfIqJPnNn0omnrgHLbAggDQM2VWHikE1xqK7s= github.com/alecthomas/kong v0.8.0/go.mod h1:n1iCIO2xS46oE8ZfYCNDqdR0b0wZNrXAIAqro/2132U= +github.com/alecthomas/kong v1.10.0 h1:8K4rGDpT7Iu+jEXCIJUeKqvpwZHbsFRoebLbnzlmrpw= +github.com/alecthomas/kong v1.10.0/go.mod h1:p2vqieVMeTAnaC83txKtXe8FLke2X07aruPWXyMPQrU= github.com/alecthomas/participle/v2 v2.1.1 h1:hrjKESvSqGHzRb4yW1ciisFJ4p3MGYih6icjJvbsmV8= github.com/alecthomas/participle/v2 v2.1.1/go.mod h1:Y1+hAs8DHPmc3YUFzqllV+eSQ9ljPTk0ZkPMtEdAx2c= +github.com/alecthomas/participle/v2 v2.1.4 h1:W/H79S8Sat/krZ3el6sQMvMaahJ+XcM9WSI2naI7w2U= +github.com/alecthomas/participle/v2 v2.1.4/go.mod h1:8tqVbpTX20Ru4NfYQgZf4mP18eXPTBViyMWiArNEgGI= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= github.com/alexflint/go-arg v1.4.2 h1:lDWZAXxpAnZUq4qwb86p/3rIJJ2Li81EoMbTMujhVa0= github.com/alexflint/go-arg v1.4.2/go.mod h1:9iRbDxne7LcR/GSvEr7ma++GLpdIU1zrghf2y2768kM= @@ -648,6 +737,10 @@ github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x0 github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA= github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kktS1LM= github.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA= +github.com/antchfx/xmlquery v1.4.4 h1:mxMEkdYP3pjKSftxss4nUHfjBhnMk4imGoR96FRY2dg= +github.com/antchfx/xmlquery v1.4.4/go.mod h1:AEPEEPYE9GnA2mj5Ur2L5Q5/2PycJ0N9Fusrx9b12fc= +github.com/antchfx/xpath v1.3.4 h1:1ixrW1VnXd4HurCj7qnqnR0jo14g8JMe20Fshg1Vgz4= +github.com/antchfx/xpath v1.3.4/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs= github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9 h1:goHVqTbFX3AIo0tzGr14pgfAW2ZfPChKO21Z9MGf/gk= github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230512164433-5d1fd1a340c9/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM= @@ -669,6 +762,8 @@ github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6l github.com/atomicgo/cursor v0.0.1 h1:xdogsqa6YYlLfM+GyClC/Lchf7aiMerFiZQn7soTOoU= github.com/atomicgo/cursor v0.0.1/go.mod h1:cBON2QmmrysudxNBFthvMtN32r3jxVRIvzkUiF/RuIk= github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= +github.com/aws/aws-msk-iam-sasl-signer-go v1.0.1 h1:nMp7diZObd4XEVUR0pEvn7/E13JIgManMX79Q6quV6E= +github.com/aws/aws-msk-iam-sasl-signer-go v1.0.1/go.mod h1:MVYeeOhILFFemC/XlYTClvBjYZrg/EPd3ts885KrNTI= github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= @@ -749,6 +844,8 @@ github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRt github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/cenkalti/backoff/v5 v5.0.2 h1:rIfFVxEf1QsI7E1ZHfp/B4DF/6QBAUhmgkxc0H7Zss8= +github.com/cenkalti/backoff/v5 v5.0.2/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= github.com/centrifugal/centrifuge v0.36.0 h1:FLjOysPb0o8I6VT0FiR73CMXRY7lmZLlLJBt12hisFs= github.com/centrifugal/centrifuge v0.36.0/go.mod h1:X+rNLSNG81u4kZBPbkMMz3mxXTcc7bUSYpR3bbzwkkA= @@ -833,6 +930,8 @@ github.com/coreos/go-etcd v2.0.0+incompatible h1:bXhRBIXoTm9BYHS3gE0TtQuyNZyeEMu github.com/coreos/go-iptables v0.5.0 h1:mw6SAibtHKZcNzAsOxjoHIG0gy5YFHhypWSSNc6EjbQ= github.com/coreos/go-oidc v2.2.1+incompatible h1:mh48q/BqXqgjVHpy2ZY7WnWAbenxRjsz9N1i1YxjHAk= github.com/coreos/go-oidc v2.2.1+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= +github.com/coreos/go-oidc v2.3.0+incompatible h1:+5vEsrgprdLjjQ9FzIKAzQz1wwPD+83hQRfUIPh7rO0= +github.com/coreos/go-oidc v2.3.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-oidc/v3 v3.9.0 h1:0J/ogVOd4y8P0f0xUh8l9t07xRP/d8tccvjHl2dcsSo= github.com/coreos/go-oidc/v3 v3.9.0/go.mod h1:rTKz2PYwftcrtoCzV5g5kvfJoWcm0Mk8AF8y1iAQro4= github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= @@ -850,6 +949,7 @@ github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46t github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/creasty/defaults v1.8.0 h1:z27FJxCAa0JKt3utc0sCImAEb+spPucmKoOdLHvHYKk= @@ -898,6 +998,8 @@ github.com/dave/patsy v0.0.0-20210517141501-957256f50cba h1:1o36L4EKbZzazMk8iGC4 github.com/dave/patsy v0.0.0-20210517141501-957256f50cba/go.mod h1:qfR88CgEGLoiqDaE+xxDCi5QA5v4vUoW0UCX2Nd5Tlc= github.com/dave/rebecca v0.9.1 h1:jxVfdOxRirbXL28vXMvUvJ1in3djwkVKXCq339qhBL0= github.com/dave/rebecca v0.9.1/go.mod h1:N6XYdMD/OKw3lkF3ywh8Z6wPGuwNFDNtWYEMFWEmXBA= +github.com/davecgh/go-xdr v0.0.0-20161123171359-e6a2ba005892 h1:qg9VbHo1TlL0KDM0vYvBG9EY0X0Yku5WYIPoFWt8f6o= +github.com/davecgh/go-xdr v0.0.0-20161123171359-e6a2ba005892/go.mod h1:CTDl0pzVzE5DEzZhPfvhY/9sPFMQIxaJ9VAMs9AagrE= github.com/dchest/uniuri v1.2.0 h1:koIcOUdrTIivZgSLhHQvKgqdWZq5d7KdMEWF1Ud6+5g= github.com/dchest/uniuri v1.2.0/go.mod h1:fSzm4SLHzNZvWLvWJew423PhAzkpNQYq+uNLq4kxhkY= github.com/denisenkom/go-mssqldb v0.0.0-20190515213511-eb9f6a1743f3 h1:tkum0XDgfR0jcVVXuTsYv/erY2NnEDqwRojbxR1rBYA= @@ -912,6 +1014,8 @@ github.com/dimchansky/utfbom v1.1.1/go.mod h1:SxdoEBH5qIqFocHMyGOXVAybYJdr71b1Q/ github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E= github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/dnaeon/go-vcr v1.1.0 h1:ReYa/UBrRyQdant9B4fNHGoCNKw6qh6P0fsdGmZpR7c= +github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= @@ -942,6 +1046,8 @@ github.com/dvyukov/go-fuzz v0.0.0-20210103155950-6a8e9d1f2415 h1:q1oJaUPdmpDm/Vy github.com/dvyukov/go-fuzz v0.0.0-20210103155950-6a8e9d1f2415/go.mod h1:11Gm+ccJnvAhCNLlf5+cS9KjtbaD5I5zaZpFMsTHWTw= github.com/eapache/go-resiliency v1.6.0 h1:CqGDTLtpwuWKn6Nj3uNUdflaq+/kIPsg0gfNzHton30= github.com/eapache/go-resiliency v1.6.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= +github.com/eapache/go-resiliency v1.7.0 h1:n3NRTnBn5N0Cbi/IeOHuQn9s2UwVUH7Ga0ZWcP+9JTA= +github.com/eapache/go-resiliency v1.7.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 h1:Oy0F4ALJ04o5Qqpdz8XLIpNA3WM/iSIXqxtqo7UGVws= github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0= github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= @@ -949,16 +1055,22 @@ github.com/ebitengine/purego v0.8.2 h1:jPPGWs2sZ1UgOSgD2bClL0MJIqu58nOmIcBuXr62z github.com/ebitengine/purego v0.8.2/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/efficientgo/tools/core v0.0.0-20220225185207-fe763185946b h1:ZHiD4/yE4idlbqvAO6iYCOYRzOMRpxkW+FKasRA3tsQ= github.com/efficientgo/tools/core v0.0.0-20220225185207-fe763185946b/go.mod h1:OmVcnJopJL8d3X3sSXTiypGoUSgFq1aDGmlrdi9dn/M= +github.com/elastic/go-grok v0.3.1 h1:WEhUxe2KrwycMnlvMimJXvzRa7DoByJB4PVUIE1ZD/U= +github.com/elastic/go-grok v0.3.1/go.mod h1:n38ls8ZgOboZRgKcjMY8eFeZFMmcL9n2lP0iHhIDk64= github.com/elastic/go-sysinfo v1.8.1/go.mod h1:JfllUnzoQV/JRYymbH3dO1yggI3mV2oTKSXsDHM+uIM= github.com/elastic/go-sysinfo v1.11.2 h1:mcm4OSYVMyws6+n2HIVMGkln5HOpo5Ie1ZmbbNn0jg4= github.com/elastic/go-sysinfo v1.11.2/go.mod h1:GKqR8bbMK/1ITnez9NIsIfXQr25aLhRJa7AfT8HpBFQ= github.com/elastic/go-sysinfo v1.15.2 h1:rgUFj4xRnxdAaxh4IhuGzHINWT8WrwUe5D338LLRC0s= github.com/elastic/go-sysinfo v1.15.2/go.mod h1:jPSuTgXG+dhhh0GKIyI2Cso+w5lPJ5PvVqKlL8LV/Hk= +github.com/elastic/go-sysinfo v1.15.3 h1:W+RnmhKFkqPTCRoFq2VCTmsT4p/fwpo+3gKNQsn1XU0= +github.com/elastic/go-sysinfo v1.15.3/go.mod h1:K/cNrqYTDrSoMh2oDkYEMS2+a72GRxMvNP+GC+vRIlo= github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6CcloAxnPgU= github.com/elastic/go-windows v1.0.1 h1:AlYZOldA+UJ0/2nBuqWdo90GFCgG9xuyw9SYzGUtJm0= github.com/elastic/go-windows v1.0.1/go.mod h1:FoVvqWSun28vaDQPbj2Elfc0JahhPB7WQEGa3c814Ss= github.com/elastic/go-windows v1.0.2 h1:yoLLsAsV5cfg9FLhZ9EXZ2n2sQFKeDYrHenkcivY4vI= github.com/elastic/go-windows v1.0.2/go.mod h1:bGcDpBzXgYSqM0Gx3DM4+UxFj300SZLixie9u9ixLM8= +github.com/elastic/lunes v0.1.0 h1:amRtLPjwkWtzDF/RKzcEPMvSsSseLDLW+bnhfNSLRe4= +github.com/elastic/lunes v0.1.0/go.mod h1:xGphYIt3XdZRtyWosHQTErsQTd4OP1p9wsbVoHelrd4= github.com/elazarl/goproxy v1.3.0/go.mod h1:X/5W/t+gzDyLfHW4DrMdpjqYjpXsURlBt9lpBDxZZZQ= github.com/elazarl/goproxy v1.7.1/go.mod h1:82vkLNir0ALaW14Rc399OTTjyNREgmdL2cVoIbS6XaE= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633 h1:H2pdYOb3KQ1/YsqVWoWNLQO+fusocsw354rqGTZtAgw= @@ -979,6 +1091,7 @@ github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/felixge/fgprof v0.9.4 h1:ocDNwMFlnA0NU0zSB3I52xkO4sFXk80VK9lXjLClu88= github.com/felixge/fgprof v0.9.4/go.mod h1:yKl+ERSa++RYOs32d8K6WEXCB4uXdLls4ZaZPpayhMM= +github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flosch/pongo2/v4 v4.0.2 h1:gv+5Pe3vaSVmiJvh/BZa82b7/00YUGm0PIyVVLop0Hw= github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= github.com/fluent/fluent-bit-go v0.0.0-20230731091245-a7a013e2473c h1:yKN46XJHYC/gvgH2UsisJ31+n4K3S7QYZSfU2uAWjuI= @@ -990,6 +1103,7 @@ github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVB github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= github.com/fsouza/fake-gcs-server v1.7.0 h1:Un0BXUXrRWYSmYyC1Rqm2e2WJfTPyDy/HGMz31emTi8= github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa h1:RDBNVkRviHZtvDvId8XSGPu3rmpmSe+wKRcEWNgsfWU= @@ -1009,6 +1123,7 @@ github.com/go-faster/errors v0.7.1 h1:MkJTnDoEdi9pDabt1dpWf7AA8/BaSYZqibYyhZ20AY github.com/go-faster/errors v0.7.1/go.mod h1:5ySTjWFiphBs07IKuiL69nxdfd5+fzh1u7FPGZP2quo= github.com/go-fonts/dejavu v0.1.0 h1:JSajPXURYqpr+Cu8U9bt8K+XcACIHWqWrvWCKyeFmVQ= github.com/go-fonts/latin-modern v0.2.0 h1:5/Tv1Ek/QCr20C6ZOz15vw3g7GELYL98KWr8Hgo+3vk= +github.com/go-fonts/liberation v0.2.0 h1:jAkAWJP4S+OsrPLZM4/eC9iW7CtHy+HBXrEwZXWo5VM= github.com/go-fonts/liberation v0.3.2 h1:XuwG0vGHFBPRRI8Qwbi5tIvR3cku9LUfZGq/Ar16wlQ= github.com/go-fonts/liberation v0.3.2/go.mod h1:N0QsDLVUQPy3UYg9XAc3Uh3UDMp2Z7M1o4+X98dXkmI= github.com/go-fonts/stix v0.1.0 h1:UlZlgrvvmT/58o573ot7NFw0vZasZ5I6bcIft/oMdgg= @@ -1017,8 +1132,11 @@ github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4 h1:WtGNWLvXpe github.com/go-jose/go-jose/v3 v3.0.3/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ= github.com/go-jose/go-jose/v4 v4.0.4/go.mod h1:NKb5HO1EZccyMpiZNbdUw/14tiXNyUJh188dfnMCAfc= github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= +github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= +github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= github.com/go-kit/kit v0.13.0 h1:OoneCcHKHQ03LfBpoQCUfCluwd2Vt3ohz+kvbJneZAU= github.com/go-kit/kit v0.13.0/go.mod h1:phqEHMMUbyrCFCTgH48JueqrM3md2HcAZ8N3XE4FKDg= +github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81 h1:6zl3BbBhdnMkpSj2YY30qV3gDcVBGtFgVsV3+/i+mKQ= github.com/go-latex/latex v0.0.0-20231108140139-5c1ce85aa4ea h1:DfZQkvEbdmOe+JK2TMtBM+0I9GSdzE2y/L1/AmD8xKc= github.com/go-latex/latex v0.0.0-20231108140139-5c1ce85aa4ea/go.mod h1:Y7Vld91/HRbTBm7JwoI7HejdDB0u+e9AUBO9MB7yuZk= github.com/go-logr/logr v0.2.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= @@ -1030,6 +1148,7 @@ github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaL github.com/go-openapi/jsonreference v0.20.1/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-pdf/fpdf v0.6.0 h1:MlgtGIfsdMEEQJr2le6b/HNr1ZlQwxyWr77r2aj2U/8= github.com/go-pdf/fpdf v0.9.0 h1:PPvSaUuo1iMi9KkaAn90NuKi+P4gwMedWPHhj8YlJQw= github.com/go-pdf/fpdf v0.9.0/go.mod h1:oO8N111TkmKb9D7VvWGLvLJlaZUQVPM+6V42pp3iV4Y= github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= @@ -1047,8 +1166,6 @@ github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg78 github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1 h1:TQcrn6Wq+sKGkpyPvppOz99zsMBaUOKXq6HSv655U1c= github.com/go-viper/mapstructure/v2 v2.0.0-alpha.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= -github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss= -github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= @@ -1074,8 +1191,11 @@ github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14j github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.3.1+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= +github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= github.com/golang-jwt/jwt v3.2.1+incompatible h1:73Z+4BJcrTC+KczS6WvTPvRGOp1WmfEP4Q1lOd9Z/+c= github.com/golang-jwt/jwt v3.2.1+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= +github.com/golang-jwt/jwt/v5 v5.0.0/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= +github.com/golang-jwt/jwt/v5 v5.2.1/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk= github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2VgvsThLBIFL93Qb5yWzgyZWhEmBwUJWevAkK0= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/glog v1.2.3/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= @@ -1112,7 +1232,9 @@ github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaU github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/googleapis/cloud-bigtable-clients-test v0.0.2 h1:S+sCHWAiAc+urcEnvg5JYJUOdlQEm/SEzQ/c/IdAH5M= github.com/googleapis/cloud-bigtable-clients-test v0.0.2/go.mod h1:mk3CrkrouRgtnhID6UZQDK3DrFFa7cYCAJcEmNsHYrY= +github.com/googleapis/cloud-bigtable-clients-test v0.0.3/go.mod h1:TWtDzrrAI70C3dNLDY+nZN3gxHtFdZIbpL9rCTFyxE0= github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= +github.com/googleapis/enterprise-certificate-proxy v0.3.5/go.mod h1:MkHOF77EYAE7qfSuSS9PU6g4Nt4e11cnsDUowfwewLA= github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/googleapis/gax-go/v2 v2.12.3/go.mod h1:AKloxT6GtNbaLm8QTNSidHUVsHYcBHwWRvkNFJUQcS4= github.com/googleapis/gax-go/v2 v2.13.0/go.mod h1:Z/fvTZXF8/uw7Xu5GuslPw+bplx6SS338j1Is2S+B7A= @@ -1127,11 +1249,14 @@ github.com/gookit/color v1.4.2/go.mod h1:fqRyamkC1W8uxl+lxCQxOT09l/vYfZ+QeiX3rKQ github.com/gookit/color v1.5.0/go.mod h1:43aQb+Zerm/BWh2GnrgOQm7ffz7tvQXEKV6BFMl7wAo= github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0= github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w= +github.com/gophercloud/gophercloud v1.13.0/go.mod h1:aAVqcocTSXh2vYFZ1JTvx4EQmfgzxRcNupUfxZbBNDM= github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= +github.com/gorilla/handlers v1.5.2 h1:cLTUSsNkgcwhgRqvCNmdbRWG0A3N4F+M2nWKdScwyEE= +github.com/gorilla/handlers v1.5.2/go.mod h1:dX+xVpaxdSw+q0Qek8SSsl3dfMk3jNddUkMzo0GtH0w= github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= @@ -1153,6 +1278,7 @@ github.com/grafana/cog v0.0.23 h1:/0CCJ24Z8XXM2DnboSd2FzoIswUroqIZzVr8oJWmMQs= github.com/grafana/cog v0.0.23/go.mod h1:jrS9indvWuDs60RHEZpLaAkmZdgyoLKMOEUT0jiB1t0= github.com/grafana/go-gelf/v2 v2.0.1 h1:BOChP0h/jLeD+7F9mL7tq10xVkDG15he3T1zHuQaWak= github.com/grafana/go-gelf/v2 v2.0.1/go.mod h1:lexHie0xzYGwCgiRGcvZ723bSNyNI8ZRD4s0CLobh90= +github.com/grafana/grafana-app-sdk/logging v0.38.0/go.mod h1:Y/bvbDhBiV/tkIle9RW49pgfSPIPSON8Q4qjx3pyqDk= github.com/grafana/grafana-plugin-sdk-go v0.263.0/go.mod h1:U43Cnrj/9DNYyvFcNdeUWNjMXTKNB0jcTcQGpWKd2gw= github.com/grafana/grafana-plugin-sdk-go v0.267.0/go.mod h1:OuwS4c/JYgn0rr/w5zhJBpLo4gKm/vw15RsfpYAvK9Q= github.com/grafana/grafana-plugin-sdk-go v0.269.1/go.mod h1:yv2KbO4mlr9WuDK2f+2gHAMTwwLmLuqaEnrPXTRU+OI= @@ -1171,6 +1297,7 @@ github.com/grafana/grafana/pkg/build v0.0.0-20250227163402-d78c646f93bb/go.mod h github.com/grafana/grafana/pkg/build v0.0.0-20250403075254-4918d8720c61/go.mod h1:LGVnSwdrS0ZnJ2WXEl5acgDoYPm74EUSFavca1NKHI8= github.com/grafana/grafana/pkg/semconv v0.0.0-20250121113133-e747350fee2d/go.mod h1:tfLnBpPYgwrBMRz4EXqPCZJyCjEG4Ev37FSlXnocJ2c= github.com/grafana/grafana/pkg/storage/unified/apistore v0.0.0-20250121113133-e747350fee2d/go.mod h1:CXpwZ3Mkw6xVlGKc0SqUxqXCP3Uv182q6qAQnLaLxRg= +github.com/grafana/grafana/pkg/storage/unified/apistore v0.0.0-20250514132646-acbc7b54ed9e/go.mod h1:xrKQcxQxz+IUF90ybtfENFeEXtlj9nAsX/3Fw0KEIeQ= github.com/grafana/prometheus-alertmanager v0.25.1-0.20240930132144-b5e64e81e8d3 h1:6D2gGAwyQBElSrp3E+9lSr7k8gLuP3Aiy20rweLWeBw= github.com/grafana/prometheus-alertmanager v0.25.1-0.20240930132144-b5e64e81e8d3/go.mod h1:YeND+6FDA7OuFgDzYODN8kfPhXLCehcpxe4T9mdnpCY= github.com/grafana/prometheus-alertmanager v0.25.1-0.20250331083058-4563aec7a975 h1:4/BZkGObFWZf4cLbE2Vqg/1VTz67Q0AJ7LHspWLKJoQ= @@ -1186,7 +1313,9 @@ github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.0/go.mod h1:qOchhhIlmRcqk/O github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1/go.mod h1:5SN9VR2LTsRFsrEC6FHgRbTWrTHu6tqPeKxEQv15giM= github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0/go.mod h1:P+Lt/0by1T8bfcF3z737NnSbmxQAppXMRziHUxPOC8k= github.com/grpc-ecosystem/grpc-gateway/v2 v2.22.0/go.mod h1:ggCgvZ2r7uOoQjOyu2Y1NhHmEPPzzuhWgcza5M1Ji1I= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.24.0/go.mod h1:qztMSjm835F2bXf+5HKAPIS5qsmQDqZna/PgVt4rWtI= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 h1:MJG/KsmcqMwFAkh8mTnAwhyKoB+sTAnY4CACC110tbU= +github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= github.com/hamba/avro/v2 v2.27.0 h1:IAM4lQ0VzUIKBuo4qlAiLKfqALSrFC+zi1iseTtbBKU= github.com/hamba/avro/v2 v2.27.0/go.mod h1:jN209lopfllfrz7IGoZErlDz+AyUJ3vrBePQFZwYf5I= @@ -1194,22 +1323,25 @@ github.com/hamba/avro/v2 v2.28.0 h1:E8J5D27biyAulWKNiEBhV85QPc9xRMCUCGJewS0KYCE= github.com/hamba/avro/v2 v2.28.0/go.mod h1:9TVrlt1cG1kkTUtm9u2eO5Qb7rZXlYzoKqPt8TSH+TA= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/api v1.14.0/go.mod h1:bcaw5CSZ7NE9qfOfKCI1xb7ZKjzu/MyvQkCLTfqLqxQ= +github.com/hashicorp/consul/api v1.15.3/go.mod h1:/g/qgcoBcEXALCNZgRRisyTW0nY86++L0KbeAMXYCeY= github.com/hashicorp/consul/api v1.28.2/go.mod h1:KyzqzgMEya+IZPcD65YFoOVAgPpbfERu4I/tzG6/ueE= github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/consul/sdk v0.10.0/go.mod h1:yPkX5Q6CsxTFMjQQDJwzeNmUUF5NUGGbrDsv9wTb8cw= +github.com/hashicorp/consul/sdk v0.11.0/go.mod h1:yPkX5Q6CsxTFMjQQDJwzeNmUUF5NUGGbrDsv9wTb8cw= github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v1.2.2/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-memdb v1.3.4 h1:XSL3NR682X/cVk2IeV0d70N4DZ9ljI885xAEU8IoK3c= github.com/hashicorp/go-memdb v1.3.4/go.mod h1:uBTr1oQbtuMgd1SSGoR8YV27eT3sBHbYiNm53bMpgSg= -github.com/hashicorp/go-msgpack/v2 v2.1.1 h1:xQEY9yB2wnHitoSzk/B9UjXWRQ67QKu5AOm8aFp8N3I= -github.com/hashicorp/go-msgpack/v2 v2.1.1/go.mod h1:upybraOAblm4S7rx0+jeNy+CWWhzywQsSRV5033mMu4= github.com/hashicorp/go-plugin v1.6.2/go.mod h1:CkgLQ5CZqNmdL9U9JzM532t8ZiYQ35+pj3b1FD37R0Q= github.com/hashicorp/go-sockaddr v1.0.2/go.mod h1:rB4wwRAUzs07qva3c5SdrY/NEtAUjGlgmH/UkBUC97A= github.com/hashicorp/go-syslog v1.0.0 h1:KaodqZuhUoZereWVIYmpUgZysurB1kBLX2j0MwMrUAE= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/go.net v0.0.1 h1:sNCoNyDEvN1xa+X0baata4RdcpKwcMS6DH+xwfqPgjw= +github.com/hashicorp/golang-lru v0.6.0/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/golang-lru/v2 v2.0.5/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= github.com/hashicorp/mdns v1.0.4 h1:sY0CMhFmjIPDMlTB+HfymFHCaYLhgifZ0QhjaYKD/UQ= @@ -1251,13 +1383,21 @@ github.com/jackspirou/syscerts v0.0.0-20160531025014-b68f5469dff1 h1:9Xm8CKtMZIX github.com/jackspirou/syscerts v0.0.0-20160531025014-b68f5469dff1/go.mod h1:zuHl3Hh+e9P6gmBPvcqR1HjkaWHC/csgyskg6IaFKFo= github.com/jaegertracing/jaeger v1.57.0 h1:3wDtUUPs6NRYH7+d+y8MilDkLHdpPrVlQ2wbcsA62bs= github.com/jaegertracing/jaeger v1.57.0/go.mod h1:p/1fxIU9hKHl7qEhKC72p2ZYVhvvZvNB73y6V7YyuTs= +github.com/jaegertracing/jaeger v1.67.0 h1:t0BiJZVW9D3Z16y3uHqKzV9bKFTusooTH1Kgr77xF2Q= +github.com/jaegertracing/jaeger v1.67.0/go.mod h1:tE/FEQfybCSdUbBgel51YaCSkc58O+Njih8oTl6j8vw= +github.com/jaegertracing/jaeger-idl v0.5.0 h1:zFXR5NL3Utu7MhPg8ZorxtCBjHrL3ReM1VoB65FOFGE= +github.com/jaegertracing/jaeger-idl v0.5.0/go.mod h1:ON90zFo9eoyXrt9F/KN8YeF3zxcnujaisMweFY/rg5k= +github.com/jarcoal/httpmock v1.3.1/go.mod h1:3yb8rc4BI7TCBhFY8ng0gjuLKJNquuDNiPaZjnENuYg= github.com/jedib0t/go-pretty/v6 v6.2.4 h1:wdaj2KHD2W+mz8JgJ/Q6L/T5dB7kyqEFI16eLq7GEmk= github.com/jedib0t/go-pretty/v6 v6.2.4/go.mod h1:+nE9fyyHGil+PuISTCrp7avEdo6bqoMwqZnuiK2r2a0= +github.com/jedib0t/go-pretty/v6 v6.6.7 h1:m+LbHpm0aIAPLzLbMfn8dc3Ht8MW7lsSO4MPItz/Uuo= +github.com/jedib0t/go-pretty/v6 v6.6.7/go.mod h1:YwC5CE4fJ1HFUDeivSV1r//AmANFHyqczZk+U6BDALU= github.com/jeremywohl/flatten v1.0.1 h1:LrsxmB3hfwJuE+ptGOijix1PIfOoKLJ3Uee/mzbgtrs= github.com/jeremywohl/flatten v1.0.1/go.mod h1:4AmD/VxjWcI5SRB0n6szE2A6s2fsNHDLO0nAlMHgfLQ= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jhump/gopoet v0.1.0 h1:gYjOPnzHd2nzB37xYQZxj4EIQNpBrBskRqQQ3q4ZgSg= github.com/jhump/goprotoc v0.5.0 h1:Y1UgUX+txUznfqcGdDef8ZOVlyQvnV0pKWZH08RmZuo= +github.com/jmattheis/goverter v1.7.0/go.mod h1:iVIl/4qItWjWj2g3vjouGoYensJbRqDHpzlEVMHHFeY= github.com/jmoiron/sqlx v1.3.4/go.mod h1:2BljVx/86SuTyjE+aPYlHCTNvZrnJXghYGpNiXLBMCQ= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= @@ -1266,6 +1406,7 @@ github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwA github.com/jon-whit/go-grpc-prometheus v1.4.0 h1:/wmpGDJcLXuEjXryWhVYEGt9YBRhtLwFEN7T+Flr8sw= github.com/jon-whit/go-grpc-prometheus v1.4.0/go.mod h1:iTPm+Iuhh3IIqR0iGZ91JJEg5ax6YQEe1I0f6vtBuao= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/jonboulle/clockwork v0.4.0/go.mod h1:xgRqUGwRcjKCO1vbZUEtSLrqKoPSsUpK7fnezOII0kc= github.com/joncrlsn/dque v0.0.0-20211108142734-c2ef48c5192a h1:sfe532Ipn7GX0V6mHdynBk393rDmqgI0QmjLK7ct7TU= github.com/joncrlsn/dque v0.0.0-20211108142734-c2ef48c5192a/go.mod h1:dNKs71rs2VJGBAmttu7fouEsRQlRjxy0p1Sx+T5wbpY= github.com/json-iterator/go v0.0.0-20171115153421-f7279a603ede/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= @@ -1292,6 +1433,7 @@ github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNU github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= github.com/kevinmbeaulieu/eq-go v1.0.0 h1:AQgYHURDOmnVJ62jnEk0W/7yFKEn+Lv8RHN6t7mB0Zo= github.com/kevinmbeaulieu/eq-go v1.0.0/go.mod h1:G3S8ajA56gKBZm4UB9AOyoOS37JO3roToPzKNM8dtdM= +github.com/keybase/dbus v0.0.0-20220506165403-5aa21ea2c23a/go.mod h1:YPNKjjE7Ubp9dTbnWvsP3HT+hYnY6TfXzubYTBeUxc8= github.com/kisielk/errcheck v1.5.0 h1:e8esj/e4R+SAOwFwN+n3zr0nYeCyeweozKfO23MvHzY= github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= github.com/kisielk/sqlstruct v0.0.0-20201105191214-5f3e10d3ab46 h1:veS9QfglfvqAw2e+eeNT/SbGySq8ajECXJ9e4fPoLhY= @@ -1309,8 +1451,15 @@ github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/knadh/koanf v1.5.0 h1:q2TSd/3Pyc/5yP9ldIrSdIz26MCcyNQzW0pEAugLPNs= github.com/knadh/koanf v1.5.0/go.mod h1:Hgyjp4y8v44hpZtPzs7JZfRAW5AhN7KfZcwv1RYggDs= +github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= +github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= +github.com/knadh/koanf/maps v0.1.2/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= +github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU= +github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU= github.com/knadh/koanf/v2 v2.1.1 h1:/R8eXqasSTsmDCsAyYj+81Wteg8AqrV9CP6gvsTsOmM= github.com/knadh/koanf/v2 v2.1.1/go.mod h1:4mnTRbZCK+ALuBXHZMjDfG9y714L7TykVnZkXbMU3Es= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= @@ -1338,10 +1487,13 @@ github.com/logrusorgru/aurora/v4 v4.0.0 h1:sRjfPpun/63iADiSvGGjgA1cAYegEWMPCJdUp github.com/logrusorgru/aurora/v4 v4.0.0/go.mod h1:lP0iIa2nrnT/qoFXcOZSrZQpJ1o6n2CUf/hyHi2Q4ZQ= github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c h1:VtwQ41oftZwlMnOEbMWQtSEUgU64U4s+GHk7hZK+jtY= github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE= +github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 h1:7UMa6KCCMjZEMDtTVdcGu0B1GmmC7QJKiCCjyTAWQy0= +github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k= github.com/lyft/protoc-gen-star v0.6.1 h1:erE0rdztuaDq3bpGifD95wfoPrSZc95nGA6tbiNYh6M= github.com/lyft/protoc-gen-star/v2 v2.0.4-0.20230330145011-496ad1ac90a4 h1:sIXJOMrYnQZJu7OB7ANSF4MYri2fTEGIsRLz6LwI4xE= github.com/lyft/protoc-gen-star/v2 v2.0.4-0.20230330145011-496ad1ac90a4/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= +github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= github.com/mailgun/raymond/v2 v2.0.48 h1:5dmlB680ZkFG2RN/0lvTAghrSxIESeu9/2aeDqACtjw= @@ -1360,6 +1512,7 @@ github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh github.com/mattn/go-shellwords v1.0.3 h1:K/VxK7SZ+cvuPgFSLKi5QPI9Vr/ipOf4C1gN+ntueUk= github.com/mattn/go-sqlite3 v1.14.7/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= +github.com/maxatome/go-testdeep v1.12.0/go.mod h1:lPZc/HAcJMP92l7yI6TRz1aZN5URwUBUAfUNvrclaNM= github.com/mfridman/xflag v0.1.0 h1:TWZrZwG1QklFX5S4j1vxfF1sZbZeZSGofMwPMLAF29M= github.com/mfridman/xflag v0.1.0/go.mod h1:/483ywM5ZO5SuMVjrIGquYNE5CzLrj5Ux/LxWWnjRaE= github.com/mgechev/dots v0.0.0-20210922191527-e955255bf517 h1:zpIH83+oKzcpryru8ceC6BxnoG8TBrhgAvRg8obzup0= @@ -1402,6 +1555,8 @@ github.com/moby/sys/symlink v0.2.0 h1:tk1rOM+Ljp0nFmfOIBtlV3rTDlWOwFRhjEeAhZB0nZ github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= +github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= +github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8eaE= github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/mostynb/go-grpc-compression v1.2.3 h1:42/BKWMy0KEJGSdWvzqIyOZ95YcR9mLPqKctH7Uo//I= @@ -1451,6 +1606,7 @@ github.com/onsi/ginkgo/v2 v2.22.1/go.mod h1:S6aTpoRsSq2cZOd+pssHAlKW/Q/jZt6cPrPl github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= +github.com/onsi/gomega v1.24.0/go.mod h1:Z/NWtiqwBrwUt4/2loMmHL63EDLnYHmVbuBpDr2vQAg= github.com/onsi/gomega v1.27.10/go.mod h1:RsS8tutOdbdgzbPtzzATp12yT7kM5I5aElG3evPbQ0M= github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0= github.com/onsi/gomega v1.34.2/go.mod h1:v1xfxRgk0KIsG+QOdm7p8UosrOzPYRo60fd3B/1Dukc= @@ -1460,40 +1616,82 @@ github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter v0.102.0/go.mod h1:xmy/yFFmB1Epy+czrYMbA+4xeOKvhFqNqYWU6qINeis= github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.102.0 h1:N3vWsp3xealy4AX8TovfHG5EKi/k7z+F/8LFP4SVAgo= github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.102.0/go.mod h1:/Ijok2yF1qYoHuRHvyLS04ZuW91Pue2VkqZ/nZxpkvk= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.124.1 h1:+aiMrDR6xiaDM7xN4ByrBYI0Craqt68nZicmpYpt0co= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.124.1/go.mod h1:H/TEWN4jgExt0McrtrBK2VFK6r9LRsWtqhEZrH690rs= github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0 h1:PNLVcz8kJLE9V5kGnbBh277Bvl4WwiVZ+NbFbOB80WY= github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.102.0/go.mod h1:cBbjwd8m4rBVgCQksUbAVQX1EoM5IuCyNQw2mzvibEM= github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0 h1:qsM5HhWpAfIMg8LdO4u+CHofu4UuCuJwg/M+ySO9uZA= github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.102.0/go.mod h1:wBJlGy9Wx6s7AxIMcSne2sGw73e5ZUy1AQ/duYwpFf8= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.124.1 h1:NrjsoVPxI6lmV8jPImDcMeqYh+97Y71f/HB5Sfpfe3I= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.124.1/go.mod h1:AFMryJmht7dZxcAwc2sx/r4gxbriElWw49ugxKp2mcA= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics v0.121.0 h1:I+F6xdXQsiXXdce7yjHN+y4LX5MrZI1kNmhBunJffdA= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/exp/metrics v0.121.0/go.mod h1:cRh3l2emFBwW96dHnlPLr1psbEYjYJmn5qFujOkbfRo= github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.97.0 h1:f3HVDcjUVUbOpKWiebD9v8+9YdDdNvzPyKh3IVb0ORY= github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.97.0/go.mod h1:110wLws4lB2Jpv58rK7YoaMIhIEmLlzw5/viC0XJhbM= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.124.1 h1:2uQmRiQ7EV7s1slz7fEvAVhJIFTyExnj/4unfw0Era8= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/filter v0.124.1/go.mod h1:VqJ9CWEwk6N7YzumaV1gbxY0UeLlnzAzYmTw8ieaIYs= github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka v0.102.0 h1:xBd9EXG9qvWwa2d7qDRVv/D/2gAQqn1zGbPqdjkd+O8= github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka v0.102.0/go.mod h1:e4pc6nkNyzBi5g2RgIRjJ1slRsOY5qHIbPu0E4oM3cE= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka v0.124.1 h1:hbJs+dkXx3bPshr614bYk6bwvtM9YruaGqhwXWP2UuU= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka v0.124.1/go.mod h1:oDdNpMFQ6hT0IsGDRHkG5mQ3DLxF6kYvDuoEIcoQbCo= github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.102.0 h1:/J1Q2tylp8ID+AIpCmfaArUyCPoSjY3nyZXdkpTw9J8= github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.102.0/go.mod h1:lbNQBpvs40lInohZrqAbRZ+8r29GzfMfkbLV4fBPrzE= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.124.1 h1:QUXMxZTjTER4vDa4ldkSSAd89blgS5974j5AkRLp2M0= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.124.1/go.mod h1:jRQpw8VJDmUmyH8ONQ5FmhYEXkaxzMFX6Tei8N4GDZs= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.102.0 h1:pVJ792+Nzcv8nLlg18XOLOWEZ/dCK+Wo3Iak5TU8rz8= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.102.0/go.mod h1:DmkGhNL9nuSTg8fMhYNopMuF1Y3LFqu/FQHrvhBzME0= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/core/xidutils v0.124.1 h1:E1e96GTHmiAfIfeYfA5ZVnOxud3+vbisGp0gE1tfd4s= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/core/xidutils v0.124.1/go.mod h1:MOhFATtYSLad9nKunjh6uGf8nQUcWje2LPlhD2uu3do= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.121.0/go.mod h1:MoCMz/TtwE0yYmOL3uJ+VoOxZpt7+obfdLrKNG40deI= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.97.0 h1:bVeo7BahYY4rWdaEuzJX2Tn20MbvYcEHXbFjV2IwnPQ= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.97.0/go.mod h1:lj29zRdEZdvbQvZ6g7Pb+tSPw4dQE/jahe39fRgO+08= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.124.1 h1:oiLa2lg+Ix+wHi4bPsnQ5+DJc6u+OHZt6YhP/rjgbNc= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/ottl v0.124.1/go.mod h1:v8WbCvCAzp8OgxdyXSZlLUkEKJJOLhlOF57kRCVUoAQ= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.121.0/go.mod h1:9ghLP9djsDo5xzmzkADqeJjZb3l92XIRhpAz/ToX2QM= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0 h1:TvJYcU/DLRFCgHr7nT98k5D+qkZ4syKVxc8OJjv+K4c= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.102.0/go.mod h1:WzD3Ox7tywAQHknxAFpAC1oZJGItMp5mbvgUGjvzNY8= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.121.0/go.mod h1:swPiDfFHEiy9x2TwNO3uexCkwppLWfPRVoJdpJvKIQE= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.124.1 h1:mMVzpkpy6rKL1Q/xXNogZVtWebIlxTRzhsgp3b9ioCM= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.124.1/go.mod h1:jM8Gsd0fIiwRzWrzd7Gm6PZYi5AgHPRkz0625Rtqyxo= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/azure v0.102.0 h1:IgLMHSuraJzxLqVeM7xU7aZPcXS5/eoVnX+HBuFGQ6E= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/azure v0.102.0/go.mod h1:hG8EmxUvgXIiKTG6+UVcMhFeIN6UD/bswP7WYpQ2lCc= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/azure v0.124.1 h1:kPPjaOlncaJjoaJRUzW3TbqHM4v/+TtxC2Bzpa7z9X4= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/azure v0.124.1/go.mod h1:+6zqsZ1YGNsl7RUxfjzg7MKEWd5J6QAlq7zM3Nqy8UI= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.102.0 h1:4VQidhCgkJiBvBDMOukr5ixrf5uP66iW5Hb+CFsb+4E= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.102.0/go.mod h1:nMto9zkv0vD8YI3oGZFZS2Uu7k2oHt1d+xUHN/ofUYo= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.124.1 h1:9c6L4xlAMqhOg5y54Bc2B5t0i49yz7v2I6I8RY4Z0/o= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.124.1/go.mod h1:6f0N58o0cOHC0ApSM/qrooVmQza1eQ7L53PDE91uO1Q= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.102.0 h1:Mh5MHf0PrUQMTM2S8HwEuPt3Fyz0Xnt0IG7GUc6Fmbs= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.102.0/go.mod h1:6fc8qnIayeGwAF41LyLR+/FRbyJf4+FikbmaO0GGq/Y= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.124.1 h1:IYxc8uPVCtKlgxjbYFGZ5/wXLdwAH1WQPKRlzaXtr8E= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.124.1/go.mod h1:jFRiSEn2ss3e4CWG6GTDOJMYRI0C/N2XbMMIBzZuqZY= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.102.0 h1:5M7I78lyGsH+Xyy4NoXKM/UUCa52aZQiPcSX6so6x94= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.102.0/go.mod h1:BEQy0zEel5uIOTEFBBmvQJ4A32R6nKLtSMtC6ylLI8k= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.124.1 h1:cyvsrj/D+/XwoXSw/4FD/S1M50jco7k963f/+si907w= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.124.1/go.mod h1:xAU/ievEszZYP1DGWy+yYjAjfjRCKyBLBAnXYvKWNWc= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor v0.121.0 h1:+wj+Sw08WDdL/9lD4OUy1PFgQMsiyLuSmlmb3HbKPv4= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/deltatocumulativeprocessor v0.121.0/go.mod h1:YczZl2MmjOUdg5eXg+fAW0my/EG+77b27ue6vj7xPHU= github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor v0.97.0 h1:IfJ9EkykXHBYdwuvZd0qfFcCHAAOuTEaiIlTRw6R9g4= github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor v0.97.0/go.mod h1:uTs2ukYAG9tCkoUhW39J9bNQAqwpqHhE85eeRVm6zCM= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor v0.124.1 h1:qkqiqLwfg7hj+oDYvpmMD64p+poaxXwo654ZE44uPm4= +github.com/open-telemetry/opentelemetry-collector-contrib/processor/filterprocessor v0.124.1/go.mod h1:B/GP3l4Y1qNsNtWVIzpwS8jWB1Nn/vx0sFBlVDkWt9E= github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.102.0 h1:HTGSfx2HzfudY1Uczw9yTBJnGBmTVFYzpGH1z+oD0nU= github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.102.0/go.mod h1:Hlz24+Ah6Ojk0FUKNb1watRmTbLEru35+feroKA7dvQ= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.124.1 h1:r20zOMMBcxzI2Sni2HyTR7TVxuNXLn1Ov6qtnlVWoJc= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.124.1/go.mod h1:1UsKa4xSNodA2i6ic5mmyd31khXyTGxsVKJoKmq/jtU= github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver v0.102.0 h1:2D3niNAKkr+NRVmAJW0bquSjzHUL6Pf1qQRLRPwA13M= github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver v0.102.0/go.mod h1:h0uqwH7b+NGDfFFWTjoGErMdYRdCqP1Az1/G+tfG024= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver v0.124.1 h1:Pdlf5D5gB/5Khi3t5PiojQrCulcEejecsxoSpOd0ekA= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver v0.124.1/go.mod h1:pKNXK34B2dV0nEDAFgHtYQHBlZpQlLWcKFZpblY3xQs= github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.102.0 h1:dBhFe/29ODIbxg4+JRaHwYAHMFFeh6/+izVtjceXwew= github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.102.0/go.mod h1:WNFjuquVqyi+WEoa6L0J3DzPLRsP24ZlbZYwKv49VwY= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.124.1 h1:npAUCN3GM93FCmSZsODhMuNn+v2xDYQTQlgRg/LqBfU= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.124.1/go.mod h1:4+9pSfniXXdRpkKf0QNdElOd7yIWD4ux8D260tSPV54= github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.102.0 h1:Pemo9pZa3VMYdrM/bss3f0qqVyBzPSulOBQL8VQcgN8= github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.102.0/go.mod h1:fvjAM+jOQdiXCmAENKH/eWxBBqTaImbq3lpoBI4X5Ek= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.124.1 h1:XkxqUEoukMWXF+EpEWeM9itXKt62yKi13Lzd8ZEASP4= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.124.1/go.mod h1:CuCZVPz+yn88b5vhZPAlxaMrVuhAVexUV6f8b07lpUc= +github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/image-spec v1.0.3-0.20211202183452-c5a74bcca799/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/runc v1.1.2 h1:2VSZwLx5k/BfsBxMMipG/LYUnmqOD/BPkIVgQUcTlLw= github.com/opencontainers/runc v1.1.2/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= @@ -1520,6 +1718,8 @@ github.com/otiai10/mint v1.3.1 h1:BCmzIS3n71sGfHB5NMNDB3lHYPz8fWSkCAErHed//qc= github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= github.com/parquet-go/parquet-go v0.23.0 h1:dyEU5oiHCtbASyItMCD2tXtT2nPmoPbKpqf0+nnGrmk= github.com/parquet-go/parquet-go v0.23.0/go.mod h1:MnwbUcFHU6uBYMymKAlPPAw9yh3kE1wWl6Gl1uLdkNk= +github.com/parquet-go/parquet-go v0.25.1-0.20250428214007-401fed3de956 h1:EqOiLPZlZ3UfC9d51fuYWP13FxwSzUCTArR0wg1LlxM= +github.com/parquet-go/parquet-go v0.25.1-0.20250428214007-401fed3de956/go.mod h1:OqBBRGBl7+llplCvDMql8dEKaDqjaFA/VAPw+OJiNiw= github.com/paulmach/orb v0.11.1 h1:3koVegMC4X/WeiXYz9iswopaTwMem53NzTJuTF20JzU= github.com/paulmach/orb v0.11.1/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/EnuLaLU= github.com/paulmach/protoscan v0.2.1/go.mod h1:SpcSwydNLrxUGSDvXvO0P7g7AuhJ7lcKfDlhJCDw2gY= @@ -1536,6 +1736,8 @@ github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+v github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d h1:CdDQnGF8Nq9ocOS/xlSptM1N3BbrA6/kmaep5ggwaIA= github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= +github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= +github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= github.com/phpdave11/gofpdf v1.4.2 h1:KPKiIbfwbvC/wOncwhrpRdXVj2CZTCFlw4wnoyjtHfQ= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= @@ -1550,17 +1752,26 @@ github.com/pkg/sftp v1.13.7/go.mod h1:KMKI0t3T6hfA+lTR/ssZdunHo+uwq7ghoN09/FSu3D github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo= github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c h1:NRoLoZvkBTKvR5gQLgA3e0hqjkY9u1wm+iOL45VN/qI= github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/pquerna/cachecontrol v0.1.0 h1:yJMy84ti9h/+OEWa752kBTKv4XC30OtVVHYv/8cTqKc= github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI= +github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7 h1:xoIK0ctDddBMnc74udxJYBqlo9Ylnsp1waqjLsnef20= +github.com/pquerna/ffjson v0.0.0-20190930134022-aa0246cd15f7/go.mod h1:YARuvh7BUWHNhzDq2OM5tzR2RiCcN2D7sapiKyCel/M= +github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U= github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho= github.com/prometheus/client_golang v1.20.4/go.mod h1:PIEt8X02hGcP8JWbeHyeZ53Y/jReSnHgO035n//V5WE= +github.com/prometheus/client_golang v1.21.0-rc.0/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= github.com/prometheus/client_golang v1.21.0/go.mod h1:U9NM32ykUErtVBxdvD3zfi+EuFkkaBvMb09mIfe0Zgg= github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.55.0/go.mod h1:2SECS4xJG1kd8XF9IcM1gMX6510RAEL65zxzNImwdc8= github.com/prometheus/common/assets v0.2.0 h1:0P5OrzoHrYBOSM1OigWL3mY8ZvV2N4zIE/5AahrSrfM= +github.com/prometheus/exporter-toolkit v0.10.1-0.20230714054209-2f4150c63f97/go.mod h1:LoBCZeRh+5hX+fSULNyFnagYlQG/gBsyA/deNzROkq8= github.com/prometheus/procfs v0.0.0-20190425082905-87a4384529e0/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/statsd_exporter v0.26.0 h1:SQl3M6suC6NWQYEzOvIv+EF6dAMYEqIuZy+o4H9F5Ig= github.com/prometheus/statsd_exporter v0.26.0/go.mod h1:GXFLADOmBTVDrHc7b04nX8ooq3azG61pnECNqT7O5DM= +github.com/prometheus/statsd_exporter v0.26.1 h1:ucbIAdPmwAUcA+dU+Opok8Qt81Aw8HanlO+2N/Wjv7w= +github.com/prometheus/statsd_exporter v0.26.1/go.mod h1:XlDdjAmRmx3JVvPPYuFNUg+Ynyb5kR69iPPkQjxXFMk= github.com/prometheus/tsdb v0.7.1 h1:YZcsG11NqnK4czYLrWd9mpEuAJIHVQLwdrleYfszMAA= github.com/pterm/pterm v0.12.27/go.mod h1:PhQ89w4i95rhgE+xedAoqous6K9X+r6aSOI2eFF7DZI= github.com/pterm/pterm v0.12.29/go.mod h1:WI3qxgvoQFFGKGjGnJR849gU0TsEOvKn5Q8LlY1U7lg= @@ -1582,6 +1793,8 @@ github.com/redis/rueidis v1.0.57 h1:eI9GDwEMjJcTMzFkiCFPZa/nJYYKgbfNBnpT7A6Wm2E= github.com/redis/rueidis v1.0.57/go.mod h1:g660/008FMYmAF46HG4lmcpcgFNj+jCjCAZUUM+wEbs= github.com/relvacode/iso8601 v1.4.0 h1:GsInVSEJfkYuirYFxa80nMLbH2aydgZpIf52gYZXUJs= github.com/relvacode/iso8601 v1.4.0/go.mod h1:FlNp+jz+TXpyRqgmM7tnzHHzBnz776kmAH2h3sZCn0I= +github.com/relvacode/iso8601 v1.6.0 h1:eFXUhMJN3Gz8Rcq82f9DTMW0svjtAVuIEULglM7QHTU= +github.com/relvacode/iso8601 v1.6.0/go.mod h1:FlNp+jz+TXpyRqgmM7tnzHHzBnz776kmAH2h3sZCn0I= github.com/richardartoul/molecule v1.0.0 h1:+LFA9cT7fn8KF39zy4dhOnwcOwRoqKiBkPqKqya+8+U= github.com/richardartoul/molecule v1.0.0/go.mod h1:uvX/8buq8uVeiZiFht+0lqSLBHF+uGV8BrTv8W/SIwk= github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= @@ -1618,8 +1831,11 @@ github.com/shirou/gopsutil/v4 v4.24.0-alpha.1 h1:lLPAdP4TpfgJ5byoc3EFwNSKZj8kCnD github.com/shirou/gopsutil/v4 v4.24.0-alpha.1/go.mod h1:GVpYUxBee6CTWux2/JslZ7fYPwqkQ8YDJSXmGAryYy4= github.com/shirou/gopsutil/v4 v4.25.2 h1:NMscG3l2CqtWFS86kj3vP7soOczqrQYIEhO/pMvvQkk= github.com/shirou/gopsutil/v4 v4.25.2/go.mod h1:34gBYJzyqCDT11b6bMHP0XCvWeU3J61XRT7a2EmCRTA= +github.com/shirou/gopsutil/v4 v4.25.3 h1:SeA68lsu8gLggyMbmCn8cmp97V1TI9ld9sVzAUcKcKE= +github.com/shirou/gopsutil/v4 v4.25.3/go.mod h1:xbuxyoZj+UsgnZrENu3lQivsngRR5BdjbJwf2fv4szA= github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFtM= github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ= +github.com/shoenig/test v1.7.1/go.mod h1:UxJ6u/x2v/TNs/LoLxBNJRV9DiwBBKYxXSyczsBHFoI= github.com/shopspring/decimal v1.3.1/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e h1:MZM7FHLqUHYI0Y/mQAt3d2aYa0SiNms/hFqC9qJYolM= github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041 h1:llrF3Fs4018ePo4+G/HV/uQUqEI1HMDjCeOf2V6puPc= @@ -1627,6 +1843,7 @@ github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5I github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/cast v1.7.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= @@ -1665,10 +1882,16 @@ github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= +github.com/tinylib/msgp v1.1.8 h1:FCXC1xanKO4I8plpHGH2P7koL/RzZs12l/+r7vakfm0= +github.com/tinylib/msgp v1.1.8/go.mod h1:qkpG+2ldGg4xRFmx+jfTvZPxfGFhi64BcnL9vkCm/Tw= github.com/tklauser/go-sysconf v0.3.12 h1:0QaGUFOdQaIVdPgfITYzaTegZvdCjmYO52cSFAEVmqU= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= +github.com/tklauser/go-sysconf v0.3.14 h1:g5vzr9iPFFz24v2KZXs/pvpvh8/V9Fw6vQK5ZZb78yU= +github.com/tklauser/go-sysconf v0.3.14/go.mod h1:1ym4lWMLUOhuBOPGtRcJm7tEGX4SCYNEEEtghGG/8uY= github.com/tklauser/numcpus v0.6.1 h1:ng9scYS7az0Bk4OZLvrNXNSAO2Pxr1XXRAPyjhIx+Fk= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= +github.com/tklauser/numcpus v0.8.0 h1:Mx4Wwe/FjZLeQsK/6kt2EOepwwSl7SmJrK5bV/dXYgY= +github.com/tklauser/numcpus v0.8.0/go.mod h1:ZJZlAY+dmR4eut8epnzf0u/VwodKmryxR8txiloSqBE= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/trivago/tgo v1.0.7 h1:uaWH/XIy9aWYWpjm2CU3RpcqZXmX2ysQ9/Go+d9gyrM= github.com/tursodatabase/libsql-client-go v0.0.0-20240902231107-85af5b9d094d h1:dOMI4+zEbDI37KGb0TI44GUAwxHF9cMsIoDTJ7UmgfU= @@ -1678,12 +1901,28 @@ github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/twmb/franz-go v1.17.1 h1:0LwPsbbJeJ9R91DPUHSEd4su82WJWcTY1Zzbgbg4CeQ= github.com/twmb/franz-go v1.17.1/go.mod h1:NreRdJ2F7dziDY/m6VyspWd6sNxHKXdMZI42UfQ3GXM= +github.com/twmb/franz-go v1.18.1 h1:D75xxCDyvTqBSiImFx2lkPduE39jz1vaD7+FNc+vMkc= +github.com/twmb/franz-go v1.18.1/go.mod h1:Uzo77TarcLTUZeLuGq+9lNpSkfZI+JErv7YJhlDjs9M= +github.com/twmb/franz-go/pkg/kadm v1.16.0 h1:STMs1t5lYR5mR974PSiwNzE5TvsosByTp+rKXLOhAjE= +github.com/twmb/franz-go/pkg/kadm v1.16.0/go.mod h1:MUdcUtnf9ph4SFBLLA/XxE29rvLhWYLM9Ygb8dfSCvw= +github.com/twmb/franz-go/pkg/kfake v0.0.0-20250320172111-35ab5e5f5327 h1:E2rCVOpwEnB6F0cUpwPNyzfRYfHee0IfHbUVSB5rH6I= +github.com/twmb/franz-go/pkg/kfake v0.0.0-20250320172111-35ab5e5f5327/go.mod h1:zCgWGv7Rg9B70WV6T+tUbifRJnx60gGTFU/U4xZpyUA= github.com/twmb/franz-go/pkg/kmsg v1.8.0 h1:lAQB9Z3aMrIP9qF9288XcFf/ccaSxEitNA1CDTEIeTA= github.com/twmb/franz-go/pkg/kmsg v1.8.0/go.mod h1:HzYEb8G3uu5XevZbtU0dVbkphaKTHk0X68N5ka4q6mU= +github.com/twmb/franz-go/pkg/kmsg v1.11.2 h1:hIw75FpwcAjgeyfIGFqivAvwC5uNIOWRGvQgZhH4mhg= +github.com/twmb/franz-go/pkg/kmsg v1.11.2/go.mod h1:CFfkkLysDNmukPYhGzuUcDtf46gQSqCZHMW1T4Z+wDE= +github.com/twmb/franz-go/plugin/kotel v1.6.0 h1:hmvLn/cVw/Hn56H3aJVJu/a/fh6m8J6Ajwp0IcEHbH8= +github.com/twmb/franz-go/plugin/kotel v1.6.0/go.mod h1:ADmLuCa/NzHdXdWfl22FsIlGCack+YrHjivirHCBJaY= github.com/twmb/franz-go/plugin/kprom v1.1.0 h1:grGeIJbm4llUBF8jkDjTb/b8rKllWSXjMwIqeCCcNYQ= github.com/twmb/franz-go/plugin/kprom v1.1.0/go.mod h1:cTDrPMSkyrO99LyGx3AtiwF9W6+THHjZrkDE2+TEBIU= +github.com/twmb/franz-go/plugin/kprom v1.2.1 h1:FGWdneW9htySYmvJ5tEuAIZepjFOuTFhHLy5TrVR+QI= +github.com/twmb/franz-go/plugin/kprom v1.2.1/go.mod h1:+dzpKnVE6By8BDRFj240dTDJS9bP2dngmuhv7egJ3Go= +github.com/twmb/murmur3 v1.1.8 h1:8Yt9taO/WN3l08xErzjeschgZU2QSrwm1kclYq+0aRg= +github.com/twmb/murmur3 v1.1.8/go.mod h1:Qq/R7NUyOfr65zD+6Q5IHKsJLwP7exErjN6lyyq3OSQ= github.com/uber-go/atomic v1.4.0 h1:yOuPqEq4ovnhEjpHmfFwsqBXDYbQeT6Nb0bwD6XnD5o= github.com/uber-go/atomic v1.4.0/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= +github.com/uber/jaeger-client-go v2.28.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= +github.com/uber/jaeger-lib v2.2.0+incompatible/go.mod h1:ComeNDZlWwrWnDv8aPp0Ba6+uUTzImX/AauajbLI56U= github.com/ugorji/go v1.1.4 h1:j4s+tAvLfL3bZyefP2SEWmhBzmuIlH/eqNuPdFPgngw= github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.14/go.mod h1:X0eDS6pD6Exaclxm99NJ3FiCDRED7vIHpx2mDOHLvkA= @@ -1691,6 +1930,7 @@ github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQ github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/quicktemplate v1.8.0 h1:zU0tjbIqTRgKQzFY1L42zq0qR3eh4WoQQdIdqCysW5k= github.com/valyala/quicktemplate v1.8.0/go.mod h1:qIqW8/igXt8fdrUln5kOSb+KWMaJ4Y8QUsfd1k6L2jM= +github.com/vburenin/ifacemaker v1.2.1/go.mod h1:5WqrzX2aD7/hi+okBjcaEQJMg4lDGrpuEX3B8L4Wgrs= github.com/vektah/gqlparser/v2 v2.5.26 h1:REqqFkO8+SOEgZHR/eHScjjVjGS8Nk3RMO/juiTobN4= github.com/vektah/gqlparser/v2 v2.5.26/go.mod h1:D1/VCZtV3LPnQrcPBeR/q5jkSQIPti0uYCP/RI0gIeo= github.com/vertica/vertica-sql-go v1.3.3 h1:fL+FKEAEy5ONmsvya2WH5T8bhkvY27y/Ik3ReR2T+Qw= @@ -1735,9 +1975,12 @@ github.com/ydb-platform/ydb-go-sdk/v3 v3.95.3 h1:pgsQPKSFfRFy3JSZMUReCF4CSEwgxA+ github.com/ydb-platform/ydb-go-sdk/v3 v3.95.3/go.mod h1:WiezFS4YCi2vHqbYGQkeu/2MDBYFLix6dIs/pd87Yck= github.com/ydb-platform/ydb-go-sdk/v3 v3.104.7 h1:d05IBvxm7X+5xo6tdZ/vHdgJF6MV+cFBEtsAGo19CjE= github.com/ydb-platform/ydb-go-sdk/v3 v3.104.7/go.mod h1:l5sSv153E18VvYcsmr51hok9Sjc16tEC8AXGbwrk+ho= +github.com/ydb-platform/ydb-go-sdk/v3 v3.108.1 h1:ixAiqjj2S/dNuJqrz4AxSqgw2P5OBMXp68hB5nNriUk= +github.com/ydb-platform/ydb-go-sdk/v3 v3.108.1/go.mod h1:l5sSv153E18VvYcsmr51hok9Sjc16tEC8AXGbwrk+ho= github.com/yosssi/ace v0.0.5 h1:tUkIP/BLdKqrlrPwcmH0shwEEhTRHoGnc1wFIWmaBUA= github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= +github.com/yuin/gopher-lua v0.0.0-20210529063254-f4c35e4016d9/go.mod h1:E1AXubJBdNmFERAOucpDIxNzeGfLzg0mYh+UfMWdChA= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43 h1:+lm10QQTNSBd8DVTNGHx7o/IKu9HYDvLMffDhbyLccI= @@ -1752,6 +1995,7 @@ github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wK gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b h1:7gd+rd8P3bqcn/96gOZa3F5dpJr/vEiDQYlNb/y2uNs= go.einride.tech/aip v0.68.0 h1:4seM66oLzTpz50u4K1zlJyOXQ3tCzcJN7I22tKkjipw= go.einride.tech/aip v0.68.0/go.mod h1:7y9FF8VtPWqpxuAxl0KQWqaULxW4zFIesD6zF5RIHHg= +go.einride.tech/aip v0.68.1/go.mod h1:XaFtaj4HuA3Zwk9xoBtTWgNubZ0ZZXv9BZJCkuKuWbg= go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= go.etcd.io/bbolt v1.3.7/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw= go.etcd.io/bbolt v1.3.11/go.mod h1:dksAq7YMXoljX0xu6VF5DMZGbhYYoLUalEiSySYAS4I= @@ -1760,12 +2004,15 @@ go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mI go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489 h1:1JFLBqwIgdyHN1ZtgjTBwO+blA6gVOmZurpiMEsETKo= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/api/v3 v3.5.12/go.mod h1:Ot+o0SWSyT6uHhA56al1oCED0JImsRiU9Dc26+C2a+4= +go.etcd.io/etcd/api/v3 v3.5.16/go.mod h1:1P4SlIP/VwkDmGo3OlOD7faPeP8KDIFhqvciH5EfN28= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/pkg/v3 v3.5.12/go.mod h1:seTzl2d9APP8R5Y2hFL3NVlD6qC/dOT+3kvrqPyTas4= +go.etcd.io/etcd/client/pkg/v3 v3.5.16/go.mod h1:V8acl8pcEK0Y2g19YlOV9m9ssUe6MgiDSobSoaBAM0E= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= go.etcd.io/etcd/client/v2 v2.305.12/go.mod h1:aQ/yhsxMu+Oht1FOupSr60oBvcS9cKXHrzBpDsPTf9E= go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= go.etcd.io/etcd/client/v3 v3.5.12/go.mod h1:tSbBCakoWmmddL+BKVAJHa9km+O/E+bumDe9mSbPiqw= +go.etcd.io/etcd/client/v3 v3.5.16/go.mod h1:X+rExSGkyqxvu276cr2OwPLBaeqFu1cIl4vmRjAD/50= go.etcd.io/gofail v0.1.0 h1:XItAMIhOojXFQMgrxjnd2EIIHun/d5qL0Pf7FzVTkFg= go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= go.etcd.io/gofail v0.2.0 h1:p19drv16FKK345a09a1iubchlw/vmRuksmRzgBIGjcA= @@ -1776,30 +2023,62 @@ go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1 h1:A/5uWzF44DlIgdm/PQFwf go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opentelemetry.io/collector v0.102.1 h1:M/ciCcReQsSDYG9bJ2Qwqk7pQILDJ2bM/l0MdeCAvJE= go.opentelemetry.io/collector v0.102.1/go.mod h1:yF1lDRgL/Eksb4/LUnkMjvLvHHpi6wqBVlzp+dACnPM= +go.opentelemetry.io/collector v0.124.0 h1:g/dfdGFhBcQI0ggGxTmGlJnJ6Yl6T2gVxQoIj4UfXCc= +go.opentelemetry.io/collector v0.124.0/go.mod h1:QzERYfmHUedawjr8Ph/CBEEkVqWS8IlxRLAZt+KHlCg= +go.opentelemetry.io/collector/client v1.30.0 h1:QbvOrvwUGcnVjnIBn2zyLLubisOjgh7kMgkzDAiYpHg= +go.opentelemetry.io/collector/client v1.30.0/go.mod h1:msXhZlNdAra2fZiyeT0o/xj43Kl1yvF9zYW0r+FhGUI= go.opentelemetry.io/collector/component v0.102.1 h1:66z+LN5dVCXhvuVKD1b56/3cYLK+mtYSLIwlskYA9IQ= go.opentelemetry.io/collector/component v0.102.1/go.mod h1:XfkiSeImKYaewT2DavA80l0VZ3JjvGndZ8ayPXfp8d0= +go.opentelemetry.io/collector/component v1.27.0/go.mod h1:fIyBHoa7vDyZL3Pcidgy45cx24tBe7iHWne097blGgo= +go.opentelemetry.io/collector/component v1.30.0 h1:HXjqBHaQ47/EEuWdnkjr4Y3kRWvmyWIDvqa1Q262Fls= +go.opentelemetry.io/collector/component v1.30.0/go.mod h1:vfM9kN+BM6oHBXWibquiprz8CVawxd4/aYy3nbhme3E= +go.opentelemetry.io/collector/component/componentstatus v0.124.0 h1:0WHaANNktxLIk+lN+CtgPBESI1MJBrfVW/LvNCbnMQ4= +go.opentelemetry.io/collector/component/componentstatus v0.124.0/go.mod h1:a/wa8nxJGWOGuLwCN8gHCzFHCaUVZ+VyUYuKz9Yaq38= +go.opentelemetry.io/collector/component/componenttest v0.124.0 h1:Wsc+DmDrWTFs/aEyjDA3slNwV+h/0NOyIR5Aywvr6Zw= +go.opentelemetry.io/collector/component/componenttest v0.124.0/go.mod h1:NQ4ATOzMFc7QA06B993tq8o27DR0cu/JR/zK7slGJ3E= go.opentelemetry.io/collector/config/configauth v0.102.1 h1:LuzijaZulMu4xmAUG8WA00ZKDlampH+ERjxclb40Q9g= go.opentelemetry.io/collector/config/configauth v0.102.1/go.mod h1:kTzfI5fnbMJpm2wycVtQeWxFAtb7ns4HksSb66NIhX8= +go.opentelemetry.io/collector/config/configauth v0.124.0 h1:Qcu800axWnpX0xRfW+9Jyos9+GTR6m7gTIF1udEihEo= +go.opentelemetry.io/collector/config/configauth v0.124.0/go.mod h1:Hz5PQnTvNk2yFp50rzf85H3k0MkdwEBdYUxhpRZn75E= go.opentelemetry.io/collector/config/configcompression v1.9.0 h1:B2q6XMO6xiF2s+14XjqAQHGY5UefR+PtkZ0WAlmSqpU= go.opentelemetry.io/collector/config/configcompression v1.9.0/go.mod h1:6+m0GKCv7JKzaumn7u80A2dLNCuYf5wdR87HWreoBO0= +go.opentelemetry.io/collector/config/configcompression v1.30.0 h1:NKbywIEfL2PBiKnm9F2X2tbPNO0WzOQY08yWmndI3uM= +go.opentelemetry.io/collector/config/configcompression v1.30.0/go.mod h1:QwbNpaOl6Me+wd0EdFuEJg0Cc+WR42HNjJtdq4TwE6w= go.opentelemetry.io/collector/config/configgrpc v0.102.1 h1:6Plnfx+xw/JH8k11MkljGoysPfn1u7hHbO2evteOTeE= go.opentelemetry.io/collector/config/configgrpc v0.102.1/go.mod h1:Kk3XOSar3QTzGDS8N8M38DVlOzUD7STS2obczO9q43I= +go.opentelemetry.io/collector/config/configgrpc v0.124.0 h1:aTuHYsyLMaGnd0o39Qy9KL1hZh2X8A1AlNR0YpB8vr0= +go.opentelemetry.io/collector/config/configgrpc v0.124.0/go.mod h1:EEC4T+hCfXbbC+711GaVFuJNBU7hdYR4Vya4RWu7xc0= go.opentelemetry.io/collector/config/confighttp v0.102.1 h1:tPw1Xf2PfDdrXoBKLY5Sd4Dh8FNm5i+6DKuky9XraIM= go.opentelemetry.io/collector/config/confighttp v0.102.1/go.mod h1:k4qscfjxuaDQmcAzioxmPujui9VSgW6oal3WLxp9CzI= +go.opentelemetry.io/collector/config/confighttp v0.124.0 h1:W75DaPeLUuGbJtX3cTXOK0b53S5zrUsh6g5UfB6Wzsw= +go.opentelemetry.io/collector/config/confighttp v0.124.0/go.mod h1:hiTu8HFgnzSitrogLz1urQn/+FzNzarqYk4BICy/ABs= go.opentelemetry.io/collector/config/confignet v0.102.1 h1:nSiAFQMzNCO4sDBztUxY73qFw4Vh0hVePq8+3wXUHtU= go.opentelemetry.io/collector/config/confignet v0.102.1/go.mod h1:pfOrCTfSZEB6H2rKtx41/3RN4dKs+X2EKQbw3MGRh0E= +go.opentelemetry.io/collector/config/confignet v1.30.0 h1:2axBhT7xKpCUFgU6KokrDnG9cjtw7gXlACP1uVCUK0s= +go.opentelemetry.io/collector/config/confignet v1.30.0/go.mod h1:HgpLwdRLzPTwbjpUXR0Wdt6pAHuYzaIr8t4yECKrEvo= go.opentelemetry.io/collector/config/configopaque v1.9.0 h1:jocenLdK/rVG9UoGlnpiBxXLXgH5NhIXCrVSTyKVYuA= go.opentelemetry.io/collector/config/configopaque v1.9.0/go.mod h1:8v1yaH4iYjcigbbyEaP/tzVXeFm4AaAsKBF9SBeqaG4= +go.opentelemetry.io/collector/config/configopaque v1.30.0 h1:vR2UxmzLwmkmQwyh16w8MyLODKdpNVKh0L3JFOZKzQ8= +go.opentelemetry.io/collector/config/configopaque v1.30.0/go.mod h1:GYQiC8IejBcwE8z0O4DwbBR/Hf6U7d8DTf+cszyqwFs= go.opentelemetry.io/collector/config/configretry v0.102.1 h1:J5/tXBL8P7d7HT5dxsp2H+//SkwDXR66Z9UTgRgtAzk= go.opentelemetry.io/collector/config/configretry v0.102.1/go.mod h1:P+RA0IA+QoxnDn4072uyeAk1RIoYiCbxYsjpKX5eFC4= +go.opentelemetry.io/collector/config/configretry v1.30.0 h1:sapni1tymwNiuI0PjqlRR5CvYxIQYT8tyjQGVJDkVPM= +go.opentelemetry.io/collector/config/configretry v1.30.0/go.mod h1:QNnb+MCk7aS1k2EuGJMtlNCltzD7b8uC7Xel0Dxm1wQ= go.opentelemetry.io/collector/config/configtelemetry v0.102.1 h1:f/CYcrOkaHd+COIJ2lWnEgBCHfhEycpbow4ZhrGwAlA= go.opentelemetry.io/collector/config/configtelemetry v0.102.1/go.mod h1:WxWKNVAQJg/Io1nA3xLgn/DWLE/W1QOB2+/Js3ACi40= +go.opentelemetry.io/collector/config/configtelemetry v0.124.0 h1:KIg5wlHKp8nI5g/hAWZug9fE5MlPZwkRP2ZHOi4I6FU= +go.opentelemetry.io/collector/config/configtelemetry v0.124.0/go.mod h1:WXmlNatI0vwjv7whh/qF1Xy+UufCZDk7VLtYqML7QmA= go.opentelemetry.io/collector/config/configtls v0.102.1 h1:7fr+PU9BRg0HRc1Pn3WmDW/4WBHRjuo7o1CdG2vQKoA= go.opentelemetry.io/collector/config/configtls v0.102.1/go.mod h1:KHdrvo3cwosgDxclyiLWmtbovIwqvaIGeTXr3p5721A= +go.opentelemetry.io/collector/config/configtls v1.30.0 h1:wLTRV5hn/FWKWNjZ/9/ckkeD2mqWzAtwzP1kQv1YZZE= +go.opentelemetry.io/collector/config/configtls v1.30.0/go.mod h1:yCM4ZYkLvc1VjpT/1DQIVoGmzEBHOhZltYQ7A30BMyM= go.opentelemetry.io/collector/config/internal v0.102.1 h1:HFsFD3xpHUuNHb8/UTz5crJw1cMHzsJQf/86sgD44hw= go.opentelemetry.io/collector/config/internal v0.102.1/go.mod h1:Vig3dfeJJnuRe1kBNpszBzPoj5eYnR51wXbeq36Zfpg= go.opentelemetry.io/collector/confmap v0.102.1 h1:wZuH+d/P11Suz8wbp+xQCJ0BPE9m5pybtUe74c+rU7E= go.opentelemetry.io/collector/confmap v0.102.1/go.mod h1:KgpS7UxH5rkd69CzAzlY2I1heH8Z7eNCZlHmwQBMxNg= +go.opentelemetry.io/collector/confmap v1.27.0/go.mod h1:tmOa6iw3FJsEgfBHKALqvcdfRtf71JZGor0wSM5MoH8= +go.opentelemetry.io/collector/confmap v1.30.0 h1:Y0MXhjQCdMyJN9xZMWWdNPWs6ncMVf7YVnyAEN2dAcM= +go.opentelemetry.io/collector/confmap v1.30.0/go.mod h1:9DdThVDIC3VsdtTb7DgT+HwusWOocoqDkd/TErEtQgA= go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.1 h1:s0RxnaABoRxtfvUeimZ0OOsF83wD/EK1tR2N5GZyst0= go.opentelemetry.io/collector/confmap/converter/expandconverter v0.102.1/go.mod h1:ZwSMlOSIzmrrSSVNoMPDr21SQx7E52bZFMQJSOZ+EhY= go.opentelemetry.io/collector/confmap/provider/envprovider v0.102.1 h1:4KLw0pTChIqDfw0ckZ411aQDw98pu2dDOqgBHXfJm8M= @@ -1812,41 +2091,136 @@ go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.1 h1:rEhPTqk go.opentelemetry.io/collector/confmap/provider/httpsprovider v0.102.1/go.mod h1:GxUZM23m3u4vURw/At2zEKW+5GwcuCNsHJNT/Wq/cFI= go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.1 h1:qmdaBIz0UnUKVitZzq+4HtO9zvRTwgNc/Q3b7kyf1NQ= go.opentelemetry.io/collector/confmap/provider/yamlprovider v0.102.1/go.mod h1:nAckG/FkzAaPuwtEN2Na2+ij+2hdTjtXUtFBnlUqpFk= +go.opentelemetry.io/collector/confmap/xconfmap v0.121.0/go.mod h1:YI1Sp8mbYro/H3rqH4csTq68VUuie5WVb7LI1o5+tVc= +go.opentelemetry.io/collector/confmap/xconfmap v0.124.0 h1:PK+CaSgjLvzHaafBieJ3AjiUTAPuf40C+/Fn38LvmW8= +go.opentelemetry.io/collector/confmap/xconfmap v0.124.0/go.mod h1:DZmFSgWiqXQrzld9uU+73YAVI5JRIgd8RkK5HcaXGU0= go.opentelemetry.io/collector/connector v0.102.1 h1:7lEwXmhzqtyZwz2bBUHzwV/CZqA8bhPPVJOi0cm9+Fk= go.opentelemetry.io/collector/connector v0.102.1/go.mod h1:DRlDYJXsFx1FKKxkdM2Ja52/xe+0bgmy0hA+wgKRUVI= +go.opentelemetry.io/collector/connector v0.124.0 h1:/Wk8A4gOqjhE+WvKCMqCFhzUIvSi3sdN3RGvopjD6SY= +go.opentelemetry.io/collector/connector v0.124.0/go.mod h1:dnYcXgUZp8ZmT7nbBPf38+mP2DD3T47m9jyGbdaCEXc= +go.opentelemetry.io/collector/connector/connectortest v0.124.0 h1:gAD2jt7Th6DD8tDTU72Sv2xXvqJEGSjfncr9nTSVCg8= +go.opentelemetry.io/collector/connector/connectortest v0.124.0/go.mod h1:0017vT2aCY1NmYXEepxvEfMA9YufKUoBM3/qtD6k9UM= +go.opentelemetry.io/collector/connector/xconnector v0.124.0 h1:rdjwSfajHjJVRznw/NKGGzY0PKBTKBypZngGxOaJuEg= +go.opentelemetry.io/collector/connector/xconnector v0.124.0/go.mod h1:rOhdUXPzTZbJ2L8VV43r7Rz/ZBfgWxQ+RI9mcqlzz5g= go.opentelemetry.io/collector/consumer v0.102.1 h1:0CkgHhxwx4lI/m+hWjh607xyjooW5CObZ8hFQy5vvo0= go.opentelemetry.io/collector/consumer v0.102.1/go.mod h1:HoXqmrRV13jLnP3/Gg3fYNdRkDPoO7UW58hKiLyFF60= +go.opentelemetry.io/collector/consumer v1.27.0/go.mod h1:1B/+kTDUI6u3mCIOAkm5ityIpv5uC0Ll78IA50SNZ24= +go.opentelemetry.io/collector/consumer v1.30.0 h1:Nn6kFTH+EJbv13E0W+sNvWrTgbiFCRv8f6DaA2F1DQs= +go.opentelemetry.io/collector/consumer v1.30.0/go.mod h1:edRyfk61ugdhCQ93PBLRZfYMVWjdMPpKP8z5QLyESf0= +go.opentelemetry.io/collector/consumer/consumererror v0.124.0 h1:OmeJex0C8jcwyILG+eJIGDe6rGaR15fip+Rj3XyMTRY= +go.opentelemetry.io/collector/consumer/consumererror v0.124.0/go.mod h1:A6WL/E70dUh9oFdQsL+aVYGL+d6UqiAhi7rIW/6gvDM= +go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.124.0 h1:OAZ65+hyjYSBLg7s7OdmGYwkStGHWR2743elhO9tX8A= +go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.124.0/go.mod h1:/Mz+iI91QxtqbH9tgIHboipE1n5e8/j4ZSQvcK8D/hU= +go.opentelemetry.io/collector/consumer/consumertest v0.124.0 h1:2arChG4RPrHW3lfVWlK/KDF7Y7qkUm/YAiBXh8oTue0= +go.opentelemetry.io/collector/consumer/consumertest v0.124.0/go.mod h1:Hlu+EXbINHxVAyIT1baKO2d0j5odR3fLlLAiaP+JqQg= +go.opentelemetry.io/collector/consumer/xconsumer v0.124.0 h1:/cut96EWVNoz6lIeGI9+EzS6UClMtnZkx5YIpkD0Xe0= +go.opentelemetry.io/collector/consumer/xconsumer v0.124.0/go.mod h1:fHH/MpzFCRNk/4foiYE6BoXQCAMf5sJTO35uvzVrrd4= go.opentelemetry.io/collector/exporter v0.102.1 h1:4VURYgBNJscxfMhZWitzcwA1cig5a6pH0xZSpdECDnM= go.opentelemetry.io/collector/exporter v0.102.1/go.mod h1:1pmNxvrvvbWDW6PiGObICdj0eOSGV4Fzwpm5QA1GU54= +go.opentelemetry.io/collector/exporter v0.124.0 h1:ii+9tU/iSrPl4+YDvqFVflksA9hUYEzwMIpmvP4JZ8w= +go.opentelemetry.io/collector/exporter v0.124.0/go.mod h1:Q8tOEwFu3CN8VGjE4H2yZcCRG9Q60foQIyZGKPD/jig= +go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.124.0 h1:rU8CkyMIkLnjQAM6Yjd/a2gOQ/Svsjd/8jCNKEmrStw= +go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.124.0/go.mod h1:2dO+z9QWGZwyxGOVLuCKAT0n+da4FMIaRjQDXdhcFyM= +go.opentelemetry.io/collector/exporter/exportertest v0.124.0 h1:IOxA/4CiVWGPlmA0JofK6W4DzvwW1YJes09r6osluIE= +go.opentelemetry.io/collector/exporter/exportertest v0.124.0/go.mod h1:2EmU8IwVJV79MmFBFFW1LCN0Ob2UZsEkX/mSUB06lbI= go.opentelemetry.io/collector/exporter/otlpexporter v0.102.1 h1:bOXE7u1iy0SKwH2mnVyIMKkvFIR9bn9iIm1Cf/CJlZU= go.opentelemetry.io/collector/exporter/otlpexporter v0.102.1/go.mod h1:4ya6xaUYvcXq9MQW0TbsR4QWkOJI02d/2Vt8plwdozA= +go.opentelemetry.io/collector/exporter/otlpexporter v0.124.0 h1:wbOnCi01UT9YGkK86Jl13DEBTCdgIXSLmX8RajQ66LM= +go.opentelemetry.io/collector/exporter/otlpexporter v0.124.0/go.mod h1:zzugHvRuxWsl8+T2Dj61QAfk7CSWhl26jp0y5LNPVig= +go.opentelemetry.io/collector/exporter/otlphttpexporter v0.124.0 h1:047D4wLOb5ug4O99y3AjR/SNFTxlq3RAr2zr/8G1JWI= +go.opentelemetry.io/collector/exporter/otlphttpexporter v0.124.0/go.mod h1:Jk/1hiZvwy4dzFEfX37h18n3U9pNIfHSApcLjZmSFmU= +go.opentelemetry.io/collector/exporter/xexporter v0.124.0 h1:Itfn2+F4ki8hObOtPCecWBwGpuxakUYSsTwwkB5iUns= +go.opentelemetry.io/collector/exporter/xexporter v0.124.0/go.mod h1:dNK/PPY02gA9BawIKHyVk8kIFdYvqVZ2A+LlMZucIPY= go.opentelemetry.io/collector/extension v0.102.1 h1:gAvE3w15q+Vv0Tj100jzcDpeMTyc8dAiemHRtJbspLg= go.opentelemetry.io/collector/extension v0.102.1/go.mod h1:XBxUOXjZpwYLZYOK5u3GWlbBTOKmzStY5eU1R/aXkIo= +go.opentelemetry.io/collector/extension v1.30.0 h1:AJqntAp1p40Q1az2Vze3OHiMURq56KWnUxaLzs1ghaA= +go.opentelemetry.io/collector/extension v1.30.0/go.mod h1:a21WpypFQp9x0Go7yMOknYmIKvdIoWGzjz+h1WMjzLk= go.opentelemetry.io/collector/extension/auth v0.102.1 h1:GP6oBmpFJjxuVruPb9X40bdf6PNu9779i8anxa+wW6U= go.opentelemetry.io/collector/extension/auth v0.102.1/go.mod h1:U2JWz8AW1QXX2Ap3ofzo5Dn2fZU/Lglld97Vbh8BZS0= +go.opentelemetry.io/collector/extension/extensionauth v1.30.0 h1:HfNT4F1LDEyuItoHq01LrPiUmMpfc5LnOfE4OYVSghA= +go.opentelemetry.io/collector/extension/extensionauth v1.30.0/go.mod h1:bVWkWyyd0aCYu+x6q4HdezfzL0QAqlq5PO7NwckXe4s= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.124.0 h1:6emRXUQriceBcrwRDf2MPQQMRu7jmP0Z0XaJ4zdjt+I= +go.opentelemetry.io/collector/extension/extensioncapabilities v0.124.0/go.mod h1:ovL3wgZuQ8/U7UxUBTqqGSYQTPxHPHmj4P+kp/zb0hA= +go.opentelemetry.io/collector/extension/extensiontest v0.124.0 h1:pWfKxEqvq5vVdQy+UIerw5j7ZrXezxsfQfuUe8g/xVo= +go.opentelemetry.io/collector/extension/extensiontest v0.124.0/go.mod h1:DLVRyW7tJt8TtYq0Wr5BUsM494YqDiIjN8YCmbVKqjs= +go.opentelemetry.io/collector/extension/xextension v0.124.0 h1:Yzf11HXaiMHfS50Zy/CYKfJjoi+/w/tgRZdDQ2VIdW0= +go.opentelemetry.io/collector/extension/xextension v0.124.0/go.mod h1:GeM0aSgwVSba3Bvvspuy1E+1aa/Q1CDxoK+e/xcJFVg= go.opentelemetry.io/collector/featuregate v1.9.0 h1:mC4/HnR5cx/kkG1RKOQAvHxxg5Ktmd9gpFdttPEXQtA= go.opentelemetry.io/collector/featuregate v1.9.0/go.mod h1:PsOINaGgTiFc+Tzu2K/X2jP+Ngmlp7YKGV1XrnBkH7U= +go.opentelemetry.io/collector/featuregate v1.30.0 h1:mx7+iP/FQnY7KO8qw/xE3Qd1MQkWcU8VgcqLNrJ8EU8= +go.opentelemetry.io/collector/featuregate v1.30.0/go.mod h1:Y/KsHbvREENKvvN9RlpiWk/IGBK+CATBYzIIpU7nccc= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.124.0 h1:8+xc3OxriK1nZNBApFCzF7lszXyBQxyJ/Nnzy5Q4hCM= +go.opentelemetry.io/collector/internal/fanoutconsumer v0.124.0/go.mod h1:CoT5fVYpTT4RWUE9DihSMlxXqGP/VnILnBBGld8Bu6o= +go.opentelemetry.io/collector/internal/sharedcomponent v0.124.0 h1:HZTic8bbD86FFxE9xw8ZXLBCIwGObL9m70REo+64ZmY= +go.opentelemetry.io/collector/internal/sharedcomponent v0.124.0/go.mod h1:yQs/QFRYvAS2ak2mh9CXblFGbFEPLJ7FaFc8rTpL8C0= +go.opentelemetry.io/collector/internal/telemetry v0.124.0 h1:kzd1/ZYhLj4bt2pDB529mL4rIRrRacemXodFNxfhdWk= +go.opentelemetry.io/collector/internal/telemetry v0.124.0/go.mod h1:ZjXjqV0dJ+6D4XGhTOxg/WHjnhdmXsmwmUSgALea66Y= go.opentelemetry.io/collector/otelcol v0.102.1 h1:JdRG3ven+c5k703QpZG5bxJi4JJOnWaNP/EJvN+oYnI= go.opentelemetry.io/collector/otelcol v0.102.1/go.mod h1:kHf9KBXOLZXajR1On8XJbBBGcgh2I2+/mVVroPzOLJU= +go.opentelemetry.io/collector/otelcol v0.124.0 h1:q/+ebTZgEZX+yFbvO7FeqpEtvtRPJ+YzZzHsVzqA71s= +go.opentelemetry.io/collector/otelcol v0.124.0/go.mod h1:mFGJZn5YuffdMVO/lPBavbW+R64Dgd3jOMgw2WAmJEM= +go.opentelemetry.io/collector/pdata v1.27.0/go.mod h1:18e8/xDZsqyj00h/5HM5GLdJgBzzG9Ei8g9SpNoiMtI= +go.opentelemetry.io/collector/pdata/pprofile v0.124.0 h1:ZjL9wKqzP4BHj0/F1jfGxs1Va8B7xmYayipZeNVoWJE= +go.opentelemetry.io/collector/pdata/pprofile v0.124.0/go.mod h1:1EN3Gw5LSI4fSVma/Yfv/6nqeuYgRTm1/kmG5nE5Oyo= +go.opentelemetry.io/collector/pdata/testdata v0.124.0 h1:vY+pWG7CQfzzGSB5+zGYHQOltRQr59Ek9QiPe+rI+NY= +go.opentelemetry.io/collector/pdata/testdata v0.124.0/go.mod h1:lNH48lGhGv4CYk27fJecpsR1zYHmZjKgNrAprwjym0o= +go.opentelemetry.io/collector/pipeline v0.121.0/go.mod h1:TO02zju/K6E+oFIOdi372Wk0MXd+Szy72zcTsFQwXl4= +go.opentelemetry.io/collector/pipeline v0.124.0 h1:hKvhDyH2GPnNO8LGL34ugf36sY7EOXPjBvlrvBhsOdw= +go.opentelemetry.io/collector/pipeline v0.124.0/go.mod h1:TO02zju/K6E+oFIOdi372Wk0MXd+Szy72zcTsFQwXl4= +go.opentelemetry.io/collector/pipeline/xpipeline v0.124.0 h1:ADHUrozlIgSDjXMsAC5t8l4p9TVo+QH33XArFfcL9ns= +go.opentelemetry.io/collector/pipeline/xpipeline v0.124.0/go.mod h1:ep7XJFdCEq04/5yUyiWWzgKvBYMwRJR5XNWmGpIGbVQ= go.opentelemetry.io/collector/processor v0.102.1 h1:79NWs7kTgmgxOIQacuZyDf+mYWuoJZS07SHwZT7sZ4Y= go.opentelemetry.io/collector/processor v0.102.1/go.mod h1:sNM41tEHgv3YA/Dz9/6F8oCeObrqnKCGOMs7wS6Ldus= +go.opentelemetry.io/collector/processor v0.121.0/go.mod h1:BoFEMvPn5/p53eWz+R9cibIxCXzaRZ/RtcBPtvqXNaQ= +go.opentelemetry.io/collector/processor v1.30.0 h1:dxmu+sO6MzQydyrf2CON5Hm1KU7yV4ofH1stmreUtPk= +go.opentelemetry.io/collector/processor v1.30.0/go.mod h1:DjXAgelT8rfIWCTJP5kiPpxPqz4JLE1mJwsE2kJMTk8= +go.opentelemetry.io/collector/processor/processorhelper v0.124.0 h1:zIBpPn/88FVusy/WL+k0jKNVEX+cRnnPhKNc+B9TRds= +go.opentelemetry.io/collector/processor/processorhelper v0.124.0/go.mod h1:NNy1C10OSGSV9nUl+YXYBETYxNacGPYM1PHFb+j0Su4= +go.opentelemetry.io/collector/processor/processortest v0.124.0 h1:qcyo0dSWmgpNFxjObsKk3Rd/wWV8CkMevd+jApkTQWE= +go.opentelemetry.io/collector/processor/processortest v0.124.0/go.mod h1:1YDTxd4c/uVU3Ui1+AzvYW94mo5DbhNmB1xSof6zvD0= +go.opentelemetry.io/collector/processor/xprocessor v0.124.0 h1:KAe8gIje8TcB8varZ4PDy0HV5xX5rNdaQ7q46BE915w= +go.opentelemetry.io/collector/processor/xprocessor v0.124.0/go.mod h1:ItJBBlR6/141vg1v4iRrcsBrGjPCgmXAztxS2x2YkdI= go.opentelemetry.io/collector/receiver v0.102.1 h1:353t4U3o0RdU007JcQ4sRRzl72GHCJZwXDr8cCOcEbI= go.opentelemetry.io/collector/receiver v0.102.1/go.mod h1:pYjMzUkvUlxJ8xt+VbI1to8HMtVlv8AW/K/2GQQOTB0= +go.opentelemetry.io/collector/receiver v1.30.0 h1:XbgU4yT3Ld+hL9+jHcD/Kctcr3gXjpiFxKO+50pSayg= +go.opentelemetry.io/collector/receiver v1.30.0/go.mod h1:U3cApz9PHiRMgN0WkZaz4o8mvj1+cVQYsyj2Nl1v3FQ= go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.1 h1:65/8lkVmOu6gwBw99W+QUQBeDC2qVTwlaiqy7/SpauY= go.opentelemetry.io/collector/receiver/otlpreceiver v0.102.1/go.mod h1:0hmxfFSSqKJjRGvgYjp/XvptbAgLhLguwNgJqMp7zd0= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.124.0 h1:DwvPyh6X0ytmD0IIjOq62ui3Bg5FwkaX6DzseGg62sY= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.124.0/go.mod h1:QG2c9RW/Ys1L30cGH24RBJk72H27UdB50YmpY2rclNs= +go.opentelemetry.io/collector/receiver/receiverhelper v0.124.0 h1:lOCWpiZUzeXV0zDN4jzwqgD6gFdhsY9Mp1om5XzrWKk= +go.opentelemetry.io/collector/receiver/receiverhelper v0.124.0/go.mod h1:JYgWF/EhiDrhq4C3//GTsppsWjWBNwnYPcbKiJX80qU= +go.opentelemetry.io/collector/receiver/receivertest v0.124.0 h1:mx0290aXAo+wfjm4NgbKUodjT5SbS306zmk+AeqeVxE= +go.opentelemetry.io/collector/receiver/receivertest v0.124.0/go.mod h1:3RpopRmIzx5T4zTStHJC0HHfd8YFWm8e9bia1HiuDtY= +go.opentelemetry.io/collector/receiver/xreceiver v0.124.0 h1:YigTUKk8p/aIfqaT0ST7teT9KbLThWD5n2km83byftw= +go.opentelemetry.io/collector/receiver/xreceiver v0.124.0/go.mod h1:NkTpmpAEDT17Dko4gpHUnRztrSkdSd6B0+Y4gfuCWIA= go.opentelemetry.io/collector/semconv v0.116.0 h1:63xCZomsKJAWmKGWD3lnORiE3WKW6AO4LjnzcHzGx3Y= go.opentelemetry.io/collector/semconv v0.116.0/go.mod h1:N6XE8Q0JKgBN2fAhkUQtqK9LT7rEGR6+Wu/Rtbal1iI= +go.opentelemetry.io/collector/semconv v0.121.0/go.mod h1:te6VQ4zZJO5Lp8dM2XIhDxDiL45mwX0YAQQWRQ0Qr9U= +go.opentelemetry.io/collector/semconv v0.124.0 h1:YTdo3UFwNyDQCh9DiSm2rbzAgBuwn/9dNZ0rv454goA= +go.opentelemetry.io/collector/semconv v0.124.0/go.mod h1:te6VQ4zZJO5Lp8dM2XIhDxDiL45mwX0YAQQWRQ0Qr9U= go.opentelemetry.io/collector/service v0.102.1 h1:Lg7qrC4Zctd/OAlkpdsaZaUY+jLEGLLnOigfBLP2GW8= go.opentelemetry.io/collector/service v0.102.1/go.mod h1:L5Sh3461B1Zij7vpMMbi6M/SZicgrLB3UgbG0oUK0pA= +go.opentelemetry.io/collector/service v0.124.0 h1:lUpizko/Y2P+XXbZ9wiKM8acLSt6ZIvC3/6/j6rcq4w= +go.opentelemetry.io/collector/service v0.124.0/go.mod h1:w2eL3KKOMW4CvqCWyZ3P/Qh1ZBEPGG/uRz/0LpHbpv0= +go.opentelemetry.io/collector/service/hostcapabilities v0.124.0 h1:ArxbARF7+bnzK8xLnN2G41KInbcN1aGhSBR76VeUQi8= +go.opentelemetry.io/collector/service/hostcapabilities v0.124.0/go.mod h1:vifQsB+lkeCsjBCRPVHca9lJ3pLpLPZKCGrG77nkxFQ= +go.opentelemetry.io/contrib/bridges/otelzap v0.10.0 h1:ojdSRDvjrnm30beHOmwsSvLpoRF40MlwNCA+Oo93kXU= +go.opentelemetry.io/contrib/bridges/otelzap v0.10.0/go.mod h1:oTTm4g7NEtHSV2i/0FeVdPaPgUIZPfQkFbq0vbzqnv0= go.opentelemetry.io/contrib/bridges/prometheus v0.53.0 h1:BdkKDtcrHThgjcEia1737OUuFdP6xzBKAMx2sNZCkvE= go.opentelemetry.io/contrib/bridges/prometheus v0.53.0/go.mod h1:ZkhVxcJgeXlL/lVyT/vxNHVFiSG5qOaDwYaSgD8IfZo= +go.opentelemetry.io/contrib/bridges/prometheus v0.60.0 h1:x7sPooQCwSg27SjtQee8GyIIRTQcF4s7eSkac6F2+VA= +go.opentelemetry.io/contrib/bridges/prometheus v0.60.0/go.mod h1:4K5UXgiHxV484efGs42ejD7E2J/sIlepYgdGoPXe7hE= go.opentelemetry.io/contrib/config v0.7.0 h1:b1rK5tGTuhhPirJiMxOcyQfZs76j2VapY6ODn3b2Dbs= go.opentelemetry.io/contrib/config v0.7.0/go.mod h1:8tdiFd8N5etOi3XzBmAoMxplEzI3TcL8dU5rM5/xcOQ= go.opentelemetry.io/contrib/detectors/gcp v1.29.0/go.mod h1:GW2aWZNwR2ZxDLdv8OyC2G8zkRoQBuURgV7RPQgcPoU= go.opentelemetry.io/contrib/detectors/gcp v1.32.0/go.mod h1:TVqo0Sda4Cv8gCIixd7LuLwW4EylumVWfhjZJjDD4DU= go.opentelemetry.io/contrib/detectors/gcp v1.33.0/go.mod h1:ZHrLmr4ikK2AwRj9QL+c9s2SOlgoSRyMpNVzUj2fZqI= +go.opentelemetry.io/contrib/detectors/gcp v1.34.0/go.mod h1:cV4BMFcscUR/ckqLkbfQmF0PRsq8w/lMGzdbCSveBHo= go.opentelemetry.io/contrib/exporters/autoexport v0.53.0 h1:13K+tY7E8GJInkrvRiPAhC0gi/7vKjzDNhtmCf+QXG8= go.opentelemetry.io/contrib/exporters/autoexport v0.53.0/go.mod h1:lyQF6xQ4iDnMg4sccNdFs1zf62xd79YI8vZqKjOTwMs= +go.opentelemetry.io/contrib/exporters/autoexport v0.60.0 h1:GuQXpvSXNjpswpweIem84U9BNauqHHi2w1GtNAalvpM= +go.opentelemetry.io/contrib/exporters/autoexport v0.60.0/go.mod h1:CkmxekdHco4d7thFJNPQ7Mby4jMBgZUclnrxT4e+ryk= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.53.0/go.mod h1:azvtTADFQJA8mX80jIH/akaE7h+dbm/sVuaHqN13w74= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI= @@ -1859,8 +2233,12 @@ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0/go.mod h1: go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.58.0/go.mod h1:umTcuxiv1n/s/S6/c2AT/g2CQ7u5C59sHDNmfSwgz7Q= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.59.0/go.mod h1:FRmFuRJfag1IZ2dPkHnEoSFVgTVPUd2qf5Vi69hLb8I= +go.opentelemetry.io/contrib/otelconf v0.15.0 h1:BLNiIUsrNcqhSKpsa6CnhE6LdrpY1A8X0szMVsu99eo= +go.opentelemetry.io/contrib/otelconf v0.15.0/go.mod h1:OPH1seO5z9dp1P26gnLtoM9ht7JDvh3Ws6XRHuXqImY= go.opentelemetry.io/contrib/propagators/b3 v1.27.0 h1:IjgxbomVrV9za6bRi8fWCNXENs0co37SZedQilP2hm0= go.opentelemetry.io/contrib/propagators/b3 v1.27.0/go.mod h1:Dv9obQz25lCisDvvs4dy28UPh974CxkahRDUPsY7y9E= +go.opentelemetry.io/contrib/propagators/b3 v1.35.0 h1:DpwKW04LkdFRFCIgM3sqwTJA/QREHMeMHYPWP1WeaPQ= +go.opentelemetry.io/contrib/propagators/b3 v1.35.0/go.mod h1:9+SNxwqvCWo1qQwUpACBY5YKNVxFJn5mlbXg/4+uKBg= go.opentelemetry.io/contrib/samplers/jaegerremote v0.28.0/go.mod h1:iWS+NvC948FyfnJbVfPN9h/8+vr8CR2FPn6XsLRkvH8= go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= go.opentelemetry.io/otel v1.26.0/go.mod h1:UmLkJHUAidDval2EICqBMbnAd0/m2vmpf/dAM+fvFs4= @@ -1870,8 +2248,12 @@ go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6c go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= go.opentelemetry.io/otel/bridge/opencensus v1.27.0 h1:ao9aGGHd+G4YfjBpGs6vbkvt5hoC67STlJA9fCnOAcs= go.opentelemetry.io/otel/bridge/opencensus v1.27.0/go.mod h1:uRvWtAAXzyVOST0WMPX5JHGBaAvBws+2F8PcC5gMnTk= +go.opentelemetry.io/otel/bridge/opencensus v1.35.0 h1:4nJfffRbozhqnuukfRkiahA94mnpryCLJLiduMIDJKI= +go.opentelemetry.io/otel/bridge/opencensus v1.35.0/go.mod h1:359S30saRYNsB4A46EDx91SpXsQFNgkma7ftg2/L5/M= go.opentelemetry.io/otel/bridge/opentracing v1.26.0 h1:Q/dHj0DOhfLMAs5u5ucAbC7gy66x9xxsZRLpHCJ4XhI= go.opentelemetry.io/otel/bridge/opentracing v1.26.0/go.mod h1:HfypvOw/8rqu4lXDhwaxVK1ibBAi1lTMXBHV9rywOCw= +go.opentelemetry.io/otel/bridge/opentracing v1.35.0 h1:qT4jl1fYl0hHuRopNcwS94QosLFhGYcS0HacPUeXmT4= +go.opentelemetry.io/otel/bridge/opentracing v1.35.0/go.mod h1:p5CbIL4v7uQz7mnQD6T/AZc1pPUzwz+2wZ1zrGY9Kgs= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0 h1:R/OBkMoGgfy2fLhs2QhkCI1w4HLEQX92GCcJB6SSdNk= go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.28.0 h1:U2guen0GhqH8o/G2un8f/aG/y++OuW6MyCo6hT9prXk= @@ -1883,12 +2265,18 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.27.0/go.mod h go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.22.0/go.mod h1:hYwym2nDEeZfG/motx0p7L7J1N1vyzIThemQsb4g2qY= go.opentelemetry.io/otel/exporters/prometheus v0.50.0 h1:2Ewsda6hejmbhGFyUvWZjUThC98Cf8Zy6g0zkIimOng= go.opentelemetry.io/otel/exporters/prometheus v0.50.0/go.mod h1:pMm5PkUo5YwbLiuEf7t2xg4wbP0/eSJrMxIMxKosynY= +go.opentelemetry.io/otel/exporters/prometheus v0.57.0 h1:AHh/lAP1BHrY5gBwk8ncc25FXWm/gmmY3BX258z5nuk= +go.opentelemetry.io/otel/exporters/prometheus v0.57.0/go.mod h1:QpFWz1QxqevfjwzYdbMb4Y1NnlJvqSGwyuU0B4iuc9c= go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0 h1:0MH3f8lZrflbUWXVxyBg/zviDFdGE062uKh5+fu8Vv0= go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.4.0/go.mod h1:Vh68vYiHY5mPdekTr0ox0sALsqjoVy0w3Os278yX5SQ= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.11.0 h1:k6KdfZk72tVW/QVZf60xlDziDvYAePj5QHwoQvrB2m8= +go.opentelemetry.io/otel/exporters/stdout/stdoutlog v0.11.0/go.mod h1:5Y3ZJLqzi/x/kYtrSrPSx7TFI/SGsL7q2kME027tH6I= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0 h1:BJee2iLkfRfl9lc7aFmBwkWxY/RI1RDdXepSF6y8TPE= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.28.0/go.mod h1:DIzlHs3DRscCIBU3Y9YSzPfScwnYnzfnCd4g8zA7bZc= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0 h1:EVSnY9JbEEW92bEkIYOVMw4q1WJxIAGoFTrtYOzWuRQ= go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.28.0/go.mod h1:Ea1N1QQryNXpCD0I1fdLibBAIpQuBkznMmkdKrapk1Y= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.35.0 h1:T0Ec2E+3YZf5bgTNQVet8iTDW7oIk03tXHq+wkwIDnE= +go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.35.0/go.mod h1:30v2gqH+vYGJsesLWFov8u47EpYTcIQcBjKpI6pJThg= go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= go.opentelemetry.io/otel/metric v1.28.0/go.mod h1:Fb1eVBFZmLVTMb6PPohq3TO9IIhUisDsbJoL/+uQW4s= go.opentelemetry.io/otel/metric v1.29.0/go.mod h1:auu/QWieFVWx+DmQOUMgj0F8LHWdgalxXqvp7BII/W8= @@ -1898,6 +2286,7 @@ go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35 go.opentelemetry.io/otel/sdk v1.28.0/go.mod h1:oYj7ClPUA7Iw3m+r7GeEjz0qckQRJK2B8zjcZEfu7Pg= go.opentelemetry.io/otel/sdk v1.29.0/go.mod h1:pM8Dx5WKnvxLCb+8lG1PRNIDxu9g9b9g59Qr7hfAAok= go.opentelemetry.io/otel/sdk v1.30.0/go.mod h1:p14X4Ok8S+sygzblytT1nqG98QG2KYKv++HE0LY/mhg= +go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0= go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= go.opentelemetry.io/otel/sdk/metric v1.29.0/go.mod h1:6zZLdCl2fkauYoZIOn/soQIDSWFmNSRcICarHfuhNJQ= go.opentelemetry.io/otel/sdk/metric v1.30.0/go.mod h1:waS6P3YqFNzeP01kuo/MBBYqaoBJl7efRQHOaydhy1Y= @@ -1911,14 +2300,17 @@ go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06F go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= go.opentelemetry.io/proto/otlp v1.3.1/go.mod h1:0X1WI4de4ZsLrrJNLAQbFeLCm3T7yBkR0XqQ7niQU+8= +go.opentelemetry.io/proto/otlp v1.4.0/go.mod h1:PPBWZIP98o2ElSqI35IHfu7hIhSwvc5N38Jw8pXuGFY= go.starlark.net v0.0.0-20221020143700-22309ac47eac/go.mod h1:kIVgS18CjmEC3PqMd5kaJSGEifyV/CeB9x506ZJ1Vbk= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= +go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs= go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= @@ -1941,12 +2333,15 @@ golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= +golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg= golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= golang.org/x/crypto v0.33.0/go.mod h1:bVdXmD7IV/4GdElGPozy6U7lWdRXA4qyRVGJV57uQ5M= golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ= golang.org/x/crypto v0.36.0/go.mod h1:Y4J0ReaxCR1IMaabaSMugxJES1EpwhBHhv2bDHklZvc= +golang.org/x/crypto v0.37.0/go.mod h1:vg+k43peMZ0pUMhYmVAWysMK35e6ioLh3wB8ZCAfbVc= golang.org/x/exp v0.0.0-20230315142452-642cacee5cc0/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/exp v0.0.0-20230515195305-f3d0a9c9a5cc/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= golang.org/x/exp v0.0.0-20230817173708-d852ddb80c63/go.mod h1:0v4NqG35kSWCMzLaMeX+IQrlSnVE/bqGSyC2cz/9Le8= @@ -1955,13 +2350,17 @@ golang.org/x/exp v0.0.0-20240325151524-a685a6edb6d8/go.mod h1:CQ1k9gNrJ50XIzaKCR golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc= golang.org/x/exp v0.0.0-20240719175910-8a7402abbf56/go.mod h1:M4RDyNAINzryxdtnbRXRL/OHtkFuWGRjvuhBJpk2IlY= golang.org/x/exp v0.0.0-20240904232852-e7e105dedf7e/go.mod h1:akd2r19cwCdwSwWeIdzYQGa/EZZyqcOdwWiwj5L5eKQ= +golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8/go.mod h1:tujkw807nyEEAamNbDrEGzRav+ilXA7PCRAd6xsmwiU= golang.org/x/exp/typeparams v0.0.0-20220218215828-6cf2b201936e h1:qyrTQ++p1afMkO4DPEeLGq/3oTsdlvdH4vqZUBWzUKM= golang.org/x/exp/typeparams v0.0.0-20220218215828-6cf2b201936e/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/image v0.14.0 h1:tNgSxAFe3jC4uYqvZdTr84SZoM1KfwdC9SKIFrLjFn4= golang.org/x/image v0.14.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE= +golang.org/x/image v0.25.0 h1:Y6uW6rH1y5y/LK1J8BPWZtr6yZ7hrsy6hFrXjgsc2fQ= +golang.org/x/image v0.25.0/go.mod h1:tCAmOEGthTtkalusGp1g3xa2gke8J6c2N565dTyl9Rs= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= golang.org/x/mod v0.6.0-dev.0.20220818022119-ed83ed61efb9/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= @@ -1978,6 +2377,7 @@ golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qx golang.org/x/net v0.0.0-20210726213435-c6fcb2dbf985/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.16.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= @@ -1988,6 +2388,7 @@ golang.org/x/net v0.27.0/go.mod h1:dDi0PyhWNoiUOrAS8uXv/vnScO4wnHQO4mj9fn/RytE= golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/net v0.31.0/go.mod h1:P4fl1q7dY2hnZFxEk4pPSkDHF+QqjitcnDjUQyMM+pM= golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs= golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/net v0.35.0/go.mod h1:EglIi67kWsHKlRzzVMUD93VMSWGFOMSZgxFjparz1Qk= @@ -2001,10 +2402,13 @@ golang.org/x/oauth2 v0.22.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbht golang.org/x/oauth2 v0.23.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= golang.org/x/oauth2 v0.26.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.28.0/go.mod h1:onh5ek6nERTohokkhCD/y2cV4Do3fxFHFuAejCkRWT8= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.9.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.12.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/sys v0.0.0-20190130150945-aca44879d564/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2015,6 +2419,7 @@ golang.org/x/sys v0.0.0-20211013075003-97ac67df715c/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220823224334-20c2bfdbfe24/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= @@ -2025,6 +2430,7 @@ golang.org/x/sys v0.23.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.27.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.31.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= @@ -2035,11 +2441,13 @@ golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuX golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= golang.org/x/term v0.25.0/go.mod h1:RPyXicDX+6vLxogjjRxjgD2TKtmAO6NZBsBRfrOLu7M= golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= +golang.org/x/term v0.30.0/go.mod h1:NYYFdzHoI5wRh/h5tDMdMqCqPJZEuNqVR5xJLd/n67g= golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/text v0.20.0/go.mod h1:D4IsuqiFMhST5bX19pQ9ikHC2GsaKyk/oF+pn3ducp4= golang.org/x/text v0.23.0/go.mod h1:/BLNzu4aZCJ1+kcD0DNRotWKage4q2rGVAg4o22unh4= golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20211116232009-f0f3c7e86c11/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -2047,11 +2455,13 @@ golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/time v0.7.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/time v0.10.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/tools v0.0.0-20190624222133-a101b041ded4/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.6-0.20210726203631-07bc1bf47fb2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.9.3/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/tools v0.11.0/go.mod h1:anzJrxPjNtfgiYQYirP2CPGzGLxrH2u2QBhn6Bf3qY8= golang.org/x/tools v0.16.1/go.mod h1:kYVVN6I1mBNoB1OX+noeBjbRk4IUEPa7JJ+TJMEooJ0= @@ -2069,6 +2479,8 @@ golang.org/x/xerrors v0.0.0-20240716161551-93cc26a95ae9/go.mod h1:NDW/Ps6MPRej6f gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0 h1:OE9mWmgKkjJyEmDAAtGMPjXu+YNeGvK9VTSHY6+Qihc= gonum.org/v1/plot v0.14.0 h1:+LBDVFYwFe4LHhdP8coW6296MBEY4nQ+Y4vuUpJopcE= gonum.org/v1/plot v0.14.0/go.mod h1:MLdR9424SJed+5VqC6MsouEpig9pZX2VZ57H9ko2bXU= +gonum.org/v1/plot v0.15.2 h1:Tlfh/jBk2tqjLZ4/P8ZIwGrLEWQSPDLRm/SNWKNXiGI= +gonum.org/v1/plot v0.15.2/go.mod h1:DX+x+DWso3LTha+AdkJEv5Txvi+Tql3KAGkehP0/Ubg= google.golang.org/api v0.152.0/go.mod h1:3qNJX5eOmhiWYc67jRA/3GsDw97UFb5ivv7Y2PrriAY= google.golang.org/api v0.171.0/go.mod h1:Hnq5AHm4OTMt2BUVjael2CWZFD6vksJdWCWiUAmjC9o= google.golang.org/api v0.177.0/go.mod h1:srbhue4MLjkjbkux5p3dw/ocYOSZTaIEvf7bCOnFQDw= @@ -2076,8 +2488,11 @@ google.golang.org/api v0.203.0/go.mod h1:BuOVyCSYEPwJb3npWvDnNmFI92f3GeRnHNkETne google.golang.org/api v0.211.0/go.mod h1:XOloB4MXFH4UTlQSGuNUxw0UT74qdENK8d6JNsXKLi0= google.golang.org/api v0.214.0/go.mod h1:bYPpLG8AyeMWwDU6NXoB00xC0DFkikVvd5MfwoxjLqE= google.golang.org/api v0.215.0/go.mod h1:fta3CVtuJYOEdugLNWm6WodzOS8KdFckABwN4I40hzY= +google.golang.org/api v0.216.0/go.mod h1:K9wzQMvWi47Z9IU7OgdOofvZuw75Ge3PPITImZR/UyI= google.golang.org/api v0.217.0/go.mod h1:qMc2E8cBAbQlRypBTBWHklNJlaZZJBwDv81B1Iu8oSI= google.golang.org/api v0.218.0/go.mod h1:5VGHBAkxrA/8EFjLVEYmMUJ8/8+gWWQ3s4cFH0FxG2M= +google.golang.org/api v0.224.0/go.mod h1:3V39my2xAGkodXy0vEqcEtkqgw2GtrFL5WuBZlCTCOQ= +google.golang.org/api v0.227.0/go.mod h1:EIpaG6MbTgQarWF5xJvX0eOJPK9n/5D4Bynb9j2HXvQ= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= @@ -2092,6 +2507,7 @@ google.golang.org/genproto v0.0.0-20240123012728-ef4313101c80/go.mod h1:cc8bqMqt google.golang.org/genproto v0.0.0-20240213162025-012b6fc9bca9/go.mod h1:mqHbVIp48Muh7Ywss/AD6I5kNVKZMmAa/QEW58Gxp2s= google.golang.org/genproto v0.0.0-20241015192408-796eee8c2d53/go.mod h1:fheguH3Am2dGp1LfXkrvwqC/KlFq8F0nLq3LryOMrrE= google.golang.org/genproto v0.0.0-20241118233622-e639e219e697/go.mod h1:JJrvXBWRZaFMxBufik1a4RpFw4HhgVtBBWQeQgUj2cc= +google.golang.org/genproto v0.0.0-20250106144421-5f5ef82da422/go.mod h1:1NPAxoesyw/SgLPqaUp9u1f9PWCLAk/jVmhx7gJZStg= google.golang.org/genproto/googleapis/api v0.0.0-20230726155614-23370e0ffb3e/go.mod h1:rsr7RhLuwsDKL7RmgDDCUc6yaGr1iqceVb5Wv6f6YvQ= google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= @@ -2111,13 +2527,18 @@ google.golang.org/genproto/googleapis/api v0.0.0-20241219192143-6b3ec007d9bb/go. google.golang.org/genproto/googleapis/api v0.0.0-20250106144421-5f5ef82da422/go.mod h1:b6h1vNKhxaSoEI+5jc3PJUCustfli/mRab7295pY7rw= google.golang.org/genproto/googleapis/api v0.0.0-20250124145028-65684f501c47/go.mod h1:AfA77qWLcidQWywD0YgqfpJzf50w2VjzBml3TybHeJU= google.golang.org/genproto/googleapis/api v0.0.0-20250204164813-702378808489/go.mod h1:iYONQfRdizDB8JJBybql13nArx91jcUk7zCXEsOofM4= +google.golang.org/genproto/googleapis/api v0.0.0-20250227231956-55c901821b1e/go.mod h1:Xsh8gBVxGCcbV8ZeTB9wI5XPyZ5RvC6V3CTeeplHbiA= google.golang.org/genproto/googleapis/api v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:jbe3Bkdp+Dh2IrslsFCklNhweNTBgSYanP1UXhJDhKg= +google.golang.org/genproto/googleapis/api v0.0.0-20250313205543-e70fdf4c4cb4/go.mod h1:c8q6Z6OCqnfVIqUFJkCzKcrj8eCvUrz+K4KRzSTuANg= +google.golang.org/genproto/googleapis/api v0.0.0-20250414145226-207652e42e2e/go.mod h1:085qFyf2+XaZlRdCgKNCIZ3afY2p4HHZdoIRpId8F4A= google.golang.org/genproto/googleapis/bytestream v0.0.0-20250102185135-69823020774d h1:NZBSeFsuFS5YrgHMW/8xfTbzNXMshQPNgq2Yb7xipEs= google.golang.org/genproto/googleapis/bytestream v0.0.0-20250102185135-69823020774d/go.mod h1:s4mHJ3FfG8P6A3O+gZ8TVqB3ufjOl9UG3ANCMMwCHmo= google.golang.org/genproto/googleapis/bytestream v0.0.0-20250127172529-29210b9bc287 h1:c/HGC2hBfwgjeBtQMLjfmuS2KG28ngtUpn5XiX8o3rY= google.golang.org/genproto/googleapis/bytestream v0.0.0-20250127172529-29210b9bc287/go.mod h1:7VGktjvijnuhf2AobFqsoaBGnG8rImcxqoL+QPBPRq4= google.golang.org/genproto/googleapis/bytestream v0.0.0-20250219182151-9fdb1cabc7b2 h1:UZtupsOaDeUm4KiG4HQTSyENUuCayW8K5d5cs7zK79c= google.golang.org/genproto/googleapis/bytestream v0.0.0-20250219182151-9fdb1cabc7b2/go.mod h1:35wIojE/F1ptq1nfNDNjtowabHoMSA2qQs7+smpCO5s= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20250414145226-207652e42e2e h1:OK8bKvRgTGs7U871RdjtCiRcQJLice8/rZkeoaZgnlc= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20250414145226-207652e42e2e/go.mod h1:h6yxum/C2qRb4txaZRLDHK8RyS0H/o2oEDeKY4onY/Y= google.golang.org/genproto/googleapis/rpc v0.0.0-20230711160842-782d3b101e98/go.mod h1:TUfxEVdsvPg18p6AslUXFoLdpED4oBnGwyqk3dV1XzM= google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/genproto/googleapis/rpc v0.0.0-20231120223509-83a465c0220f/go.mod h1:L9KNLi232K1/xB6f7AlSX692koaRnKaWSR0stBki0Yc= @@ -2126,6 +2547,7 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go. google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= google.golang.org/genproto/googleapis/rpc v0.0.0-20240701130421-f6361c86f094/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= google.golang.org/genproto/googleapis/rpc v0.0.0-20240826202546-f6391c0de4c7/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= @@ -2142,13 +2564,16 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20250127172529-29210b9bc287/go. google.golang.org/genproto/googleapis/rpc v0.0.0-20250204164813-702378808489/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk= google.golang.org/genproto/googleapis/rpc v0.0.0-20250212204824-5a70512c5d8b/go.mod h1:8BS3B93F/U1juMFq9+EDk+qOT5CO1R9IzXxG3PTqiRk= google.golang.org/genproto/googleapis/rpc v0.0.0-20250219182151-9fdb1cabc7b2/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250227231956-55c901821b1e/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= google.golang.org/genproto/googleapis/rpc v0.0.0-20250303144028-a0af3efb3deb/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= google.golang.org/genproto/googleapis/rpc v0.0.0-20250313205543-e70fdf4c4cb4/go.mod h1:LuRYeWDFV6WOn90g357N17oMCaxpgCnbi/44qJvDn2I= +google.golang.org/genproto/googleapis/rpc v0.0.0-20250414145226-207652e42e2e/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/genproto/googleapis/rpc v0.0.0-20250425173222-7b384671a197/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/genproto/googleapis/rpc v0.0.0-20250512202823-5a2f75b736a9/go.mod h1:qQ0YXyHHx3XkvlzUtpXDkS29lDSafHMZBAZDc03LQ3A= google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= +google.golang.org/grpc v1.56.3/go.mod h1:I9bI3vqKfayGqPUAwGdOSu7kt6oIJLixfffKrpXqQ9s= google.golang.org/grpc v1.58.3/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/grpc v1.62.1/go.mod h1:IWTG0VlJLCh1SkC58F7np9ka9mx/WNkjl4PGJaiq+QE= @@ -2158,6 +2583,7 @@ google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjr google.golang.org/grpc v1.66.0/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= google.golang.org/grpc v1.67.3/go.mod h1:YGaHCc6Oap+FzBJTZLBzkGSYt/cvGPFTPxkn7QfSU8s= +google.golang.org/grpc v1.68.1/go.mod h1:+q1XYFJjShcqn0QZHvCyeR4CXPA+llXIeUIfIe00waw= google.golang.org/grpc v1.69.2/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= @@ -2169,6 +2595,7 @@ google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWn google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= google.golang.org/protobuf v1.36.0/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/protobuf v1.36.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/airbrake/gobrake.v2 v2.0.9 h1:7z2uVWwn7oVeeugY1DtlPAy5H+KYgB1KeKTnqjNatLo= gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= @@ -2179,13 +2606,21 @@ gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2 h1:OAj3g0cR6Dx/R07QgQe8wkA9RNjB2u4i700xBkIT4e0= +gopkg.in/go-jose/go-jose.v2 v2.6.3 h1:nt80fvSDlhKWQgSWyHyy5CfmlQr+asih51R8PTWNKKs= +gopkg.in/go-jose/go-jose.v2 v2.6.3/go.mod h1:zzZDPkNNw/c9IE7Z9jr11mBZQhKQTMzoEEIoEdZlFBI= +gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22 h1:VpOs+IwYnYBaFnrNAeB8UUWtL3vEUnzSCL1nVjPhqrw= +gopkg.in/mgo.v2 v2.0.0-20190816093944-a6b53ec6cb22/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= gopkg.in/resty.v1 v1.12.0 h1:CuXP0Pjfw9rOuY6EP+UvtNvt5DSqHpIxILZKT/quCZI= gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI= gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg= gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= gopkg.in/telebot.v3 v3.2.1 h1:3I4LohaAyJBiivGmkfB+CiVu7QFOWkuZ4+KHgO/G3rs= +gopkg.in/vmihailenco/msgpack.v2 v2.9.2 h1:gjPqo9orRVlSAH/065qw3MsFCDpH7fa1KpiizXyllY4= +gopkg.in/vmihailenco/msgpack.v2 v2.9.2/go.mod h1:/3Dn1Npt9+MYyLpYYXjInO/5jvMLamn+AEGwNEOatn8= gopkg.in/yaml.v1 v1.0.0-20140924161607-9f9df34309c0/go.mod h1:WDnlLJ4WF5VGsH/HVa3CI79GS0ol3YnhVnKP89i0kNg= +gotest.tools/v3 v3.0.2/go.mod h1:3SzNCllyD9/Y+b5r9JIKQ474KzkZyqLqEfYqMsX94Bk= +gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= gotest.tools/v3 v3.5.0/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= honnef.co/go/tools v0.3.2 h1:ytYb4rOqyp1TSa2EPvNVwtPQJctSELKaMyLfqNP4+34= honnef.co/go/tools v0.3.2/go.mod h1:jzwdWgg7Jdq75wlfblQxO4neNaFFSvgc1tD5Wv8U0Yw= @@ -2194,11 +2629,20 @@ howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM= howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= howett.net/plist v1.0.1 h1:37GdZ8tP09Q35o9ych3ehygcsL+HqKSwzctveSlarvM= howett.net/plist v1.0.1/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= +k8s.io/api v0.32.2/go.mod h1:hKlhk4x1sJyYnHENsrdCWw31FEmCijNGPJO5WzHiJ6Y= +k8s.io/apimachinery v0.32.2/go.mod h1:GpHVgxoKlTxClKcteaeuF1Ul/lDVb74KpZcxcmLDElE= +k8s.io/apiserver v0.32.3/go.mod h1:q1x9B8E/WzShF49wh3ADOh6muSfpmFL0I2t+TG0Zdgc= +k8s.io/client-go v0.32.2/go.mod h1:fpZ4oJXclZ3r2nDOv+Ux3XcJutfrwjKTCHz2H3sww94= k8s.io/client-go v9.0.0+incompatible h1:2kqW3X2xQ9SbFvWZjGEHBLlWc1LG9JIJNXWkuqwdZ3A= k8s.io/code-generator v0.32.1 h1:4lw1kFNDuFYXquTkB7Sl5EwPMUP2yyW9hh6BnFfRZFY= k8s.io/code-generator v0.32.1/go.mod h1:zaILfm00CVyP/6/pJMJ3zxRepXkxyDfUV5SNG4CjZI4= k8s.io/code-generator v0.32.3 h1:31p2TVzC9+hVdSkAFruAk3JY+iSfzrJ83Qij1yZutyw= k8s.io/code-generator v0.32.3/go.mod h1:+mbiYID5NLsBuqxjQTygKM/DAdKpAjvBzrJd64NU1G8= +k8s.io/code-generator v0.33.0 h1:B212FVl6EFqNmlgdOZYWNi77yBv+ed3QgQsMR8YQCw4= +k8s.io/code-generator v0.33.0/go.mod h1:KnJRokGxjvbBQkSJkbVuBbu6z4B0rC7ynkpY5Aw6m9o= +k8s.io/code-generator v0.33.1 h1:ZLzIRdMsh3Myfnx9BaooX6iQry29UJjVfVG+BuS+UMw= +k8s.io/code-generator v0.33.1/go.mod h1:HUKT7Ubp6bOgIbbaPIs9lpd2Q02uqkMCMx9/GjDrWpY= +k8s.io/component-base v0.32.3/go.mod h1:LWi9cR+yPAv7cu2X9rZanTiFKB2kHA+JjmhkKjCZRpI= k8s.io/cri-api v0.25.0 h1:INwdXsCDSA/0hGNdPxdE2dQD6ft/5K1EaKXZixvSQxg= k8s.io/cri-api v0.25.0/go.mod h1:J1rAyQkSJ2Q6I+aBMOVgg2/cbbebso6FNa0UagiR0kc= k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6 h1:4s3/R4+OYYYUKptXPhZKjQ04WJ6EhQQVFdjOFvCazDk= @@ -2206,8 +2650,11 @@ k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac h1:sAvhNk5RRuc6FNYGqe7Ygz3PSo/2w k8s.io/gengo/v2 v2.0.0-20240826214909-a7b603a56eb7/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU= k8s.io/gengo/v2 v2.0.0-20240911193312-2b36238f13e9 h1:si3PfKm8dDYxgfbeA6orqrtLkvvIeH8UqffFJDl0bz4= k8s.io/gengo/v2 v2.0.0-20240911193312-2b36238f13e9/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU= +k8s.io/gengo/v2 v2.0.0-20250207200755-1244d31929d7 h1:2OX19X59HxDprNCVrWi6jb7LW1PoqTlYqEq5H2oetog= +k8s.io/gengo/v2 v2.0.0-20250207200755-1244d31929d7/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/klog/v2 v2.0.0/go.mod h1:PBfzABfn139FHAV07az/IF9Wp1bkk3vpT2XSJ76fSDE= k8s.io/klog/v2 v2.2.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= k8s.io/klog/v2 v2.80.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= k8s.io/kubernetes v1.13.0 h1:qTfB+u5M92k2fCCCVP2iuhgwwSOv1EkAkvQY1tQODD8= @@ -2243,6 +2690,7 @@ rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE= rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4= rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY= rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4= +sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.31.0/go.mod h1:Ve9uj1L+deCXFrPOk1LpFXqTg7LCFzFso6PA48q/XZw= sigs.k8s.io/controller-runtime v0.20.2 h1:/439OZVxoEc02psi1h4QO3bHzTgu49bb347Xp4gW1pc= sigs.k8s.io/controller-runtime v0.20.2/go.mod h1:xg2XB0K5ShQzAgsoujxuKN4LNXR2LfwwHsPj7Iaw+XY= sigs.k8s.io/controller-runtime v0.20.4 h1:X3c+Odnxz+iPTRobG4tp092+CvBU9UK0t/bRf+n0DGU= diff --git a/hack/go.mod b/hack/go.mod index 3460d1adf91..08fa4910871 100644 --- a/hack/go.mod +++ b/hack/go.mod @@ -2,16 +2,15 @@ module github.com/grafana/grafana/hack go 1.24.3 -require k8s.io/code-generator v0.32.0 +require k8s.io/code-generator v0.33.1 require ( github.com/go-logr/logr v1.4.2 // indirect - github.com/google/go-cmp v0.7.0 // indirect github.com/spf13/pflag v1.0.6 // indirect golang.org/x/mod v0.24.0 // indirect golang.org/x/sync v0.14.0 // indirect golang.org/x/text v0.25.0 // indirect - golang.org/x/tools v0.31.0 // indirect - k8s.io/gengo/v2 v2.0.0-20240911193312-2b36238f13e9 // indirect + golang.org/x/tools v0.33.0 // indirect + k8s.io/gengo/v2 v2.0.0-20250207200755-1244d31929d7 // indirect k8s.io/klog/v2 v2.130.1 // indirect ) diff --git a/hack/go.sum b/hack/go.sum index 9041f4d90b2..94b65885284 100644 --- a/hack/go.sum +++ b/hack/go.sum @@ -10,11 +10,11 @@ golang.org/x/sync v0.14.0 h1:woo0S4Yywslg6hp4eUFjTVOyKt0RookbpAHG4c1HmhQ= golang.org/x/sync v0.14.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= golang.org/x/text v0.25.0 h1:qVyWApTSYLk/drJRO5mDlNYskwQznZmkpV2c8q9zls4= golang.org/x/text v0.25.0/go.mod h1:WEdwpYrmk1qmdHvhkSTNPm3app7v4rsT8F2UD6+VHIA= -golang.org/x/tools v0.31.0 h1:0EedkvKDbh+qistFTd0Bcwe/YLh4vHwWEkiI0toFIBU= -golang.org/x/tools v0.31.0/go.mod h1:naFTU+Cev749tSJRXJlna0T3WxKvb1kWEx15xA4SdmQ= -k8s.io/code-generator v0.32.0 h1:s0lNN8VSWny8LBz5t5iy7MCdgwdOhdg7vAGVxvS+VWU= -k8s.io/code-generator v0.32.0/go.mod h1:b7Q7KMZkvsYFy72A79QYjiv4aTz3GvW0f1T3UfhFq4s= -k8s.io/gengo/v2 v2.0.0-20240911193312-2b36238f13e9 h1:si3PfKm8dDYxgfbeA6orqrtLkvvIeH8UqffFJDl0bz4= -k8s.io/gengo/v2 v2.0.0-20240911193312-2b36238f13e9/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU= +golang.org/x/tools v0.33.0 h1:4qz2S3zmRxbGIhDIAgjxvFutSvH5EfnsYrRBj0UI0bc= +golang.org/x/tools v0.33.0/go.mod h1:CIJMaWEY88juyUfo7UbgPqbC8rU2OqfAV1h2Qp0oMYI= +k8s.io/code-generator v0.33.1 h1:ZLzIRdMsh3Myfnx9BaooX6iQry29UJjVfVG+BuS+UMw= +k8s.io/code-generator v0.33.1/go.mod h1:HUKT7Ubp6bOgIbbaPIs9lpd2Q02uqkMCMx9/GjDrWpY= +k8s.io/gengo/v2 v2.0.0-20250207200755-1244d31929d7 h1:2OX19X59HxDprNCVrWi6jb7LW1PoqTlYqEq5H2oetog= +k8s.io/gengo/v2 v2.0.0-20250207200755-1244d31929d7/go.mod h1:EJykeLsmFC60UQbYJezXkEsG2FLrt0GPNkU5iK5GWxU= k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= diff --git a/hack/update-codegen.sh b/hack/update-codegen.sh index 7a2f629adcf..aec836f5e3e 100755 --- a/hack/update-codegen.sh +++ b/hack/update-codegen.sh @@ -11,7 +11,7 @@ set -o pipefail SCRIPT_ROOT=$(dirname "${BASH_SOURCE[0]}")/.. pushd "${SCRIPT_ROOT}/hack" && GO111MODULE=on go mod tidy && popd -CODEGEN_PKG=${CODEGEN_PKG:-$(cd "${SCRIPT_ROOT}"; ls -d -1 ./vendor/k8s.io/code-generator 2>/dev/null || echo $(go env GOPATH)/pkg/mod/k8s.io/code-generator@v0.32.0)} +CODEGEN_PKG=${CODEGEN_PKG:-$(cd "${SCRIPT_ROOT}"; ls -d -1 ./vendor/k8s.io/code-generator 2>/dev/null || echo $(go env GOPATH)/pkg/mod/k8s.io/code-generator@v0.33.1)} OUTDIR="${HOME}/go/src" OPENAPI_VIOLATION_EXCEPTIONS_FILENAME="zz_generated.openapi_violation_exceptions.list" diff --git a/jest.config.js b/jest.config.js index 982b0cdf714..34c7247ca10 100644 --- a/jest.config.js +++ b/jest.config.js @@ -21,6 +21,7 @@ const esModules = [ 'lodash-es', 'vscode-languageserver-types', '@bsull/augurs', + 'react-data-grid', ].join('|'); module.exports = { @@ -35,7 +36,7 @@ module.exports = { moduleDirectories: ['public', 'node_modules'], roots: ['/public/app', '/public/test', '/packages', '/scripts/tests'], testRegex: '(\\.|/)(test)\\.(jsx?|tsx?)$', - moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json'], + moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'cjs'], setupFiles: ['jest-canvas-mock', './public/test/jest-setup.ts'], testTimeout: 30000, resolver: `/public/test/jest-resolver.js`, diff --git a/lefthook.rc b/lefthook.rc index b085b38bfe6..a772dbb680e 100644 --- a/lefthook.rc +++ b/lefthook.rc @@ -2,5 +2,5 @@ # the name `lefthook`, as expected by the lefthook pre-commit scripts lefthook () { - GOWORK=off go tool -n -modfile=.citools/src/lefthook/go.mod github.com/evilmartians/lefthook + GOWORK=off go tool -modfile=.citools/src/lefthook/go.mod github.com/evilmartians/lefthook "$@" } diff --git a/package.json b/package.json index d08b3f4c16e..999ac1def91 100644 --- a/package.json +++ b/package.json @@ -259,15 +259,15 @@ "yargs": "^17.5.1" }, "dependencies": { - "@bsull/augurs": "^0.9.0", + "@bsull/augurs": "^0.10.0", "@emotion/css": "11.13.5", "@emotion/react": "11.14.0", "@fingerprintjs/fingerprintjs": "^3.4.2", - "@floating-ui/react": "0.27.8", + "@floating-ui/react": "0.27.9", "@formatjs/intl-durationformat": "^0.7.0", "@glideapps/glide-data-grid": "^6.0.0", "@grafana/alerting": "workspace:*", - "@grafana/aws-sdk": "0.6.0", + "@grafana/aws-sdk": "0.7.1", "@grafana/azure-sdk": "0.0.7", "@grafana/data": "workspace:*", "@grafana/e2e-selectors": "workspace:*", @@ -278,7 +278,7 @@ "@grafana/google-sdk": "0.1.2", "@grafana/i18n": "workspace:*", "@grafana/lezer-logql": "0.2.7", - "@grafana/llm": "0.13.2", + "@grafana/llm": "0.19.2", "@grafana/monaco-logql": "^0.0.8", "@grafana/o11y-ds-frontend": "workspace:*", "@grafana/plugin-ui": "0.10.6", @@ -302,7 +302,7 @@ "@msagl/parser": "^1.1.19", "@opentelemetry/api": "1.9.0", "@opentelemetry/exporter-collector": "0.25.0", - "@opentelemetry/semantic-conventions": "1.28.0", + "@opentelemetry/semantic-conventions": "1.34.0", "@popperjs/core": "2.11.8", "@react-aria/dialog": "3.5.25", "@react-aria/focus": "3.20.3", diff --git a/packages/grafana-data/src/index.ts b/packages/grafana-data/src/index.ts index 2a190301d1d..28cb92c47d3 100644 --- a/packages/grafana-data/src/index.ts +++ b/packages/grafana-data/src/index.ts @@ -563,6 +563,7 @@ export { type PluginExtensionAddedComponentConfig, type PluginExtensionAddedLinkConfig, type PluginExtensionAddedFunctionConfig, + type PluginExtensionResourceAttributesContext, } from './types/pluginExtensions'; export { type ScopeDashboardBindingSpec, @@ -877,3 +878,5 @@ export { userHasAllPermissions, userHasAnyPermission, } from './rbac/rbac'; + +export { type UserStorage } from './types/userStorage'; diff --git a/packages/grafana-data/src/transformations/matchers/fieldTypeMatcher.test.ts b/packages/grafana-data/src/transformations/matchers/fieldTypeMatcher.test.ts index af055205159..7b441e22b75 100644 --- a/packages/grafana-data/src/transformations/matchers/fieldTypeMatcher.test.ts +++ b/packages/grafana-data/src/transformations/matchers/fieldTypeMatcher.test.ts @@ -1,16 +1,8 @@ -import { toDataFrame } from '../../dataframe/processDataFrame'; import { FieldType } from '../../types/dataFrame'; import { fieldMatchers } from '../matchers'; import { FieldMatcherID } from './ids'; - -export const simpleSeriesWithTypes = toDataFrame({ - fields: [ - { name: 'A', type: FieldType.time }, - { name: 'B', type: FieldType.boolean }, - { name: 'C', type: FieldType.string }, - ], -}); +import { simpleSeriesWithTypes } from './mocks'; describe('Field Type Matcher', () => { const matcher = fieldMatchers.get(FieldMatcherID.byType); diff --git a/packages/grafana-data/src/transformations/matchers/mocks.ts b/packages/grafana-data/src/transformations/matchers/mocks.ts new file mode 100644 index 00000000000..e19bf68d7f0 --- /dev/null +++ b/packages/grafana-data/src/transformations/matchers/mocks.ts @@ -0,0 +1,10 @@ +import { toDataFrame } from '../../dataframe/processDataFrame'; +import { FieldType } from '../../types/dataFrame'; + +export const simpleSeriesWithTypes = toDataFrame({ + fields: [ + { name: 'A', type: FieldType.time }, + { name: 'B', type: FieldType.boolean }, + { name: 'C', type: FieldType.string }, + ], +}); diff --git a/packages/grafana-data/src/transformations/matchers/predicates.test.ts b/packages/grafana-data/src/transformations/matchers/predicates.test.ts index 708d9aa8b9f..c60497ef28f 100644 --- a/packages/grafana-data/src/transformations/matchers/predicates.test.ts +++ b/packages/grafana-data/src/transformations/matchers/predicates.test.ts @@ -2,8 +2,8 @@ import { FieldType } from '../../types/dataFrame'; import { MatcherConfig } from '../../types/transformations'; import { fieldMatchers } from '../matchers'; -import { simpleSeriesWithTypes } from './fieldTypeMatcher.test'; import { FieldMatcherID, MatcherID } from './ids'; +import { simpleSeriesWithTypes } from './mocks'; const matchesNumberConfig: MatcherConfig = { id: FieldMatcherID.byType, diff --git a/packages/grafana-data/src/types/datasource.ts b/packages/grafana-data/src/types/datasource.ts index d760d916f4a..d75d3f0bec4 100644 --- a/packages/grafana-data/src/types/datasource.ts +++ b/packages/grafana-data/src/types/datasource.ts @@ -19,6 +19,7 @@ import { DataQuery } from './query'; import { Scope } from './scopes'; import { AdHocVariableFilter } from './templateVars'; import { RawTimeRange, TimeRange } from './time'; +import { UserStorage } from './userStorage'; import { CustomVariableSupport, DataSourceVariableSupport, StandardVariableSupport } from './variables'; export interface DataSourcePluginOptionsEditorProps< @@ -238,6 +239,11 @@ abstract class DataSourceApi< */ interval?: string; + /** + * Initialized in datasource_srv.ts + */ + userStorage?: UserStorage; + constructor(instanceSettings: DataSourceInstanceSettings) { this.name = instanceSettings.name; this.id = instanceSettings.id; diff --git a/packages/grafana-data/src/types/featureToggles.gen.ts b/packages/grafana-data/src/types/featureToggles.gen.ts index 64d213a904b..7feebb276e6 100644 --- a/packages/grafana-data/src/types/featureToggles.gen.ts +++ b/packages/grafana-data/src/types/featureToggles.gen.ts @@ -777,11 +777,6 @@ export interface FeatureToggles { */ jaegerBackendMigration?: boolean; /** - * Uses the original report or dashboard time range instead of making an absolute transformation - * @default true - */ - reportingUseRawTimeRange?: boolean; - /** * Enables removing the reducer from the alerting UI when creating a new alert rule and using instant query * @default true */ @@ -845,20 +840,10 @@ export interface FeatureToggles { */ teamHttpHeadersTempo?: boolean; /** - * Test feature toggle to see how cohorts could be set up AB testing - * @default false - */ - ABTestFeatureToggleA?: boolean; - /** * Use new **Combobox** component for template variables */ templateVariablesUsesCombobox?: boolean; /** - * Test feature toggle to see how cohorts could be set up AB testing - * @default false - */ - ABTestFeatureToggleB?: boolean; - /** * Enables Advisor app */ grafanaAdvisor?: boolean; @@ -922,11 +907,6 @@ export interface FeatureToggles { */ alertRuleRestore?: boolean; /** - * Enables writing to data sources for Grafana-managed recording rules. - * @default false - */ - grafanaManagedRecordingRulesDatasources?: boolean; - /** * Enables running Infinity queries in parallel */ infinityRunQueriesInParallel?: boolean; @@ -1003,6 +983,10 @@ export interface FeatureToggles { */ metricsFromProfiles?: boolean; /** + * Enables using PGX instead of libpq for PostgreSQL datasource + */ + postgresDSUsePGX?: boolean; + /** * Enables auto-updating of users installed plugins */ pluginsAutoUpdate?: boolean; @@ -1028,4 +1012,14 @@ export interface FeatureToggles { * Use proxy-based read-only objects for plugin extensions instead of deep cloning */ extensionsReadOnlyProxy?: boolean; + /** + * Enables restore deleted dashboards feature + * @default false + */ + restoreDashboards?: boolean; + /** + * Skip token rotation if it was already rotated less than 5 seconds ago + * @default false + */ + skipTokenRotationIfRecent?: boolean; } diff --git a/packages/grafana-data/src/types/pluginExtensions.ts b/packages/grafana-data/src/types/pluginExtensions.ts index c7a1df01b23..36ddc74ab22 100644 --- a/packages/grafana-data/src/types/pluginExtensions.ts +++ b/packages/grafana-data/src/types/pluginExtensions.ts @@ -192,6 +192,7 @@ export enum PluginExtensionPoints { UserProfileTab = 'grafana/user/profile/tab', TraceViewDetails = 'grafana/traceview/details', QueryEditorRowAdaptiveTelemetryV1 = 'grafana/query-editor-row/adaptivetelemetry/v1', + TraceViewResourceAttributes = 'grafana/traceview/resource-attributes', } export type PluginExtensionPanelContext = { @@ -236,6 +237,15 @@ export type PluginExtensionDataSourceConfigContext< export type PluginExtensionCommandPaletteContext = {}; +export type PluginExtensionResourceAttributesContext = { + // Key-value pairs of resource attributes, attribute name is the key + attributes: Record; + datasource: { + type: string; + uid: string; + }; +}; + type Dashboard = { uid: string; title: string; diff --git a/packages/grafana-data/src/types/userStorage.ts b/packages/grafana-data/src/types/userStorage.ts new file mode 100644 index 00000000000..e34089ee6ef --- /dev/null +++ b/packages/grafana-data/src/types/userStorage.ts @@ -0,0 +1,15 @@ +export interface UserStorage { + /** + * Retrieves an item from the backend user storage or local storage if not enabled. + * @param key - The key of the item to retrieve. + * @returns A promise that resolves to the item value or null if not found. + */ + getItem(key: string): Promise; + /** + * Sets an item in the backend user storage or local storage if not enabled. + * @param key - The key of the item to set. + * @param value - The value of the item to set. + * @returns A promise that resolves when the item is set. + */ + setItem(key: string, value: string): Promise; +} diff --git a/packages/grafana-data/src/utils/store.ts b/packages/grafana-data/src/utils/store.ts index 8d5a5b1e933..49dd4d26340 100644 --- a/packages/grafana-data/src/utils/store.ts +++ b/packages/grafana-data/src/utils/store.ts @@ -1,6 +1,9 @@ type StoreValue = string | number | boolean | null; type StoreSubscriber = () => void; +/** + * @deprecated Import singleton instance 'store' from '@grafana/data' instead + */ export class Store { private subscribers: Map> = new Map(); diff --git a/packages/grafana-e2e-selectors/src/selectors/components.ts b/packages/grafana-e2e-selectors/src/selectors/components.ts index 0cfe9907c6a..343dc58efcb 100644 --- a/packages/grafana-e2e-selectors/src/selectors/components.ts +++ b/packages/grafana-e2e-selectors/src/selectors/components.ts @@ -578,6 +578,7 @@ export const versionedComponents = { }, measureButton: { + '12.1.0': 'data-testid panel-editor-measure-button', '9.2.0': 'show measure tools', }, diff --git a/packages/grafana-e2e-selectors/src/selectors/pages.ts b/packages/grafana-e2e-selectors/src/selectors/pages.ts index 0beb8916e32..056f3209ccd 100644 --- a/packages/grafana-e2e-selectors/src/selectors/pages.ts +++ b/packages/grafana-e2e-selectors/src/selectors/pages.ts @@ -511,6 +511,9 @@ export const versionedPages = { datasourceSelect: { [MIN_GRAFANA_VERSION]: 'data-testid datasource variable datasource type', }, + nameFilter: { + [MIN_GRAFANA_VERSION]: 'data-testid datasource variable datasource name filter', + }, }, TextBoxVariable: { textBoxOptionsQueryInput: { diff --git a/packages/grafana-eslint-rules/README.md b/packages/grafana-eslint-rules/README.md index e57e2ec09a1..1fb043a4ec0 100644 --- a/packages/grafana-eslint-rules/README.md +++ b/packages/grafana-eslint-rules/README.md @@ -111,118 +111,3 @@ const getStyles = (theme: GrafanaTheme2) => ({ ### `theme-token-usage` Used to find all instances of `theme` tokens being used in the codebase and emit the counts as metrics. Should **not** be used as an actual lint rule! - -### `no-untranslated-strings` - -Check if strings are marked for translation. - -```tsx -// Bad ❌ - - Copied - - -// Good ✅ - - Copied - - -``` - -#### Passing variables to translations - -```tsx -// Bad ❌ -const SearchTitle = ({ term }) =>
Results for {term}
; - -// Good ✅ -const SearchTitle = ({ term }) => Results for {{ term }}; - -// Good ✅ (if you need to interpolate variables inside nested components) -const SearchTerm = ({ term }) => {term}; -const SearchTitle = ({ term }) => ( - - Results for - -); - -// Good ✅ (if you need to interpolate variables and additional translated strings inside nested components) -const SearchTitle = ({ term }) => ( - - Results for {'{{ myVariable }}'} and this translated text is also in green - -); -``` - -#### How to translate props or attributes - -This rule checks if a string is wrapped up by the `Trans` tag, or if certain props contain untranslated strings. -We ask for such props to be translated with the `t()` function. - -The below props are checked for untranslated strings: - -- `label` -- `description` -- `placeholder` -- `aria-label` -- `title` -- `text` -- `tooltip` - -```tsx -// Bad ❌ -; - -// Good ✅ -const placeholder = t('form.username-placeholder', 'Username'); -return ; -``` - -Check more info about how translations work in Grafana in [Internationalization.md](https://github.com/grafana/grafana/blob/main/contribute/internationalization.md) - -### `no-translation-top-level` - -Ensure that `t()` translation method is not used at the top level of a file, outside of a component of method. -This is to prevent calling the translation method before it's been instantiated. - -This does not cause an error if a file is lazily loaded, but refactors can cause errors, and it can cause problems in tests. -Fix the - -```tsx -// Bad ❌ -const someTranslatedText = t('some.key', 'Some text'); -const SomeComponent = () => { - return
; -}; - -// Good ✅ -const SomeComponent = () => { - const someTranslatedText = t('some.key', 'Some text'); - return
; -}; - -// Bad ❌ -const someConfigThatHasToBeShared = [{ foo: t('some.key', 'Some text') }]; -const SomeComponent = () => { - return ( -
- {someConfigThatHasToBeShared.map((cfg) => { - return
{cfg.foo}
; - })} -
- ); -}; - -// Good ✅ -const someConfigThatHasToBeShared = () => [{ foo: t('some.key', 'Some text') }]; -const SomeComponent = () => { - const configs = someConfigThatHasToBeShared(); - return ( -
- {configs.map((cfg) => { - return
{cfg.foo}
; - })} -
- ); -}; -``` diff --git a/packages/grafana-eslint-rules/index.cjs b/packages/grafana-eslint-rules/index.cjs index c3f69b593e5..2babd165372 100644 --- a/packages/grafana-eslint-rules/index.cjs +++ b/packages/grafana-eslint-rules/index.cjs @@ -1,8 +1,6 @@ const noAriaLabelSelectors = require('./rules/no-aria-label-e2e-selectors.cjs'); const noBorderRadiusLiteral = require('./rules/no-border-radius-literal.cjs'); const noUnreducedMotion = require('./rules/no-unreduced-motion.cjs'); -const noUntranslatedStrings = require('./rules/no-untranslated-strings.cjs'); -const noTranslationTopLevel = require('./rules/no-translation-top-level.cjs'); const themeTokenUsage = require('./rules/theme-token-usage.cjs'); const noRestrictedImgSrcs = require('./rules/no-restricted-img-srcs.cjs'); @@ -12,8 +10,6 @@ module.exports = { 'no-aria-label-selectors': noAriaLabelSelectors, 'no-border-radius-literal': noBorderRadiusLiteral, 'theme-token-usage': themeTokenUsage, - 'no-untranslated-strings': noUntranslatedStrings, - 'no-translation-top-level': noTranslationTopLevel, 'no-restricted-img-srcs': noRestrictedImgSrcs, }, }; diff --git a/packages/grafana-i18n/package.json b/packages/grafana-i18n/package.json index e24446833ab..4bedfae9dcc 100644 --- a/packages/grafana-i18n/package.json +++ b/packages/grafana-i18n/package.json @@ -26,6 +26,10 @@ "./internal": { "import": "./src/internal/index.ts", "require": "./src/internal/index.ts" + }, + "./eslint-plugin": { + "import": "./src/eslint/index.cjs", + "require": "./src/eslint/index.cjs" } }, "publishConfig": { diff --git a/packages/grafana-i18n/src/eslint/README.md b/packages/grafana-i18n/src/eslint/README.md new file mode 100644 index 00000000000..4fb1abdf8f6 --- /dev/null +++ b/packages/grafana-i18n/src/eslint/README.md @@ -0,0 +1,185 @@ +# Grafana Internationalization ESLint Rules + +This package also contains custom i18n eslint rules for use within the Grafana codebase and plugins. + +## Rules + +### `no-untranslated-strings` + +Check if strings are marked for translation inside JSX Elements, in certain JSX props, and in certain object properties. + +### Options + +#### `forceFix` + +Allows specifying directories that, if the file is present within, then the rule will automatically fix the errors. This is primarily a workaround to allow for automatic mark up of new violations as the rule evolves. + +#### Example: + +```ts +{ + '@grafana/i18n/no-untranslated-strings': ['error', { forceFix: ['app/features/some-feature'] }], +} +``` + +#### `calleesToIgnore` + +Allows specifying regexes for methods that should be ignored when checking if object properties are untranslated. + +This is particularly useful to exclude references to properties such as `label` inside `css()` calls. + +#### Example: + +```ts +{ + '@grafana/i18n/no-untranslated-strings': ['error', { calleesToIgnore: ['^css$'] }], +} + +// The below would not be reported as an error +const foo = css({ + label: 'test', +}); + +// The below would still be reported as an error +const bar = { + label: 'test', +}; +``` + +#### JSXText + +```tsx +// Bad ❌ + + Copied + + +// Good ✅ + + Copied + +``` + +#### JSXAttributes + +```tsx +// Bad ❌ +
+ +// Good ✅ +
+``` + +#### Object properties + +```tsx +// Bad ❌ +const someConfig = { + label: 'Some label', +}; + +// Good ✅ +const getSomeConfig = () => ({ + label: t('some.key.label', 'Some label'), +}); +``` + +#### Passing variables to translations + +```tsx +// Bad ❌ +const SearchTitle = ({ term }) =>
Results for {term}
; + +// Good ✅ +const SearchTitle = ({ term }) => Results for {{ term }}; + +// Good ✅ (if you need to interpolate variables inside nested components) +const SearchTerm = ({ term }) => {term}; +const SearchTitle = ({ term }) => ( + + Results for + +); + +// Good ✅ (if you need to interpolate variables and additional translated strings inside nested components) +const SearchTitle = ({ term }) => ( + + Results for {'{{ myVariable }}'} and this translated text is also in green + +); +``` + +#### How to translate props or attributes + +This rule checks if a string is wrapped up by the `Trans` tag, or if certain props contain untranslated strings. +We ask for such props to be translated with the `t()` function. + +The below props are checked for untranslated strings: + +- `label` +- `description` +- `placeholder` +- `aria-label` +- `title` +- `subTitle` +- `text` +- `tooltip` +- `message` +- `name` + +```tsx +// Bad ❌ +; + +// Good ✅ +const placeholder = t('form.username-placeholder', 'Username'); +return ; +``` + +Check more info about how translations work in Grafana in [Internationalization.md](https://github.com/grafana/grafana/blob/main/contribute/internationalization.md) + +### `no-translation-top-level` + +Ensure that `t()` translation method is not used at the top level of a file, outside of a component of method. +This is to prevent calling the translation method before it's been instantiated. + +This does not cause an error if a file is lazily loaded, but refactors can cause errors, and it can cause problems in tests. + +```tsx +// Bad ❌ +const someTranslatedText = t('some.key', 'Some text'); +const SomeComponent = () => { + return
; +}; + +// Good ✅ +const SomeComponent = () => { + const someTranslatedText = t('some.key', 'Some text'); + return
; +}; + +// Bad ❌ +const someConfigThatHasToBeShared = [{ foo: t('some.key', 'Some text') }]; +const SomeComponent = () => { + return ( +
+ {someConfigThatHasToBeShared.map((cfg) => { + return
{cfg.foo}
; + })} +
+ ); +}; + +// Good ✅ +const getSomeConfigThatHasToBeShared = () => [{ foo: t('some.key', 'Some text') }]; +const SomeComponent = () => { + const configs = getSomeConfigThatHasToBeShared(); + return ( +
+ {configs.map((cfg) => { + return
{cfg.foo}
; + })} +
+ ); +}; +``` diff --git a/packages/grafana-i18n/src/eslint/index.cjs b/packages/grafana-i18n/src/eslint/index.cjs new file mode 100644 index 00000000000..9c3e4714a5f --- /dev/null +++ b/packages/grafana-i18n/src/eslint/index.cjs @@ -0,0 +1,9 @@ +const noUntranslatedStrings = require('./no-untranslated-strings/no-untranslated-strings.cjs'); +const noTranslationTopLevel = require('./no-translation-top-level/no-translation-top-level.cjs'); + +module.exports = { + rules: { + 'no-untranslated-strings': noUntranslatedStrings, + 'no-translation-top-level': noTranslationTopLevel, + }, +}; diff --git a/packages/grafana-eslint-rules/rules/no-translation-top-level.cjs b/packages/grafana-i18n/src/eslint/no-translation-top-level/no-translation-top-level.cjs similarity index 97% rename from packages/grafana-eslint-rules/rules/no-translation-top-level.cjs rename to packages/grafana-i18n/src/eslint/no-translation-top-level/no-translation-top-level.cjs index 2290a980cf1..bedb4105971 100644 --- a/packages/grafana-eslint-rules/rules/no-translation-top-level.cjs +++ b/packages/grafana-i18n/src/eslint/no-translation-top-level/no-translation-top-level.cjs @@ -7,7 +7,7 @@ const { ESLintUtils, AST_NODE_TYPES } = require('@typescript-eslint/utils'); */ const createRule = ESLintUtils.RuleCreator( - (name) => `https://github.com/grafana/grafana/blob/main/packages/grafana-eslint-rules/README.md#${name}` + (name) => `https://github.com/grafana/grafana/blob/main/packages/grafana-i18n/src/eslint/README.md#${name}` ); /** diff --git a/packages/grafana-eslint-rules/tests/no-translation-top-level.test.js b/packages/grafana-i18n/src/eslint/no-translation-top-level/no-translation-top-level.test.js similarity index 59% rename from packages/grafana-eslint-rules/tests/no-translation-top-level.test.js rename to packages/grafana-i18n/src/eslint/no-translation-top-level/no-translation-top-level.test.js index 88326b500d4..ab75478ce14 100644 --- a/packages/grafana-eslint-rules/tests/no-translation-top-level.test.js +++ b/packages/grafana-i18n/src/eslint/no-translation-top-level/no-translation-top-level.test.js @@ -1,8 +1,8 @@ import { RuleTester } from 'eslint'; -import noTranslationTopLevel from '../rules/no-translation-top-level.cjs'; +import noTranslationTopLevel from './no-translation-top-level.cjs'; -RuleTester.setDefaultConfig({ +const ruleTester = new RuleTester({ languageOptions: { ecmaVersion: 2018, sourceType: 'module', @@ -14,13 +14,11 @@ RuleTester.setDefaultConfig({ }, }); -const expectedErrorMessage = 'Do not use the t() function outside of a component or function'; - -const ruleTester = new RuleTester(); - +// @ts-ignore ruleTester.run('eslint no-translation-top-level', noTranslationTopLevel, { valid: [ { + name: 'invocation inside component', code: ` function Component() { return
{t('some.key', 'Some text')}
; @@ -28,31 +26,37 @@ function Component() { `, }, { + name: 'invocation inside function', code: `const foo = () => t('some.key', 'Some text');`, }, { - code: `const foo = ttt('some.key', 'Some text');`, + name: 'invocation inside class component', + code: `class Component { + render() { + return t('some.key', 'Some text'); + } + }`, }, { - code: `class Component { -render() { - return t('some.key', 'Some text'); -} -}`, + name: 'invocation of something not named t at top level', + code: `const foo = ttt('some.key', 'Some text');`, }, ], invalid: [ { + name: 'invocation at top level', code: `const thing = t('some.key', 'Some text');`, - errors: [{ message: expectedErrorMessage }], + errors: 1, }, { + name: 'invocation in array', code: `const things = [t('some.key', 'Some text')];`, - errors: [{ message: expectedErrorMessage }], + errors: 1, }, { + name: 'invocation in object', code: `const objectThings = [{foo: t('some.key', 'Some text')}];`, - errors: [{ message: expectedErrorMessage }], + errors: 1, }, ], }); diff --git a/packages/grafana-eslint-rules/rules/no-untranslated-strings.cjs b/packages/grafana-i18n/src/eslint/no-untranslated-strings/no-untranslated-strings.cjs similarity index 61% rename from packages/grafana-eslint-rules/rules/no-untranslated-strings.cjs rename to packages/grafana-i18n/src/eslint/no-untranslated-strings/no-untranslated-strings.cjs index 18d44a34daf..91de4620060 100644 --- a/packages/grafana-eslint-rules/rules/no-untranslated-strings.cjs +++ b/packages/grafana-i18n/src/eslint/no-untranslated-strings/no-untranslated-strings.cjs @@ -2,7 +2,8 @@ /** @typedef {import('@typescript-eslint/utils').TSESTree.Node} Node */ /** @typedef {import('@typescript-eslint/utils').TSESTree.JSXElement} JSXElement */ /** @typedef {import('@typescript-eslint/utils').TSESTree.JSXFragment} JSXFragment */ -/** @typedef {import('@typescript-eslint/utils').TSESLint.RuleModule<'noUntranslatedStrings' | 'noUntranslatedStringsProp' | 'wrapWithTrans' | 'wrapWithT', [{ forceFix: string[] }]>} RuleDefinition */ +/** @typedef {import('@typescript-eslint/utils').TSESLint.RuleModule<'noUntranslatedStrings' | 'noUntranslatedStringsProp' | 'wrapWithTrans' | 'wrapWithT' | 'noUntranslatedStringsProperties', [{ forceFix: string[] , calleesToIgnore: string[] }]>} RuleDefinition */ +/** @typedef {import('@typescript-eslint/utils/ts-eslint').RuleContext<'noUntranslatedStrings' | 'noUntranslatedStringsProp' | 'wrapWithTrans' | 'wrapWithT' | 'noUntranslatedStringsProperties', [{forceFix: string[], calleesToIgnore: string[]}]>} RuleContextWithOptions */ const { getNodeValue, @@ -17,16 +18,110 @@ const { const { ESLintUtils, AST_NODE_TYPES } = require('@typescript-eslint/utils'); const createRule = ESLintUtils.RuleCreator( - (name) => `https://github.com/grafana/grafana/blob/main/packages/grafana-eslint-rules/README.md#${name}` + (name) => `https://github.com/grafana/grafana/blob/main/packages/grafana-i18n/src/eslint/README.md#${name}` ); -/** @type {string[]} */ +/** + * JSX props to check for untranslated strings + */ const propsToCheck = ['content', 'label', 'description', 'placeholder', 'aria-label', 'title', 'text', 'tooltip']; +/** + * Object properties to check for untranslated strings + */ +const propertiesToCheck = [ + 'label', + 'description', + 'placeholder', + 'aria-label', + 'title', + 'subTitle', + 'text', + 'tooltip', + 'message', +]; + /** @type {RuleDefinition} */ const noUntranslatedStrings = createRule({ + /** + * @param {RuleContextWithOptions} context + */ create(context) { + const calleesToIgnore = context.options[0]?.calleesToIgnore || []; + const propertiesRegexes = calleesToIgnore.map((pattern) => { + return new RegExp(pattern); + }); + return { + Property(node) { + const { key, value, parent, computed } = node; + const keyName = (() => { + if (computed) { + return null; + } + if (key.type === AST_NODE_TYPES.Identifier && typeof key.name === 'string') { + return key.name; + } + return null; + })(); + + // Catch cases of default props setting object properties, which would be at the top level + const isAssignmentPattern = parent.parent.type === AST_NODE_TYPES.AssignmentPattern; + + if ( + !keyName || + !propertiesToCheck.includes(keyName) || + parent.type === AST_NODE_TYPES.ObjectPattern || + isAssignmentPattern + ) { + return; + } + + const callExpression = parent.parent.type === AST_NODE_TYPES.CallExpression ? parent.parent.callee : null; + // Check if we're being called by something that we want to ignore + // e.g. css({ label: 'test' }) should be ignored (based on the rule configuration) + if ( + callExpression?.type === AST_NODE_TYPES.Identifier && + propertiesRegexes.some((regex) => regex.test(callExpression.name)) + ) { + return; + } + + const nodeValue = getNodeValue(node); + + const isOnlySymbols = !/[a-zA-Z0-9]/.test(nodeValue); + const isNumeric = !/[a-zA-Z]/.test(nodeValue); + + const isUntranslated = + ((value.type === AST_NODE_TYPES.Literal && nodeValue !== '') || + value.type === AST_NODE_TYPES.TemplateLiteral) && + !isOnlySymbols && + !isNumeric; + + const errorCanBeFixed = canBeFixed(node, context); + const errorShouldBeFixed = shouldBeFixed(context); + if ( + isUntranslated && + // TODO: Remove this check in the future when we've fixed all cases of untranslated properties + // For now, we're only reporting the issues that can be auto-fixed, rather than adding to betterer results + errorCanBeFixed + ) { + context.report({ + node, + messageId: 'noUntranslatedStringsProperties', + fix: errorCanBeFixed && errorShouldBeFixed ? getTFixers(node, context) : undefined, + suggest: errorCanBeFixed + ? [ + { + messageId: 'wrapWithT', + fix: getTFixers(node, context), + }, + ] + : undefined, + }); + } + }, + JSXAttribute(node) { if (!propsToCheck.includes(String(node.name.name)) || !node.value) { return; @@ -129,7 +224,10 @@ const noUntranslatedStrings = createRule({ // We don't want to report if the parent has a text node, // as we'd end up doing it twice. This makes it awkward for us to auto fix const parentHasText = parentHasChildren - ? parent.children.some((child) => child.type === AST_NODE_TYPES.JSXText && getNodeValue(child).trim()) + ? parent.children.some((child) => { + const childValue = getNodeValue(child).trim(); + return child.type === AST_NODE_TYPES.JSXText && childValue && !isStringNonAlphanumeric(childValue); + }) : false; if (untranslatedTextNodes.length && !parentHasText) { @@ -163,6 +261,7 @@ const noUntranslatedStrings = createRule({ messages: { noUntranslatedStrings: 'No untranslated strings. Wrap text with ', noUntranslatedStringsProp: `No untranslated strings in text props. Wrap text with or use t()`, + noUntranslatedStringsProperties: `No untranslated strings in object properties. Wrap text with t()`, wrapWithTrans: 'Wrap text with for manual key assignment', wrapWithT: 'Wrap text with t() for manual key assignment', }, @@ -177,12 +276,19 @@ const noUntranslatedStrings = createRule({ }, uniqueItems: true, }, + calleesToIgnore: { + type: 'array', + items: { + type: 'string', + }, + default: [], + }, }, additionalProperties: false, }, ], }, - defaultOptions: [{ forceFix: [] }], + defaultOptions: [{ forceFix: [], calleesToIgnore: [] }], }); module.exports = noUntranslatedStrings; diff --git a/packages/grafana-eslint-rules/tests/no-untranslated-strings.test.js b/packages/grafana-i18n/src/eslint/no-untranslated-strings/no-untranslated-strings.test.js similarity index 77% rename from packages/grafana-eslint-rules/tests/no-untranslated-strings.test.js rename to packages/grafana-i18n/src/eslint/no-untranslated-strings/no-untranslated-strings.test.js index b57f97ddfc3..8c5afef89bc 100644 --- a/packages/grafana-eslint-rules/tests/no-untranslated-strings.test.js +++ b/packages/grafana-i18n/src/eslint/no-untranslated-strings/no-untranslated-strings.test.js @@ -1,8 +1,17 @@ import { RuleTester } from 'eslint'; -import noUntranslatedStrings from '../rules/no-untranslated-strings.cjs'; +import noUntranslatedStrings from './no-untranslated-strings.cjs'; -RuleTester.setDefaultConfig({ +const filename = 'public/app/features/some-feature/nested/SomeFile.tsx'; + +const packageName = '@grafana/i18n'; + +const TRANS_IMPORT = `import { Trans } from '${packageName}';`; +const T_IMPORT = `import { t } from '${packageName}/internal';`; +const USE_TRANSLATE_IMPORT = `import { useTranslate } from '${packageName}';`; +const TRANS_AND_USE_TRANSLATE_IMPORT = `import { Trans, useTranslate } from '${packageName}';`; + +const ruleTester = new RuleTester({ languageOptions: { ecmaVersion: 2018, sourceType: 'module', @@ -14,23 +23,14 @@ RuleTester.setDefaultConfig({ }, }); -const filename = 'public/app/features/some-feature/SomeFile.tsx'; - -const packageName = '@grafana/i18n'; - -const TRANS_IMPORT = `import { Trans } from '${packageName}';`; -const T_IMPORT = `import { t } from '${packageName}/internal';`; -const USE_TRANSLATE_IMPORT = `import { useTranslate } from '${packageName}';`; -const TRANS_AND_USE_TRANSLATE_IMPORT = `import { Trans, useTranslate } from '${packageName}';`; - -const ruleTester = new RuleTester(); - +//@ts-ignore ruleTester.run('eslint no-untranslated-strings', noUntranslatedStrings, { test: [], valid: [ { name: 'Text in Trans component', code: `const Foo = () => Translated text`, + filename, }, { name: 'Text in Trans component with whitespace/JSXText elements', @@ -38,58 +38,72 @@ ruleTester.run('eslint no-untranslated-strings', noUntranslatedStrings, { Translated text `, + filename, }, { name: 'Empty component', code: `
`, + filename, }, { name: 'Text using t() function', code: `
{t('translated.key', 'Translated text')}
`, + filename, }, { name: 'Prop using t() function', code: `
`, + filename, }, { name: 'Empty string prop', code: `
`, + filename, }, { name: 'Prop using boolean', code: `
`, + filename, }, { name: 'Prop using number', code: `
`, + filename, }, { name: 'Prop using null', code: `
`, + filename, }, { name: 'Prop using undefined', code: `
`, + filename, }, { name: 'Variable interpolation', code: `
{variable}
`, + filename, }, { name: 'Entirely non-alphanumeric text (prop)', code: `
`, + filename, }, { name: 'Entirely non-alphanumeric text', code: `
-
`, + filename, }, { name: 'Non-alphanumeric siblings', code: `
({variable})
`, + filename, }, { name: "Ternary in an attribute we don't care about", code: `
`, + filename, }, { name: 'Ternary with falsy strings', @@ -98,6 +112,76 @@ ruleTester.run('eslint no-untranslated-strings', noUntranslatedStrings, { { name: 'Ternary with no strings', code: `
`, + filename, + }, + { + name: 'Object property', + code: `const getThing = () => ({ + label: t('test', 'Test'), + })`, + filename, + }, + { + // Ideally we would catch this, but test case is to ensure that + // we aren't reporting an error + name: 'Object property using variable', + code: ` + const getThing = () => { + const foo = 'test'; + const thing = { + label: foo, + } + }`, + filename, + }, + { + name: 'Object property using dynamic/other keys', + code: ` + const getThing = () => { + const foo = 'label'; + const label = 'not-a-label'; + const thing = { + 1: 'a', + // We can't easily check for computed keys, so for now don't worry about this case + [foo]: 'test', + + // This is dumb, but we need to check that we don't confuse + // the name of the variable for the key name + [label]: 'test', + ['title']: 'test', + } + }`, + filename, + }, + { + name: 'Label reference inside `css` call', + code: `const getThing = () => { + const thing = css({ + label: 'red', + }); + }`, + options: [{ calleesToIgnore: ['somethingelse', '^css$'] }], + filename, + }, + { + name: 'Object property value that is a boolean or number', + code: `const getThing = () => { + const thing = { + label: true, + title: 1 + }; + }`, + filename, + }, + { + name: 'Object property at top level', + code: `const thing = { label: 'test' }`, + filename, + }, + { + name: 'Object property in default props', + code: `const Foo = ({ foobar = {label: 'test'} }) =>
{foobar.label}
`, + filename, }, ], invalid: [ @@ -127,6 +211,24 @@ const Foo = () =>
Untra ], }, + { + name: 'non-alphanumeric characters outside child element', + code: ` +const Foo = () => { + return ( + <> +
+ something untranslated but i'm a naughty dev and + I put a bunch of non-alphanumeric characters outside of the div +
+ .?!; + + ) +}`, + filename, + errors: 1, + }, + { name: 'Text inside JSXElement, not in a function', code: ` @@ -667,6 +769,97 @@ const Foo = () => { ], }, + { + name: 'Untranslated object property', + code: ` +const Foo = () => { + const thing = { + label: 'test', + } + + return
{thing.label}
; +}`, + filename, + errors: [ + { + messageId: 'noUntranslatedStringsProperties', + suggestions: [ + { + messageId: 'wrapWithT', + output: ` +${USE_TRANSLATE_IMPORT} +const Foo = () => { + const { t } = useTranslate(); +const thing = { + label: t(\"some-feature.foo.thing.label.test\", \"test\"), + } + + return
{thing.label}
; +}`, + }, + ], + }, + ], + }, + + { + name: 'Untranslated object property with existing import', + code: ` +${T_IMPORT} +const Foo = () => { + const thing = { + label: 'test', + } +}`, + filename, + errors: [ + { + messageId: 'noUntranslatedStringsProperties', + suggestions: [ + { + messageId: 'wrapWithT', + output: ` +${T_IMPORT} +const Foo = () => { + const thing = { + label: t(\"some-feature.foo.thing.label.test\", \"test\"), + } +}`, + }, + ], + }, + ], + }, + + { + name: 'Untranslated object property with calleesToIgnore', + code: ` +const Foo = () => { + const thing = doAThing({ + label: 'test', + }) +}`, + options: [{ calleesToIgnore: ['doSomethingElse'] }], + filename, + errors: [ + { + messageId: 'noUntranslatedStringsProperties', + suggestions: [ + { + messageId: 'wrapWithT', + output: ` +${T_IMPORT} +const Foo = () => { + const thing = doAThing({ + label: t(\"some-feature.foo.thing.label.test\", \"test\"), + }) +}`, + }, + ], + }, + ], + }, + /** * AUTO FIXES */ @@ -723,6 +916,42 @@ return
], }, + { + name: 'Auto fixes object property', + code: ` +const Foo = () => { + return { + label: 'test', + } +}`, + filename, + options: [{ forceFix: ['public/app/features/some-feature'] }], + output: ` +${T_IMPORT} +const Foo = () => { + return { + label: t("some-feature.foo.label.test", "test"), + } +}`, + errors: [ + { + messageId: 'noUntranslatedStringsProperties', + suggestions: [ + { + messageId: 'wrapWithT', + output: ` +${T_IMPORT} +const Foo = () => { + return { + label: t("some-feature.foo.label.test", "test"), + } +}`, + }, + ], + }, + ], + }, + /** * UNFIXABLE CASES */ @@ -824,5 +1053,34 @@ const Foo = () => { filename, errors: [{ messageId: 'noUntranslatedStringsProp' }, { messageId: 'noUntranslatedStringsProp' }], }, + + { + name: 'Cannot fix if `t` already exists from somewhere else', + code: ` +const Foo = () => { + const t = () => 'something else'; + return ( +
+ ) +}`, + filename, + errors: [{ messageId: 'noUntranslatedStringsProp' }], + }, + + // TODO: Enable test once all top-level issues have been fixed + // and rule is enabled again + // { + // name: 'Object property at top level scope', + // code: ` + // const thing = { + // label: 'test', + // }`, + // filename, + // errors: [ + // { + // messageId: 'noUntranslatedStringsProperties', + // }, + // ], + // }, ], }); diff --git a/packages/grafana-eslint-rules/rules/translation-utils.cjs b/packages/grafana-i18n/src/eslint/no-untranslated-strings/translation-utils.cjs similarity index 82% rename from packages/grafana-eslint-rules/rules/translation-utils.cjs rename to packages/grafana-i18n/src/eslint/no-untranslated-strings/translation-utils.cjs index 3fe5540286d..77de33dbed0 100644 --- a/packages/grafana-eslint-rules/rules/translation-utils.cjs +++ b/packages/grafana-i18n/src/eslint/no-untranslated-strings/translation-utils.cjs @@ -5,9 +5,9 @@ /** @typedef {import('@typescript-eslint/utils').TSESTree.JSXFragment} JSXFragment */ /** @typedef {import('@typescript-eslint/utils').TSESTree.JSXText} JSXText */ /** @typedef {import('@typescript-eslint/utils').TSESTree.JSXChild} JSXChild */ +/** @typedef {import('@typescript-eslint/utils').TSESTree.Property} Property */ /** @typedef {import('@typescript-eslint/utils/ts-eslint').RuleFixer} RuleFixer */ /** @typedef {import('@typescript-eslint/utils/ts-eslint').RuleContext<'noUntranslatedStrings' | 'noUntranslatedStringsProp' | 'wrapWithTrans' | 'wrapWithT', [{forceFix: string[]}]>} RuleContextWithOptions */ - const { AST_NODE_TYPES } = require('@typescript-eslint/utils'); /** @@ -77,7 +77,7 @@ function shouldBeFixed(context) { /** * Checks if a node can be fixed automatically - * @param {JSXAttribute|JSXElement|JSXFragment} node The node to check + * @param {JSXAttribute|JSXElement|JSXFragment|Property} node The node to check * @param {RuleContextWithOptions} context * @returns {boolean} Whether the node can be fixed */ @@ -86,16 +86,28 @@ function canBeFixed(node, context) { return false; } + const parentMethod = getParentMethod(node, context); + const isAttribute = node.type === AST_NODE_TYPES.JSXAttribute; + const isProperty = node.type === AST_NODE_TYPES.Property; + const isPropertyOrAttribute = isAttribute || isProperty; + // We can only fix JSX attribute strings that are within a function, // otherwise the `t` function call will be made too early - if (node.type === AST_NODE_TYPES.JSXAttribute) { - const parentMethod = getParentMethod(node, context); - if (!parentMethod) { + if (isPropertyOrAttribute && !parentMethod) { + return false; + } + + // If we're going to try and fix using `t`, and it already exists in the scope, + // but not from `useTranslate`, then we can't fix/provide a suggestion + if (isPropertyOrAttribute && parentMethod) { + const hasTDeclaration = getTDeclaration(parentMethod, context); + const hasUseTranslateDeclaration = methodHasUseTranslate(parentMethod, context); + if (hasTDeclaration && !hasUseTranslateDeclaration) { return false; } - if (node.value?.type === AST_NODE_TYPES.JSXExpressionContainer) { - return isStringLiteral(node.value.expression); - } + } + if (isAttribute && node.value?.type === AST_NODE_TYPES.JSXExpressionContainer) { + return isStringLiteral(node.value.expression); } const values = @@ -130,7 +142,7 @@ function canBeFixed(node, context) { */ function getTranslationPrefix(context) { const filename = context.filename; - const match = filename.match(/public\/app\/features\/([^/]+)/); + const match = filename.match(/public\/app\/features\/(.+?)\//); if (match) { return match[1]; } @@ -139,7 +151,7 @@ function getTranslationPrefix(context) { /** * Gets the i18n key for a node - * @param {JSXAttribute|JSXText} node The node + * @param {JSXAttribute|JSXText|Property} node The node * @param {RuleContextWithOptions} context * @returns {string} The i18n key */ @@ -148,6 +160,10 @@ const getI18nKey = (node, context) => { const stringValue = getNodeValue(node); const componentNames = getComponentNames(node, context); + + const propertyName = + node.type === AST_NODE_TYPES.Property && node.key.type === AST_NODE_TYPES.Identifier ? String(node.key.name) : null; + const words = stringValue .trim() .replace(/[^\a-zA-Z\s]/g, '') @@ -185,14 +201,14 @@ const getI18nKey = (node, context) => { kebabString = [potentialId, propName, kebabString].filter(Boolean).join('-'); } - const fullPrefix = [prefixFromFilePath, ...componentNames, kebabString].filter(Boolean).join('.'); + const fullPrefix = [prefixFromFilePath, ...componentNames, propertyName, kebabString].filter(Boolean).join('.'); return fullPrefix; }; /** * Gets component names from ancestors - * @param {JSXAttribute|JSXText} node The node + * @param {JSXAttribute|JSXText|Property} node The node * @param {RuleContextWithOptions} context * @returns {string[]} The component names */ @@ -218,13 +234,22 @@ function getComponentNames(node, context) { } /** - * Checks if a method has a variable declaration of `t` + * For a given node, check the scope and find a variable declaration of `t` + * @param {Node} node + * @param {RuleContextWithOptions} context + */ +function getTDeclaration(node, context) { + return context.sourceCode.getScope(node).variables.find((v) => v.name === 't'); +} + +/** + * Checks if a node has a variable declaration of `t` * that came from a `useTranslate` call - * @param {Node} method The node + * @param {Node} node The node * @param {RuleContextWithOptions} context */ -function methodHasUseTranslate(method, context) { - const tDeclaration = method ? context.sourceCode.getScope(method).variables.find((v) => v.name === 't') : null; +function methodHasUseTranslate(node, context) { + const tDeclaration = getTDeclaration(node, context); return ( tDeclaration && tDeclaration.defs.find((definition) => { @@ -243,7 +268,7 @@ function methodHasUseTranslate(method, context) { /** * Gets the import fixer for a node - * @param {JSXElement|JSXFragment|JSXAttribute} node + * @param {JSXElement|JSXFragment|JSXAttribute|Property} node * @param {RuleFixer} fixer The fixer * @param {'Trans'|'t'|'useTranslate'} importName The member to import from either `@grafana/i18n` or `@grafana/i18n/internal` * @param {RuleContextWithOptions} context @@ -337,7 +362,7 @@ const firstCharIsUpper = (str) => { }; /** - * @param {JSXAttribute} node + * @param {JSXAttribute|Property} node * @param {RuleFixer} fixer * @param {RuleContextWithOptions} context * @returns {import('@typescript-eslint/utils/ts-eslint').RuleFix|undefined} The fix @@ -380,9 +405,10 @@ const getUseTranslateFixer = (node, fixer, context) => { if (!returnStatementIsJsx) { return; } + const tDeclarationExists = getTDeclaration(parentMethod, context); const useTranslateExists = methodHasUseTranslate(parentMethod, context); - if (useTranslateExists) { + if (tDeclarationExists && useTranslateExists) { return; } @@ -396,7 +422,7 @@ const getUseTranslateFixer = (node, fixer, context) => { }; /** - * @param {JSXAttribute} node + * @param {JSXAttribute|Property} node * @param {RuleContextWithOptions} context * @returns {(fixer: RuleFixer) => import('@typescript-eslint/utils/ts-eslint').RuleFix[]} */ @@ -406,9 +432,13 @@ const getTFixers = (node, context) => (fixer) => { const value = getNodeValue(node); const wrappingQuotes = value.includes('"') ? "'" : '"'; - fixes.push( - fixer.replaceText(node, `${node.name.name}={t("${i18nKey}", ${wrappingQuotes}${value}${wrappingQuotes})}`) - ); + if (node.type === AST_NODE_TYPES.Property) { + fixes.push(fixer.replaceText(node.value, `t("${i18nKey}", ${wrappingQuotes}${value}${wrappingQuotes})`)); + } else { + fixes.push( + fixer.replaceText(node, `${node.name.name}={t("${i18nKey}", ${wrappingQuotes}${value}${wrappingQuotes})}`) + ); + } // Check if we need to add `useTranslate` to the node const useTranslateFixer = getUseTranslateFixer(node, fixer, context); @@ -428,11 +458,19 @@ const getTFixers = (node, context) => (fixer) => { /** * Gets the value of a node - * @param {JSXAttribute|JSXText|JSXElement|JSXFragment|JSXChild} node The node + * @param {JSXAttribute|JSXText|JSXElement|JSXFragment|JSXChild|Property} node The node * @returns {string} The node value */ function getNodeValue(node) { - if (node.type === AST_NODE_TYPES.JSXAttribute && node.value?.type === AST_NODE_TYPES.Literal) { + if ( + (node.type === AST_NODE_TYPES.JSXAttribute || node.type === AST_NODE_TYPES.Property) && + node.value?.type === AST_NODE_TYPES.Literal + ) { + // TODO: Update this to return bool/number values and handle the type issues elsewhere + // For now, we'll just return an empty string so we consider any numbers or booleans as not being issues + if (typeof node.value.value === 'boolean' || typeof node.value.value === 'number') { + return ''; + } return String(node.value.value) || ''; } if (node.type === AST_NODE_TYPES.JSXText) { diff --git a/packages/grafana-i18n/src/i18n.test.tsx b/packages/grafana-i18n/src/i18n.test.tsx new file mode 100644 index 00000000000..d8212cc5f8e --- /dev/null +++ b/packages/grafana-i18n/src/i18n.test.tsx @@ -0,0 +1,168 @@ +/* eslint-disable no-restricted-imports */ +import i18n from 'i18next'; +import { initReactI18next, setDefaults, setI18n } from 'react-i18next'; + +import { DEFAULT_LANGUAGE } from './constants'; +import { + loadPluginResources, + initDefaultI18nInstance, + initDefaultReactI18nInstance, + initPluginTranslations, +} from './i18n'; +import { ResourceLoader } from './types'; + +jest.mock('react-i18next', () => ({ + getI18n: () => i18n, + setDefaults: jest.fn(), + setI18n: jest.fn(), +})); + +describe('i18n', () => { + beforeEach(() => { + jest.resetAllMocks(); + }); + + describe('loadPluginResources', () => { + it('should load all resources for a plugin', async () => { + const loaders: ResourceLoader[] = [ + () => Promise.resolve({ hello: 'Hi' }), + () => Promise.resolve({ i18n: 'i18n' }), + ]; + const addResourceBundleSpy = jest.spyOn(i18n, 'addResourceBundle'); + + await loadPluginResources('test', 'en-US', loaders); + + expect(addResourceBundleSpy).toHaveBeenCalledTimes(2); + expect(addResourceBundleSpy).toHaveBeenNthCalledWith(1, 'en-US', 'test', { hello: 'Hi' }, true, false); + expect(addResourceBundleSpy).toHaveBeenNthCalledWith(2, 'en-US', 'test', { i18n: 'i18n' }, true, false); + }); + + it('should load all resources for a plugin even if a loader throws', async () => { + const loaders: ResourceLoader[] = [ + () => Promise.reject({ hello: 'Hi' }), + () => Promise.resolve({ i18n: 'i18n' }), + ]; + jest.spyOn(console, 'error').mockImplementation(); + const addResourceBundleSpy = jest.spyOn(i18n, 'addResourceBundle'); + + await loadPluginResources('test', 'en-US', loaders); + + expect(addResourceBundleSpy).toHaveBeenCalledTimes(1); + expect(addResourceBundleSpy).toHaveBeenCalledWith('en-US', 'test', { i18n: 'i18n' }, true, false); + }); + + it('should not load resources if no loaders are provided', async () => { + const loaders: ResourceLoader[] = []; + const addResourceBundleSpy = jest.spyOn(i18n, 'addResourceBundle'); + + await loadPluginResources('test', 'en-US', loaders); + + expect(addResourceBundleSpy).toHaveBeenCalledTimes(0); + }); + }); + + describe('initDefaultI18nInstance', () => { + it('should not initialize the i18n instance if the resources are already initialized', async () => { + const useSpy = jest.spyOn(i18n, 'use').mockImplementation(); + const initSpy = jest.spyOn(i18n, 'init').mockImplementation(); + + await initDefaultI18nInstance(); + + expect(useSpy).not.toHaveBeenCalled(); // not called because the resources are already initialized in public/test/setupTests.ts + expect(initSpy).not.toHaveBeenCalled(); // not called because the resources are already initialized in public/test/setupTests.ts + }); + + it('should initialize the i18n instance if the resources are not initialized', async () => { + jest.replaceProperty(i18n, 'options', { resources: undefined }); + const useSpy = jest.spyOn(i18n, 'use').mockImplementation(() => i18n); + const initSpy = jest.spyOn(i18n, 'init').mockImplementation(); + + await initDefaultI18nInstance(); + + expect(useSpy).toHaveBeenCalledTimes(1); + expect(useSpy).toHaveBeenCalledWith(initReactI18next); + expect(initSpy).toHaveBeenCalledTimes(1); + expect(initSpy).toHaveBeenCalledWith({ + resources: {}, + returnEmptyString: false, + lng: DEFAULT_LANGUAGE, + }); + }); + }); + + describe('initDefaultReactI18nInstance', () => { + it('should not initialize the react i18n instance if the react options are already initialized', async () => { + jest.replaceProperty(i18n, 'options', { react: {} }); + + initDefaultReactI18nInstance(); + + expect(setDefaults).not.toHaveBeenCalled(); + expect(setI18n).not.toHaveBeenCalled(); + }); + + it('should initialize the react i18n instance if the react options are not initialized', async () => { + jest.replaceProperty(i18n, 'options', { react: undefined }); + + initDefaultReactI18nInstance(); + + expect(setDefaults).toHaveBeenCalledTimes(1); + expect(setDefaults).toHaveBeenCalledWith({}); + expect(setI18n).toHaveBeenCalledTimes(1); + expect(setI18n).toHaveBeenCalledWith(i18n); + }); + }); + + describe('initPluginTranslations', () => { + it('should not initialize the i18n instance and the react i18n instance if they are already initialized', async () => { + const loaders: ResourceLoader[] = [ + () => Promise.resolve({ hello: 'Hi' }), + () => Promise.resolve({ i18n: 'i18n' }), + ]; + const addResourceBundleSpy = jest.spyOn(i18n, 'addResourceBundle'); + const useSpy = jest.spyOn(i18n, 'use').mockImplementation(); + const initSpy = jest.spyOn(i18n, 'init').mockImplementation(); + jest.replaceProperty(i18n, 'options', { react: {}, resources: {} }); + + const { language } = await initPluginTranslations('test', loaders); + + expect(language).toBe('en-US'); + expect(useSpy).not.toHaveBeenCalled(); + expect(initSpy).not.toHaveBeenCalled(); + expect(setDefaults).not.toHaveBeenCalled(); + expect(setI18n).not.toHaveBeenCalled(); + expect(addResourceBundleSpy).toHaveBeenCalledTimes(2); + expect(addResourceBundleSpy).toHaveBeenNthCalledWith(1, 'en-US', 'test', { hello: 'Hi' }, true, false); + expect(addResourceBundleSpy).toHaveBeenNthCalledWith(2, 'en-US', 'test', { i18n: 'i18n' }, true, false); + }); + + it('should initialize the i18n instance and the react i18n instance if they are not initialized', async () => { + const loaders: ResourceLoader[] = [ + () => Promise.resolve({ hello: 'Hi' }), + () => Promise.resolve({ i18n: 'i18n' }), + ]; + const addResourceBundleSpy = jest.spyOn(i18n, 'addResourceBundle'); + const useSpy = jest.spyOn(i18n, 'use').mockImplementation(() => i18n); + const initSpy = jest.spyOn(i18n, 'init').mockImplementation(); + jest.replaceProperty(i18n, 'options', { react: undefined, resources: undefined }); + + const { language } = await initPluginTranslations('test', loaders); + + expect(language).toBe('en-US'); + expect(useSpy).toHaveBeenCalledTimes(1); + expect(useSpy).toHaveBeenCalledWith(initReactI18next); + expect(initSpy).toHaveBeenCalledTimes(1); + expect(initSpy).toHaveBeenCalledWith({ + resources: {}, + returnEmptyString: false, + lng: DEFAULT_LANGUAGE, + }); + expect(setDefaults).toHaveBeenCalledTimes(1); + expect(setDefaults).toHaveBeenCalledWith({}); + expect(setI18n).toHaveBeenCalledTimes(1); + expect(setI18n).toHaveBeenCalledWith(i18n); + expect(addResourceBundleSpy).toHaveBeenCalledTimes(2); + expect(addResourceBundleSpy).toHaveBeenNthCalledWith(1, 'en-US', 'test', { hello: 'Hi' }, true, false); + expect(addResourceBundleSpy).toHaveBeenNthCalledWith(2, 'en-US', 'test', { i18n: 'i18n' }, true, false); + }); + }); +}); diff --git a/packages/grafana-i18n/src/i18n.tsx b/packages/grafana-i18n/src/i18n.tsx index 4afa54bb0f5..8aeb19681ec 100644 --- a/packages/grafana-i18n/src/i18n.tsx +++ b/packages/grafana-i18n/src/i18n.tsx @@ -1,4 +1,4 @@ -import i18n, { InitOptions, ReactOptions, TFunction } from 'i18next'; +import i18n, { InitOptions, ReactOptions, TFunction as I18NextTFunction } from 'i18next'; import LanguageDetector, { DetectorOptions } from 'i18next-browser-languagedetector'; // eslint-disable-next-line no-restricted-imports import { initReactI18next, setDefaults, setI18n, Trans as I18NextTrans, getI18n } from 'react-i18next'; @@ -6,32 +6,66 @@ import { initReactI18next, setDefaults, setI18n, Trans as I18NextTrans, getI18n import { DEFAULT_LANGUAGE, PSEUDO_LOCALE } from './constants'; import { initRegionalFormat } from './dates'; import { LANGUAGES } from './languages'; -import { TransProps, TransType } from './types'; +import { ResourceLoader, Resources, TFunction, TransProps, TransType } from './types'; -let tFunc: TFunction | undefined; +let tFunc: I18NextTFunction | undefined; let transComponent: TransType; -export async function initPluginTranslations(id: string) { +// exported for testing +export async function loadPluginResources(id: string, language: string, loaders?: ResourceLoader[]) { + if (!loaders?.length) { + return; + } + + return Promise.all( + loaders.map(async (loader) => { + try { + const resources = await loader(language); + addResourceBundle(language, id, resources); + } catch (error) { + console.error(`Error loading resources for plugin ${id} and language: ${language}`, error); + } + }) + ); +} + +// exported for testing +export async function initDefaultI18nInstance() { // If the resources are not an object, we need to initialize the plugin translations - if (!getI18nInstance().options?.resources || typeof getI18nInstance().options.resources !== 'object') { - await getI18nInstance().use(initReactI18next).init({ - resources: {}, - returnEmptyString: false, - lng: DEFAULT_LANGUAGE, // this should be the locale of the phrases in our source JSX - }); + if (getI18nInstance().options?.resources && typeof getI18nInstance().options.resources === 'object') { + return; } + await getI18nInstance().use(initReactI18next).init({ + resources: {}, + returnEmptyString: false, + lng: DEFAULT_LANGUAGE, // this should be the locale of the phrases in our source JSX + }); +} + +// exported for testing +export function initDefaultReactI18nInstance() { // If the initReactI18next is not set, we need to set them - if (!getI18n()?.options?.react) { - const options: ReactOptions = {}; - setDefaults(options); - setI18n(getI18nInstance()); + if (getI18n()?.options?.react) { + return; } + const options: ReactOptions = {}; + setDefaults(options); + setI18n(getI18nInstance()); +} + +export async function initPluginTranslations(id: string, loaders?: ResourceLoader[]) { + await initDefaultI18nInstance(); + initDefaultReactI18nInstance(); + + const language = getResolvedLanguage(); tFunc = getI18nInstance().getFixedT(null, id); transComponent = (props: TransProps) => ; - return { language: getI18nInstance().resolvedLanguage }; + await loadPluginResources(id, language, loaders); + + return { language }; } export function getI18nInstance() { @@ -103,7 +137,7 @@ async function initTranslations({ transComponent = (props: TransProps) => ; return { - language: getI18nInstance().resolvedLanguage, + language: getResolvedLanguage(), }; } @@ -132,15 +166,11 @@ export async function initializeI18n( return initTranslations({ language, ns, module }); } -type ResourceKey = string; -type ResourceLanguage = Record; -type ResourceType = Record; - -export function addResourceBundle(language: string, namespace: string, resource: ResourceType) { - getI18nInstance().addResourceBundle(language, namespace, resource, undefined, true); +export function addResourceBundle(language: string, namespace: string, resources: Resources) { + getI18nInstance().addResourceBundle(language, namespace, resources, true, false); } -export function t(id: string, defaultMessage: string, values?: Record) { +export const t: TFunction = (id: string, defaultMessage: string, values?: Record) => { if (!tFunc) { if (process.env.NODE_ENV !== 'test') { console.warn( @@ -156,7 +186,7 @@ export function t(id: string, defaultMessage: string, values?: Record) => string; + +/** + * Type for the resources object + */ +interface Resources extends Record {} + +/** + * Type for the resource loader function + * @param resolvedLanguage - The resolved language to load resources for + * @returns A promise that resolves to the resources + */ +type ResourceLoader = (resolvedLanguage: string) => Promise; + +export type { ResourceLoader, Resources, TransProps, TransType, TFunction, UseTranslateHook }; diff --git a/packages/grafana-prometheus/package.json b/packages/grafana-prometheus/package.json index 9c405e0a136..3f7159a55ca 100644 --- a/packages/grafana-prometheus/package.json +++ b/packages/grafana-prometheus/package.json @@ -39,7 +39,7 @@ }, "dependencies": { "@emotion/css": "11.13.5", - "@floating-ui/react": "0.27.8", + "@floating-ui/react": "0.27.9", "@grafana/data": "12.1.0-pre", "@grafana/e2e-selectors": "12.1.0-pre", "@grafana/plugin-ui": "0.10.6", @@ -51,7 +51,7 @@ "@lezer/common": "1.2.3", "@lezer/highlight": "1.2.1", "@lezer/lr": "1.4.2", - "@prometheus-io/lezer-promql": "0.301.0", + "@prometheus-io/lezer-promql": "0.304.0", "@reduxjs/toolkit": "2.5.1", "@types/debounce-promise": "3.1.9", "@types/lodash": "4.17.15", diff --git a/packages/grafana-prometheus/src/utf8_support.ts b/packages/grafana-prometheus/src/utf8_support.ts index a9ce776364b..a6c19ff2750 100644 --- a/packages/grafana-prometheus/src/utf8_support.ts +++ b/packages/grafana-prometheus/src/utf8_support.ts @@ -1,3 +1,17 @@ +/** + * Ensures a string is compatible with Prometheus' UTF-8 handling rules. + * + * Prometheus has specific rules for handling UTF-8 strings in metric names and label values: + * - Legacy names (matching pattern [a-zA-Z_:][a-zA-Z0-9_:]*) are used as-is + * - Non-legacy names containing UTF-8 characters must be wrapped in double quotes + * + * @param value - The string to make UTF-8 compatible + * @returns The original string if it's empty or a valid legacy name, otherwise the string wrapped in double quotes + * + * @example + * utf8Support('metric_name') // returns 'metric_name' + * utf8Support('metric-📈') // returns '"metric-📈"' + */ export const utf8Support = (value: string) => { if (value === '') { return value; @@ -9,6 +23,22 @@ export const utf8Support = (value: string) => { return `"${value}"`; }; +/** + * Escapes a string to make it compatible with Prometheus UTF-8 support. + * + * This function converts non-legacy name characters to an escaped format: + * - Underscores are doubled as '__' + * - Valid legacy runes are preserved as-is + * - Invalid code points are replaced with '_FFFD_' + * - Other characters are converted to '_HEX_' format where HEX is the hexadecimal code point + * + * @param value - The string to escape + * @returns An escaped string prefixed with 'U__' that is compatible with Prometheus + * + * @example + * escapeForUtf8Support("my lovely_http.status:sum") // returns U__my_20_lovely__http_2e_status:sum + * escapeForUtf8Support("label with 😱") // returns U__label_20_with_20__1f631_ + */ export const escapeForUtf8Support = (value: string) => { const isLegacyLabel = isValidLegacyName(value); if (isLegacyLabel) { @@ -42,6 +72,16 @@ export const escapeForUtf8Support = (value: string) => { return escaped; }; +/** + * Checks if a string is a valid legacy (the standard) Prometheus metric or label name. + * + * Valid legacy (the standard) names match the pattern [a-zA-Z_:][a-zA-Z0-9_:]* which means: + * - First character must be a letter, underscore, or colon + * - Remaining characters can only be letters, numbers, underscores, or colons + * + * @param name - The string to check + * @returns true if the string is a valid legacy (the standard) name, false otherwise + */ export const isValidLegacyName = (name: string): boolean => { if (name.length === 0) { return false; @@ -57,9 +97,17 @@ export const isValidLegacyName = (name: string): boolean => { return true; }; -// const labelNamePriorToUtf8Support = /^[a-zA-Z_:][a-zA-Z0-9_:]*$/; -// instead of regex we use rune check (converted from prometheus code) -// https://github.com/prometheus/common/blob/main/model/metric.go#L426-L428 +/** + * Checks if a character is valid for a legacy (the standard) Prometheus metric or label name. + * + * This is an implementation of the Prometheus model rune validation logic, which + * determines if a character is allowed in a legacy metric or label name. + * https://github.com/prometheus/common/blob/v0.64.0/model/metric.go#L430-L432 + * + * @param char - The character to check + * @param index - The position of the character in the string + * @returns true if the character is valid at the given position, false otherwise + */ const isValidLegacyRune = (char: string, index: number): boolean => { const codePoint = char.codePointAt(0); if (codePoint === undefined) { @@ -75,11 +123,26 @@ const isValidLegacyRune = (char: string, index: number): boolean => { ); }; +/** + * Validates if a Unicode code point is valid for UTF-8 encoding. + * + * @param codePoint - The Unicode code point to validate + * @returns true if the code point is valid (between 0 and 0x10FFFF), false otherwise + */ const isValidCodePoint = (codePoint: number): boolean => { - // Validate the code point for UTF-8 compliance if needed. return codePoint >= 0 && codePoint <= 0x10ffff; }; +/** + * Wraps each key in a Prometheus filter string with UTF-8 support. + * + * This function processes a filter string (e.g. 'metric="value",name=~"pattern"') + * and applies UTF-8 support to each key while preserving the operators and values. + * It handles quoted values and comma separators correctly. + * + * @param filterStr - The filter string to process + * @returns A new filter string with UTF-8 support applied to the keys + */ export const wrapUtf8Filters = (filterStr: string): string => { const resultArray: string[] = []; const operatorRegex = /(=~|!=|!~|=)/; // NOTE: the order of the operators is important here diff --git a/packages/grafana-runtime/src/utils/DataSourceWithBackend.ts b/packages/grafana-runtime/src/utils/DataSourceWithBackend.ts index a40272f8a44..d9ed30eee0a 100644 --- a/packages/grafana-runtime/src/utils/DataSourceWithBackend.ts +++ b/packages/grafana-runtime/src/utils/DataSourceWithBackend.ts @@ -122,7 +122,7 @@ class DataSourceWithBackend< TQuery extends DataQuery = DataQuery, TOptions extends DataSourceJsonData = DataSourceJsonData, > extends DataSourceApi { - protected userStorage: UserStorage; + userStorage: UserStorage; constructor(instanceSettings: DataSourceInstanceSettings) { super(instanceSettings); diff --git a/packages/grafana-runtime/src/utils/userStorage.tsx b/packages/grafana-runtime/src/utils/userStorage.tsx index 466bb5e8e7e..1bdb7cf68a2 100644 --- a/packages/grafana-runtime/src/utils/userStorage.tsx +++ b/packages/grafana-runtime/src/utils/userStorage.tsx @@ -1,7 +1,7 @@ import { get } from 'lodash'; import { lastValueFrom } from 'rxjs'; -import { usePluginContext } from '@grafana/data'; +import { usePluginContext, type UserStorage as UserStorageType } from '@grafana/data'; import { config } from '../config'; import { BackendSrvRequest, getBackendSrv } from '../services'; @@ -40,7 +40,7 @@ async function apiRequest(requestOptions: RequestOptions) { * A class for interacting with the backend user storage. * Exposed internally only to avoid misuse (wrong service name).. */ -export class UserStorage { +export class UserStorage implements UserStorageType { private service: string; private resourceName: string; private userUID: string; @@ -141,21 +141,8 @@ export class UserStorage { } } -export interface PluginUserStorage { - /** - * Retrieves an item from the backend user storage or local storage if not enabled. - * @param key - The key of the item to retrieve. - * @returns A promise that resolves to the item value or null if not found. - */ - getItem(key: string): Promise; - /** - * Sets an item in the backend user storage or local storage if not enabled. - * @param key - The key of the item to set. - * @param value - The value of the item to set. - * @returns A promise that resolves when the item is set. - */ - setItem(key: string, value: string): Promise; -} +// This is a type alias to avoid breaking changes +export interface PluginUserStorage extends UserStorageType {} /** * A hook for interacting with the backend user storage (or local storage if not enabled). diff --git a/packages/grafana-schema/src/raw/composable/grafanapyroscope/dataquery/x/GrafanaPyroscopeDataQuery_types.gen.ts b/packages/grafana-schema/src/raw/composable/grafanapyroscope/dataquery/x/GrafanaPyroscopeDataQuery_types.gen.ts index 756f2c575cc..f323c53b037 100644 --- a/packages/grafana-schema/src/raw/composable/grafanapyroscope/dataquery/x/GrafanaPyroscopeDataQuery_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/grafanapyroscope/dataquery/x/GrafanaPyroscopeDataQuery_types.gen.ts @@ -17,6 +17,10 @@ export type PyroscopeQueryType = ('metrics' | 'profile' | 'both'); export const defaultPyroscopeQueryType: PyroscopeQueryType = 'both'; export interface GrafanaPyroscopeDataQuery extends common.DataQuery { + /** + * If set to true, the response will contain annotations + */ + annotations?: boolean; /** * Allows to group the results. */ diff --git a/packages/grafana-schema/src/raw/composable/logs/panelcfg/x/LogsPanelCfg_types.gen.ts b/packages/grafana-schema/src/raw/composable/logs/panelcfg/x/LogsPanelCfg_types.gen.ts index d8b98890e5e..6b5361f74e1 100644 --- a/packages/grafana-schema/src/raw/composable/logs/panelcfg/x/LogsPanelCfg_types.gen.ts +++ b/packages/grafana-schema/src/raw/composable/logs/panelcfg/x/LogsPanelCfg_types.gen.ts @@ -19,6 +19,7 @@ export interface Options { enableInfiniteScrolling?: boolean; enableLogDetails: boolean; isFilterLabelActive?: unknown; + logLineMenuCustomItems?: unknown; logRowMenuIconsAfter?: unknown; logRowMenuIconsBefore?: unknown; /** diff --git a/packages/grafana-schema/src/schema/dashboard/v2_examples.ts b/packages/grafana-schema/src/schema/dashboard/v2_examples.ts index 446936890db..4bf078783cb 100644 --- a/packages/grafana-schema/src/schema/dashboard/v2_examples.ts +++ b/packages/grafana-schema/src/schema/dashboard/v2_examples.ts @@ -202,60 +202,6 @@ export const handyTestingSchema: Spec = { }, }, }, - 'panel-3': { - kind: 'Panel', - spec: { - data: { - kind: 'QueryGroup', - spec: { - queries: [ - { - kind: 'PanelQuery', - spec: { - refId: 'A', - datasource: { - type: 'prometheus', - uid: 'datasource1', - }, - query: { - kind: 'prometheus', - spec: { - expr: 'test-query', - }, - }, - hidden: false, - }, - }, - ], - queryOptions: { - timeFrom: '1h', - maxDataPoints: 100, - timeShift: '1h', - queryCachingTTL: 60, - interval: '1m', - cacheTimeout: '1m', - hideTimeOverride: false, - }, - transformations: [], - }, - }, - description: 'Test Description', - links: [], - title: 'Test Panel 3', - id: 3, - vizConfig: { - kind: 'timeseries', - spec: { - fieldConfig: { - defaults: {}, - overrides: [], - }, - options: {}, - pluginVersion: '7.0.0', - }, - }, - }, - }, }, layout: { kind: 'GridLayout', @@ -292,30 +238,6 @@ export const handyTestingSchema: Spec = { y: 2, }, }, - { - kind: 'GridLayoutRow', - spec: { - y: 20, - collapsed: false, - title: 'Row 1', - repeat: { value: 'customVar', mode: 'variable' }, - elements: [ - { - kind: 'GridLayoutItem', - spec: { - element: { - kind: 'ElementReference', - name: 'panel-3', - }, - height: 10, - width: 10, - x: 0, - y: 0, - }, - }, - ], - }, - }, ], }, }, diff --git a/packages/grafana-schema/src/schema/dashboard/v2alpha0/dashboard.schema.cue b/packages/grafana-schema/src/schema/dashboard/v2alpha0/dashboard.schema.cue index 73faa5df734..3f1f40287cc 100644 --- a/packages/grafana-schema/src/schema/dashboard/v2alpha0/dashboard.schema.cue +++ b/packages/grafana-schema/src/schema/dashboard/v2alpha0/dashboard.schema.cue @@ -518,21 +518,8 @@ GridLayoutItemKind: { spec: GridLayoutItemSpec } -GridLayoutRowKind: { - kind: "GridLayoutRow" - spec: GridLayoutRowSpec -} - -GridLayoutRowSpec: { - y: int - collapsed: bool - title: string - elements: [...GridLayoutItemKind] // Grid items in the row will have their Y value be relative to the rows Y value. This means a panel positioned at Y: 0 in a row with Y: 10 will be positioned at Y: 11 (row header has a heigh of 1) in the dashboard. - repeat?: RowRepeatOptions -} - GridLayoutSpec: { - items: [...GridLayoutItemKind | GridLayoutRowKind] + items: [...GridLayoutItemKind] } GridLayoutKind: { diff --git a/packages/grafana-schema/src/schema/dashboard/v2alpha0/types.gen.ts b/packages/grafana-schema/src/schema/dashboard/v2alpha0/types.gen.ts index a4d966c654a..d38a6693ac9 100644 --- a/packages/grafana-schema/src/schema/dashboard/v2alpha0/types.gen.ts +++ b/packages/grafana-schema/src/schema/dashboard/v2alpha0/types.gen.ts @@ -609,7 +609,7 @@ export const defaultGridLayoutKind = (): GridLayoutKind => ({ }); export interface GridLayoutSpec { - items: (GridLayoutItemKind | GridLayoutRowKind)[]; + items: GridLayoutItemKind[]; } export const defaultGridLayoutSpec = (): GridLayoutSpec => ({ @@ -669,42 +669,6 @@ export const defaultRepeatOptions = (): RepeatOptions => ({ // other repeat modes will be added in the future: label, frame export const RepeatMode = "variable"; -export interface GridLayoutRowKind { - kind: "GridLayoutRow"; - spec: GridLayoutRowSpec; -} - -export const defaultGridLayoutRowKind = (): GridLayoutRowKind => ({ - kind: "GridLayoutRow", - spec: defaultGridLayoutRowSpec(), -}); - -export interface GridLayoutRowSpec { - y: number; - collapsed: boolean; - title: string; - // Grid items in the row will have their Y value be relative to the rows Y value. This means a panel positioned at Y: 0 in a row with Y: 10 will be positioned at Y: 11 (row header has a heigh of 1) in the dashboard. - elements: GridLayoutItemKind[]; - repeat?: RowRepeatOptions; -} - -export const defaultGridLayoutRowSpec = (): GridLayoutRowSpec => ({ - y: 0, - collapsed: false, - title: "", - elements: [], -}); - -export interface RowRepeatOptions { - mode: "variable"; - value: string; -} - -export const defaultRowRepeatOptions = (): RowRepeatOptions => ({ - mode: RepeatMode, - value: "", -}); - export interface RowsLayoutKind { kind: "RowsLayout"; spec: RowsLayoutSpec; @@ -747,6 +711,16 @@ export const defaultRowsLayoutRowSpec = (): RowsLayoutRowSpec => ({ layout: defaultGridLayoutKind(), }); +export interface RowRepeatOptions { + mode: "variable"; + value: string; +} + +export const defaultRowRepeatOptions = (): RowRepeatOptions => ({ + mode: RepeatMode, + value: "", +}); + export interface ConditionalRenderingGroupKind { kind: "ConditionalRenderingGroup"; spec: ConditionalRenderingGroupSpec; diff --git a/packages/grafana-schema/src/schema/dashboard/v2alpha1/types.spec.gen.ts b/packages/grafana-schema/src/schema/dashboard/v2alpha1/types.spec.gen.ts index 33e7f2ed0b8..5719f2da797 100644 --- a/packages/grafana-schema/src/schema/dashboard/v2alpha1/types.spec.gen.ts +++ b/packages/grafana-schema/src/schema/dashboard/v2alpha1/types.spec.gen.ts @@ -564,7 +564,7 @@ export const defaultGridLayoutKind = (): GridLayoutKind => ({ }); export interface GridLayoutSpec { - items: (GridLayoutItemKind | GridLayoutRowKind)[]; + items: GridLayoutItemKind[]; } export const defaultGridLayoutSpec = (): GridLayoutSpec => ({ @@ -624,42 +624,6 @@ export const defaultRepeatOptions = (): RepeatOptions => ({ // other repeat modes will be added in the future: label, frame export const RepeatMode = "variable"; -export interface GridLayoutRowKind { - kind: "GridLayoutRow"; - spec: GridLayoutRowSpec; -} - -export const defaultGridLayoutRowKind = (): GridLayoutRowKind => ({ - kind: "GridLayoutRow", - spec: defaultGridLayoutRowSpec(), -}); - -export interface GridLayoutRowSpec { - y: number; - collapsed: boolean; - title: string; - // Grid items in the row will have their Y value be relative to the rows Y value. This means a panel positioned at Y: 0 in a row with Y: 10 will be positioned at Y: 11 (row header has a heigh of 1) in the dashboard. - elements: GridLayoutItemKind[]; - repeat?: RowRepeatOptions; -} - -export const defaultGridLayoutRowSpec = (): GridLayoutRowSpec => ({ - y: 0, - collapsed: false, - title: "", - elements: [], -}); - -export interface RowRepeatOptions { - mode: "variable"; - value: string; -} - -export const defaultRowRepeatOptions = (): RowRepeatOptions => ({ - mode: RepeatMode, - value: "", -}); - export interface RowsLayoutKind { kind: "RowsLayout"; spec: RowsLayoutSpec; @@ -782,6 +746,16 @@ export const defaultConditionalRenderingTimeRangeSizeSpec = (): ConditionalRende value: "", }); +export interface RowRepeatOptions { + mode: "variable"; + value: string; +} + +export const defaultRowRepeatOptions = (): RowRepeatOptions => ({ + mode: RepeatMode, + value: "", +}); + export interface AutoGridLayoutKind { kind: "AutoGridLayout"; spec: AutoGridLayoutSpec; diff --git a/packages/grafana-sql/src/components/configuration/ConnectionLimits.tsx b/packages/grafana-sql/src/components/configuration/ConnectionLimits.tsx index 50bc7e82ae7..351523bd223 100644 --- a/packages/grafana-sql/src/components/configuration/ConnectionLimits.tsx +++ b/packages/grafana-sql/src/components/configuration/ConnectionLimits.tsx @@ -5,6 +5,8 @@ import { Field, Icon, InlineLabel, Label, Stack, Switch, Tooltip } from '@grafan import { SQLConnectionLimits, SQLOptions } from '../../types'; +import { MaxLifetimeField } from './MaxLifetimeField'; +import { MaxOpenConnectionsField } from './MaxOpenConnectionsField'; import { NumberInput } from './NumberInput'; interface Props { @@ -84,36 +86,11 @@ export const ConnectionLimits = (props: Props) return ( - - - Max open - - The maximum number of open connections to the database. If Max idle connections is greater - than 0 and the Max open connections is less than Max idle connections, then - Max idle connections will be reduced to match the Max open connections limit. If set - to 0, there is no limit on the number of open connections. - - } - > - - - - - } - > - { - onMaxConnectionsChanged(value); - }} - width={labelWidth} - /> - + (props: Props) )} - - - Max lifetime - - The maximum amount of time in seconds a connection may be reused. If set to 0, connections are - reused forever. - - } - > - - - - - } - > - { - onJSONDataNumberChanged('connMaxLifetime')(value); - }} - width={labelWidth} - /> - + ); }; diff --git a/packages/grafana-sql/src/components/configuration/MaxLifetimeField.tsx b/packages/grafana-sql/src/components/configuration/MaxLifetimeField.tsx new file mode 100644 index 00000000000..5a4e2c93359 --- /dev/null +++ b/packages/grafana-sql/src/components/configuration/MaxLifetimeField.tsx @@ -0,0 +1,42 @@ +import { config } from '@grafana/runtime'; +import { Field, Icon, Label, Stack, Tooltip } from '@grafana/ui'; + +import { SQLOptions } from '../../types'; + +import { NumberInput } from './NumberInput'; + +interface Props { + labelWidth: number; + onMaxLifetimeChanged: (number?: number) => void; + jsonData: SQLOptions; +} +export function MaxLifetimeField({ labelWidth, onMaxLifetimeChanged, jsonData }: Props) { + return ( + + + Max lifetime + + The maximum amount of time in seconds a connection may be reused. If set to 0, connections are reused + forever. + + } + > + + + + + } + > + + + ); +} diff --git a/packages/grafana-sql/src/components/configuration/MaxOpenConnectionsField.tsx b/packages/grafana-sql/src/components/configuration/MaxOpenConnectionsField.tsx new file mode 100644 index 00000000000..7152312882c --- /dev/null +++ b/packages/grafana-sql/src/components/configuration/MaxOpenConnectionsField.tsx @@ -0,0 +1,45 @@ +import { config } from '@grafana/runtime'; +import { Field, Icon, Label, Stack, Tooltip } from '@grafana/ui'; + +import { SQLOptions } from '../../types'; + +import { NumberInput } from './NumberInput'; + +interface Props { + labelWidth: number; + onMaxConnectionsChanged: (number?: number) => void; + jsonData: SQLOptions; +} + +export function MaxOpenConnectionsField({ labelWidth, onMaxConnectionsChanged, jsonData }: Props) { + return ( + + + Max open + + The maximum number of open connections to the database. If Max idle connections is greater than + 0 and the Max open connections is less than Max idle connections, then + Max idle connections will be reduced to match the Max open connections limit. If set to + 0, there is no limit on the number of open connections. + + } + > + + + + + } + > + + + ); +} diff --git a/packages/grafana-sql/src/index.ts b/packages/grafana-sql/src/index.ts index 8b953f68d5a..d81a2bf9adf 100644 --- a/packages/grafana-sql/src/index.ts +++ b/packages/grafana-sql/src/index.ts @@ -14,6 +14,8 @@ export { COMMON_FNS, MACRO_FUNCTIONS } from './constants'; export { SqlDatasource } from './datasource/SqlDatasource'; export { formatSQL } from './utils/formatSQL'; export { ConnectionLimits } from './components/configuration/ConnectionLimits'; +export { MaxLifetimeField } from './components/configuration/MaxLifetimeField'; +export { MaxOpenConnectionsField } from './components/configuration/MaxOpenConnectionsField'; export { Divider } from './components/configuration/Divider'; export { TLSSecretsConfig } from './components/configuration/TLSSecretsConfig'; export { useMigrateDatabaseFields } from './components/configuration/useMigrateDatabaseFields'; diff --git a/packages/grafana-ui/package.json b/packages/grafana-ui/package.json index 3e8f2bfb31f..4281228e86e 100644 --- a/packages/grafana-ui/package.json +++ b/packages/grafana-ui/package.json @@ -65,7 +65,7 @@ "@emotion/css": "11.13.5", "@emotion/react": "11.14.0", "@emotion/serialize": "1.3.3", - "@floating-ui/react": "0.27.8", + "@floating-ui/react": "0.27.9", "@grafana/data": "12.1.0-pre", "@grafana/e2e-selectors": "12.1.0-pre", "@grafana/faro-web-sdk": "^1.13.2", @@ -73,7 +73,7 @@ "@grafana/schema": "12.1.0-pre", "@hello-pangea/dnd": "17.0.0", "@leeoniya/ufuzzy": "1.0.18", - "@monaco-editor/react": "4.6.0", + "@monaco-editor/react": "4.7.0", "@popperjs/core": "2.11.8", "@react-aria/dialog": "3.5.25", "@react-aria/focus": "3.20.3", @@ -108,7 +108,7 @@ "react-calendar": "^5.1.0", "react-colorful": "5.6.1", "react-custom-scrollbars-2": "4.5.0", - "react-data-grid": "7.0.0-beta.46", + "react-data-grid": "grafana/react-data-grid#3420f7f2a9e0d707d3313ec5b143a6be53f720b5", "react-dropzone": "14.3.8", "react-highlight-words": "0.21.0", "react-hook-form": "^7.49.2", diff --git a/packages/grafana-ui/src/components/Combobox/Combobox.tsx b/packages/grafana-ui/src/components/Combobox/Combobox.tsx index be8cfad5398..6f9fd93db93 100644 --- a/packages/grafana-ui/src/components/Combobox/Combobox.tsx +++ b/packages/grafana-ui/src/components/Combobox/Combobox.tsx @@ -11,6 +11,7 @@ import { Input, Props as InputProps } from '../Input/Input'; import { Portal } from '../Portal/Portal'; import { ComboboxList } from './ComboboxList'; +import { SuffixIcon } from './SuffixIcon'; import { itemToString } from './filter'; import { getComboboxStyles, MENU_OPTION_HEIGHT, MENU_OPTION_HEIGHT_DESCRIPTION } from './getComboboxStyles'; import { ComboboxOption } from './types'; @@ -129,7 +130,6 @@ export const Combobox = (props: ComboboxProps) => autoFocus, onBlur, disabled, - loading, invalid, } = props; @@ -330,12 +330,7 @@ export const Combobox = (props: ComboboxProps) => const InputComponent = isAutoSize ? AutoSizeInput : Input; const placeholder = (isOpen ? itemToString(selectedItem) : null) || placeholderProp; - const suffixIcon = asyncLoading - ? 'spinner' - : // If it's loading, show loading icon. Otherwise, icon indicating menu state - isOpen - ? 'search' - : 'angle-down'; + const loading = props.loading || asyncLoading; const inputSuffix = ( <> @@ -357,7 +352,7 @@ export const Combobox = (props: ComboboxProps) => /> )} - + ); @@ -369,7 +364,6 @@ export const Combobox = (props: ComboboxProps) => autoFocus={autoFocus} onBlur={onBlur} disabled={disabled} - loading={loading} invalid={invalid} className={styles.input} suffix={inputSuffix} diff --git a/packages/grafana-ui/src/components/Combobox/MultiCombobox.tsx b/packages/grafana-ui/src/components/Combobox/MultiCombobox.tsx index 5fb513f0d7b..ff5e51eb87c 100644 --- a/packages/grafana-ui/src/components/Combobox/MultiCombobox.tsx +++ b/packages/grafana-ui/src/components/Combobox/MultiCombobox.tsx @@ -267,7 +267,6 @@ export const MultiCombobox = (props: MultiComboboxPro ))} {selectedItems.length > visibleItems.length && ( - {/* eslint-disable-next-line @grafana/no-untranslated-strings */} ... +
  1. - - - Cancel - - - - setShowConfirmModal(false)} /> - - - - - ); -}; - -export default withPageErrorBoundary(ImportFromDSRules); diff --git a/public/app/features/alerting/unified/components/import-to-gma/ImportToGMARules.test.tsx b/public/app/features/alerting/unified/components/import-to-gma/ImportToGMARules.test.tsx new file mode 100644 index 00000000000..40a66fd51aa --- /dev/null +++ b/public/app/features/alerting/unified/components/import-to-gma/ImportToGMARules.test.tsx @@ -0,0 +1,158 @@ +import { render } from 'test/test-utils'; +import { byLabelText, byRole } from 'testing-library-selector'; + +import { setPluginComponentsHook, setPluginLinksHook } from '@grafana/runtime'; +import { AccessControlAction } from 'app/types'; + +import { setupMswServer } from '../../mockApi'; +import { grantUserPermissions } from '../../mocks'; +import { alertingFactory } from '../../mocks/server/db'; +import { testWithFeatureToggles } from '../../test/test-utils'; + +import ImportToGMARules from './ImportToGMARules'; + +setPluginLinksHook(() => ({ links: [], isLoading: false })); +setPluginComponentsHook(() => ({ components: [], isLoading: false })); + +setupMswServer(); + +const ui = { + importSource: { + existingDatasource: byRole('radio', { name: /Import rules from existing data sources/ }), + yaml: byRole('radio', { name: /Import rules from a Prometheus YAML file./ }), + }, + dsImport: { + dsPicker: byLabelText('Data source'), + mimirDsOption: byRole('button', { name: /Mimir Prometheus$/ }), + }, + yamlImport: { + fileUpload: byLabelText('Upload file'), + targetDataSource: byLabelText(/Target data source/, { selector: '#yaml-target-data-source' }), + }, + additionalSettings: { + targetFolder: byRole('button', { name: /Select folder/ }), + namespaceFilter: byRole('combobox', { name: /^Namespace/ }), + ruleGroupFilter: byRole('combobox', { name: /^Group/ }), + // There is a bug affecting using byRole selector. The bug has been fixed but we use older version of the library. + // https://github.com/testing-library/dom-testing-library/issues/1101#issuecomment-2001928377 + pauseAlertingRules: byLabelText('Pause imported alerting rules', { selector: '#pause-alerting-rules' }), + pauseRecordingRules: byLabelText('Pause imported recording rules', { selector: '#pause-recording-rules' }), + targetDataSourceForRecording: byLabelText(/Target data source/, { + selector: '#recording-rules-target-data-source', + }), + }, + importButton: byRole('button', { name: /Import/ }), + confirmationModal: byRole('dialog', { name: /Confirm import/ }), +}; + +alertingFactory.dataSource.mimir().build({ meta: { alerting: true } }); + +describe('ImportToGMARules', () => { + grantUserPermissions([AccessControlAction.AlertingRuleExternalRead, AccessControlAction.AlertingRuleCreate]); + testWithFeatureToggles(['alertingImportYAMLUI', 'alertingMigrationUI']); + + it('should render the import source options', () => { + render(); + + expect(ui.importSource.existingDatasource.get()).toBeInTheDocument(); + expect(ui.importSource.yaml.get()).toBeInTheDocument(); + }); + + describe('existing datasource', () => { + it('should render datasource options', async () => { + const { user } = render(); + + await user.click(ui.dsImport.dsPicker.get()); + await user.click(await ui.dsImport.mimirDsOption.find()); + + expect(ui.dsImport.dsPicker.get()).toHaveProperty('placeholder', 'Mimir'); + }); + + it('should render additional options', async () => { + render(); + + // Test that all additional option fields are visible + expect(await ui.additionalSettings.targetFolder.find()).toBeInTheDocument(); + expect(ui.additionalSettings.namespaceFilter.get()).toBeDisabled(); + expect(ui.additionalSettings.ruleGroupFilter.get()).toBeDisabled(); + expect(ui.additionalSettings.targetDataSourceForRecording.get()).toBeInTheDocument(); + + // // Test default values for pause switches (both should be checked by default) + expect(ui.additionalSettings.pauseAlertingRules.get()).toBeChecked(); + expect(ui.additionalSettings.pauseRecordingRules.get()).toBeChecked(); + + expect(ui.yamlImport.fileUpload.query()).not.toBeInTheDocument(); + expect(ui.yamlImport.targetDataSource.query()).not.toBeInTheDocument(); + }); + + it('should show confirmation dialog when importing from data source', async () => { + const { user } = render(); + + // Select a data source + await user.click(ui.dsImport.dsPicker.get()); + await user.click(await ui.dsImport.mimirDsOption.find()); + + // Click the import button + await user.click(ui.importButton.get()); + + // Verify confirmation dialog appears + expect(await ui.confirmationModal.find()).toBeInTheDocument(); + }); + }); + + describe('yaml import', () => { + it('should render the yaml import options', async () => { + const { user } = render(); + + // Select YAML import option + await user.click(ui.importSource.yaml.get()); + + // Test that YAML-specific fields are visible + expect(await ui.yamlImport.fileUpload.find()).toBeInTheDocument(); + expect(ui.yamlImport.targetDataSource.get()).toBeInTheDocument(); + + // Test that pause switches are checked by default + expect(ui.additionalSettings.pauseAlertingRules.get()).toBeChecked(); + expect(ui.additionalSettings.pauseRecordingRules.get()).toBeChecked(); + + // Test that datasource-specific field is not visible + expect(ui.dsImport.dsPicker.query()).not.toBeInTheDocument(); + }); + + it('should show confirmation dialog when importing YAML file', async () => { + const { user } = render(); + + // Select YAML import option + await user.click(ui.importSource.yaml.get()); + + // Create a simple YAML file + const yamlContent = ` +groups: + - name: example + rules: + - alert: HighRequestLatency + expr: http_request_duration_seconds > 0.5 + for: 10m + labels: + severity: page + annotations: + summary: High request latency +`; + const file = new File([yamlContent], 'test-rules.yaml', { type: 'application/x-yaml' }); + + // Upload the file + const fileInput = ui.yamlImport.fileUpload.get(); + await user.upload(fileInput, file); + + // Select target data source + await user.click(ui.yamlImport.targetDataSource.get()); + await user.click(await ui.dsImport.mimirDsOption.find()); + + // Click the import button + await user.click(ui.importButton.get()); + + // Verify confirmation dialog appears + expect(await ui.confirmationModal.find()).toBeInTheDocument(); + }); + }); +}); diff --git a/public/app/features/alerting/unified/components/import-to-gma/ImportToGMARules.tsx b/public/app/features/alerting/unified/components/import-to-gma/ImportToGMARules.tsx new file mode 100644 index 00000000000..d1518a379a2 --- /dev/null +++ b/public/app/features/alerting/unified/components/import-to-gma/ImportToGMARules.tsx @@ -0,0 +1,490 @@ +import { useState } from 'react'; +import { Controller, FormProvider, SubmitHandler, useForm, useFormContext } from 'react-hook-form'; +import { useToggle } from 'react-use'; + +import { DataSourceInstanceSettings } from '@grafana/data'; +import { Trans, useTranslate } from '@grafana/i18n'; +import { config } from '@grafana/runtime'; +import { + Box, + Button, + Collapse, + Divider, + Field, + FileUpload, + InlineField, + InlineFieldRow, + InlineSwitch, + LinkButton, + RadioButtonList, + Spinner, + Stack, + Text, +} from '@grafana/ui'; +import { NestedFolderPicker } from 'app/core/components/NestedFolderPicker/NestedFolderPicker'; +import { DataSourcePicker } from 'app/features/datasources/components/picker/DataSourcePicker'; + +import { Folder } from '../../types/rule-form'; +import { DataSourceType } from '../../utils/datasource'; +import { stringifyErrorLike } from '../../utils/misc'; +import { withPageErrorBoundary } from '../../withPageErrorBoundary'; +import { AlertingPageWrapper } from '../AlertingPageWrapper'; +import { CreateNewFolder } from '../create-folder/CreateNewFolder'; +import { CloudRulesSourcePicker } from '../rule-editor/CloudRulesSourcePicker'; + +import { ConfirmConversionModal } from './ConfirmConvertModal'; +import { NamespaceAndGroupFilter } from './NamespaceAndGroupFilter'; +import { parseYamlFileToRulerRulesConfigDTO } from './yamlToRulerConverter'; + +export interface ImportFormValues { + importSource: 'datasource' | 'yaml'; + yamlFile: File | null; + yamlImportTargetDatasourceUID?: string; + selectedDatasourceUID?: string; + selectedDatasourceName: string | null; + pauseAlertingRules: boolean; + pauseRecordingRules: boolean; + targetFolder?: Folder; + namespace?: string; + ruleGroup?: string; + targetDatasourceUID?: string; +} + +export const supportedImportTypes: string[] = [DataSourceType.Prometheus, DataSourceType.Loki]; + +const ImportToGMARules = () => { + const formAPI = useForm({ + defaultValues: { + importSource: 'datasource', + yamlFile: null, + yamlImportTargetDatasourceUID: undefined, + selectedDatasourceUID: undefined, + selectedDatasourceName: undefined, + pauseAlertingRules: true, + pauseRecordingRules: true, + targetFolder: undefined, + targetDatasourceUID: undefined, + }, + }); + const { + register, + handleSubmit, + watch, + control, + setValue, + formState: { errors, isSubmitting }, + } = formAPI; + + const [optionsShowing, toggleOptions] = useToggle(true); + const [selectedDatasourceName, importSource] = watch(['selectedDatasourceName', 'importSource']); + + const [formImportPayload, setFormImportPayload] = useState(null); + const isImportYamlEnabled = config.featureToggles.alertingImportYAMLUI; + + const { t } = useTranslate(); + const onSubmit: SubmitHandler = async (formData) => { + setFormImportPayload(formData); + }; + + const importSourceOptions: Array<{ label: string; description: string; value: 'datasource' | 'yaml' }> = [ + { + label: t('alerting.import-to-gma.source.datasource', 'Existing data source-managed rules'), + description: t('alerting.import-to-gma.source.datasource-description', 'Import rules from existing data sources'), + value: 'datasource', + }, + ]; + + if (isImportYamlEnabled) { + importSourceOptions.push({ + label: t('alerting.import-to-gma.source.yaml', 'Prometheus YAML file'), + description: t('alerting.import-to-gma.source.yaml-description', 'Import rules from a Prometheus YAML file.'), + value: 'yaml', + }); + } + + return ( + + + +
    + + + ( + setValue('importSource', value)} + options={importSourceOptions} + /> + )} + control={control} + name="importSource" + /> + + + {importSource === 'datasource' && } + + {isImportYamlEnabled && importSource === 'yaml' && ( + <> + + + + )} + {/* Optional settings */} + + + + + {t('alerting.import-to-gma.import-location-and-filters', 'Import location and filters')} + + + + + + {importSource === 'datasource' && ( + + )} + + + + + + + + {t('alerting.import-to-gma.alert-rules', 'Alert rules')} + + + + + + + + + + + + {t('alerting.import-to-gma.recording-rules', 'Recording rules')} + + + + + + + + + + + + + + + + + + + + + Cancel + + + + {formImportPayload && ( + setFormImportPayload(null)} + importPayload={formImportPayload} + /> + )} + +
    +
    +
    + ); +}; + +function YamlFileUpload() { + const { t } = useTranslate(); + const { + formState: { errors }, + } = useFormContext(); + + return ( + + + name="yamlFile" + render={({ field: { onChange, ref, ...field } }) => ( + { + const yamlFile = event.currentTarget.files?.item(0); + onChange(yamlFile); + // Crucial for allowing re-selection of the same file after external edits + event.currentTarget.value = ''; + }} + size="sm" + showFileName + accept=".yaml,.yml,.json" + /> + )} + rules={{ + required: { + value: true, + message: t('alerting.import-to-gma.yaml.required-message', 'Please select a file'), + }, + validate: async (value) => { + if (!value) { + return t('alerting.import-to-gma.yaml.required-message', 'Please select a file'); + } + try { + await parseYamlFileToRulerRulesConfigDTO(value, value.name); + return true; + } catch (error) { + return t('alerting.import-to-gma.yaml-error', 'Failed to parse YAML file: {{error}}', { + error: stringifyErrorLike(error), + }); + } + }, + }} + /> + + ); +} + +function YamlTargetDataSourceField() { + const { t } = useTranslate(); + const { + formState: { errors }, + setValue, + getValues, + } = useFormContext(); + + return ( + + + name="yamlImportTargetDatasourceUID" + render={({ field: { onChange, ref, value, ...field } }) => ( + ds.type === 'prometheus'} + onChange={(ds: DataSourceInstanceSettings) => { + setValue('yamlImportTargetDatasourceUID', ds.uid); + const recordingRulesTargetDs = getValues('targetDatasourceUID'); + if (!recordingRulesTargetDs) { + setValue('targetDatasourceUID', ds.uid); + } + }} + /> + )} + rules={{ + required: { + value: true, + message: t('alerting.import-to-gma.yaml.target-datasource-required', 'Please select a target data source'), + }, + }} + /> + + ); +} + +function TargetDataSourceForRecordingRulesField() { + const { t } = useTranslate(); + const { + control, + formState: { errors }, + setValue, + } = useFormContext(); + + return ( + + + render={({ field: { onChange, ref, ...field } }) => ( + ds.type === 'prometheus'} + onChange={(ds: DataSourceInstanceSettings) => { + setValue('targetDatasourceUID', ds.uid); + }} + /> + )} + name="targetDatasourceUID" + control={control} + rules={{ + required: { + value: true, + message: t('alerting.recording-rules.target-data-source-required', 'Please select a target data source'), + }, + }} + /> + + ); +} + +function TargetFolderField() { + const { t } = useTranslate(); + const { + control, + formState: { errors }, + setValue, + } = useFormContext(); + + return ( + + + + name="targetFolder" + render={({ field: { onChange, ref, ...field } }) => ( + + { + if (uid && title) { + setValue('targetFolder', { title, uid }); + } else { + setValue('targetFolder', undefined); + } + }} + /> + + )} + control={control} + /> + { + setValue('targetFolder', folder); + }} + /> + + + ); +} + +function DataSourceField() { + const { t } = useTranslate(); + const { + control, + formState: { errors }, + setValue, + getValues, + } = useFormContext(); + + return ( + + + name="selectedDatasourceName" + render={({ field: { onChange, ref, ...field } }) => ( + { + setValue('selectedDatasourceUID', ds.uid); + setValue('selectedDatasourceName', ds.name); + + // If we've chosen a Prometheus data source, we can set the recording rules target data source to the same as the source + const recordingRulesTargetDs = getValues('targetDatasourceUID'); + if (!recordingRulesTargetDs) { + const targetDataSourceUID = ds.type === DataSourceType.Prometheus ? ds.uid : undefined; + setValue('targetDatasourceUID', targetDataSourceUID); + } + }} + /> + )} + control={control} + rules={{ + required: { + value: true, + message: t('alerting.import-to-gma.datasource.required-message', 'Please select a data source'), + }, + }} + /> + + ); +} + +export default withPageErrorBoundary(ImportToGMARules); diff --git a/public/app/features/alerting/unified/components/import-to-gma/NamespaceAndGroupFilter.tsx b/public/app/features/alerting/unified/components/import-to-gma/NamespaceAndGroupFilter.tsx index 3ef22754f1f..2f79a03d7a7 100644 --- a/public/app/features/alerting/unified/components/import-to-gma/NamespaceAndGroupFilter.tsx +++ b/public/app/features/alerting/unified/components/import-to-gma/NamespaceAndGroupFilter.tsx @@ -6,7 +6,7 @@ import { Combobox, ComboboxOption, Field, Stack } from '@grafana/ui'; import { useGetNameSpacesByDatasourceName } from '../rule-editor/useAlertRuleSuggestions'; -import { ImportFormValues } from './ImportFromDSRules'; +import { ImportFormValues } from './ImportToGMARules'; interface Props { rulesSourceName?: string; diff --git a/public/app/features/alerting/unified/components/import-to-gma/hooks.ts b/public/app/features/alerting/unified/components/import-to-gma/hooks.ts index c7c9e233181..0d41f413a2b 100644 --- a/public/app/features/alerting/unified/components/import-to-gma/hooks.ts +++ b/public/app/features/alerting/unified/components/import-to-gma/hooks.ts @@ -62,6 +62,7 @@ export function useGetRulesToBeImported(skip: boolean, selectedDatasourceName: s return { rulesToBeImported, isloadingCloudRules }; } + function useFilterRulesThatMightBeOverwritten( targetNestedFolders: FolderDTO[], rulesToBeImported: RulerRulesConfigDTO, diff --git a/public/app/features/alerting/unified/components/import-to-gma/yamlToRulerConverter.test.ts b/public/app/features/alerting/unified/components/import-to-gma/yamlToRulerConverter.test.ts new file mode 100644 index 00000000000..ff19f18b7b1 --- /dev/null +++ b/public/app/features/alerting/unified/components/import-to-gma/yamlToRulerConverter.test.ts @@ -0,0 +1,238 @@ +import { RulerRulesConfigDTO } from 'app/types/unified-alerting-dto'; + +import { parseYamlToRulerRulesConfigDTO } from './yamlToRulerConverter'; + +describe('parseYamlToRulerRulesConfigDTO', () => { + it('should parse valid YAML with namespace', () => { + const yaml = ` + namespace: test-namespace + groups: + - name: test-group + rules: + - alert: TestAlert + expr: up == 0 + for: 5m + labels: + severity: warning + annotations: + description: "Test alert description" + `; + + const expected: RulerRulesConfigDTO = { + 'test-namespace': [ + { + name: 'test-group', + rules: [ + { + alert: 'TestAlert', + expr: 'up == 0', + for: '5m', + labels: { + severity: 'warning', + }, + annotations: { + description: 'Test alert description', + }, + }, + ], + }, + ], + }; + + const result = parseYamlToRulerRulesConfigDTO(yaml, 'default-namespace'); + expect(result).toEqual(expected); + }); + + it('should use default namespace when not specified in YAML', () => { + const yaml = ` + groups: + - name: test-group + rules: + - alert: TestAlert + expr: up == 0 + `; + + const expected: RulerRulesConfigDTO = { + 'default-namespace': [ + { + name: 'test-group', + rules: [ + { + alert: 'TestAlert', + expr: 'up == 0', + }, + ], + }, + ], + }; + + const result = parseYamlToRulerRulesConfigDTO(yaml, 'default-namespace'); + expect(result).toEqual(expected); + }); + + it('should parse recording rules', () => { + const yaml = ` + groups: + - name: test-group + rules: + - record: test:rate5m + expr: rate(prometheus_tsdb_reloads_total{job="prometheus"}[5m]) + `; + const expected: RulerRulesConfigDTO = { + 'default-namespace': [ + { + name: 'test-group', + rules: [ + { + record: 'test:rate5m', + expr: 'rate(prometheus_tsdb_reloads_total{job="prometheus"}[5m])', + }, + ], + }, + ], + }; + const result = parseYamlToRulerRulesConfigDTO(yaml, 'default-namespace'); + expect(result).toEqual(expected); + }); + + it('should throw error for invalid YAML format', () => { + const invalidYaml = 'invalid: yaml: content'; + expect(() => parseYamlToRulerRulesConfigDTO(invalidYaml, 'default-namespace')).toThrow(); + }); + + it('should throw error for missing groups array', () => { + const yaml = ` + namespace: test-namespace + invalid: content + `; + expect(() => parseYamlToRulerRulesConfigDTO(yaml, 'default-namespace')).toThrow( + 'Invalid YAML format: missing or invalid groups array' + ); + }); + + it('should throw error for invalid group format', () => { + const yaml = ` + namespace: test-namespace + groups: + - invalid: group + `; + expect(() => parseYamlToRulerRulesConfigDTO(yaml, 'default-namespace')).toThrow( + 'Invalid YAML format: missing or invalid groups array at index 0' + ); + }); + + it('should throw error for invalid rule format', () => { + const yaml = ` + namespace: test-namespace + groups: + - name: test-group + rules: + - invalid: rule + `; + expect(() => parseYamlToRulerRulesConfigDTO(yaml, 'default-namespace')).toThrow( + 'Invalid YAML format: missing or invalid groups array at index 0' + ); + }); + + it('should throw error for empty YAML string', () => { + const emptyYaml = ''; + expect(() => parseYamlToRulerRulesConfigDTO(emptyYaml, 'default-namespace')).toThrow( + 'Invalid YAML format: missing or invalid groups array' + ); + }); + + it('should throw error for rule missing expr field', () => { + const yaml = ` + namespace: test-namespace + groups: + - name: test-group + rules: + - alert: TestAlert + for: 5m + labels: + severity: warning + `; + expect(() => parseYamlToRulerRulesConfigDTO(yaml, 'default-namespace')).toThrow( + 'Invalid YAML format: missing or invalid groups array at index 0' + ); + }); + + it('should throw error for rule with expr but missing both alert and record fields', () => { + const yaml = ` + namespace: test-namespace + groups: + - name: test-group + rules: + - expr: up == 0 + for: 5m + labels: + severity: warning + `; + expect(() => parseYamlToRulerRulesConfigDTO(yaml, 'default-namespace')).toThrow( + 'Invalid YAML format: missing or invalid groups array at index 0' + ); + }); + + it('should throw error for rule with both alert and record fields', () => { + const yaml = ` + namespace: test-namespace + groups: + - name: test-group + rules: + - alert: TestAlert + record: test:rate5m + expr: up == 0 + for: 5m + `; + expect(() => parseYamlToRulerRulesConfigDTO(yaml, 'default-namespace')).toThrow( + 'Invalid YAML format: missing or invalid groups array at index 0' + ); + }); + + it('should handle multiple groups and rules', () => { + const yaml = ` + namespace: test-namespace + groups: + - name: group1 + rules: + - alert: Alert1 + expr: up == 0 + - alert: Alert2 + expr: down == 1 + - name: group2 + rules: + - alert: Alert3 + expr: error == 1 + `; + + const expected: RulerRulesConfigDTO = { + 'test-namespace': [ + { + name: 'group1', + rules: [ + { + alert: 'Alert1', + expr: 'up == 0', + }, + { + alert: 'Alert2', + expr: 'down == 1', + }, + ], + }, + { + name: 'group2', + rules: [ + { + alert: 'Alert3', + expr: 'error == 1', + }, + ], + }, + ], + }; + + const result = parseYamlToRulerRulesConfigDTO(yaml, 'default-namespace'); + expect(result).toEqual(expected); + }); +}); diff --git a/public/app/features/alerting/unified/components/import-to-gma/yamlToRulerConverter.ts b/public/app/features/alerting/unified/components/import-to-gma/yamlToRulerConverter.ts new file mode 100644 index 00000000000..85aa67922b2 --- /dev/null +++ b/public/app/features/alerting/unified/components/import-to-gma/yamlToRulerConverter.ts @@ -0,0 +1,135 @@ +import { load } from 'js-yaml'; + +import { RulerCloudRuleDTO, RulerRuleGroupDTO, RulerRulesConfigDTO } from 'app/types/unified-alerting-dto'; + +interface PrometheusYamlFile { + namespace?: string; + groups: Array>; +} + +function isValidObject(value: unknown): value is Record { + return typeof value === 'object' && Boolean(value); +} + +function isRule(yamlRule: unknown): yamlRule is RulerCloudRuleDTO { + if (!isValidObject(yamlRule)) { + return false; + } + + const alert = 'alert' in yamlRule && typeof yamlRule.alert === 'string' ? yamlRule.alert : undefined; + const record = 'record' in yamlRule && typeof yamlRule.record === 'string' ? yamlRule.record : undefined; + const expr = 'expr' in yamlRule && typeof yamlRule.expr === 'string' ? yamlRule.expr : undefined; + + if (!expr) { + return false; + } + + if (!alert && !record) { + return false; + } + + // If both are specified we don't know which one to use + if (alert && record) { + return false; + } + + // Check optional properties if they exist + if ('for' in yamlRule && typeof yamlRule.for !== 'string') { + return false; + } + + if ('labels' in yamlRule && !isValidObject(yamlRule.labels)) { + return false; + } + + if ('annotations' in yamlRule && !isValidObject(yamlRule.annotations)) { + return false; + } + + return true; +} + +function isGroup(obj: unknown): obj is RulerRuleGroupDTO { + if (!isValidObject(obj)) { + return false; + } + + const name = 'name' in obj && typeof obj.name === 'string' ? obj.name : undefined; + const rules = 'rules' in obj && Array.isArray(obj.rules) ? obj.rules : undefined; + + if (!name || !rules) { + return false; + } + + return rules.every(isRule); +} + +type ValidationResult = { isValid: true; data: PrometheusYamlFile } | { isValid: false; error: string }; + +function validatePrometheusYamlFile(obj: unknown): ValidationResult { + if (!isValidObject(obj)) { + return { isValid: false, error: 'Invalid YAML format: missing or invalid groups array' }; + } + + if (!('groups' in obj) || ('groups' in obj && !Array.isArray(obj.groups))) { + return { isValid: false, error: 'Invalid YAML format: missing or invalid groups array' }; + } + + // Check if groups is an array + if (!Array.isArray(obj.groups)) { + return { isValid: false, error: 'Invalid YAML format: missing or invalid groups array' }; + } + + // Check optional namespace property if it exists + if ('namespace' in obj && typeof obj.namespace !== 'string') { + return { isValid: false, error: 'Invalid YAML format: namespace must be a string' }; + } + + // If we get here, the object is valid - we can safely use it + // Since we validated the entire structure above, we know obj conforms to PrometheusYamlFile + const validatedGroups = obj.groups.map((group, index) => { + if (isGroup(group)) { + return group; + } + throw new Error(`Invalid YAML format: missing or invalid groups array at index ${index}`); + }); + + const prometheusFile: PrometheusYamlFile = { + groups: validatedGroups, + }; + + if ('namespace' in obj && typeof obj.namespace === 'string') { + prometheusFile.namespace = obj.namespace; + } + + return { + isValid: true, + data: prometheusFile, + }; +} + +// only use this function directly for testing purposes, use parseYamlFileToRulerRulesConfigDTO instead +export function parseYamlToRulerRulesConfigDTO(yamlAsString: string, defaultNamespace: string): RulerRulesConfigDTO { + const obj = load(yamlAsString); + const validation = validatePrometheusYamlFile(obj); + + if (!validation.isValid) { + throw new Error(validation.error); + } + + // TypeScript now knows validation.data exists and is PrometheusYamlFile + const prometheusFile = validation.data; + const namespace = prometheusFile.namespace ?? defaultNamespace; + + return { + [namespace]: prometheusFile.groups, + }; +} + +export async function parseYamlFileToRulerRulesConfigDTO( + file: File, + defaultNamespace: string +): Promise { + const yamlContent = await file.text(); + return parseYamlToRulerRulesConfigDTO(yamlContent, defaultNamespace); +} diff --git a/public/app/features/alerting/unified/components/mute-timings/EditMuteTiming.tsx b/public/app/features/alerting/unified/components/mute-timings/EditMuteTiming.tsx index b87bb96c9cf..6de37a665fe 100644 --- a/public/app/features/alerting/unified/components/mute-timings/EditMuteTiming.tsx +++ b/public/app/features/alerting/unified/components/mute-timings/EditMuteTiming.tsx @@ -1,5 +1,6 @@ import { Navigate } from 'react-router-dom-v5-compat'; +import { useTranslate } from '@grafana/i18n'; import { useGetMuteTiming } from 'app/features/alerting/unified/components/mute-timings/useMuteTimings'; import { useURLSearchParams } from 'app/features/alerting/unified/hooks/useURLSearchParams'; @@ -39,10 +40,14 @@ const EditTimingRoute = () => { }; function EditMuteTimingPage() { + const { t } = useTranslate(); return ( diff --git a/public/app/features/alerting/unified/components/mute-timings/MuteTimingsTable.tsx b/public/app/features/alerting/unified/components/mute-timings/MuteTimingsTable.tsx index 302f47dd73c..c93113bcbf6 100644 --- a/public/app/features/alerting/unified/components/mute-timings/MuteTimingsTable.tsx +++ b/public/app/features/alerting/unified/components/mute-timings/MuteTimingsTable.tsx @@ -3,6 +3,7 @@ import { useMemo } from 'react'; import { GrafanaTheme2 } from '@grafana/data'; import { Trans, useTranslate } from '@grafana/i18n'; +import { t } from '@grafana/i18n/internal'; import { Alert, Button, LinkButton, LoadingPlaceholder, Stack, useStyles2 } from '@grafana/ui'; import { MuteTimingActionsButtons } from 'app/features/alerting/unified/components/mute-timings/MuteTimingActionsButtons'; import { @@ -149,7 +150,7 @@ function useColumns(alertManagerSourceName: string, hideActions = false) { const columns: Array> = [ { id: 'name', - label: 'Name', + label: t('alerting.use-columns.columns.label.name', 'Name'), renderCell: function renderName({ data }) { return (
    @@ -164,7 +165,7 @@ function useColumns(alertManagerSourceName: string, hideActions = false) { }, { id: 'timeRange', - label: 'Time range', + label: t('alerting.use-columns.columns.label.time-range', 'Time range'), renderCell: ({ data }) => { return renderTimeIntervals(data); }, @@ -174,7 +175,7 @@ function useColumns(alertManagerSourceName: string, hideActions = false) { if (showActions) { columns.push({ id: 'actions', - label: 'Actions', + label: t('alerting.use-columns.label.actions', 'Actions'), alignColumn: 'end', renderCell: ({ data }) => ( diff --git a/public/app/features/alerting/unified/components/mute-timings/NewMuteTiming.tsx b/public/app/features/alerting/unified/components/mute-timings/NewMuteTiming.tsx index 14959eaa4cc..ee2ded9c0db 100644 --- a/public/app/features/alerting/unified/components/mute-timings/NewMuteTiming.tsx +++ b/public/app/features/alerting/unified/components/mute-timings/NewMuteTiming.tsx @@ -1,13 +1,19 @@ +import { useTranslate } from '@grafana/i18n'; + import { withPageErrorBoundary } from '../../withPageErrorBoundary'; import { AlertmanagerPageWrapper } from '../AlertingPageWrapper'; import MuteTimingForm from './MuteTimingForm'; function NewMuteTimingPage() { + const { t } = useTranslate(); return ( diff --git a/public/app/features/alerting/unified/components/notification-policies/EditDefaultPolicyForm.tsx b/public/app/features/alerting/unified/components/notification-policies/EditDefaultPolicyForm.tsx index aabaf0e06ef..5242e197578 100644 --- a/public/app/features/alerting/unified/components/notification-policies/EditDefaultPolicyForm.tsx +++ b/public/app/features/alerting/unified/components/notification-policies/EditDefaultPolicyForm.tsx @@ -70,7 +70,9 @@ export const AmRootRouteForm = ({ actionButtons, alertManagerSourceName, onSubmi )} control={control} name="receiver" - rules={{ required: { value: true, message: 'Required.' } }} + rules={{ + required: { value: true, message: t('alerting.am-root-route-form.message.required', 'Required.') }, + }} /> or diff --git a/public/app/features/alerting/unified/components/notification-policies/EditNotificationPolicyForm.tsx b/public/app/features/alerting/unified/components/notification-policies/EditNotificationPolicyForm.tsx index 6ed5b594596..e577ed8187a 100644 --- a/public/app/features/alerting/unified/components/notification-policies/EditNotificationPolicyForm.tsx +++ b/public/app/features/alerting/unified/components/notification-policies/EditNotificationPolicyForm.tsx @@ -133,7 +133,12 @@ export const AmRoutesExpandedForm = ({ actionButtons, route, onSubmit, defaults defaultValue={field.operator} control={control} name={`object_matchers.${index}.operator`} - rules={{ required: { value: true, message: 'Required.' } }} + rules={{ + required: { + value: true, + message: t('alerting.am-routes-expanded-form.message.required', 'Required.'), + }, + }} /> Multiple units combined
    - {/* eslint-disable-next-line @grafana/no-untranslated-strings */} + {/* eslint-disable-next-line @grafana/i18n/no-untranslated-strings */} 1m30s, 2h30m20s, 1w2d
diff --git a/public/app/features/alerting/unified/components/receivers/TemplateForm.tsx b/public/app/features/alerting/unified/components/receivers/TemplateForm.tsx index 12a818a220b..9ec17ca839f 100644 --- a/public/app/features/alerting/unified/components/receivers/TemplateForm.tsx +++ b/public/app/features/alerting/unified/components/receivers/TemplateForm.tsx @@ -202,7 +202,7 @@ export const TemplateForm = ({ originalTemplate, prefill, alertmanager }: Props) > diff --git a/public/app/features/alerting/unified/components/receivers/form/fields/TemplateSelector.tsx b/public/app/features/alerting/unified/components/receivers/form/fields/TemplateSelector.tsx index af3f1e275d5..05c9f6c04db 100644 --- a/public/app/features/alerting/unified/components/receivers/form/fields/TemplateSelector.tsx +++ b/public/app/features/alerting/unified/components/receivers/form/fields/TemplateSelector.tsx @@ -123,6 +123,7 @@ interface TemplateSelectorProps { } function TemplateSelector({ onSelect, onClose, option, valueInForm }: TemplateSelectorProps) { + const { t } = useTranslate(); const styles = useStyles2(getStyles); const valueInFormIsCustom = Boolean(valueInForm) && !matchesOnlyOneTemplate(valueInForm); const [template, setTemplate] = useState | undefined>(undefined); @@ -138,7 +139,10 @@ function TemplateSelector({ onSelect, onClose, option, valueInForm }: TemplateSe const templateOptions: Array> = [ { - label: 'Select notification template', + label: t( + 'alerting.template-selector.template-options.label.select-notification-template', + 'Select notification template' + ), ariaLabel: 'Select notification template', value: 'Existing', description: `Select an existing notification template and preview it, or copy it to paste it in the custom tab. ${templateOption === 'Existing' ? 'Clicking Save saves your changes to the selected template.' : ''}`, @@ -156,7 +160,6 @@ function TemplateSelector({ onSelect, onClose, option, valueInForm }: TemplateSe setCustomTemplateValue(getUseTemplateText(template.value.name)); } }, [template]); - const { t } = useTranslate(); function onCustomTemplateChange(customInput: string) { setCustomTemplateValue(customInput); diff --git a/public/app/features/alerting/unified/components/rule-editor/AlertRuleNameInput.tsx b/public/app/features/alerting/unified/components/rule-editor/AlertRuleNameInput.tsx index 0f634d90df8..82b29598b17 100644 --- a/public/app/features/alerting/unified/components/rule-editor/AlertRuleNameInput.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/AlertRuleNameInput.tsx @@ -3,7 +3,6 @@ import { Controller, useFormContext } from 'react-hook-form'; import { DataSourceInstanceSettings } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; import { Trans, useTranslate } from '@grafana/i18n'; -import { config } from '@grafana/runtime'; import { Field, Input, Stack, Text } from '@grafana/ui'; import { DataSourcePicker } from 'app/features/datasources/components/picker/DataSourcePicker'; @@ -66,7 +65,10 @@ export const AlertRuleNameAndMetric = () => { id="name" width={38} {...register('name', { - required: { value: true, message: 'Must enter a name' }, + required: { + value: true, + message: t('alerting.alert-rule-name-and-metric.message.must-enter-a-name', 'Must enter a name'), + }, pattern: isCloudRecordingRule ? recordingRuleNameValidationPattern(RuleFormType.cloudRecording) : undefined, @@ -89,7 +91,13 @@ export const AlertRuleNameAndMetric = () => { id="metric" width={38} {...register('metric', { - required: { value: true, message: 'Must enter a metric name' }, + required: { + value: true, + message: t( + 'alerting.alert-rule-name-and-metric.message.must-enter-a-metric-name', + 'Must enter a metric name' + ), + }, pattern: recordingRuleNameValidationPattern(RuleFormType.grafanaRecording), })} aria-label={t('alerting.alert-rule-name-and-metric.metric-aria-label-metric', 'metric')} @@ -101,9 +109,10 @@ export const AlertRuleNameAndMetric = () => { )} - {isGrafanaRecordingRule && config.featureToggles.grafanaManagedRecordingRulesDatasources && ( + {isGrafanaRecordingRule && ( { name="targetDatasourceUid" control={control} rules={{ - required: { value: true, message: 'Please select a data source' }, + required: { + value: true, + message: t( + 'alerting.alert-rule-name-and-metric.message.please-select-a-data-source', + 'Please select a data source' + ), + }, }} /> diff --git a/public/app/features/alerting/unified/components/rule-editor/AnnotationHeaderField.tsx b/public/app/features/alerting/unified/components/rule-editor/AnnotationHeaderField.tsx index 7f6ed397714..da5089d27f3 100644 --- a/public/app/features/alerting/unified/components/rule-editor/AnnotationHeaderField.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/AnnotationHeaderField.tsx @@ -1,5 +1,6 @@ import { Controller, FieldArrayWithId, useFormContext } from 'react-hook-form'; +import { useTranslate } from '@grafana/i18n'; import { Stack, Text } from '@grafana/ui'; import { RuleFormValues } from '../../types/rule-form'; @@ -20,6 +21,7 @@ const AnnotationHeaderField = ({ index: number; labelId: string; }) => { + const { t } = useTranslate(); const { control } = useFormContext(); return ( @@ -56,7 +58,12 @@ const AnnotationHeaderField = ({ ); }} control={control} - rules={{ required: { value: !!annotations[index]?.value, message: 'Required.' } }} + rules={{ + required: { + value: !!annotations[index]?.value, + message: t('alerting.annotation-header-field.message.required', 'Required.'), + }, + }} /> } 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 ad78011828b..7035dc68d29 100644 --- a/public/app/features/alerting/unified/components/rule-editor/AnnotationsStep.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/AnnotationsStep.tsx @@ -182,7 +182,7 @@ const AnnotationsStep = () => { {...register(`annotations.${index}.value`)} placeholder={ isUrl - ? // eslint-disable-next-line @grafana/no-untranslated-strings + ? // eslint-disable-next-line @grafana/i18n/no-untranslated-strings 'https://' : (annotationField.key && t('alerting.annotations-step.placeholder-value-input', 'Enter a {{key}}...', { diff --git a/public/app/features/alerting/unified/components/rule-editor/CloudEvaluationBehavior.tsx b/public/app/features/alerting/unified/components/rule-editor/CloudEvaluationBehavior.tsx index c7b2cae97db..ed256a109d7 100644 --- a/public/app/features/alerting/unified/components/rule-editor/CloudEvaluationBehavior.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/CloudEvaluationBehavior.tsx @@ -40,7 +40,15 @@ export const CloudEvaluationBehavior = () => {
diff --git a/public/app/features/alerting/unified/components/rule-editor/FolderSelector.tsx b/public/app/features/alerting/unified/components/rule-editor/FolderSelector.tsx index 01d408d9073..8a2ca875bca 100644 --- a/public/app/features/alerting/unified/components/rule-editor/FolderSelector.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/FolderSelector.tsx @@ -69,7 +69,10 @@ export function FolderSelector() { )} name="folder" rules={{ - required: { value: true, message: 'Select a folder' }, + required: { + value: true, + message: t('alerting.folder-selector.message.select-a-folder', 'Select a folder'), + }, }} /> diff --git a/public/app/features/alerting/unified/components/rule-editor/GrafanaEvaluationBehavior.tsx b/public/app/features/alerting/unified/components/rule-editor/GrafanaEvaluationBehavior.tsx index 99eb44dc4f7..0ced69efa48 100644 --- a/public/app/features/alerting/unified/components/rule-editor/GrafanaEvaluationBehavior.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/GrafanaEvaluationBehavior.tsx @@ -5,7 +5,7 @@ import { Controller, FormProvider, RegisterOptions, useForm, useFormContext } fr import { GrafanaTheme2, SelectableValue } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; -import { Trans } from '@grafana/i18n'; +import { Trans, useTranslate } from '@grafana/i18n'; import { t } from '@grafana/i18n/internal'; import { Box, @@ -74,7 +74,7 @@ const sortByLabel = (a: SelectableValue, b: SelectableValue) => const forValidationOptions = (evaluateEvery: string): RegisterOptions<{ evaluateFor: string }> => ({ required: { value: true, - message: 'Required.', + message: t('alerting.for-validation-options.message.required', 'Required.'), }, validate: (value) => { // parsePrometheusDuration does not allow 0 but does allow 0s @@ -118,6 +118,7 @@ export function GrafanaEvaluationBehaviorStep({ existing: boolean; enableProvisionedGroups: boolean; }) { + const { t } = useTranslate(); const styles = useStyles2(getStyles); const [showErrorHandling, setShowErrorHandling] = useState(false); @@ -237,7 +238,13 @@ export function GrafanaEvaluationBehaviorStep({ name="group" control={control} rules={{ - required: { value: true, message: 'Must enter a group name' }, + required: { + value: true, + message: t( + 'alerting.grafana-evaluation-behavior-step.message.must-enter-a-group-name', + 'Must enter a group name' + ), + }, }} /> @@ -380,7 +387,13 @@ export function GrafanaEvaluationBehaviorStep({ )} id="missing-series-resolve" {...register('missingSeriesEvalsToResolve', { - pattern: { value: /^\d+$/, message: 'Must be a positive integer.' }, + pattern: { + value: /^\d+$/, + message: t( + 'alerting.grafana-evaluation-behavior-step.message.must-be-a-positive-integer', + 'Must be a positive integer.' + ), + }, })} width={21} /> @@ -402,6 +415,7 @@ function EvaluationGroupCreationModal({ onCreate: (group: string, evaluationInterval: string) => void; groupfoldersForGrafana?: RulerRulesConfigDTO | null; }): React.ReactElement { + const { t } = useTranslate(); const styles = useStyles2(getStyles); const { watch } = useFormContext(); @@ -477,7 +491,12 @@ function EvaluationGroupCreationModal({ autoFocus={true} id={evaluationGroupNameId} placeholder={t('alerting.evaluation-group-creation-modal.placeholder-enter-a-name', 'Enter a name')} - {...register('group', { required: { value: true, message: 'Required.' } })} + {...register('group', { + required: { + value: true, + message: t('alerting.evaluation-group-creation-modal.message.required', 'Required.'), + }, + })} /> diff --git a/public/app/features/alerting/unified/components/rule-editor/GroupAndNamespaceFields.tsx b/public/app/features/alerting/unified/components/rule-editor/GroupAndNamespaceFields.tsx index 9b6779b0d67..393639a820f 100644 --- a/public/app/features/alerting/unified/components/rule-editor/GroupAndNamespaceFields.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/GroupAndNamespaceFields.tsx @@ -49,7 +49,7 @@ export const GroupAndNamespaceFields = ({ rulesSourceName }: Props) => { label={t('alerting.group-and-namespace-fields.namespace-picker-label-namespace', 'Namespace')} // Disable translations as we don't intend to use this dropdown longterm, // so avoiding us adding translations for the sake of it - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings description="Type to search for an existing namespace or create a new one" error={errors.namespace?.message} invalid={!!errors.namespace?.message} @@ -73,7 +73,7 @@ export const GroupAndNamespaceFields = ({ rulesSourceName }: Props) => { name="namespace" control={control} rules={{ - required: { value: true, message: 'Required.' }, + required: { value: true, message: t('alerting.group-and-namespace-fields.message.required', 'Required.') }, }} /> @@ -82,7 +82,7 @@ export const GroupAndNamespaceFields = ({ rulesSourceName }: Props) => { label={t('alerting.group-and-namespace-fields.group-picker-label-group', 'Group')} // Disable translations as we don't intend to use this dropdown longterm, // so avoiding us adding translations for the sake of it - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings description="Type to search for an existing group or create a new one" error={errors.group?.message} invalid={!!errors.group?.message} @@ -105,7 +105,7 @@ export const GroupAndNamespaceFields = ({ rulesSourceName }: Props) => { name="group" control={control} rules={{ - required: { value: true, message: 'Required.' }, + required: { value: true, message: t('alerting.group-and-namespace-fields.message.required', 'Required.') }, }} /> 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 c7b0411b0d4..409a2facf57 100644 --- a/public/app/features/alerting/unified/components/rule-editor/NotificationsStep.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/NotificationsStep.tsx @@ -153,14 +153,27 @@ export const NotificationsStep = ({ alertUid }: NotificationsStepProps) => { * */ function ManualAndAutomaticRouting({ alertUid }: { alertUid?: string }) { + const { t } = useTranslate(); const { watch, setValue } = useFormContext(); const styles = useStyles2(getStyles); const [manualRouting] = watch(['manualRouting']); const routingOptions = [ - { label: 'Select contact point', value: RoutingOptions.ContactPoint }, - { label: 'Use notification policy', value: RoutingOptions.NotificationPolicy }, + { + label: t( + 'alerting.manual-and-automatic-routing.routing-options.label.select-contact-point', + 'Select contact point' + ), + value: RoutingOptions.ContactPoint, + }, + { + label: t( + 'alerting.manual-and-automatic-routing.routing-options.label.use-notification-policy', + 'Use notification policy' + ), + value: RoutingOptions.NotificationPolicy, + }, ]; const onRoutingOptionChange = (option: RoutingOptions) => { diff --git a/public/app/features/alerting/unified/components/rule-editor/alert-rule-form/simplifiedRouting/contactPoint/ContactPointSelector.tsx b/public/app/features/alerting/unified/components/rule-editor/alert-rule-form/simplifiedRouting/contactPoint/ContactPointSelector.tsx index e112fd3f2f2..53bc7df4493 100644 --- a/public/app/features/alerting/unified/components/rule-editor/alert-rule-form/simplifiedRouting/contactPoint/ContactPointSelector.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/alert-rule-form/simplifiedRouting/contactPoint/ContactPointSelector.tsx @@ -78,7 +78,10 @@ export function ContactPointSelector({ alertManager, onSelectContactPoint }: Con rules={{ required: { value: true, - message: 'Contact point is required.', + message: t( + 'alerting.contact-point-selector.message.contact-point-is-required', + 'Contact point is required.' + ), }, }} control={control} diff --git a/public/app/features/alerting/unified/components/rule-editor/labels/LabelsField.tsx b/public/app/features/alerting/unified/components/rule-editor/labels/LabelsField.tsx index 10f82b1e051..a05765cff55 100644 --- a/public/app/features/alerting/unified/components/rule-editor/labels/LabelsField.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/labels/LabelsField.tsx @@ -3,8 +3,7 @@ import { FC, useCallback, useMemo, useState } from 'react'; import { Controller, FormProvider, useFieldArray, useForm, useFormContext } from 'react-hook-form'; import { GrafanaTheme2, SelectableValue } from '@grafana/data'; -import { Trans, useTranslate } from '@grafana/i18n'; -import { TFunction } from '@grafana/i18n/internal'; +import { TFunction, Trans, useTranslate } from '@grafana/i18n'; import { Button, Field, InlineLabel, Input, LoadingPlaceholder, Space, Stack, Text, useStyles2 } from '@grafana/ui'; import { labelsApi } from '../../../api/labelsApi'; @@ -117,6 +116,7 @@ export function useCombinedLabels( labelsInSubform: Array<{ key: string; value: string }>, selectedKey: string ) { + const { t } = useTranslate(); // ------- Get labels keys and their values from existing alerts const { labels: labelsByKeyFromExisingAlerts, isLoading } = useGetLabelsFromDataSourceName(dataSourceName); // ------- Get only the keys from the ops labels, as we will fetch the values for the keys once the key is selected. @@ -144,12 +144,12 @@ export function useCombinedLabels( // create two groups of labels, one for ops and one for custom const groupedOptions = [ { - label: 'From alerts', + label: t('alerting.use-combined-labels.grouped-options.label.from-alerts', 'From alerts'), options: keysFromExistingAlerts, expanded: true, }, { - label: 'From system', + label: t('alerting.use-combined-labels.grouped-options.label.from-system', 'From system'), options: keysFromGopsLabels, expanded: true, }, @@ -373,7 +373,10 @@ export const LabelsWithoutSuggestions: FC = () => { > { > diff --git a/public/app/features/alerting/unified/components/rule-editor/query-and-alert-condition/QueryAndExpressionsStep.tsx b/public/app/features/alerting/unified/components/rule-editor/query-and-alert-condition/QueryAndExpressionsStep.tsx index 31c9ede6b6b..76cee819cb0 100644 --- a/public/app/features/alerting/unified/components/rule-editor/query-and-alert-condition/QueryAndExpressionsStep.tsx +++ b/public/app/features/alerting/unified/components/rule-editor/query-and-alert-condition/QueryAndExpressionsStep.tsx @@ -544,7 +544,13 @@ export const QueryAndExpressionsStep = ({ editingExistingRule, onDataChange, mod }} control={control} rules={{ - required: { value: true, message: 'A valid expression is required' }, + required: { + value: true, + message: t( + 'alerting.query-and-expressions-step.message.a-valid-expression-is-required', + 'A valid expression is required' + ), + }, }} /> diff --git a/public/app/features/alerting/unified/components/rule-viewer/RuleViewer.test.tsx b/public/app/features/alerting/unified/components/rule-viewer/RuleViewer.test.tsx index 35221269d59..a3125ccca53 100644 --- a/public/app/features/alerting/unified/components/rule-viewer/RuleViewer.test.tsx +++ b/public/app/features/alerting/unified/components/rule-viewer/RuleViewer.test.tsx @@ -24,6 +24,7 @@ import { grantPermissionsHelper } from '../../test/test-utils'; import { setupDataSources } from '../../testSetup/datasources'; import { Annotation } from '../../utils/constants'; import { DataSourceType } from '../../utils/datasource'; +import { GRAFANA_ORIGIN_LABEL } from '../../utils/labels'; import * as ruleId from '../../utils/rule-id'; import { stringifyIdentifier } from '../../utils/rule-id'; @@ -286,6 +287,19 @@ describe('RuleViewer', () => { expect(versionSummary).toHaveTextContent(/Version 5 updated by alerting/i); expect(versionSummary).toHaveTextContent(/Version 6 updated by provisioning/i); }); + + it('should not show any labels if we only have private labels', async () => { + const ruleIdentifier = ruleId.fromCombinedRule('grafana', mockRule); + const rule = getGrafanaRule({ + name: 'Test alert', + labels: { + [GRAFANA_ORIGIN_LABEL]: 'plugins/synthetic-monitoring-app', + }, + }); + + await renderRuleViewer(rule, ruleIdentifier); + expect(screen.queryByText('Labels')).not.toBeInTheDocument(); + }); }); }); diff --git a/public/app/features/alerting/unified/components/rule-viewer/RuleViewer.tsx b/public/app/features/alerting/unified/components/rule-viewer/RuleViewer.tsx index 32b648243b9..eec3c0b0363 100644 --- a/public/app/features/alerting/unified/components/rule-viewer/RuleViewer.tsx +++ b/public/app/features/alerting/unified/components/rule-viewer/RuleViewer.tsx @@ -1,10 +1,11 @@ import { css } from '@emotion/css'; -import { chain, isEmpty, truncate } from 'lodash'; +import { chain, truncate } from 'lodash'; import { useEffect, useState } from 'react'; import { useMeasure } from 'react-use'; import { NavModelItem, UrlQueryValue } from '@grafana/data'; import { Trans, useTranslate } from '@grafana/i18n'; +import { t } from '@grafana/i18n/internal'; import { Alert, LinkButton, @@ -22,6 +23,7 @@ import InfoPausedRule from 'app/features/alerting/unified/components/InfoPausedR import { RuleActionsButtons } from 'app/features/alerting/unified/components/rules/RuleActionsButtons'; import { AlertInstanceTotalState, + AlertInstanceTotals, CombinedRule, RuleGroupIdentifierV2, RuleHealth, @@ -40,6 +42,7 @@ import { useReturnTo } from '../../hooks/useReturnTo'; import { PluginOriginBadge } from '../../plugins/PluginOriginBadge'; import { Annotation } from '../../utils/constants'; import { ruleIdentifierToRuleSourceIdentifier } from '../../utils/datasource'; +import { labelsSize } from '../../utils/labels'; import { makeDashboardLink, makePanelLink, stringifyErrorLike } from '../../utils/misc'; import { createListFilterLink } from '../../utils/navigation'; import { @@ -93,7 +96,6 @@ const RuleViewer = () => { const { annotations, promRule, rulerRule } = rule; const hasError = isErrorHealth(promRule?.health); - const isAlertType = prometheusRuleType.alertingRule(promRule); const isFederatedRule = isFederatedRuleGroup(rule.group); const isProvisioned = rulerRuleType.grafana.rule(rulerRule) && Boolean(rulerRule.grafana_alert.provenance); @@ -113,7 +115,7 @@ const RuleViewer = () => { { const hasDashboardAndPanel = dashboardUID && panelID; const hasDashboard = dashboardUID; - const hasLabels = !isEmpty(labels); + const hasLabels = labelsSize(labels) > 0; const interval = group.interval; const styles = useStyles2(getStyles); @@ -204,14 +206,14 @@ const createMetadata = (rule: CombinedRule): PageInfoItem[] => { <Text variant="bodySmall">{truncatedUrl}</Text> ); metadata.push({ - label: 'Runbook URL', + label: t('alerting.create-metadata.label.runbook-url', 'Runbook URL'), value: valueToAdd, }); } if (hasDashboardAndPanel) { metadata.push({ - label: 'Dashboard and panel', + label: t('alerting.create-metadata.label.dashboard-and-panel', 'Dashboard and panel'), value: ( <WithReturnButton title={rule.name} @@ -225,7 +227,7 @@ const createMetadata = (rule: CombinedRule): PageInfoItem[] => { }); } else if (hasDashboard) { metadata.push({ - label: 'Dashboard', + label: t('alerting.create-metadata.label.dashboard', 'Dashboard'), value: ( <WithReturnButton title={rule.name} @@ -241,14 +243,14 @@ const createMetadata = (rule: CombinedRule): PageInfoItem[] => { if (rulerRuleType.grafana.recordingRule(rule.rulerRule)) { const metric = rule.rulerRule?.grafana_alert.record?.metric ?? ''; metadata.push({ - label: 'Metric name', + label: t('alerting.create-metadata.label.metric-name', 'Metric name'), value: <Text color="primary">{metric}</Text>, }); } if (interval) { metadata.push({ - label: 'Evaluation interval', + label: t('alerting.create-metadata.label.evaluation-interval', 'Evaluation interval'), value: ( <Text color="primary"> <Trans i18nKey="alerting.rule-viewer.evaluation-interval">Every {{ interval }}</Trans> @@ -259,7 +261,7 @@ const createMetadata = (rule: CombinedRule): PageInfoItem[] => { if (hasLabels) { metadata.push({ - label: 'Labels', + label: t('alerting.create-metadata.label.labels', 'Labels'), /* TODO truncate number of labels, maybe build in to component? */ value: <AlertLabels labels={labels} size="sm" />, }); @@ -404,8 +406,8 @@ function usePageNav(rule: CombinedRule) { const namespaceName = decodeGrafanaNamespace(rule.namespace).name; const groupName = rule.group.name; - const isGrafanaAlertRule = rulerRuleType.grafana.rule(rulerRule) && isAlertType; - const grafanaRecordingRule = rulerRuleType.grafana.recordingRule(rulerRule); + const isGrafanaAlertRule = rulerRuleType.grafana.alertingRule(rulerRule); + const isGrafanaRecordingRule = rulerRuleType.grafana.recordingRule(rulerRule); const isRecordingRuleType = prometheusRuleType.recordingRule(promRule); const pageNav: NavModelItem = { @@ -414,14 +416,14 @@ function usePageNav(rule: CombinedRule) { subTitle: summary, children: [ { - text: 'Query and conditions', + text: t('alerting.use-page-nav.page-nav.text.query-and-conditions', 'Query and conditions'), active: activeTab === ActiveTab.Query, onClick: () => { setActiveTab(ActiveTab.Query); }, }, { - text: 'Instances', + text: t('alerting.use-page-nav.page-nav.text.instances', 'Instances'), active: activeTab === ActiveTab.Instances, onClick: () => { setActiveTab(ActiveTab.Instances); @@ -430,7 +432,7 @@ function usePageNav(rule: CombinedRule) { hideFromTabs: isRecordingRuleType, }, { - text: 'History', + text: t('alerting.use-page-nav.page-nav.text.history', 'History'), active: activeTab === ActiveTab.History, onClick: () => { setActiveTab(ActiveTab.History); @@ -439,19 +441,19 @@ function usePageNav(rule: CombinedRule) { hideFromTabs: !isGrafanaAlertRule, }, { - text: 'Details', + text: t('alerting.use-page-nav.page-nav.text.details', 'Details'), active: activeTab === ActiveTab.Details, onClick: () => { setActiveTab(ActiveTab.Details); }, }, { - text: 'Versions', + text: t('alerting.use-page-nav.page-nav.text.versions', 'Versions'), active: activeTab === ActiveTab.VersionHistory, onClick: () => { setActiveTab(ActiveTab.VersionHistory); }, - hideFromTabs: !isGrafanaAlertRule && !grafanaRecordingRule, + hideFromTabs: !isGrafanaAlertRule && !isGrafanaRecordingRule, }, ], parentItem: { @@ -474,7 +476,7 @@ function usePageNav(rule: CombinedRule) { }; } -export const calculateTotalInstances = (stats: CombinedRule['instanceTotals']) => { +export const calculateTotalInstances = (stats: AlertInstanceTotals) => { return chain(stats) .pick([ AlertInstanceTotalState.Alerting, diff --git a/public/app/features/alerting/unified/components/rule-viewer/tabs/Details.tsx b/public/app/features/alerting/unified/components/rule-viewer/tabs/Details.tsx index 0ca0d46c5b3..b446f0377c3 100644 --- a/public/app/features/alerting/unified/components/rule-viewer/tabs/Details.tsx +++ b/public/app/features/alerting/unified/components/rule-viewer/tabs/Details.tsx @@ -4,7 +4,6 @@ import { isUndefined } from 'lodash'; import { GrafanaTheme2, dateTimeFormat, dateTimeFormatTimeAgo } from '@grafana/data'; import { Trans, useTranslate } from '@grafana/i18n'; -import { config } from '@grafana/runtime'; import { Icon, Link, Stack, Text, TextLink, useStyles2 } from '@grafana/ui'; import { useDatasource } from 'app/features/datasources/hooks'; import { CombinedRule } from 'app/types/unified-alerting'; @@ -64,10 +63,7 @@ export const Details = ({ rule }: DetailsProps) => { const datasource = useDatasource(targetDatasourceUid); - const showTargetDatasource = - config.featureToggles.grafanaManagedRecordingRulesDatasources && - targetDatasourceUid && - targetDatasourceUid !== 'grafana'; + const showTargetDatasource = targetDatasourceUid && targetDatasourceUid !== 'grafana'; const evaluationDuration = rule.promRule?.evaluationTime; const evaluationTimestamp = rule.promRule?.lastEvaluation; diff --git a/public/app/features/alerting/unified/components/rules/CloudRules.tsx b/public/app/features/alerting/unified/components/rules/CloudRules.tsx index 740eeef7ee5..2d1142064a7 100644 --- a/public/app/features/alerting/unified/components/rules/CloudRules.tsx +++ b/public/app/features/alerting/unified/components/rules/CloudRules.tsx @@ -14,6 +14,7 @@ import { usePagination } from '../../hooks/usePagination'; import { useUnifiedAlertingSelector } from '../../hooks/useUnifiedAlertingSelector'; import { getPaginationStyles } from '../../styles/pagination'; import { getRulesDataSources, getRulesSourceUid } from '../../utils/datasource'; +import { isAdmin } from '../../utils/misc'; import { isAsyncRequestStatePending } from '../../utils/redux'; import { createRelativeUrl } from '../../utils/url'; @@ -48,13 +49,8 @@ export const CloudRules = ({ namespaces, expandAll }: Props) => { DEFAULT_PER_PAGE_PAGINATION ); - const [createRuleSupported, createRuleAllowed] = useAlertingAbility(AlertingAction.CreateAlertRule); - const [viewExternalRuleSupported, viewExternalRuleAllowed] = useAlertingAbility(AlertingAction.ViewExternalAlertRule); const { t } = useTranslate(); - const canViewCloudRules = viewExternalRuleSupported && viewExternalRuleAllowed; - const canCreateGrafanaRules = createRuleSupported && createRuleAllowed; - const canMigrateToGMA = - hasDataSourcesConfigured && canCreateGrafanaRules && canViewCloudRules && config.featureToggles.alertingMigrationUI; + const canMigrateToGMA = hasDataSourcesConfigured && isAdmin() && config.featureToggles.alertingMigrationUI; return ( <section className={styles.wrapper}> diff --git a/public/app/features/alerting/unified/components/rules/Filter/RulesFilter.v1.tsx b/public/app/features/alerting/unified/components/rules/Filter/RulesFilter.v1.tsx index d6b7497dd19..4ff5da3f8e1 100644 --- a/public/app/features/alerting/unified/components/rules/Filter/RulesFilter.v1.tsx +++ b/public/app/features/alerting/unified/components/rules/Filter/RulesFilter.v1.tsx @@ -259,8 +259,8 @@ const RulesFilter = ({ onClear = () => undefined }: RulesFilerProps) => { </Label> <RadioButtonGroup<'hide'> options={[ - { label: 'Show', value: undefined }, - { label: 'Hide', value: 'hide' }, + { label: t('alerting.rules-filter.label.show', 'Show'), value: undefined }, + { label: t('alerting.rules-filter.label.hide', 'Hide'), value: 'hide' }, ]} value={filterState.plugins} onChange={(value) => updateFilters({ ...filterState, plugins: value })} diff --git a/public/app/features/alerting/unified/components/rules/MultipleDataSourcePicker.tsx b/public/app/features/alerting/unified/components/rules/MultipleDataSourcePicker.tsx index 996bea7e4a5..5c7c68365f4 100644 --- a/public/app/features/alerting/unified/components/rules/MultipleDataSourcePicker.tsx +++ b/public/app/features/alerting/unified/components/rules/MultipleDataSourcePicker.tsx @@ -8,6 +8,7 @@ import { isUnsignedPluginSignature, } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; +import { useTranslate } from '@grafana/i18n'; import { DataSourcePickerProps, DataSourcePickerState, getDataSourceSrv } from '@grafana/runtime'; import { ExpressionDatasourceRef } from '@grafana/runtime/internal'; import { ActionMeta, MultiSelect, PluginSignatureBadge, Stack } from '@grafana/ui'; @@ -20,6 +21,7 @@ export interface MultipleDataSourcePickerProps extends Omit<DataSourcePickerProp } export const MultipleDataSourcePicker = (props: MultipleDataSourcePickerProps) => { + const { t } = useTranslate(); const dataSourceSrv = getDataSourceSrv(); const [state, setState] = useState<DataSourcePickerState>(); @@ -121,8 +123,22 @@ export const MultipleDataSourcePicker = (props: MultipleDataSourcePickerProps) = })); const groupedOptions = [ - { label: 'Data sources with configured alert rules', options: alertManagingDs, expanded: true }, - { label: 'Other data sources', options: nonAlertManagingDs, expanded: true }, + { + label: t( + 'alerting.multiple-data-source-picker.get-data-source-options.grouped-options.label.data-sources-with-configured-alert-rules', + 'Data sources with configured alert rules' + ), + options: alertManagingDs, + expanded: true, + }, + { + label: t( + 'alerting.multiple-data-source-picker.get-data-source-options.grouped-options.label.other-data-sources', + 'Other data sources' + ), + options: nonAlertManagingDs, + expanded: true, + }, ]; return groupedOptions; diff --git a/public/app/features/alerting/unified/components/rules/RuleDetails.tsx b/public/app/features/alerting/unified/components/rules/RuleDetails.tsx index eeee887a29e..f1c272cc3a4 100644 --- a/public/app/features/alerting/unified/components/rules/RuleDetails.tsx +++ b/public/app/features/alerting/unified/components/rules/RuleDetails.tsx @@ -118,7 +118,7 @@ const EvaluationBehaviorSummary = ({ rule }: EvaluationBehaviorSummaryProps) => > <Tooltip placement="top" - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings content={`${dateTimeFormat(lastEvaluation, { format: 'YYYY-MM-DD HH:mm:ss' })}`} theme="info" > @@ -138,7 +138,7 @@ const EvaluationBehaviorSummary = ({ rule }: EvaluationBehaviorSummaryProps) => > <Tooltip placement="top" - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings content={`${lastEvaluationDuration}s`} theme="info" > diff --git a/public/app/features/alerting/unified/components/rules/RulesTable.tsx b/public/app/features/alerting/unified/components/rules/RulesTable.tsx index 8e44d0953cf..6907ed2bef7 100644 --- a/public/app/features/alerting/unified/components/rules/RulesTable.tsx +++ b/public/app/features/alerting/unified/components/rules/RulesTable.tsx @@ -3,6 +3,7 @@ import { useEffect, useMemo } from 'react'; import Skeleton from 'react-loading-skeleton'; import { GrafanaTheme2 } from '@grafana/data'; +import { useTranslate } from '@grafana/i18n'; import { Pagination, Tooltip, useStyles2 } from '@grafana/ui'; import { CombinedRule, RulesSource } from 'app/types/unified-alerting'; @@ -192,17 +193,18 @@ function useColumns( showNextEvaluationColumn: boolean, isRulerLoading: boolean ) { + const { t } = useTranslate(); return useMemo((): RuleTableColumnProps[] => { const columns: RuleTableColumnProps[] = [ { id: 'state', - label: 'State', + label: t('alerting.use-columns.columns.label.state', 'State'), renderCell: ({ data: rule }) => <RuleStateCell rule={rule} />, size: '165px', }, { id: 'name', - label: 'Name', + label: t('alerting.use-columns.columns.label.name', 'Name'), // eslint-disable-next-line react/display-name renderCell: ({ data: rule }) => rule.name, size: showNextEvaluationColumn ? 4 : 5, @@ -237,7 +239,7 @@ function useColumns( }, { id: 'health', - label: 'Health', + label: t('alerting.use-columns.columns.label.health', 'Health'), // eslint-disable-next-line react/display-name renderCell: ({ data: { promRule, group } }) => (promRule ? <RuleHealth rule={promRule} /> : null), size: '75px', @@ -246,7 +248,7 @@ function useColumns( if (showSummaryColumn) { columns.push({ id: 'summary', - label: 'Summary', + label: t('alerting.use-columns.label.summary', 'Summary'), // eslint-disable-next-line react/display-name renderCell: ({ data: rule }) => { return <Tokenize input={rule.annotations[Annotation.summary] ?? ''} />; @@ -258,7 +260,7 @@ function useColumns( if (showNextEvaluationColumn) { columns.push({ id: 'nextEvaluation', - label: 'Next evaluation', + label: t('alerting.use-columns.label.next-evaluation', 'Next evaluation'), renderCell: ({ data: rule }) => { const nextEvalInfo = calculateNextEvaluationEstimate(rule.promRule?.lastEvaluation, rule.group.interval); @@ -266,7 +268,7 @@ function useColumns( nextEvalInfo && ( <Tooltip placement="top" - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings content={`${nextEvalInfo?.fullDate}`} theme="info" > @@ -282,7 +284,7 @@ function useColumns( if (showGroupColumn) { columns.push({ id: 'group', - label: 'Group', + label: t('alerting.use-columns.label.group', 'Group'), // eslint-disable-next-line react/display-name renderCell: ({ data: rule }) => { const { namespace, group } = rule; @@ -301,14 +303,14 @@ function useColumns( } columns.push({ id: 'actions', - label: 'Actions', + label: t('alerting.use-columns.label.actions', 'Actions'), // eslint-disable-next-line react/display-name renderCell: ({ data: rule }) => <RuleActionsCell rule={rule} isLoadingRuler={isRulerLoading} />, size: '215px', }); return columns; - }, [showSummaryColumn, showGroupColumn, showNextEvaluationColumn, isRulerLoading]); + }, [t, showNextEvaluationColumn, showSummaryColumn, showGroupColumn, isRulerLoading]); } function RuleStateCell({ rule }: { rule: CombinedRule }) { diff --git a/public/app/features/alerting/unified/components/rules/central-state-history/CentralAlertHistoryScene.tsx b/public/app/features/alerting/unified/components/rules/central-state-history/CentralAlertHistoryScene.tsx index c9b4d405afa..ae3e052e79d 100644 --- a/public/app/features/alerting/unified/components/rules/central-state-history/CentralAlertHistoryScene.tsx +++ b/public/app/features/alerting/unified/components/rules/central-state-history/CentralAlertHistoryScene.tsx @@ -67,6 +67,7 @@ export const StateFilterValues = { export const CentralAlertHistoryScene = () => { //track the loading of the central alert state history + const { t } = useTranslate(); useEffect(() => { logInfo(LogMessages.loadedCentralAlertStateHistory); }, []); @@ -78,14 +79,17 @@ export const CentralAlertHistoryScene = () => { // textbox variable for filtering by labels const labelsFilterVariable = new TextBoxVariable({ name: LABELS_FILTER, - label: 'Labels: ', + label: t('alerting.central-alert-history-scene.scene.labels-filter-variable.label.labels', 'Labels: '), }); //custom variable for filtering by the current state const transitionsToFilterVariable = new CustomVariable({ name: STATE_FILTER_TO, value: StateFilterValues.all, - label: 'End state:', + label: t( + 'alerting.central-alert-history-scene.scene.transitions-to-filter-variable.label.end-state', + 'End state:' + ), hide: VariableHide.dontHide, query: `All : ${StateFilterValues.all}, To Firing : ${StateFilterValues.firing},To Normal : ${StateFilterValues.normal},To Pending : ${StateFilterValues.pending},To Recovering : ${StateFilterValues.recovering}`, }); @@ -94,7 +98,10 @@ export const CentralAlertHistoryScene = () => { const transitionsFromFilterVariable = new CustomVariable({ name: STATE_FILTER_FROM, value: StateFilterValues.all, - label: 'Start state:', + label: t( + 'alerting.central-alert-history-scene.scene.transitions-from-filter-variable.label.start-state', + 'Start state:' + ), hide: VariableHide.dontHide, query: `All : ${StateFilterValues.all}, From Firing : ${StateFilterValues.firing},From Normal : ${StateFilterValues.normal},From Pending : ${StateFilterValues.pending},From Recovering : ${StateFilterValues.recovering}`, }); @@ -132,7 +139,7 @@ export const CentralAlertHistoryScene = () => { ], }), }); - }, []); + }, [t]); // we need to call this to sync the url with the scene state const isUrlSyncInitialized = useUrlSync(scene); diff --git a/public/app/features/alerting/unified/components/rules/central-state-history/CentralHistoryRuntimeDataSource.ts b/public/app/features/alerting/unified/components/rules/central-state-history/CentralHistoryRuntimeDataSource.ts index 3013b097e16..76e55ef4f8f 100644 --- a/public/app/features/alerting/unified/components/rules/central-state-history/CentralHistoryRuntimeDataSource.ts +++ b/public/app/features/alerting/unified/components/rules/central-state-history/CentralHistoryRuntimeDataSource.ts @@ -1,6 +1,7 @@ import { useEffect, useMemo } from 'react'; import { DataQueryRequest, DataQueryResponse, TestDataSourceResponse } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { getTemplateSrv } from '@grafana/runtime'; import { RuntimeDataSource, sceneUtils } from '@grafana/scenes'; import { DataQuery } from '@grafana/schema'; @@ -72,7 +73,11 @@ class HistoryAPIDatasource extends RuntimeDataSource<HistoryAPIQuery> { } testDatasource(): Promise<TestDataSourceResponse> { - return Promise.resolve({ status: 'success', message: 'Data source is working', title: 'Success' }); + return Promise.resolve({ + status: 'success', + message: t('alerting.history-apidatasource.message.data-source-is-working', 'Data source is working'), + title: t('alerting.history-apidatasource.title.success', 'Success'), + }); } } diff --git a/public/app/features/alerting/unified/components/rules/state-history/LogTimelineViewer.tsx b/public/app/features/alerting/unified/components/rules/state-history/LogTimelineViewer.tsx index 64455d039ff..913d484802d 100644 --- a/public/app/features/alerting/unified/components/rules/state-history/LogTimelineViewer.tsx +++ b/public/app/features/alerting/unified/components/rules/state-history/LogTimelineViewer.tsx @@ -2,6 +2,7 @@ import { memo } from 'react'; import AutoSizer from 'react-virtualized-auto-sizer'; import { DataFrame, InterpolateFunction, TimeRange } from '@grafana/data'; +import { useTranslate } from '@grafana/i18n'; import { VisibilityMode } from '@grafana/schema'; import { LegendDisplayMode, useTheme2 } from '@grafana/ui'; import { TimelineChart } from 'app/core/components/TimelineChart/TimelineChart'; @@ -16,6 +17,7 @@ interface LogTimelineViewerProps { const replaceVariables: InterpolateFunction = (v) => v; export const LogTimelineViewer = memo(({ frames, timeRange }: LogTimelineViewerProps) => { + const { t } = useTranslate(); const theme = useTheme2(); return ( @@ -38,12 +40,36 @@ export const LogTimelineViewer = memo(({ frames, timeRange }: LogTimelineViewerP showLegend: true, }} legendItems={[ - { label: 'Normal', color: theme.colors.success.main, yAxis: 1 }, - { label: 'Pending', color: theme.colors.warning.main, yAxis: 1 }, - { label: 'Recovering', color: theme.colors.warning.main, yAxis: 1 }, - { label: 'Firing', color: theme.colors.error.main, yAxis: 1 }, - { label: 'No Data', color: theme.colors.info.main, yAxis: 1 }, - { label: 'Mixed', color: theme.colors.text.secondary, yAxis: 1 }, + { + label: t('alerting.log-timeline-viewer.label.normal', 'Normal'), + color: theme.colors.success.main, + yAxis: 1, + }, + { + label: t('alerting.log-timeline-viewer.label.pending', 'Pending'), + color: theme.colors.warning.main, + yAxis: 1, + }, + { + label: t('alerting.log-timeline-viewer.label.recovering', 'Recovering'), + color: theme.colors.warning.main, + yAxis: 1, + }, + { + label: t('alerting.log-timeline-viewer.label.firing', 'Firing'), + color: theme.colors.error.main, + yAxis: 1, + }, + { + label: t('alerting.log-timeline-viewer.label.no-data', 'No Data'), + color: theme.colors.info.main, + yAxis: 1, + }, + { + label: t('alerting.log-timeline-viewer.label.mixed', 'Mixed'), + color: theme.colors.text.secondary, + yAxis: 1, + }, ]} replaceVariables={replaceVariables} /> diff --git a/public/app/features/alerting/unified/components/rules/state-history/StateHistory.tsx b/public/app/features/alerting/unified/components/rules/state-history/StateHistory.tsx index 170a674931a..e9d5ee8e158 100644 --- a/public/app/features/alerting/unified/components/rules/state-history/StateHistory.tsx +++ b/public/app/features/alerting/unified/components/rules/state-history/StateHistory.tsx @@ -59,9 +59,19 @@ const StateHistory = ({ ruleUID }: Props) => { } const columns: Array<DynamicTableColumnProps<StateHistoryRowItem>> = [ - { id: 'state', label: 'State', size: 'max-content', renderCell: renderStateCell }, + { + id: 'state', + label: t('alerting.state-history.columns.label.state', 'State'), + size: 'max-content', + renderCell: renderStateCell, + }, { id: 'value', label: '', size: 'auto', renderCell: renderValueCell }, - { id: 'timestamp', label: 'Time', size: 'max-content', renderCell: renderTimestampCell }, + { + id: 'timestamp', + label: t('alerting.state-history.columns.label.time', 'Time'), + size: 'max-content', + renderCell: renderTimestampCell, + }, ]; // group the state history list by unique set of labels diff --git a/public/app/features/alerting/unified/components/settings/AlertmanagerConfig.tsx b/public/app/features/alerting/unified/components/settings/AlertmanagerConfig.tsx index f67922b42f1..5524e12fd2b 100644 --- a/public/app/features/alerting/unified/components/settings/AlertmanagerConfig.tsx +++ b/public/app/features/alerting/unified/components/settings/AlertmanagerConfig.tsx @@ -80,7 +80,10 @@ export default function AlertmanagerConfig({ alertmanagerName, onDismiss, onSave // manually register the config field with validation // @TODO sometimes the value doesn't get registered – find out why register('configJSON', { - required: { value: true, message: 'Configuration cannot be empty' }, + required: { + value: true, + message: t('alerting.alertmanager-config.message.configuration-cannot-be-empty', 'Configuration cannot be empty'), + }, validate: (value: string) => { try { JSON.parse(value); diff --git a/public/app/features/alerting/unified/components/silences/MatchersField.tsx b/public/app/features/alerting/unified/components/silences/MatchersField.tsx index 29626247248..6e7755624d2 100644 --- a/public/app/features/alerting/unified/components/silences/MatchersField.tsx +++ b/public/app/features/alerting/unified/components/silences/MatchersField.tsx @@ -63,7 +63,10 @@ const MatchersField = ({ className, required, ruleUid }: Props) => { > <Input {...register(`matchers.${index}.name` as const, { - required: { value: required, message: 'Required.' }, + required: { + value: required, + message: t('alerting.matchers-field.message.required', 'Required.'), + }, })} defaultValue={matcher.name} placeholder={t('alerting.matchers-field.placeholder-label', 'label')} @@ -85,7 +88,12 @@ const MatchersField = ({ className, required, ruleUid }: Props) => { )} defaultValue={matcher.operator || matcherFieldOptions[0].value} name={`matchers.${index}.operator`} - rules={{ required: { value: required, message: 'Required.' } }} + rules={{ + required: { + value: required, + message: t('alerting.matchers-field.message.required', 'Required.'), + }, + }} /> </Field> <Field @@ -95,7 +103,10 @@ const MatchersField = ({ className, required, ruleUid }: Props) => { > <Input {...register(`matchers.${index}.value` as const, { - required: { value: required, message: 'Required.' }, + required: { + value: required, + message: t('alerting.matchers-field.message.required', 'Required.'), + }, })} defaultValue={matcher.value} placeholder={t('alerting.matchers-field.placeholder-value', 'value')} diff --git a/public/app/features/alerting/unified/components/silences/SilencedInstancesPreview.tsx b/public/app/features/alerting/unified/components/silences/SilencedInstancesPreview.tsx index 1ebba368684..f456c12a4a5 100644 --- a/public/app/features/alerting/unified/components/silences/SilencedInstancesPreview.tsx +++ b/public/app/features/alerting/unified/components/silences/SilencedInstancesPreview.tsx @@ -148,12 +148,13 @@ export const SilencedInstancesPreview = ({ amSourceName, matchers: inputMatchers }; function useColumns(): Array<DynamicTableColumnProps<AlertmanagerAlert>> { + const { t } = useTranslate(); const styles = useStyles2(getStyles); return [ { id: 'state', - label: 'State', + label: t('alerting.use-columns.label.state', 'State'), renderCell: function renderStateTag({ data }) { return <AmAlertStateTag state={data.status.state} />; }, @@ -162,7 +163,7 @@ function useColumns(): Array<DynamicTableColumnProps<AlertmanagerAlert>> { }, { id: 'labels', - label: 'Labels', + label: t('alerting.use-columns.label.labels', 'Labels'), renderCell: function renderName({ data }) { return <AlertLabels labels={data.labels} size="sm" />; }, @@ -170,7 +171,7 @@ function useColumns(): Array<DynamicTableColumnProps<AlertmanagerAlert>> { }, { id: 'created', - label: 'Created', + label: t('alerting.use-columns.label.created', 'Created'), renderCell: function renderSummary({ data }) { return <>{isNullDate(data.startsAt) ? '-' : dateTime(data.startsAt).format('YYYY-MM-DD HH:mm:ss')}</>; }, diff --git a/public/app/features/alerting/unified/components/silences/SilencesEditor.tsx b/public/app/features/alerting/unified/components/silences/SilencesEditor.tsx index 0868ab5bd0d..b5e2187218a 100644 --- a/public/app/features/alerting/unified/components/silences/SilencesEditor.tsx +++ b/public/app/features/alerting/unified/components/silences/SilencesEditor.tsx @@ -254,7 +254,9 @@ export const SilencesEditor = ({ invalid={!!formState.errors.comment} > <TextArea - {...register('comment', { required: { value: true, message: 'Required.' } })} + {...register('comment', { + required: { value: true, message: t('alerting.silences-editor.message.required', 'Required.') }, + })} rows={5} placeholder={t( 'alerting.silences-editor.comment-placeholder-details-about-the-silence', @@ -271,7 +273,9 @@ export const SilencesEditor = ({ invalid={!!formState.errors.createdBy} > <Input - {...register('createdBy', { required: { value: true, message: 'Required.' } })} + {...register('createdBy', { + required: { value: true, message: t('alerting.silences-editor.message.required', 'Required.') }, + })} placeholder={t( 'alerting.silences-editor.placeholder-whos-creating-the-silence', "Who's creating the silence" @@ -321,9 +325,10 @@ const getStyles = (theme: GrafanaTheme2) => ({ }); function ExistingSilenceEditorPage() { + const { t } = useTranslate(); const pageNav = { id: 'silence-edit', - text: 'Edit silence', + text: t('alerting.existing-silence-editor-page.page-nav.text.edit-silence', 'Edit silence'), subTitle: 'Recreate existing silence to stop notifications from a particular alert rule', }; return ( diff --git a/public/app/features/alerting/unified/components/silences/SilencesFilter.tsx b/public/app/features/alerting/unified/components/silences/SilencesFilter.tsx index ee187b70381..7427d37535c 100644 --- a/public/app/features/alerting/unified/components/silences/SilencesFilter.tsx +++ b/public/app/features/alerting/unified/components/silences/SilencesFilter.tsx @@ -59,7 +59,7 @@ export const SilencesFilter = () => { </Trans> </div> - {/* eslint-disable-next-line @grafana/no-untranslated-strings */} + {/* eslint-disable-next-line @grafana/i18n/no-untranslated-strings */} <pre>severity=critical, env=production</pre> </> } diff --git a/public/app/features/alerting/unified/components/silences/SilencesTable.tsx b/public/app/features/alerting/unified/components/silences/SilencesTable.tsx index e8c5f0a968d..ec28ce958c5 100644 --- a/public/app/features/alerting/unified/components/silences/SilencesTable.tsx +++ b/public/app/features/alerting/unified/components/silences/SilencesTable.tsx @@ -293,7 +293,7 @@ function useColumns(alertManagerSourceName: string) { const columns: SilenceTableColumnProps[] = [ { id: 'state', - label: 'State', + label: t('alerting.use-columns.columns.label.state', 'State'), renderCell: function renderStateTag({ data: { status } }) { return <SilenceStateTag state={status.state} />; }, @@ -301,7 +301,7 @@ function useColumns(alertManagerSourceName: string) { }, { id: 'alert-rule', - label: 'Alert rule targeted', + label: t('alerting.use-columns.columns.label.alert-rule-targeted', 'Alert rule targeted'), renderCell: function renderAlertRuleLink({ data: { metadata } }) { return metadata?.rule_title ? ( <Link @@ -317,7 +317,7 @@ function useColumns(alertManagerSourceName: string) { }, { id: 'matchers', - label: 'Matching labels', + label: t('alerting.use-columns.columns.label.matching-labels', 'Matching labels'), renderCell: function renderMatchers({ data: { matchers } }) { const filteredMatchers = matchers?.filter((matcher) => matcher.name !== MATCHER_ALERT_RULE_UID) || []; return <Matchers matchers={filteredMatchers} />; @@ -326,13 +326,13 @@ function useColumns(alertManagerSourceName: string) { }, { id: 'alerts', - label: 'Alerts silenced', + label: t('alerting.use-columns.columns.label.alerts-silenced', 'Alerts silenced'), renderCell: function renderSilencedAlerts({ data: { silencedAlerts } }) { return ( <span data-testid="alerts"> {Array.isArray(silencedAlerts) ? silencedAlerts.length - : // eslint-disable-next-line @grafana/no-untranslated-strings + : // eslint-disable-next-line @grafana/i18n/no-untranslated-strings '-'} </span> ); @@ -341,7 +341,7 @@ function useColumns(alertManagerSourceName: string) { }, { id: 'schedule', - label: 'Schedule', + label: t('alerting.use-columns.columns.label.schedule', 'Schedule'), renderCell: function renderSchedule({ data: { startsAt, endsAt } }) { const startsAtDate = dateMath.parse(startsAt); const endsAtDate = dateMath.parse(endsAt); @@ -354,7 +354,7 @@ function useColumns(alertManagerSourceName: string) { if (updateSupported) { columns.push({ id: 'actions', - label: 'Actions', + label: t('alerting.use-columns.label.actions', 'Actions'), renderCell: function renderActions({ data: silence }) { const isExpired = silence.status.state === SilenceState.Expired; diff --git a/public/app/features/alerting/unified/group-details/validation.ts b/public/app/features/alerting/unified/group-details/validation.ts index 8d635855196..f9f6af75024 100644 --- a/public/app/features/alerting/unified/group-details/validation.ts +++ b/public/app/features/alerting/unified/group-details/validation.ts @@ -1,5 +1,6 @@ import { FieldValues, RegisterOptions } from 'react-hook-form'; +import { t } from '@grafana/i18n/internal'; import { RulerRuleDTO } from 'app/types/unified-alerting-dto'; import { MIN_TIME_RANGE_STEP_S } from '../components/rule-editor/GrafanaEvaluationBehavior'; @@ -10,7 +11,7 @@ import { formatPrometheusDuration, parsePrometheusDuration, safeParsePrometheusD export const evaluateEveryValidationOptions = <T extends FieldValues>(rules: RulerRuleDTO[]): RegisterOptions<T> => ({ required: { value: true, - message: 'Required.', + message: t('alerting.evaluate-every-validation-options.message.required', 'Required.'), }, validate: (evaluateEvery: string) => { try { diff --git a/public/app/features/alerting/unified/home/Insights.tsx b/public/app/features/alerting/unified/home/Insights.tsx index c49ae4c8148..30c2e76946c 100644 --- a/public/app/features/alerting/unified/home/Insights.tsx +++ b/public/app/features/alerting/unified/home/Insights.tsx @@ -1,5 +1,6 @@ import { DataSourceInstanceSettings, DataSourceJsonData } from '@grafana/data'; import { Trans } from '@grafana/i18n'; +import { t } from '@grafana/i18n/internal'; import { getDataSourceSrv } from '@grafana/runtime'; import { EmbeddedScene, @@ -214,7 +215,7 @@ export function getInsightsScenes() { function getGrafanaManagedScenes() { return new NestedScene({ - title: 'Grafana-managed alert rules', + title: t('alerting.get-grafana-managed-scenes.title.grafanamanaged-alert-rules', 'Grafana-managed alert rules'), canCollapse: true, isCollapsed: false, body: new SceneFlexLayout({ @@ -304,7 +305,7 @@ function getGrafanaManagedScenes() { function getGrafanaAlertmanagerScenes() { return new NestedScene({ - title: 'Grafana Alertmanager', + title: t('alerting.get-grafana-alertmanager-scenes.title.grafana-alertmanager', 'Grafana Alertmanager'), canCollapse: true, isCollapsed: false, body: new SceneFlexLayout({ @@ -327,7 +328,7 @@ function getGrafanaAlertmanagerScenes() { function getCloudScenes() { return new NestedScene({ - title: 'Mimir Alertmanager', + title: t('alerting.get-cloud-scenes.title.mimir-alertmanager', 'Mimir Alertmanager'), canCollapse: true, isCollapsed: false, body: new SceneFlexLayout({ @@ -361,7 +362,7 @@ function getCloudScenes() { function getMimirManagedRulesScenes() { return new NestedScene({ - title: 'Mimir-managed alert rules', + title: t('alerting.get-mimir-managed-rules-scenes.title.mimirmanaged-alert-rules', 'Mimir-managed alert rules'), canCollapse: true, isCollapsed: false, body: new SceneFlexLayout({ @@ -402,14 +403,17 @@ function getMimirManagedRulesScenes() { function getMimirManagedRulesPerGroupScenes() { const ruleGroupHandler = new QueryVariable({ - label: 'Rule Group', + label: t('alerting.get-mimir-managed-rules-per-group-scenes.rule-group-handler.label.rule-group', 'Rule Group'), name: 'rule_group', datasource: cloudUsageDs, query: 'label_values(grafanacloud_instance_rule_group_rules,rule_group)', }); return new NestedScene({ - title: 'Mimir-managed alert rules - per rule group', + title: t( + 'alerting.get-mimir-managed-rules-per-group-scenes.title.mimirmanaged-alert-rules-per-rule-group', + 'Mimir-managed alert rules - per rule group' + ), canCollapse: true, isCollapsed: false, body: new SceneFlexLayout({ diff --git a/public/app/features/alerting/unified/hooks/usePrometheusConsistencyCheck.ts b/public/app/features/alerting/unified/hooks/usePrometheusConsistencyCheck.ts index 7e4312ed88e..618b661b2b5 100644 --- a/public/app/features/alerting/unified/hooks/usePrometheusConsistencyCheck.ts +++ b/public/app/features/alerting/unified/hooks/usePrometheusConsistencyCheck.ts @@ -155,20 +155,29 @@ export function useRuleGroupConsistencyCheck() { const { isGroupInSync } = useRuleGroupIsInSync(); const [groupConsistent, setGroupConsistent] = useState<boolean | undefined>(); - const consistencyInterval = useRef<ReturnType<typeof setTimeout> | undefined>(); + const apiCheckInterval = useRef<ReturnType<typeof setTimeout> | undefined>(); + const timeoutInterval = useRef<ReturnType<typeof setTimeout> | undefined>(); useEffect(() => { return () => { - clearConsistencyInterval(); + clearTimeoutInterval(); + clearApiCheckInterval(); }; }, []); - const clearConsistencyInterval = () => { - if (consistencyInterval.current) { - clearTimeout(consistencyInterval.current); - consistencyInterval.current = undefined; + function clearTimeoutInterval() { + if (timeoutInterval.current) { + clearTimeout(timeoutInterval.current); + timeoutInterval.current = undefined; } - }; + } + + function clearApiCheckInterval() { + if (apiCheckInterval.current) { + clearTimeout(apiCheckInterval.current); + apiCheckInterval.current = undefined; + } + } /** * Waits for the rule group to be consistent between Prometheus and the Ruler. @@ -177,11 +186,12 @@ export function useRuleGroupConsistencyCheck() { */ async function waitForGroupConsistency(groupIdentifier: RuleGroupIdentifierV2) { // We can wait only for one rule group at a time - clearConsistencyInterval(); + clearTimeoutInterval(); + clearApiCheckInterval(); const timeoutPromise = new Promise<void>((_, reject) => { - setTimeout(() => { - clearConsistencyInterval(); + timeoutInterval.current = setTimeout(() => { + clearApiCheckInterval(); const error = new Error('Timeout while waiting for rule group consistency'); logError(error, { groupOrigin: groupIdentifier.groupOrigin }); reject(error); @@ -209,15 +219,16 @@ export function useRuleGroupConsistencyCheck() { setGroupConsistent(inSync); if (inSync) { logWaitingTime(); - clearConsistencyInterval(); resolve(); } else { - consistencyInterval.current = setTimeout(checkGroupConsistency, CONSISTENCY_CHECK_POOL_INTERVAL); + apiCheckInterval.current = setTimeout(checkGroupConsistency, CONSISTENCY_CHECK_POOL_INTERVAL); } }) .catch((error) => { - clearConsistencyInterval(); reject(error); + }) + .finally(() => { + clearTimeoutInterval(); }); } diff --git a/public/app/features/alerting/unified/insights/grafana/MostFiringLabels.tsx b/public/app/features/alerting/unified/insights/grafana/MostFiringLabels.tsx index 1a6c054846f..0904bb64c1d 100644 --- a/public/app/features/alerting/unified/insights/grafana/MostFiringLabels.tsx +++ b/public/app/features/alerting/unified/insights/grafana/MostFiringLabels.tsx @@ -1,6 +1,7 @@ import { Observable } from 'rxjs'; import { DataQueryRequest, DataQueryResponse, DataQueryResponseData, TestDataSourceResponse } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { getBackendSrv } from '@grafana/runtime'; import { PanelBuilders, @@ -37,7 +38,11 @@ class LokiAPIDatasource extends RuntimeDataSource { } testDatasource(): Promise<TestDataSourceResponse> { - return Promise.resolve({ status: 'success', message: 'Data source is working', title: 'Success' }); + return Promise.resolve({ + status: 'success', + message: t('alerting.loki-apidatasource.message.data-source-is-working', 'Data source is working'), + title: t('alerting.loki-apidatasource.title.success', 'Success'), + }); } } diff --git a/public/app/features/alerting/unified/rule-list/RuleList.v2.tsx b/public/app/features/alerting/unified/rule-list/RuleList.v2.tsx index eafb54dcd64..da9719602e6 100644 --- a/public/app/features/alerting/unified/rule-list/RuleList.v2.tsx +++ b/public/app/features/alerting/unified/rule-list/RuleList.v2.tsx @@ -1,6 +1,7 @@ import { useMemo } from 'react'; import { Trans, useTranslate } from '@grafana/i18n'; +import { config } from '@grafana/runtime'; import { Button, Dropdown, Icon, LinkButton, Menu, Stack } from '@grafana/ui'; import { AlertingPageWrapper } from '../components/AlertingPageWrapper'; @@ -10,6 +11,7 @@ import { RuleListErrors } from '../components/rules/RuleListErrors'; import { AlertingAction, useAlertingAbility } from '../hooks/useAbilities'; import { useRulesFilter } from '../hooks/useFilteredRules'; import { useURLSearchParams } from '../hooks/useURLSearchParams'; +import { isAdmin } from '../utils/misc'; import { FilterView } from './FilterView'; import { GroupedView } from './GroupedView'; @@ -32,13 +34,16 @@ function RuleList() { } export function RuleListActions() { + const { t } = useTranslate(); + const [createGrafanaRuleSupported, createGrafanaRuleAllowed] = useAlertingAbility(AlertingAction.CreateAlertRule); const [createCloudRuleSupported, createCloudRuleAllowed] = useAlertingAbility(AlertingAction.CreateExternalAlertRule); - const { t } = useTranslate(); + const canCreateGrafanaRules = createGrafanaRuleSupported && createGrafanaRuleAllowed; const canCreateCloudRules = createCloudRuleSupported && createCloudRuleAllowed; const canCreateRules = canCreateGrafanaRules || canCreateCloudRules; + const canImportRulesToGMA = isAdmin() && config.featureToggles.alertingMigrationUI; const moreActionsMenu = useMemo( () => ( @@ -49,6 +54,13 @@ export function RuleListActions() { icon="file-export" url="/alerting/export-new-rule" /> + {canImportRulesToGMA && ( + <Menu.Item + label={t('alerting.rule-list-v2.import-to-gma', 'Import alert rules')} + icon="import" + url="/alerting/import-datasource-managed-rules" + /> + )} </Menu.Group> <Menu.Group label={t('alerting.rule-list.recording-rules', 'Recording rules')}> {canCreateGrafanaRules && ( @@ -68,7 +80,7 @@ export function RuleListActions() { </Menu.Group> </Menu> ), - [canCreateGrafanaRules, canCreateCloudRules, t] + [t, canCreateGrafanaRules, canCreateCloudRules, canImportRulesToGMA] ); return ( diff --git a/public/app/features/alerting/unified/rule-list/components/DataSourceSection.tsx b/public/app/features/alerting/unified/rule-list/components/DataSourceSection.tsx index 6fad0fa1d7f..c75a9ff9efb 100644 --- a/public/app/features/alerting/unified/rule-list/components/DataSourceSection.tsx +++ b/public/app/features/alerting/unified/rule-list/components/DataSourceSection.tsx @@ -10,8 +10,6 @@ import { RulesSourceApplication } from 'app/types/unified-alerting-dto'; import { Spacer } from '../../components/Spacer'; import { WithReturnButton } from '../../components/WithReturnButton'; -import { supportedImportTypes } from '../../components/import-to-gma/ImportFromDSRules'; -import { useRulesSourcesWithRuler } from '../../hooks/useRuleSourcesWithRuler'; import { isAdmin } from '../../utils/misc'; import { DataSourceIcon } from './Namespace'; @@ -37,11 +35,6 @@ export const DataSourceSection = ({ }: DataSourceSectionProps) => { const [isCollapsed, toggleCollapsed] = useToggle(false); const styles = useStyles2((theme) => getStyles(theme, isCollapsed)); - const { rulesSourcesWithRuler } = useRulesSourcesWithRuler(); - - const showImportLink = - uid !== GrafanaRulesSourceSymbol && - rulesSourcesWithRuler.some(({ uid: dsUid, type }) => dsUid === uid && supportedImportTypes.includes(type)); const { t } = useTranslate(); const configureLink = (() => { @@ -79,16 +72,6 @@ export const DataSourceSection = ({ </Text> )} <Spacer /> - {showImportLink && ( - <LinkButton - variant="secondary" - fill="text" - size="sm" - href={`/alerting/import-datasource-managed-rules?datasourceUid=${String(uid)}`} - > - <Trans i18nKey="alerting.data-source-section.import-to-grafana">Import to Grafana rules</Trans> - </LinkButton> - )} {configureLink && ( <WithReturnButton title={t('alerting.rule-list.return-button.title', 'Alert rules')} diff --git a/public/app/features/auth-config/FieldRenderer.tsx b/public/app/features/auth-config/FieldRenderer.tsx index feb4f9aeb40..1d80f835fb0 100644 --- a/public/app/features/auth-config/FieldRenderer.tsx +++ b/public/app/features/auth-config/FieldRenderer.tsx @@ -7,7 +7,7 @@ import { Checkbox, Field, Input, SecretInput, Select, Switch, useTheme2 } from ' import { fieldMap } from './fields'; import { SSOProviderDTO, SSOSettingsField } from './types'; -import { isSelectableValue } from './utils/guards'; +import { isSelectableValueArray } from './utils/guards'; interface FieldRendererProps extends Pick< @@ -123,7 +123,7 @@ export const FieldRenderer = ({ const watchOptions = watch(name); let options = fieldData.options; if (!fieldData.options?.length) { - options = isSelectableValue(watchOptions) ? watchOptions : []; + options = isSelectableValueArray(watchOptions) ? watchOptions : []; } return ( <Field key={name} {...fieldProps} htmlFor={name}> diff --git a/public/app/features/auth-config/ProviderConfigPage.tsx b/public/app/features/auth-config/ProviderConfigPage.tsx index aae8c91fb90..4ae7dad2455 100644 --- a/public/app/features/auth-config/ProviderConfigPage.tsx +++ b/public/app/features/auth-config/ProviderConfigPage.tsx @@ -3,6 +3,7 @@ import { useParams } from 'react-router-dom-v5-compat'; import { NavModelItem } from '@grafana/data'; import { useTranslate } from '@grafana/i18n'; +import { t } from '@grafana/i18n/internal'; import { Badge, Stack, Text } from '@grafana/ui'; import { Page } from 'app/core/components/Page/Page'; import { PageNotFound } from 'app/core/components/PageNotFound/PageNotFound'; @@ -16,8 +17,11 @@ import { SSOProvider } from './types'; const getPageNav = (config?: SSOProvider): NavModelItem => { if (!config) { return { - text: 'Authentication', - subTitle: 'Configure authentication providers', + text: t('auth-config.get-page-nav.text.authentication', 'Authentication'), + subTitle: t( + 'auth-config.get-page-nav.subTitle.configure-authentication-providers', + 'Configure authentication providers' + ), icon: 'shield', id: 'authentication', }; diff --git a/public/app/features/auth-config/fields.tsx b/public/app/features/auth-config/fields.tsx index 48866ca37e5..9541c95a381 100644 --- a/public/app/features/auth-config/fields.tsx +++ b/public/app/features/auth-config/fields.tsx @@ -9,7 +9,7 @@ import { contextSrv } from 'app/core/core'; import { ServerDiscoveryField } from './components/ServerDiscoveryField'; import { FieldData, SSOProvider, SSOSettingsField } from './types'; -import { isSelectableValue } from './utils/guards'; +import { isSelectableValue, isSelectableValueArray } from './utils/guards'; import { isUrlValid } from './utils/url'; type Section = Record< @@ -53,7 +53,7 @@ export const getSectionFields = (): Section => { fields: ['roleAttributeStrict', 'orgMapping', 'allowAssignGrafanaAdmin', 'skipOrgRoleSync'], }, { - name: 'Extra security measures', + name: extraSecurityLabel, id: 'extra', fields: [ 'allowedOrganizations', @@ -66,6 +66,7 @@ export const getSectionFields = (): Section => { 'tlsClientCert', 'tlsClientKey', 'tlsClientCa', + 'workloadIdentityTokenFile', ], }, ], @@ -284,6 +285,7 @@ const authURLLabel = 'Auth URL'; const tokenURLLabel = 'Token URL'; const apiURLLabel = 'API URL'; const jmesPathLabel = 'JMESPath'; +const workloadIdentityLabel = 'Workload identity'; /** * List all the fields that can be used in the form @@ -313,7 +315,7 @@ export function fieldMap(provider: string): Record<string, FieldData> { ), multi: false, options: clientAuthenticationOptions(provider), - defaultValue: { value: 'none', label: 'None' }, + defaultValue: { value: 'none', label: t('auth-config.field-map.label.none', 'None') }, validation: { required: true, message: t('auth-config.fields.required', 'This field is required'), @@ -357,6 +359,32 @@ export function fieldMap(provider: string): Record<string, FieldData> { 'The audience of the federated identity credential of your OAuth2 app.' ), }, + workloadIdentityTokenFile: { + label: t('auth-config.fields.workload-identity-token-file-label', '{{ workloadIdentityLabel }} token file', { + workloadIdentityLabel, + }), + type: 'text', + description: t( + 'auth-config.fields.workload-identity-token-file-description', + 'The file path to the token file used to authenticate to the OAuth2 provider. This is only required when client authentication is set to "workload_identity". Defaults to /var/run/secrets/azure/tokens/azure-identity-token.' + ), + validation: { + validate: (value, formValues) => { + let clientAuth = formValues.clientAuthentication; + if (isSelectableValue<string>(clientAuth)) { + clientAuth = clientAuth.value; + } + if (clientAuth === 'workload_identity') { + return !!value; + } + return true; + }, + message: t( + 'auth-config.fields.workload-identity-token-file-required', + 'This field must be set when client authentication is set to "Workload identity".' + ), + }, + }, allowedOrganizations: { label: t('auth-config.fields.allowed-organizations-label', 'Allowed organizations'), type: 'select', @@ -405,11 +433,13 @@ export function fieldMap(provider: string): Record<string, FieldData> { ), multi: false, options: [ + /* eslint-disable @grafana/i18n/no-untranslated-strings */ { value: 'AutoDetect', label: 'AutoDetect' }, { value: 'InParams', label: 'InParams' }, { value: 'InHeader', label: 'InHeader' }, ], defaultValue: { value: 'AutoDetect', label: 'AutoDetect' }, + /* eslint-enable @grafana/i18n/no-untranslated-strings */ }, tokenUrl: { label: tokenURLLabel, @@ -463,7 +493,7 @@ export function fieldMap(provider: string): Record<string, FieldData> { if (typeof value === 'string') { return uuidValidate(value); } - if (isSelectableValue(value)) { + if (isSelectableValueArray(value)) { return value.every((v) => v?.value && uuidValidate(v.value)); } return true; @@ -807,7 +837,7 @@ export function fieldMap(provider: string): Record<string, FieldData> { if (typeof value === 'string') { return isNumeric(value); } - if (isSelectableValue(value)) { + if (isSelectableValueArray(value)) { return value.every((v) => v?.value && isNumeric(v.value)); } return true; @@ -884,12 +914,14 @@ function orgMappingDescription(provider: string): string { function clientAuthenticationOptions(provider: string): Array<SelectableValue<string>> { // Other options are purposefully not translated + /* eslint-disable @grafana/i18n/no-untranslated-strings */ switch (provider) { case 'azuread': return [ { value: 'none', label: t('auth-config.fields.client-authentication-none', 'None') }, { value: 'client_secret_post', label: 'Client secret' }, { value: 'managed_identity', label: 'Managed identity' }, + { value: 'workload_identity', label: 'Workload identity' }, ]; // Other providers ... default: @@ -898,4 +930,5 @@ function clientAuthenticationOptions(provider: string): Array<SelectableValue<st { value: 'client_secret_post', label: 'Client secret' }, ]; } + /* eslint-enable @grafana/i18n/no-untranslated-strings */ } diff --git a/public/app/features/auth-config/types.ts b/public/app/features/auth-config/types.ts index b831988aebd..b14336f06ab 100644 --- a/public/app/features/auth-config/types.ts +++ b/public/app/features/auth-config/types.ts @@ -26,6 +26,7 @@ export type SSOProviderSettingsBase = { clientSecret: string; managedIdentityClientId?: string; federatedCredentialAudience?: string; + workloadIdentityTokenFile?: string; emailAttributeName?: string; emailAttributePath?: string; emptyScopes?: boolean; diff --git a/public/app/features/auth-config/utils/data.ts b/public/app/features/auth-config/utils/data.ts index aea5a3e17ba..d11f78bdb6a 100644 --- a/public/app/features/auth-config/utils/data.ts +++ b/public/app/features/auth-config/utils/data.ts @@ -3,7 +3,7 @@ import { SelectableValue } from '@grafana/data'; import { fieldMap, getSectionFields } from '../fields'; import { FieldData, SSOProvider, SSOProviderDTO } from '../types'; -import { isSelectableValue } from './guards'; +import { isSelectableValueArray } from './guards'; export const emptySettings: SSOProviderDTO = { allowAssignGrafanaAdmin: false, @@ -20,6 +20,7 @@ export const emptySettings: SSOProviderDTO = { clientSecret: '', managedIdentityClientId: '', federatedCredentialAudience: '', + workloadIdentityTokenFile: '', emailAttributeName: '', emailAttributePath: '', emptyScopes: false, @@ -118,10 +119,10 @@ export function dtoToData(dto: SSOProviderDTO, provider: string) { for (const field of arrayFields) { const value = current[field]; if (value) { - if (isSelectableValue(value)) { + if (isSelectableValueArray(value)) { //@ts-expect-error settings[field] = valuesToString(value); - } else if (isSelectableValue([value])) { + } else if (isSelectableValueArray([value])) { //@ts-expect-error settings[field] = value.value; } diff --git a/public/app/features/auth-config/utils/guards.ts b/public/app/features/auth-config/utils/guards.ts index 9de8334f4d4..ea99fe2b7b5 100644 --- a/public/app/features/auth-config/utils/guards.ts +++ b/public/app/features/auth-config/utils/guards.ts @@ -1,5 +1,9 @@ import { SelectableValue } from '@grafana/data'; -export function isSelectableValue(value: unknown): value is SelectableValue[] { +export function isSelectableValueArray(value: unknown): value is SelectableValue[] { return Array.isArray(value) && value.every((v) => typeof v === 'object' && v !== null && 'value' in v); } + +export function isSelectableValue<T>(value: unknown): value is SelectableValue<T> { + return typeof value === 'object' && value !== null && 'value' in value; +} diff --git a/public/app/features/browse-dashboards/BrowseDashboardsPage.tsx b/public/app/features/browse-dashboards/BrowseDashboardsPage.tsx index e52accf33ad..15fd546a36b 100644 --- a/public/app/features/browse-dashboards/BrowseDashboardsPage.tsx +++ b/public/app/features/browse-dashboards/BrowseDashboardsPage.tsx @@ -6,7 +6,7 @@ import AutoSizer from 'react-virtualized-auto-sizer'; import { GrafanaTheme2 } from '@grafana/data'; import { Trans } from '@grafana/i18n'; -import { reportInteraction } from '@grafana/runtime'; +import { config, reportInteraction } from '@grafana/runtime'; import { LinkButton, FilterInput, useStyles2, Text, Stack } from '@grafana/ui'; import { Page } from 'app/core/components/Page/Page'; import { getConfig } from 'app/core/config'; @@ -137,16 +137,15 @@ const BrowseDashboardsPage = memo(() => { renderTitle={renderTitle} actions={ <> - {false && - hasAdminRights && ( // TODO: change this to a feature flag when dashboard restore is reworked - <LinkButton - variant="secondary" - href={getConfig().appSubUrl + '/dashboard/recently-deleted'} - onClick={handleButtonClickToRecentlyDeleted} - > - <Trans i18nKey="browse-dashboards.actions.button-to-recently-deleted">Recently deleted</Trans> - </LinkButton> - )} + {config.featureToggles.restoreDashboards && hasAdminRights && ( + <LinkButton + variant="secondary" + href={getConfig().appSubUrl + '/dashboard/recently-deleted'} + onClick={handleButtonClickToRecentlyDeleted} + > + <Trans i18nKey="browse-dashboards.actions.button-to-recently-deleted">Recently deleted</Trans> + </LinkButton> + )} {folderDTO && <FolderActionsButton folder={folderDTO} />} {(canCreateDashboards || canCreateFolders) && ( <CreateNewButton diff --git a/public/app/features/browse-dashboards/components/BrowseActions/BrowseActions.tsx b/public/app/features/browse-dashboards/components/BrowseActions/BrowseActions.tsx index 49f4e611397..1811805720b 100644 --- a/public/app/features/browse-dashboards/components/BrowseActions/BrowseActions.tsx +++ b/public/app/features/browse-dashboards/components/BrowseActions/BrowseActions.tsx @@ -116,6 +116,6 @@ function trackAction(action: keyof typeof actionMap, selectedItems: Omit<Dashboa dashboard: selectedDashboards.length, }, source: 'tree_actions', - restore_enabled: false, + restore_enabled: Boolean(config.featureToggles.restoreDashboards), }); } diff --git a/public/app/features/browse-dashboards/components/BrowseActions/DeleteModal.tsx b/public/app/features/browse-dashboards/components/BrowseActions/DeleteModal.tsx index 494be402b3b..f7cc70b8d48 100644 --- a/public/app/features/browse-dashboards/components/BrowseActions/DeleteModal.tsx +++ b/public/app/features/browse-dashboards/components/BrowseActions/DeleteModal.tsx @@ -1,7 +1,7 @@ import { useState } from 'react'; import { Trans, useTranslate } from '@grafana/i18n'; -import { reportInteraction } from '@grafana/runtime'; +import { config, reportInteraction } from '@grafana/runtime'; import { Alert, ConfirmModal, Text, Space } from '@grafana/ui'; import { useGetAffectedItemsQuery } from '../../api/browseDashboardsAPI'; @@ -44,7 +44,7 @@ export const DeleteModal = ({ onConfirm, onDismiss, selectedItems, ...props }: P <ConfirmModal body={ <> - {false && ( // TODO: change this to a feature flag when dashboard restore is reworked + {config.featureToggles.restoreDashboards && ( <> <Text element="p"> <Trans i18nKey="browse-dashboards.action.delete-modal-restore-dashboards-text"> diff --git a/public/app/features/canvas/elements/button.tsx b/public/app/features/canvas/elements/button.tsx index 2b70fa66e3a..75fc59f8b52 100644 --- a/public/app/features/canvas/elements/button.tsx +++ b/public/app/features/canvas/elements/button.tsx @@ -2,6 +2,7 @@ import { css } from '@emotion/css'; import { useState } from 'react'; import { GrafanaTheme2, PluginState } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { TextDimensionMode } from '@grafana/schema'; import { Button, Spinner, useStyles2 } from '@grafana/ui'; import { DimensionContext } from 'app/features/dimensions/context'; @@ -194,9 +195,9 @@ export const buttonItem: CanvasElementItem<ButtonConfig, ButtonData> = { name: 'Align text', settings: { options: [ - { value: Align.Left, label: 'Left' }, - { value: Align.Center, label: 'Center' }, - { value: Align.Right, label: 'Right' }, + { value: Align.Left, label: t('canvas.button-item.label.left', 'Left') }, + { value: Align.Center, label: t('canvas.button-item.label.center', 'Center') }, + { value: Align.Right, label: t('canvas.button-item.label.right', 'Right') }, ], }, defaultValue: Align.Left, @@ -206,7 +207,7 @@ export const buttonItem: CanvasElementItem<ButtonConfig, ButtonData> = { path: 'config.size', name: 'Text size', settings: { - placeholder: 'Auto', + placeholder: t('canvas.button-item.placeholder.auto', 'Auto'), }, }) .addCustomEditor({ diff --git a/public/app/features/canvas/elements/cloud.tsx b/public/app/features/canvas/elements/cloud.tsx index cff34c95580..0e1088a9e54 100644 --- a/public/app/features/canvas/elements/cloud.tsx +++ b/public/app/features/canvas/elements/cloud.tsx @@ -2,6 +2,7 @@ import { css } from '@emotion/css'; import { v4 as uuidv4 } from 'uuid'; import { GrafanaTheme2 } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { config } from 'app/core/config'; import { DimensionContext } from 'app/features/dimensions'; import { ColorDimensionEditor } from 'app/features/dimensions/editors/ColorDimensionEditor'; @@ -153,9 +154,9 @@ export const cloudItem: CanvasElementItem = { name: 'Align text', settings: { options: [ - { value: Align.Left, label: 'Left' }, - { value: Align.Center, label: 'Center' }, - { value: Align.Right, label: 'Right' }, + { value: Align.Left, label: t('canvas.cloud-item.label.left', 'Left') }, + { value: Align.Center, label: t('canvas.cloud-item.label.center', 'Center') }, + { value: Align.Right, label: t('canvas.cloud-item.label.right', 'Right') }, ], }, defaultValue: Align.Left, @@ -166,9 +167,9 @@ export const cloudItem: CanvasElementItem = { name: 'Vertical align', settings: { options: [ - { value: VAlign.Top, label: 'Top' }, - { value: VAlign.Middle, label: 'Middle' }, - { value: VAlign.Bottom, label: 'Bottom' }, + { value: VAlign.Top, label: t('canvas.cloud-item.label.top', 'Top') }, + { value: VAlign.Middle, label: t('canvas.cloud-item.label.middle', 'Middle') }, + { value: VAlign.Bottom, label: t('canvas.cloud-item.label.bottom', 'Bottom') }, ], }, defaultValue: VAlign.Middle, @@ -178,7 +179,7 @@ export const cloudItem: CanvasElementItem = { path: 'config.size', name: 'Text size', settings: { - placeholder: 'Auto', + placeholder: t('canvas.cloud-item.placeholder.auto', 'Auto'), }, }); }, diff --git a/public/app/features/canvas/elements/ellipse.tsx b/public/app/features/canvas/elements/ellipse.tsx index 11de4f65e2f..d049c094324 100644 --- a/public/app/features/canvas/elements/ellipse.tsx +++ b/public/app/features/canvas/elements/ellipse.tsx @@ -2,6 +2,7 @@ import { css } from '@emotion/css'; import { v4 as uuidv4 } from 'uuid'; import { GrafanaTheme2 } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { config } from 'app/core/config'; import { DimensionContext } from 'app/features/dimensions/context'; import { ColorDimensionEditor } from 'app/features/dimensions/editors/ColorDimensionEditor'; @@ -159,9 +160,9 @@ export const ellipseItem: CanvasElementItem<CanvasElementConfig, CanvasElementDa name: 'Align text', settings: { options: [ - { value: Align.Left, label: 'Left' }, - { value: Align.Center, label: 'Center' }, - { value: Align.Right, label: 'Right' }, + { value: Align.Left, label: t('canvas.ellipse-item.label.left', 'Left') }, + { value: Align.Center, label: t('canvas.ellipse-item.label.center', 'Center') }, + { value: Align.Right, label: t('canvas.ellipse-item.label.right', 'Right') }, ], }, defaultValue: Align.Left, @@ -172,9 +173,9 @@ export const ellipseItem: CanvasElementItem<CanvasElementConfig, CanvasElementDa name: 'Vertical align', settings: { options: [ - { value: VAlign.Top, label: 'Top' }, - { value: VAlign.Middle, label: 'Middle' }, - { value: VAlign.Bottom, label: 'Bottom' }, + { value: VAlign.Top, label: t('canvas.ellipse-item.label.top', 'Top') }, + { value: VAlign.Middle, label: t('canvas.ellipse-item.label.middle', 'Middle') }, + { value: VAlign.Bottom, label: t('canvas.ellipse-item.label.bottom', 'Bottom') }, ], }, defaultValue: VAlign.Middle, @@ -184,7 +185,7 @@ export const ellipseItem: CanvasElementItem<CanvasElementConfig, CanvasElementDa path: 'config.size', name: 'Text size', settings: { - placeholder: 'Auto', + placeholder: t('canvas.ellipse-item.placeholder.auto', 'Auto'), }, }); }, diff --git a/public/app/features/canvas/elements/metricValue.tsx b/public/app/features/canvas/elements/metricValue.tsx index 24174962d2c..42a07d677f2 100644 --- a/public/app/features/canvas/elements/metricValue.tsx +++ b/public/app/features/canvas/elements/metricValue.tsx @@ -4,6 +4,7 @@ import { useObservable } from 'react-use'; import { of } from 'rxjs'; import { DataFrame, FieldNamePickerConfigSettings, GrafanaTheme2, StandardEditorsRegistryItem } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { TextDimensionMode } from '@grafana/schema'; import { usePanelContext, useStyles2 } from '@grafana/ui'; import { FieldNamePicker, frameHasName, getFrameFieldsDisplayNames } from '@grafana/ui/internal'; @@ -220,9 +221,9 @@ export const metricValueItem: CanvasElementItem<TextConfig, TextData> = { name: 'Align text', settings: { options: [ - { value: Align.Left, label: 'Left' }, - { value: Align.Center, label: 'Center' }, - { value: Align.Right, label: 'Right' }, + { value: Align.Left, label: t('canvas.metric-value-item.label.left', 'Left') }, + { value: Align.Center, label: t('canvas.metric-value-item.label.center', 'Center') }, + { value: Align.Right, label: t('canvas.metric-value-item.label.right', 'Right') }, ], }, defaultValue: Align.Left, @@ -233,9 +234,9 @@ export const metricValueItem: CanvasElementItem<TextConfig, TextData> = { name: 'Vertical align', settings: { options: [ - { value: VAlign.Top, label: 'Top' }, - { value: VAlign.Middle, label: 'Middle' }, - { value: VAlign.Bottom, label: 'Bottom' }, + { value: VAlign.Top, label: t('canvas.metric-value-item.label.top', 'Top') }, + { value: VAlign.Middle, label: t('canvas.metric-value-item.label.middle', 'Middle') }, + { value: VAlign.Bottom, label: t('canvas.metric-value-item.label.bottom', 'Bottom') }, ], }, defaultValue: VAlign.Middle, @@ -245,7 +246,7 @@ export const metricValueItem: CanvasElementItem<TextConfig, TextData> = { path: 'config.size', name: 'Text size', settings: { - placeholder: 'Auto', + placeholder: t('canvas.metric-value-item.placeholder.auto', 'Auto'), }, }); }, diff --git a/public/app/features/canvas/elements/parallelogram.tsx b/public/app/features/canvas/elements/parallelogram.tsx index 3a163dd5503..8ad0319daef 100644 --- a/public/app/features/canvas/elements/parallelogram.tsx +++ b/public/app/features/canvas/elements/parallelogram.tsx @@ -2,6 +2,7 @@ import { css } from '@emotion/css'; import { v4 as uuidv4 } from 'uuid'; import { GrafanaTheme2 } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { config } from 'app/core/config'; import { DimensionContext } from 'app/features/dimensions'; import { ColorDimensionEditor } from 'app/features/dimensions/editors/ColorDimensionEditor'; @@ -153,9 +154,9 @@ export const parallelogramItem: CanvasElementItem = { name: 'Align text', settings: { options: [ - { value: Align.Left, label: 'Left' }, - { value: Align.Center, label: 'Center' }, - { value: Align.Right, label: 'Right' }, + { value: Align.Left, label: t('canvas.parallelogram-item.label.left', 'Left') }, + { value: Align.Center, label: t('canvas.parallelogram-item.label.center', 'Center') }, + { value: Align.Right, label: t('canvas.parallelogram-item.label.right', 'Right') }, ], }, defaultValue: Align.Left, @@ -166,9 +167,9 @@ export const parallelogramItem: CanvasElementItem = { name: 'Vertical align', settings: { options: [ - { value: VAlign.Top, label: 'Top' }, - { value: VAlign.Middle, label: 'Middle' }, - { value: VAlign.Bottom, label: 'Bottom' }, + { value: VAlign.Top, label: t('canvas.parallelogram-item.label.top', 'Top') }, + { value: VAlign.Middle, label: t('canvas.parallelogram-item.label.middle', 'Middle') }, + { value: VAlign.Bottom, label: t('canvas.parallelogram-item.label.bottom', 'Bottom') }, ], }, defaultValue: VAlign.Middle, @@ -178,7 +179,7 @@ export const parallelogramItem: CanvasElementItem = { path: 'config.size', name: 'Text size', settings: { - placeholder: 'Auto', + placeholder: t('canvas.parallelogram-item.placeholder.auto', 'Auto'), }, }); }, diff --git a/public/app/features/canvas/elements/rectangle.tsx b/public/app/features/canvas/elements/rectangle.tsx index 08265b8deda..d41777e645b 100644 --- a/public/app/features/canvas/elements/rectangle.tsx +++ b/public/app/features/canvas/elements/rectangle.tsx @@ -2,6 +2,7 @@ import { css } from '@emotion/css'; import { PureComponent } from 'react'; import { GrafanaTheme2 } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { stylesFactory } from '@grafana/ui'; import { config } from 'app/core/config'; import { DimensionContext } from 'app/features/dimensions/context'; @@ -120,9 +121,9 @@ export const rectangleItem: CanvasElementItem<TextConfig, TextData> = { name: 'Align text', settings: { options: [ - { value: Align.Left, label: 'Left' }, - { value: Align.Center, label: 'Center' }, - { value: Align.Right, label: 'Right' }, + { value: Align.Left, label: t('canvas.rectangle-item.label.left', 'Left') }, + { value: Align.Center, label: t('canvas.rectangle-item.label.center', 'Center') }, + { value: Align.Right, label: t('canvas.rectangle-item.label.right', 'Right') }, ], }, defaultValue: Align.Left, @@ -133,9 +134,9 @@ export const rectangleItem: CanvasElementItem<TextConfig, TextData> = { name: 'Vertical align', settings: { options: [ - { value: VAlign.Top, label: 'Top' }, - { value: VAlign.Middle, label: 'Middle' }, - { value: VAlign.Bottom, label: 'Bottom' }, + { value: VAlign.Top, label: t('canvas.rectangle-item.label.top', 'Top') }, + { value: VAlign.Middle, label: t('canvas.rectangle-item.label.middle', 'Middle') }, + { value: VAlign.Bottom, label: t('canvas.rectangle-item.label.bottom', 'Bottom') }, ], }, defaultValue: VAlign.Middle, @@ -145,7 +146,7 @@ export const rectangleItem: CanvasElementItem<TextConfig, TextData> = { path: 'config.size', name: 'Text size', settings: { - placeholder: 'Auto', + placeholder: t('canvas.rectangle-item.placeholder.auto', 'Auto'), }, }); }, diff --git a/public/app/features/canvas/elements/text.tsx b/public/app/features/canvas/elements/text.tsx index 4e17c3e2c9b..f05ee1585e6 100644 --- a/public/app/features/canvas/elements/text.tsx +++ b/public/app/features/canvas/elements/text.tsx @@ -6,6 +6,7 @@ import { of } from 'rxjs'; import { DataFrame, GrafanaTheme2 } from '@grafana/data'; import { useTranslate } from '@grafana/i18n'; +import { t } from '@grafana/i18n/internal'; import { Input, usePanelContext, useStyles2 } from '@grafana/ui'; import { DimensionContext } from 'app/features/dimensions/context'; import { ColorDimensionEditor } from 'app/features/dimensions/editors/ColorDimensionEditor'; @@ -197,9 +198,9 @@ export const textItem: CanvasElementItem<TextConfig, TextData> = { name: 'Align text', settings: { options: [ - { value: Align.Left, label: 'Left' }, - { value: Align.Center, label: 'Center' }, - { value: Align.Right, label: 'Right' }, + { value: Align.Left, label: t('canvas.text-item.label.left', 'Left') }, + { value: Align.Center, label: t('canvas.text-item.label.center', 'Center') }, + { value: Align.Right, label: t('canvas.text-item.label.right', 'Right') }, ], }, defaultValue: Align.Left, @@ -210,9 +211,9 @@ export const textItem: CanvasElementItem<TextConfig, TextData> = { name: 'Vertical align', settings: { options: [ - { value: VAlign.Top, label: 'Top' }, - { value: VAlign.Middle, label: 'Middle' }, - { value: VAlign.Bottom, label: 'Bottom' }, + { value: VAlign.Top, label: t('canvas.text-item.label.top', 'Top') }, + { value: VAlign.Middle, label: t('canvas.text-item.label.middle', 'Middle') }, + { value: VAlign.Bottom, label: t('canvas.text-item.label.bottom', 'Bottom') }, ], }, defaultValue: VAlign.Middle, @@ -222,7 +223,7 @@ export const textItem: CanvasElementItem<TextConfig, TextData> = { path: 'config.size', name: 'Text size', settings: { - placeholder: 'Auto', + placeholder: t('canvas.text-item.placeholder.auto', 'Auto'), }, }); }, diff --git a/public/app/features/canvas/elements/triangle.tsx b/public/app/features/canvas/elements/triangle.tsx index cf640d21a37..b480f7dcf81 100644 --- a/public/app/features/canvas/elements/triangle.tsx +++ b/public/app/features/canvas/elements/triangle.tsx @@ -2,6 +2,7 @@ import { css } from '@emotion/css'; import { v4 as uuidv4 } from 'uuid'; import { GrafanaTheme2 } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { config } from 'app/core/config'; import { DimensionContext } from 'app/features/dimensions'; import { ColorDimensionEditor } from 'app/features/dimensions/editors/ColorDimensionEditor'; @@ -154,9 +155,9 @@ export const triangleItem: CanvasElementItem = { name: 'Align text', settings: { options: [ - { value: Align.Left, label: 'Left' }, - { value: Align.Center, label: 'Center' }, - { value: Align.Right, label: 'Right' }, + { value: Align.Left, label: t('canvas.triangle-item.label.left', 'Left') }, + { value: Align.Center, label: t('canvas.triangle-item.label.center', 'Center') }, + { value: Align.Right, label: t('canvas.triangle-item.label.right', 'Right') }, ], }, defaultValue: Align.Left, @@ -167,9 +168,9 @@ export const triangleItem: CanvasElementItem = { name: 'Vertical align', settings: { options: [ - { value: VAlign.Top, label: 'Top' }, - { value: VAlign.Middle, label: 'Middle' }, - { value: VAlign.Bottom, label: 'Bottom' }, + { value: VAlign.Top, label: t('canvas.triangle-item.label.top', 'Top') }, + { value: VAlign.Middle, label: t('canvas.triangle-item.label.middle', 'Middle') }, + { value: VAlign.Bottom, label: t('canvas.triangle-item.label.bottom', 'Bottom') }, ], }, defaultValue: VAlign.Middle, @@ -179,7 +180,7 @@ export const triangleItem: CanvasElementItem = { path: 'config.size', name: 'Text size', settings: { - placeholder: 'Auto', + placeholder: t('canvas.triangle-item.placeholder.auto', 'Auto'), }, }); }, diff --git a/public/app/features/canvas/runtime/ables.tsx b/public/app/features/canvas/runtime/ables.tsx index 1dd610bdb78..9ccdb5ee73a 100644 --- a/public/app/features/canvas/runtime/ables.tsx +++ b/public/app/features/canvas/runtime/ables.tsx @@ -34,7 +34,6 @@ export const settingsViewable = (scene: Scene) => ({ const rect = moveable.getRect(); return ( - // eslint-disable-next-line @grafana/no-untranslated-strings <div key={'settings-viewable'} className={'moveable-settings'} @@ -70,7 +69,7 @@ export const dimensionViewable = { render(moveable: MoveableManagerInterface<unknown, unknown>, React: Renderer) { const rect = moveable.getRect(); return ( - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings <div key={'dimension-viewable'} className={'moveable-dimension'} diff --git a/public/app/features/canvas/runtime/frame.tsx b/public/app/features/canvas/runtime/frame.tsx index 17d0163618b..d58accc0ade 100644 --- a/public/app/features/canvas/runtime/frame.tsx +++ b/public/app/features/canvas/runtime/frame.tsx @@ -29,7 +29,7 @@ export const frameItemDummy: CanvasElementItem = { display: () => { // never shown to end user - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings return <div>FRAME!</div>; }, }; diff --git a/public/app/features/commandPalette/ResultItem.tsx b/public/app/features/commandPalette/ResultItem.tsx index b8e7924bc11..75e68b3b3d0 100644 --- a/public/app/features/commandPalette/ResultItem.tsx +++ b/public/app/features/commandPalette/ResultItem.tsx @@ -54,7 +54,6 @@ export const ResultItem = React.forwardRef( {!hasCommandOrLink(ancestor) && ( <> <span className={styles.breadcrumbAncestor}>{ancestor.name}</span> - {/* eslint-disable-next-line @grafana/no-untranslated-strings */} <span className={styles.breadcrumbSeparator}>›</span> </> )} diff --git a/public/app/features/commandPalette/ScopesRow.tsx b/public/app/features/commandPalette/ScopesRow.tsx index ab350f9107d..0f2d9521517 100644 --- a/public/app/features/commandPalette/ScopesRow.tsx +++ b/public/app/features/commandPalette/ScopesRow.tsx @@ -26,19 +26,21 @@ export function ScopesRow({ treeScopes, isDirty, apply, toggleNode }: Props) { <span className={styles.scopesText}> <Trans i18nKey={'command-palette.scopes.selected-scopes-label'}>Scopes: </Trans> </span> - {treeScopes?.map((scope) => { - return ( - <FilterPill - key={scope.scopeName} - selected={true} - icon={'times'} - label={scope.title} - onClick={() => { - toggleNode(scope); - }} - /> - ); - })} + <Stack wrap={'wrap'}> + {treeScopes?.map((scope) => { + return ( + <FilterPill + key={scope.scopeName} + selected={true} + icon={'times'} + label={scope.title} + onClick={() => { + toggleNode(scope); + }} + /> + ); + })} + </Stack> </Stack> {isDirty && ( <Button diff --git a/public/app/features/commandPalette/actions/staticActions.ts b/public/app/features/commandPalette/actions/staticActions.ts index 7f4f7d0adb3..0c5fb88c9f5 100644 --- a/public/app/features/commandPalette/actions/staticActions.ts +++ b/public/app/features/commandPalette/actions/staticActions.ts @@ -103,7 +103,7 @@ function getGlobalActions(): CommandPaletteAction[] { ]; if (process.env.NODE_ENV === 'development') { - // eslint-disable @grafana/no-untranslated-strings + // eslint-disable @grafana/i18n/no-untranslated-strings const section = 'Dev tooling'; const currentState = currentMockApiState(); const mockApiAction = currentState ? 'Disable' : 'Enable'; @@ -128,7 +128,7 @@ function getGlobalActions(): CommandPaletteAction[] { togglePseudoLocale(); }, }); - // eslint-enable @grafana/no-untranslated-strings + // eslint-enable @grafana/i18n/no-untranslated-strings } return actions; diff --git a/public/app/features/connections/hooks/useDataSourceSettingsNav.ts b/public/app/features/connections/hooks/useDataSourceSettingsNav.ts index cbf26cc5f09..d0ac090c1ad 100644 --- a/public/app/features/connections/hooks/useDataSourceSettingsNav.ts +++ b/public/app/features/connections/hooks/useDataSourceSettingsNav.ts @@ -1,6 +1,7 @@ import { useLocation, useParams } from 'react-router-dom-v5-compat'; import { NavModel, NavModelItem } from '@grafana/data'; +import { useTranslate } from '@grafana/i18n'; import { getDataSourceSrv } from '@grafana/runtime'; import { getNavModel } from 'app/core/selectors/navModel'; import { useDataSource, useDataSourceMeta, useDataSourceSettings } from 'app/features/datasources/state/hooks'; @@ -9,6 +10,7 @@ import { useGetSingle } from 'app/features/plugins/admin/state/hooks'; import { useSelector } from 'app/types'; export function useDataSourceSettingsNav(pageIdParam?: string) { + const { t } = useTranslate(); const { uid = '' } = useParams<{ uid: string }>(); const location = useLocation(); const datasource = useDataSource(uid); @@ -27,17 +29,17 @@ export function useDataSourceSettingsNav(pageIdParam?: string) { const navIndexId = pageId ? `datasource-${pageId}-${uid}` : `datasource-settings-${uid}`; let pageNav: NavModel = { node: { - text: 'Data Source Nav Node', + text: t('connections.use-data-source-settings-nav.page-nav.text.data-source-nav-node', 'Data Source Nav Node'), }, main: { - text: 'Data Source Nav Node', + text: t('connections.use-data-source-settings-nav.page-nav.text.data-source-nav-node', 'Data Source Nav Node'), }, }; if (loadError) { const node: NavModelItem = { text: loadError, - subTitle: 'Data Source Error', + subTitle: t('connections.use-data-source-settings-nav.node.subTitle.data-source-error', 'Data Source Error'), icon: 'exclamation-triangle', }; diff --git a/public/app/features/connections/pages/DataSourceDetailsPage.tsx b/public/app/features/connections/pages/DataSourceDetailsPage.tsx index e3cbc2294a1..9d034434ca7 100644 --- a/public/app/features/connections/pages/DataSourceDetailsPage.tsx +++ b/public/app/features/connections/pages/DataSourceDetailsPage.tsx @@ -1,6 +1,6 @@ import { useParams } from 'react-router-dom-v5-compat'; -import { Trans } from '@grafana/i18n'; +import { Trans, useTranslate } from '@grafana/i18n'; import { Alert, Badge, TextLink } from '@grafana/ui'; import { PluginDetailsPage } from 'app/features/plugins/admin/components/PluginDetailsPage'; import { StoreState, useSelector, AppNotificationSeverity } from 'app/types'; @@ -8,6 +8,7 @@ import { StoreState, useSelector, AppNotificationSeverity } from 'app/types'; import { ROUTES } from '../constants'; export function DataSourceDetailsPage() { + const { t } = useTranslate(); const overrideNavId = 'standalone-plugin-page-/connections/add-new-connection'; const { id = '' } = useParams<{ id: string }>(); const navIndex = useSelector((state: StoreState) => state.navIndex); @@ -20,8 +21,11 @@ export function DataSourceDetailsPage() { navId={navId} notFoundComponent={<NotFoundDatasource />} notFoundNavModel={{ - text: 'Unknown datasource', - subTitle: 'No datasource with this ID could be found.', + text: t('connections.data-source-details-page.text.unknown-datasource', 'Unknown datasource'), + subTitle: t( + 'connections.data-source-details-page.subTitle.datasource-could-found', + 'No datasource with this ID could be found.' + ), active: true, }} /> diff --git a/public/app/features/connections/pages/NewDataSourcePage.tsx b/public/app/features/connections/pages/NewDataSourcePage.tsx index 43bb54bb096..7b8bcbda524 100644 --- a/public/app/features/connections/pages/NewDataSourcePage.tsx +++ b/public/app/features/connections/pages/NewDataSourcePage.tsx @@ -1,11 +1,17 @@ +import { useTranslate } from '@grafana/i18n'; import { Page } from 'app/core/components/Page/Page'; import { NewDataSource } from 'app/features/datasources/components/NewDataSource'; export function NewDataSourcePage() { + const { t } = useTranslate(); return ( <Page navId={'connections-datasources'} - pageNav={{ text: 'Add data source', subTitle: 'Choose a data source type', active: true }} + pageNav={{ + text: t('connections.new-data-source-page.text.add-data-source', 'Add data source'), + subTitle: t('connections.new-data-source-page.subTitle.choose-a-data-source-type', 'Choose a data source type'), + active: true, + }} > <Page.Contents> <NewDataSource /> diff --git a/public/app/features/connections/tabs/ConnectData/ConnectData.tsx b/public/app/features/connections/tabs/ConnectData/ConnectData.tsx index 92daaf8e04d..cf7e939130f 100644 --- a/public/app/features/connections/tabs/ConnectData/ConnectData.tsx +++ b/public/app/features/connections/tabs/ConnectData/ConnectData.tsx @@ -69,9 +69,12 @@ export function AddNewConnection() { ); const { t } = useTranslate(); const filterByOptions = [ - { value: 'all', label: 'All' }, - { value: 'installed', label: 'Installed' }, - { value: 'has-update', label: 'New Updates' }, + { value: 'all', label: t('connections.add-new-connection.filter-by-options.label.all', 'All') }, + { value: 'installed', label: t('connections.add-new-connection.filter-by-options.label.installed', 'Installed') }, + { + value: 'has-update', + label: t('connections.add-new-connection.filter-by-options.label.new-updates', 'New Updates'), + }, ]; const onClickCardGridItem = (e: MouseEvent<HTMLElement>, item: CardGridItem) => { @@ -160,11 +163,17 @@ export function AddNewConnection() { value={sortBy?.toString()} onChange={onSortByChange} options={[ - { value: 'nameAsc', label: 'By name (A-Z)' }, - { value: 'nameDesc', label: 'By name (Z-A)' }, - { value: 'updated', label: 'By updated date' }, - { value: 'published', label: 'By published date' }, - { value: 'downloads', label: 'By downloads' }, + { value: 'nameAsc', label: t('connections.add-new-connection.label.by-name-az', 'By name (A-Z)') }, + { value: 'nameDesc', label: t('connections.add-new-connection.label.by-name-za', 'By name (Z-A)') }, + { + value: 'updated', + label: t('connections.add-new-connection.label.by-updated-date', 'By updated date'), + }, + { + value: 'published', + label: t('connections.add-new-connection.label.by-published-date', 'By published date'), + }, + { value: 'downloads', label: t('connections.add-new-connection.label.by-downloads', 'By downloads') }, ]} /> </Field> diff --git a/public/app/features/correlations/Forms/ConfigureCorrelationSourceForm.tsx b/public/app/features/correlations/Forms/ConfigureCorrelationSourceForm.tsx index e03d5b8aa34..c2216526e25 100644 --- a/public/app/features/correlations/Forms/ConfigureCorrelationSourceForm.tsx +++ b/public/app/features/correlations/Forms/ConfigureCorrelationSourceForm.tsx @@ -2,8 +2,7 @@ import { css } from '@emotion/css'; import { Controller, useFormContext } from 'react-hook-form'; import { DataSourceInstanceSettings, GrafanaTheme2 } from '@grafana/data'; -import { Trans, useTranslate } from '@grafana/i18n'; -import { TFunction } from '@grafana/i18n/internal'; +import { TFunction, Trans, useTranslate } from '@grafana/i18n'; import { Card, Field, FieldSet, Input, useStyles2 } from '@grafana/ui'; import { DataSourcePicker } from 'app/features/datasources/components/picker/DataSourcePicker'; import { getDatasourceSrv } from 'app/features/plugins/datasource_srv'; @@ -77,7 +76,7 @@ export const ConfigureCorrelationSourceForm = () => { <span className={styles.variable} key={i}> {name} {i < variables.length - 1 - ? // eslint-disable-next-line @grafana/no-untranslated-strings + ? // eslint-disable-next-line @grafana/i18n/no-untranslated-strings ', ' : ''} </span> diff --git a/public/app/features/correlations/Forms/TransformationEditorRow.tsx b/public/app/features/correlations/Forms/TransformationEditorRow.tsx index 3d2f8941af6..ffbe52c6ee6 100644 --- a/public/app/features/correlations/Forms/TransformationEditorRow.tsx +++ b/public/app/features/correlations/Forms/TransformationEditorRow.tsx @@ -138,7 +138,7 @@ const TransformationEditorRow = (props: Props) => { <Label htmlFor={`config.transformations.${defaultValue.id}.expression`}> <Trans i18nKey="correlations.transform-row.expression-label">Expression</Trans> {getSupportedTransTypeDetails(watch(`config.transformations.${index}.type`)).expressionDetails.required - ? // eslint-disable-next-line @grafana/no-untranslated-strings + ? // eslint-disable-next-line @grafana/i18n/no-untranslated-strings ' *' : ''} </Label> diff --git a/public/app/features/dashboard-scene/addToDashboard/AddToDashboardForm.tsx b/public/app/features/dashboard-scene/addToDashboard/AddToDashboardForm.tsx index 8308eb80f90..de40685a0d7 100644 --- a/public/app/features/dashboard-scene/addToDashboard/AddToDashboardForm.tsx +++ b/public/app/features/dashboard-scene/addToDashboard/AddToDashboardForm.tsx @@ -66,14 +66,14 @@ export function AddToDashboardForm<TOptions = undefined>({ if (canCreateDashboard) { saveTargets.push({ - label: 'New dashboard', + label: t('dashboard-scene.add-to-dashboard-form.label.new-dashboard', 'New dashboard'), value: SaveTarget.NewDashboard, }); } if (canWriteDashboard) { saveTargets.push({ - label: 'Existing dashboard', + label: t('dashboard-scene.add-to-dashboard-form.label.existing-dashboard', 'Existing dashboard'), value: SaveTarget.ExistingDashboard, }); } @@ -154,7 +154,15 @@ export function AddToDashboardForm<TOptions = undefined>({ control={control} name="dashboardUid" shouldUnregister - rules={{ required: { value: true, message: 'This field is required.' } }} + rules={{ + required: { + value: true, + message: t( + 'dashboard-scene.add-to-dashboard-form.message.this-field-is-required', + 'This field is required.' + ), + }, + }} /> ); })()} diff --git a/public/app/features/dashboard-scene/addToDashboard/addToDashboard.ts b/public/app/features/dashboard-scene/addToDashboard/addToDashboard.ts index 8abd8dc59d0..f39941df30d 100644 --- a/public/app/features/dashboard-scene/addToDashboard/addToDashboard.ts +++ b/public/app/features/dashboard-scene/addToDashboard/addToDashboard.ts @@ -1,4 +1,5 @@ import { locationUtil, TimeRange } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { config, locationService } from '@grafana/runtime'; import { Panel } from '@grafana/schema'; import store from 'app/core/store'; @@ -56,7 +57,10 @@ export function addToDashboard({ } catch { return { error: AddToDashboardError.SET_DASHBOARD_LS, - message: 'Could not add panel to dashboard. Please try again.', + message: t( + 'dashboard-scene.add-to-dashboard.message.could-panel-dashboard-please-again', + 'Could not add panel to dashboard. Please try again.' + ), }; } @@ -69,7 +73,10 @@ export function addToDashboard({ store.delete(DASHBOARD_FROM_LS_KEY); return { error: GenericError.NAVIGATION, - message: 'Could not navigate to the selected dashboard. Please try again.', + message: t( + 'dashboard-scene.add-to-dashboard.message.could-navigate-selected-dashboard-please-again', + 'Could not navigate to the selected dashboard. Please try again.' + ), }; } diff --git a/public/app/features/dashboard-scene/edit-pane/DashboardEditPaneSplitter.tsx b/public/app/features/dashboard-scene/edit-pane/DashboardEditPaneSplitter.tsx index 079bad18cb2..50b1509a6e2 100644 --- a/public/app/features/dashboard-scene/edit-pane/DashboardEditPaneSplitter.tsx +++ b/public/app/features/dashboard-scene/edit-pane/DashboardEditPaneSplitter.tsx @@ -172,6 +172,7 @@ function getStyles(theme: GrafanaTheme2, headerHeight: number) { bottom: 0, overflow: 'auto', scrollbarWidth: 'thin', + scrollbarGutter: 'stable', // Because the edit pane splitter handle area adds padding we can reduce it here paddingRight: theme.spacing(1), }), diff --git a/public/app/features/dashboard-scene/edit-pane/VizPanelEditableElement.tsx b/public/app/features/dashboard-scene/edit-pane/VizPanelEditableElement.tsx index bfce86da4b7..d633c8a6495 100644 --- a/public/app/features/dashboard-scene/edit-pane/VizPanelEditableElement.tsx +++ b/public/app/features/dashboard-scene/edit-pane/VizPanelEditableElement.tsx @@ -123,10 +123,7 @@ export class VizPanelEditableElement implements EditableDashboardElement, BulkAc } public scrollIntoView() { - if (this.panel.parent instanceof AutoGridItem) { - this.panel.parent.scrollIntoView(); - } - if (this.panel.parent instanceof DashboardGridItem) { + if (this.panel.parent instanceof AutoGridItem || this.panel.parent instanceof DashboardGridItem) { this.panel.parent.scrollIntoView(); } } diff --git a/public/app/features/dashboard-scene/embedding/EmbeddedDashboardTestPage.tsx b/public/app/features/dashboard-scene/embedding/EmbeddedDashboardTestPage.tsx index 15fb71306e3..5accee2f31b 100644 --- a/public/app/features/dashboard-scene/embedding/EmbeddedDashboardTestPage.tsx +++ b/public/app/features/dashboard-scene/embedding/EmbeddedDashboardTestPage.tsx @@ -1,22 +1,30 @@ import { useState } from 'react'; import { PageLayoutType } from '@grafana/data'; +import { useTranslate } from '@grafana/i18n'; import { Box } from '@grafana/ui'; import { Page } from 'app/core/components/Page/Page'; import { EmbeddedDashboard } from './EmbeddedDashboard'; export function EmbeddedDashboardTestPage() { + const { t } = useTranslate(); const [state, setState] = useState('?from=now-5m&to=now'); return ( <Page navId="dashboards/browse" - pageNav={{ text: 'Embedding dashboard', subTitle: 'Showing dashboard: Panel Tests - Pie chart' }} + pageNav={{ + text: t('dashboard-scene.embedded-dashboard-test-page.text.embedding-dashboard', 'Embedding dashboard'), + subTitle: t( + 'dashboard-scene.embedded-dashboard-test-page.subTitle.showing-dashboard-panel-tests-pie-chart', + 'Showing dashboard: Panel Tests - Pie chart' + ), + }} layout={PageLayoutType.Canvas} > {/* this is a test page, no need to translate */} - {/* eslint-disable-next-line @grafana/no-untranslated-strings */} + {/* eslint-disable-next-line @grafana/i18n/no-untranslated-strings */} <Box paddingY={2}>Internal url state: {state}</Box> <EmbeddedDashboard uid="lVE-2YFMz" initialState={state} onStateChange={setState} /> </Page> diff --git a/public/app/features/dashboard-scene/inspect/HelpWizard/HelpWizard.tsx b/public/app/features/dashboard-scene/inspect/HelpWizard/HelpWizard.tsx index 51e1fe29308..c5cf57b33a9 100644 --- a/public/app/features/dashboard-scene/inspect/HelpWizard/HelpWizard.tsx +++ b/public/app/features/dashboard-scene/inspect/HelpWizard/HelpWizard.tsx @@ -63,8 +63,8 @@ export function HelpWizard({ panel, onClose }: Props) { } const tabs = [ - { label: 'Snapshot', value: SnapshotTab.Support }, - { label: 'Data', value: SnapshotTab.Data }, + { label: t('dashboard-scene.help-wizard.tabs.label.snapshot', 'Snapshot'), value: SnapshotTab.Support }, + { label: t('dashboard-scene.help-wizard.tabs.label.data', 'Data'), value: SnapshotTab.Data }, ]; const hasSupportBundleAccess = diff --git a/public/app/features/dashboard-scene/inspect/HelpWizard/SupportSnapshotService.ts b/public/app/features/dashboard-scene/inspect/HelpWizard/SupportSnapshotService.ts index c58e00c6667..9aa175b6606 100644 --- a/public/app/features/dashboard-scene/inspect/HelpWizard/SupportSnapshotService.ts +++ b/public/app/features/dashboard-scene/inspect/HelpWizard/SupportSnapshotService.ts @@ -1,6 +1,7 @@ import saveAs from 'file-saver'; import { dateTimeFormat, formattedValueToString, getValueFormat, SelectableValue } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { sceneGraph, SceneObject, VizPanel } from '@grafana/scenes'; import { StateManagerBase } from 'app/core/services/StateManagerBase'; @@ -54,13 +55,16 @@ export class SupportSnapshotService extends StateManagerBase<SupportSnapshotStat snapshotUpdate: 0, options: [ { - label: 'GitHub comment', + label: t('dashboard-scene.support-snapshot-service.label.git-hub-comment', 'GitHub comment'), description: 'Copy and paste this message into a GitHub issue or comment', value: ShowMessage.GithubComment, }, { - label: 'Panel support snapshot', - description: 'Dashboard JSON used to help troubleshoot visualization issues', + label: t('dashboard-scene.support-snapshot-service.label.panel-support-snapshot', 'Panel support snapshot'), + description: t( + 'dashboard-scene.support-snapshot-service.description.dashboard-troubleshoot-visualization-issues', + 'Dashboard JSON used to help troubleshoot visualization issues' + ), value: ShowMessage.PanelSnapshot, }, ], @@ -102,7 +106,10 @@ export class SupportSnapshotService extends StateManagerBase<SupportSnapshotStat if (markdownText.length > maxLen) { this.setState({ error: { - title: 'Copy to clipboard failed', + title: t( + 'dashboard-scene.support-snapshot-service.title.copy-to-clipboard-failed', + 'Copy to clipboard failed' + ), message: 'Snapshot is too large, consider download and attaching a file instead', }, }); diff --git a/public/app/features/dashboard-scene/inspect/HelpWizard/utils.ts b/public/app/features/dashboard-scene/inspect/HelpWizard/utils.ts index 9794fd402a4..1a6ce8f9833 100644 --- a/public/app/features/dashboard-scene/inspect/HelpWizard/utils.ts +++ b/public/app/features/dashboard-scene/inspect/HelpWizard/utils.ts @@ -149,6 +149,7 @@ export async function getDebugDashboard(panel: VizPanel, rand: Randomize, timeRa } if (annotationsCount > 0) { + const DEBUG_DASHBOARD_TITLE_DO_NOT_TRANSLATE = 'Annotations'; dashboard.panels.push({ id: 7, gridPos: { @@ -158,7 +159,7 @@ export async function getDebugDashboard(panel: VizPanel, rand: Randomize, timeRa y: 20, }, type: 'table', - title: 'Annotations', + title: DEBUG_DASHBOARD_TITLE_DO_NOT_TRANSLATE, datasource: { type: 'datasource', uid: '-- Dashboard --', diff --git a/public/app/features/dashboard-scene/pages/DashboardScenePage.test.tsx b/public/app/features/dashboard-scene/pages/DashboardScenePage.test.tsx index 0597b9e076b..df5c82abbc9 100644 --- a/public/app/features/dashboard-scene/pages/DashboardScenePage.test.tsx +++ b/public/app/features/dashboard-scene/pages/DashboardScenePage.test.tsx @@ -21,7 +21,11 @@ import { dashboardSceneGraph } from '../utils/dashboardSceneGraph'; import { setupLoadDashboardMockReject, setupLoadDashboardRuntimeErrorMock } from '../utils/test-utils'; import { DashboardScenePage, Props } from './DashboardScenePage'; -import { getDashboardScenePageStateManager } from './DashboardScenePageStateManager'; +import { + DashboardScenePageStateManager, + DashboardScenePageStateManagerV2, + getDashboardScenePageStateManager, +} from './DashboardScenePageStateManager'; jest.mock('@grafana/runtime', () => ({ ...jest.requireActual('@grafana/runtime'), @@ -80,7 +84,7 @@ function setup({ routeProps }: { routeProps?: Partial<GrafanaRouteComponentProps ); }; - return { rerender, context, props }; + return { rerender, context, props, unmount: renderResult.unmount }; } const simpleDashboard: Dashboard = { @@ -391,6 +395,18 @@ describe('DashboardScenePage', () => { expect(await screen.findByTestId('dashboard-page-error')).toHaveTextContent('Runtime error'); }); }); + + describe('UnifiedDashboardScenePageStateManager', () => { + it('should reset active manager when unmounting', async () => { + const manager = getDashboardScenePageStateManager(); + manager.setActiveManager('v2'); + const { unmount } = setup(); + + expect(manager['activeManager']).toBeInstanceOf(DashboardScenePageStateManagerV2); + unmount(); + expect(manager['activeManager']).toBeInstanceOf(DashboardScenePageStateManager); + }); + }); }); interface VizOptions { diff --git a/public/app/features/dashboard-scene/pages/DashboardScenePage.tsx b/public/app/features/dashboard-scene/pages/DashboardScenePage.tsx index b13ca336072..bcdcff100ec 100644 --- a/public/app/features/dashboard-scene/pages/DashboardScenePage.tsx +++ b/public/app/features/dashboard-scene/pages/DashboardScenePage.tsx @@ -50,6 +50,7 @@ export function DashboardScenePage({ route, queryParams, location }: Props) { return () => { preserveDashboardSceneStateInLocalStorage(locationService.getSearch(), uid); stateManager.clearState(); + stateManager.resetActiveManager(); }; // removing slug and path (which has slug in it) from dependencies to prevent unmount when data links reference diff --git a/public/app/features/dashboard-scene/pages/DashboardScenePageStateManager.ts b/public/app/features/dashboard-scene/pages/DashboardScenePageStateManager.ts index a7fe4ce73fc..43417eceb77 100644 --- a/public/app/features/dashboard-scene/pages/DashboardScenePageStateManager.ts +++ b/public/app/features/dashboard-scene/pages/DashboardScenePageStateManager.ts @@ -1,6 +1,7 @@ import { isEqual } from 'lodash'; import { locationUtil, UrlQueryMap } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { config, getBackendSrv, isFetchError, locationService } from '@grafana/runtime'; import { sceneGraph } from '@grafana/scenes'; import { Spec as DashboardV2Spec } from '@grafana/schema/dist/esm/schema/dashboard/v2alpha1/types.spec.gen'; @@ -545,7 +546,10 @@ export class DashboardScenePageStateManager extends DashboardScenePageStateManag isLoading: false, loadError: { status: 404, - message: 'Dashboard not found', + message: t( + 'dashboard-scene.dashboard-scene-page-state-manager.message.dashboard-not-found', + 'Dashboard not found' + ), }, }); return; @@ -728,7 +732,10 @@ export class DashboardScenePageStateManagerV2 extends DashboardScenePageStateMan isLoading: false, loadError: { status: 404, - message: 'Dashboard not found', + message: t( + 'dashboard-scene.dashboard-scene-page-state-manager-v2.message.dashboard-not-found', + 'Dashboard not found' + ), }, }); return; @@ -878,6 +885,9 @@ export class UnifiedDashboardScenePageStateManager extends DashboardScenePageSta this.activeManager = this.v2Manager; } } + public resetActiveManager() { + this.setActiveManager('v1'); + } } const managers: { diff --git a/public/app/features/dashboard-scene/panel-edit/PanelEditor.tsx b/public/app/features/dashboard-scene/panel-edit/PanelEditor.tsx index 3ca1344b3d0..01929d48451 100644 --- a/public/app/features/dashboard-scene/panel-edit/PanelEditor.tsx +++ b/public/app/features/dashboard-scene/panel-edit/PanelEditor.tsx @@ -2,6 +2,7 @@ import * as H from 'history'; import { debounce } from 'lodash'; import { NavIndex, PanelPlugin } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { config, locationService } from '@grafana/runtime'; import { PanelBuilders, @@ -245,7 +246,7 @@ export class PanelEditor extends SceneObjectBase<PanelEditorState> { const dashboard = getDashboardSceneFor(this); return { - text: 'Edit panel', + text: t('dashboard-scene.panel-editor.text.edit-panel', 'Edit panel'), parentItem: dashboard.getPageNav(location, navIndex), }; } diff --git a/public/app/features/dashboard-scene/panel-edit/PanelVizTypePicker.tsx b/public/app/features/dashboard-scene/panel-edit/PanelVizTypePicker.tsx index 7cec55724e9..0e8ef93a20c 100644 --- a/public/app/features/dashboard-scene/panel-edit/PanelVizTypePicker.tsx +++ b/public/app/features/dashboard-scene/panel-edit/PanelVizTypePicker.tsx @@ -76,8 +76,14 @@ export function PanelVizTypePicker({ panel, data, onChange, onClose }: Props) { const { t } = useTranslate(); const radioOptions: Array<SelectableValue<VisualizationSelectPaneTab>> = [ - { label: 'Visualizations', value: VisualizationSelectPaneTab.Visualizations }, - { label: 'Suggestions', value: VisualizationSelectPaneTab.Suggestions }, + { + label: t('dashboard-scene.panel-viz-type-picker.radio-options.label.visualizations', 'Visualizations'), + value: VisualizationSelectPaneTab.Visualizations, + }, + { + label: t('dashboard-scene.panel-viz-type-picker.radio-options.label.suggestions', 'Suggestions'), + value: VisualizationSelectPaneTab.Suggestions, + }, ]; return ( diff --git a/public/app/features/dashboard-scene/panel-edit/getPanelFrameOptions.tsx b/public/app/features/dashboard-scene/panel-edit/getPanelFrameOptions.tsx index a7bcb4a6bea..503406a0118 100644 --- a/public/app/features/dashboard-scene/panel-edit/getPanelFrameOptions.tsx +++ b/public/app/features/dashboard-scene/panel-edit/getPanelFrameOptions.tsx @@ -1,5 +1,6 @@ import { CoreApp } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; +import { t } from '@grafana/i18n/internal'; import { config } from '@grafana/runtime'; import { SceneTimeRangeLike, VizPanel } from '@grafana/scenes'; import { DataLinksInlineEditor, Input, TextArea, Switch } from '@grafana/ui'; @@ -19,7 +20,7 @@ import { getDashboardSceneFor } from '../utils/utils'; export function getPanelFrameOptions(panel: VizPanel): OptionsPaneCategoryDescriptor { const descriptor = new OptionsPaneCategoryDescriptor({ - title: 'Panel options', + title: t('dashboard-scene.get-panel-frame-options.descriptor.title.panel-options', 'Panel options'), id: 'Panel options', isOpenDefault: true, }); @@ -32,7 +33,7 @@ export function getPanelFrameOptions(panel: VizPanel): OptionsPaneCategoryDescri descriptor .addItem( new OptionsPaneItemDescriptor({ - title: 'Title', + title: t('dashboard-scene.get-panel-frame-options.title.title', 'Title'), value: panel.state.title, popularRank: 1, render: function renderTitle() { @@ -49,7 +50,7 @@ export function getPanelFrameOptions(panel: VizPanel): OptionsPaneCategoryDescri ) .addItem( new OptionsPaneItemDescriptor({ - title: 'Description', + title: t('dashboard-scene.get-panel-frame-options.title.description', 'Description'), value: panel.state.description, render: function renderDescription() { return <PanelDescriptionTextArea panel={panel} />; @@ -64,7 +65,7 @@ export function getPanelFrameOptions(panel: VizPanel): OptionsPaneCategoryDescri ) .addItem( new OptionsPaneItemDescriptor({ - title: 'Transparent background', + title: t('dashboard-scene.get-panel-frame-options.title.transparent-background', 'Transparent background'), render: function renderTransparent() { return <PanelBackgroundSwitch panel={panel} />; }, @@ -72,13 +73,13 @@ export function getPanelFrameOptions(panel: VizPanel): OptionsPaneCategoryDescri ) .addCategory( new OptionsPaneCategoryDescriptor({ - title: 'Panel links', + title: t('dashboard-scene.get-panel-frame-options.title.panel-links', 'Panel links'), id: 'Panel links', isOpenDefault: false, itemsCount: links?.length, }).addItem( new OptionsPaneItemDescriptor({ - title: 'Panel links', + title: t('dashboard-scene.get-panel-frame-options.title.panel-links', 'Panel links'), render: () => <ScenePanelLinksEditor panelLinks={panelLinksObject ?? undefined} />, }) ) diff --git a/public/app/features/dashboard-scene/saving/provisioned/SaveProvisionedDashboardForm.test.tsx b/public/app/features/dashboard-scene/saving/provisioned/SaveProvisionedDashboardForm.test.tsx index 12540d371c9..eec8d44b8d8 100644 --- a/public/app/features/dashboard-scene/saving/provisioned/SaveProvisionedDashboardForm.test.tsx +++ b/public/app/features/dashboard-scene/saving/provisioned/SaveProvisionedDashboardForm.test.tsx @@ -390,8 +390,9 @@ describe('SaveProvisionedDashboardForm', () => { expect(screen.getByRole('button', { name: /save/i })).toBeDisabled(); }); - it('should show read-only alert when repository has no workflows', () => { + it('should properly handle read-only state for a repository without workflows', () => { setup({ + isNew: false, repository: { name: 'repo-abc', type: 'github', @@ -401,6 +402,20 @@ describe('SaveProvisionedDashboardForm', () => { }, }); - expect(screen.getByText('This repository is read only')).toBeInTheDocument(); + // Alert is shown + expect(screen.getByRole('alert', { name: 'This repository is read only' })).toBeInTheDocument(); + + // Save button is disabled + const saveButton = screen.getByRole('button', { name: /save/i }); + expect(saveButton).toBeDisabled(); + + // Common options are not shown for existing dashboards + expect(screen.queryByTestId('common-options')).not.toBeInTheDocument(); + + // Workflow options are not shown + expect(screen.queryByRole('radiogroup')).not.toBeInTheDocument(); + + // Branch field is not shown + expect(screen.queryByRole('textbox', { name: /branch/i })).not.toBeInTheDocument(); }); }); diff --git a/public/app/features/dashboard-scene/saving/provisioned/SaveProvisionedDashboardForm.tsx b/public/app/features/dashboard-scene/saving/provisioned/SaveProvisionedDashboardForm.tsx index 907a8031ef2..a177964f7e2 100644 --- a/public/app/features/dashboard-scene/saving/provisioned/SaveProvisionedDashboardForm.tsx +++ b/public/app/features/dashboard-scene/saving/provisioned/SaveProvisionedDashboardForm.tsx @@ -159,11 +159,11 @@ export function SaveProvisionedDashboardForm({ }; const workflowOptions = getWorkflowOptions(repository, loadedFromRef); - + const readOnly = !repository?.workflows?.length; return ( <form onSubmit={handleSubmit(handleFormSubmit)} name="save-provisioned-form"> <Stack direction="column" gap={2}> - {!repository?.workflows?.length && ( + {readOnly && ( <Alert title={t( 'dashboard-scene.save-provisioned-dashboard-form.title-this-repository-is-read-only', @@ -179,6 +179,7 @@ export function SaveProvisionedDashboardForm({ {isNew && ( <> <Field + noMargin label={t('dashboard-scene.save-provisioned-dashboard-form.label-title', 'Title')} invalid={!!errors.title} error={errors.title?.message} @@ -195,6 +196,7 @@ export function SaveProvisionedDashboardForm({ /> </Field> <Field + noMargin label={t('dashboard-scene.save-provisioned-dashboard-form.label-description', 'Description')} invalid={!!errors.description} error={errors.description?.message} @@ -202,7 +204,10 @@ export function SaveProvisionedDashboardForm({ <TextArea id="dashboard-description" {...register('description')} /> </Field> - <Field label={t('dashboard-scene.save-provisioned-dashboard-form.label-target-folder', 'Target folder')}> + <Field + noMargin + label={t('dashboard-scene.save-provisioned-dashboard-form.label-target-folder', 'Target folder')} + > <Controller control={control} name={'folder'} @@ -232,9 +237,10 @@ export function SaveProvisionedDashboardForm({ </> )} - {!isNew && <SaveDashboardFormCommonOptions drawer={drawer} changeInfo={changeInfo} />} + {!isNew && !readOnly && <SaveDashboardFormCommonOptions drawer={drawer} changeInfo={changeInfo} />} <Field + noMargin label={t('dashboard-scene.save-provisioned-dashboard-form.label-path', 'Path')} description={t( 'dashboard-scene.save-provisioned-dashboard-form.description-inside-repository', @@ -244,10 +250,11 @@ export function SaveProvisionedDashboardForm({ <Input id="dashboard-path" {...register('path')} readOnly={!isNew} /> </Field> - <Field label={t('dashboard-scene.save-provisioned-dashboard-form.label-comment', 'Comment')}> + <Field noMargin label={t('dashboard-scene.save-provisioned-dashboard-form.label-comment', 'Comment')}> <TextArea id="dashboard-comment" {...register('comment')} + disabled={readOnly} placeholder={t( 'dashboard-scene.save-provisioned-dashboard-form.dashboard-comment-placeholder-describe-changes-optional', 'Add a note to describe your changes (optional)' @@ -256,9 +263,9 @@ export function SaveProvisionedDashboardForm({ /> </Field> - {isGitHub && ( + {isGitHub && !readOnly && ( <> - <Field label={t('dashboard-scene.save-provisioned-dashboard-form.label-workflow', 'Workflow')}> + <Field noMargin label={t('dashboard-scene.save-provisioned-dashboard-form.label-workflow', 'Workflow')}> <Controller control={control} name="workflow" @@ -269,6 +276,7 @@ export function SaveProvisionedDashboardForm({ </Field> {workflow === 'branch' && ( <Field + noMargin label={t('dashboard-scene.save-provisioned-dashboard-form.label-branch', 'Branch')} description={t( 'dashboard-scene.save-provisioned-dashboard-form.description-branch-name-in-git-hub', @@ -284,7 +292,7 @@ export function SaveProvisionedDashboardForm({ )} <Stack gap={2}> - <Button variant="primary" type="submit" disabled={request.isLoading || !isDirty}> + <Button variant="primary" type="submit" disabled={request.isLoading || !isDirty || readOnly}> {request.isLoading ? t('dashboard-scene.save-provisioned-dashboard-form.saving', 'Saving...') : t('dashboard-scene.save-provisioned-dashboard-form.save', 'Save')} diff --git a/public/app/features/dashboard-scene/saving/provisioned/defaults.ts b/public/app/features/dashboard-scene/saving/provisioned/defaults.ts index 6318ef49551..b6ee6a6b113 100644 --- a/public/app/features/dashboard-scene/saving/provisioned/defaults.ts +++ b/public/app/features/dashboard-scene/saving/provisioned/defaults.ts @@ -1,3 +1,4 @@ +import { t } from '@grafana/i18n/internal'; import { RepositoryView } from 'app/api/clients/provisioning'; export function getDefaultWorkflow(config?: RepositoryView, loadedFromRef?: string) { @@ -27,7 +28,10 @@ export function getWorkflowOptions(config?: RepositoryView, ref?: string) { case 'write': return { label: ref ? `Push to ${ref}` : 'Save', value }; case 'branch': - return { label: 'Push to a new branch', value }; + return { + label: t('dashboard-scene.get-workflow-options.label.push-to-a-new-branch', 'Push to a new branch'), + value, + }; } return { label: value, value }; }); diff --git a/public/app/features/dashboard-scene/saving/shared.tsx b/public/app/features/dashboard-scene/saving/shared.tsx index 0af0f89752c..e40fb6e1885 100644 --- a/public/app/features/dashboard-scene/saving/shared.tsx +++ b/public/app/features/dashboard-scene/saving/shared.tsx @@ -2,7 +2,7 @@ import * as React from 'react'; import { selectors } from '@grafana/e2e-selectors'; import { Trans, useTranslate } from '@grafana/i18n'; -import { isFetchError } from '@grafana/runtime'; +import { config, isFetchError } from '@grafana/runtime'; import { Dashboard } from '@grafana/schema'; import { Spec as DashboardV2Spec } from '@grafana/schema/dist/esm/schema/dashboard/v2alpha1/types.spec.gen'; import { Alert, Box, Button, Stack } from '@grafana/ui'; @@ -42,7 +42,7 @@ export interface NameAlreadyExistsErrorProps { export function NameAlreadyExistsError({ cancelButton, saveButton }: NameAlreadyExistsErrorProps) { const { t } = useTranslate(); - const isRestoreDashboardsEnabled = false; + const isRestoreDashboardsEnabled = config.featureToggles.restoreDashboards; return isRestoreDashboardsEnabled ? ( <Alert title={t('save-dashboards.name-exists.title', 'Dashboard name already exists')} severity="error"> <p> diff --git a/public/app/features/dashboard-scene/scene/DashboardLayoutOrchestrator.tsx b/public/app/features/dashboard-scene/scene/DashboardLayoutOrchestrator.tsx index f97eeaa87a0..ff46c11cc0e 100644 --- a/public/app/features/dashboard-scene/scene/DashboardLayoutOrchestrator.tsx +++ b/public/app/features/dashboard-scene/scene/DashboardLayoutOrchestrator.tsx @@ -101,13 +101,17 @@ export class DashboardLayoutOrchestrator extends SceneObjectBase<DashboardLayout } private _getDropTargetUnderMouse(evt: MouseEvent): DashboardDropTarget | null { - const key = document - .elementsFromPoint(evt.clientX, evt.clientY) - ?.find((element) => { - const key = element.getAttribute('data-dashboard-drop-target-key'); + const elementsUnderPoint = document.elementsFromPoint(evt.clientX, evt.clientY); + const cursorIsInSourceTarget = elementsUnderPoint.some( + (el) => el.getAttribute('data-dashboard-drop-target-key') === this._sourceDropTarget?.state.key + ); - return !!key && key !== this._sourceDropTarget?.state.key; - }) + if (cursorIsInSourceTarget) { + return null; + } + + const key = elementsUnderPoint + ?.find((element) => element.getAttribute('data-dashboard-drop-target-key')) ?.getAttribute('data-dashboard-drop-target-key'); if (!key) { diff --git a/public/app/features/dashboard-scene/scene/DashboardScene.tsx b/public/app/features/dashboard-scene/scene/DashboardScene.tsx index 718e9b87b3e..3ed630e7c96 100644 --- a/public/app/features/dashboard-scene/scene/DashboardScene.tsx +++ b/public/app/features/dashboard-scene/scene/DashboardScene.tsx @@ -1,6 +1,7 @@ import * as H from 'history'; import { CoreApp, DataQueryRequest, NavIndex, NavModelItem, locationUtil } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { config, locationService, RefreshEvent } from '@grafana/runtime'; import { sceneGraph, @@ -84,7 +85,6 @@ import { setupKeyboardShortcuts } from './keyboardShortcuts'; import { AutoGridItem } from './layout-auto-grid/AutoGridItem'; import { DashboardGridItem } from './layout-default/DashboardGridItem'; import { DefaultGridLayoutManager } from './layout-default/DefaultGridLayoutManager'; -import { LayoutRestorer } from './layouts-shared/LayoutRestorer'; import { addNewRowTo, addNewTabTo } from './layouts-shared/addNew'; import { clearClipboard } from './layouts-shared/paste'; import { DashboardLayoutManager } from './types/DashboardLayoutManager'; @@ -191,11 +191,9 @@ export class DashboardScene extends SceneObjectBase<DashboardSceneState> impleme DashboardJson | DashboardV2Spec >; - private _layoutRestorer = new LayoutRestorer(); - public constructor(state: Partial<DashboardSceneState>, serializerVersion: 'v1' | 'v2' = 'v1') { super({ - title: 'Dashboard', + title: t('dashboard-scene.dashboard-scene.title.dashboard', 'Dashboard'), meta: {}, editable: true, $timeRange: state.$timeRange ?? new SceneTimeRange({}), @@ -324,7 +322,7 @@ export class DashboardScene extends SceneObjectBase<DashboardSceneState> impleme appEvents.publish( new ShowConfirmModalEvent({ - title: 'Discard changes to dashboard?', + title: t('dashboard-scene.dashboard-scene.title.discard-changes-to-dashboard', 'Discard changes to dashboard?'), text: `You have unsaved changes to this dashboard. Are you sure you want to discard them?`, icon: 'trash-alt', yesText: 'Discard', @@ -465,7 +463,7 @@ export class DashboardScene extends SceneObjectBase<DashboardSceneState> impleme if (viewPanelScene) { pageNav = { - text: 'View panel', + text: t('dashboard-scene.dashboard-scene.text.view-panel', 'View panel'), parentItem: pageNav, url: getViewPanelUrl(viewPanelScene.state.panelRef.resolve()), }; @@ -473,7 +471,7 @@ export class DashboardScene extends SceneObjectBase<DashboardSceneState> impleme if (editPanel) { pageNav = { - text: 'Edit panel', + text: t('dashboard-scene.dashboard-scene.text.edit-panel', 'Edit panel'), parentItem: pageNav, }; } @@ -661,7 +659,7 @@ export class DashboardScene extends SceneObjectBase<DashboardSceneState> impleme } public switchLayout(layout: DashboardLayoutManager) { - this.setState({ body: this._layoutRestorer.getLayout(layout, this.state.body) }); + this.setState({ body: layout }); this.state.body.activateRepeaters?.(); } diff --git a/public/app/features/dashboard-scene/scene/GoToSnapshotOriginButton.tsx b/public/app/features/dashboard-scene/scene/GoToSnapshotOriginButton.tsx index 876208ef4e7..ec138c8f94f 100644 --- a/public/app/features/dashboard-scene/scene/GoToSnapshotOriginButton.tsx +++ b/public/app/features/dashboard-scene/scene/GoToSnapshotOriginButton.tsx @@ -2,6 +2,7 @@ import { css } from '@emotion/css'; import { textUtil } from '@grafana/data'; import { useTranslate } from '@grafana/i18n'; +import { t as internalT } from '@grafana/i18n/internal'; import { config, locationService } from '@grafana/runtime'; import { ConfirmModal, ToolbarButton } from '@grafana/ui'; @@ -33,7 +34,10 @@ const onOpenSnapshotOriginalDashboard = (originalUrl: string) => { new ShowModalReactEvent({ component: ConfirmModal, props: { - title: 'Proceed to external site?', + title: internalT( + 'dashboard-scene.on-open-snapshot-original-dashboard.title.proceed-to-external-site', + 'Proceed to external site?' + ), modalClass: css({ width: 'max-content', maxWidth: '80vw', diff --git a/public/app/features/dashboard-scene/scene/PanelMenuBehavior.tsx b/public/app/features/dashboard-scene/scene/PanelMenuBehavior.tsx index 2f2af34fef8..57a15c18245 100644 --- a/public/app/features/dashboard-scene/scene/PanelMenuBehavior.tsx +++ b/public/app/features/dashboard-scene/scene/PanelMenuBehavior.tsx @@ -328,7 +328,7 @@ export function panelMenuBehavior(menu: VizPanelMenu) { // Add specific "Metrics drilldown" menu if (metricsDrilldownLinks.length > 0) { items.push({ - text: 'Metrics drilldown', + text: t('dashboard-scene.panel-menu-behavior.async-func.text.metrics-drilldown', 'Metrics drilldown'), iconClassName: 'code-branch', type: 'submenu', subMenu: createExtensionSubMenu(metricsDrilldownLinks), @@ -338,7 +338,7 @@ export function panelMenuBehavior(menu: VizPanelMenu) { // Add generic "Extensions" menu for other links if (otherLinks.length > 0) { items.push({ - text: 'Extensions', + text: t('dashboard-scene.panel-menu-behavior.async-func.text.extensions', 'Extensions'), iconClassName: 'plug', type: 'submenu', subMenu: createExtensionSubMenu(otherLinks), @@ -544,8 +544,8 @@ function createExtensionContext(panel: VizPanel, dashboard: DashboardScene): Plu export function onRemovePanel(dashboard: DashboardScene, panel: VizPanel) { appEvents.publish( new ShowConfirmModalEvent({ - title: 'Remove panel', - text: 'Are you sure you want to remove this panel?', + title: t('dashboard-scene.on-remove-panel.title.remove-panel', 'Remove panel'), + text: t('dashboard-scene.on-remove-panel.text.remove-panel', 'Are you sure you want to remove this panel?'), icon: 'trash-alt', yesText: 'Remove', onConfirm: () => dashboard.removePanel(panel), diff --git a/public/app/features/dashboard-scene/scene/export/utils.ts b/public/app/features/dashboard-scene/scene/export/utils.ts index 3cc85834662..ef754171363 100644 --- a/public/app/features/dashboard-scene/scene/export/utils.ts +++ b/public/app/features/dashboard-scene/scene/export/utils.ts @@ -12,14 +12,7 @@ export function removePanelRefFromLayout(layout: DashboardV2Spec['layout'], elem case 'GridLayout': { const items = layout.spec.items || []; layout.spec.items = items.filter((item) => { - if (item.kind === 'GridLayoutItem') { - return item.spec.element.name !== elementName; - } else if (item.kind === 'GridLayoutRow') { - item.spec.elements = item.spec.elements.filter((el) => el.spec.element.name !== elementName); - // Keep the row if it still has elements left - return item.spec.elements.length > 0; - } - return true; + return item.spec.element.name !== elementName; }); break; } @@ -60,17 +53,7 @@ function isLayoutEmpty(layout: DashboardV2Spec['layout']) { switch (layout.kind) { case 'GridLayout': { const items = layout.spec.items || []; - return ( - items.length === 0 || - items.every((item) => { - if (item.kind === 'GridLayoutItem') { - return false; - } else if (item.kind === 'GridLayoutRow') { - return item.spec.elements.length === 0; - } - return false; - }) - ); + return items.length === 0; } case 'AutoGridLayout': { diff --git a/public/app/features/dashboard-scene/scene/layout-auto-grid/AutoGridLayoutManagerEditor.tsx b/public/app/features/dashboard-scene/scene/layout-auto-grid/AutoGridLayoutManagerEditor.tsx index e7e8d6eb672..5db18bd4553 100644 --- a/public/app/features/dashboard-scene/scene/layout-auto-grid/AutoGridLayoutManagerEditor.tsx +++ b/public/app/features/dashboard-scene/scene/layout-auto-grid/AutoGridLayoutManagerEditor.tsx @@ -4,6 +4,7 @@ import React, { useEffect } from 'react'; import { GrafanaTheme2 } from '@grafana/data'; import { useTranslate } from '@grafana/i18n'; +import { t } from '@grafana/i18n/internal'; import { Button, Combobox, ComboboxOption, Field, InlineSwitch, Input, Stack, useStyles2 } from '@grafana/ui'; import { OptionsPaneItemDescriptor } from 'app/features/dashboard/components/PanelEditor/OptionsPaneItemDescriptor'; @@ -14,7 +15,7 @@ export function getEditOptions(layoutManager: AutoGridLayoutManager): OptionsPan options.push( new OptionsPaneItemDescriptor({ - title: 'Column options', + title: t('dashboard-scene.get-edit-options.title.column-options', 'Column options'), skipField: true, render: () => <GridLayoutColumns layoutManager={layoutManager} />, }) @@ -22,7 +23,7 @@ export function getEditOptions(layoutManager: AutoGridLayoutManager): OptionsPan options.push( new OptionsPaneItemDescriptor({ - title: 'Row height options', + title: t('dashboard-scene.get-edit-options.title.row-height-options', 'Row height options'), skipField: true, render: () => <GridLayoutRows layoutManager={layoutManager} />, }) diff --git a/public/app/features/dashboard-scene/scene/layout-auto-grid/AutoGridLayoutRenderer.tsx b/public/app/features/dashboard-scene/scene/layout-auto-grid/AutoGridLayoutRenderer.tsx index 062d8f6b609..7f66994354d 100644 --- a/public/app/features/dashboard-scene/scene/layout-auto-grid/AutoGridLayoutRenderer.tsx +++ b/public/app/features/dashboard-scene/scene/layout-auto-grid/AutoGridLayoutRenderer.tsx @@ -7,6 +7,7 @@ import { useStyles2 } from '@grafana/ui'; import { useHasClonedParents } from '../../utils/clone'; import { useDashboardState } from '../../utils/utils'; import { CanvasGridAddActions } from '../layouts-shared/CanvasGridAddActions'; +import { dashboardCanvasAddButtonHoverStyles } from '../layouts-shared/styles'; import { AutoGridLayout, AutoGridLayoutState } from './AutoGridLayout'; import { AutoGridLayoutManager } from './AutoGridLayoutManager'; @@ -68,12 +69,7 @@ const getStyles = (theme: GrafanaTheme2, state: AutoGridLayoutState) => ({ } : undefined, // Show add action when hovering over the grid - '&:hover': { - '.dashboard-canvas-add-button': { - opacity: 1, - filter: 'unset', - }, - }, + ...dashboardCanvasAddButtonHoverStyles, }), containerFillScreen: css({ flexGrow: 1, diff --git a/public/app/features/dashboard-scene/scene/layout-default/DashboardGridItem.tsx b/public/app/features/dashboard-scene/scene/layout-default/DashboardGridItem.tsx index aa52ca947b7..05bd804b77c 100644 --- a/public/app/features/dashboard-scene/scene/layout-default/DashboardGridItem.tsx +++ b/public/app/features/dashboard-scene/scene/layout-default/DashboardGridItem.tsx @@ -21,7 +21,7 @@ import { OptionsPaneCategoryDescriptor } from 'app/features/dashboard/components import { getCloneKey } from '../../utils/clone'; import { getMultiVariableValues } from '../../utils/utils'; -import { scrollCanvasElementIntoView } from '../layouts-shared/scrollCanvasElementIntoView'; +import { scrollCanvasElementIntoView, scrollIntoView } from '../layouts-shared/scrollCanvasElementIntoView'; import { DashboardLayoutItem } from '../types/DashboardLayoutItem'; import { DashboardRepeatsProcessedEvent } from '../types/DashboardRepeatsProcessedEvent'; @@ -253,6 +253,11 @@ export class DashboardGridItem } public scrollIntoView() { - scrollCanvasElementIntoView(this, this.containerRef); + const gridItemEl = document.querySelector(`[data-griditem-key="${this.state.key}"`); + if (gridItemEl instanceof HTMLElement) { + scrollIntoView(gridItemEl); + } else { + scrollCanvasElementIntoView(this, this.containerRef); + } } } diff --git a/public/app/features/dashboard-scene/scene/layout-default/DefaultGridLayoutManager.tsx b/public/app/features/dashboard-scene/scene/layout-default/DefaultGridLayoutManager.tsx index 34cca835def..5701100f423 100644 --- a/public/app/features/dashboard-scene/scene/layout-default/DefaultGridLayoutManager.tsx +++ b/public/app/features/dashboard-scene/scene/layout-default/DefaultGridLayoutManager.tsx @@ -43,6 +43,7 @@ import { import { AutoGridItem } from '../layout-auto-grid/AutoGridItem'; import { CanvasGridAddActions } from '../layouts-shared/CanvasGridAddActions'; import { clearClipboard, getDashboardGridItemFromClipboard } from '../layouts-shared/paste'; +import { dashboardCanvasAddButtonHoverStyles } from '../layouts-shared/styles'; import { DashboardLayoutManager } from '../types/DashboardLayoutManager'; import { LayoutRegistryItem } from '../types/LayoutRegistryItem'; @@ -292,7 +293,7 @@ export class DefaultGridLayoutManager const row = new SceneGridRow({ key: getVizPanelKeyForPanelId(id), - title: 'Row title', + title: t('dashboard-scene.default-grid-layout-manager.row.title.row-title', 'Row title'), actions: new RowActions({}), y: 0, }); @@ -589,12 +590,7 @@ function getStyles(theme: GrafanaTheme2) { flexGrow: `0 !important`, minHeight: '250px', }, - '&:hover': { - '.dashboard-canvas-add-button': { - opacity: 1, - filter: 'unset', - }, - }, + ...dashboardCanvasAddButtonHoverStyles, }), actionsWrapper: css({ position: 'relative', diff --git a/public/app/features/dashboard-scene/scene/layout-rows/RowItem.tsx b/public/app/features/dashboard-scene/scene/layout-rows/RowItem.tsx index d79611ee459..645a8a7cede 100644 --- a/public/app/features/dashboard-scene/scene/layout-rows/RowItem.tsx +++ b/public/app/features/dashboard-scene/scene/layout-rows/RowItem.tsx @@ -22,7 +22,6 @@ import { serializeRow } from '../../serialization/layoutSerializers/RowsLayoutSe import { getElements } from '../../serialization/layoutSerializers/utils'; import { getDashboardSceneFor } from '../../utils/utils'; import { AutoGridLayoutManager } from '../layout-auto-grid/AutoGridLayoutManager'; -import { LayoutRestorer } from '../layouts-shared/LayoutRestorer'; import { clearClipboard } from '../layouts-shared/paste'; import { scrollCanvasElementIntoView } from '../layouts-shared/scrollCanvasElementIntoView'; import { BulkActionElement } from '../types/BulkActionElement'; @@ -59,7 +58,6 @@ export class RowItem public readonly isEditableDashboardElement = true; public readonly isDashboardDropTarget = true; - private _layoutRestorer = new LayoutRestorer(); public containerRef: React.MutableRefObject<HTMLDivElement | null> = React.createRef<HTMLDivElement>(); public constructor(state?: Partial<RowItemState>) { @@ -101,7 +99,7 @@ export class RowItem } public switchLayout(layout: DashboardLayoutManager) { - this.setState({ layout: this._layoutRestorer.getLayout(layout, this.state.layout) }); + this.setState({ layout }); } public useEditPaneOptions(isNewElement: boolean): OptionsPaneCategoryDescriptor[] { diff --git a/public/app/features/dashboard-scene/scene/layout-tabs/TabItem.tsx b/public/app/features/dashboard-scene/scene/layout-tabs/TabItem.tsx index 2e2663c5bb0..ae0b494ce94 100644 --- a/public/app/features/dashboard-scene/scene/layout-tabs/TabItem.tsx +++ b/public/app/features/dashboard-scene/scene/layout-tabs/TabItem.tsx @@ -22,7 +22,6 @@ import { serializeTab } from '../../serialization/layoutSerializers/TabsLayoutSe import { getElements } from '../../serialization/layoutSerializers/utils'; import { getDashboardSceneFor, getDefaultVizPanel } from '../../utils/utils'; import { AutoGridLayoutManager } from '../layout-auto-grid/AutoGridLayoutManager'; -import { LayoutRestorer } from '../layouts-shared/LayoutRestorer'; import { clearClipboard } from '../layouts-shared/paste'; import { scrollCanvasElementIntoView } from '../layouts-shared/scrollCanvasElementIntoView'; import { BulkActionElement } from '../types/BulkActionElement'; @@ -57,7 +56,6 @@ export class TabItem public readonly isEditableDashboardElement = true; public readonly isDashboardDropTarget = true; - private _layoutRestorer = new LayoutRestorer(); public containerRef = React.createRef<HTMLDivElement>(); constructor(state?: Partial<TabItemState>) { @@ -99,7 +97,7 @@ export class TabItem } public switchLayout(layout: DashboardLayoutManager) { - this.setState({ layout: this._layoutRestorer.getLayout(layout, this.state.layout) }); + this.setState({ layout }); } public useEditPaneOptions(isNewElement: boolean): OptionsPaneCategoryDescriptor[] { diff --git a/public/app/features/dashboard-scene/scene/layout-tabs/TabsLayoutManagerRenderer.tsx b/public/app/features/dashboard-scene/scene/layout-tabs/TabsLayoutManagerRenderer.tsx index fe592b171ab..95a4a7f6a40 100644 --- a/public/app/features/dashboard-scene/scene/layout-tabs/TabsLayoutManagerRenderer.tsx +++ b/public/app/features/dashboard-scene/scene/layout-tabs/TabsLayoutManagerRenderer.tsx @@ -9,6 +9,7 @@ import { Button, TabContent, TabsBar, useStyles2 } from '@grafana/ui'; import { useIsConditionallyHidden } from '../../conditional-rendering/useIsConditionallyHidden'; import { getDashboardSceneFor } from '../../utils/utils'; +import { dashboardCanvasAddButtonHoverStyles } from '../layouts-shared/styles'; import { useClipboardState } from '../layouts-shared/useClipboardState'; import { TabsLayoutManager } from './TabsLayoutManager'; @@ -102,14 +103,7 @@ const getStyles = (theme: GrafanaTheme2) => ({ flexDirection: 'column', flex: '1 1 auto', }), - tabsBar: css({ - '&:hover': { - '.dashboard-canvas-add-button': { - filter: 'unset', - opacity: 1, - }, - }, - }), + tabsBar: css(dashboardCanvasAddButtonHoverStyles), tabsRow: css({ display: 'flex', width: '100%', diff --git a/public/app/features/dashboard-scene/scene/layouts-shared/LayoutRestorer.ts b/public/app/features/dashboard-scene/scene/layouts-shared/LayoutRestorer.ts deleted file mode 100644 index 302247a6c40..00000000000 --- a/public/app/features/dashboard-scene/scene/layouts-shared/LayoutRestorer.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { VizPanel } from '@grafana/scenes'; - -import { DashboardLayoutManager } from '../types/DashboardLayoutManager'; - -export class LayoutRestorer { - private layoutMap: Record<string, DashboardLayoutManager> = {}; - - public getLayout( - newLayout: DashboardLayoutManager, - currentLayout: DashboardLayoutManager - ): DashboardLayoutManager | undefined { - //If we have an old version of this layout and panels are the same we can reuse it - const prevLayout = this.layoutMap[newLayout.descriptor.id]; - if (prevLayout) { - if (panelsAreUnchanged(prevLayout.getVizPanels(), newLayout.getVizPanels())) { - return prevLayout; - } - } - - this.layoutMap[currentLayout.descriptor.id] = currentLayout; - - return newLayout; - } -} - -/** - * Simple check that panels are in same order and same options but not a comprehensive check - * Ideally we should check if persisted state is the same but not possible anymore with current serialization code that requires all panels be connected to a DashboardScene - */ -function panelsAreUnchanged(a: VizPanel[], b: VizPanel[]) { - if (a.length < b.length) { - return false; - } - - for (let i = 0; i < a.length; i++) { - const ap = a[i]; - const bp = b[i]; - - if (ap.state.key !== bp.state.key) { - return false; - } - - if (JSON.stringify(ap.state.options) !== JSON.stringify(bp.state.options)) { - return false; - } - - if (JSON.stringify(ap.state.fieldConfig) !== JSON.stringify(bp.state.fieldConfig)) { - return false; - } - } - - return true; -} diff --git a/public/app/features/dashboard-scene/scene/layouts-shared/scrollCanvasElementIntoView.ts b/public/app/features/dashboard-scene/scene/layouts-shared/scrollCanvasElementIntoView.ts index b54fc73d811..e87b7e269f0 100644 --- a/public/app/features/dashboard-scene/scene/layouts-shared/scrollCanvasElementIntoView.ts +++ b/public/app/features/dashboard-scene/scene/layouts-shared/scrollCanvasElementIntoView.ts @@ -42,6 +42,6 @@ export function scrollCanvasElementIntoView(sceneObject: SceneObject, ref: React }, 10); } -function scrollIntoView(element: HTMLElement) { +export function scrollIntoView(element: HTMLElement) { element.scrollIntoView({ behavior: 'smooth', block: 'center', inline: 'center' }); } diff --git a/public/app/features/dashboard-scene/scene/layouts-shared/styles.ts b/public/app/features/dashboard-scene/scene/layouts-shared/styles.ts new file mode 100644 index 00000000000..be11a414050 --- /dev/null +++ b/public/app/features/dashboard-scene/scene/layouts-shared/styles.ts @@ -0,0 +1,8 @@ +export const dashboardCanvasAddButtonHoverStyles = { + '&:hover,:focus-within': { + '.dashboard-canvas-add-button': { + opacity: 1, + filter: 'unset', + }, + }, +}; diff --git a/public/app/features/dashboard-scene/serialization/__snapshots__/transformSceneToSaveModelSchemaV2.test.ts.snap b/public/app/features/dashboard-scene/serialization/__snapshots__/transformSceneToSaveModelSchemaV2.test.ts.snap index 8933d1adde3..cc3a40896c7 100644 --- a/public/app/features/dashboard-scene/serialization/__snapshots__/transformSceneToSaveModelSchemaV2.test.ts.snap +++ b/public/app/features/dashboard-scene/serialization/__snapshots__/transformSceneToSaveModelSchemaV2.test.ts.snap @@ -85,44 +85,6 @@ exports[`transformSceneToSaveModelSchemaV2 should transform scene to save model }, }, }, - "panel-2": { - "kind": "Panel", - "spec": { - "data": { - "kind": "QueryGroup", - "spec": { - "queries": [], - "queryOptions": {}, - "transformations": [], - }, - }, - "description": "Test Description 2", - "id": 2, - "links": [ - { - "targetBlank": true, - "title": "Test Link 1", - "url": "http://test1.com", - }, - { - "title": "Test Link 2", - "url": "http://test2.com", - }, - ], - "title": "Test Panel 2", - "vizConfig": { - "kind": "graph", - "spec": { - "fieldConfig": { - "defaults": {}, - "overrides": [], - }, - "options": {}, - "pluginVersion": "7.0.0", - }, - }, - }, - }, }, "layout": { "kind": "GridLayout", @@ -141,33 +103,6 @@ exports[`transformSceneToSaveModelSchemaV2 should transform scene to save model "y": 0, }, }, - { - "kind": "GridLayoutRow", - "spec": { - "collapsed": false, - "elements": [ - { - "kind": "GridLayoutItem", - "spec": { - "element": { - "kind": "ElementReference", - "name": "panel-2", - }, - "height": 0, - "width": 0, - "x": 0, - "y": 0, - }, - }, - ], - "repeat": { - "mode": "variable", - "value": "customVar", - }, - "title": "Test Row", - "y": 10, - }, - }, ], }, }, diff --git a/public/app/features/dashboard-scene/serialization/buildNewDashboardSaveModel.ts b/public/app/features/dashboard-scene/serialization/buildNewDashboardSaveModel.ts index 8c4c54b4358..811e5f59e19 100644 --- a/public/app/features/dashboard-scene/serialization/buildNewDashboardSaveModel.ts +++ b/public/app/features/dashboard-scene/serialization/buildNewDashboardSaveModel.ts @@ -1,3 +1,4 @@ +import { t } from '@grafana/i18n/internal'; import { config } from '@grafana/runtime'; import { VariableModel, defaultDashboard } from '@grafana/schema'; import { @@ -55,7 +56,7 @@ export async function buildNewDashboardSaveModel(urlFolderUid?: string): Promise dashboard: { ...defaultDashboard, uid: '', - title: 'New dashboard', + title: t('dashboard-scene.build-new-dashboard-save-model.data.title.new-dashboard', 'New dashboard'), panels: [], timezone: config.bootData.user?.timezone || defaultDashboard.timezone, }, @@ -112,7 +113,7 @@ export async function buildNewDashboardSaveModelV2( kind: 'DashboardWithAccessInfo', spec: { ...defaultDashboardV2Spec(), - title: 'New dashboard', + title: t('dashboard-scene.build-new-dashboard-save-model-v2.data.title.new-dashboard', 'New dashboard'), timeSettings: { ...defaultTimeSettingsSpec(), timezone: config.bootData.user?.timezone || defaultTimeSettingsSpec().timezone, diff --git a/public/app/features/dashboard-scene/serialization/layoutSerializers/DefaultGridLayoutSerializer.ts b/public/app/features/dashboard-scene/serialization/layoutSerializers/DefaultGridLayoutSerializer.ts index 5baba89b4ea..a1eea785230 100644 --- a/public/app/features/dashboard-scene/serialization/layoutSerializers/DefaultGridLayoutSerializer.ts +++ b/public/app/features/dashboard-scene/serialization/layoutSerializers/DefaultGridLayoutSerializer.ts @@ -1,9 +1,8 @@ -import { SceneGridItemLike, SceneGridLayout, SceneGridRow, SceneObject, VizPanel } from '@grafana/scenes'; +import { SceneGridItemLike, SceneGridLayout, VizPanel } from '@grafana/scenes'; import { Spec as DashboardV2Spec, GridLayoutItemKind, GridLayoutKind, - GridLayoutRowKind, RepeatOptions, Element, GridLayoutItemSpec, @@ -14,12 +13,8 @@ import { contextSrv } from 'app/core/core'; import { DashboardGridItem } from '../../scene/layout-default/DashboardGridItem'; import { DefaultGridLayoutManager } from '../../scene/layout-default/DefaultGridLayoutManager'; -import { RowRepeaterBehavior } from '../../scene/layout-default/RowRepeaterBehavior'; -import { RowActions } from '../../scene/layout-default/row-actions/RowActions'; -import { getOriginalKey, isClonedKey } from '../../utils/clone'; import { dashboardSceneGraph } from '../../utils/dashboardSceneGraph'; import { calculateGridItemDimensions, isLibraryPanel } from '../../utils/utils'; -import { GRID_ROW_HEIGHT } from '../const'; import { buildLibraryPanel, buildVizPanel } from './utils'; @@ -52,11 +47,8 @@ export function deserializeDefaultGridLayout( }); } -function getGridLayoutItems( - body: DefaultGridLayoutManager, - isSnapshot?: boolean -): Array<GridLayoutItemKind | GridLayoutRowKind> { - let items: Array<GridLayoutItemKind | GridLayoutRowKind> = []; +function getGridLayoutItems(body: DefaultGridLayoutManager, isSnapshot?: boolean): GridLayoutItemKind[] { + let items: GridLayoutItemKind[] = []; for (const child of body.state.grid.state.children) { if (child instanceof DashboardGridItem) { // TODO: handle panel repeater scenario @@ -65,50 +57,12 @@ function getGridLayoutItems( } else { items.push(gridItemToGridLayoutItemKind(child)); } - } else if (child instanceof SceneGridRow) { - if (isClonedKey(child.state.key!) && !isSnapshot) { - // Skip repeat rows - continue; - } - items.push(gridRowToLayoutRowKind(child, isSnapshot)); } } return items; } -function getRowRepeat(row: SceneGridRow): RepeatOptions | undefined { - if (row.state.$behaviors) { - for (const behavior of row.state.$behaviors) { - if (behavior instanceof RowRepeaterBehavior) { - return { value: behavior.state.variableName, mode: 'variable' }; - } - } - } - return undefined; -} - -function gridRowToLayoutRowKind(row: SceneGridRow, isSnapshot = false): GridLayoutRowKind { - const children = row.state.children.map((child) => { - if (!(child instanceof DashboardGridItem)) { - throw new Error('Unsupported row child type'); - } - const y = (child.state.y ?? 0) - (row.state.y ?? 0) - GRID_ROW_HEIGHT; - return gridItemToGridLayoutItemKind(child, y); - }); - - return { - kind: 'GridLayoutRow', - spec: { - title: row.state.title, - y: row.state.y ?? 0, - collapsed: Boolean(row.state.isCollapsed), - elements: children, - repeat: getRowRepeat(row), - }, - }; -} - export function gridItemToGridLayoutItemKind(gridItem: DashboardGridItem, yOverride?: number): GridLayoutItemKind { let elementGridItem: GridLayoutItemKind | undefined; let x = 0, @@ -234,34 +188,7 @@ function createSceneGridLayoutForItems( return gridItems.map((item) => { if (item.kind === 'GridLayoutItem') { return deserializeGridItem(item, elements, panelIdGenerator); - } else if (item.kind === 'GridLayoutRow') { - const children = item.spec.elements.map((gridElement) => { - const panel = elements[getOriginalKey(gridElement.spec.element.name)]; - if (panel.kind === 'Panel' || panel.kind === 'LibraryPanel') { - let id: number | undefined; - if (panelIdGenerator) { - id = panelIdGenerator(); - } - return buildGridItem(gridElement.spec, panel, item.spec.y + GRID_ROW_HEIGHT + gridElement.spec.y, id); - } else { - throw new Error(`Unknown element kind: ${gridElement.kind}`); - } - }); - let behaviors: SceneObject[] | undefined; - if (item.spec.repeat) { - behaviors = [new RowRepeaterBehavior({ variableName: item.spec.repeat.value })]; - } - return new SceneGridRow({ - y: item.spec.y, - isCollapsed: item.spec.collapsed, - title: item.spec.title, - $behaviors: behaviors, - actions: new RowActions({}), - children, - }); } else { - // If this has been validated by the schema we should never reach this point, which is why TS is telling us this is an error. - //@ts-expect-error throw new Error(`Unknown layout element kind: ${item.kind}`); } }); diff --git a/public/app/features/dashboard-scene/serialization/testfiles/rows_after_free_panels.json b/public/app/features/dashboard-scene/serialization/testfiles/rows_after_free_panels.json new file mode 100644 index 00000000000..5d745793cbd --- /dev/null +++ b/public/app/features/dashboard-scene/serialization/testfiles/rows_after_free_panels.json @@ -0,0 +1,374 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "grafana", + "uid": "-- Grafana --" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "links": [], + "liveNow": false, + "panels": [ + { + "gridPos": { + "h": 2, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 15, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "First panel", + "mode": "markdown" + }, + "pluginVersion": "10.2.0-pre", + "type": "text", + "title": "First panel" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 3 + }, + "id": 20, + "panels": [], + "title": "Row at the top - not repeated - saved expanded", + "type": "row" + }, + { + "gridPos": { + "h": 2, + "w": 24, + "x": 0, + "y": 4 + }, + "id": 15, + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "<div class=\"center-vh\">\n Repeated row below. The row has \n a panel that is also repeated horizontally based\n on values in the $pod variable. \n</div>", + "mode": "markdown" + }, + "pluginVersion": "10.2.0-pre", + "type": "text" + }, + { + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 5 + }, + "id": 16, + "panels": [], + "repeat": "server", + "repeatDirection": "h", + "title": "Row for server $server", + "type": "row" + }, + { + "datasource": { + "type": "testdata", + "uid": "PD8C576611E62080A" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "axisBorderShow": false, + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "insertNulls": false, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 6 + }, + "id": 2, + "maxPerRow": 3, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "repeat": "pod", + "repeatDirection": "h", + "targets": [ + { + "alias": "server = $server, pod id = $pod ", + "datasource": { + "type": "testdata", + "uid": "PD8C576611E62080A" + }, + "refId": "A", + "scenarioId": "random_walk", + "seriesCount": 1 + } + ], + "title": "server = $server, pod = $pod", + "type": "timeseries" + }, + { + "collapsed": true, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 25 + }, + "id": 25, + "panels": [ + { + "gridPos": { + "h": 2, + "w": 24, + "x": 0, + "y": 26 + }, + "id": 30, + "title": "Text panel in collapsed row", + "options": { + "code": { + "language": "plaintext", + "showLineNumbers": false, + "showMiniMap": false + }, + "content": "<div class=\"center-vh\">\n Just a panel\n</div>", + "mode": "markdown" + }, + "pluginVersion": "10.2.0-pre", + "type": "text" + } + ], + "title": "Row at the bottom - not repeated - saved collapsed ", + "type": "row" + } + ], + "refresh": "", + "schemaVersion": 38, + "tags": ["templating", "gdev"], + "templating": { + "list": [ + { + "current": { + "selected": true, + "text": ["A", "B"], + "value": ["A", "B"] + }, + "hide": 0, + "includeAll": true, + "multi": true, + "name": "server", + "options": [ + { + "selected": false, + "text": "All", + "value": "$__all" + }, + { + "selected": true, + "text": "A", + "value": "A" + }, + { + "selected": true, + "text": "B", + "value": "B" + }, + { + "selected": false, + "text": "C", + "value": "C" + }, + { + "selected": false, + "text": "D", + "value": "D" + }, + { + "selected": false, + "text": "E", + "value": "E" + }, + { + "selected": false, + "text": "F", + "value": "F" + }, + { + "selected": false, + "text": "E", + "value": "E" + }, + { + "selected": false, + "text": "G", + "value": "G" + }, + { + "selected": false, + "text": "H", + "value": "H" + }, + { + "selected": false, + "text": "I", + "value": "I" + }, + { + "selected": false, + "text": "J", + "value": "J" + }, + { + "selected": false, + "text": "K", + "value": "K" + }, + { + "selected": false, + "text": "L", + "value": "L" + } + ], + "query": "A,B,C,D,E,F,E,G,H,I,J,K,L", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + }, + { + "current": { + "selected": true, + "text": ["Bob", "Rob"], + "value": ["1", "2"] + }, + "hide": 0, + "includeAll": true, + "multi": true, + "name": "pod", + "options": [ + { + "selected": false, + "text": "All", + "value": "$__all" + }, + { + "selected": true, + "text": "Bob", + "value": "1" + }, + { + "selected": true, + "text": "Rob", + "value": "2" + }, + { + "selected": false, + "text": "Sod", + "value": "3" + }, + { + "selected": false, + "text": "Hod", + "value": "4" + }, + { + "selected": false, + "text": "Cod", + "value": "5" + } + ], + "query": "Bob : 1, Rob : 2,Sod : 3, Hod : 4, Cod : 5", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + } + ] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Repeating rows", + "uid": "Repeating-rows-uid", + "version": 1 +} diff --git a/public/app/features/dashboard-scene/serialization/transformSaveModelSchemaV2ToScene.test.ts b/public/app/features/dashboard-scene/serialization/transformSaveModelSchemaV2ToScene.test.ts index 824d2ee4ce4..ce31ae57d0e 100644 --- a/public/app/features/dashboard-scene/serialization/transformSaveModelSchemaV2ToScene.test.ts +++ b/public/app/features/dashboard-scene/serialization/transformSaveModelSchemaV2ToScene.test.ts @@ -13,7 +13,6 @@ import { GroupByVariable, AdHocFiltersVariable, SceneDataTransformer, - SceneGridRow, SceneGridItem, } from '@grafana/scenes'; import { handyTestingSchema } from '@grafana/schema/dist/esm/schema/dashboard/v2_examples'; @@ -239,14 +238,14 @@ describe('transformSaveModelSchemaV2ToScene', () => { // VizPanel const vizPanels = (scene.state.body as DashboardLayoutManager).getVizPanels(); - expect(vizPanels).toHaveLength(3); + expect(vizPanels).toHaveLength(2); // Layout const layout = scene.state.body as DefaultGridLayoutManager; // Panel const panel = getPanelElement(dash, 'panel-1')!; - expect(layout.state.grid.state.children.length).toBe(3); + expect(layout.state.grid.state.children.length).toBe(2); expect(layout.state.grid.state.children[0].state.key).toBe(`grid-item-${panel.spec.id}`); const gridLayoutItemSpec = (dash.layout.spec as GridLayoutSpec).items[0].spec as GridLayoutItemSpec; expect(layout.state.grid.state.children[0].state.width).toBe(gridLayoutItemSpec.width); @@ -267,9 +266,6 @@ describe('transformSaveModelSchemaV2ToScene', () => { const vizLibraryPanel = vizPanels.find((p) => p.state.key === 'panel-2')!; validateVizPanel(vizLibraryPanel, dash); - expect((layout.state.grid.state.children[2] as SceneGridRow).state.isCollapsed).toBe(false); - expect((layout.state.grid.state.children[2] as SceneGridRow).state.y).toBe(20); - // Transformations const panelWithTransformations = vizPanels.find((p) => p.state.key === 'panel-1')!; expect((panelWithTransformations.state.$data as SceneDataTransformer)?.state.transformations[0]).toEqual( @@ -300,7 +296,7 @@ describe('transformSaveModelSchemaV2ToScene', () => { const scene = transformSaveModelSchemaV2ToScene(dashboard); const vizPanels = (scene.state.body as DashboardLayoutManager).getVizPanels(); - expect(vizPanels.length).toBe(3); + expect(vizPanels.length).toBe(2); expect(getQueryRunnerFor(vizPanels[0])?.state.datasource?.type).toBe('mixed'); expect(getQueryRunnerFor(vizPanels[0])?.state.datasource?.uid).toBe(MIXED_DATASOURCE_NAME); }); @@ -328,7 +324,7 @@ describe('transformSaveModelSchemaV2ToScene', () => { const scene = transformSaveModelSchemaV2ToScene(dashboard); const vizPanels = (scene.state.body as DashboardLayoutManager).getVizPanels(); - expect(vizPanels.length).toBe(3); + expect(vizPanels.length).toBe(2); expect(getQueryRunnerFor(vizPanels[0])?.state.queries[0].datasource).toEqual({ type: 'prometheus', uid: 'datasource1', @@ -355,7 +351,7 @@ describe('transformSaveModelSchemaV2ToScene', () => { const scene = transformSaveModelSchemaV2ToScene(dashboard); const vizPanels = (scene.state.body as DashboardLayoutManager).getVizPanels(); - expect(vizPanels.length).toBe(3); + expect(vizPanels.length).toBe(2); expect(getQueryRunnerFor(vizPanels[0])?.state.datasource?.type).toBe('mixed'); expect(getQueryRunnerFor(vizPanels[0])?.state.datasource?.uid).toBe(MIXED_DATASOURCE_NAME); }); diff --git a/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.test.ts b/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.test.ts index 0e96bc019bd..84900146d50 100644 --- a/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.test.ts +++ b/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.test.ts @@ -6,6 +6,7 @@ import { behaviors, ConstantVariable, SceneDataTransformer, + SceneGridItem, SceneGridLayout, SceneGridRow, SceneQueryRunner, @@ -32,6 +33,8 @@ import { PanelTimeRange } from '../scene/PanelTimeRange'; import { DashboardGridItem } from '../scene/layout-default/DashboardGridItem'; import { DefaultGridLayoutManager } from '../scene/layout-default/DefaultGridLayoutManager'; import { RowRepeaterBehavior } from '../scene/layout-default/RowRepeaterBehavior'; +import { RowItemRepeaterBehavior } from '../scene/layout-rows/RowItemRepeaterBehavior'; +import { RowsLayoutManager } from '../scene/layout-rows/RowsLayoutManager'; import { NEW_LINK } from '../settings/links/utils'; import { getQueryRunnerFor } from '../utils/utils'; @@ -40,6 +43,7 @@ import { GRAFANA_DATASOURCE_REF } from './const'; import { SnapshotVariable } from './custom-variables/SnapshotVariable'; import dashboard_to_load1 from './testfiles/dashboard_to_load1.json'; import repeatingRowsAndPanelsDashboardJson from './testfiles/repeating_rows_and_panels.json'; +import rowsAfterFreePanels from './testfiles/rows_after_free_panels.json'; import { createDashboardSceneFromDashboardModel, buildGridItemForPanel, @@ -809,6 +813,68 @@ describe('transformSaveModelToScene', () => { }); }); + describe('Convert to new rows', () => { + beforeEach(() => { + // set feature flag to true + config.featureToggles.dashboardNewLayouts = true; + }); + afterEach(() => { + config.featureToggles.dashboardNewLayouts = false; + }); + + it('Should convert legacy rows to new rows', () => { + const scene = transformSaveModelToScene({ + dashboard: repeatingRowsAndPanelsDashboardJson as DashboardDataDTO, + meta: {}, + }); + + const layout = scene.state.body as RowsLayoutManager; + const row1 = layout.state.rows[0]; + + expect(row1.state.title).toBe('Row at the top - not repeated - saved expanded'); + const row1Layout = row1.state.layout as DefaultGridLayoutManager; + expect(row1Layout.state.grid.state.children).toHaveLength(1); + const row1gridItem = row1Layout.state.grid.state.children[0] as SceneGridItem; + expect(row1gridItem.state.body).toBeInstanceOf(VizPanel); + const row1Panel = row1gridItem.state.body as VizPanel; + expect(row1Panel.state.pluginId).toBe('text'); + const row1PanelOptions = row1Panel.state.options as { content: string }; + expect(row1PanelOptions.content).toBe( + '<div class=\"center-vh\">\n Repeated row below. The row has \n a panel that is also repeated horizontally based\n on values in the $pod variable. \n</div>' + ); + + const row2 = layout.state.rows[1]; + + expect(row2.state.$behaviors?.[0]).toBeInstanceOf(RowItemRepeaterBehavior); + + const repeatBehavior = row2.state.$behaviors?.[0] as RowItemRepeaterBehavior; + expect(repeatBehavior.state.variableName).toBe('server'); + + const lastRow = layout.state.rows[layout.state.rows.length - 1]; + expect(lastRow.state.title).toBe('Row at the bottom - not repeated - saved collapsed '); + const lastRowLayout = lastRow.state.layout as DefaultGridLayoutManager; + expect(lastRowLayout.state.grid.state.children).toHaveLength(1); + const lastRowgridItem = lastRowLayout.state.grid.state.children[0] as SceneGridItem; + expect(lastRowgridItem.state.body).toBeInstanceOf(VizPanel); + const lastRowPanel = lastRowgridItem.state.body as VizPanel; + expect(lastRowPanel.state.pluginId).toBe('text'); + }); + + it('Should convert legacy rows to new rows with free panels before first row', () => { + const scene = transformSaveModelToScene({ + dashboard: rowsAfterFreePanels as DashboardDataDTO, + meta: {}, + }); + + const layout = scene.state.body as RowsLayoutManager; + const row1 = layout.state.rows[0]; + expect(row1.state.title).toBe(''); + expect(row1.state.hideHeader).toBe(true); + const row1Layout = row1.state.layout as DefaultGridLayoutManager; + expect(row1Layout.state.grid.state.children).toHaveLength(1); + }); + }); + describe('Repeating rows', () => { it('Should build correct scene model', () => { const scene = transformSaveModelToScene({ diff --git a/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.ts b/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.ts index c832d48709d..f7dbc4a6700 100644 --- a/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.ts +++ b/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.ts @@ -44,7 +44,11 @@ import { DashboardGridItem, RepeatDirection } from '../scene/layout-default/Dash import { DefaultGridLayoutManager } from '../scene/layout-default/DefaultGridLayoutManager'; import { RowRepeaterBehavior } from '../scene/layout-default/RowRepeaterBehavior'; import { RowActions } from '../scene/layout-default/row-actions/RowActions'; +import { RowItem } from '../scene/layout-rows/RowItem'; +import { RowItemRepeaterBehavior } from '../scene/layout-rows/RowItemRepeaterBehavior'; +import { RowsLayoutManager } from '../scene/layout-rows/RowsLayoutManager'; import { setDashboardPanelContext } from '../scene/setDashboardPanelContext'; +import { DashboardLayoutManager } from '../scene/types/DashboardLayoutManager'; import { createPanelDataProvider } from '../utils/createPanelDataProvider'; import { DashboardInteractions } from '../utils/interactions'; import { getVizPanelKeyForPanelId } from '../utils/utils'; @@ -79,6 +83,56 @@ export function transformSaveModelToScene(rsp: DashboardDTO): DashboardScene { return scene; } +export function createRowsFromPanels(oldPanels: PanelModel[]): RowsLayoutManager { + const rowItems: RowItem[] = []; + + let currentLegacyRow: PanelModel | null = null; + let currentRowPanels: DashboardGridItem[] = []; + + for (const panel of oldPanels) { + if (panel.type === 'row') { + if (!currentLegacyRow && currentRowPanels.length === 0) { + // This is the first row, and we have no panels before it. We set currentLegacyRow to the first row. + currentLegacyRow = panel; + } else if (!currentLegacyRow) { + // This is the first row but we have panels before the first row. We should flush the current panels into a row item with header hidden. + rowItems.push( + new RowItem({ + title: '', + collapse: panel.collapsed, + layout: new DefaultGridLayoutManager({ + grid: new SceneGridLayout({ + children: currentRowPanels, + }), + }), + hideHeader: true, + $behaviors: [], + }) + ); + currentRowPanels = []; + + currentLegacyRow = panel; + } else { + // This is a new row. We should flush the current panels into a row item. + rowItems.push(createRowItemFromLegacyRow(currentLegacyRow, currentRowPanels)); + currentRowPanels = []; + currentLegacyRow = panel; + } + } else { + currentRowPanels.push(buildGridItemForPanel(panel)); + } + } + + if (currentLegacyRow) { + // If there is a row left to process, we should flush it into a row item. + rowItems.push(createRowItemFromLegacyRow(currentLegacyRow, currentRowPanels)); + } + + return new RowsLayoutManager({ + rows: rowItems, + }); +} + export function createSceneObjectsForPanels(oldPanels: PanelModel[]): SceneGridItemLike[] { // collects all panels and rows const panels: SceneGridItemLike[] = []; @@ -174,6 +228,22 @@ function createRowFromPanelModel(row: PanelModel, content: SceneGridItemLike[]): }); } +function createRowItemFromLegacyRow(row: PanelModel, panels: DashboardGridItem[]): RowItem { + const rowItem = new RowItem({ + key: getVizPanelKeyForPanelId(row.id), + title: row.title, + collapse: row.collapsed, + layout: new DefaultGridLayoutManager({ + grid: new SceneGridLayout({ + // If the row is collapsed it will have panels within the row model. + children: (row.panels?.map((p) => buildGridItemForPanel(p)) ?? []).concat(panels), + }), + }), + $behaviors: row.repeat ? [new RowItemRepeaterBehavior({ variableName: row.repeat })] : undefined, + }); + return rowItem; +} + export function createDashboardSceneFromDashboardModel(oldModel: DashboardModel, dto: DashboardDataDTO) { let variables: SceneVariableSet | undefined; let annotationLayers: SceneDataLayerProvider[] = []; @@ -241,6 +311,20 @@ export function createDashboardSceneFromDashboardModel(oldModel: DashboardModel, version: oldModel.version, }), ]; + + let body: DashboardLayoutManager; + + if (config.featureToggles.dashboardNewLayouts && oldModel.panels.some((p) => p.type === 'row')) { + body = createRowsFromPanels(oldModel.panels); + } else { + body = new DefaultGridLayoutManager({ + grid: new SceneGridLayout({ + isLazy: !(dto.preload || contextSrv.user.authenticatedBy === 'render'), + children: createSceneObjectsForPanels(oldModel.panels), + }), + }); + } + const dashboardScene = new DashboardScene( { uid, @@ -255,12 +339,7 @@ export function createDashboardSceneFromDashboardModel(oldModel: DashboardModel, title: oldModel.title, version: oldModel.version, scopeMeta, - body: new DefaultGridLayoutManager({ - grid: new SceneGridLayout({ - isLazy: !(dto.preload || contextSrv.user.authenticatedBy === 'render'), - children: createSceneObjectsForPanels(oldModel.panels), - }), - }), + body, $timeRange: new SceneTimeRange({ from: oldModel.time.from, to: oldModel.time.to, diff --git a/public/app/features/dashboard-scene/serialization/transformSceneToSaveModelSchemaV2.test.ts b/public/app/features/dashboard-scene/serialization/transformSceneToSaveModelSchemaV2.test.ts index e88afda7e4e..0bc40f8d9d6 100644 --- a/public/app/features/dashboard-scene/serialization/transformSceneToSaveModelSchemaV2.test.ts +++ b/public/app/features/dashboard-scene/serialization/transformSceneToSaveModelSchemaV2.test.ts @@ -10,7 +10,6 @@ import { IntervalVariable, QueryVariable, SceneGridLayout, - SceneGridRow, SceneRefreshPicker, SceneTimePicker, SceneTimeRange, @@ -45,7 +44,6 @@ import { AutoGridLayout } from '../scene/layout-auto-grid/AutoGridLayout'; import { AutoGridLayoutManager } from '../scene/layout-auto-grid/AutoGridLayoutManager'; import { DashboardGridItem } from '../scene/layout-default/DashboardGridItem'; import { DefaultGridLayoutManager } from '../scene/layout-default/DefaultGridLayoutManager'; -import { RowRepeaterBehavior } from '../scene/layout-default/RowRepeaterBehavior'; import { RowItem } from '../scene/layout-rows/RowItem'; import { RowsLayoutManager } from '../scene/layout-rows/RowsLayoutManager'; import { TabItem } from '../scene/layout-tabs/TabItem'; @@ -254,30 +252,6 @@ describe('transformSceneToSaveModelSchemaV2', () => { // repeatDirection?: RepeatDirection, // maxPerRow?: number, }), - new SceneGridRow({ - key: 'panel-4', - title: 'Test Row', - y: 10, - $behaviors: [new RowRepeaterBehavior({ variableName: 'customVar' })], - children: [ - new DashboardGridItem({ - y: 11, - body: new VizPanel({ - key: 'panel-2', - pluginId: 'graph', - title: 'Test Panel 2', - description: 'Test Description 2', - fieldConfig: { defaults: {}, overrides: [] }, - pluginVersion: '7.0.0', - $timeRange: new SceneTimeRange({ - timeZone: 'UTC', - from: 'now-3h', - to: 'now', - }), - }), - }), - ], - }), ], }), }), diff --git a/public/app/features/dashboard-scene/settings/DashboardLinksEditView.tsx b/public/app/features/dashboard-scene/settings/DashboardLinksEditView.tsx index e0c5da78ef4..90f4c8eef3f 100644 --- a/public/app/features/dashboard-scene/settings/DashboardLinksEditView.tsx +++ b/public/app/features/dashboard-scene/settings/DashboardLinksEditView.tsx @@ -1,4 +1,5 @@ import { NavModel, NavModelItem, PageLayoutType, arrayUtils } from '@grafana/data'; +import { useTranslate } from '@grafana/i18n'; import { SceneComponentProps, SceneObjectBase } from '@grafana/scenes'; import { DashboardLink } from '@grafana/schema'; import { Page } from 'app/core/components/Page/Page'; @@ -119,8 +120,9 @@ interface EditLinkViewProps { } function EditLinkView({ pageNav, link, navModel, dashboard, onChange, onGoBack }: EditLinkViewProps) { + const { t } = useTranslate(); const editLinkPageNav = { - text: 'Edit link', + text: t('dashboard-scene.edit-link-view.edit-link-page-nav.text.edit-link', 'Edit link'), parentItem: pageNav, }; diff --git a/public/app/features/dashboard-scene/settings/DeleteDashboardButton.tsx b/public/app/features/dashboard-scene/settings/DeleteDashboardButton.tsx index 02c70bcc215..f1e22bce428 100644 --- a/public/app/features/dashboard-scene/settings/DeleteDashboardButton.tsx +++ b/public/app/features/dashboard-scene/settings/DeleteDashboardButton.tsx @@ -2,7 +2,7 @@ import { useAsyncFn, useToggle } from 'react-use'; import { selectors } from '@grafana/e2e-selectors'; import { Trans, useTranslate } from '@grafana/i18n'; -import { reportInteraction } from '@grafana/runtime'; +import { config, reportInteraction } from '@grafana/runtime'; import { Button, ConfirmModal, Modal, Space, Text, TextLink } from '@grafana/ui'; import { useDeleteItemsMutation } from '../../browse-dashboards/api/browseDashboardsAPI'; @@ -34,7 +34,7 @@ export function DeleteDashboardButton({ dashboard }: ButtonProps) { dashboard: 1, }, source: 'dashboard_scene_settings', - restore_enabled: false, + restore_enabled: Boolean(config.featureToggles.restoreDashboards), }); toggleModal(); if (dashboard.state.uid) { @@ -83,7 +83,7 @@ export function DeleteDashboardModal({ dashboardTitle, onConfirm, onClose }: Del isOpen={true} body={ <> - {false && ( // TODO: re-enable when restore is reworked + {config.featureToggles.restoreDashboards && ( <> <Text element="p"> <Trans i18nKey="dashboard-settings.delete-modal-restore-dashboards-text"> diff --git a/public/app/features/dashboard-scene/settings/utils.ts b/public/app/features/dashboard-scene/settings/utils.ts index abd50c7f120..944193437ec 100644 --- a/public/app/features/dashboard-scene/settings/utils.ts +++ b/public/app/features/dashboard-scene/settings/utils.ts @@ -36,7 +36,7 @@ export function useDashboardEditPageNav(dashboard: DashboardScene, currentEditVi const dashboardPageNav = dashboard.getPageNav(location, navIndex); const pageNav: NavModelItem = { - text: 'Settings', + text: t('dashboard-scene.use-dashboard-edit-page-nav.page-nav.text.settings', 'Settings'), url: locationUtil.getUrlForPartial(location, { editview: 'settings', editIndex: null }), children: [], parentItem: dashboardPageNav, diff --git a/public/app/features/dashboard-scene/settings/variables/VariableEditorForm.tsx b/public/app/features/dashboard-scene/settings/variables/VariableEditorForm.tsx index b0e2b542bd6..d071571da13 100644 --- a/public/app/features/dashboard-scene/settings/variables/VariableEditorForm.tsx +++ b/public/app/features/dashboard-scene/settings/variables/VariableEditorForm.tsx @@ -136,7 +136,7 @@ export function VariableEditorForm({ variable, onTypeChange, onGoBack, onDelete fill="outline" onClick={() => { showModal(ConfirmModal, { - title: 'Delete variable', + title: t('dashboard-scene.variable-editor-form.title.delete-variable', 'Delete variable'), body: `Are you sure you want to delete: ${name}?`, confirmText: 'Delete variable', onConfirm: onDeleteVariable(hideModal), diff --git a/public/app/features/dashboard-scene/settings/variables/VariableSetEditableElement.tsx b/public/app/features/dashboard-scene/settings/variables/VariableSetEditableElement.tsx index 74861227cd1..ecd76e213c1 100644 --- a/public/app/features/dashboard-scene/settings/variables/VariableSetEditableElement.tsx +++ b/public/app/features/dashboard-scene/settings/variables/VariableSetEditableElement.tsx @@ -80,7 +80,6 @@ function VariableList({ set }: { set: SceneVariableSet }) { // TODO fix keyboard a11y here // eslint-disable-next-line jsx-a11y/no-static-element-interactions,jsx-a11y/click-events-have-key-events <div className={styles.variableItem} key={variable.state.name} onClick={() => onEditVariable(variable)}> - {/* eslint-disable-next-line @grafana/no-untranslated-strings */} <Text>${variable.state.name}</Text> <Stack direction="row" gap={1} alignItems="center"> <Button variant="primary" size="sm" fill="outline"> diff --git a/public/app/features/dashboard-scene/settings/variables/components/CustomVariableForm.tsx b/public/app/features/dashboard-scene/settings/variables/components/CustomVariableForm.tsx index 3d41bfd3638..59a405cb4eb 100644 --- a/public/app/features/dashboard-scene/settings/variables/components/CustomVariableForm.tsx +++ b/public/app/features/dashboard-scene/settings/variables/components/CustomVariableForm.tsx @@ -48,7 +48,7 @@ export function CustomVariableForm({ <VariableTextAreaField name="Values separated by comma" defaultValue={query} - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="1, 10, mykey : myvalue, myvalue, escaped\,value" onBlur={onQueryChange} required diff --git a/public/app/features/dashboard-scene/settings/variables/components/DataSourceVariableForm.tsx b/public/app/features/dashboard-scene/settings/variables/components/DataSourceVariableForm.tsx index bce9f82d18a..a817f952cb7 100644 --- a/public/app/features/dashboard-scene/settings/variables/components/DataSourceVariableForm.tsx +++ b/public/app/features/dashboard-scene/settings/variables/components/DataSourceVariableForm.tsx @@ -42,7 +42,7 @@ export function DataSourceVariableForm({ onAllValueChange, onAllowCustomValueChange, }: DataSourceVariableFormProps) { - const typeValue = optionTypes.find((o) => o.value === query) ?? optionTypes[0]; + const typeValue = optionTypes.find((o) => o.value === query); return ( <> @@ -60,7 +60,7 @@ export function DataSourceVariableForm({ <VariableTextField defaultValue={regex} name="Instance name filter" - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="/.*-(.*)-.*/" onBlur={onRegExBlur} description={ diff --git a/public/app/features/dashboard-scene/settings/variables/components/GroupByVariableForm.test.tsx b/public/app/features/dashboard-scene/settings/variables/components/GroupByVariableForm.test.tsx index bca55beadec..e0572105472 100644 --- a/public/app/features/dashboard-scene/settings/variables/components/GroupByVariableForm.test.tsx +++ b/public/app/features/dashboard-scene/settings/variables/components/GroupByVariableForm.test.tsx @@ -45,6 +45,7 @@ describe('GroupByVariableForm', () => { onAllowCustomValueChange: onAllowCustomValueChangeMock, onDataSourceChange: onDataSourceChangeMock, onDefaultOptionsChange: onDefaultOptionsChangeMock, + datasourceSupported: true, }; function setup(props?: Partial<GroupByVariableFormProps>) { @@ -130,4 +131,27 @@ describe('GroupByVariableForm', () => { expect(onDefaultOptionsChangeMock).toHaveBeenCalledTimes(1); expect(onDefaultOptionsChangeMock).toHaveBeenCalledWith(undefined); }); + + it('should render only datasource picker and alert when not supported', async () => { + const mockOnAllowCustomValueChange = jest.fn(); + const { renderer } = await setup({ + ...defaultProps, + datasourceSupported: false, + onAllowCustomValueChange: mockOnAllowCustomValueChange, + }); + + const dataSourcePicker = renderer.getByTestId( + selectors.pages.Dashboard.Settings.Variables.Edit.GroupByVariable.dataSourceSelect + ); + + const allowCustomValueCheckbox = renderer.queryByTestId( + selectors.pages.Dashboard.Settings.Variables.Edit.General.selectionOptionsAllowCustomValueSwitch + ); + + const alertText = renderer.getByTestId(selectors.pages.Dashboard.Settings.Variables.Edit.GroupByVariable.infoText); + + expect(dataSourcePicker).toBeInTheDocument(); + expect(allowCustomValueCheckbox).not.toBeInTheDocument(); + expect(alertText).toBeInTheDocument(); + }); }); diff --git a/public/app/features/dashboard-scene/settings/variables/components/GroupByVariableForm.tsx b/public/app/features/dashboard-scene/settings/variables/components/GroupByVariableForm.tsx index 749f4a66eca..e122abb2f7e 100644 --- a/public/app/features/dashboard-scene/settings/variables/components/GroupByVariableForm.tsx +++ b/public/app/features/dashboard-scene/settings/variables/components/GroupByVariableForm.tsx @@ -3,8 +3,9 @@ import { FormEvent, useCallback } from 'react'; import { DataSourceInstanceSettings, MetricFindValue, readCSV } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; import { Trans, useTranslate } from '@grafana/i18n'; +import { EditorField } from '@grafana/plugin-ui'; import { DataSourceRef } from '@grafana/schema'; -import { Alert, CodeEditor, Field, Switch } from '@grafana/ui'; +import { Alert, Box, CodeEditor, Field, Switch } from '@grafana/ui'; import { DataSourcePicker } from 'app/features/datasources/components/picker/DataSourcePicker'; import { VariableCheckboxField } from './VariableCheckboxField'; @@ -18,6 +19,8 @@ export interface GroupByVariableFormProps { defaultOptions?: MetricFindValue[]; allowCustomValue: boolean; onAllowCustomValueChange: (event: FormEvent<HTMLInputElement>) => void; + inline?: boolean; + datasourceSupported: boolean; } export function GroupByVariableForm({ @@ -28,6 +31,8 @@ export function GroupByVariableForm({ onDefaultOptionsChange, allowCustomValue, onAllowCustomValueChange, + inline, + datasourceSupported, }: GroupByVariableFormProps) { const updateDefaultOptions = useCallback( (csvContent: string) => { @@ -45,70 +50,85 @@ export function GroupByVariableForm({ return ( <> - <VariableLegend> - <Trans i18nKey="dashboard-scene.group-by-variable-form.group-by-options">Group by options</Trans> - </VariableLegend> - <Field - label={t('dashboard-scene.group-by-variable-form.label-data-source', 'Data source')} - htmlFor="data-source-picker" - > - <DataSourcePicker current={datasource} onChange={onDataSourceChange} width={30} variables={true} noDefault /> - </Field> + {!inline && ( + <VariableLegend> + <Trans i18nKey="dashboard-scene.group-by-variable-form.group-by-options">Group by options</Trans> + </VariableLegend> + )} + + <Box marginBottom={2}> + <EditorField + label={t('dashboard-scene.group-by-variable-form.label-data-source', 'Data source')} + htmlFor="data-source-picker" + tooltip={infoText} + > + <DataSourcePicker current={datasource} onChange={onDataSourceChange} width={30} variables={true} noDefault /> + </EditorField> + </Box> - {infoText ? ( + {!datasourceSupported ? ( <Alert - title={infoText} - severity="info" + title={t( + 'dashboard-scene.group-by-variable-form.alert-not-supported', + 'This data source does not support group by variables' + )} + severity="warning" data-testid={selectors.pages.Dashboard.Settings.Variables.Edit.GroupByVariable.infoText} /> ) : null} - <Field - label={t( - 'dashboard-scene.group-by-variable-form.label-use-static-group-by-dimensions', - 'Use static group dimensions' - )} - description={t( - 'dashboard-scene.group-by-variable-form.description-provide-dimensions-as-csv-dimension-name-dimension-id', - 'Provide dimensions as CSV: {{name}}, {{value}}', - { name: 'dimensionName', value: 'dimensionId' } - )} - > - <Switch - data-testid={selectors.pages.Dashboard.Settings.Variables.Edit.GroupByVariable.modeToggle} - value={defaultOptions !== undefined} - onChange={(e) => { - if (defaultOptions === undefined) { - onDefaultOptionsChange([]); - } else { - onDefaultOptionsChange(undefined); - } - }} - /> - </Field> + {datasourceSupported && ( + <> + <Field + label={t( + 'dashboard-scene.group-by-variable-form.label-use-static-group-by-dimensions', + 'Use static group dimensions' + )} + description={t( + 'dashboard-scene.group-by-variable-form.description-provide-dimensions-as-csv-dimension-name-dimension-id', + 'Provide dimensions as CSV: {{name}}, {{value}}', + { name: 'dimensionName', value: 'dimensionId' } + )} + > + <Switch + data-testid={selectors.pages.Dashboard.Settings.Variables.Edit.GroupByVariable.modeToggle} + value={defaultOptions !== undefined} + onChange={(e) => { + if (defaultOptions === undefined) { + onDefaultOptionsChange([]); + } else { + onDefaultOptionsChange(undefined); + } + }} + /> + </Field> - {defaultOptions !== undefined && ( - <CodeEditor - height={300} - language="csv" - value={defaultOptions.map((o) => `${o.text},${o.value}`).join('\n')} - onBlur={updateDefaultOptions} - onSave={updateDefaultOptions} - showMiniMap={false} - showLineNumbers={true} - /> + {defaultOptions !== undefined && ( + <CodeEditor + height={300} + language="csv" + value={defaultOptions.map((o) => `${o.text},${o.value}`).join('\n')} + onBlur={updateDefaultOptions} + onSave={updateDefaultOptions} + showMiniMap={false} + showLineNumbers={true} + /> + )} + </> )} - <VariableCheckboxField - value={allowCustomValue} - name="Allow custom values" - description={t( - 'dashboard-scene.group-by-variable-form.description-enables-users-custom-values', - 'Enables users to add custom values to the list' - )} - onChange={onAllowCustomValueChange} - testId={selectors.pages.Dashboard.Settings.Variables.Edit.General.selectionOptionsAllowCustomValueSwitch} - /> + {datasourceSupported && !inline && onAllowCustomValueChange && ( + <VariableCheckboxField + value={allowCustomValue} + name="Allow custom values" + description={t( + 'dashboard-scene.group-by-variable-form.description-enables-users-custom-values', + 'Enables users to add custom values to the list' + )} + onChange={onAllowCustomValueChange} + testId={selectors.pages.Dashboard.Settings.Variables.Edit.General.selectionOptionsAllowCustomValueSwitch} + /> + )} </> ); } diff --git a/public/app/features/dashboard-scene/settings/variables/components/IntervalVariableForm.tsx b/public/app/features/dashboard-scene/settings/variables/components/IntervalVariableForm.tsx index 1d477f344b4..08e5f7896af 100644 --- a/public/app/features/dashboard-scene/settings/variables/components/IntervalVariableForm.tsx +++ b/public/app/features/dashboard-scene/settings/variables/components/IntervalVariableForm.tsx @@ -52,7 +52,7 @@ export function IntervalVariableForm({ <VariableTextField defaultValue={intervals} name="Values" - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="1m,10m,1h,6h,1d,7d" onBlur={onIntervalsChange} testId={selectors.pages.Dashboard.Settings.Variables.Edit.IntervalVariable.intervalsValueInput} @@ -91,7 +91,7 @@ export function IntervalVariableForm({ 'dashboard-scene.interval-variable-form.description-calculated-value-below-threshold', 'The calculated value will not go below this threshold' )} - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="10s" onChange={onAutoMinIntervalChanged} width={11} diff --git a/public/app/features/dashboard-scene/settings/variables/components/QueryVariableForm.tsx b/public/app/features/dashboard-scene/settings/variables/components/QueryVariableForm.tsx index 92b09ebfb85..4c99aa359a7 100644 --- a/public/app/features/dashboard-scene/settings/variables/components/QueryVariableForm.tsx +++ b/public/app/features/dashboard-scene/settings/variables/components/QueryVariableForm.tsx @@ -125,7 +125,7 @@ export function QueryVariableEditorForm({ </Trans> </div> } - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="/.*-(?<text>.*)-(?<value>.*)-.*/" onBlur={onRegExChange} testId={selectors.pages.Dashboard.Settings.Variables.Edit.QueryVariable.queryOptionsRegExInputV2} diff --git a/public/app/features/dashboard-scene/settings/variables/components/VariableSelectField.tsx b/public/app/features/dashboard-scene/settings/variables/components/VariableSelectField.tsx index e7140b69021..68ee3262c7a 100644 --- a/public/app/features/dashboard-scene/settings/variables/components/VariableSelectField.tsx +++ b/public/app/features/dashboard-scene/settings/variables/components/VariableSelectField.tsx @@ -7,7 +7,7 @@ import { Field, Select, useStyles2 } from '@grafana/ui'; interface VariableSelectFieldProps<T> { name: string; - value: SelectableValue<T>; + value?: SelectableValue<T>; options: Array<SelectableValue<T>>; onChange: (option: SelectableValue<T>) => void; testId?: string; diff --git a/public/app/features/dashboard-scene/settings/variables/editors/CustomVariableEditor.tsx b/public/app/features/dashboard-scene/settings/variables/editors/CustomVariableEditor.tsx index 9ec8289a074..e3612a4be4e 100644 --- a/public/app/features/dashboard-scene/settings/variables/editors/CustomVariableEditor.tsx +++ b/public/app/features/dashboard-scene/settings/variables/editors/CustomVariableEditor.tsx @@ -1,6 +1,11 @@ import { FormEvent } from 'react'; +import { lastValueFrom } from 'rxjs'; -import { CustomVariable } from '@grafana/scenes'; +import { selectors } from '@grafana/e2e-selectors'; +import { t } from '@grafana/i18n/internal'; +import { CustomVariable, SceneVariable } from '@grafana/scenes'; +import { TextArea } from '@grafana/ui'; +import { OptionsPaneItemDescriptor } from 'app/features/dashboard/components/PanelEditor/OptionsPaneItemDescriptor'; import { CustomVariableForm } from '../components/CustomVariableForm'; @@ -44,3 +49,39 @@ export function CustomVariableEditor({ variable, onRunQuery }: CustomVariableEdi /> ); } + +export function getCustomVariableOptions(variable: SceneVariable): OptionsPaneItemDescriptor[] { + if (!(variable instanceof CustomVariable)) { + return []; + } + + return [ + new OptionsPaneItemDescriptor({ + title: t('dashboard.edit-pane.variable.custom-options.values', 'Values separated by comma'), + render: () => <ValuesTextField variable={variable} />, + }), + ]; +} + +function ValuesTextField({ variable }: { variable: CustomVariable }) { + const { query } = variable.useState(); + + const onBlur = async (event: FormEvent<HTMLTextAreaElement>) => { + variable.setState({ query: event.currentTarget.value }); + await lastValueFrom(variable.validateAndUpdate!()); + }; + + return ( + <TextArea + rows={2} + defaultValue={query} + onBlur={onBlur} + placeholder={t( + 'dashboard.edit-pane.variable.custom-options.values-placeholder', + '1, 10, mykey : myvalue, myvalue, escaped\,value' + )} + required + data-testid={selectors.pages.Dashboard.Settings.Variables.Edit.CustomVariable.customValueInput} + /> + ); +} diff --git a/public/app/features/dashboard-scene/settings/variables/editors/DataSourceVariableEditor.tsx b/public/app/features/dashboard-scene/settings/variables/editors/DataSourceVariableEditor.tsx index 63a2a63238e..fb040b268aa 100644 --- a/public/app/features/dashboard-scene/settings/variables/editors/DataSourceVariableEditor.tsx +++ b/public/app/features/dashboard-scene/settings/variables/editors/DataSourceVariableEditor.tsx @@ -1,7 +1,12 @@ -import { FormEvent } from 'react'; +import React, { FormEvent } from 'react'; +import { lastValueFrom } from 'rxjs'; import { SelectableValue } from '@grafana/data'; -import { DataSourceVariable } from '@grafana/scenes'; +import { selectors } from '@grafana/e2e-selectors'; +import { t } from '@grafana/i18n/internal'; +import { DataSourceVariable, SceneVariable } from '@grafana/scenes'; +import { Combobox, ComboboxOption, Input } from '@grafana/ui'; +import { OptionsPaneItemDescriptor } from 'app/features/dashboard/components/PanelEditor/OptionsPaneItemDescriptor'; import { DataSourceVariableForm } from '../components/DataSourceVariableForm'; import { getOptionDataSourceTypes } from '../utils'; @@ -66,3 +71,62 @@ export function DataSourceVariableEditor({ variable, onRunQuery }: DataSourceVar /> ); } + +export function getDataSourceVariableOptions(variable: SceneVariable): OptionsPaneItemDescriptor[] { + if (!(variable instanceof DataSourceVariable)) { + return []; + } + + return [ + new OptionsPaneItemDescriptor({ + title: t('dashboard.edit-pane.variable.datasource-options.type', 'Type'), + render: () => <DataSourceTypeSelect variable={variable} />, + }), + new OptionsPaneItemDescriptor({ + title: t('dashboard.edit-pane.variable.datasource-options.name-filter', 'Name filter'), + description: t( + 'dashboard.edit-pane.variable.datasource-options.name-filter-description', + 'Regex filter for which data source instances to include. Leave empty for all.' + ), + render: () => <DataSourceNameFilter variable={variable} />, + }), + ]; +} + +function DataSourceTypeSelect({ variable }: { variable: DataSourceVariable }) { + const { pluginId } = variable.useState(); + const options = getOptionDataSourceTypes(); + + const onChange = async (value: ComboboxOption<string>) => { + variable.setState({ pluginId: value.value }); + await lastValueFrom(variable.validateAndUpdate!()); + }; + + return ( + <Combobox + options={options} + value={pluginId} + onChange={onChange} + placeholder={t('dashboard.edit-pane.variable.datasource-options.type-placeholder', 'Choose data source type')} + data-testid={selectors.pages.Dashboard.Settings.Variables.Edit.DatasourceVariable.datasourceSelect} + /> + ); +} + +function DataSourceNameFilter({ variable }: { variable: DataSourceVariable }) { + const { regex } = variable.useState(); + + const onBlur = async (evt: React.FormEvent<HTMLInputElement>) => { + variable.setState({ regex: evt.currentTarget.value }); + await lastValueFrom(variable.validateAndUpdate!()); + }; + + return ( + <Input + defaultValue={regex} + onBlur={onBlur} + data-testid={selectors.pages.Dashboard.Settings.Variables.Edit.DatasourceVariable.nameFilter} + placeholder={t('dashboard.edit-pane.variable.datasource-options.name-filter-placeholder', 'Example: /^prod/')} + /> + ); +} diff --git a/public/app/features/dashboard-scene/settings/variables/editors/GroupByVariableEditor.test.tsx b/public/app/features/dashboard-scene/settings/variables/editors/GroupByVariableEditor.test.tsx index 7185d4bb00b..aa31e257e05 100644 --- a/public/app/features/dashboard-scene/settings/variables/editors/GroupByVariableEditor.test.tsx +++ b/public/app/features/dashboard-scene/settings/variables/editors/GroupByVariableEditor.test.tsx @@ -1,13 +1,14 @@ -import { act, render } from '@testing-library/react'; +import { act, render, waitFor, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { MetricFindValue, VariableSupportType } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; import { GroupByVariable } from '@grafana/scenes'; import { mockDataSource } from 'app/features/alerting/unified/mocks'; +import { OptionsPaneCategoryDescriptor } from 'app/features/dashboard/components/PanelEditor/OptionsPaneCategoryDescriptor'; import { LegacyVariableQueryEditor } from 'app/features/variables/editor/LegacyVariableQueryEditor'; -import { GroupByVariableEditor } from './GroupByVariableEditor'; +import { getGroupByVariableOptions, GroupByVariableEditor } from './GroupByVariableEditor'; const defaultDatasource = mockDataSource({ name: 'Default Test Data Source', @@ -31,6 +32,7 @@ jest.mock('@grafana/runtime', () => ({ query: jest.fn(), editor: jest.fn().mockImplementation(LegacyVariableQueryEditor), }, + getTagKeys: () => [], }), getList: () => [defaultDatasource, promDatasource], getInstanceSettings: () => ({ ...defaultDatasource }), @@ -43,8 +45,8 @@ describe('GroupByVariableEditor', () => { const dataSourcePicker = renderer.getByTestId( selectors.pages.Dashboard.Settings.Variables.Edit.GroupByVariable.dataSourceSelect ); - const infoText = renderer.getByTestId(selectors.pages.Dashboard.Settings.Variables.Edit.GroupByVariable.infoText); - const allowCustomValueCheckbox = renderer.getByTestId( + + const allowCustomValueCheckbox = renderer.queryByTestId( selectors.pages.Dashboard.Settings.Variables.Edit.General.selectionOptionsAllowCustomValueSwitch ); @@ -52,8 +54,6 @@ describe('GroupByVariableEditor', () => { expect(allowCustomValueCheckbox).toBeChecked(); expect(dataSourcePicker).toBeInTheDocument(); expect(dataSourcePicker.getAttribute('placeholder')).toBe('Default Test Data Source'); - expect(infoText).toBeInTheDocument(); - expect(infoText).toHaveTextContent('This data source does not support group by variable yet.'); }); it('should update the variable data source when data source picker is changed', async () => { @@ -87,6 +87,31 @@ describe('GroupByVariableEditor', () => { expect(variable.state.defaultOptions).toEqual(undefined); }); + + it('should return an OptionsPaneItemDescriptor that renders Editor', async () => { + const variable = new GroupByVariable({ + name: 'test', + datasource: { uid: defaultDatasource.uid, type: defaultDatasource.type }, + }); + + const result = getGroupByVariableOptions(variable); + + expect(result.length).toBe(1); + const descriptor = result[0]; + + // Mock the parent property that OptionsPaneItem expects + descriptor.parent = new OptionsPaneCategoryDescriptor({ + id: 'mock-parent-id', + title: 'Mock Parent', + }); + + render(descriptor.render()); + + await waitFor(() => { + // Check that some part of the component renders + expect(screen.getByText(/data source does not support/i)).toBeInTheDocument(); + }); + }); }); async function setup(defaultOptions?: MetricFindValue[]) { diff --git a/public/app/features/dashboard-scene/settings/variables/editors/GroupByVariableEditor.tsx b/public/app/features/dashboard-scene/settings/variables/editors/GroupByVariableEditor.tsx index 759a886059b..67df8b473a0 100644 --- a/public/app/features/dashboard-scene/settings/variables/editors/GroupByVariableEditor.tsx +++ b/public/app/features/dashboard-scene/settings/variables/editors/GroupByVariableEditor.tsx @@ -1,26 +1,30 @@ +import { noop } from 'lodash'; import { FormEvent } from 'react'; import { useAsync } from 'react-use'; import { DataSourceInstanceSettings, MetricFindValue, getDataSourceRef } from '@grafana/data'; import { getDataSourceSrv } from '@grafana/runtime'; -import { GroupByVariable } from '@grafana/scenes'; +import { GroupByVariable, SceneVariable } from '@grafana/scenes'; +import { OptionsPaneItemDescriptor } from 'app/features/dashboard/components/PanelEditor/OptionsPaneItemDescriptor'; import { GroupByVariableForm } from '../components/GroupByVariableForm'; interface GroupByVariableEditorProps { variable: GroupByVariable; onRunQuery: () => void; + inline?: boolean; } export function GroupByVariableEditor(props: GroupByVariableEditorProps) { - const { variable, onRunQuery } = props; + const { variable, onRunQuery, inline } = props; const { datasource: datasourceRef, defaultOptions, allowCustomValue = true } = variable.useState(); const { value: datasource } = useAsync(async () => { return await getDataSourceSrv().get(datasourceRef); }, [variable.state]); - const message = datasource?.getTagKeys + const supported = datasource?.getTagKeys !== undefined; + const message = supported ? 'Group by dimensions are applied automatically to all queries that target this data source' : 'This data source does not support group by variable yet.'; @@ -49,6 +53,21 @@ export function GroupByVariableEditor(props: GroupByVariableEditorProps) { onDefaultOptionsChange={onDefaultOptionsChange} allowCustomValue={allowCustomValue} onAllowCustomValueChange={onAllowCustomValueChange} + inline={inline} + datasourceSupported={supported} /> ); } + +export function getGroupByVariableOptions(variable: SceneVariable): OptionsPaneItemDescriptor[] { + if (!(variable instanceof GroupByVariable)) { + console.warn('getAdHocFilterOptions: variable is not an AdHocFiltersVariable'); + return []; + } + + return [ + new OptionsPaneItemDescriptor({ + render: () => <GroupByVariableEditor variable={variable} onRunQuery={noop} inline={true} />, + }), + ]; +} diff --git a/public/app/features/dashboard-scene/settings/variables/editors/QueryVariableEditor.tsx b/public/app/features/dashboard-scene/settings/variables/editors/QueryVariableEditor.tsx index 2332f44e778..92c56fedab7 100644 --- a/public/app/features/dashboard-scene/settings/variables/editors/QueryVariableEditor.tsx +++ b/public/app/features/dashboard-scene/settings/variables/editors/QueryVariableEditor.tsx @@ -246,7 +246,7 @@ export function Editor({ variable }: { variable: QueryVariable }) { </Trans> </div> } - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="/.*-(?<text>.*)-(?<value>.*)-.*/" onBlur={onRegExChange} testId={selectors.pages.Dashboard.Settings.Variables.Edit.QueryVariable.queryOptionsRegExInputV2} diff --git a/public/app/features/dashboard-scene/settings/variables/useVariableSelectionOptionsCategory.tsx b/public/app/features/dashboard-scene/settings/variables/useVariableSelectionOptionsCategory.tsx index a77d33e7791..4793a98dd67 100644 --- a/public/app/features/dashboard-scene/settings/variables/useVariableSelectionOptionsCategory.tsx +++ b/public/app/features/dashboard-scene/settings/variables/useVariableSelectionOptionsCategory.tsx @@ -23,10 +23,10 @@ export function useVariableSelectionOptionsCategory(variable: MultiValueVariable ) .addItem( new OptionsPaneItemDescriptor({ - title: t('dashboard.edit-pane.variable.selection-options.include-all', 'Include All option'), + title: t('dashboard.edit-pane.variable.selection-options.include-all', 'Include All value'), description: t( 'dashboard.edit-pane.variable.selection-options.include-all-description', - 'Enables an option to include all values' + 'Enables a single option that represent all values' ), render: () => <IncludeAllSwitch variable={variable} />, }) diff --git a/public/app/features/dashboard-scene/settings/variables/utils.test.ts b/public/app/features/dashboard-scene/settings/variables/utils.test.ts index 777e5761351..b5a54c242c8 100644 --- a/public/app/features/dashboard-scene/settings/variables/utils.test.ts +++ b/public/app/features/dashboard-scene/settings/variables/utils.test.ts @@ -328,10 +328,8 @@ describe('getDefinition', () => { describe('getOptionDataSourceTypes', () => { it('should return all data source types when no data source types are specified', () => { const optionTypes = getOptionDataSourceTypes(); - expect(optionTypes).toHaveLength(2); - // in the old code we always had an empty option - expect(optionTypes[0].value).toBe(''); - expect(optionTypes[1].label).toBe('ds1'); + expect(optionTypes).toHaveLength(1); + expect(optionTypes[0].label).toBe('ds1'); }); }); diff --git a/public/app/features/dashboard-scene/settings/variables/utils.ts b/public/app/features/dashboard-scene/settings/variables/utils.ts index f006b0f2221..a43c6e9d8f3 100644 --- a/public/app/features/dashboard-scene/settings/variables/utils.ts +++ b/public/app/features/dashboard-scene/settings/variables/utils.ts @@ -23,12 +23,11 @@ import { OptionsPaneItemDescriptor } from 'app/features/dashboard/components/Pan import { getIntervalsQueryFromNewIntervalModel } from '../../utils/utils'; -import { getCustomVariableOptions } from './components/CustomVariableForm'; import { AdHocFiltersVariableEditor, getAdHocFilterOptions } from './editors/AdHocFiltersVariableEditor'; import { ConstantVariableEditor, getConstantVariableOptions } from './editors/ConstantVariableEditor'; -import { CustomVariableEditor } from './editors/CustomVariableEditor'; -import { DataSourceVariableEditor } from './editors/DataSourceVariableEditor'; -import { GroupByVariableEditor } from './editors/GroupByVariableEditor'; +import { CustomVariableEditor, getCustomVariableOptions } from './editors/CustomVariableEditor'; +import { DataSourceVariableEditor, getDataSourceVariableOptions } from './editors/DataSourceVariableEditor'; +import { getGroupByVariableOptions, GroupByVariableEditor } from './editors/GroupByVariableEditor'; import { getIntervalVariableOptions, IntervalVariableEditor } from './editors/IntervalVariableEditor'; import { getQueryVariableOptions, QueryVariableEditor } from './editors/QueryVariableEditor'; import { TextBoxVariableEditor, getTextBoxVariableOptions } from './editors/TextBoxVariableEditor'; @@ -76,6 +75,7 @@ export const EDITABLE_VARIABLES: Record<EditableVariableType, EditableVariableCo name: 'Data source', description: 'Dynamically switch the data source for multiple panels', editor: DataSourceVariableEditor, + getOptions: getDataSourceVariableOptions, }, adhoc: { name: 'Ad hoc filters', @@ -87,6 +87,7 @@ export const EDITABLE_VARIABLES: Record<EditableVariableType, EditableVariableCo name: 'Group by', description: 'Add keys to group by on the fly', editor: GroupByVariableEditor, + getOptions: getGroupByVariableOptions, }, textbox: { name: 'Textbox', @@ -216,8 +217,6 @@ export function getOptionDataSourceTypes() { }) .value(); - optionTypes.unshift({ label: '', value: '' }); - return optionTypes; } diff --git a/public/app/features/dashboard-scene/sharing/ExportButton/ResourceExport.tsx b/public/app/features/dashboard-scene/sharing/ExportButton/ResourceExport.tsx index 1b401144d76..a44652a0fe3 100644 --- a/public/app/features/dashboard-scene/sharing/ExportButton/ResourceExport.tsx +++ b/public/app/features/dashboard-scene/sharing/ExportButton/ResourceExport.tsx @@ -59,9 +59,15 @@ export function ResourceExport({ <Label>{switchExportModeLabel}</Label> <RadioButtonGroup options={[ - { label: 'Classic', value: ExportMode.Classic }, - { label: 'V1 Resource', value: ExportMode.V1Resource }, - { label: 'V2 Resource', value: ExportMode.V2Resource }, + { label: t('dashboard-scene.resource-export.label.classic', 'Classic'), value: ExportMode.Classic }, + { + label: t('dashboard-scene.resource-export.label.v1-resource', 'V1 Resource'), + value: ExportMode.V1Resource, + }, + { + label: t('dashboard-scene.resource-export.label.v2-resource', 'V2 Resource'), + value: ExportMode.V2Resource, + }, ]} value={exportMode} onChange={(value) => onExportModeChange(value)} @@ -73,8 +79,8 @@ export function ResourceExport({ <Label>{switchExportFormatLabel}</Label> <RadioButtonGroup options={[ - { label: 'JSON', value: 'json' }, - { label: 'YAML', value: 'yaml' }, + { label: t('dashboard-scene.resource-export.label.json', 'JSON'), value: 'json' }, + { label: t('dashboard-scene.resource-export.label.yaml', 'YAML'), value: 'yaml' }, ]} value={isViewingYAML ? 'yaml' : 'json'} onChange={onViewYAML} diff --git a/public/app/features/dashboard-scene/sharing/public-dashboards/ConfigPublicDashboard.tsx b/public/app/features/dashboard-scene/sharing/public-dashboards/ConfigPublicDashboard.tsx index 92e8271adeb..52c9f1f21fd 100644 --- a/public/app/features/dashboard-scene/sharing/public-dashboards/ConfigPublicDashboard.tsx +++ b/public/app/features/dashboard-scene/sharing/public-dashboards/ConfigPublicDashboard.tsx @@ -1,7 +1,7 @@ import { css } from '@emotion/css'; import { GrafanaTheme2 } from '@grafana/data'; -import { Trans } from '@grafana/i18n'; +import { Trans, useTranslate } from '@grafana/i18n'; import { SceneComponentProps, sceneGraph } from '@grafana/scenes'; import { useStyles2 } from '@grafana/ui'; import { contextSrv } from 'app/core/core'; @@ -24,6 +24,7 @@ interface Props extends SceneComponentProps<SharePublicDashboardTab> { } export function ConfigPublicDashboard({ model, publicDashboard, isGetLoading }: Props) { + const { t } = useTranslate(); const styles = useStyles2(getStyles); const hasWritePermissions = contextSrv.hasPermission(AccessControlAction.DashboardsPublicWrite); @@ -45,7 +46,7 @@ export function ConfigPublicDashboard({ model, publicDashboard, isGetLoading }: dashboard.showModal( new ConfirmModal({ isOpen: true, - title: 'Revoke public URL', + title: t('dashboard-scene.config-public-dashboard.title.revoke-public-url', 'Revoke public URL'), icon: 'trash-alt', confirmText: 'Revoke public URL', body: ( diff --git a/public/app/features/dashboard-scene/variables/utils.ts b/public/app/features/dashboard-scene/variables/utils.ts index dd9595ea547..12f0ef32484 100644 --- a/public/app/features/dashboard-scene/variables/utils.ts +++ b/public/app/features/dashboard-scene/variables/utils.ts @@ -1,3 +1,4 @@ +import { t } from '@grafana/i18n/internal'; import { SceneVariable, SceneVariableState } from '@grafana/scenes'; import { Dashboard } from '@grafana/schema/dist/esm/index.gen'; import { safeStringifyValue } from 'app/core/utils/explore'; @@ -72,7 +73,12 @@ export function transformUsagesToNetwork( const { variable, tree } = usage; const result: UsagesToNetwork = { variable, - nodes: [{ id: 'dashboard', label: 'dashboard' }], + nodes: [ + { + id: 'dashboard', + label: t('dashboard-scene.transform-usages-to-network.result.label.dashboard', 'dashboard'), + }, + ], edges: [], showGraph: false, }; diff --git a/public/app/features/dashboard/api/ResponseTransformers.test.ts b/public/app/features/dashboard/api/ResponseTransformers.test.ts index 90b29fbb4fe..eda142c38e5 100644 --- a/public/app/features/dashboard/api/ResponseTransformers.test.ts +++ b/public/app/features/dashboard/api/ResponseTransformers.test.ts @@ -3,10 +3,10 @@ import { handyTestingSchema } from '@grafana/schema/dist/esm/schema/dashboard/v2 import { Spec as DashboardV2Spec, GridLayoutItemKind, - GridLayoutItemSpec, GridLayoutKind, - GridLayoutRowSpec, PanelKind, + RowsLayoutKind, + RowsLayoutRowKind, VariableKind, } from '@grafana/schema/dist/esm/schema/dashboard/v2alpha1/types.spec.gen'; import { @@ -352,76 +352,6 @@ describe('ResponseTransformers', () => { }, gridPos: { x: 0, y: 8, w: 12, h: 8 }, }, - { - id: 3, - type: 'row', - title: 'Row test title', - gridPos: { x: 0, y: 16, w: 12, h: 1 }, - panels: [], - collapsed: false, - }, - { - id: 4, - type: 'timeseries', - title: 'Panel in row', - gridPos: { x: 0, y: 17, w: 16, h: 8 }, - targets: [ - { - refId: 'A', - datasource: 'datasource1', - expr: 'test-query', - hide: false, - }, - ], - datasource: { - type: 'prometheus', - uid: 'datasource1', - }, - fieldConfig: { defaults: {}, overrides: [] }, - options: {}, - transparent: false, - links: [], - transformations: [], - }, - { - id: 5, - type: 'row', - title: 'Collapsed row title', - gridPos: { x: 0, y: 25, w: 12, h: 1 }, - panels: [ - { - id: 5, - type: 'timeseries', - title: 'Panel in collapsed row', - gridPos: { x: 0, y: 26, w: 16, h: 8 }, - targets: [ - { - refId: 'A', - datasource: 'datasource1', - expr: 'test-query', - hide: false, - }, - ], - datasource: { - type: 'prometheus', - uid: 'datasource1', - }, - fieldConfig: { defaults: {}, overrides: [] }, - options: {}, - transparent: false, - links: [], - transformations: [], - }, - ], - collapsed: true, - }, - { - id: 6, - type: 'row', - title: 'Row with no panel property', - gridPos: { x: 0, y: 25, w: 12, h: 1 }, - collapsed: true, - }, ], }; @@ -499,7 +429,7 @@ describe('ResponseTransformers', () => { // Panel expect(spec.layout.kind).toBe('GridLayout'); const layout = spec.layout as GridLayoutKind; - expect(layout.spec.items).toHaveLength(5); + expect(layout.spec.items).toHaveLength(2); expect(layout.spec.items[0].spec).toEqual({ element: { kind: 'ElementReference', @@ -585,48 +515,6 @@ describe('ResponseTransformers', () => { }, }); - const rowSpec = layout.spec.items[2].spec as GridLayoutRowSpec; - - expect(rowSpec.collapsed).toBe(false); - expect(rowSpec.title).toBe('Row test title'); - expect(rowSpec.repeat).toBeUndefined(); - - const panelInRow = rowSpec.elements[0].spec as GridLayoutItemSpec; - - expect(panelInRow).toEqual({ - element: { - kind: 'ElementReference', - name: 'panel-4', - }, - x: 0, - y: 0, - width: 16, - height: 8, - }); - - const collapsedRowSpec = layout.spec.items[3].spec as GridLayoutRowSpec; - expect(collapsedRowSpec.collapsed).toBe(true); - expect(collapsedRowSpec.title).toBe('Collapsed row title'); - expect(collapsedRowSpec.repeat).toBeUndefined(); - - const panelInCollapsedRow = collapsedRowSpec.elements[0].spec as GridLayoutItemSpec; - - expect(panelInCollapsedRow).toEqual({ - element: { - kind: 'ElementReference', - name: 'panel-5', - }, - x: 0, - y: 0, - width: 16, - height: 8, - }); - - const rowWithNoPanelProperty = layout.spec.items[4].spec as GridLayoutRowSpec; - expect(rowWithNoPanelProperty.collapsed).toBe(true); - expect(rowWithNoPanelProperty.title).toBe('Row with no panel property'); - expect(rowWithNoPanelProperty.elements).toHaveLength(0); - // Variables validateVariablesV1ToV2(spec.variables[0], dashboardV1.templating?.list?.[0]); validateVariablesV1ToV2(spec.variables[1], dashboardV1.templating?.list?.[1]); @@ -640,6 +528,254 @@ describe('ResponseTransformers', () => { }); }); + describe('v1 -> v2 transformation with rows', () => { + it('should transform DashboardDTO to DashboardWithAccessInfo<DashboardV2Spec>', () => { + const dashboardV1: DashboardDataDTO = { + uid: 'dashboard-uid', + id: 123, + title: 'Dashboard Title', + description: 'Dashboard Description', + tags: ['tag1', 'tag2'], + schemaVersion: 1, + graphTooltip: 0, + preload: true, + liveNow: false, + editable: true, + time: { from: 'now-6h', to: 'now' }, + timezone: 'browser', + refresh: '5m', + timepicker: { + refresh_intervals: ['5s', '10s', '30s'], + hidden: false, + nowDelay: '1m', + quick_ranges: [ + { + display: 'Last 6 hours', + from: 'now-6h', + to: 'now', + }, + { + display: 'Last 7 days', + from: 'now-7d', + to: 'now', + }, + ], + }, + fiscalYearStartMonth: 1, + weekStart: 'monday', + version: 1, + gnetId: 'something-like-a-uid', + revision: 225, + links: [], + annotations: { + list: [], + }, + templating: { + list: [], + }, + panels: [ + { + id: 1, + type: 'timeseries', + title: 'Panel Title', + gridPos: { x: 0, y: 0, w: 12, h: 8 }, + targets: [ + { + refId: 'A', + datasource: 'datasource1', + expr: 'test-query', + hide: false, + }, + ], + datasource: { + type: 'prometheus', + uid: 'datasource1', + }, + fieldConfig: { defaults: {}, overrides: [] }, + options: {}, + transparent: false, + links: [], + transformations: [], + repeat: 'var1', + repeatDirection: 'h', + }, + { + id: 2, + type: 'table', + title: 'Just a shared table', + libraryPanel: { + uid: 'library-panel-table', + name: 'Table Panel as Library Panel', + }, + gridPos: { x: 0, y: 8, w: 12, h: 8 }, + }, + { + id: 3, + type: 'row', + title: 'Row test title', + gridPos: { x: 0, y: 16, w: 12, h: 1 }, + repeat: 'var1', + repeatDirection: 'v', + panels: [], + collapsed: false, + }, + { + id: 4, + type: 'timeseries', + title: 'Panel in row', + gridPos: { x: 0, y: 17, w: 16, h: 8 }, + targets: [ + { + refId: 'A', + datasource: 'datasource1', + expr: 'test-query', + hide: false, + }, + ], + datasource: { + type: 'prometheus', + uid: 'datasource1', + }, + fieldConfig: { defaults: {}, overrides: [] }, + options: {}, + transparent: false, + links: [], + transformations: [], + }, + { + id: 5, + type: 'row', + title: 'Collapsed row title', + gridPos: { x: 0, y: 25, w: 12, h: 1 }, + panels: [ + { + id: 6, + type: 'timeseries', + title: 'Panel in collapsed row', + gridPos: { x: 0, y: 26, w: 16, h: 8 }, + targets: [ + { + refId: 'A', + datasource: 'datasource1', + expr: 'test-query', + hide: false, + }, + ], + datasource: { + type: 'prometheus', + uid: 'datasource1', + }, + fieldConfig: { defaults: {}, overrides: [] }, + options: {}, + transparent: false, + links: [], + transformations: [], + }, + ], + collapsed: true, + }, + { + id: 7, + type: 'row', + title: 'collapsed row with no panel property', + gridPos: { x: 0, y: 26, w: 12, h: 1 }, + collapsed: true, + }, + { + id: 8, + type: 'row', + title: 'empty row', + gridPos: { x: 0, y: 27, w: 12, h: 1 }, + collapsed: false, + }, + ], + }; + + const dto: DashboardWithAccessInfo<DashboardDataDTO> = { + spec: dashboardV1, + access: { + slug: 'dashboard-slug', + url: '/d/dashboard-slug', + canAdmin: true, + canDelete: true, + canEdit: true, + canSave: true, + canShare: true, + canStar: true, + annotationsPermissions: { + dashboard: { canAdd: true, canEdit: true, canDelete: true }, + organization: { canAdd: true, canEdit: true, canDelete: true }, + }, + }, + apiVersion: 'v1', + kind: 'DashboardWithAccessInfo', + metadata: { + name: 'dashboard-uid', + resourceVersion: '1', + creationTimestamp: '2023-01-01T00:00:00Z', + annotations: { + [AnnoKeyCreatedBy]: 'user1', + [AnnoKeyUpdatedBy]: 'user2', + [AnnoKeyUpdatedTimestamp]: '2023-01-02T00:00:00Z', + [AnnoKeyFolder]: 'folder1', + [AnnoKeySlug]: 'dashboard-slug', + }, + labels: { + [DeprecatedInternalId]: '123', + }, + }, + }; + + const transformed = ResponseTransformers.ensureV2Response(dto); + + const spec = transformed.spec; + + // Panel + expect(spec.layout.kind).toBe('RowsLayout'); + const layout = spec.layout as RowsLayoutKind; + expect(layout.spec.rows).toHaveLength(5); + + const row0grid = layout.spec.rows[0].spec.layout as GridLayoutKind; + expect(row0grid.kind).toBe('GridLayout'); + expect(row0grid.spec.items).toHaveLength(2); + expect(row0grid.spec.items[0].spec.element.name).toBe('panel-1'); + expect(row0grid.spec.items[0].spec.y).toBe(0); + expect(row0grid.spec.items[1].spec.element.name).toBe('panel-2'); + expect(row0grid.spec.items[1].spec.y).toBe(8); + + const row1 = layout.spec.rows[1] as RowsLayoutRowKind; + expect(row1.kind).toBe('RowsLayoutRow'); + expect(row1.spec.repeat?.value).toBe('var1'); + expect(row1.spec.repeat?.mode).toBe('variable'); + + const row1grid = layout.spec.rows[1].spec.layout as GridLayoutKind; + expect(row1grid.kind).toBe('GridLayout'); + expect(row1grid.spec.items).toHaveLength(1); + expect(row1grid.spec.items[0].spec.element.name).toBe('panel-4'); + + const row2grid = layout.spec.rows[2].spec.layout as GridLayoutKind; + expect(row2grid.kind).toBe('GridLayout'); + expect(row2grid.spec.items).toHaveLength(1); + expect(row2grid.spec.items[0].spec.element.name).toBe('panel-6'); + + const row3 = layout.spec.rows[3] as RowsLayoutRowKind; + expect(row3.kind).toBe('RowsLayoutRow'); + expect(row3.spec.collapse).toBe(true); + expect(row3.spec.layout.kind).toBe('GridLayout'); + const row3grid = row3.spec.layout as GridLayoutKind; + expect(row3grid.kind).toBe('GridLayout'); + expect(row3grid.spec.items).toHaveLength(0); + + const row4 = layout.spec.rows[4] as RowsLayoutRowKind; + expect(row4.kind).toBe('RowsLayoutRow'); + expect(row4.spec.collapse).toBe(false); + expect(row4.spec.layout.kind).toBe('GridLayout'); + const row4grid = row4.spec.layout as GridLayoutKind; + expect(row4grid.kind).toBe('GridLayout'); + expect(row4grid.spec.items).toHaveLength(0); + }); + }); + describe('v2 -> v1 transformation', () => { it('should return the same object if it is already a DashboardDTO', () => { const dashboard: DashboardDTO = { @@ -804,9 +940,6 @@ describe('ResponseTransformers', () => { uid: 'uid-for-library-panel', name: 'Library Panel', }); - expect(dashboard.panels![2].type).toBe('row'); - expect(dashboard.panels![2].id).toBe(4); // Row id should be assigned to unique number following the highest id of panels. - expect(dashboard.panels![3].type).toBe('timeseries'); }); describe('getPanelQueries', () => { diff --git a/public/app/features/dashboard/api/ResponseTransformers.ts b/public/app/features/dashboard/api/ResponseTransformers.ts index 0d358d1a890..70baed5dce7 100644 --- a/public/app/features/dashboard/api/ResponseTransformers.ts +++ b/public/app/features/dashboard/api/ResponseTransformers.ts @@ -37,8 +37,9 @@ import { GroupByVariableKind, LibraryPanelKind, PanelKind, - GridLayoutRowKind, GridLayoutItemKind, + RowsLayoutRowKind, + GridLayoutKind, } from '@grafana/schema/dist/esm/schema/dashboard/v2alpha1/types.spec.gen'; import { DashboardLink, DataTransformerConfig } from '@grafana/schema/src/raw/dashboard/x/dashboard_types.gen'; import { isWeekStart, WeekStart } from '@grafana/ui'; @@ -259,22 +260,49 @@ function getElementsFromPanels( return [elements, layout]; } - let currentRow: GridLayoutRowKind | null = null; + if (panels.some(isRowPanel)) { + return convertToRowsLayout(panels); + } // iterate over panels + for (const p of panels) { + const [element, elementName] = buildElement(p); + + elements[elementName] = element; + + layout.spec.items.push(buildGridItemKind(p, elementName)); + } + + return [elements, layout]; +} + +function convertToRowsLayout( + panels: Array<Panel | RowPanel> +): [DashboardV2Spec['elements'], DashboardV2Spec['layout']] { + let currentRow: RowsLayoutRowKind | null = null; + let legacyRowY = 0; + const elements: DashboardV2Spec['elements'] = {}; + const layout: DashboardV2Spec['layout'] = { + kind: 'RowsLayout', + spec: { + rows: [], + }, + }; + for (const p of panels) { if (isRowPanel(p)) { + legacyRowY = p.gridPos!.y; if (currentRow) { // Flush current row to layout before we create a new one - layout.spec.items.push(currentRow); + layout.spec.rows.push(currentRow); } + // If the row is collapsed it will have panels const rowElements = []; - for (const panel of p.panels || []) { const [element, name] = buildElement(panel); elements[name] = element; - rowElements.push(buildGridItemKind(panel, name, yOffsetInRows(panel, p.gridPos!.y))); + rowElements.push(buildGridItemKind(panel, name, yOffsetInRows(panel, legacyRowY))); } currentRow = buildRowKind(p, rowElements); @@ -285,18 +313,41 @@ function getElementsFromPanels( if (currentRow) { // Collect panels to current layout row - currentRow.spec.elements.push(buildGridItemKind(p, elementName, yOffsetInRows(p, currentRow.spec.y))); + if (currentRow.spec.layout.kind === 'GridLayout') { + currentRow.spec.layout.spec.items.push(buildGridItemKind(p, elementName, yOffsetInRows(p, legacyRowY))); + } else { + throw new Error('RowsLayoutRow from legacy row must have a GridLayout'); + } } else { - layout.spec.items.push(buildGridItemKind(p, elementName)); + // This is the first row. In V1 these items could live outside of a row. In V2 they will be in a row with header hidden so that it will look similar to V1. + const grid: GridLayoutKind = { + kind: 'GridLayout', + spec: { + items: [buildGridItemKind(p, elementName)], + }, + }; + + // Since this row does not exist in V1, we simulate it being outside of the grid above the first panel + // The Y position does not matter for the rows layout, but it's used to calculate the position of the panels in the grid layout in the row. + legacyRowY = -1; + + currentRow = { + kind: 'RowsLayoutRow', + spec: { + collapse: false, + title: '', + hideHeader: true, + layout: grid, + }, + }; } } } if (currentRow) { // Flush last row to layout - layout.spec.items.push(currentRow); + layout.spec.rows.push(currentRow); } - return [elements, layout]; } @@ -311,15 +362,19 @@ function getWeekStart(weekStart?: string, defaultWeekStart?: WeekStart): WeekSta return weekStart; } -function buildRowKind(p: RowPanel, elements: GridLayoutItemKind[]): GridLayoutRowKind { +function buildRowKind(p: RowPanel, elements: GridLayoutItemKind[]): RowsLayoutRowKind { return { - kind: 'GridLayoutRow', + kind: 'RowsLayoutRow', spec: { - collapsed: p.collapsed, + collapse: p.collapsed, title: p.title ?? '', repeat: p.repeat ? { value: p.repeat, mode: 'variable' } : undefined, - y: p.gridPos?.y ?? 0, - elements, + layout: { + kind: 'GridLayout', + spec: { + items: elements, + }, + }, }, }; } @@ -849,46 +904,11 @@ function getPanelsV1( } for (const item of layout.spec.items) { - if (item.kind === 'GridLayoutItem') { - const panel = panels[item.spec.element.name]; - const v1Panel = transformV2PanelToV1Panel(panel, item); - panelsV1.push(v1Panel); - if (v1Panel.id ?? 0 > maxPanelId) { - maxPanelId = v1Panel.id ?? 0; - } - } else if (item.kind === 'GridLayoutRow') { - const row: RowPanel = { - id: -1, // Temporarily set to -1, updated later to be unique - type: 'row', - title: item.spec.title, - collapsed: item.spec.collapsed, - repeat: item.spec.repeat ? item.spec.repeat.value : undefined, - gridPos: { - x: 0, - y: item.spec.y, - w: 24, - h: GRID_ROW_HEIGHT, - }, - panels: [], - }; - - const rowPanels = []; - for (const panel of item.spec.elements) { - const panelElement = panels[panel.spec.element.name]; - const v1Panel = transformV2PanelToV1Panel(panelElement, panel, item.spec.y + GRID_ROW_HEIGHT + panel.spec.y); - rowPanels.push(v1Panel); - if (v1Panel.id ?? 0 > maxPanelId) { - maxPanelId = v1Panel.id ?? 0; - } - } - if (item.spec.collapsed) { - // When a row is collapsed, panels inside it are stored in the panels property. - row.panels = rowPanels; - panelsV1.push(row); - } else { - panelsV1.push(row); - panelsV1.push(...rowPanels); - } + const panel = panels[item.spec.element.name]; + const v1Panel = transformV2PanelToV1Panel(panel, item); + panelsV1.push(v1Panel); + if (v1Panel.id ?? 0 > maxPanelId) { + maxPanelId = v1Panel.id ?? 0; } } diff --git a/public/app/features/dashboard/api/legacy.ts b/public/app/features/dashboard/api/legacy.ts index 64ae8975db0..13762b19868 100644 --- a/public/app/features/dashboard/api/legacy.ts +++ b/public/app/features/dashboard/api/legacy.ts @@ -1,4 +1,5 @@ import { AppEvents, UrlQueryMap } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { FetchError, getBackendSrv } from '@grafana/runtime'; import { Dashboard } from '@grafana/schema'; import appEvents from 'app/core/app_events'; @@ -38,7 +39,9 @@ export class LegacyDashboardAPI implements DashboardAPI<DashboardDTO, Dashboard> const fetchError: FetchError = { status: 404, config: { url: `/api/dashboards/uid/${uid}` }, - data: { message: 'Dashboard not found' }, + data: { + message: t('dashboard.legacy-dashboard-api.fetch-error.message.dashboard-not-found', 'Dashboard not found'), + }, }; throw fetchError; } diff --git a/public/app/features/dashboard/api/v1.ts b/public/app/features/dashboard/api/v1.ts index 708f52e2061..cd08d643326 100644 --- a/public/app/features/dashboard/api/v1.ts +++ b/public/app/features/dashboard/api/v1.ts @@ -1,4 +1,5 @@ import { locationUtil } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { Dashboard } from '@grafana/schema'; import { backendSrv } from 'app/core/services/backend_srv'; import { getMessageFromError, getStatusFromError } from 'app/core/utils/errors'; @@ -103,7 +104,7 @@ export class K8sDashboardAPI implements DashboardAPI<DashboardDTO, Dashboard> { return this.client.delete(uid, showSuccessAlert).then((v) => ({ id: 0, message: v.message, - title: 'deleted', + title: t('dashboard.k8s-dashboard-api.title.deleted', 'deleted'), })); } diff --git a/public/app/features/dashboard/api/v2.ts b/public/app/features/dashboard/api/v2.ts index 577eb4d2501..1703a90166a 100644 --- a/public/app/features/dashboard/api/v2.ts +++ b/public/app/features/dashboard/api/v2.ts @@ -1,4 +1,5 @@ import { locationUtil } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { Spec as DashboardV2Spec } from '@grafana/schema/dist/esm/schema/dashboard/v2alpha1/types.spec.gen'; import { backendSrv } from 'app/core/services/backend_srv'; import { getMessageFromError, getStatusFromError } from 'app/core/utils/errors'; @@ -91,7 +92,7 @@ export class K8sDashboardV2API return this.client.delete(uid, showSuccessAlert).then((v) => ({ id: 0, message: v.message, - title: 'deleted', + title: t('dashboard.k8s-dashboard-v2api.title.deleted', 'deleted'), })); } diff --git a/public/app/features/dashboard/components/DashNav/DashNav.tsx b/public/app/features/dashboard/components/DashNav/DashNav.tsx index ea711a54d4f..cff596db593 100644 --- a/public/app/features/dashboard/components/DashNav/DashNav.tsx +++ b/public/app/features/dashboard/components/DashNav/DashNav.tsx @@ -103,7 +103,10 @@ export const DashNav = memo<Props>((props) => { new ShowModalReactEvent({ component: ConfirmModal, props: { - title: 'Proceed to external site?', + title: t( + 'dashboard.dash-nav.on-open-snapshot-original.title.proceed-to-external-site', + 'Proceed to external site?' + ), modalClass: modalStyles, body: ( <> diff --git a/public/app/features/dashboard/components/DashboardRow/DashboardRow.tsx b/public/app/features/dashboard/components/DashboardRow/DashboardRow.tsx index baa81336987..c0659026873 100644 --- a/public/app/features/dashboard/components/DashboardRow/DashboardRow.tsx +++ b/public/app/features/dashboard/components/DashboardRow/DashboardRow.tsx @@ -85,7 +85,7 @@ export class UnthemedDashboardRow extends Component<DashboardRowProps> { onDelete = () => { appEvents.publish( new ShowConfirmModalEvent({ - title: 'Delete row', + title: t('dashboard.unthemed-dashboard-row.title.delete-row', 'Delete row'), text: 'Are you sure you want to remove this row and all its panels?', altActionText: 'Delete row only', icon: 'trash-alt', diff --git a/public/app/features/dashboard/components/DashboardSettings/GeneralSettings.tsx b/public/app/features/dashboard/components/DashboardSettings/GeneralSettings.tsx index a843d38861b..fbbbfb768de 100644 --- a/public/app/features/dashboard/components/DashboardSettings/GeneralSettings.tsx +++ b/public/app/features/dashboard/components/DashboardSettings/GeneralSettings.tsx @@ -116,8 +116,8 @@ export function GeneralSettingsUnconnected({ }; const editableOptions = [ - { label: 'Editable', value: true }, - { label: 'Read-only', value: false }, + { label: t('dashboard.general-settings-unconnected.editable-options.label.editable', 'Editable'), value: true }, + { label: t('dashboard.general-settings-unconnected.editable-options.label.readonly', 'Read-only'), value: false }, ]; return ( diff --git a/public/app/features/dashboard/components/DashboardSettings/TimePickerSettings.tsx b/public/app/features/dashboard/components/DashboardSettings/TimePickerSettings.tsx index c0c417e1525..b5d20ed7a2a 100644 --- a/public/app/features/dashboard/components/DashboardSettings/TimePickerSettings.tsx +++ b/public/app/features/dashboard/components/DashboardSettings/TimePickerSettings.tsx @@ -106,7 +106,7 @@ export class TimePickerSettings extends PureComponent<Props, State> { <Input id="now-delay-input" invalid={!this.state.isNowDelayValid} - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="0m" onChange={this.onNowDelayChange} defaultValue={this.props.nowDelay} diff --git a/public/app/features/dashboard/components/DeleteDashboard/DeleteDashboardModal.tsx b/public/app/features/dashboard/components/DeleteDashboard/DeleteDashboardModal.tsx index e06b3e818a7..25f3871524e 100644 --- a/public/app/features/dashboard/components/DeleteDashboard/DeleteDashboardModal.tsx +++ b/public/app/features/dashboard/components/DeleteDashboard/DeleteDashboardModal.tsx @@ -3,7 +3,7 @@ import { connect, ConnectedProps } from 'react-redux'; import useAsyncFn from 'react-use/lib/useAsyncFn'; import { Trans, useTranslate } from '@grafana/i18n'; -import { locationService, reportInteraction } from '@grafana/runtime'; +import { config, locationService, reportInteraction } from '@grafana/runtime'; import { Modal, Button, Text, Space, TextLink } from '@grafana/ui'; import { DashboardModel } from 'app/features/dashboard/state/DashboardModel'; import { cleanUpDashboardAndVariables } from 'app/features/dashboard/state/actions'; @@ -34,7 +34,7 @@ const DeleteDashboardModalUnconnected = ({ hideModal, cleanUpDashboardAndVariabl dashboard: 1, }, source: 'dashboard_settings', - restore_enabled: false, + restore_enabled: Boolean(config.featureToggles.restoreDashboards), }); await deleteItems({ selectedItems: { diff --git a/public/app/features/dashboard/components/HelpWizard/HelpWizard.tsx b/public/app/features/dashboard/components/HelpWizard/HelpWizard.tsx index 437ee27cdea..8e83a95230a 100644 --- a/public/app/features/dashboard/components/HelpWizard/HelpWizard.tsx +++ b/public/app/features/dashboard/components/HelpWizard/HelpWizard.tsx @@ -61,8 +61,8 @@ export function HelpWizard({ panel, plugin, onClose }: Props) { } const tabs = [ - { label: 'Snapshot', value: SnapshotTab.Support }, - { label: 'Data', value: SnapshotTab.Data }, + { label: t('dashboard.help-wizard.tabs.label.snapshot', 'Snapshot'), value: SnapshotTab.Support }, + { label: t('dashboard.help-wizard.tabs.label.data', 'Data'), value: SnapshotTab.Data }, ]; const hasSupportBundleAccess = diff --git a/public/app/features/dashboard/components/HelpWizard/SupportSnapshotService.ts b/public/app/features/dashboard/components/HelpWizard/SupportSnapshotService.ts index 52a11dd96a6..2e2ba184f03 100644 --- a/public/app/features/dashboard/components/HelpWizard/SupportSnapshotService.ts +++ b/public/app/features/dashboard/components/HelpWizard/SupportSnapshotService.ts @@ -1,6 +1,7 @@ import saveAs from 'file-saver'; import { dateTimeFormat, formattedValueToString, getValueFormat, SelectableValue } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { SceneObject } from '@grafana/scenes'; import { StateManagerBase } from 'app/core/services/StateManagerBase'; import { Randomize } from 'app/features/dashboard-scene/inspect/HelpWizard/randomizer'; @@ -57,13 +58,16 @@ export class SupportSnapshotService extends StateManagerBase<SupportSnapshotStat snapshotUpdate: 0, options: [ { - label: 'GitHub comment', + label: t('dashboard.support-snapshot-service.label.git-hub-comment', 'GitHub comment'), description: 'Copy and paste this message into a GitHub issue or comment', value: ShowMessage.GithubComment, }, { - label: 'Panel support snapshot', - description: 'Dashboard JSON used to help troubleshoot visualization issues', + label: t('dashboard.support-snapshot-service.label.panel-support-snapshot', 'Panel support snapshot'), + description: t( + 'dashboard.support-snapshot-service.description.dashboard-troubleshoot-visualization-issues', + 'Dashboard JSON used to help troubleshoot visualization issues' + ), value: ShowMessage.PanelSnapshot, }, ], @@ -107,7 +111,7 @@ export class SupportSnapshotService extends StateManagerBase<SupportSnapshotStat if (markdownText.length > maxLen) { this.setState({ error: { - title: 'Copy to clipboard failed', + title: t('dashboard.support-snapshot-service.title.copy-to-clipboard-failed', 'Copy to clipboard failed'), message: 'Snapshot is too large, consider download and attaching a file instead', }, }); diff --git a/public/app/features/dashboard/components/HelpWizard/utils.ts b/public/app/features/dashboard/components/HelpWizard/utils.ts index d33520b3047..d909e79a382 100644 --- a/public/app/features/dashboard/components/HelpWizard/utils.ts +++ b/public/app/features/dashboard/components/HelpWizard/utils.ts @@ -12,6 +12,7 @@ import { dataFrameToJSON, DataTopic, } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { config } from '@grafana/runtime'; import { PanelModel } from 'app/features/dashboard/state/PanelModel'; import { Randomize, randomizeData } from 'app/features/dashboard-scene/inspect/HelpWizard/randomizer'; @@ -139,7 +140,7 @@ export async function getDebugDashboard(panel: PanelModel, rand: Randomize, time y: 20, }, type: 'table', - title: 'Annotations', + title: t('dashboard.get-debug-dashboard.title.annotations', 'Annotations'), datasource: { type: 'datasource', uid: '-- Dashboard --', diff --git a/public/app/features/dashboard/components/Inspector/InspectContent.tsx b/public/app/features/dashboard/components/Inspector/InspectContent.tsx index d995bc61e89..0dc39576a19 100644 --- a/public/app/features/dashboard/components/Inspector/InspectContent.tsx +++ b/public/app/features/dashboard/components/Inspector/InspectContent.tsx @@ -12,6 +12,7 @@ import { DataQueryError, } from '@grafana/data'; import { Trans, useTranslate } from '@grafana/i18n'; +import { t } from '@grafana/i18n/internal'; import { getTemplateSrv } from '@grafana/runtime'; import { Drawer, Tab, TabsBar } from '@grafana/ui'; import { InspectDataTab } from 'app/features/inspector/InspectDataTab'; @@ -129,7 +130,7 @@ function getErrors(data: PanelData | undefined): DataQueryError[] { if (!errors.length && data?.state === LoadingState.Error) { return [ { - message: 'Error loading data', + message: t('dashboard.get-errors.message.error-loading-data', 'Error loading data'), }, ]; } diff --git a/public/app/features/dashboard/components/PanelEditor/VisualizationSelectPane.tsx b/public/app/features/dashboard/components/PanelEditor/VisualizationSelectPane.tsx index 7f2508741e2..c11c56558b3 100644 --- a/public/app/features/dashboard/components/PanelEditor/VisualizationSelectPane.tsx +++ b/public/app/features/dashboard/components/PanelEditor/VisualizationSelectPane.tsx @@ -60,12 +60,21 @@ export const VisualizationSelectPane = ({ panel, data }: Props) => { } const radioOptions: Array<SelectableValue<VisualizationSelectPaneTab>> = [ - { label: 'Visualizations', value: VisualizationSelectPaneTab.Visualizations }, - { label: 'Suggestions', value: VisualizationSelectPaneTab.Suggestions }, { - label: 'Library panels', + label: t('dashboard.visualization-select-pane.radio-options.label.visualizations', 'Visualizations'), + value: VisualizationSelectPaneTab.Visualizations, + }, + { + label: t('dashboard.visualization-select-pane.radio-options.label.suggestions', 'Suggestions'), + value: VisualizationSelectPaneTab.Suggestions, + }, + { + label: t('dashboard.visualization-select-pane.radio-options.label.library-panels', 'Library panels'), value: VisualizationSelectPaneTab.LibraryPanels, - description: 'Reusable panels you can share between multiple dashboards.', + description: t( + 'dashboard.visualization-select-pane.radio-options.description.reusable-panels-share-between-multiple-dashboards', + 'Reusable panels you can share between multiple dashboards.' + ), }, ]; diff --git a/public/app/features/dashboard/components/PanelEditor/getFieldOverrideElements.tsx b/public/app/features/dashboard/components/PanelEditor/getFieldOverrideElements.tsx index 8989683e00b..57c93a9e79e 100644 --- a/public/app/features/dashboard/components/PanelEditor/getFieldOverrideElements.tsx +++ b/public/app/features/dashboard/components/PanelEditor/getFieldOverrideElements.tsx @@ -236,7 +236,7 @@ export function getFieldOverrideCategories( categories.push( new OptionsPaneCategoryDescriptor({ - title: 'add button', + title: t('dashboard.get-field-override-categories.title.add-button', 'add button'), id: 'add button', customRender: function renderAddButton() { return ( diff --git a/public/app/features/dashboard/components/PanelEditor/getLibraryPanelOptions.tsx b/public/app/features/dashboard/components/PanelEditor/getLibraryPanelOptions.tsx index b2fcd9faa07..61a2b463cbe 100644 --- a/public/app/features/dashboard/components/PanelEditor/getLibraryPanelOptions.tsx +++ b/public/app/features/dashboard/components/PanelEditor/getLibraryPanelOptions.tsx @@ -1,3 +1,4 @@ +import { t } from '@grafana/i18n/internal'; import { Input } from '@grafana/ui'; import { LibraryPanelInformation } from 'app/features/library-panels/components/LibraryPanelInfo/LibraryPanelInfo'; @@ -10,7 +11,10 @@ import { OptionPaneRenderProps } from './types'; export function getLibraryPanelOptionsCategory(props: OptionPaneRenderProps): OptionsPaneCategoryDescriptor { const { panel, onPanelConfigChange, dashboard } = props; const descriptor = new OptionsPaneCategoryDescriptor({ - title: 'Library panel options', + title: t( + 'dashboard.get-library-panel-options-category.descriptor.title.library-panel-options', + 'Library panel options' + ), id: 'Library panel options', isOpenDefault: true, }); @@ -19,7 +23,7 @@ export function getLibraryPanelOptionsCategory(props: OptionPaneRenderProps): Op descriptor .addItem( new OptionsPaneItemDescriptor({ - title: 'Name', + title: t('dashboard.get-library-panel-options-category.title.name', 'Name'), value: panel.libraryPanel.name, popularRank: 1, render: function renderName() { @@ -37,7 +41,7 @@ export function getLibraryPanelOptionsCategory(props: OptionPaneRenderProps): Op ) .addItem( new OptionsPaneItemDescriptor({ - title: 'Information', + title: t('dashboard.get-library-panel-options-category.title.information', 'Information'), render: function renderLibraryPanelInformation() { return <LibraryPanelInformation panel={panel} formatDate={dashboard.formatDate} />; }, diff --git a/public/app/features/dashboard/components/PanelEditor/getPanelFrameOptions.tsx b/public/app/features/dashboard/components/PanelEditor/getPanelFrameOptions.tsx index 810ab710f6f..a481cc0e016 100644 --- a/public/app/features/dashboard/components/PanelEditor/getPanelFrameOptions.tsx +++ b/public/app/features/dashboard/components/PanelEditor/getPanelFrameOptions.tsx @@ -1,4 +1,5 @@ import { selectors } from '@grafana/e2e-selectors'; +import { t } from '@grafana/i18n/internal'; import { config } from '@grafana/runtime'; import { DataLinksInlineEditor, Input, RadioButtonGroup, Select, Switch, TextArea } from '@grafana/ui'; import { getPanelLinksVariableSuggestions } from 'app/features/panel/panellinks/link_srv'; @@ -14,7 +15,7 @@ import { OptionPaneRenderProps } from './types'; export function getPanelFrameCategory(props: OptionPaneRenderProps): OptionsPaneCategoryDescriptor { const { dashboard, panel, onPanelConfigChange } = props; const descriptor = new OptionsPaneCategoryDescriptor({ - title: 'Panel options', + title: t('dashboard.get-panel-frame-category.descriptor.title.panel-options', 'Panel options'), id: 'Panel options', isOpenDefault: true, }); @@ -38,7 +39,7 @@ export function getPanelFrameCategory(props: OptionPaneRenderProps): OptionsPane return descriptor .addItem( new OptionsPaneItemDescriptor({ - title: 'Title', + title: t('dashboard.get-panel-frame-category.title.title', 'Title'), value: panel.title, popularRank: 1, render: function renderTitle() { @@ -62,7 +63,7 @@ export function getPanelFrameCategory(props: OptionPaneRenderProps): OptionsPane ) .addItem( new OptionsPaneItemDescriptor({ - title: 'Description', + title: t('dashboard.get-panel-frame-category.title.description', 'Description'), description: panel.description, value: panel.description, render: function renderDescription() { @@ -82,7 +83,7 @@ export function getPanelFrameCategory(props: OptionPaneRenderProps): OptionsPane ) .addItem( new OptionsPaneItemDescriptor({ - title: 'Transparent background', + title: t('dashboard.get-panel-frame-category.title.transparent-background', 'Transparent background'), render: function renderTransparent() { return ( <Switch @@ -97,13 +98,13 @@ export function getPanelFrameCategory(props: OptionPaneRenderProps): OptionsPane ) .addCategory( new OptionsPaneCategoryDescriptor({ - title: 'Panel links', + title: t('dashboard.get-panel-frame-category.title.panel-links', 'Panel links'), id: 'Panel links', isOpenDefault: false, itemsCount: panel.links?.length, }).addItem( new OptionsPaneItemDescriptor({ - title: 'Panel links', + title: t('dashboard.get-panel-frame-category.title.panel-links', 'Panel links'), render: function renderLinks() { return ( <DataLinksInlineEditor @@ -119,13 +120,13 @@ export function getPanelFrameCategory(props: OptionPaneRenderProps): OptionsPane ) .addCategory( new OptionsPaneCategoryDescriptor({ - title: 'Repeat options', + title: t('dashboard.get-panel-frame-category.title.repeat-options', 'Repeat options'), id: 'Repeat options', isOpenDefault: false, }) .addItem( new OptionsPaneItemDescriptor({ - title: 'Repeat by variable', + title: t('dashboard.get-panel-frame-category.title.repeat-by-variable', 'Repeat by variable'), description: 'Repeat this panel for each value in the selected variable. This is not visible while in edit mode. You need to go back to dashboard and then update the variable or reload the dashboard.', render: function renderRepeatOptions() { @@ -143,12 +144,18 @@ export function getPanelFrameCategory(props: OptionPaneRenderProps): OptionsPane ) .addItem( new OptionsPaneItemDescriptor({ - title: 'Repeat direction', + title: t('dashboard.get-panel-frame-category.title.repeat-direction', 'Repeat direction'), showIf: () => !!panel.repeat, render: function renderRepeatOptions() { const directionOptions = [ - { label: 'Horizontal', value: 'h' }, - { label: 'Vertical', value: 'v' }, + { + label: t('dashboard.get-panel-frame-category.direction-options.label.horizontal', 'Horizontal'), + value: 'h', + }, + { + label: t('dashboard.get-panel-frame-category.direction-options.label.vertical', 'Vertical'), + value: 'v', + }, ]; return ( @@ -163,7 +170,7 @@ export function getPanelFrameCategory(props: OptionPaneRenderProps): OptionsPane ) .addItem( new OptionsPaneItemDescriptor({ - title: 'Max per row', + title: t('dashboard.get-panel-frame-category.title.max-per-row', 'Max per row'), showIf: () => Boolean(panel.repeat && panel.repeatDirection === 'h'), render: function renderOption() { const maxPerRowOptions = [2, 3, 4, 6, 8, 12].map((value) => ({ label: value.toString(), value })); diff --git a/public/app/features/dashboard/components/PanelEditor/getVisualizationOptions.tsx b/public/app/features/dashboard/components/PanelEditor/getVisualizationOptions.tsx index 4b003d91c84..7ac7e231088 100644 --- a/public/app/features/dashboard/components/PanelEditor/getVisualizationOptions.tsx +++ b/public/app/features/dashboard/components/PanelEditor/getVisualizationOptions.tsx @@ -10,6 +10,7 @@ import { PanelOptionsEditorBuilder, } from '@grafana/data'; import { NestedValueAccess, isNestedPanelOptions, PanelOptionsSupplier } from '@grafana/data/internal'; +import { t } from '@grafana/i18n/internal'; import { VizPanel } from '@grafana/scenes'; import { Input } from '@grafana/ui'; import { LibraryVizPanelInfo } from 'app/features/dashboard-scene/panel-edit/LibraryVizPanelInfo'; @@ -152,7 +153,10 @@ export function getVisualizationOptions(props: OptionPaneRenderProps): OptionsPa export function getLibraryVizPanelOptionsCategory(libraryPanel: LibraryPanelBehavior): OptionsPaneCategoryDescriptor { const descriptor = new OptionsPaneCategoryDescriptor({ - title: 'Library panel options', + title: t( + 'dashboard.get-library-viz-panel-options-category.descriptor.title.library-panel-options', + 'Library panel options' + ), id: 'Library panel options', isOpenDefault: true, }); @@ -160,7 +164,7 @@ export function getLibraryVizPanelOptionsCategory(libraryPanel: LibraryPanelBeha descriptor .addItem( new OptionsPaneItemDescriptor({ - title: 'Name', + title: t('dashboard.get-library-viz-panel-options-category.title.name', 'Name'), value: libraryPanel, popularRank: 1, render: function renderName() { @@ -177,7 +181,7 @@ export function getLibraryVizPanelOptionsCategory(libraryPanel: LibraryPanelBeha ) .addItem( new OptionsPaneItemDescriptor({ - title: 'Information', + title: t('dashboard.get-library-viz-panel-options-category.title.information', 'Information'), render: function renderLibraryPanelInformation() { return <LibraryVizPanelInfo libraryPanel={libraryPanel} />; }, diff --git a/public/app/features/dashboard/components/PanelEditor/state/selectors.ts b/public/app/features/dashboard/components/PanelEditor/state/selectors.ts index 7a7da8ee004..0042e8249f5 100644 --- a/public/app/features/dashboard/components/PanelEditor/state/selectors.ts +++ b/public/app/features/dashboard/components/PanelEditor/state/selectors.ts @@ -1,6 +1,7 @@ import memoizeOne from 'memoize-one'; import { PanelPlugin } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { getConfig } from 'app/core/config'; import { contextSrv } from 'app/core/services/context_srv'; import { getRulesPermissions } from 'app/features/alerting/unified/utils/access-control'; @@ -26,14 +27,14 @@ export const getPanelEditorTabs = memoizeOne((tab?: string, plugin?: PanelPlugin tabs.push({ id: PanelEditorTabId.Query, - text: 'Query', + text: t('dashboard.get-panel-editor-tabs.text.query', 'Query'), icon: 'database', active: false, }); tabs.push({ id: PanelEditorTabId.Transform, - text: 'Transform data', + text: t('dashboard.get-panel-editor-tabs.text.transform-data', 'Transform data'), icon: 'process', active: false, }); @@ -42,7 +43,7 @@ export const getPanelEditorTabs = memoizeOne((tab?: string, plugin?: PanelPlugin if (shouldShowAlertingTab(plugin)) { tabs.push({ id: PanelEditorTabId.Alert, - text: 'Alert', + text: t('dashboard.get-panel-editor-tabs.text.alert', 'Alert'), icon: 'bell', active: false, }); diff --git a/public/app/features/dashboard/components/RepeatRowSelect/RepeatRowSelect.tsx b/public/app/features/dashboard/components/RepeatRowSelect/RepeatRowSelect.tsx index 67e9fcd45b4..1c7efb14f56 100644 --- a/public/app/features/dashboard/components/RepeatRowSelect/RepeatRowSelect.tsx +++ b/public/app/features/dashboard/components/RepeatRowSelect/RepeatRowSelect.tsx @@ -1,6 +1,7 @@ import { useCallback, useMemo } from 'react'; import { SelectableValue } from '@grafana/data'; +import { useTranslate } from '@grafana/i18n'; import { SceneObject, sceneGraph } from '@grafana/scenes'; import { Select } from '@grafana/ui'; import { useSelector } from 'app/types'; @@ -14,6 +15,7 @@ export interface Props { } export const RepeatRowSelect = ({ repeat, onChange, id }: Props) => { + const { t } = useTranslate(); const variables = useSelector((state) => { return getVariablesByKey(getLastKey(state), state); }); @@ -25,18 +27,21 @@ export const RepeatRowSelect = ({ repeat, onChange, id }: Props) => { if (options.length === 0) { options.unshift({ - label: 'No template variables found', + label: t( + 'dashboard.repeat-row-select.variable-options.label.no-template-variables-found', + 'No template variables found' + ), value: null, }); } options.unshift({ - label: 'Disable repeating', + label: t('dashboard.repeat-row-select.variable-options.label.disable-repeating', 'Disable repeating'), value: null, }); return options; - }, [variables]); + }, [variables, t]); const onSelectChange = useCallback((option: SelectableValue<string | null>) => onChange(option.value!), [onChange]); @@ -51,6 +56,7 @@ interface Props2 { } export const RepeatRowSelect2 = ({ sceneContext, repeat, id, onChange }: Props2) => { + const { t } = useTranslate(); const sceneVars = useMemo(() => sceneGraph.getVariables(sceneContext.getRoot()), [sceneContext]); const variables = sceneVars.useState().variables; @@ -62,18 +68,21 @@ export const RepeatRowSelect2 = ({ sceneContext, repeat, id, onChange }: Props2) if (options.length === 0) { options.unshift({ - label: 'No template variables found', + label: t( + 'dashboard.repeat-row-select2.variable-options.label.no-template-variables-found', + 'No template variables found' + ), value: null, }); } options.unshift({ - label: 'Disable repeating', + label: t('dashboard.repeat-row-select2.variable-options.label.disable-repeating', 'Disable repeating'), value: null, }); return options; - }, [variables]); + }, [variables, t]); const onSelectChange = useCallback((option: SelectableValue<string | null>) => onChange(option.value!), [onChange]); diff --git a/public/app/features/dashboard/components/SaveDashboard/SaveDashboardErrorProxy.tsx b/public/app/features/dashboard/components/SaveDashboard/SaveDashboardErrorProxy.tsx index 827d127389b..5f7675b47da 100644 --- a/public/app/features/dashboard/components/SaveDashboard/SaveDashboardErrorProxy.tsx +++ b/public/app/features/dashboard/components/SaveDashboard/SaveDashboardErrorProxy.tsx @@ -3,7 +3,7 @@ import * as React from 'react'; import { GrafanaTheme2 } from '@grafana/data'; import { Trans, useTranslate } from '@grafana/i18n'; -import { FetchError } from '@grafana/runtime'; +import { config, FetchError } from '@grafana/runtime'; import { Dashboard } from '@grafana/schema'; import { Button, ConfirmModal, Modal, useStyles2 } from '@grafana/ui'; @@ -32,7 +32,7 @@ export const SaveDashboardErrorProxy = ({ }: SaveDashboardErrorProxyProps) => { const { onDashboardSave } = useDashboardSave(); const { t } = useTranslate(); - const isRestoreDashboardsEnabled = false; + const isRestoreDashboardsEnabled = config.featureToggles.restoreDashboards; return ( <> diff --git a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ConfigPublicDashboard/EmailSharingConfiguration.tsx b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ConfigPublicDashboard/EmailSharingConfiguration.tsx index 6c5e84fda11..b7221c0cf06 100644 --- a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ConfigPublicDashboard/EmailSharingConfiguration.tsx +++ b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/ConfigPublicDashboard/EmailSharingConfiguration.tsx @@ -190,7 +190,7 @@ export const EmailSharingConfiguration = ({ dashboard }: { dashboard: DashboardM <div className={styles.emailContainer}> <Input className={styles.emailInput} - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="me@example.com" autoCapitalize="none" {...register('email', { diff --git a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SupportedPubdashDatasources.ts b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SupportedPubdashDatasources.ts index 177013a6b0d..28f759c94f6 100644 --- a/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SupportedPubdashDatasources.ts +++ b/public/app/features/dashboard/components/ShareModal/SharePublicDashboard/SupportedPubdashDatasources.ts @@ -5,9 +5,11 @@ export const supportedDatasources = new Set<string>([ 'aggregations-io-datasource', 'apache-iotdb-datasource', 'aquaqanalytics-kdbbackend-datasource', + 'arabian9ts-mux-datasource', 'axiomhq-axiom-datasource', 'cloudwatch', 'cnos-cnosdb-datasource', + 'criblcloud-search-datasource', 'datasource', 'dlopes7-appdynamics-datasource', 'dvelop-odata-datasource', @@ -16,13 +18,18 @@ export const supportedDatasources = new Set<string>([ 'fiskaly-surrealdb-datasource', 'frser-sqlite-datasource', 'grafadruid-druid-datasource', + 'grafana-adobeanalytics-datasource', + 'grafana-amazonprometheus-datasource', 'grafana-athena-datasource', + 'grafana-aurora-datasource', 'grafana-azure-data-explorer-datasource', 'grafana-azure-monitor-datasource', 'grafana-azurecosmosdb-datasource', 'grafana-bigquery-datasource', 'grafana-catchpoint-datasource', 'grafana-clickhouse-datasource', + 'grafana-cloudflare-datasource', + 'grafana-cockroachdb-datasource', 'grafana-databricks-datasource', 'grafana-datadog-datasource', 'grafana-dynamodb-datasource', @@ -40,7 +47,6 @@ export const supportedDatasources = new Set<string>([ 'grafana-odbc-datasource', 'grafana-opensearch-datasource', 'grafana-oracle-datasource', - 'grafana-orbit-datasource', 'grafana-pagerduty-datasource', 'grafana-postgresql-datasource', 'grafana-redshift-datasource', @@ -55,19 +61,21 @@ export const supportedDatasources = new Set<string>([ 'grafana-surrealdb-datasource', 'grafana-testdata-datasource', 'grafana-timestream-datasource', + 'grafana-vercel-datasource', 'grafana-wavefront-datasource', 'grafana-x-ray-datasource', + 'grafana-yugabyte-datasource', + 'grafana-zendesk-datasource', 'graphite', + 'gridprotectionalliance-osisoftpi-datasource', 'hadesarchitect-cassandra-datasource', - 'highlightinc-highlight-datasource', 'ibm-aql-datasource', - 'ibm-kql-datasource', - 'influxdata-flightsql-datasource', 'influxdb', 'innius-grpc-datasource', 'kniepdennis-neo4j-datasource', 'loki', 'manassehzhou-maxcompute-datasource', + 'maormil-rabbitmq-datasource', 'marcusolsson-csv-datasource', 'mssql', 'mysql', @@ -76,7 +84,6 @@ export const supportedDatasources = new Set<string>([ 'oci-metrics-datasource', 'opentsdb', 'parseable-parseable-datasource', - 'postgres', 'prometheus', 'questdb-questdb-datasource', 'quickwit-quickwit-datasource', @@ -84,10 +91,11 @@ export const supportedDatasources = new Set<string>([ 'retrodaredevil-wildgraphql-datasource', 'stackdriver', 'tdengine-datasource', - 'timeplus-proton-datasource', 'trino-datasource', 'vertamedia-clickhouse-datasource', 'vertica-grafana-datasource', + 'victoriametrics-logs-datasource', + 'victoriametrics-metrics-datasource', 'ydbtech-ydb-datasource', 'yesoreyeram-infinity-datasource', ]); diff --git a/public/app/features/dashboard/components/TransformationsEditor/TransformationOperationRow.tsx b/public/app/features/dashboard/components/TransformationsEditor/TransformationOperationRow.tsx index a1eb4a1fd4b..19753b7ddc6 100644 --- a/public/app/features/dashboard/components/TransformationsEditor/TransformationOperationRow.tsx +++ b/public/app/features/dashboard/components/TransformationsEditor/TransformationOperationRow.tsx @@ -217,7 +217,7 @@ export const TransformationOperationRow = ({ <QueryOperationRow id={id} index={index} - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings title={`${index + 1} - ${uiConfig.name}`} draggable actions={renderActions} diff --git a/public/app/features/dashboard/containers/DashboardPageError.tsx b/public/app/features/dashboard/containers/DashboardPageError.tsx index 1c25466ff68..b4e8f254f0a 100644 --- a/public/app/features/dashboard/containers/DashboardPageError.tsx +++ b/public/app/features/dashboard/containers/DashboardPageError.tsx @@ -12,7 +12,11 @@ export function DashboardPageError({ error, type }: { error: unknown; type?: str const entity = type === 'snapshot' ? 'Snapshot' : 'Dashboard'; return ( - <Page navId="dashboards/browse" layout={PageLayoutType.Canvas} pageNav={{ text: 'Not found' }}> + <Page + navId="dashboards/browse" + layout={PageLayoutType.Canvas} + pageNav={{ text: t('dashboard.dashboard-page-error.text.not-found', 'Not found') }} + > <Box paddingY={4} display="flex" direction="column" alignItems="center"> {status === 404 ? ( <EntityNotFound entity={entity} /> diff --git a/public/app/features/dashboard/services/DashboardSrv.ts b/public/app/features/dashboard/services/DashboardSrv.ts index 129d63666e2..98248dadd79 100644 --- a/public/app/features/dashboard/services/DashboardSrv.ts +++ b/public/app/features/dashboard/services/DashboardSrv.ts @@ -56,7 +56,7 @@ export class DashboardSrv { return getDashboardAPI().saveDashboard({ dashboard: parsedJson, folderUid: this.dashboard?.meta.folderUid || parsedJson.folderUid, - message: 'Edit Dashboard JSON', + message: t('dashboard.dashboard-srv.message.edit-dashboard-json', 'Edit Dashboard JSON'), k8s: this.dashboard?.meta.k8s, }); } diff --git a/public/app/features/dashboard/state/initDashboard.ts b/public/app/features/dashboard/state/initDashboard.ts index e1d70a3fcdf..9d26864f636 100644 --- a/public/app/features/dashboard/state/initDashboard.ts +++ b/public/app/features/dashboard/state/initDashboard.ts @@ -1,4 +1,5 @@ import { DataQuery, locationUtil, setWeekStart, DashboardLoadedEvent } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { config, isFetchError, locationService } from '@grafana/runtime'; import { notifyApp } from 'app/core/actions'; import appEvents from 'app/core/app_events'; @@ -137,7 +138,12 @@ async function fetchDashboard( return null; } - dispatch(dashboardInitFailed({ message: 'Failed to fetch dashboard', error: err })); + dispatch( + dashboardInitFailed({ + message: t('dashboard.fetch-dashboard.message.failed-to-fetch-dashboard', 'Failed to fetch dashboard'), + error: err, + }) + ); console.error(err); return null; } @@ -200,7 +206,12 @@ export function initDashboard(args: InitDashboardArgs): ThunkResult<void> { try { dashboard = new DashboardModel(dashDTO.dashboard, dashDTO.meta); } catch (err) { - dispatch(dashboardInitFailed({ message: 'Failed create dashboard model', error: err })); + dispatch( + dashboardInitFailed({ + message: t('dashboard.init-dashboard.message.failed-create-dashboard-model', 'Failed create dashboard model'), + error: err, + }) + ); console.error(err); return; } diff --git a/public/app/features/dashboard/state/reducers.ts b/public/app/features/dashboard/state/reducers.ts index 7e7823cb65d..8d8e48f3d2f 100644 --- a/public/app/features/dashboard/state/reducers.ts +++ b/public/app/features/dashboard/state/reducers.ts @@ -1,6 +1,7 @@ import { createSlice, PayloadAction } from '@reduxjs/toolkit'; import { PanelPlugin } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { defaultDashboard } from '@grafana/schema'; import { DashboardInitError, DashboardInitPhase, DashboardState } from 'app/types'; @@ -33,7 +34,10 @@ const dashboardSlice = createSlice({ state.initError = action.payload; state.getModel = () => { return new DashboardModel( - { ...defaultDashboard, title: 'Dashboard init failed' }, + { + ...defaultDashboard, + title: t('dashboard.dashboard-slice.title.dashboard-init-failed', 'Dashboard init failed'), + }, { canSave: false, canEdit: false } ); }; diff --git a/public/app/features/dashboard/utils/dashboard.ts b/public/app/features/dashboard/utils/dashboard.ts index fcc5fe701d2..b957204405a 100644 --- a/public/app/features/dashboard/utils/dashboard.ts +++ b/public/app/features/dashboard/utils/dashboard.ts @@ -1,6 +1,7 @@ import { chain, cloneDeep, defaults, find } from 'lodash'; import { PanelPluginMeta } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { locationService } from '@grafana/runtime'; import config from 'app/core/config'; import { LS_PANEL_COPY_KEY } from 'app/core/constants'; @@ -27,7 +28,7 @@ export function onCreateNewPanel(dashboard: DashboardModel, datasource?: string) export function onCreateNewWidgetPanel(dashboard: DashboardModel, widgetType: string): number | undefined { const newPanel: Partial<PanelModel> = { type: widgetType, - title: 'Widget title', + title: t('dashboard.on-create-new-widget-panel.new-panel.title.widget-title', 'Widget title'), gridPos: calculateNewPanelGridPos(dashboard), datasource: null, isNew: true, @@ -40,7 +41,7 @@ export function onCreateNewWidgetPanel(dashboard: DashboardModel, widgetType: st export function onCreateNewRow(dashboard: DashboardModel) { const newRow = { type: 'row', - title: 'Row title', + title: t('dashboard.on-create-new-row.new-row.title.row-title', 'Row title'), gridPos: { x: 0, y: 0 }, }; diff --git a/public/app/features/dashboard/utils/getPanelMenu.ts b/public/app/features/dashboard/utils/getPanelMenu.ts index 24ec5745233..910a67a5d88 100644 --- a/public/app/features/dashboard/utils/getPanelMenu.ts +++ b/public/app/features/dashboard/utils/getPanelMenu.ts @@ -268,7 +268,7 @@ export function getPanelMenu( if (extensions.length > 0 && !panel.isEditing) { menu.push({ - text: 'Extensions', + text: t('dashboard.get-panel-menu.text.extensions', 'Extensions'), iconClassName: 'plug', type: 'submenu', subMenu: createExtensionSubMenu(extensions), diff --git a/public/app/features/dashboard/utils/panel.ts b/public/app/features/dashboard/utils/panel.ts index b2bfb63d404..8b52a7bc38f 100644 --- a/public/app/features/dashboard/utils/panel.ts +++ b/public/app/features/dashboard/utils/panel.ts @@ -1,6 +1,7 @@ import { isString as _isString } from 'lodash'; import { TimeRange, AppEvents, rangeUtil, dateMath, PanelModel as IPanelModel, dateTimeAsMoment } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { getTemplateSrv } from '@grafana/runtime'; import appEvents from 'app/core/app_events'; import config from 'app/core/config'; @@ -23,8 +24,8 @@ export const removePanel = (dashboard: DashboardModel, panel: PanelModel, ask: b appEvents.publish( new ShowConfirmModalEvent({ - title: 'Remove panel', - text: 'Are you sure you want to remove this panel?', + title: t('dashboard.remove-panel.title.remove-panel', 'Remove panel'), + text: t('dashboard.remove-panel.text.remove-panel', 'Are you sure you want to remove this panel?'), icon: 'trash-alt', confirmText: confirmText, yesText: 'Remove', diff --git a/public/app/features/datasources/components/picker/BuiltInDataSourceList.tsx b/public/app/features/datasources/components/picker/BuiltInDataSourceList.tsx index 33a26b3abd1..c58003f8529 100644 --- a/public/app/features/datasources/components/picker/BuiltInDataSourceList.tsx +++ b/public/app/features/datasources/components/picker/BuiltInDataSourceList.tsx @@ -1,7 +1,6 @@ import { DataSourceInstanceSettings } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; -import { useTranslate } from '@grafana/i18n'; -import { TFunction } from '@grafana/i18n/internal'; +import { TFunction, useTranslate } from '@grafana/i18n'; import { DataSourceRef } from '@grafana/schema'; import { useDatasources } from '../../hooks'; diff --git a/public/app/features/datasources/components/useDataSourceInfo.tsx b/public/app/features/datasources/components/useDataSourceInfo.tsx index a9e10103e08..1a7744185fe 100644 --- a/public/app/features/datasources/components/useDataSourceInfo.tsx +++ b/public/app/features/datasources/components/useDataSourceInfo.tsx @@ -13,12 +13,12 @@ export const useDataSourceInfo = (dataSourceInfo: DataSourceInfo): PageInfoItem[ const alertingEnabled = dataSourceInfo.alertingSupported; info.push({ - label: 'Type', + label: t('datasources.use-data-source-info.label.type', 'Type'), value: dataSourceInfo.dataSourcePluginName, }); info.push({ - label: 'Alerting', + label: t('datasources.use-data-source-info.label.alerting', 'Alerting'), value: ( <Badge color={alertingEnabled ? 'green' : 'red'} diff --git a/public/app/features/datasources/state/actions.ts b/public/app/features/datasources/state/actions.ts index 48044d2ec65..b52bb79634e 100644 --- a/public/app/features/datasources/state/actions.ts +++ b/public/app/features/datasources/state/actions.ts @@ -7,6 +7,7 @@ import { DataSourceTestFailed, DataSourceApi, } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { config, DataSourceSrv, @@ -290,7 +291,15 @@ export function updateDataSource(dataSource: DataSourceSettings) { const formattedError = parseHealthCheckError(err); dispatch(testDataSourceFailed(formattedError)); - const errorInfo = isFetchError(err) ? err.data : { message: 'An unexpected error occurred.', traceID: '' }; + const errorInfo = isFetchError(err) + ? err.data + : { + message: t( + 'datasources.update-data-source.error-info.message.an-unexpected-error-occurred', + 'An unexpected error occurred.' + ), + traceID: '', + }; return Promise.reject(errorInfo); } diff --git a/public/app/features/datasources/state/buildCategories.ts b/public/app/features/datasources/state/buildCategories.ts index 54df64ebf03..c5663babc94 100644 --- a/public/app/features/datasources/state/buildCategories.ts +++ b/public/app/features/datasources/state/buildCategories.ts @@ -1,4 +1,5 @@ import { DataSourcePluginMeta, PluginType } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { featureEnabled } from '@grafana/runtime'; import { DataSourcePluginCategory } from 'app/types'; import grafanaIconSvg from 'img/grafana_icon.svg'; @@ -35,15 +36,38 @@ import zendeskSvg from 'img/plugins/zendesk.svg'; export function buildCategories(plugins: DataSourcePluginMeta[]): DataSourcePluginCategory[] { const categories: DataSourcePluginCategory[] = [ - { id: 'tsdb', title: 'Time series databases', plugins: [] }, - { id: 'logging', title: 'Logging & document databases', plugins: [] }, - { id: 'tracing', title: 'Distributed tracing', plugins: [] }, - { id: 'profiling', title: 'Profiling', plugins: [] }, - { id: 'sql', title: 'SQL', plugins: [] }, - { id: 'cloud', title: 'Cloud', plugins: [] }, - { id: 'enterprise', title: 'Enterprise plugins', plugins: [] }, - { id: 'iot', title: 'Industrial & IoT', plugins: [] }, - { id: 'other', title: 'Others', plugins: [] }, + { + id: 'tsdb', + title: t('datasources.build-categories.categories.title.time-series-databases', 'Time series databases'), + plugins: [], + }, + { + id: 'logging', + title: t( + 'datasources.build-categories.categories.title.logging-document-databases', + 'Logging & document databases' + ), + plugins: [], + }, + { + id: 'tracing', + title: t('datasources.build-categories.categories.title.distributed-tracing', 'Distributed tracing'), + plugins: [], + }, + { id: 'profiling', title: t('datasources.build-categories.categories.title.profiling', 'Profiling'), plugins: [] }, + { id: 'sql', title: t('datasources.build-categories.categories.title.sql', 'SQL'), plugins: [] }, + { id: 'cloud', title: t('datasources.build-categories.categories.title.cloud', 'Cloud'), plugins: [] }, + { + id: 'enterprise', + title: t('datasources.build-categories.categories.title.enterprise-plugins', 'Enterprise plugins'), + plugins: [], + }, + { + id: 'iot', + title: t('datasources.build-categories.categories.title.industrial-io-t', 'Industrial & IoT'), + plugins: [], + }, + { id: 'other', title: t('datasources.build-categories.categories.title.others', 'Others'), plugins: [] }, ].filter((item) => item); const categoryIndex: Record<string, DataSourcePluginCategory> = {}; @@ -129,180 +153,258 @@ function getEnterprisePhantomPlugins(): DataSourcePluginMeta[] { getPhantomPlugin({ id: 'grafana-splunk-datasource', name: 'Splunk', - description: 'Visualize and explore Splunk logs', + description: t( + 'datasources.get-enterprise-phantom-plugins.description.visualize-and-explore-splunk-logs', + 'Visualize and explore Splunk logs' + ), imgUrl: splunkLogo128Png, }), getPhantomPlugin({ id: 'grafana-oracle-datasource', name: 'Oracle', - description: 'Visualize and explore Oracle SQL', + description: t( + 'datasources.get-enterprise-phantom-plugins.description.visualize-and-explore-oracle-sql', + 'Visualize and explore Oracle SQL' + ), imgUrl: oraclePng, }), getPhantomPlugin({ id: 'grafana-dynatrace-datasource', name: 'Dynatrace', - description: 'Visualize and explore Dynatrace data', + description: t( + 'datasources.get-enterprise-phantom-plugins.description.visualize-and-explore-dynatrace-data', + 'Visualize and explore Dynatrace data' + ), imgUrl: dynatracePng, }), getPhantomPlugin({ id: 'grafana-servicenow-datasource', - description: 'ServiceNow integration and data source', + description: t( + 'datasources.get-enterprise-phantom-plugins.description.service-now-integration-and-data-source', + 'ServiceNow integration and data source' + ), name: 'ServiceNow', imgUrl: servicenowSvg, }), getPhantomPlugin({ id: 'grafana-datadog-datasource', - description: 'DataDog integration and data source', + description: t( + 'datasources.get-enterprise-phantom-plugins.description.data-dog-integration-and-data-source', + 'DataDog integration and data source' + ), name: 'DataDog', imgUrl: datadogPng, }), getPhantomPlugin({ id: 'grafana-newrelic-datasource', - description: 'New Relic integration and data source', + description: t( + 'datasources.get-enterprise-phantom-plugins.description.new-relic-integration-and-data-source', + 'New Relic integration and data source' + ), name: 'New Relic', imgUrl: newrelicSvg, }), getPhantomPlugin({ id: 'grafana-mongodb-datasource', - description: 'MongoDB integration and data source', + description: t( + 'datasources.get-enterprise-phantom-plugins.description.mongo-db-integration-and-data-source', + 'MongoDB integration and data source' + ), name: 'MongoDB', imgUrl: mongodbSvg, }), getPhantomPlugin({ id: 'grafana-snowflake-datasource', - description: 'Snowflake integration and data source', + description: t( + 'datasources.get-enterprise-phantom-plugins.description.snowflake-integration-and-data-source', + 'Snowflake integration and data source' + ), name: 'Snowflake', imgUrl: snowflakeSvg, }), getPhantomPlugin({ id: 'grafana-wavefront-datasource', - description: 'Wavefront integration and data source', + description: t( + 'datasources.get-enterprise-phantom-plugins.description.wavefront-integration-and-data-source', + 'Wavefront integration and data source' + ), name: 'Wavefront', imgUrl: wavefrontSvg, }), getPhantomPlugin({ id: 'dlopes7-appdynamics-datasource', - description: 'AppDynamics integration and data source', + description: t( + 'datasources.get-enterprise-phantom-plugins.description.app-dynamics-integration-and-data-source', + 'AppDynamics integration and data source' + ), name: 'AppDynamics', imgUrl: appdynamicsSvg, }), getPhantomPlugin({ id: 'grafana-saphana-datasource', - description: 'SAP HANA® integration and data source', + description: t( + 'datasources.get-enterprise-phantom-plugins.description.sap-hana-integration-and-data-source', + 'SAP HANA® integration and data source' + ), name: 'SAP HANA®', imgUrl: sapHanaPng, }), getPhantomPlugin({ id: 'grafana-honeycomb-datasource', - description: 'Honeycomb integration and datasource', + description: t( + 'datasources.get-enterprise-phantom-plugins.description.honeycomb-integration-and-datasource', + 'Honeycomb integration and datasource' + ), name: 'Honeycomb', imgUrl: honeycombPng, }), getPhantomPlugin({ id: 'grafana-salesforce-datasource', - description: 'Salesforce integration and datasource', + description: t( + 'datasources.get-enterprise-phantom-plugins.description.salesforce-integration-and-datasource', + 'Salesforce integration and datasource' + ), name: 'Salesforce', imgUrl: salesforceSvg, }), getPhantomPlugin({ id: 'grafana-jira-datasource', - description: 'Jira integration and datasource', + description: t( + 'datasources.get-enterprise-phantom-plugins.description.jira-integration-and-datasource', + 'Jira integration and datasource' + ), name: 'Jira', imgUrl: jiraLogoPng, }), getPhantomPlugin({ id: 'grafana-gitlab-datasource', - description: 'GitLab integration and datasource', + description: t( + 'datasources.get-enterprise-phantom-plugins.description.git-lab-integration-and-datasource', + 'GitLab integration and datasource' + ), name: 'GitLab', imgUrl: gitlabSvg, }), getPhantomPlugin({ id: 'grafana-splunk-monitoring-datasource', - description: 'SignalFx integration and datasource', + description: t( + 'datasources.get-enterprise-phantom-plugins.description.signal-fx-integration-and-datasource', + 'SignalFx integration and datasource' + ), name: 'Splunk Infrastructure Monitoring', imgUrl: signalfxLogoSvg, }), getPhantomPlugin({ id: 'grafana-azuredevops-datasource', - description: 'Azure Devops datasource', + description: t( + 'datasources.get-enterprise-phantom-plugins.description.azure-devops-datasource', + 'Azure Devops datasource' + ), name: 'Azure Devops', imgUrl: azureDevopsPng, }), getPhantomPlugin({ id: 'grafana-sumologic-datasource', - description: 'SumoLogic integration and datasource', + description: t( + 'datasources.get-enterprise-phantom-plugins.description.sumo-logic-integration-and-datasource', + 'SumoLogic integration and datasource' + ), name: 'SumoLogic', imgUrl: sumoSvg, }), getPhantomPlugin({ id: 'grafana-pagerduty-datasource', - description: 'PagerDuty datasource', + description: t( + 'datasources.get-enterprise-phantom-plugins.description.pager-duty-datasource', + 'PagerDuty datasource' + ), name: 'PagerDuty', imgUrl: pagerdutySvg, }), getPhantomPlugin({ id: 'grafana-catchpoint-datasource', - description: 'Catchpoint datasource', + description: t( + 'datasources.get-enterprise-phantom-plugins.description.catchpoint-datasource', + 'Catchpoint datasource' + ), name: 'Catchpoint', imgUrl: catchpointSvg, }), getPhantomPlugin({ id: 'grafana-azurecosmosdb-datasource', - description: 'Azure CosmosDB datasource', + description: t( + 'datasources.get-enterprise-phantom-plugins.description.azure-cosmos-db-datasource', + 'Azure CosmosDB datasource' + ), name: 'Azure CosmosDB', imgUrl: azureCosmosdbSvg, }), getPhantomPlugin({ id: 'grafana-adobeanalytics-datasource', - description: 'Adobe Analytics datasource', + description: t( + 'datasources.get-enterprise-phantom-plugins.description.adobe-analytics-datasource', + 'Adobe Analytics datasource' + ), name: 'Adobe Analytics', imgUrl: adobeAnalyticsSvg, }), getPhantomPlugin({ id: 'grafana-cloudflare-datasource', - description: 'Cloudflare datasource', + description: t( + 'datasources.get-enterprise-phantom-plugins.description.cloudflare-datasource', + 'Cloudflare datasource' + ), name: 'Cloudflare', imgUrl: cloudflareJpg, }), getPhantomPlugin({ id: 'grafana-cockroachdb-datasource', - description: 'CockroachDB datasource', + description: t( + 'datasources.get-enterprise-phantom-plugins.description.cockroach-db-datasource', + 'CockroachDB datasource' + ), name: 'CockroachDB', imgUrl: cockroachdbJpg, }), getPhantomPlugin({ id: 'grafana-netlify-datasource', - description: 'Netlify datasource', + description: t('datasources.get-enterprise-phantom-plugins.description.netlify-datasource', 'Netlify datasource'), name: 'Netlify', imgUrl: netlifySvg, }), getPhantomPlugin({ id: 'grafana-drone-datasource', - description: 'Drone datasource', + description: t('datasources.get-enterprise-phantom-plugins.description.drone-datasource', 'Drone datasource'), name: 'Drone', imgUrl: droneSvg, }), getPhantomPlugin({ id: 'grafana-zendesk-datasource', - description: 'Zendesk datasource', + description: t('datasources.get-enterprise-phantom-plugins.description.zendesk-datasource', 'Zendesk datasource'), name: 'Zendesk', imgUrl: zendeskSvg, }), getPhantomPlugin({ id: 'grafana-atlassianstatuspage-datasource', - description: 'Atlassian Statuspage datasource', + description: t( + 'datasources.get-enterprise-phantom-plugins.description.atlassian-statuspage-datasource', + 'Atlassian Statuspage datasource' + ), name: 'Atlassian Statuspage', imgUrl: atlassianStatuspageSvg, }), getPhantomPlugin({ id: 'grafana-aurora-datasource', - description: 'Aurora data source', + description: t('datasources.get-enterprise-phantom-plugins.description.aurora-data-source', 'Aurora data source'), name: 'Aurora', imgUrl: auroraSvg, }), getPhantomPlugin({ id: 'grafana-logicmonitor-datasource', - description: 'LogicMonitor Devices datasource', + description: t( + 'datasources.get-enterprise-phantom-plugins.description.logic-monitor-devices-datasource', + 'LogicMonitor Devices datasource' + ), name: 'LogicMonitor Devices', imgUrl: logicMonitorSvg, }), @@ -317,7 +419,10 @@ function getGrafanaCloudPhantomPlugin(): DataSourcePluginMeta { module: 'phantom', baseUrl: '', info: { - description: 'Hosted Graphite, Prometheus, and Loki', + description: t( + 'datasources.get-grafana-cloud-phantom-plugin.description.hosted-graphite-prometheus-and-loki', + 'Hosted Graphite, Prometheus, and Loki' + ), logos: { small: grafanaIconSvg, large: grafanaIconSvg }, author: { name: 'Grafana Labs' }, links: [ diff --git a/public/app/features/datasources/state/hooks.ts b/public/app/features/datasources/state/hooks.ts index d2c956a2a4b..2577971cfa6 100644 --- a/public/app/features/datasources/state/hooks.ts +++ b/public/app/features/datasources/state/hooks.ts @@ -1,6 +1,7 @@ import { useEffect } from 'react'; import { DataSourcePluginMeta, DataSourceSettings } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { cleanUpAction } from 'app/core/actions/cleanUp'; import appEvents from 'app/core/app_events'; import { contextSrv } from 'app/core/core'; @@ -95,7 +96,7 @@ export const useDeleteLoadedDataSource = () => { return () => { appEvents.publish( new ShowConfirmModalEvent({ - title: 'Delete', + title: t('datasources.use-delete-loaded-data-source.title.delete', 'Delete'), text: `Are you sure you want to delete the "${name}" data source?`, yesText: 'Delete', icon: 'trash-alt', diff --git a/public/app/features/datasources/state/navModel.ts b/public/app/features/datasources/state/navModel.ts index c576bf23055..f00ea554a94 100644 --- a/public/app/features/datasources/state/navModel.ts +++ b/public/app/features/datasources/state/navModel.ts @@ -1,4 +1,5 @@ import { DataSourceSettings, PluginType, PluginInclude, NavModel, NavModelItem } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { featureEnabled } from '@grafana/runtime'; import { ProBadge } from 'app/core/components/Upgrade/ProBadge'; import config from 'app/core/config'; @@ -24,7 +25,7 @@ export function buildNavModel(dataSource: DataSourceSettings, plugin: GenericDat active: false, icon: 'sliders-v-alt', id: `datasource-settings-${dataSource.uid}`, - text: 'Settings', + text: t('datasources.build-nav-model.nav-model.text.settings', 'Settings'), url: `datasources/edit/${dataSource.uid}/`, }, ], @@ -47,7 +48,7 @@ export function buildNavModel(dataSource: DataSourceSettings, plugin: GenericDat active: false, icon: 'apps', id: `datasource-dashboards-${dataSource.uid}`, - text: 'Dashboards', + text: t('datasources.build-nav-model.text.dashboards', 'Dashboards'), url: `datasources/edit/${dataSource.uid}/dashboards`, }); } @@ -59,7 +60,7 @@ export function buildNavModel(dataSource: DataSourceSettings, plugin: GenericDat active: false, icon: 'lock', id: `datasource-permissions-${dataSource.uid}`, - text: 'Permissions', + text: t('datasources.build-nav-model.ds-permissions.text.permissions', 'Permissions'), url: `datasources/edit/${dataSource.uid}/permissions`, }; @@ -85,7 +86,7 @@ export function buildNavModel(dataSource: DataSourceSettings, plugin: GenericDat active: false, icon: 'info-circle', id: `datasource-insights-${dataSource.uid}`, - text: 'Insights', + text: t('datasources.build-nav-model.analytics.text.insights', 'Insights'), url: `datasources/edit/${dataSource.uid}/insights`, }; @@ -112,7 +113,7 @@ export function buildNavModel(dataSource: DataSourceSettings, plugin: GenericDat active: false, icon: 'database', id: `datasource-cache-${dataSource.uid}`, - text: 'Cache', + text: t('datasources.build-nav-model.caching.text.cache', 'Cache'), url: `datasources/edit/${dataSource.uid}/cache`, hideFromTabs: !pluginMeta.isBackend || !config.caching.enabled, }; diff --git a/public/app/features/datasources/state/reducers.ts b/public/app/features/datasources/state/reducers.ts index c9bc8f311c8..052b78c7eeb 100644 --- a/public/app/features/datasources/state/reducers.ts +++ b/public/app/features/datasources/state/reducers.ts @@ -1,6 +1,7 @@ import { AnyAction, createAction } from '@reduxjs/toolkit'; import { DataSourcePluginMeta, DataSourceSettings, LayoutMode, LayoutModes } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { TestingStatus } from '@grafana/runtime'; import { DataSourcesState, DataSourceSettingsState } from 'app/types'; @@ -146,7 +147,10 @@ export const dataSourceSettingsReducer = ( return { ...state, testingStatus: { - message: 'Testing... this could take up to a couple of minutes', + message: t( + 'datasources.data-source-settings-reducer.message.testing-could-couple-minutes', + 'Testing... this could take up to a couple of minutes' + ), status: 'info', }, }; diff --git a/public/app/features/dimensions/editors/ResourceDimensionEditor.tsx b/public/app/features/dimensions/editors/ResourceDimensionEditor.tsx index 9cb6142da79..9b92e848f23 100644 --- a/public/app/features/dimensions/editors/ResourceDimensionEditor.tsx +++ b/public/app/features/dimensions/editors/ResourceDimensionEditor.tsx @@ -128,7 +128,7 @@ export const ResourceDimensionEditor = ( labelWidth={labelWidth} grow={true} > - {/* eslint-disable-next-line @grafana/no-untranslated-strings*/} + {/* eslint-disable-next-line @grafana/i18n/no-untranslated-strings*/} <div>TODO mappings editor!</div> </InlineField> </InlineFieldRow> diff --git a/public/app/features/dimensions/editors/ThresholdsEditor/ThresholdsEditor.tsx b/public/app/features/dimensions/editors/ThresholdsEditor/ThresholdsEditor.tsx index b1a25c37095..7213154c219 100644 --- a/public/app/features/dimensions/editors/ThresholdsEditor/ThresholdsEditor.tsx +++ b/public/app/features/dimensions/editors/ThresholdsEditor/ThresholdsEditor.tsx @@ -191,10 +191,7 @@ export class ThresholdsEditor extends PureComponent<Props, State> { enableNamedColors={true} /> </div> - {isPercent && ( - // eslint-disable-next-line @grafana/no-untranslated-strings - <div className={styles.percentIcon}>%</div> - )} + {isPercent && <div className={styles.percentIcon}>%</div>} </div> } suffix={ diff --git a/public/app/features/dimensions/editors/ValueMappingsEditor/ValueMappingEditRow.tsx b/public/app/features/dimensions/editors/ValueMappingsEditor/ValueMappingEditRow.tsx index 9489c6b3ae1..36cab7a6946 100644 --- a/public/app/features/dimensions/editors/ValueMappingsEditor/ValueMappingEditRow.tsx +++ b/public/app/features/dimensions/editors/ValueMappingsEditor/ValueMappingEditRow.tsx @@ -122,12 +122,59 @@ export function ValueMappingEditRow({ mapping, index, onChange, onRemove, onDupl }; const specialMatchOptions: Array<SelectableValue<SpecialValueMatch>> = [ - { label: 'Null', value: SpecialValueMatch.Null, description: 'Matches null and undefined values' }, - { label: 'NaN', value: SpecialValueMatch.NaN, description: 'Matches against Number.NaN (not a number)' }, - { label: 'Null + NaN', value: SpecialValueMatch.NullAndNaN, description: 'Matches null, undefined and NaN' }, - { label: 'True', value: SpecialValueMatch.True, description: 'Boolean true values' }, - { label: 'False', value: SpecialValueMatch.False, description: 'Boolean false values' }, - { label: 'Empty', value: SpecialValueMatch.Empty, description: 'Empty string' }, + { + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings + label: 'Null', + value: SpecialValueMatch.Null, + description: t( + 'dimensions.value-mapping-edit-row.special-match-options.description.matches-null-and-undefined-values', + 'Matches null and undefined values' + ), + }, + { + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings + label: 'NaN', + value: SpecialValueMatch.NaN, + description: t( + 'dimensions.value-mapping-edit-row.special-match-options.description.matches-against-number-na-n-not-a-number', + 'Matches against Number.NaN (not a number)' + ), + }, + { + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings + label: 'Null + NaN', + value: SpecialValueMatch.NullAndNaN, + description: t( + 'dimensions.value-mapping-edit-row.special-match-options.description.matches-null-undefined-and-na-n', + 'Matches null, undefined and NaN' + ), + }, + { + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings + label: 'True', + value: SpecialValueMatch.True, + description: t( + 'dimensions.value-mapping-edit-row.special-match-options.description.boolean-true-values', + 'Boolean true values' + ), + }, + { + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings + label: 'False', + value: SpecialValueMatch.False, + description: t( + 'dimensions.value-mapping-edit-row.special-match-options.description.boolean-false-values', + 'Boolean false values' + ), + }, + { + label: t('dimensions.value-mapping-edit-row.special-match-options.label.empty', 'Empty'), + value: SpecialValueMatch.Empty, + description: t( + 'dimensions.value-mapping-edit-row.special-match-options.description.empty-string', + 'Empty string' + ), + }, ]; return ( diff --git a/public/app/features/dimensions/editors/ValueMappingsEditor/ValueMappingsEditorModal.tsx b/public/app/features/dimensions/editors/ValueMappingsEditor/ValueMappingsEditorModal.tsx index 063615b3a29..e7d7710e4cf 100644 --- a/public/app/features/dimensions/editors/ValueMappingsEditor/ValueMappingsEditorModal.tsx +++ b/public/app/features/dimensions/editors/ValueMappingsEditor/ValueMappingsEditorModal.tsx @@ -51,10 +51,38 @@ export function ValueMappingsEditorModal({ value, onChange, onClose, showIconPic }; const mappingTypes: Array<SelectableValue<MappingType>> = [ - { label: 'Value', value: MappingType.ValueToText, description: 'Match a specific text value' }, - { label: 'Range', value: MappingType.RangeToText, description: 'Match a numerical range of values' }, - { label: 'Regex', value: MappingType.RegexToText, description: 'Match a regular expression with replacement' }, - { label: 'Special', value: MappingType.SpecialValue, description: 'Match on null, NaN, boolean and empty values' }, + { + label: t('dimensions.value-mappings-editor-modal.mapping-types.label.value', 'Value'), + value: MappingType.ValueToText, + description: t( + 'dimensions.value-mappings-editor-modal.mapping-types.description.match-a-specific-text-value', + 'Match a specific text value' + ), + }, + { + label: t('dimensions.value-mappings-editor-modal.mapping-types.label.range', 'Range'), + value: MappingType.RangeToText, + description: t( + 'dimensions.value-mappings-editor-modal.mapping-types.description.match-a-numerical-range-of-values', + 'Match a numerical range of values' + ), + }, + { + label: t('dimensions.value-mappings-editor-modal.mapping-types.label.regex', 'Regex'), + value: MappingType.RegexToText, + description: t( + 'dimensions.value-mappings-editor-modal.mapping-types.description.match-a-regular-expression-with-replacement', + 'Match a regular expression with replacement' + ), + }, + { + label: t('dimensions.value-mappings-editor-modal.mapping-types.label.special', 'Special'), + value: MappingType.SpecialValue, + description: t( + 'dimensions.value-mappings-editor-modal.mapping-types.description.match-boolean-empty-values', + 'Match on null, NaN, boolean and empty values' + ), + }, ]; const onAddValueMapping = (value: SelectableValue<MappingType>) => { diff --git a/public/app/features/explore/ExploreQueryInspector.tsx b/public/app/features/explore/ExploreQueryInspector.tsx index 11c49038273..57885d6e6da 100644 --- a/public/app/features/explore/ExploreQueryInspector.tsx +++ b/public/app/features/explore/ExploreQueryInspector.tsx @@ -3,6 +3,7 @@ import { useEffect, useState } from 'react'; import { connect, ConnectedProps } from 'react-redux'; import { CoreApp, GrafanaTheme2, LoadingState } from '@grafana/data'; +import { useTranslate } from '@grafana/i18n'; import { reportInteraction } from '@grafana/runtime'; import { defaultTimeZone, TimeZone } from '@grafana/schema'; import { TabbedContainer, TabConfig, useStyles2 } from '@grafana/ui'; @@ -29,6 +30,7 @@ interface DispatchProps { type Props = DispatchProps & ConnectedProps<typeof connector>; export function ExploreQueryInspector(props: Props) { + const { t } = useTranslate(); const { onClose, queryResponse, timeZone, isMixed, exploreId } = props; const [dataOptions, setDataOptions] = useState<GetDataOptions>({ withTransforms: false, @@ -46,21 +48,21 @@ export function ExploreQueryInspector(props: Props) { }, []); const statsTab: TabConfig = { - label: 'Stats', + label: t('explore.explore-query-inspector.stats-tab.label.stats', 'Stats'), value: 'stats', icon: 'chart-line', content: <InspectStatsTab data={queryResponse!} timeZone={queryResponse?.request?.timezone ?? defaultTimeZone} />, }; const jsonTab: TabConfig = { - label: 'JSON', + label: t('explore.explore-query-inspector.json-tab.label.json', 'JSON'), value: 'json', icon: 'brackets-curly', content: <InspectJSONTab data={queryResponse} onClose={onClose} />, }; const dataTab: TabConfig = { - label: 'Data', + label: t('explore.explore-query-inspector.data-tab.label.data', 'Data'), value: 'data', icon: 'database', content: ( @@ -78,7 +80,7 @@ export function ExploreQueryInspector(props: Props) { }; const queryTab: TabConfig = { - label: 'Query', + label: t('explore.explore-query-inspector.query-tab.label.query', 'Query'), value: 'query', icon: 'info-circle', content: ( @@ -95,7 +97,7 @@ export function ExploreQueryInspector(props: Props) { const tabs = [statsTab, queryTab, jsonTab, dataTab]; if (errors?.length) { const errorTab: TabConfig = { - label: 'Error', + label: t('explore.explore-query-inspector.error-tab.label.error', 'Error'), value: 'error', icon: 'exclamation-triangle', content: <InspectErrorTab errors={errors} />, diff --git a/public/app/features/explore/ExploreRunQueryButton.tsx b/public/app/features/explore/ExploreRunQueryButton.tsx index 4de8501eb45..19e7a60d8e6 100644 --- a/public/app/features/explore/ExploreRunQueryButton.tsx +++ b/public/app/features/explore/ExploreRunQueryButton.tsx @@ -108,7 +108,7 @@ export function ExploreRunQueryButton({ runQuery(pane[0]); onClick?.(); }} - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings label={`${paneLabel}: ${buttonText.translation}`} disabled={isInvalid || pane[0] === undefined} /> diff --git a/public/app/features/explore/Logs/Logs.test.tsx b/public/app/features/explore/Logs/Logs.test.tsx index 85b5906eef6..5135821c28f 100644 --- a/public/app/features/explore/Logs/Logs.test.tsx +++ b/public/app/features/explore/Logs/Logs.test.tsx @@ -27,7 +27,7 @@ import { makeExplorePaneState } from '../state/utils'; import { Logs } from './Logs'; import { visualisationTypeKey } from './utils/logs'; -import { getMockElasticFrame, getMockLokiFrame } from './utils/testMocks.test'; +import { getMockElasticFrame, getMockLokiFrame } from './utils/mocks'; const reportInteraction = jest.fn(); jest.mock('@grafana/runtime', () => ({ diff --git a/public/app/features/explore/Logs/Logs.tsx b/public/app/features/explore/Logs/Logs.tsx index 6025d4f8c9e..3d6a903ecbf 100644 --- a/public/app/features/explore/Logs/Logs.tsx +++ b/public/app/features/explore/Logs/Logs.tsx @@ -870,14 +870,20 @@ const UnthemedLogs: React.FunctionComponent<Props> = (props: Props) => { className={styles.visualisationTypeRadio} options={[ { - label: 'Logs', + label: t('explore.unthemed-logs.label.logs', 'Logs'), value: 'logs', - description: 'Show results in logs visualisation', + description: t( + 'explore.unthemed-logs.description.show-results-in-logs-visualisation', + 'Show results in logs visualisation' + ), }, { - label: 'Table', + label: t('explore.unthemed-logs.label.table', 'Table'), value: 'table', - description: 'Show results in table visualisation', + description: t( + 'explore.unthemed-logs.description.show-results-in-table-visualisation', + 'Show results in table visualisation' + ), }, ]} size="sm" @@ -976,14 +982,20 @@ const UnthemedLogs: React.FunctionComponent<Props> = (props: Props) => { <RadioButtonGroup options={[ { - label: 'Newest first', + label: t('explore.unthemed-logs.label.newest-first', 'Newest first'), value: LogsSortOrder.Descending, - description: 'Show results newest to oldest', + description: t( + 'explore.unthemed-logs.description.show-results-newest-to-oldest', + 'Show results newest to oldest' + ), }, { - label: 'Oldest first', + label: t('explore.unthemed-logs.label.oldest-first', 'Oldest first'), value: LogsSortOrder.Ascending, - description: 'Show results oldest to newest', + description: t( + 'explore.unthemed-logs.description.show-results-oldest-to-newest', + 'Show results oldest to newest' + ), }, ]} value={logsSortOrder} diff --git a/public/app/features/explore/Logs/LogsMetaRow.tsx b/public/app/features/explore/Logs/LogsMetaRow.tsx index cafcb2e1b25..199a629e0e5 100644 --- a/public/app/features/explore/Logs/LogsMetaRow.tsx +++ b/public/app/features/explore/Logs/LogsMetaRow.tsx @@ -2,7 +2,7 @@ import { css } from '@emotion/css'; import { memo } from 'react'; import { LogsDedupStrategy, LogsMetaItem, LogsMetaKind, LogRowModel, CoreApp, Labels, store } from '@grafana/data'; -import { Trans } from '@grafana/i18n'; +import { Trans, useTranslate } from '@grafana/i18n'; import { config, reportInteraction } from '@grafana/runtime'; import { Button, Dropdown, Menu, ToolbarButton, useStyles2 } from '@grafana/ui'; @@ -35,6 +35,7 @@ export type Props = { export const LogsMetaRow = memo( ({ meta, dedupStrategy, dedupCount, displayedFields, clearDetectedFields, logRows }: Props) => { + const { t } = useTranslate(); const style = useStyles2(getStyles); const logsMetaItem: Array<LogsMetaItem | MetaItemProps> = [...meta]; @@ -42,7 +43,7 @@ export const LogsMetaRow = memo( // Add deduplication info if (dedupStrategy !== LogsDedupStrategy.none) { logsMetaItem.push({ - label: 'Deduplication count', + label: t('explore.logs-meta-row.label.deduplication-count', 'Deduplication count'), value: dedupCount, kind: LogsMetaKind.Number, }); @@ -52,7 +53,7 @@ export const LogsMetaRow = memo( if (displayedFields?.length > 0) { logsMetaItem.push( { - label: 'Showing only selected fields', + label: t('explore.logs-meta-row.label.showing-only-selected-fields', 'Showing only selected fields'), value: <LogLabelsList labels={displayedFields} />, }, { @@ -77,11 +78,11 @@ export const LogsMetaRow = memo( const downloadMenu = ( <Menu> - {/* eslint-disable-next-line @grafana/no-untranslated-strings */} + {/* eslint-disable-next-line @grafana/i18n/no-untranslated-strings */} <Menu.Item label="txt" onClick={() => download(DownloadFormat.Text)} /> - {/* eslint-disable-next-line @grafana/no-untranslated-strings */} + {/* eslint-disable-next-line @grafana/i18n/no-untranslated-strings */} <Menu.Item label="json" onClick={() => download(DownloadFormat.Json)} /> - {/* eslint-disable-next-line @grafana/no-untranslated-strings */} + {/* eslint-disable-next-line @grafana/i18n/no-untranslated-strings */} <Menu.Item label="csv" onClick={() => download(DownloadFormat.CSV)} /> </Menu> ); diff --git a/public/app/features/explore/Logs/LogsSamplePanel.tsx b/public/app/features/explore/Logs/LogsSamplePanel.tsx index 90107d430f1..6b943db151f 100644 --- a/public/app/features/explore/Logs/LogsSamplePanel.tsx +++ b/public/app/features/explore/Logs/LogsSamplePanel.tsx @@ -24,7 +24,7 @@ import { LogRows } from '../../logs/components/LogRows'; import { dataFrameToLogsModel } from '../../logs/logsModel'; import { SupplementaryResultError } from '../SupplementaryResultError'; -import { SETTINGS_KEYS } from './utils/logs'; +import { SETTING_KEY_ROOT, SETTINGS_KEYS } from './utils/logs'; type Props = { queryResponse: DataQueryResponse | undefined; @@ -118,8 +118,9 @@ export function LogsSamplePanel(props: Props) { enableLogDetails dedupStrategy={LogsDedupStrategy.none} displayedFields={[]} + logOptionsStorageKey={SETTING_KEY_ROOT} logs={logs.rows} - showControls={false} + showControls showTime={store.getBool(SETTINGS_KEYS.showTime, true)} sortOrder={store.get(SETTINGS_KEYS.logsSortOrder) || LogsSortOrder.Descending} timeRange={props.timeRange} diff --git a/public/app/features/explore/Logs/LogsTable.test.tsx b/public/app/features/explore/Logs/LogsTable.test.tsx index a8fa211431e..373bd38504a 100644 --- a/public/app/features/explore/Logs/LogsTable.test.tsx +++ b/public/app/features/explore/Logs/LogsTable.test.tsx @@ -9,7 +9,7 @@ import { extractFieldsTransformer } from 'app/features/transformers/extractField import { parseLogsFrame } from '../../logs/logsFrame'; import { LogsTable } from './LogsTable'; -import { getMockElasticFrame, getMockLokiFrame, getMockLokiFrameDataPlane } from './utils/testMocks.test'; +import { getMockElasticFrame, getMockLokiFrame, getMockLokiFrameDataPlane } from './utils/mocks'; jest.mock('@grafana/runtime', () => { const actual = jest.requireActual('@grafana/runtime'); diff --git a/public/app/features/explore/Logs/LogsTableWrap.test.tsx b/public/app/features/explore/Logs/LogsTableWrap.test.tsx index 3fd2add101f..0698f141043 100644 --- a/public/app/features/explore/Logs/LogsTableWrap.test.tsx +++ b/public/app/features/explore/Logs/LogsTableWrap.test.tsx @@ -8,7 +8,7 @@ import { config } from '@grafana/runtime'; import { extractFieldsTransformer } from '../../transformers/extractFields/extractFields'; import { LogsTableWrap } from './LogsTableWrap'; -import { getMockLokiFrame, getMockLokiFrameDataPlane } from './utils/testMocks.test'; +import { getMockLokiFrame, getMockLokiFrameDataPlane } from './utils/mocks'; const getComponent = (partialProps?: Partial<ComponentProps<typeof LogsTableWrap>>) => { return ( diff --git a/public/app/features/explore/Logs/utils/testMocks.test.ts b/public/app/features/explore/Logs/utils/mocks.ts similarity index 97% rename from public/app/features/explore/Logs/utils/testMocks.test.ts rename to public/app/features/explore/Logs/utils/mocks.ts index 93ddc7b2eeb..3c97a669fb0 100644 --- a/public/app/features/explore/Logs/utils/testMocks.test.ts +++ b/public/app/features/explore/Logs/utils/mocks.ts @@ -179,13 +179,3 @@ export const getMockElasticFrame = (override?: Partial<DataFrame>, timestamp = 1 }; return { ...testDataFrame, ...override }; }; - -it('should return a frame', () => { - expect( - getMockLokiFrame({ - name: 'test', - }) - ).toMatchObject({ - name: 'test', - }); -}); diff --git a/public/app/features/explore/TraceView/TraceView.tsx b/public/app/features/explore/TraceView/TraceView.tsx index bd9d58bc47b..3fc0199156c 100644 --- a/public/app/features/explore/TraceView/TraceView.tsx +++ b/public/app/features/explore/TraceView/TraceView.tsx @@ -16,6 +16,7 @@ import { TimeRange, } from '@grafana/data'; import { Trans } from '@grafana/i18n'; +import { t } from '@grafana/i18n/internal'; import { getTraceToLogsOptions, TraceToMetricsData, TraceToProfilesData } from '@grafana/o11y-ds-frontend'; import { getTemplateSrv } from '@grafana/runtime'; import { DataQuery } from '@grafana/schema'; @@ -168,6 +169,7 @@ export function TraceView(props: Props) { ); const timeZone = useSelector((state) => getTimeZone(state.user)); const datasourceType = datasource ? datasource?.type : 'unknown'; + const datasourceUid = datasource ? datasource?.uid : ''; const scrollElement = props.scrollElement ? props.scrollElement : document.getElementsByClassName(props.scrollElementClass ?? '')[0]; @@ -203,6 +205,7 @@ export function TraceView(props: Props) { trace={traceProp} traceToProfilesOptions={traceToProfilesOptions} datasourceType={datasourceType} + datasourceUid={datasourceUid} spanBarOptions={spanBarOptions?.spanBar} traceTimeline={traceTimeline} updateNextViewRangeTime={updateNextViewRangeTime} @@ -226,7 +229,6 @@ export function TraceView(props: Props) { detailToggle={toggleDetail} addHoverIndentGuideId={addHoverIndentGuideId} removeHoverIndentGuideId={removeHoverIndentGuideId} - linksGetter={() => []} createSpanLink={createSpanLink} scrollElement={scrollElement} focusedSpanId={focusedSpanId} @@ -283,7 +285,10 @@ function useFocusSpanLink(options: { const createFocusSpanLink = (traceId: string, spanId: string) => { const link: DataLink = { - title: 'Deep link to this span', + title: t( + 'explore.use-focus-span-link.create-focus-span-link.link.title.deep-link-to-this-span', + 'Deep link to this span' + ), url: '', internal: { datasourceUid: options.datasource?.uid!, diff --git a/public/app/features/explore/TraceView/TraceViewContainer.test.tsx b/public/app/features/explore/TraceView/TraceViewContainer.test.tsx index dfc1a9607de..ca32e41af81 100644 --- a/public/app/features/explore/TraceView/TraceViewContainer.test.tsx +++ b/public/app/features/explore/TraceView/TraceViewContainer.test.tsx @@ -6,6 +6,8 @@ import { TimeRange } from '@grafana/data'; import { configureStore } from '../../../store/configureStore'; +// TODO: rebase after https://github.com/grafana/grafana/pull/105711, as this is already fixed +// eslint-disable-next-line no-restricted-imports import { frameOld } from './TraceView.test'; import { TraceViewContainer } from './TraceViewContainer'; diff --git a/public/app/features/explore/TraceView/components/TracePageHeader/SearchBar/NextPrevResult.test.tsx b/public/app/features/explore/TraceView/components/TracePageHeader/SearchBar/NextPrevResult.test.tsx index 8c815ac8d11..7d4ab670e22 100644 --- a/public/app/features/explore/TraceView/components/TracePageHeader/SearchBar/NextPrevResult.test.tsx +++ b/public/app/features/explore/TraceView/components/TracePageHeader/SearchBar/NextPrevResult.test.tsx @@ -19,7 +19,7 @@ import { useState } from 'react'; import { createTheme } from '@grafana/data'; import { defaultFilters } from '../../../useSearch'; -import { trace } from '../TracePageHeader.test'; +import { trace } from '../mocks'; import NextPrevResult, { getStyles } from './NextPrevResult'; diff --git a/public/app/features/explore/TraceView/components/TracePageHeader/SearchBar/TracePageSearchBar.test.tsx b/public/app/features/explore/TraceView/components/TracePageHeader/SearchBar/TracePageSearchBar.test.tsx index da85023411c..29368222e46 100644 --- a/public/app/features/explore/TraceView/components/TracePageHeader/SearchBar/TracePageSearchBar.test.tsx +++ b/public/app/features/explore/TraceView/components/TracePageHeader/SearchBar/TracePageSearchBar.test.tsx @@ -15,7 +15,7 @@ import { render, screen } from '@testing-library/react'; import { defaultFilters } from '../../../useSearch'; -import { trace } from '../TracePageHeader.test'; +import { trace } from '../mocks'; import TracePageSearchBar from './TracePageSearchBar'; diff --git a/public/app/features/explore/TraceView/components/TracePageHeader/SpanFilters/SpanFilters.tsx b/public/app/features/explore/TraceView/components/TracePageHeader/SpanFilters/SpanFilters.tsx index 24a4f1b0d4b..17b8df6404a 100644 --- a/public/app/features/explore/TraceView/components/TracePageHeader/SpanFilters/SpanFilters.tsx +++ b/public/app/features/explore/TraceView/components/TracePageHeader/SpanFilters/SpanFilters.tsx @@ -216,7 +216,7 @@ export const SpanFilters = memo((props: SpanFilterProps) => { ariaLabel="Select min span duration" onChange={(val) => setSpanFiltersSearch({ ...search, from: val })} isInvalidError="Invalid duration" - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="e.g. 100ms, 1.2s" width={18} value={search.from || ''} @@ -233,7 +233,7 @@ export const SpanFilters = memo((props: SpanFilterProps) => { ariaLabel="Select max span duration" onChange={(val) => setSpanFiltersSearch({ ...search, to: val })} isInvalidError="Invalid duration" - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="e.g. 100ms, 1.2s" width={18} value={search.to || ''} diff --git a/public/app/features/explore/TraceView/components/TracePageHeader/TracePageHeader.test.tsx b/public/app/features/explore/TraceView/components/TracePageHeader/TracePageHeader.test.tsx index 0896564ef5a..cf123bb85af 100644 --- a/public/app/features/explore/TraceView/components/TracePageHeader/TracePageHeader.test.tsx +++ b/public/app/features/explore/TraceView/components/TracePageHeader/TracePageHeader.test.tsx @@ -19,6 +19,7 @@ import { MutableDataFrame } from '@grafana/data'; import { defaultFilters } from '../../useSearch'; import { TracePageHeader } from './TracePageHeader'; +import { trace } from './mocks'; const setup = () => { const defaultProps = { @@ -61,132 +62,3 @@ describe('TracePageHeader test', () => { expect(timestampPart2).toBeInTheDocument(); }); }); - -export const trace = { - services: [{ name: 'serviceA', numberOfSpans: 1 }], - spans: [ - { - traceID: '164afda25df92413', - spanID: '264afda25df92413', - operationName: 'HTTP Client', - serviceName: 'serviceA', - subsidiarilyReferencedBy: [], - startTime: 1675602037286989, - duration: 5685, - logs: [], - references: [], - tags: [], - processID: '264afda25df92413', - flags: 0, - process: { - serviceName: 'lb', - tags: [], - }, - relativeStartTime: 0, - depth: 0, - hasChildren: false, - childSpanCount: 0, - warnings: [], - childSpanIds: [], - }, - { - traceID: '164afda25df92413', - spanID: '364afda25df92413', - operationName: 'HTTP Client', - serviceName: 'serviceB', - subsidiarilyReferencedBy: [], - startTime: 1675602037286989, - duration: 5685, - logs: [], - references: [], - tags: [ - { - key: 'http.url', - type: 'String', - value: `/v2/gamma/792edh2w897y2huehd2h89`, - }, - { - key: 'http.method', - type: 'String', - value: `POST`, - }, - { - key: 'http.status_code', - type: 'String', - value: `200`, - }, - ], - processID: '364afda25df92413', - flags: 0, - process: { - serviceName: 'lb', - tags: [], - }, - relativeStartTime: 0, - depth: 0, - hasChildren: false, - childSpanCount: 0, - warnings: [], - childSpanIds: [], - }, - { - traceID: '164afda25df92413', - spanID: '464afda25df92413', - operationName: 'HTTP Server', - serviceName: 'serviceC', - subsidiarilyReferencedBy: [], - startTime: 1675602037286989, - duration: 5685, - logs: [], - references: [], - tags: [ - { - key: 'http.url', - type: 'String', - value: `/v2/gamma/792edh2w897y2huehd2h89`, - }, - { - key: 'http.method', - type: 'String', - value: `POST`, - }, - { - key: 'http.status_code', - type: 'String', - value: `200`, - }, - ], - processID: '464afda25df92413', - flags: 0, - process: { - serviceName: 'db', - tags: [], - }, - relativeStartTime: 0, - depth: 0, - hasChildren: false, - childSpanCount: 0, - warnings: [], - childSpanIds: [], - }, - ], - traceID: '8bb35a31-eb64-512d-aaed-ddd61887bb2b', - traceName: 'serviceA: GET', - processes: { - '264afda25df92413': { - serviceName: 'serviceA', - tags: [], - }, - '364afda25df92413': { - serviceName: 'serviceB', - tags: [], - }, - '464afda25df92413': { - serviceName: 'serviceC', - tags: [], - }, - }, - duration: 2355515, - startTime: 1675605056289000, - endTime: 1675605058644515, -}; diff --git a/public/app/features/explore/TraceView/components/TracePageHeader/TracePageHeader.tsx b/public/app/features/explore/TraceView/components/TracePageHeader/TracePageHeader.tsx index 5bd331e9c62..8beaf187127 100644 --- a/public/app/features/explore/TraceView/components/TracePageHeader/TracePageHeader.tsx +++ b/public/app/features/explore/TraceView/components/TracePageHeader/TracePageHeader.tsx @@ -157,7 +157,7 @@ export const TracePageHeader = memo((props: TracePageHeaderProps) => { )} {method && method.length > 0 && ( <Tooltip - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings content="http.method" interactive={true} > @@ -168,7 +168,7 @@ export const TracePageHeader = memo((props: TracePageHeaderProps) => { )} {status && status.length > 0 && ( <Tooltip - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings content="http.status_code" interactive={true} > diff --git a/public/app/features/explore/TraceView/components/TracePageHeader/mocks.ts b/public/app/features/explore/TraceView/components/TracePageHeader/mocks.ts new file mode 100644 index 00000000000..337c1910e03 --- /dev/null +++ b/public/app/features/explore/TraceView/components/TracePageHeader/mocks.ts @@ -0,0 +1,128 @@ +export const trace = { + services: [{ name: 'serviceA', numberOfSpans: 1 }], + spans: [ + { + traceID: '164afda25df92413', + spanID: '264afda25df92413', + operationName: 'HTTP Client', + serviceName: 'serviceA', + subsidiarilyReferencedBy: [], + startTime: 1675602037286989, + duration: 5685, + logs: [], + references: [], + tags: [], + processID: '264afda25df92413', + flags: 0, + process: { + serviceName: 'lb', + tags: [], + }, + relativeStartTime: 0, + depth: 0, + hasChildren: false, + childSpanCount: 0, + warnings: [], + childSpanIds: [], + }, + { + traceID: '164afda25df92413', + spanID: '364afda25df92413', + operationName: 'HTTP Client', + serviceName: 'serviceB', + subsidiarilyReferencedBy: [], + startTime: 1675602037286989, + duration: 5685, + logs: [], + references: [], + tags: [ + { + key: 'http.url', + type: 'String', + value: `/v2/gamma/792edh2w897y2huehd2h89`, + }, + { + key: 'http.method', + type: 'String', + value: `POST`, + }, + { + key: 'http.status_code', + type: 'String', + value: `200`, + }, + ], + processID: '364afda25df92413', + flags: 0, + process: { + serviceName: 'lb', + tags: [], + }, + relativeStartTime: 0, + depth: 0, + hasChildren: false, + childSpanCount: 0, + warnings: [], + childSpanIds: [], + }, + { + traceID: '164afda25df92413', + spanID: '464afda25df92413', + operationName: 'HTTP Server', + serviceName: 'serviceC', + subsidiarilyReferencedBy: [], + startTime: 1675602037286989, + duration: 5685, + logs: [], + references: [], + tags: [ + { + key: 'http.url', + type: 'String', + value: `/v2/gamma/792edh2w897y2huehd2h89`, + }, + { + key: 'http.method', + type: 'String', + value: `POST`, + }, + { + key: 'http.status_code', + type: 'String', + value: `200`, + }, + ], + processID: '464afda25df92413', + flags: 0, + process: { + serviceName: 'db', + tags: [], + }, + relativeStartTime: 0, + depth: 0, + hasChildren: false, + childSpanCount: 0, + warnings: [], + childSpanIds: [], + }, + ], + traceID: '8bb35a31-eb64-512d-aaed-ddd61887bb2b', + traceName: 'serviceA: GET', + processes: { + '264afda25df92413': { + serviceName: 'serviceA', + tags: [], + }, + '364afda25df92413': { + serviceName: 'serviceB', + tags: [], + }, + '464afda25df92413': { + serviceName: 'serviceC', + tags: [], + }, + }, + duration: 2355515, + startTime: 1675605056289000, + endTime: 1675605058644515, +}; diff --git a/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanBarRow.tsx b/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanBarRow.tsx index 4e1ae5f44b3..09db59d0e01 100644 --- a/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanBarRow.tsx +++ b/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanBarRow.tsx @@ -39,7 +39,6 @@ const nameColumnClassName = 'nameColumn'; const getStyles = stylesFactory((theme: GrafanaTheme2, showSpanFilterMatchesOnly: boolean) => { const animations = { - label: 'flash', flash: keyframes` from { background-color: ${autoColor(theme, '#68b9ff')}; diff --git a/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/AccordianKeyValues.tsx b/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/AccordianKeyValues.tsx index f41478005d4..1932b8d2c96 100644 --- a/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/AccordianKeyValues.tsx +++ b/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/AccordianKeyValues.tsx @@ -20,10 +20,10 @@ import { GrafanaTheme2, TraceKeyValuePair } from '@grafana/data'; import { Icon, useStyles2 } from '@grafana/ui'; import { autoColor } from '../../Theme'; -import { TraceLink, TNil } from '../../types'; +import { TNil } from '../../types'; import * as markers from './AccordianKeyValues.markers'; -import KeyValuesTable from './KeyValuesTable'; +import KeyValuesTable, { KeyValuesTableLink } from './KeyValuesTable'; import { alignIcon } from '.'; @@ -94,7 +94,7 @@ export type AccordianKeyValuesProps = { interactive?: boolean; isOpen: boolean; label: string | React.ReactNode; - linksGetter?: ((pairs: TraceKeyValuePair[], index: number) => TraceLink[]) | TNil; + linksGetter?: ((pairs: TraceKeyValuePair[], index: number) => KeyValuesTableLink[]) | TNil; onToggle?: null | (() => void); }; diff --git a/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/AccordianLogs.tsx b/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/AccordianLogs.tsx index b9d2abaddb6..1de9660cbb6 100644 --- a/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/AccordianLogs.tsx +++ b/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/AccordianLogs.tsx @@ -16,13 +16,11 @@ import { css } from '@emotion/css'; import { sortBy as _sortBy } from 'lodash'; import * as React from 'react'; -import { GrafanaTheme2, TraceKeyValuePair, TraceLog } from '@grafana/data'; +import { GrafanaTheme2, TraceLog } from '@grafana/data'; import { Trans } from '@grafana/i18n'; import { Icon, useStyles2 } from '@grafana/ui'; import { autoColor } from '../../Theme'; -import { TNil } from '../../types'; -import { TraceLink } from '../../types/trace'; import { formatDuration } from '../utils'; import AccordianKeyValues from './AccordianKeyValues'; @@ -69,7 +67,6 @@ const getStyles = (theme: GrafanaTheme2) => { export type AccordianLogsProps = { interactive?: boolean; isOpen: boolean; - linksGetter?: ((pairs: TraceKeyValuePair[], index: number) => TraceLink[]) | TNil; logs: TraceLog[]; onItemToggle?: (log: TraceLog) => void; onToggle?: () => void; @@ -80,7 +77,6 @@ export type AccordianLogsProps = { export default function AccordianLogs({ interactive = true, isOpen, - linksGetter, logs, openedItems, onItemToggle, @@ -108,7 +104,11 @@ export default function AccordianLogs({ return ( <div className={styles.AccordianLogs}> <HeaderComponent className={styles.AccordianLogsHeader} {...headerProps}> - {arrow} <strong>Events</strong> ({logs.length}) + {arrow}{' '} + <strong> + <Trans i18nKey="explore.accordian-logs.events">Events</Trans> + </strong>{' '} + ({logs.length}) </HeaderComponent> {isOpen && ( <div className={styles.AccordianLogsContent}> @@ -134,7 +134,6 @@ export default function AccordianLogs({ interactive={interactive} isOpen={openedItems ? openedItems.has(log) : false} label={label} - linksGetter={linksGetter} onToggle={interactive && onItemToggle ? () => onItemToggle(log) : null} /> ); diff --git a/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/AccordianReferences.tsx b/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/AccordianReferences.tsx index 14f43d49676..a2949cdf9c4 100644 --- a/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/AccordianReferences.tsx +++ b/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/AccordianReferences.tsx @@ -176,7 +176,6 @@ export function References(props: ReferenceItemProps) { interactive={interactive} isOpen={openedItems ? openedItems.has(reference) : false} label={t('explore.references.label-attributes', 'attributes')} - linksGetter={null} onToggle={interactive && onItemToggle ? () => onItemToggle(reference) : null} /> </div> diff --git a/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/KeyValuesTable.test.tsx b/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/KeyValuesTable.test.tsx index ac89bdf22b7..f168569d8df 100644 --- a/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/KeyValuesTable.test.tsx +++ b/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/KeyValuesTable.test.tsx @@ -33,14 +33,12 @@ const setup = (propOverrides?: Partial<KeyValuesTableProps>) => { describe('LinkValue', () => { it('renders as expected', () => { - const title = 'titleValue'; - const href = 'hrefValue'; + const link = { + title: 'titleValue', + path: 'hrefValue', + }; const childrenText = 'childrenTextValue'; - render( - <LinkValue href={href} title={title}> - {childrenText} - </LinkValue> - ); + render(<LinkValue link={link}>{childrenText}</LinkValue>); expect(screen.getByRole('link', { name: 'titleValue' })).toBeInTheDocument(); expect(screen.getByText(/^childrenTextValue$/)).toBeInTheDocument(); }); @@ -73,8 +71,8 @@ describe('KeyValuesTable tests', () => { array[i].key === 'span.kind' ? [ { - url: `http://example.com/?kind=${encodeURIComponent(array[i].value)}`, - text: `More info about ${array[i].value}`, + path: `http://example.com/?kind=${encodeURIComponent(array[i].value)}`, + title: `More info about ${array[i].value}`, }, ] : [], diff --git a/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/KeyValuesTable.tsx b/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/KeyValuesTable.tsx index d6a3f1eca93..60c00367373 100644 --- a/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/KeyValuesTable.tsx +++ b/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/KeyValuesTable.tsx @@ -15,14 +15,13 @@ import { css } from '@emotion/css'; import cx from 'classnames'; import { PropsWithChildren } from 'react'; -import * as React from 'react'; -import { GrafanaTheme2, TraceKeyValuePair } from '@grafana/data'; +import { GrafanaTheme2, PluginExtensionLink, TraceKeyValuePair } from '@grafana/data'; import { Icon, useStyles2 } from '@grafana/ui'; import { autoColor } from '../../Theme'; import CopyIcon from '../../common/CopyIcon'; -import { TraceLink, TNil } from '../../types'; +import { TNil } from '../../types'; import jsonMarkup from './jsonMarkup'; @@ -57,6 +56,12 @@ export const getStyles = (theme: GrafanaTheme2) => { [`&:not(:hover) .${copyIconClassName}`]: { visibility: 'hidden', }, + 'a span': { + color: `${theme.colors.text.link} !important`, + }, + 'a:hover span': { + textDecoration: 'underline', + }, }), keyColumn: css({ label: 'keyColumn', @@ -94,23 +99,25 @@ function parseIfComplexJson(value: unknown) { return value; } +export type KeyValuesTableLink = Pick<PluginExtensionLink, 'path' | 'title' | 'onClick' | 'icon'>; + interface LinkValueProps { - href: string; - title?: string; - children: React.ReactNode; + link: KeyValuesTableLink; } -export const LinkValue = ({ href, title = '', children }: PropsWithChildren<LinkValueProps>) => { +export const LinkValue = ({ link, children }: PropsWithChildren<LinkValueProps>) => { + const { path, title = '', onClick, icon = 'external-link-alt' } = link; + return ( - <a href={href} title={title} target="_blank" rel="noopener noreferrer"> - {children} <Icon name="external-link-alt" /> + <a href={path} title={title} onClick={onClick} target="_blank" rel="noopener noreferrer"> + {children} <Icon name={icon} /> </a> ); }; export type KeyValuesTableProps = { data: TraceKeyValuePair[]; - linksGetter?: ((pairs: TraceKeyValuePair[], index: number) => TraceLink[]) | TNil; + linksGetter?: ((pairs: TraceKeyValuePair[], index: number) => KeyValuesTableLink[]) | TNil; }; export default function KeyValuesTable(props: KeyValuesTableProps) { @@ -125,15 +132,13 @@ export default function KeyValuesTable(props: KeyValuesTableProps) { __html: jsonMarkup(parseIfComplexJson(row.value)), }; const jsonTable = <div className={styles.jsonTable} dangerouslySetInnerHTML={markup} />; - const links = linksGetter ? linksGetter(data, i) : null; + const links = linksGetter?.(data, i); let valueMarkup; if (links && links.length) { // TODO: handle multiple items valueMarkup = ( <div> - <LinkValue href={links[0].url} title={links[0].text}> - {jsonTable} - </LinkValue> + <LinkValue link={links[0]}>{jsonTable}</LinkValue> </div> ); } else { diff --git a/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/index.test.tsx b/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/index.test.tsx index b326a7aee79..330b043ac82 100644 --- a/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/index.test.tsx +++ b/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/index.test.tsx @@ -76,6 +76,8 @@ describe('<SpanDetail>', () => { to: 1000000000000, }, }, + datasourceType: 'tempo', + datasourceUid: 'grafanacloud-traces', }; span.tags = [ @@ -258,4 +260,25 @@ describe('<SpanDetail>', () => { expect(screen.getByText(/(Count)/)).toBeInTheDocument(); }); }); + + it('should load plugin links for resource attributes', () => { + const usePluginLinksMock = jest.fn().mockReturnValue({ links: [] }); + setPluginLinksHook(usePluginLinksMock); + jest.requireMock('@grafana/runtime').usePluginLinks = usePluginLinksMock; + + render(<SpanDetail {...(props as unknown as SpanDetailProps)} />); + expect(usePluginLinksMock).toHaveBeenCalledWith( + expect.objectContaining({ + context: expect.objectContaining({ + attributes: expect.objectContaining({ + 'http.url': expect.arrayContaining([expect.any(String)]), + }), + datasource: { + type: 'tempo', + uid: 'grafanacloud-traces', + }, + }), + }) + ); + }); }); diff --git a/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/index.tsx b/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/index.tsx index c0294b1f06b..9ad1de2b701 100644 --- a/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/index.tsx +++ b/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/index.tsx @@ -15,6 +15,7 @@ import { css } from '@emotion/css'; import { SpanStatusCode } from '@opentelemetry/api'; import cx from 'classnames'; +import { useCallback, useMemo } from 'react'; import { CoreApp, @@ -25,9 +26,12 @@ import { TimeRange, TraceKeyValuePair, TraceLog, + PluginExtensionResourceAttributesContext, + PluginExtensionPoints, } from '@grafana/data'; import { Trans, useTranslate } from '@grafana/i18n'; import { TraceToProfilesOptions } from '@grafana/o11y-ds-frontend'; +import { usePluginLinks } from '@grafana/runtime'; import { TimeZone } from '@grafana/schema'; import { Divider, Icon, TextArea, useStyles2 } from '@grafana/ui'; @@ -35,8 +39,8 @@ import { pyroscopeProfileIdTagKey } from '../../../createSpanLink'; import { autoColor } from '../../Theme'; import LabeledList from '../../common/LabeledList'; import { KIND, LIBRARY_NAME, LIBRARY_VERSION, STATUS, STATUS_MESSAGE, TRACE_STATE } from '../../constants/span'; -import { SpanLinkFunc, TNil } from '../../types'; -import { TraceLink, TraceSpan, TraceSpanReference } from '../../types/trace'; +import { SpanLinkFunc } from '../../types'; +import { TraceProcess, TraceSpan, TraceSpanReference } from '../../types/trace'; import { formatDuration } from '../utils'; import AccordianKeyValues from './AccordianKeyValues'; @@ -47,6 +51,44 @@ import DetailState from './DetailState'; import { getSpanDetailLinkButtons } from './SpanDetailLinkButtons'; import SpanFlameGraph from './SpanFlameGraph'; +const useResourceAttributesExtensionLinks = (process: TraceProcess, datasourceType: string, datasourceUid: string) => { + // Stable context for useMemo inside usePluginLinks + const context: PluginExtensionResourceAttributesContext = useMemo(() => { + const attributes = (process.tags ?? []).reduce<Record<string, string[]>>((acc, tag) => { + if (acc[tag.key]) { + acc[tag.key].push(tag.value); + } else { + acc[tag.key] = [tag.value]; + } + return acc; + }, {}); + + return { + attributes, + datasource: { + type: datasourceType, + uid: datasourceUid, + }, + }; + }, [process.tags, datasourceType, datasourceUid]); + + const { links } = usePluginLinks({ + extensionPointId: PluginExtensionPoints.TraceViewResourceAttributes, + limitPerPlugin: 10, + context, + }); + + const resourceLinksGetter = useCallback( + (pairs: TraceKeyValuePair[], index: number) => { + const { key } = pairs[index] ?? {}; + return links.filter((link) => link.category === key); + }, + [links] + ); + + return resourceLinksGetter; +}; + const getStyles = (theme: GrafanaTheme2) => { return { header: css({ @@ -145,7 +187,6 @@ export type TraceFlameGraphs = { export type SpanDetailProps = { detailState: DetailState; - linksGetter: ((links: TraceKeyValuePair[], index: number) => TraceLink[]) | TNil; logItemToggle: (spanID: string, log: TraceLog) => void; logsToggle: (spanID: string) => void; processToggle: (spanID: string) => void; @@ -164,6 +205,7 @@ export type SpanDetailProps = { focusedSpanId?: string; createFocusSpanLink: (traceId: string, spanId: string) => LinkModel; datasourceType: string; + datasourceUid: string; traceFlameGraphs: TraceFlameGraphs; setTraceFlameGraphs: (flameGraphs: TraceFlameGraphs) => void; setRedrawListView: (redraw: {}) => void; @@ -174,7 +216,6 @@ export type SpanDetailProps = { export default function SpanDetail(props: SpanDetailProps) { const { detailState, - linksGetter, logItemToggle, logsToggle, processToggle, @@ -190,6 +231,7 @@ export default function SpanDetail(props: SpanDetailProps) { createSpanLink, createFocusSpanLink, datasourceType, + datasourceUid, traceFlameGraphs, setTraceFlameGraphs, traceToProfilesOptions, @@ -219,28 +261,29 @@ export default function SpanDetail(props: SpanDetailProps) { references, stackTraces, } = span; + const { t } = useTranslate(); const { timeZone } = props; let overviewItems = [ { key: 'svc', - label: 'Service:', + label: t('explore.span-detail.overview-items.label.service', 'Service:'), value: process.serviceName, }, { key: 'duration', - label: 'Duration:', + label: t('explore.span-detail.overview-items.label.duration', 'Duration:'), value: formatDuration(duration), }, { key: 'start', - label: 'Start Time:', + label: t('explore.span-detail.overview-items.label.start-time', 'Start Time:'), value: formatDuration(relativeStartTime) + getAbsoluteTime(startTime, timeZone), }, ...(span.childSpanCount > 0 ? [ { key: 'child_count', - label: 'Child Count:', + label: t('explore.span-detail.overview-items.label.child-count', 'Child Count:'), value: span.childSpanCount, }, ] @@ -248,46 +291,45 @@ export default function SpanDetail(props: SpanDetailProps) { ]; const styles = useStyles2(getStyles); - const { t } = useTranslate(); if (span.kind) { overviewItems.push({ key: KIND, - label: 'Kind:', + label: t('explore.span-detail.label.kind', 'Kind:'), value: span.kind, }); } if (span.statusCode !== undefined) { overviewItems.push({ key: STATUS, - label: 'Status:', + label: t('explore.span-detail.label.status', 'Status:'), value: SpanStatusCode[span.statusCode].toLowerCase(), }); } if (span.statusMessage) { overviewItems.push({ key: STATUS_MESSAGE, - label: 'Status Message:', + label: t('explore.span-detail.label.status-message', 'Status Message:'), value: span.statusMessage, }); } if (span.instrumentationLibraryName) { overviewItems.push({ key: LIBRARY_NAME, - label: 'Library Name:', + label: t('explore.span-detail.label.library-name', 'Library Name:'), value: span.instrumentationLibraryName, }); } if (span.instrumentationLibraryVersion) { overviewItems.push({ key: LIBRARY_VERSION, - label: 'Library Version:', + label: t('explore.span-detail.label.library-version', 'Library Version:'), value: span.instrumentationLibraryVersion, }); } if (span.traceState) { overviewItems.push({ key: TRACE_STATE, - label: 'Trace State:', + label: t('explore.span-detail.label.trace-state', 'Trace State:'), value: span.traceState, }); } @@ -302,6 +344,8 @@ export default function SpanDetail(props: SpanDetailProps) { }); const focusSpanLink = createFocusSpanLink(traceID, spanID); + const resourceLinksGetter = useResourceAttributesExtensionLinks(process, datasourceType, datasourceUid); + return ( <div data-testid="span-detail-component"> <div className={styles.header}> @@ -319,7 +363,6 @@ export default function SpanDetail(props: SpanDetailProps) { <AccordianKeyValues data={tags} label={t('explore.span-detail.label-span-attributes', 'Span attributes')} - linksGetter={linksGetter} isOpen={isTagsOpen} onToggle={() => tagsToggle(spanID)} /> @@ -328,7 +371,7 @@ export default function SpanDetail(props: SpanDetailProps) { className={styles.AccordianKeyValuesItem} data={process.tags} label={t('explore.span-detail.label-resource-attributes', 'Resource attributes')} - linksGetter={linksGetter} + linksGetter={resourceLinksGetter} isOpen={isProcessOpen} onToggle={() => processToggle(spanID)} /> @@ -336,7 +379,6 @@ export default function SpanDetail(props: SpanDetailProps) { </div> {logs && logs.length > 0 && ( <AccordianLogs - linksGetter={linksGetter} logs={logs} isOpen={logsState.isOpen} openedItems={logsState.openedItems} diff --git a/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetailRow.tsx b/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetailRow.tsx index e8b8c3b4000..051fecb2e6b 100644 --- a/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetailRow.tsx +++ b/public/app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetailRow.tsx @@ -16,14 +16,14 @@ import { css } from '@emotion/css'; import classNames from 'classnames'; import { PureComponent } from 'react'; -import { CoreApp, GrafanaTheme2, LinkModel, TimeRange, TraceKeyValuePair, TraceLog } from '@grafana/data'; +import { CoreApp, GrafanaTheme2, LinkModel, TimeRange, TraceLog } from '@grafana/data'; import { TraceToProfilesOptions } from '@grafana/o11y-ds-frontend'; import { TimeZone } from '@grafana/schema'; import { Button, clearButtonStyles, stylesFactory, withTheme2 } from '@grafana/ui'; import { autoColor } from '../Theme'; import { SpanLinkFunc } from '../types'; -import { TraceSpan, TraceLink, TraceSpanReference } from '../types/trace'; +import { TraceSpan, TraceSpanReference } from '../types/trace'; import SpanDetail, { TraceFlameGraphs } from './SpanDetail'; import DetailState from './SpanDetail/DetailState'; @@ -76,7 +76,6 @@ export type SpanDetailRowProps = { columnDivision: number; detailState: DetailState; onDetailToggled: (spanID: string) => void; - linksGetter: (span: TraceSpan, links: TraceKeyValuePair[], index: number) => TraceLink[]; logItemToggle: (spanID: string, log: TraceLog) => void; logsToggle: (spanID: string) => void; processToggle: (spanID: string) => void; @@ -99,6 +98,7 @@ export type SpanDetailRowProps = { focusedSpanId?: string; createFocusSpanLink: (traceId: string, spanId: string) => LinkModel; datasourceType: string; + datasourceUid: string; visibleSpanIds: string[]; traceFlameGraphs: TraceFlameGraphs; setTraceFlameGraphs: (flameGraphs: TraceFlameGraphs) => void; @@ -112,11 +112,6 @@ export class UnthemedSpanDetailRow extends PureComponent<SpanDetailRowProps> { this.props.onDetailToggled(this.props.span.spanID); }; - _linksGetter = (items: TraceKeyValuePair[], itemIndex: number) => { - const { linksGetter, span } = this.props; - return linksGetter(span, items, itemIndex); - }; - render() { const { color, @@ -144,6 +139,7 @@ export class UnthemedSpanDetailRow extends PureComponent<SpanDetailRowProps> { focusedSpanId, createFocusSpanLink, datasourceType, + datasourceUid, visibleSpanIds, traceFlameGraphs, setTraceFlameGraphs, @@ -175,7 +171,6 @@ export class UnthemedSpanDetailRow extends PureComponent<SpanDetailRowProps> { <div className={styles.infoWrapper} style={{ borderTopColor: color }}> <SpanDetail detailState={detailState} - linksGetter={this._linksGetter} logItemToggle={logItemToggle} logsToggle={logsToggle} processToggle={processToggle} @@ -194,6 +189,7 @@ export class UnthemedSpanDetailRow extends PureComponent<SpanDetailRowProps> { focusedSpanId={focusedSpanId} createFocusSpanLink={createFocusSpanLink} datasourceType={datasourceType} + datasourceUid={datasourceUid} traceFlameGraphs={traceFlameGraphs} setTraceFlameGraphs={setTraceFlameGraphs} setRedrawListView={setRedrawListView} diff --git a/public/app/features/explore/TraceView/components/TraceTimelineViewer/VirtualizedTraceView.tsx b/public/app/features/explore/TraceView/components/TraceTimelineViewer/VirtualizedTraceView.tsx index 4e9fe6c0b98..22124159efb 100644 --- a/public/app/features/explore/TraceView/components/TraceTimelineViewer/VirtualizedTraceView.tsx +++ b/public/app/features/explore/TraceView/components/TraceTimelineViewer/VirtualizedTraceView.tsx @@ -18,7 +18,7 @@ import memoizeOne from 'memoize-one'; import * as React from 'react'; import { RefObject } from 'react'; -import { CoreApp, GrafanaTheme2, LinkModel, TimeRange, TraceKeyValuePair, TraceLog } from '@grafana/data'; +import { CoreApp, GrafanaTheme2, LinkModel, TimeRange, TraceLog } from '@grafana/data'; import { t } from '@grafana/i18n/internal'; import { TraceToProfilesOptions } from '@grafana/o11y-ds-frontend'; import { config, reportInteraction } from '@grafana/runtime'; @@ -28,7 +28,7 @@ import { stylesFactory, withTheme2, ToolbarButton } from '@grafana/ui'; import { PEER_SERVICE } from '../constants/tag-keys'; import { CriticalPathSection, SpanBarOptions, SpanLinkFunc, TNil } from '../types'; import TTraceTimeline from '../types/TTraceTimeline'; -import { TraceSpan, Trace, TraceLink, TraceSpanReference } from '../types/trace'; +import { TraceSpan, Trace, TraceSpanReference } from '../types/trace'; import { getColorByKey } from '../utils/color-generator'; import ListView from './ListView'; @@ -79,7 +79,6 @@ type TVirtualizedTraceViewOwnProps = { trace: Trace; traceToProfilesOptions?: TraceToProfilesOptions; spanBarOptions: SpanBarOptions | undefined; - linksGetter: (span: TraceSpan, items: TraceKeyValuePair[], itemIndex: number) => TraceLink[]; childrenToggle: (spanID: string) => void; detailLogItemToggle: (spanID: string, log: TraceLog) => void; detailLogsToggle: (spanID: string) => void; @@ -104,6 +103,7 @@ type TVirtualizedTraceViewOwnProps = { createFocusSpanLink: (traceId: string, spanId: string) => LinkModel; topOfViewRef?: RefObject<HTMLDivElement>; datasourceType: string; + datasourceUid: string; headerHeight: number; criticalPath: CriticalPathSection[]; traceFlameGraphs: TraceFlameGraphs; @@ -551,12 +551,12 @@ export class UnthemedVirtualizedTraceView extends React.Component<VirtualizedTra hoverIndentGuideIds, addHoverIndentGuideId, removeHoverIndentGuideId, - linksGetter, createSpanLink, focusedSpanId, createFocusSpanLink, theme, datasourceType, + datasourceUid, traceFlameGraphs, setTraceFlameGraphs, setRedrawListView, @@ -577,7 +577,6 @@ export class UnthemedVirtualizedTraceView extends React.Component<VirtualizedTra columnDivision={spanNameColumnWidth} onDetailToggled={detailToggle} detailState={detailState} - linksGetter={linksGetter} logItemToggle={detailLogItemToggle} logsToggle={detailLogsToggle} processToggle={detailProcessToggle} @@ -599,6 +598,7 @@ export class UnthemedVirtualizedTraceView extends React.Component<VirtualizedTra focusedSpanId={focusedSpanId} createFocusSpanLink={createFocusSpanLink} datasourceType={datasourceType} + datasourceUid={datasourceUid} visibleSpanIds={visibleSpanIds} traceFlameGraphs={traceFlameGraphs} setTraceFlameGraphs={setTraceFlameGraphs} diff --git a/public/app/features/explore/TraceView/components/TraceTimelineViewer/index.tsx b/public/app/features/explore/TraceView/components/TraceTimelineViewer/index.tsx index 25885c1b0f7..e2840a15db2 100644 --- a/public/app/features/explore/TraceView/components/TraceTimelineViewer/index.tsx +++ b/public/app/features/explore/TraceView/components/TraceTimelineViewer/index.tsx @@ -15,7 +15,7 @@ import { css } from '@emotion/css'; import { PureComponent, RefObject } from 'react'; -import { CoreApp, GrafanaTheme2, LinkModel, TimeRange, TraceKeyValuePair, TraceLog } from '@grafana/data'; +import { CoreApp, GrafanaTheme2, LinkModel, TimeRange, TraceLog } from '@grafana/data'; import { SpanBarOptions, TraceToProfilesOptions } from '@grafana/o11y-ds-frontend'; import { config, reportInteraction } from '@grafana/runtime'; import { TimeZone } from '@grafana/schema'; @@ -25,7 +25,7 @@ import { autoColor } from '../Theme'; import { merge as mergeShortcuts } from '../keyboard-shortcuts'; import { CriticalPathSection, SpanLinkFunc, TNil } from '../types'; import TTraceTimeline from '../types/TTraceTimeline'; -import { TraceSpan, Trace, TraceLink, TraceSpanReference } from '../types/trace'; +import { TraceSpan, Trace, TraceSpanReference } from '../types/trace'; import { TraceFlameGraphs } from './SpanDetail'; import TimelineHeaderRow from './TimelineHeaderRow'; @@ -72,6 +72,7 @@ export type TProps = { trace: Trace; traceToProfilesOptions?: TraceToProfilesOptions; datasourceType: string; + datasourceUid: string; spanBarOptions: SpanBarOptions | undefined; updateNextViewRangeTime: (update: ViewRangeTimeUpdate) => void; updateViewRangeTime: TUpdateViewRangeTimeFunction; @@ -96,7 +97,6 @@ export type TProps = { detailToggle: (spanID: string) => void; addHoverIndentGuideId: (spanID: string) => void; removeHoverIndentGuideId: (spanID: string) => void; - linksGetter: (span: TraceSpan, items: TraceKeyValuePair[], itemIndex: number) => TraceLink[]; theme: GrafanaTheme2; createSpanLink?: SpanLinkFunc; scrollElement?: Element; @@ -222,6 +222,7 @@ export class UnthemedTraceTimelineViewer extends PureComponent<TProps, State> { topOfViewRef={topOfViewRef} focusedSpanIdForSearch={focusedSpanIdForSearch} datasourceType={this.props.datasourceType} + datasourceUid={this.props.datasourceUid} /> </div> ); diff --git a/public/app/features/explore/TraceView/createSpanLink.tsx b/public/app/features/explore/TraceView/createSpanLink.tsx index 4fcee73d48f..b5aa0505458 100644 --- a/public/app/features/explore/TraceView/createSpanLink.tsx +++ b/public/app/features/explore/TraceView/createSpanLink.tsx @@ -13,6 +13,7 @@ import { TimeRange, } from '@grafana/data'; import { useTranslate } from '@grafana/i18n'; +import { t } from '@grafana/i18n/internal'; import { TraceToProfilesOptions, TraceToMetricsOptions, @@ -216,7 +217,7 @@ function legacyCreateSpanLinkFactory( scopedVars = { ...scopedVars, __tags: { - text: 'Tags', + text: t('explore.legacy-create-span-link-factory.text.tags', 'Tags'), value: tags, }, }; @@ -247,7 +248,7 @@ function legacyCreateSpanLinkFactory( links.push({ href: link.href, - title: 'Related logs', + title: t('explore.legacy-create-span-link-factory.title.related-logs', 'Related logs'), onClick: link.onClick, content: ( <Icon @@ -292,7 +293,7 @@ function legacyCreateSpanLinkFactory( scopedVars = { ...scopedVars, __tags: { - text: 'Tags', + text: t('explore.legacy-create-span-link-factory.text.tags', 'Tags'), value: getFormattedTags(span, tagsToUse), }, }; @@ -375,7 +376,7 @@ function legacyCreateSpanLinkFactory( const feO11yLink = getLinkForFeO11y(span); if (feO11yLink) { links.push({ - title: 'Session for this span', + title: t('explore.legacy-create-span-link-factory.title.session-for-this-span', 'Session for this span'), href: feO11yLink, content: ( <Icon @@ -646,7 +647,7 @@ function getTimeRangeFromSpan( export function scopedVarsFromTrace(duration: number, name: string, traceId: string): ScopedVars { return { __trace: { - text: 'Trace', + text: t('explore.scoped-vars-from-trace.text.trace', 'Trace'), value: { duration, name, @@ -674,7 +675,7 @@ export function scopedVarsFromSpan(span: TraceSpan): ScopedVars { return { __span: { - text: 'Span', + text: t('explore.scoped-vars-from-span.text.span', 'Span'), value: { spanId: span.spanID, traceId: span.traceID, @@ -704,7 +705,7 @@ export function scopedVarsFromTags( tags = { __tags: { - text: 'Tags', + text: t('explore.scoped-vars-from-tags.text.tags', 'Tags'), value: getFormattedTags(span, profileTags), }, }; diff --git a/public/app/features/explore/extensions/AddToDashboard/addToDashboard.ts b/public/app/features/explore/extensions/AddToDashboard/addToDashboard.ts index db647d4b1eb..47e04c60a1a 100644 --- a/public/app/features/explore/extensions/AddToDashboard/addToDashboard.ts +++ b/public/app/features/explore/extensions/AddToDashboard/addToDashboard.ts @@ -1,4 +1,5 @@ import { DataFrame, ExplorePanelsState } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { DataQuery, DataSourceRef, Panel } from '@grafana/schema'; import { DataTransformerConfig } from '@grafana/schema/dist/esm/raw/dashboard/x/dashboard_types.gen'; import { ExplorePanelData } from 'app/types'; @@ -65,7 +66,7 @@ export function buildDashboardPanelFromExploreState(options: ExploreToDashboardP //@ts-ignore targets: options.queries, type: panelType, - title: 'New Panel', + title: t('explore.build-dashboard-panel-from-explore-state.title.new-panel', 'New Panel'), gridPos: { x: 0, y: 0, w: 12, h: 8 }, datasource: options.datasource, transformations: getLogsTableTransformations(panelType, options), diff --git a/public/app/features/explore/extensions/getExploreExtensionConfigs.tsx b/public/app/features/explore/extensions/getExploreExtensionConfigs.tsx index 4ad812d2e5a..9be348955cf 100644 --- a/public/app/features/explore/extensions/getExploreExtensionConfigs.tsx +++ b/public/app/features/explore/extensions/getExploreExtensionConfigs.tsx @@ -16,6 +16,8 @@ export function getExploreExtensionConfigs(): PluginExtensionAddedLinkConfig[] { try { return [ createAddedLinkConfig<PluginExtensionExploreContext>({ + // This is called at the top level, so will break if we add a translation here 😱 + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings title: 'Add to dashboard', description: 'Use the query and panel from explore and create/add it to a dashboard', targets: [PluginExtensionPoints.ExploreToolbarAction], @@ -41,7 +43,10 @@ export function getExploreExtensionConfigs(): PluginExtensionAddedLinkConfig[] { }, }), createAddedLinkConfig<PluginExtensionExploreContext>({ + // This is called at the top level, so will break if we add a translation here 😱 + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings title: 'Add correlation', + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings description: 'Create a correlation from this query', targets: [PluginExtensionPoints.ExploreToolbarAction], icon: 'link', diff --git a/public/app/features/explore/state/query.test.ts b/public/app/features/explore/state/query.test.ts index a3e55f10d80..2d4b4e7375e 100644 --- a/public/app/features/explore/state/query.test.ts +++ b/public/app/features/explore/state/query.test.ts @@ -28,7 +28,6 @@ import { makeLogs } from '../__mocks__/makeLogs'; import { supplementaryQueryTypes } from '../utils/supplementaryQueries'; import { saveCorrelationsAction } from './explorePane'; -import { createDefaultInitialState } from './helpers'; import { addQueryRowAction, addResultsToCache, @@ -50,6 +49,7 @@ import { changeQueries, } from './query'; import * as actions from './query'; +import { createDefaultInitialState } from './testHelpers'; import { makeExplorePaneState } from './utils'; jest.mock('app/features/logs/logsModel'); @@ -232,7 +232,7 @@ describe('runQueries', () => { }); /* the next two tests are for ensuring the query datasource's filterQuery function stops queries - from being saved to rich history. We do that by setting a fake datasource in this test (datasources[0]) + from being saved to rich history. We do that by setting a fake datasource in this test (datasources[0]) to filter queries off their key value datasources[1] does not have filterQuery defined diff --git a/public/app/features/explore/state/selectors.test.ts b/public/app/features/explore/state/selectors.test.ts index 8fda241937b..7e3bd990fe1 100644 --- a/public/app/features/explore/state/selectors.test.ts +++ b/public/app/features/explore/state/selectors.test.ts @@ -3,8 +3,8 @@ import { DataQuery } from '@grafana/schema/dist/esm/index'; import { configureStore } from 'app/store/configureStore'; import { StoreState, ThunkDispatch } from 'app/types'; -import { createDefaultInitialState } from './helpers'; import { selectExploreDSMaps } from './selectors'; +import { createDefaultInitialState } from './testHelpers'; const { defaultInitialState } = createDefaultInitialState(); diff --git a/public/app/features/explore/state/helpers.ts b/public/app/features/explore/state/testHelpers.ts similarity index 100% rename from public/app/features/explore/state/helpers.ts rename to public/app/features/explore/state/testHelpers.ts diff --git a/public/app/features/explore/state/time.test.ts b/public/app/features/explore/state/time.test.ts index 09430fd0143..1a382acbf17 100644 --- a/public/app/features/explore/state/time.test.ts +++ b/public/app/features/explore/state/time.test.ts @@ -4,7 +4,7 @@ import { dateTime } from '@grafana/data'; import { configureStore } from 'app/store/configureStore'; import { ExploreItemState } from 'app/types'; -import { createDefaultInitialState } from './helpers'; +import { createDefaultInitialState } from './testHelpers'; import { changeRangeAction, timeReducer, updateTime } from './time'; const mockTimeSrv = { diff --git a/public/app/features/explore/utils/links.ts b/public/app/features/explore/utils/links.ts index 349468b0cca..33d97af4300 100644 --- a/public/app/features/explore/utils/links.ts +++ b/public/app/features/explore/utils/links.ts @@ -21,6 +21,7 @@ import { urlUtil, DataFrameType, } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { getTemplateSrv, reportInteraction, VariableInterpolation } from '@grafana/runtime'; import { DataQuery } from '@grafana/schema'; import { contextSrv } from 'app/core/services/context_srv'; @@ -118,7 +119,7 @@ export const getFieldLinksForExplore = (options: { value: { raw: field.values[rowIndex], }, - text: 'Raw value', + text: t('explore.get-field-links-for-explore.text.raw-value', 'Raw value'), }; let fieldDisplayValuesProxy: Record<string, DisplayValue> | undefined = undefined; @@ -136,7 +137,7 @@ export const getFieldLinksForExplore = (options: { refId: dataFrame.refId, fields: fieldDisplayValuesProxy, }, - text: 'Data', + text: t('explore.get-field-links-for-explore.text.data', 'Data'), }; if (dataFrame.meta?.type === DataFrameType.LogLines) { diff --git a/public/app/features/folders/state/navModel.ts b/public/app/features/folders/state/navModel.ts index b0ee7fd7a34..5aa48d81b22 100644 --- a/public/app/features/folders/state/navModel.ts +++ b/public/app/features/folders/state/navModel.ts @@ -69,7 +69,7 @@ export function getLoadingNav(tabIndex: number): NavModel { updatedBy: '', id: 1, uid: 'loading', - title: 'Loading', + title: t('folders.get-loading-nav.main.title.loading', 'Loading'), url: 'url', canSave: true, canEdit: true, diff --git a/public/app/features/gops/configuration-tracker/irmHooks.ts b/public/app/features/gops/configuration-tracker/irmHooks.ts index eee6e23feee..1db434d404f 100644 --- a/public/app/features/gops/configuration-tracker/irmHooks.ts +++ b/public/app/features/gops/configuration-tracker/irmHooks.ts @@ -1,5 +1,6 @@ import { useMemo } from 'react'; +import { t } from '@grafana/i18n/internal'; import { locationService } from '@grafana/runtime'; import { useGrafanaContactPoints } from 'app/features/alerting/unified/components/contact-points/useContactPoints'; import { useNotificationPolicyRoute } from 'app/features/alerting/unified/components/notification-policies/useNotificationPolicyRoute'; @@ -129,7 +130,10 @@ export function useGetEssentialsConfiguration(): EssentialsConfigurationData { function getGrafanaAlertingConfigSteps(): SectionDtoStep[] { let steps: SectionDtoStep[] = [ { - title: 'Update default contact point', + title: t( + 'gops.use-get-essentials-configuration.get-grafana-alerting-config-steps.steps.title.update-default-contact-point', + 'Update default contact point' + ), description: 'Update the default contact point to a method other than the example email address.', button: { type: 'openLink', @@ -137,7 +141,7 @@ export function useGetEssentialsConfiguration(): EssentialsConfigurationData { url: `/alerting/notifications`, queryParams: { search: defaultContactpoint, alertmanager: 'grafana' }, }, - label: 'Edit', + label: t('gops.use-get-essentials-configuration.get-grafana-alerting-config-steps.steps.label.edit', 'Edit'), labelOnDone: 'View', urlLinkOnDone: { url: `/alerting/notifications`, @@ -151,14 +155,23 @@ export function useGetEssentialsConfiguration(): EssentialsConfigurationData { steps = [ ...steps, { - title: 'Connect alerting to OnCall', - description: 'Create an OnCall integration for an alerting contact point.', + title: t( + 'gops.use-get-essentials-configuration.get-grafana-alerting-config-steps.title.connect-alerting-to-on-call', + 'Connect alerting to OnCall' + ), + description: t( + 'gops.use-get-essentials-configuration.get-grafana-alerting-config-steps.description.create-on-call-integration-alerting-contact-point', + 'Create an OnCall integration for an alerting contact point.' + ), button: { type: 'openLink', urlLink: { url: '/alerting/notifications/receivers/new', }, - label: 'Connect', + label: t( + 'gops.use-get-essentials-configuration.get-grafana-alerting-config-steps.label.connect', + 'Connect' + ), urlLinkOnDone: { url: '/alerting/notifications', }, @@ -172,14 +185,20 @@ export function useGetEssentialsConfiguration(): EssentialsConfigurationData { steps = [ ...steps, { - title: 'Create alert rule', - description: 'Create an alert rule to monitor your system.', + title: t( + 'gops.use-get-essentials-configuration.get-grafana-alerting-config-steps.title.create-alert-rule', + 'Create alert rule' + ), + description: t( + 'gops.use-get-essentials-configuration.get-grafana-alerting-config-steps.description.create-alert-monitor-system', + 'Create an alert rule to monitor your system.' + ), button: { type: 'openLink', urlLink: { url: '/alerting/new', }, - label: 'Create', + label: t('gops.use-get-essentials-configuration.get-grafana-alerting-config-steps.label.create', 'Create'), urlLinkOnDone: { url: '/alerting/list', }, @@ -188,14 +207,20 @@ export function useGetEssentialsConfiguration(): EssentialsConfigurationData { done: isCreateAlertRuleDone, }, { - title: 'Create SLO', - description: 'Create SLOs to monitor your service.', + title: t( + 'gops.use-get-essentials-configuration.get-grafana-alerting-config-steps.title.create-slo', + 'Create SLO' + ), + description: t( + 'gops.use-get-essentials-configuration.get-grafana-alerting-config-steps.description.create-slos-to-monitor-your-service', + 'Create SLOs to monitor your service.' + ), button: { type: 'openLink', urlLink: { url: '/a/grafana-slo-app/wizard/new', }, - label: 'Create', + label: t('gops.use-get-essentials-configuration.get-grafana-alerting-config-steps.label.create', 'Create'), urlLinkOnDone: { url: '/a/grafana-slo-app/manage-slos', }, @@ -204,7 +229,10 @@ export function useGetEssentialsConfiguration(): EssentialsConfigurationData { done: hasSlo, }, { - title: 'Enable SLO alerting', + title: t( + 'gops.use-get-essentials-configuration.get-grafana-alerting-config-steps.title.enable-slo-alerting', + 'Enable SLO alerting' + ), description: 'Configure SLO alerting to receive notifications when your SLOs are breached.', button: { type: 'openLink', @@ -212,7 +240,7 @@ export function useGetEssentialsConfiguration(): EssentialsConfigurationData { queryParams: { alertsEnabled: 'disabled' }, url: '/a/grafana-slo-app/manage-slos', }, - label: 'Enable', + label: t('gops.use-get-essentials-configuration.get-grafana-alerting-config-steps.label.enable', 'Enable'), urlLinkOnDone: { queryParams: { alertsEnabled: 'enabled' }, url: '/a/grafana-slo-app/manage-slos', @@ -229,24 +257,33 @@ export function useGetEssentialsConfiguration(): EssentialsConfigurationData { const essentialContent: SectionsDto = { sections: [ { - title: 'Detect', - description: 'Configure Grafana Alerting', + title: t('gops.use-get-essentials-configuration.essential-content.title.detect', 'Detect'), + description: t( + 'gops.use-get-essentials-configuration.essential-content.description.configure-grafana-alerting', + 'Configure Grafana Alerting' + ), steps: getGrafanaAlertingConfigSteps(), }, { - title: 'Respond', + title: t('gops.use-get-essentials-configuration.essential-content.title.respond', 'Respond'), description: getIsIrmPluginPresent() ? 'Configure IRM' : 'Configure OnCall and Incident', steps: getIsIrmPluginPresent() ? [ { - title: 'Connect alerting to IRM', - description: 'Create an IRM integration for an alerting contact point.', + title: t( + 'gops.use-get-essentials-configuration.essential-content.title.connect-alerting-to-irm', + 'Connect alerting to IRM' + ), + description: t( + 'gops.use-get-essentials-configuration.essential-content.description.create-integration-alerting-contact-point', + 'Create an IRM integration for an alerting contact point.' + ), button: { type: 'openLink', urlLink: { url: '/alerting/notifications/receivers/new', }, - label: 'Connect', + label: t('gops.use-get-essentials-configuration.essential-content.label.connect', 'Connect'), urlLinkOnDone: { url: '/alerting/notifications', }, @@ -255,7 +292,10 @@ export function useGetEssentialsConfiguration(): EssentialsConfigurationData { done: isOnCallContactPointReady(contactPoints), }, { - title: 'Connect IRM to your Slack workspace', + title: t( + 'gops.use-get-essentials-configuration.essential-content.title.connect-irm-to-your-slack-workspace', + 'Connect IRM to your Slack workspace' + ), description: 'Receive alerts and oncall notifications, or automatically create an incident channel and manage incidents directly within your chat environment.', button: { @@ -263,7 +303,7 @@ export function useGetEssentialsConfiguration(): EssentialsConfigurationData { urlLink: { url: `/a/${getIrmIfPresentOrIncidentPluginId()}/integrations/apps/grate.irm.slack`, }, - label: 'Connect', + label: t('gops.use-get-essentials-configuration.essential-content.label.connect', 'Connect'), urlLinkOnDone: { url: `/a/${getIrmIfPresentOrIncidentPluginId()}/integrations`, }, @@ -271,14 +311,20 @@ export function useGetEssentialsConfiguration(): EssentialsConfigurationData { done: isChatOpsInstalled, }, { - title: 'Add Slack notifications to IRM integrations', - description: 'Select ChatOps channels to route notifications', + title: t( + 'gops.use-get-essentials-configuration.essential-content.title.add-slack-notifications-to-irm-integrations', + 'Add Slack notifications to IRM integrations' + ), + description: t( + 'gops.use-get-essentials-configuration.essential-content.description.select-chat-ops-channels-to-route-notifications', + 'Select ChatOps channels to route notifications' + ), button: { type: 'openLink', urlLink: { url: `/a/${getIrmIfPresentOrOnCallPluginId()}/integrations/`, }, - label: 'Add', + label: t('gops.use-get-essentials-configuration.essential-content.label.add', 'Add'), urlLinkOnDone: { url: `/a/${getIrmIfPresentOrOnCallPluginId()}/integrations/`, }, @@ -289,14 +335,20 @@ export function useGetEssentialsConfiguration(): EssentialsConfigurationData { ] : [ { - title: 'Initialize Incident plugin', - description: 'Initialize the Incident plugin to declare and manage incidents.', + title: t( + 'gops.use-get-essentials-configuration.essential-content.title.initialize-incident-plugin', + 'Initialize Incident plugin' + ), + description: t( + 'gops.use-get-essentials-configuration.essential-content.description.initialize-incident-plugin-declare-manage-incidents', + 'Initialize the Incident plugin to declare and manage incidents.' + ), button: { type: 'openLink', urlLink: { url: `/a/${getIrmIfPresentOrIncidentPluginId()}/walkthrough/generate-key`, }, - label: 'Initialize', + label: t('gops.use-get-essentials-configuration.essential-content.label.initialize', 'Initialize'), urlLinkOnDone: { url: `/a/${getIrmIfPresentOrIncidentPluginId()}`, }, @@ -305,15 +357,21 @@ export function useGetEssentialsConfiguration(): EssentialsConfigurationData { done: isIncidentsInstalled, }, { - title: 'Connect your Messaging workspace to OnCall', - description: 'Receive alerts and oncall notifications within your chat environment.', + title: t( + 'gops.use-get-essentials-configuration.essential-content.title.connect-your-messaging-workspace-to-on-call', + 'Connect your Messaging workspace to OnCall' + ), + description: t( + 'gops.use-get-essentials-configuration.essential-content.description.receive-alerts-oncall-notifications-within-environment', + 'Receive alerts and oncall notifications within your chat environment.' + ), button: { type: 'openLink', urlLink: { url: `/a/${getIrmIfPresentOrOnCallPluginId()}/settings`, queryParams: { tab: 'ChatOps', chatOpsTab: 'Slack' }, }, - label: 'Connect', + label: t('gops.use-get-essentials-configuration.essential-content.label.connect', 'Connect'), urlLinkOnDone: { url: `/a/${getIrmIfPresentOrOnCallPluginId()}/settings`, queryParams: { tab: 'ChatOps' }, @@ -323,7 +381,10 @@ export function useGetEssentialsConfiguration(): EssentialsConfigurationData { done: is_chatops_connected, }, { - title: 'Connect your Messaging workspace to Incident', + title: t( + 'gops.use-get-essentials-configuration.essential-content.title.connect-your-messaging-workspace-to-incident', + 'Connect your Messaging workspace to Incident' + ), description: 'Automatically create an incident channel and manage incidents directly within your chat environment.', button: { @@ -331,7 +392,7 @@ export function useGetEssentialsConfiguration(): EssentialsConfigurationData { urlLink: { url: `/a/${getIrmIfPresentOrIncidentPluginId()}/integrations/grate.slack`, }, - label: 'Connect', + label: t('gops.use-get-essentials-configuration.essential-content.label.connect', 'Connect'), urlLinkOnDone: { url: `/a/${getIrmIfPresentOrIncidentPluginId()}/integrations`, }, @@ -339,14 +400,20 @@ export function useGetEssentialsConfiguration(): EssentialsConfigurationData { done: isChatOpsInstalled, }, { - title: 'Add Messaging workspace channel to OnCall Integration', - description: 'Select ChatOps channels to route notifications', + title: t( + 'gops.use-get-essentials-configuration.essential-content.title.messaging-workspace-channel-on-call-integration', + 'Add Messaging workspace channel to OnCall Integration' + ), + description: t( + 'gops.use-get-essentials-configuration.essential-content.description.select-chat-ops-channels-to-route-notifications', + 'Select ChatOps channels to route notifications' + ), button: { type: 'openLink', urlLink: { url: `/a/${getIrmIfPresentOrOnCallPluginId()}/integrations/`, }, - label: 'Add', + label: t('gops.use-get-essentials-configuration.essential-content.label.add', 'Add'), urlLinkOnDone: { url: `/a/${getIrmIfPresentOrOnCallPluginId()}/integrations/`, }, @@ -357,7 +424,10 @@ export function useGetEssentialsConfiguration(): EssentialsConfigurationData { ], }, { - title: 'Test your configuration', + title: t( + 'gops.use-get-essentials-configuration.essential-content.title.test-your-configuration', + 'Test your configuration' + ), description: '', steps: [ { @@ -365,7 +435,10 @@ export function useGetEssentialsConfiguration(): EssentialsConfigurationData { description: 'In the integration page, click Send demo alert, to review your notification', button: { type: 'dropDown', - label: 'Select integration', + label: t( + 'gops.use-get-essentials-configuration.essential-content.label.select-integration', + 'Select integration' + ), options: onCallOptions, onClickOption: (value) => onIntegrationClick(value, `/a/${getIrmIfPresentOrOnCallPluginId()}/integrations/`), @@ -373,15 +446,21 @@ export function useGetEssentialsConfiguration(): EssentialsConfigurationData { }, }, { - title: 'Create Incident drill', - description: 'Practice solving an Incident', + title: t( + 'gops.use-get-essentials-configuration.essential-content.title.create-incident-drill', + 'Create Incident drill' + ), + description: t( + 'gops.use-get-essentials-configuration.essential-content.description.practice-solving-an-incident', + 'Practice solving an Incident' + ), button: { type: 'openLink', urlLink: { url: `/a/${getIrmIfPresentOrIncidentPluginId()}`, queryParams: { declare: 'new', drill: '1' }, }, - label: 'Start drill', + label: t('gops.use-get-essentials-configuration.essential-content.label.start-drill', 'Start drill'), }, }, ], @@ -418,7 +497,10 @@ export const useGetConfigurationForUI = ({ const actionButtonTitle = dataSourceCompatibleWithAlerting ? 'View' : 'Connect'; return { id: ConfigurationStepsEnum.CONNECT_DATASOURCE, - title: 'Connect data source', + title: t( + 'gops.use-get-configuration-for-ui.get-connect-data-source-configuration.title.connect-data-source', + 'Connect data source' + ), description, actionButtonTitle, isDone: dataSourceCompatibleWithAlerting, @@ -428,7 +510,7 @@ export const useGetConfigurationForUI = ({ getConnectDataSourceConfiguration(), { id: ConfigurationStepsEnum.ESSENTIALS, - title: 'Essentials', + title: t('gops.use-get-configuration-for-ui.title.essentials', 'Essentials'), titleIcon: 'star', description: 'Set up the necessary features to start using Grafana IRM workflows', actionButtonTitle: stepsDone === totalStepsToDo ? 'View' : 'Configure', diff --git a/public/app/features/inspector/InspectJSONTab.tsx b/public/app/features/inspector/InspectJSONTab.tsx index 255bfe5e870..c9348dca512 100644 --- a/public/app/features/inspector/InspectJSONTab.tsx +++ b/public/app/features/inspector/InspectJSONTab.tsx @@ -6,8 +6,7 @@ import { firstValueFrom } from 'rxjs'; import { AppEvents, PanelData, SelectableValue, LoadingState } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; -import { Trans, useTranslate } from '@grafana/i18n'; -import { TFunction } from '@grafana/i18n/internal'; +import { TFunction, Trans, useTranslate } from '@grafana/i18n'; import { locationService } from '@grafana/runtime'; import { Button, CodeEditor, Field, Select, useStyles2 } from '@grafana/ui'; import { appEvents } from 'app/core/core'; diff --git a/public/app/features/invites/SignupInvited.tsx b/public/app/features/invites/SignupInvited.tsx index c926ae85749..184e767555f 100644 --- a/public/app/features/invites/SignupInvited.tsx +++ b/public/app/features/invites/SignupInvited.tsx @@ -106,13 +106,13 @@ export const SignupInvitedPage = () => { label={t('invites.signup-invited-page.label-email', 'Email')} > <Input - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="email@example.com" {...register('email', { required: 'Email is required', pattern: { value: w3cStandardEmailValidator, - message: 'Email is invalid', + message: t('invites.signup-invited-page.message.email-is-invalid', 'Email is invalid'), }, })} /> diff --git a/public/app/features/live/LiveConnectionWarning.tsx b/public/app/features/live/LiveConnectionWarning.tsx index f9c0f637fc3..4d761a34767 100644 --- a/public/app/features/live/LiveConnectionWarning.tsx +++ b/public/app/features/live/LiveConnectionWarning.tsx @@ -52,36 +52,28 @@ export class LiveConnectionWarning extends PureComponent<Props, State> { } return ( - <div className={this.styles.foot}> - <Alert - severity={'warning'} - className={this.styles.warn} - title={t( - 'live.live-connection-warning.title-connection-to-server-is-lost', - 'Connection to server is lost...' - )} - /> - </div> + <Alert + severity={'warning'} + className={this.styles.warn} + title={t( + 'live.live-connection-warning.title-connection-to-server-is-lost', + 'Connection to server is lost...' + )} + /> ); } return null; } } -const getStyle = stylesFactory((theme: GrafanaTheme2) => { - return { - foot: css({ - position: 'fixed', - bottom: 0, - left: 0, - right: 0, - zIndex: 10000, - cursor: 'wait', - margin: theme.spacing(2), - }), - warn: css({ - maxWidth: '400px', - margin: 'auto', - }), - }; -}); +const getStyle = stylesFactory((theme: GrafanaTheme2) => ({ + warn: css({ + position: 'fixed', + bottom: 0, + left: '50%', + transform: 'translate(-50%)', + maxWidth: '400px', + zIndex: theme.zIndex.portal, + cursor: 'wait', + }), +})); diff --git a/public/app/features/logs/components/logParser.ts b/public/app/features/logs/components/logParser.ts index 715361a7df6..dfe8610bbc3 100644 --- a/public/app/features/logs/components/logParser.ts +++ b/public/app/features/logs/components/logParser.ts @@ -1,6 +1,7 @@ import { partition } from 'lodash'; import { DataFrame, Field, FieldWithIndex, LinkModel, LogRowModel, ScopedVars } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { safeStringifyValue } from 'app/core/utils/explore'; import { ExploreFieldLinkModel } from 'app/features/explore/utils/links'; import { GetFieldLinksFn } from 'app/plugins/panel/logs/types'; @@ -65,7 +66,7 @@ export const getDataframeFields = (row: LogRowModel, getFieldLinks?: GetFieldLin return nonEmptyVisibleFields.map((field) => { const vars: ScopedVars = { __labels: { - text: 'Labels', + text: t('logs.get-dataframe-fields.vars.text.labels', 'Labels'), value: { tags: { ...row.labels }, }, diff --git a/public/app/features/logs/components/panel/InfiniteScroll.tsx b/public/app/features/logs/components/panel/InfiniteScroll.tsx index aec46e6ede5..05385f02a04 100644 --- a/public/app/features/logs/components/panel/InfiniteScroll.tsx +++ b/public/app/features/logs/components/panel/InfiniteScroll.tsx @@ -3,8 +3,7 @@ import { usePrevious } from 'react-use'; import { ListChildComponentProps, ListOnItemsRenderedProps } from 'react-window'; import { AbsoluteTimeRange, LogsSortOrder, TimeRange } from '@grafana/data'; -import { useTranslate } from '@grafana/i18n'; -import { TFunction } from '@grafana/i18n/internal'; +import { TFunction, useTranslate } from '@grafana/i18n'; import { config, reportInteraction } from '@grafana/runtime'; import { Spinner, useStyles2 } from '@grafana/ui'; diff --git a/public/app/features/logs/components/panel/LogLine.test.tsx b/public/app/features/logs/components/panel/LogLine.test.tsx index 508af198c18..baa0a16e972 100644 --- a/public/app/features/logs/components/panel/LogLine.test.tsx +++ b/public/app/features/logs/components/panel/LogLine.test.tsx @@ -22,7 +22,6 @@ const contextProps = { app: CoreApp.Unknown, dedupStrategy: LogsDedupStrategy.exact, displayedFields: [], - logs: [], showControls: false, showTime: false, sortOrder: LogsSortOrder.Ascending, @@ -33,6 +32,7 @@ describe('LogLine', () => { let log: LogListModel, defaultProps: Props; beforeEach(() => { log = createLogLine({ labels: { place: 'luna' }, entry: `log message 1` }); + contextProps.logs = [log]; defaultProps = { displayedFields: [], index: 0, @@ -106,9 +106,10 @@ describe('LogLine', () => { test('Shows log lines with errors', async () => { log.hasError = true; + log.labels.__error__ = 'error message'; jest.spyOn(log, 'errorMessage', 'get').mockReturnValue('error message'); render( - <LogListContextProvider {...contextProps} dedupStrategy={LogsDedupStrategy.signature}> + <LogListContextProvider {...contextProps} dedupStrategy={LogsDedupStrategy.signature} logs={[log]}> <LogLine {...defaultProps} /> </LogListContextProvider> ); @@ -118,9 +119,10 @@ describe('LogLine', () => { test('Shows sampled log lines', async () => { log.isSampled = true; + log.labels.__adaptive_logs_sampled__ = 'true'; jest.spyOn(log, 'sampledMessage', 'get').mockReturnValue('sampled message'); render( - <LogListContextProvider {...contextProps} dedupStrategy={LogsDedupStrategy.signature}> + <LogListContextProvider {...contextProps} dedupStrategy={LogsDedupStrategy.signature} logs={[log]}> <LogLine {...defaultProps} /> </LogListContextProvider> ); diff --git a/public/app/features/logs/components/panel/LogLine.tsx b/public/app/features/logs/components/panel/LogLine.tsx index 1feeb0ca20b..d0b69d952ad 100644 --- a/public/app/features/logs/components/panel/LogLine.tsx +++ b/public/app/features/logs/components/panel/LogLine.tsx @@ -45,7 +45,8 @@ export const LogLine = ({ variant, wrapLogMessage, }: Props) => { - const { detailsDisplayed, onLogLineHover } = useLogListContext(); + const { detailsDisplayed, dedupStrategy, enableLogDetails, hasLogsWithErrors, hasSampledLogs, onLogLineHover } = + useLogListContext(); const [collapsed, setCollapsed] = useState<boolean | undefined>( wrapLogMessage && log.collapsed !== undefined ? log.collapsed : undefined ); @@ -99,10 +100,49 @@ export const LogLine = ({ onFocus={handleMouseOver} > <LogLineMenu styles={styles} log={log} /> + {dedupStrategy !== LogsDedupStrategy.none && ( + <div className={`${styles.duplicates}`}> + {log.duplicates && log.duplicates > 0 ? `${log.duplicates + 1}x` : null} + </div> + )} + {hasLogsWithErrors && ( + <div className={`${styles.hasError}`}> + {log.hasError && ( + <Tooltip + content={t('logs.log-line.tooltip-error', 'Error: {{errorMessage}}', { + errorMessage: log.errorMessage, + })} + placement="right" + theme="error" + > + <Icon + className={styles.logIconError} + name="exclamation-triangle" + aria-label={t('logs.log-line.has-error', 'Has errors')} + size="xs" + /> + </Tooltip> + )} + </div> + )} + {hasSampledLogs && ( + <div className={`${styles.isSampled}`}> + {log.isSampled && ( + <Tooltip content={log.sampledMessage ?? ''} placement="right" theme="info"> + <Icon + className={styles.logIconInfo} + name="info-circle" + size="xs" + aria-label={t('logs.log-line.is-sampled', 'Is sampled')} + /> + </Tooltip> + )} + </div> + )} {/* A button element could be used but in Safari it prevents text selection. Fallback available for a11y in LogLineMenu */} {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events */} <div - className={`${wrapLogMessage ? styles.wrappedLogLine : `${styles.unwrappedLogLine} unwrapped-log-line`} ${collapsed === true ? styles.collapsedLogLine : ''}`} + className={`${wrapLogMessage ? styles.wrappedLogLine : `${styles.unwrappedLogLine} unwrapped-log-line`} ${collapsed === true ? styles.collapsedLogLine : ''} ${enableLogDetails ? styles.clickable : ''}`} onClick={handleClick} > <Log @@ -153,43 +193,8 @@ interface LogProps { } const Log = ({ displayedFields, log, showTime, styles, wrapLogMessage }: LogProps) => { - const { dedupStrategy } = useLogListContext(); - const { t } = useTranslate(); return ( <> - {dedupStrategy !== LogsDedupStrategy.none && ( - <span className={`${styles.duplicates} field`}> - {log.duplicates && log.duplicates > 0 ? `${log.duplicates + 1}x` : null} - </span> - )} - {log.hasError && ( - <span className={`${styles.hasError} field`}> - <Tooltip - content={t('logs.log-line.tooltip-error', 'Error: {{errorMessage}}', { errorMessage: log.errorMessage })} - placement="right" - theme="error" - > - <Icon - className={styles.logIconError} - name="exclamation-triangle" - aria-label={t('logs.log-line.has-error', 'Has errors')} - size="xs" - /> - </Tooltip> - </span> - )} - {log.isSampled && ( - <span className={`${styles.isSampled} field`}> - <Tooltip content={log.sampledMessage ?? ''} placement="right" theme="info"> - <Icon - className={styles.logIconInfo} - name="info-circle" - size="xs" - aria-label={t('logs.log-line.is-sampled', 'Is sampled')} - /> - </Tooltip> - </span> - )} {showTime && <span className={`${styles.timestamp} level-${log.logLevel} field`}>{log.timestamp}</span>} { // When logs are unwrapped, we want an empty column space to align with other log lines. @@ -334,12 +339,12 @@ export const getStyles = (theme: GrafanaTheme2) => { display: 'inline-block', }), duplicates: css({ - display: 'inline-block', + flexShrink: 0, textAlign: 'center', width: theme.spacing(4.5), }), hasError: css({ - display: 'inline-block', + flexShrink: 0, width: theme.spacing(2), '& svg': { position: 'relative', @@ -347,7 +352,7 @@ export const getStyles = (theme: GrafanaTheme2) => { }, }), isSampled: css({ - display: 'inline-block', + flexShrink: 0, width: theme.spacing(2), '& svg': { position: 'relative', @@ -389,15 +394,16 @@ export const getStyles = (theme: GrafanaTheme2) => { overflows: css({ outline: 'solid 1px red', }), - unwrappedLogLine: css({ + clickable: css({ cursor: 'pointer', + }), + unwrappedLogLine: css({ display: 'grid', gridColumnGap: theme.spacing(FIELD_GAP_MULTIPLIER), whiteSpace: 'pre', paddingBottom: theme.spacing(0.75), }), wrappedLogLine: css({ - cursor: 'pointer', alignSelf: 'flex-start', paddingBottom: theme.spacing(0.75), whiteSpace: 'pre-wrap', diff --git a/public/app/features/logs/components/panel/LogLineDetails.tsx b/public/app/features/logs/components/panel/LogLineDetails.tsx index df55103225a..9e390ccafe8 100644 --- a/public/app/features/logs/components/panel/LogLineDetails.tsx +++ b/public/app/features/logs/components/panel/LogLineDetails.tsx @@ -54,7 +54,7 @@ export const LogLineDetails = ({ containerElement, getFieldLinks, logs, onResize return ( <Resizable onResize={handleResize} - handleClasses={{ left: dragStyles.dragHandleBaseVertical }} + handleClasses={{ left: dragStyles.dragHandleVertical }} defaultSize={{ width: detailsWidth, height: containerElement.clientHeight }} enable={{ left: true }} minWidth={40} diff --git a/public/app/features/logs/components/panel/LogLineMenu.test.tsx b/public/app/features/logs/components/panel/LogLineMenu.test.tsx index 9b6184cf41b..0f8286f93ed 100644 --- a/public/app/features/logs/components/panel/LogLineMenu.test.tsx +++ b/public/app/features/logs/components/panel/LogLineMenu.test.tsx @@ -6,7 +6,7 @@ import { CoreApp, createTheme, LogsDedupStrategy, LogsSortOrder } from '@grafana import { createLogLine } from '../__mocks__/logRow'; import { getStyles } from './LogLine'; -import { LogLineMenu } from './LogLineMenu'; +import { LogLineMenu, LogLineMenuCustomItem } from './LogLineMenu'; import { LogListContextProvider } from './LogListContext'; import { defaultProps, defaultValue } from './__mocks__/LogListContext'; import { LogListModel } from './processing'; @@ -54,6 +54,33 @@ describe('LogLineMenu', () => { expect(onPermalinkClick).toHaveBeenCalledTimes(1); }); + test('Allows to copy a permalink', async () => { + const customOption1onClick = jest.fn(); + const logLineMenuCustomItems: LogLineMenuCustomItem[] = [ + { + label: 'Custom option 1', + onClick: customOption1onClick, + }, + { + divider: true, + }, + { + label: 'Custom option 2', + onClick: jest.fn(), + }, + ]; + render( + <LogListContextProvider {...contextProps} logLineMenuCustomItems={logLineMenuCustomItems}> + <LogLineMenu log={log} styles={styles} /> + </LogListContextProvider> + ); + await userEvent.click(screen.getByLabelText('Log menu')); + await screen.findByText('Custom option 1'); + await screen.findByText('Custom option 2'); + await userEvent.click(screen.getByText('Custom option 1')); + expect(customOption1onClick).toHaveBeenCalledTimes(1); + }); + test('Allows to open show context', async () => { const onOpenContext = jest.fn(); const logSupportsContext = jest.fn().mockReturnValue(true); diff --git a/public/app/features/logs/components/panel/LogLineMenu.tsx b/public/app/features/logs/components/panel/LogLineMenu.tsx index e790ad8a21f..bb421cbccff 100644 --- a/public/app/features/logs/components/panel/LogLineMenu.tsx +++ b/public/app/features/logs/components/panel/LogLineMenu.tsx @@ -17,6 +17,17 @@ export type GetRowContextQueryFn = ( cacheFilters?: boolean ) => Promise<DataQuery | null>; +type MenuItem = { + label: string; + onClick(log: LogListModel): void; +}; + +type MenuItemDivider = { + divider: true; +}; + +export type LogLineMenuCustomItem = MenuItem | MenuItemDivider; + interface Props { log: LogListModel; styles: LogLineStyles; @@ -31,6 +42,7 @@ export const LogLineMenu = ({ log, styles }: Props) => { onPermalinkClick, onPinLine, onUnpinLine, + logLineMenuCustomItems = [], logSupportsContext, toggleDetails, } = useLogListContext(); @@ -98,6 +110,15 @@ export const LogLineMenu = ({ log, styles }: Props) => { {onPermalinkClick && log.rowId !== undefined && log.uid && ( <Menu.Item onClick={copyLinkToLogLine} label={t('logs.log-line-menu.copy-link', 'Copy link to log line')} /> )} + {logLineMenuCustomItems.map((item, i) => { + if (isDivider(item)) { + return <Menu.Divider key={i} />; + } + if (isItem(item)) { + return <Menu.Item onClick={() => item.onClick(log)} label={item.label} key={i} />; + } + return null; + })} </Menu> ), [ @@ -106,6 +127,7 @@ export const LogLineMenu = ({ log, styles }: Props) => { detailsDisplayed, enableLogDetails, log, + logLineMenuCustomItems, onPermalinkClick, onPinLine, onUnpinLine, @@ -128,3 +150,11 @@ export const LogLineMenu = ({ log, styles }: Props) => { </Dropdown> ); }; + +function isDivider(item: LogLineMenuCustomItem) { + return 'divider' in item && item.divider; +} + +function isItem(item: LogLineMenuCustomItem) { + return 'onClick' in item && 'label' in item; +} diff --git a/public/app/features/logs/components/panel/LogList.tsx b/public/app/features/logs/components/panel/LogList.tsx index 1dc80967a90..b84496e7f4d 100644 --- a/public/app/features/logs/components/panel/LogList.tsx +++ b/public/app/features/logs/components/panel/LogList.tsx @@ -24,7 +24,7 @@ import { GetFieldLinksFn } from 'app/plugins/panel/logs/types'; import { InfiniteScroll } from './InfiniteScroll'; import { getGridTemplateColumns } from './LogLine'; import { LogLineDetails } from './LogLineDetails'; -import { GetRowContextQueryFn } from './LogLineMenu'; +import { GetRowContextQueryFn, LogLineMenuCustomItem } from './LogLineMenu'; import { LogListContextProvider, LogListState, useLogListContext } from './LogListContext'; import { LogListControls } from './LogListControls'; import { preProcessLogs, LogListModel } from './processing'; @@ -53,6 +53,7 @@ export interface Props { isLabelFilterActive?: (key: string, value: string, refId?: string) => Promise<boolean>; loading?: boolean; loadMore?: (range: AbsoluteTimeRange) => void; + logLineMenuCustomItems?: LogLineMenuCustomItem[]; logOptionsStorageKey?: string; logs: LogRowModel[]; logsMeta?: LogsMetaItem[]; @@ -111,6 +112,7 @@ export const LogList = ({ isLabelFilterActive, loading, loadMore, + logLineMenuCustomItems, logOptionsStorageKey, logs, logsMeta, @@ -150,6 +152,7 @@ export const LogList = ({ isLabelFilterActive={isLabelFilterActive} logs={logs} logsMeta={logsMeta} + logLineMenuCustomItems={logLineMenuCustomItems} logOptionsStorageKey={logOptionsStorageKey} logSupportsContext={logSupportsContext} onClickFilterLabel={onClickFilterLabel} @@ -209,6 +212,8 @@ const LogListComponent = ({ dedupStrategy, filterLevels, forceEscape, + hasLogsWithErrors, + hasSampledLogs, permalinkedLogId, showDetails, showTime, @@ -265,7 +270,7 @@ const LogListComponent = ({ useEffect(() => { listRef.current?.resetAfterIndex(0); - }, [wrapLogMessage, showDetails, displayedFields]); + }, [wrapLogMessage, showDetails, displayedFields, dedupStrategy]); useEffect(() => { const handleResize = debounce(() => { @@ -362,6 +367,8 @@ const LogListComponent = ({ height={listHeight} itemCount={itemCount} itemSize={getLogLineSize.bind(null, filteredLogs, widthContainer, displayedFields, { + hasLogsWithErrors, + hasSampledLogs, showDuplicates: dedupStrategy !== LogsDedupStrategy.none, showTime, wrap: wrapLogMessage, @@ -370,6 +377,7 @@ const LogListComponent = ({ layout="vertical" onItemsRendered={onItemsRendered} outerRef={scrollRef} + overscanCount={5} ref={listRef} style={{ overflowY: 'scroll' }} width="100%" diff --git a/public/app/features/logs/components/panel/LogListContext.tsx b/public/app/features/logs/components/panel/LogListContext.tsx index 546643fc813..6c1f8b9c57f 100644 --- a/public/app/features/logs/components/panel/LogListContext.tsx +++ b/public/app/features/logs/components/panel/LogListContext.tsx @@ -6,6 +6,7 @@ import { useCallback, useContext, useEffect, + useMemo, useState, } from 'react'; @@ -22,9 +23,9 @@ import { } from '@grafana/data'; import { PopoverContent } from '@grafana/ui'; -import { DownloadFormat, downloadLogs as download } from '../../utils'; +import { DownloadFormat, checkLogsError, checkLogsSampled, downloadLogs as download } from '../../utils'; -import { GetRowContextQueryFn } from './LogLineMenu'; +import { GetRowContextQueryFn, LogLineMenuCustomItem } from './LogLineMenu'; import { LogListModel } from './processing'; export interface LogListContextData extends Omit<Props, 'containerElement' | 'logs' | 'logsMeta' | 'showControls'> { @@ -34,7 +35,10 @@ export interface LogListContextData extends Omit<Props, 'containerElement' | 'lo downloadLogs: (format: DownloadFormat) => void; enableLogDetails: boolean; filterLevels: LogLevel[]; + hasLogsWithErrors?: boolean; + hasSampledLogs?: boolean; hasUnescapedContent?: boolean; + logLineMenuCustomItems?: LogLineMenuCustomItem[]; setDedupStrategy: (dedupStrategy: LogsDedupStrategy) => void; setDetailsWidth: (width: number) => void; setFilterLevels: (filterLevels: LogLevel[]) => void; @@ -129,6 +133,7 @@ export interface Props { getRowContextQuery?: GetRowContextQueryFn; isLabelFilterActive?: (key: string, value: string, refId?: string) => Promise<boolean>; logs: LogRowModel[]; + logLineMenuCustomItems?: LogLineMenuCustomItem[]; logsMeta?: LogsMetaItem[]; logOptionsStorageKey?: string; logSupportsContext?: (row: LogRowModel) => boolean; @@ -169,6 +174,7 @@ export const LogListContextProvider = ({ isLabelFilterActive, getRowContextQuery, logs, + logLineMenuCustomItems, logsMeta, logOptionsStorageKey, logSupportsContext, @@ -260,6 +266,18 @@ export const LogListContextProvider = ({ } }, [logListState, pinnedLogs]); + useEffect(() => { + if (!showDetails.length) { + return; + } + const newShowDetails = showDetails.filter( + (expandedLog) => logs.findIndex((log) => log.uid === expandedLog.uid) >= 0 + ); + if (newShowDetails.length !== showDetails.length) { + setShowDetails(newShowDetails); + } + }, [logs, showDetails]); + const detailsDisplayed = useCallback( (log: LogListModel) => !!showDetails.find((shownLog) => shownLog.uid === log.uid), [showDetails] @@ -403,6 +421,9 @@ export const LogListContextProvider = ({ [logOptionsStorageKey] ); + const hasLogsWithErrors = useMemo(() => logs.some((log) => !!checkLogsError(log)), [logs]); + const hasSampledLogs = useMemo(() => logs.some((log) => !!checkLogsSampled(log)), [logs]); + const defaultWidth = (containerElement?.clientWidth ?? 0) * 0.4; const detailsWidth = logOptionsStorageKey ? parseInt(store.get(`${logOptionsStorageKey}.detailsWidth`), 10) @@ -421,10 +442,13 @@ export const LogListContextProvider = ({ enableLogDetails, filterLevels: logListState.filterLevels, forceEscape: logListState.forceEscape, + hasLogsWithErrors, + hasSampledLogs, hasUnescapedContent: logListState.hasUnescapedContent, isLabelFilterActive, getRowContextQuery, logSupportsContext, + logLineMenuCustomItems, onClickFilterLabel, onClickFilterOutLabel, onClickFilterString, diff --git a/public/app/features/logs/components/panel/__mocks__/LogListContext.tsx b/public/app/features/logs/components/panel/__mocks__/LogListContext.tsx index e9fcaabdeca..a57a80c5580 100644 --- a/public/app/features/logs/components/panel/__mocks__/LogListContext.tsx +++ b/public/app/features/logs/components/panel/__mocks__/LogListContext.tsx @@ -1,6 +1,7 @@ import { createContext, useContext } from 'react'; import { CoreApp, LogsDedupStrategy, LogsSortOrder } from '@grafana/data'; +import { checkLogsError, checkLogsSampled } from 'app/features/logs/utils'; import { LogListContextData, Props } from '../LogListContext'; import { LogListModel } from '../processing'; @@ -114,6 +115,8 @@ export const LogListContextProvider = ({ enableLogDetails = false, filterLevels = [], getRowContextQuery = jest.fn(), + logLineMenuCustomItems = undefined, + logs = [], logSupportsContext = jest.fn(), onLogLineHover, onPermalinkClick = jest.fn(), @@ -127,6 +130,9 @@ export const LogListContextProvider = ({ syntaxHighlighting = true, wrapLogMessage = true, }: Partial<Props>) => { + const hasLogsWithErrors = logs.some((log) => !!checkLogsError(log)); + const hasSampledLogs = logs.some((log) => !!checkLogsSampled(log)); + return ( <LogListContext.Provider value={{ @@ -136,8 +142,11 @@ export const LogListContextProvider = ({ displayedFields, downloadLogs: jest.fn(), enableLogDetails, + hasLogsWithErrors, + hasSampledLogs, filterLevels, getRowContextQuery, + logLineMenuCustomItems, logSupportsContext, onLogLineHover, onPermalinkClick, diff --git a/public/app/features/logs/components/panel/virtualization.test.ts b/public/app/features/logs/components/panel/virtualization.test.ts index d570467b598..1c09c09a32a 100644 --- a/public/app/features/logs/components/panel/virtualization.test.ts +++ b/public/app/features/logs/components/panel/virtualization.test.ts @@ -14,6 +14,13 @@ const THREE_LINES_HEIGHT = 3 * LINE_HEIGHT + PADDING_BOTTOM; let LETTER_WIDTH: number; let CONTAINER_SIZE = 200; let TWO_LINES_OF_CHARACTERS: number; +const defaultOptions = { + wrap: false, + showTime: false, + showDuplicates: false, + hasLogsWithErrors: false, + hasSampledLogs: false, +}; describe('Virtualization', () => { let log: LogListModel, container: HTMLDivElement; @@ -28,7 +35,7 @@ describe('Virtualization', () => { describe('getLogLineSize', () => { test('Returns the a single line if the display mode is unwrapped', () => { - const size = getLogLineSize([log], container, [], { wrap: false, showTime: true, showDuplicates: false }, 0); + const size = getLogLineSize([log], container, [], { ...defaultOptions, showTime: true }, 0); expect(size).toBe(SINGLE_LINE_HEIGHT); }); @@ -38,7 +45,7 @@ describe('Virtualization', () => { logs, container, [], - { wrap: true, showTime: true, showDuplicates: false }, + { ...defaultOptions, wrap: true, showTime: true }, logs.length + 1 ); expect(size).toBe(SINGLE_LINE_HEIGHT); @@ -48,12 +55,18 @@ describe('Virtualization', () => { // Very small container log.collapsed = true; jest.spyOn(container, 'clientWidth', 'get').mockReturnValue(10); - const size = getLogLineSize([log], container, [], { wrap: true, showTime: true, showDuplicates: false }, 0); + const size = getLogLineSize([log], container, [], { ...defaultOptions, wrap: true, showTime: true }, 0); expect(size).toBe((TRUNCATION_LINE_COUNT + 1) * LINE_HEIGHT); }); test.each([true, false])('Measures a log line with controls %s and displayed time %s', (showTime: boolean) => { - const size = getLogLineSize([log], container, [], { wrap: true, showTime, showDuplicates: false }, 0); + const size = getLogLineSize( + [log], + container, + [], + { wrap: true, showTime, showDuplicates: false, hasLogsWithErrors: false, hasSampledLogs: false }, + 0 + ); expect(size).toBe(SINGLE_LINE_HEIGHT); }); @@ -64,14 +77,14 @@ describe('Virtualization', () => { logLevel: undefined, }); - const size = getLogLineSize([log], container, [], { wrap: true, showTime: false, showDuplicates: false }, 0); + const size = getLogLineSize([log], container, [], { ...defaultOptions, wrap: true }, 0); expect(size).toBe(TWO_LINES_HEIGHT); }); test('Measures a multi-line log line with level, controls, and displayed time', () => { log = createLogLine({ labels: { place: 'luna' }, entry: new Array(TWO_LINES_OF_CHARACTERS).fill('e').join('') }); - const size = getLogLineSize([log], container, [], { wrap: true, showTime: true, showDuplicates: false }, 0); + const size = getLogLineSize([log], container, [], { ...defaultOptions, wrap: true, showTime: true }, 0); // Two lines for the log and one extra for level and time expect(size).toBe(THREE_LINES_HEIGHT); }); @@ -87,7 +100,7 @@ describe('Virtualization', () => { [log], container, ['place', LOG_LINE_BODY_FIELD_NAME], - { wrap: true, showTime: false, showDuplicates: false }, + { ...defaultOptions, wrap: true }, 0 ); // Two lines for the log and one extra for the displayed fields @@ -97,13 +110,7 @@ describe('Virtualization', () => { test('Measures displayed fields in a log line with level, controls, and displayed time', () => { log = createLogLine({ labels: { place: 'luna' }, entry: new Array(TWO_LINES_OF_CHARACTERS).fill('e').join('') }); - const size = getLogLineSize( - [log], - container, - ['place'], - { wrap: true, showTime: true, showDuplicates: false }, - 0 - ); + const size = getLogLineSize([log], container, ['place'], { ...defaultOptions, wrap: true, showTime: true }, 0); // Only renders a short displayed field, so a single line expect(size).toBe(SINGLE_LINE_HEIGHT); }); @@ -112,25 +119,23 @@ describe('Virtualization', () => { log = createLogLine({ labels: { place: 'luna' }, entry: new Array(TWO_LINES_OF_CHARACTERS).fill('e').join('') }); log.duplicates = 1; - const size = getLogLineSize([log], container, [], { wrap: true, showTime: false, showDuplicates: true }, 0); + const size = getLogLineSize([log], container, [], { ...defaultOptions, wrap: true, showDuplicates: true }, 0); // Two lines for the log and one extra for duplicates expect(size).toBe(THREE_LINES_HEIGHT); }); test('Measures a multi-line log line with errors', () => { log = createLogLine({ labels: { place: 'luna' }, entry: new Array(TWO_LINES_OF_CHARACTERS).fill('e').join('') }); - log.hasError = true; - const size = getLogLineSize([log], container, [], { wrap: true, showTime: false, showDuplicates: false }, 0); + const size = getLogLineSize([log], container, [], { ...defaultOptions, wrap: true, hasLogsWithErrors: true }, 0); // Two lines for the log and one extra for the error icon expect(size).toBe(THREE_LINES_HEIGHT); }); test('Measures a multi-line sampled log line', () => { log = createLogLine({ labels: { place: 'luna' }, entry: new Array(TWO_LINES_OF_CHARACTERS).fill('e').join('') }); - log.isSampled = true; - const size = getLogLineSize([log], container, [], { wrap: true, showTime: false, showDuplicates: false }, 0); + const size = getLogLineSize([log], container, [], { ...defaultOptions, wrap: true, hasSampledLogs: true }, 0); // Two lines for the log and one extra for the sampled icon expect(size).toBe(THREE_LINES_HEIGHT); }); @@ -138,7 +143,7 @@ describe('Virtualization', () => { test('Adds an extra line for the expand/collapse controls if present', () => { jest.spyOn(log, 'updateCollapsedState').mockImplementation(() => undefined); log.collapsed = false; - const size = getLogLineSize([log], container, [], { wrap: true, showTime: false, showDuplicates: false }, 0); + const size = getLogLineSize([log], container, [], { ...defaultOptions, wrap: true }, 0); expect(size).toBe(TWO_LINES_HEIGHT); }); }); diff --git a/public/app/features/logs/components/panel/virtualization.ts b/public/app/features/logs/components/panel/virtualization.ts index 26c7f8699d9..76221b71a33 100644 --- a/public/app/features/logs/components/panel/virtualization.ts +++ b/public/app/features/logs/components/panel/virtualization.ts @@ -147,6 +147,8 @@ export function measureTextHeight(text: string, maxWidth: number, beforeWidth = } interface DisplayOptions { + hasLogsWithErrors?: boolean; + hasSampledLogs?: boolean; showDuplicates: boolean; showTime: boolean; wrap: boolean; @@ -156,7 +158,7 @@ export function getLogLineSize( logs: LogListModel[], container: HTMLDivElement | null, displayedFields: string[], - { showDuplicates, showTime, wrap }: DisplayOptions, + { hasLogsWithErrors, hasSampledLogs, showDuplicates, showTime, wrap }: DisplayOptions, index: number ) { if (!container) { @@ -179,15 +181,16 @@ export function getLogLineSize( let textToMeasure = ''; const gap = gridSize * FIELD_GAP_MULTIPLIER; + const iconsGap = gridSize * 0.5; let optionsWidth = 0; if (showDuplicates) { - optionsWidth += gridSize * 4.5 + gap; + optionsWidth += gridSize * 4.5 + iconsGap; } - if (logs[index].hasError) { - optionsWidth += gridSize * 2 + gap; + if (hasLogsWithErrors) { + optionsWidth += gridSize * 2 + iconsGap; } - if (logs[index].isSampled) { - optionsWidth += gridSize * 2 + gap; + if (hasSampledLogs) { + optionsWidth += gridSize * 2 + iconsGap; } if (showTime) { optionsWidth += gap; diff --git a/public/app/features/logs/logsModel.ts b/public/app/features/logs/logsModel.ts index 9c1c266cea6..13a10f80031 100644 --- a/public/app/features/logs/logsModel.ts +++ b/public/app/features/logs/logsModel.ts @@ -40,6 +40,7 @@ import { toUtc, } from '@grafana/data'; import { SIPrefix } from '@grafana/data/internal'; +import { t } from '@grafana/i18n/internal'; import { config } from '@grafana/runtime'; import { BarAlignment, GraphDrawStyle, StackingMode } from '@grafana/schema'; import { colors } from '@grafana/ui'; @@ -535,7 +536,7 @@ export function logSeriesToLogsModel( if (totalBytes > 0) { const { text, suffix } = SIPrefix('B')(totalBytes); meta.push({ - label: 'Total bytes processed', + label: t('logs.log-series-to-logs-model.label.total-bytes-processed', 'Total bytes processed'), value: `${text} ${suffix}`, kind: LogsMetaKind.String, }); diff --git a/public/app/features/manage-dashboards/DashboardImportPage.tsx b/public/app/features/manage-dashboards/DashboardImportPage.tsx index 66cba020b11..653813322a3 100644 --- a/public/app/features/manage-dashboards/DashboardImportPage.tsx +++ b/public/app/features/manage-dashboards/DashboardImportPage.tsx @@ -165,7 +165,7 @@ class UnthemedDashboardImport extends PureComponent<Props> { const styles = importStyles(this.props.theme); const GcomDashboardsLink = () => ( - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings <TextLink variant="bodySmall" href="https://grafana.com/grafana/dashboards/" external> grafana.com/dashboards </TextLink> @@ -263,8 +263,11 @@ class UnthemedDashboardImport extends PureComponent<Props> { } pageNav: NavModelItem = { - text: 'Import dashboard', - subTitle: 'Import dashboard from file or Grafana.com', + text: t('manage-dashboards.unthemed-dashboard-import.text.import-dashboard', 'Import dashboard'), + subTitle: t( + 'manage-dashboards.unthemed-dashboard-import.subTitle.import-dashboard-from-file-or-grafanacom', + 'Import dashboard from file or Grafana.com' + ), }; getDashboardOverview() { diff --git a/public/app/features/migrate-to-cloud/onprem/EmptyState/CallToAction/ConnectModal.tsx b/public/app/features/migrate-to-cloud/onprem/EmptyState/CallToAction/ConnectModal.tsx index 86333f0efbc..3711bfecf16 100644 --- a/public/app/features/migrate-to-cloud/onprem/EmptyState/CallToAction/ConnectModal.tsx +++ b/public/app/features/migrate-to-cloud/onprem/EmptyState/CallToAction/ConnectModal.tsx @@ -3,8 +3,7 @@ import { useId } from 'react'; import { SubmitHandler, useForm } from 'react-hook-form'; import { GrafanaTheme2 } from '@grafana/data'; -import { Trans, useTranslate } from '@grafana/i18n'; -import { TFunction } from '@grafana/i18n/internal'; +import { TFunction, Trans, useTranslate } from '@grafana/i18n'; import { Modal, Button, Stack, TextLink, Field, Input, Text, useStyles2 } from '@grafana/ui'; import { AlertWithTraceID } from 'app/features/migrate-to-cloud/shared/AlertWithTraceID'; diff --git a/public/app/features/migrate-to-cloud/onprem/Page.tsx b/public/app/features/migrate-to-cloud/onprem/Page.tsx index 9a6ea846572..4be9fb10548 100644 --- a/public/app/features/migrate-to-cloud/onprem/Page.tsx +++ b/public/app/features/migrate-to-cloud/onprem/Page.tsx @@ -1,8 +1,7 @@ import { skipToken } from '@reduxjs/toolkit/query/react'; import { useCallback, useEffect, useState } from 'react'; -import { Trans, useTranslate } from '@grafana/i18n'; -import { TFunction } from '@grafana/i18n/internal'; +import { TFunction, Trans, useTranslate } from '@grafana/i18n'; import { config } from '@grafana/runtime'; import { AlertVariant, Box, Stack, Text } from '@grafana/ui'; diff --git a/public/app/features/migrate-to-cloud/onprem/ResourceDetailsModal.tsx b/public/app/features/migrate-to-cloud/onprem/ResourceDetailsModal.tsx index c7756cd038d..ecc96e5f31b 100644 --- a/public/app/features/migrate-to-cloud/onprem/ResourceDetailsModal.tsx +++ b/public/app/features/migrate-to-cloud/onprem/ResourceDetailsModal.tsx @@ -1,5 +1,4 @@ -import { Trans, useTranslate } from '@grafana/i18n'; -import { TFunction } from '@grafana/i18n/internal'; +import { TFunction, Trans, useTranslate } from '@grafana/i18n'; import { Button, Modal, Stack, Text } from '@grafana/ui'; import { MigrateDataResponseItemDto } from '../api'; diff --git a/public/app/features/migrate-to-cloud/onprem/TypeCell.tsx b/public/app/features/migrate-to-cloud/onprem/TypeCell.tsx index abd9e414e0f..ef42de2a6fd 100644 --- a/public/app/features/migrate-to-cloud/onprem/TypeCell.tsx +++ b/public/app/features/migrate-to-cloud/onprem/TypeCell.tsx @@ -1,5 +1,4 @@ -import { useTranslate } from '@grafana/i18n'; -import { TFunction } from '@grafana/i18n/internal'; +import { TFunction, useTranslate } from '@grafana/i18n'; import { CellProps } from '@grafana/ui'; import { ResourceTableItem } from './types'; diff --git a/public/app/features/migrate-to-cloud/onprem/useNotifyOnSuccess.tsx b/public/app/features/migrate-to-cloud/onprem/useNotifyOnSuccess.tsx index effaaddc1ee..f2e04d146cd 100644 --- a/public/app/features/migrate-to-cloud/onprem/useNotifyOnSuccess.tsx +++ b/public/app/features/migrate-to-cloud/onprem/useNotifyOnSuccess.tsx @@ -1,7 +1,6 @@ import { useRef, useEffect } from 'react'; -import { useTranslate } from '@grafana/i18n'; -import { TFunction } from '@grafana/i18n/internal'; +import { TFunction, useTranslate } from '@grafana/i18n'; import { useAppNotification } from 'app/core/copy/appNotification'; import { GetSnapshotResponseDto, SnapshotDto } from '../api'; diff --git a/public/app/features/migrate-to-cloud/shared/AlertWithTraceID.tsx b/public/app/features/migrate-to-cloud/shared/AlertWithTraceID.tsx index 6b3581c344a..09f5ba7f020 100644 --- a/public/app/features/migrate-to-cloud/shared/AlertWithTraceID.tsx +++ b/public/app/features/migrate-to-cloud/shared/AlertWithTraceID.tsx @@ -17,7 +17,7 @@ export function AlertWithTraceID(props: AlertWithTraceIDProps) { {traceID && ( /* Deliberately don't want to translate 'Trace ID' */ - /* eslint-disable-next-line @grafana/no-untranslated-strings */ + /* eslint-disable-next-line @grafana/i18n/no-untranslated-strings */ <Text element="p" color="secondary" variant="bodySmall"> Trace ID: {traceID} </Text> diff --git a/public/app/features/org/OrgDetailsPage.tsx b/public/app/features/org/OrgDetailsPage.tsx index f21d96fc1a8..18c6550572f 100644 --- a/public/app/features/org/OrgDetailsPage.tsx +++ b/public/app/features/org/OrgDetailsPage.tsx @@ -1,6 +1,7 @@ import { PureComponent } from 'react'; import { ConnectedProps, connect } from 'react-redux'; +import { t } from '@grafana/i18n/internal'; import { Stack } from '@grafana/ui'; import { Page } from 'app/core/components/Page/Page'; import SharedPreferences from 'app/core/components/SharedPreferences/SharedPreferences'; @@ -29,7 +30,7 @@ export class OrgDetailsPage extends PureComponent<Props> { return new Promise<boolean>((resolve) => { appEvents.publish( new ShowConfirmModalEvent({ - title: 'Confirm preferences update', + title: t('org.org-details-page.title.confirm-preferences-update', 'Confirm preferences update'), text: 'This will update the preferences for the whole organization. Are you sure you want to update the preferences?', yesText: 'Save', yesButtonVariant: 'primary', diff --git a/public/app/features/org/UserInviteForm.tsx b/public/app/features/org/UserInviteForm.tsx index 5fb9383a861..e79df23801f 100644 --- a/public/app/features/org/UserInviteForm.tsx +++ b/public/app/features/org/UserInviteForm.tsx @@ -79,7 +79,7 @@ export const UserInviteForm = () => { error={!!errors.loginOrEmail ? 'Email or username is required' : undefined} label={t('org.user-invite-form.label-email-or-username', 'Email or username')} > - {/* eslint-disable-next-line @grafana/no-untranslated-strings */} + {/* eslint-disable-next-line @grafana/i18n/no-untranslated-strings */} <Input {...register('loginOrEmail', { required: true })} placeholder="email@example.com" /> </Field> <Field invalid={!!errors.name} label={t('org.user-invite-form.label-name', 'Name')}> diff --git a/public/app/features/org/UserInvitePage.tsx b/public/app/features/org/UserInvitePage.tsx index f3f70d1e5e3..825e24bfe97 100644 --- a/public/app/features/org/UserInvitePage.tsx +++ b/public/app/features/org/UserInvitePage.tsx @@ -1,10 +1,11 @@ -import { Trans } from '@grafana/i18n'; +import { Trans, useTranslate } from '@grafana/i18n'; import { Page } from 'app/core/components/Page/Page'; import { contextSrv } from 'app/core/core'; import UserInviteForm from './UserInviteForm'; export function UserInvitePage() { + const { t } = useTranslate(); const subTitle = ( <Trans i18nKey="org.user-invite-page.sub-title" values={{ orgName: contextSrv.user.orgName }}> Send invitation or add existing Grafana user to the organization. @@ -13,7 +14,11 @@ export function UserInvitePage() { ); return ( - <Page navId="global-users" pageNav={{ text: 'Invite user' }} subTitle={subTitle}> + <Page + navId="global-users" + pageNav={{ text: t('org.user-invite-page.text.invite-user', 'Invite user') }} + subTitle={subTitle} + > <Page.Contents> <UserInviteForm /> </Page.Contents> diff --git a/public/app/features/panel/panellinks/linkSuppliers.ts b/public/app/features/panel/panellinks/linkSuppliers.ts index c2810f7dabe..46d8ea6ad82 100644 --- a/public/app/features/panel/panellinks/linkSuppliers.ts +++ b/public/app/features/panel/panellinks/linkSuppliers.ts @@ -11,6 +11,7 @@ import { ScopedVar, ScopedVars, } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { VizPanel } from '@grafana/scenes'; import { PanelModel } from 'app/features/dashboard/state/PanelModel'; import { dashboardSceneGraph } from 'app/features/dashboard-scene/utils/dashboardSceneGraph'; @@ -69,7 +70,7 @@ export const getFieldLinksSupplier = (value: FieldDisplay): LinkModelSupplier<Fi name: dataFrame.name, refId: dataFrame.refId, }, - text: 'Series', + text: t('panel.get-field-links-supplier.text.series', 'Series'), }; const field = value.colIndex !== undefined ? dataFrame.fields[value.colIndex] : undefined; @@ -80,7 +81,7 @@ export const getFieldLinksSupplier = (value: FieldDisplay): LinkModelSupplier<Fi name: field.name, labels: field.labels, }, - text: 'Field', + text: t('panel.get-field-links-supplier.text.field', 'Field'), }; if (value.rowIndex !== undefined && value.rowIndex >= 0) { @@ -92,7 +93,7 @@ export const getFieldLinksSupplier = (value: FieldDisplay): LinkModelSupplier<Fi text: formattedValueToString(value.display), time: timeField ? timeField.values[value.rowIndex] : undefined, }, - text: 'Value', + text: t('panel.get-field-links-supplier.text.value', 'Value'), }; } @@ -107,7 +108,7 @@ export const getFieldLinksSupplier = (value: FieldDisplay): LinkModelSupplier<Fi rowIndex: value.rowIndex!, }), }, - text: 'Data', + text: t('panel.get-field-links-supplier.text.data', 'Data'), }; } } else { @@ -119,7 +120,7 @@ export const getFieldLinksSupplier = (value: FieldDisplay): LinkModelSupplier<Fi text: formattedValueToString(value.display), calc: value.name, }, - text: 'Value', + text: t('panel.get-field-links-supplier.text.value', 'Value'), }; } } else { diff --git a/public/app/features/panel/panellinks/link_srv.ts b/public/app/features/panel/panellinks/link_srv.ts index 8bd106283c4..e71f7b9cc86 100644 --- a/public/app/features/panel/panellinks/link_srv.ts +++ b/public/app/features/panel/panellinks/link_srv.ts @@ -19,6 +19,7 @@ import { VariableSuggestion, VariableSuggestionsScope, } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { getTemplateSrv } from '@grafana/runtime'; import { DashboardLink, VariableFormatID } from '@grafana/schema'; import { getConfig } from 'app/core/config'; @@ -88,7 +89,7 @@ export const getPanelLinksVariableSuggestions = (): VariableSuggestion[] => [ })), { value: `${DataLinkBuiltInVars.includeVars}`, - label: 'All variables', + label: t('panel.get-panel-links-variable-suggestions.label.all-variables', 'All variables'), documentation: 'Adds current variables', origin: VariableOrigin.Template, }, @@ -112,7 +113,7 @@ const getFieldVars = (dataFrames: DataFrame[]) => { return [ { value: `${DataLinkBuiltInVars.fieldName}`, - label: 'Name', + label: t('panel.get-field-vars.label.name', 'Name'), documentation: 'Field name of the clicked datapoint (in ms epoch)', origin: VariableOrigin.Field, }, @@ -206,7 +207,7 @@ export const getDataLinksVariableSuggestions = ( ): VariableSuggestion[] => { const valueTimeVar = { value: `${DataLinkBuiltInVars.valueTime}`, - label: 'Time', + label: t('panel.get-data-links-variable-suggestions.value-time-var.label.time', 'Time'), documentation: 'Time value of the clicked datapoint (in ms epoch)', origin: VariableOrigin.Value, }; @@ -233,7 +234,10 @@ export const getCalculationValueDataLinksVariableSuggestions = (dataFrames: Data const fieldVars = getFieldVars(dataFrames); const valueCalcVar = { value: `${DataLinkBuiltInVars.valueCalc}`, - label: 'Calculation name', + label: t( + 'panel.get-calculation-value-data-links-variable-suggestions.value-calc-var.label.calculation-name', + 'Calculation name' + ), documentation: 'Name of the calculation the value is a result of', origin: VariableOrigin.Value, }; diff --git a/public/app/features/playlist/PlaylistNewPage.tsx b/public/app/features/playlist/PlaylistNewPage.tsx index 2973fbec522..9b3934547ff 100644 --- a/public/app/features/playlist/PlaylistNewPage.tsx +++ b/public/app/features/playlist/PlaylistNewPage.tsx @@ -1,6 +1,7 @@ import { useState } from 'react'; import { NavModelItem } from '@grafana/data'; +import { useTranslate } from '@grafana/i18n'; import { locationService } from '@grafana/runtime'; import { Page } from 'app/core/components/Page/Page'; @@ -10,6 +11,7 @@ import { PlaylistForm } from './PlaylistForm'; import { getDefaultPlaylist } from './utils'; export const PlaylistNewPage = () => { + const { t } = useTranslate(); const [playlist] = useState<Playlist>(getDefaultPlaylist()); const [createPlaylist] = useCreatePlaylistMutation(); @@ -21,7 +23,7 @@ export const PlaylistNewPage = () => { }; const pageNav: NavModelItem = { - text: 'New playlist', + text: t('playlist.playlist-new-page.page-nav.text.new-playlist', 'New playlist'), subTitle: 'A playlist rotates through a pre-selected list of dashboards. A playlist can be a great way to build situational awareness, or just show off your metrics to your team or visitors.', }; diff --git a/public/app/features/playlist/StartModal.tsx b/public/app/features/playlist/StartModal.tsx index d20dd68848b..592da40783e 100644 --- a/public/app/features/playlist/StartModal.tsx +++ b/public/app/features/playlist/StartModal.tsx @@ -22,8 +22,8 @@ export const StartModal = ({ playlist, onDismiss }: Props) => { const [displayLinks, setDisplayLinks] = useState(true); const { t } = useTranslate(); const modes: Array<SelectableValue<PlaylistMode>> = [ - { label: 'Normal', value: false }, - { label: 'Kiosk', value: true }, + { label: t('playlist.start-modal.modes.label.normal', 'Normal'), value: false }, + { label: t('playlist.start-modal.modes.label.kiosk', 'Kiosk'), value: true }, ]; const onStart = () => { diff --git a/public/app/features/plugins/admin/components/PluginDetailsPage.tsx b/public/app/features/plugins/admin/components/PluginDetailsPage.tsx index 59b025bc3db..befef04d853 100644 --- a/public/app/features/plugins/admin/components/PluginDetailsPage.tsx +++ b/public/app/features/plugins/admin/components/PluginDetailsPage.tsx @@ -37,13 +37,18 @@ export function PluginDetailsPage({ pluginId, navId = 'plugins', notFoundComponent = <NotFoundPlugin />, - notFoundNavModel = { - text: 'Unknown plugin', - subTitle: 'The requested ID does not belong to any plugin', - active: true, - }, + notFoundNavModel, }: Props) { + const { t } = useTranslate(); const location = useLocation(); + const notFoundModel = notFoundNavModel ?? { + text: t('plugins.plugin-details-page.not-found-model.text.unknown-plugin', 'Unknown plugin'), + subTitle: t( + 'plugins.plugin-details-page.not-found-model.subTitle.requested-belong-plugin', + 'The requested ID does not belong to any plugin' + ), + active: true, + }; const queryParams = new URLSearchParams(location.search); const plugin = useGetSingle(pluginId); // fetches the plugin settings for this Grafana instance const isNarrowScreen = useMedia('(max-width: 600px)'); @@ -73,7 +78,7 @@ export function PluginDetailsPage({ if (!plugin) { return ( - <Page navId={navId} pageNav={notFoundNavModel}> + <Page navId={navId} pageNav={notFoundModel}> {notFoundComponent} </Page> ); diff --git a/public/app/features/plugins/admin/components/PluginDetailsPanel.tsx b/public/app/features/plugins/admin/components/PluginDetailsPanel.tsx index 6b61dd97fb4..c3be98741da 100644 --- a/public/app/features/plugins/admin/components/PluginDetailsPanel.tsx +++ b/public/app/features/plugins/admin/components/PluginDetailsPanel.tsx @@ -246,7 +246,7 @@ export function PluginDetailsPanel(props: Props): React.ReactElement | null { This feature is for reporting malicious or harmful behaviour within plugins. For plugin concerns, email us at:{' '} </Trans> - {/* eslint-disable-next-line @grafana/no-untranslated-strings */} + {/* eslint-disable-next-line @grafana/i18n/no-untranslated-strings */} <TextLink href="mailto:integrations+report-plugin@grafana.com">integrations@grafana.com</TextLink> </Text> <Text> diff --git a/public/app/features/plugins/admin/components/UpdateAllModal.tsx b/public/app/features/plugins/admin/components/UpdateAllModal.tsx index 1a09db39fc4..fff4cd18331 100644 --- a/public/app/features/plugins/admin/components/UpdateAllModal.tsx +++ b/public/app/features/plugins/admin/components/UpdateAllModal.tsx @@ -1,7 +1,6 @@ import { useEffect, useMemo, useRef, useState } from 'react'; -import { useTranslate } from '@grafana/i18n'; -import { TFunction } from '@grafana/i18n/internal'; +import { TFunction, useTranslate } from '@grafana/i18n'; import { config, reportInteraction } from '@grafana/runtime'; import { ConfirmModal } from '@grafana/ui'; diff --git a/public/app/features/plugins/admin/hooks/usePluginDetailsTabs.tsx b/public/app/features/plugins/admin/hooks/usePluginDetailsTabs.tsx index e628d1efaba..069829548b8 100644 --- a/public/app/features/plugins/admin/hooks/usePluginDetailsTabs.tsx +++ b/public/app/features/plugins/admin/hooks/usePluginDetailsTabs.tsx @@ -2,6 +2,7 @@ import { useMemo } from 'react'; import { useLocation } from 'react-router-dom-v5-compat'; import { GrafanaPlugin, NavModelItem, PluginIncludeType, PluginType } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { config } from '@grafana/runtime'; import { contextSrv } from 'app/core/core'; import { AccessControlAction } from 'app/types'; @@ -140,7 +141,7 @@ export const usePluginDetailsTabs = ( if (pluginConfig.meta.includes?.find((include) => include.type === PluginIncludeType.dashboard)) { navModelChildren.push({ - text: 'Dashboards', + text: t('plugins.use-plugin-details-tabs.nav-model-children.text.dashboards', 'Dashboards'), icon: 'apps', id: PluginTabIds.DASHBOARDS, url: `${pathname}?page=${PluginTabIds.DASHBOARDS}`, diff --git a/public/app/features/plugins/admin/pages/Browse.tsx b/public/app/features/plugins/admin/pages/Browse.tsx index b38458c4000..a20a30aff31 100644 --- a/public/app/features/plugins/admin/pages/Browse.tsx +++ b/public/app/features/plugins/admin/pages/Browse.tsx @@ -45,9 +45,9 @@ export default function Browse() { ); const filterByOptions = [ - { value: 'all', label: 'All' }, - { value: 'installed', label: 'Installed' }, - { value: 'has-update', label: 'New Updates' }, + { value: 'all', label: t('plugins.browse.filter-by-options.label.all', 'All') }, + { value: 'installed', label: t('plugins.browse.filter-by-options.label.installed', 'Installed') }, + { value: 'has-update', label: t('plugins.browse.filter-by-options.label.new-updates', 'New Updates') }, ]; const { isLoading: areUpdatesLoading, updatablePlugins } = useGetUpdatable(); @@ -110,10 +110,10 @@ export default function Browse() { onChange={onFilterByTypeChange} width={18} options={[ - { value: 'all', label: 'All' }, - { value: 'datasource', label: 'Data sources' }, - { value: 'panel', label: 'Panels' }, - { value: 'app', label: 'Applications' }, + { value: 'all', label: t('plugins.browse.label.all', 'All') }, + { value: 'datasource', label: t('plugins.browse.label.data-sources', 'Data sources') }, + { value: 'panel', label: t('plugins.browse.label.panels', 'Panels') }, + { value: 'app', label: t('plugins.browse.label.applications', 'Applications') }, ]} /> </Field> diff --git a/public/app/features/plugins/components/PluginPageContext.tsx b/public/app/features/plugins/components/PluginPageContext.tsx index 0c85b4d46de..a3e9e6c1411 100644 --- a/public/app/features/plugins/components/PluginPageContext.tsx +++ b/public/app/features/plugins/components/PluginPageContext.tsx @@ -13,7 +13,9 @@ PluginPageContext.displayName = 'PluginPageContext'; function getInitialPluginPageContext(): PluginPageContextType { return { sectionNav: { + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings main: { text: 'Plugin page' }, + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings node: { text: 'Plugin page' }, }, }; diff --git a/public/app/features/plugins/components/PluginStateInfo.tsx b/public/app/features/plugins/components/PluginStateInfo.tsx index 5857f268ad8..1daf8295433 100644 --- a/public/app/features/plugins/components/PluginStateInfo.tsx +++ b/public/app/features/plugins/components/PluginStateInfo.tsx @@ -1,4 +1,5 @@ import { PluginState } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { Badge, BadgeProps } from '@grafana/ui'; interface Props { @@ -29,19 +30,19 @@ function getFeatureStateInfo(state?: PluginState): BadgeProps | null { switch (state) { case PluginState.deprecated: return { - text: 'Deprecated', + text: t('plugins.get-feature-state-info.text.deprecated', 'Deprecated'), color: 'red', tooltip: `This feature is deprecated and will be removed in a future release`, }; case PluginState.alpha: return { - text: 'Alpha', + text: t('plugins.get-feature-state-info.text.alpha', 'Alpha'), color: 'blue', tooltip: `This feature is experimental and future updates might not be backward compatible`, }; case PluginState.beta: return { - text: 'Beta', + text: t('plugins.get-feature-state-info.text.beta', 'Beta'), color: 'blue', tooltip: `This feature is close to complete but not fully tested`, }; diff --git a/public/app/features/plugins/datasource_srv.ts b/public/app/features/plugins/datasource_srv.ts index 4b5bcda96b8..f434681943f 100644 --- a/public/app/features/plugins/datasource_srv.ts +++ b/public/app/features/plugins/datasource_srv.ts @@ -19,7 +19,7 @@ import { TemplateSrv, isExpressionReference, } from '@grafana/runtime'; -import { ExpressionDatasourceRef } from '@grafana/runtime/internal'; +import { ExpressionDatasourceRef, UserStorage } from '@grafana/runtime/internal'; import { DataQuery, DataSourceJsonData } from '@grafana/schema'; import appEvents from 'app/core/app_events'; import config from 'app/core/config'; @@ -205,6 +205,10 @@ export class DatasourceSrv implements DataSourceService { const instance = new dsPlugin.DataSourceClass(instanceSettings); instance.components = dsPlugin.components; + if (!instance.userStorage) { + // DatasourceApi does not instantiate a userStorage property, but DataSourceWithBackend does + instance.userStorage = new UserStorage(instanceSettings.type); + } // Some old plugins does not extend DataSourceApi so we need to manually patch them if (!(instance instanceof DataSourceApi)) { diff --git a/public/app/features/plugins/extensions/logs/dataSource.ts b/public/app/features/plugins/extensions/logs/dataSource.ts index 8b5ba2a4df1..ff8aa28961e 100644 --- a/public/app/features/plugins/extensions/logs/dataSource.ts +++ b/public/app/features/plugins/extensions/logs/dataSource.ts @@ -10,6 +10,7 @@ import { LoadingState, TestDataSourceResponse, } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { RuntimeDataSource, SceneDataQuery } from '@grafana/scenes'; import { ExtensionsLog, ExtensionsLogItem } from './log'; @@ -47,7 +48,7 @@ export class ExtensionsLogDataSource extends RuntimeDataSource { } testDatasource(): Promise<TestDataSourceResponse> { - return Promise.resolve({ status: 'success', message: 'OK' }); + return Promise.resolve({ status: 'success', message: t('plugins.extensions-log-data-source.message.ok', 'OK') }); } } diff --git a/public/app/features/plugins/extensions/utils.tsx b/public/app/features/plugins/extensions/utils.tsx index 249b4d295e4..e60cff38877 100644 --- a/public/app/features/plugins/extensions/utils.tsx +++ b/public/app/features/plugins/extensions/utils.tsx @@ -377,6 +377,7 @@ export function createExtensionSubMenu(extensions: PluginExtensionLink[]): Panel if (uncategorized.length > 0) { if (subMenu.length > 0) { subMenu.push({ + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings text: 'divider', type: 'divider', }); diff --git a/public/app/features/provisioning/Config/ConfigForm.tsx b/public/app/features/provisioning/Config/ConfigForm.tsx index 27522303f48..2e3b0dd7cab 100644 --- a/public/app/features/provisioning/Config/ConfigForm.tsx +++ b/public/app/features/provisioning/Config/ConfigForm.tsx @@ -2,8 +2,7 @@ import { useEffect, useMemo, useState } from 'react'; import { Controller, useForm } from 'react-hook-form'; import { useNavigate } from 'react-router-dom-v5-compat'; -import { Trans, useTranslate } from '@grafana/i18n'; -import { TFunction } from '@grafana/i18n/internal'; +import { TFunction, Trans, useTranslate } from '@grafana/i18n'; import { Button, Checkbox, diff --git a/public/app/features/provisioning/Config/defaults.ts b/public/app/features/provisioning/Config/defaults.ts index 4c7d77731ef..86603d56e5e 100644 --- a/public/app/features/provisioning/Config/defaults.ts +++ b/public/app/features/provisioning/Config/defaults.ts @@ -1,3 +1,5 @@ +import { t } from '@grafana/i18n/internal'; + import { RepositorySpec } from '../../../api/clients/provisioning'; import { RepositoryFormData } from '../types'; import { specToData } from '../utils/data'; @@ -6,7 +8,7 @@ export function getDefaultValues(repository?: RepositorySpec): RepositoryFormDat if (!repository) { return { type: 'github', - title: 'Repository', + title: t('provisioning.get-default-values.title.repository', 'Repository'), token: '', url: '', branch: 'main', diff --git a/public/app/features/provisioning/File/FileStatusPage.tsx b/public/app/features/provisioning/File/FileStatusPage.tsx index 78f1de462e5..1ac26879876 100644 --- a/public/app/features/provisioning/File/FileStatusPage.tsx +++ b/public/app/features/provisioning/File/FileStatusPage.tsx @@ -87,9 +87,18 @@ function ResourceView({ wrap, repo, repoRef, tab }: Props) { const { t } = useTranslate(); const tabInfo = [ - { value: TabSelection.File, label: 'File (from repository)' }, - { value: TabSelection.Existing, label: 'Existing (from grafana)' }, - { value: TabSelection.DryRun, label: 'Dry Run (result after apply)' }, + { + value: TabSelection.File, + label: t('provisioning.resource-view.tab-info.label.file-from-repository', 'File (from repository)'), + }, + { + value: TabSelection.Existing, + label: t('provisioning.resource-view.tab-info.label.existing-from-grafana', 'Existing (from Grafana)'), + }, + { + value: TabSelection.DryRun, + label: t('provisioning.resource-view.tab-info.label.dry-run-result-after-apply', 'Dry run (result after apply)'), + }, ]; return ( @@ -158,7 +167,10 @@ function ResourceView({ wrap, repo, repoRef, tab }: Props) { name: repo, path: wrap.path!, body: JSON.parse(jsonView), - message: 'updated from repo test UI', + message: t( + 'provisioning.resource-view.message.updated-from-repo-test-ui', + 'updated from repo test UI' + ), }); }} > @@ -173,7 +185,10 @@ function ResourceView({ wrap, repo, repoRef, tab }: Props) { deleteFile({ name: repo, path: wrap.path!, - message: 'removed from repo test UI', + message: t( + 'provisioning.resource-view.message.removed-from-repo-test-ui', + 'removed from repo test UI' + ), }); }} /> diff --git a/public/app/features/provisioning/GettingStarted/GettingStarted.tsx b/public/app/features/provisioning/GettingStarted/GettingStarted.tsx index ddecc146123..cadf84a2cbe 100644 --- a/public/app/features/provisioning/GettingStarted/GettingStarted.tsx +++ b/public/app/features/provisioning/GettingStarted/GettingStarted.tsx @@ -2,8 +2,7 @@ import { css } from '@emotion/css'; import { useState } from 'react'; import { GrafanaTheme2 } from '@grafana/data'; -import { Trans, useTranslate } from '@grafana/i18n'; -import { TFunction } from '@grafana/i18n/internal'; +import { TFunction, Trans, useTranslate } from '@grafana/i18n'; import { Alert, Stack, useStyles2 } from '@grafana/ui'; import { useGetFrontendSettingsQuery, Repository } from 'app/api/clients/provisioning'; import provisioningSvg from 'img/provisioning/provisioning.svg'; diff --git a/public/app/features/provisioning/Job/RecentJobs.tsx b/public/app/features/provisioning/Job/RecentJobs.tsx index de5cbb8f59d..46270c6785b 100644 --- a/public/app/features/provisioning/Job/RecentJobs.tsx +++ b/public/app/features/provisioning/Job/RecentJobs.tsx @@ -1,8 +1,7 @@ import { useMemo } from 'react'; import { intervalToAbbreviatedDurationString, TraceKeyValuePair } from '@grafana/data'; -import { Trans, useTranslate } from '@grafana/i18n'; -import { TFunction } from '@grafana/i18n/internal'; +import { TFunction, Trans, useTranslate } from '@grafana/i18n'; import { Alert, Badge, Box, Card, Icon, InteractiveTable, Spinner, Stack, Text } from '@grafana/ui'; import { Job, Repository, SyncStatus } from 'app/api/clients/provisioning'; import KeyValuesTable from 'app/features/explore/TraceView/components/TraceTimelineViewer/SpanDetail/KeyValuesTable'; diff --git a/public/app/features/provisioning/Repository/EditRepositoryPage.tsx b/public/app/features/provisioning/Repository/EditRepositoryPage.tsx index 40b6cfa2750..87bd463a235 100644 --- a/public/app/features/provisioning/Repository/EditRepositoryPage.tsx +++ b/public/app/features/provisioning/Repository/EditRepositoryPage.tsx @@ -1,6 +1,6 @@ import { useParams } from 'react-router-dom-v5-compat'; -import { Trans } from '@grafana/i18n'; +import { Trans, useTranslate } from '@grafana/i18n'; import { EmptyState, Text, TextLink } from '@grafana/ui'; import { useGetRepositoryQuery } from 'app/api/clients/provisioning'; import { Page } from 'app/core/components/Page/Page'; @@ -9,6 +9,7 @@ import { ConfigForm } from '../Config/ConfigForm'; import { PROVISIONING_URL } from '../constants'; export default function EditRepositoryPage() { + const { t } = useTranslate(); const { name = '' } = useParams(); const query = useGetRepositoryQuery({ name }); //@ts-expect-error TODO add error types @@ -16,7 +17,13 @@ export default function EditRepositoryPage() { return ( <Page navId="provisioning" - pageNav={{ text: 'Configure repository', subTitle: 'Configure a repository for storing your resources.' }} + pageNav={{ + text: t('provisioning.edit-repository-page.text.configure-repository', 'Configure repository'), + subTitle: t( + 'provisioning.edit-repository-page.subTitle.configure-repository-storing-resources', + 'Configure a repository for storing your resources.' + ), + }} > <Page.Contents isLoading={query.isLoading}> {notFound ? ( diff --git a/public/app/features/provisioning/Shared/TokenPermissionsInfo.tsx b/public/app/features/provisioning/Shared/TokenPermissionsInfo.tsx index f248fd48bf1..e59b3e2d200 100644 --- a/public/app/features/provisioning/Shared/TokenPermissionsInfo.tsx +++ b/public/app/features/provisioning/Shared/TokenPermissionsInfo.tsx @@ -10,7 +10,7 @@ export function TokenPermissionsInfo() { return ( <div className={styles.container}> {/* GitHub UI is English only, so these strings are not translated */} - {/* eslint-disable-next-line @grafana/no-untranslated-strings */} + {/* eslint-disable @grafana/i18n/no-untranslated-strings */} <Stack gap={0.5} wrap={'wrap'}> <Trans i18nKey="provisioning.token-permissions-info.go-to">Go to</Trans> <TextLink external href="https://github.com/settings/personal-access-tokens/new"> @@ -20,21 +20,22 @@ export function TokenPermissionsInfo() { <strong>"Fine-grained token".</strong> <Trans i18nKey="provisioning.token-permissions-info.make-sure">Make sure to include these permissions</Trans>: </Stack> + {/* eslint-enable @grafana/i18n/no-untranslated-strings */} <ul className={styles.permissionsList}> - {/* eslint-disable-next-line @grafana/no-untranslated-strings */} + {/* eslint-disable-next-line @grafana/i18n/no-untranslated-strings */} <li> Content: <span className={styles.accessLevel}>Read and write</span> </li> - {/* eslint-disable-next-line @grafana/no-untranslated-strings */} + {/* eslint-disable-next-line @grafana/i18n/no-untranslated-strings */} <li> Metadata: <span className={styles.accessLevel}>Read only</span> </li> - {/* eslint-disable-next-line @grafana/no-untranslated-strings */} + {/* eslint-disable-next-line @grafana/i18n/no-untranslated-strings */} <li> Pull requests: <span className={styles.accessLevel}>Read and write</span> </li> - {/* eslint-disable-next-line @grafana/no-untranslated-strings */} + {/* eslint-disable-next-line @grafana/i18n/no-untranslated-strings */} <li> Webhooks: <span className={styles.accessLevel}>Read and write</span> </li> @@ -65,7 +66,7 @@ function getStyles(theme: GrafanaTheme2) { }), accessLevel: css({ fontFamily: theme.typography.fontFamilyMonospace, - background: '#22262B', + background: theme.colors.background.secondary, borderRadius: theme.shape.radius.default, padding: theme.spacing(0.25, 0.5), }), diff --git a/public/app/features/provisioning/Wizard/BootstrapStep.test.tsx b/public/app/features/provisioning/Wizard/BootstrapStep.test.tsx new file mode 100644 index 00000000000..b39f6b6ff63 --- /dev/null +++ b/public/app/features/provisioning/Wizard/BootstrapStep.test.tsx @@ -0,0 +1,273 @@ +import { render, screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import { ReactNode } from 'react'; +import { useForm, FormProvider } from 'react-hook-form'; + +import { useGetRepositoryFilesQuery, useGetResourceStatsQuery } from 'app/api/clients/provisioning'; + +import { BootstrapStep, Props } from './BootstrapStep'; +import { getResourceStats, useModeOptions } from './actions'; +import { WizardFormData } from './types'; + +jest.mock('app/api/clients/provisioning', () => ({ + useGetRepositoryFilesQuery: jest.fn(), + useGetResourceStatsQuery: jest.fn(), +})); + +jest.mock('./actions', () => ({ + getResourceStats: jest.fn(), + useModeOptions: jest.fn(), +})); + +// Wrapper component to provide form context +function FormWrapper({ children, defaultValues }: { children: ReactNode; defaultValues?: Partial<WizardFormData> }) { + const methods = useForm<WizardFormData>({ + defaultValues: { + repository: { + type: 'github', + url: 'https://github.com/test/repo', + title: '', + sync: { + target: 'instance', + enabled: true, + }, + branch: 'main', + path: '', + readOnly: false, + prWorkflow: false, + ...defaultValues?.repository, + }, + ...defaultValues, + }, + }); + + return <FormProvider {...methods}>{children}</FormProvider>; +} + +function setup(props: Partial<Props> = {}, formDefaultValues?: Partial<WizardFormData>) { + const user = userEvent.setup(); + + const defaultProps: Props = { + onOptionSelect: jest.fn(), + onStepStatusUpdate: jest.fn(), + repoName: 'test-repo', + settingsData: undefined, + ...props, + }; + + const utils = render( + <FormWrapper defaultValues={formDefaultValues}> + <BootstrapStep {...defaultProps} /> + </FormWrapper> + ); + + return { + user, + props: defaultProps, + ...utils, + }; +} + +describe('BootstrapStep', () => { + beforeEach(() => { + jest.clearAllMocks(); + + (useGetRepositoryFilesQuery as jest.Mock).mockReturnValue({ + data: { items: [] }, + isLoading: false, + }); + + (useGetResourceStatsQuery as jest.Mock).mockReturnValue({ + data: { instance: [] }, + isLoading: false, + }); + + (getResourceStats as jest.Mock).mockReturnValue({ + fileCount: 0, + resourceCount: 0, + resourceCountString: '', + }); + + (useModeOptions as jest.Mock).mockReturnValue([ + { + target: 'instance', + label: 'Sync all resources with external storage', + description: 'Resources will be synced with external storage', + subtitle: 'Use this option if you want to sync your entire instance', + }, + { + target: 'folder', + label: 'Sync external storage to a new Grafana folder', + description: 'A new Grafana folder will be created', + subtitle: 'Use this option to sync into a new folder', + }, + ]); + }); + + describe('rendering', () => { + it('should render loading state when data is loading', () => { + (useGetRepositoryFilesQuery as jest.Mock).mockReturnValue({ + data: undefined, + isLoading: true, + }); + + const { props } = setup(); + + expect(screen.getByText('Loading resource information...')).toBeInTheDocument(); + expect(props.onStepStatusUpdate).toHaveBeenCalledWith({ status: 'running' }); + }); + + it('should render correct info for GitHub repository type', async () => { + const { props } = setup(); + + expect(await screen.findByText('Grafana instance')).toBeInTheDocument(); + expect(screen.getByText('External storage')).toBeInTheDocument(); + expect(screen.getAllByText('Empty')).toHaveLength(2); // Both should show empty + + expect(props.onStepStatusUpdate).toHaveBeenCalledWith({ status: 'idle' }); + }); + + it('should render correct info for local file repository type', async () => { + (useGetRepositoryFilesQuery as jest.Mock).mockReturnValue({ + data: { + items: [ + { path: 'dashboard1.json' }, + { path: 'dashboard2.yaml' }, + { path: 'README.md' }, // Should not be counted + ], + }, + isLoading: false, + }); + + (getResourceStats as jest.Mock).mockReturnValue({ + fileCount: 2, + resourceCount: 0, + resourceCountString: '', + }); + + setup(); + + expect(await screen.findByText('2 files')).toBeInTheDocument(); + }); + + it('should display resource counts when resources exist', async () => { + (useGetResourceStatsQuery as jest.Mock).mockReturnValue({ + data: { + instance: [ + { group: 'dashboard.grafana.app', count: 5 }, + { group: 'folders', count: 2 }, + ], + }, + isLoading: false, + }); + + (getResourceStats as jest.Mock).mockReturnValue({ + fileCount: 0, + resourceCount: 7, + resourceCountString: '7 resources', + }); + + setup(); + + expect(await screen.findByText('7 resources')).toBeInTheDocument(); + }); + }); + + describe('option selection', () => { + it('should call onOptionSelect with correct argument when no migration needed', async () => { + const { props } = setup(); + + await waitFor(() => { + expect(props.onOptionSelect).toHaveBeenCalledWith(false); + }); + }); + + it('should call onOptionSelect with true when legacy storage exists', async () => { + const { props } = setup({ + settingsData: { + legacyStorage: true, + items: [], + }, + }); + + await waitFor(() => { + expect(props.onOptionSelect).toHaveBeenCalledWith(true); + }); + }); + + it('should call onOptionSelect with true when resources exist', async () => { + (useGetResourceStatsQuery as jest.Mock).mockReturnValue({ + data: { + instance: [{ group: 'dashboard.grafana.app', count: 1 }], + }, + isLoading: false, + }); + + (getResourceStats as jest.Mock).mockReturnValue({ + fileCount: 0, + resourceCount: 1, + resourceCountString: '1 resource', + }); + + const { props } = setup(); + + await waitFor(() => { + expect(props.onOptionSelect).toHaveBeenCalledWith(true); + }); + }); + }); + + describe('sync target options', () => { + it('should display both instance and folder options by default', async () => { + setup(); + + expect(await screen.findByText('Sync all resources with external storage')).toBeInTheDocument(); + expect(await screen.findByText('Sync external storage to a new Grafana folder')).toBeInTheDocument(); + }); + + it('should only display instance option when legacy storage exists', async () => { + (useModeOptions as jest.Mock).mockReturnValue([ + { + target: 'instance', + label: 'Sync all resources with external storage', + description: 'Resources will be synced with external storage', + subtitle: 'Use this option if you want to sync your entire instance', + }, + ]); + + setup({ + settingsData: { + legacyStorage: true, + items: [], + }, + }); + + expect(await screen.findByText('Sync all resources with external storage')).toBeInTheDocument(); + expect(screen.queryByText('Sync external storage to a new Grafana folder')).not.toBeInTheDocument(); + }); + + it('should allow selecting different sync targets', async () => { + const { user } = setup(); + + const folderOption = await screen.findByText('Sync external storage to a new Grafana folder'); + await user.click(folderOption); + + // Check that the folder option is now selected by looking for the title field + expect(await screen.findByRole('textbox', { name: /display name/i })).toBeInTheDocument(); + }); + }); + + describe('title field visibility', () => { + it('should show title field only for folder sync target', async () => { + const { user } = setup(); + + // Initially should not show title field (default is instance) + expect(screen.queryByRole('textbox', { name: /display name/i })).not.toBeInTheDocument(); + + const folderOption = await screen.findByText('Sync external storage to a new Grafana folder'); + await user.click(folderOption); + + expect(await screen.findByRole('textbox', { name: /display name/i })).toBeInTheDocument(); + }); + }); +}); diff --git a/public/app/features/provisioning/Wizard/BootstrapStep.tsx b/public/app/features/provisioning/Wizard/BootstrapStep.tsx index bf309fda9b3..5c0d3afef4d 100644 --- a/public/app/features/provisioning/Wizard/BootstrapStep.tsx +++ b/public/app/features/provisioning/Wizard/BootstrapStep.tsx @@ -8,7 +8,7 @@ import { RepositoryViewList, useGetRepositoryFilesQuery, useGetResourceStatsQuer import { getResourceStats, useModeOptions } from './actions'; import { StepStatusInfo, WizardFormData } from './types'; -interface Props { +export interface Props { onOptionSelect: (requiresMigration: boolean) => void; onStepStatusUpdate: (info: StepStatusInfo) => void; settingsData?: RepositoryViewList; @@ -29,10 +29,14 @@ export function BootstrapStep({ onOptionSelect, settingsData, repoName, onStepSt const filesQuery = useGetRepositoryFilesQuery({ name: repoName }); const selectedTarget = watch('repository.sync.target'); const options = useModeOptions(repoName, settingsData); + const { target } = options[0]; const { resourceCount, resourceCountString, fileCount } = useMemo( () => getResourceStats(filesQuery.data, resourceStats.data), [filesQuery.data, resourceStats.data] ); + const requiresMigration = settingsData?.legacyStorage || resourceCount > 0; + const isLoading = resourceStats.isLoading || filesQuery.isLoading; + const { t } = useTranslate(); useEffect(() => { // Pick a name nice name based on type+settings @@ -49,22 +53,15 @@ export function BootstrapStep({ onOptionSelect, settingsData, repoName, onStepSt }, [getValues, setValue]); useEffect(() => { - const isLoading = resourceStats.isLoading || filesQuery.isLoading; onStepStatusUpdate({ status: isLoading ? 'running' : 'idle' }); - }, [filesQuery.isLoading, onStepStatusUpdate, resourceStats.isLoading]); + }, [isLoading, onStepStatusUpdate]); - // Auto select the first option on mount useEffect(() => { - const { target } = options[0]; setValue('repository.sync.target', target); - onOptionSelect(settingsData?.legacyStorage || resourceCount > 0); - // Only run this effect on mount - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - const { t } = useTranslate(); + onOptionSelect(requiresMigration); + }, [target, setValue, onOptionSelect, requiresMigration]); - if (resourceStats.isLoading || filesQuery.isLoading) { + if (isLoading) { return ( <Box padding={4}> <LoadingPlaceholder @@ -107,13 +104,14 @@ export function BootstrapStep({ onOptionSelect, settingsData, repoName, onStepSt control={control} render={({ field: { ref, onChange, ...field } }) => ( <> - {options.map((action, index) => ( + {options.map((action) => ( <Card key={action.target} isSelected={action.target === selectedTarget} onClick={() => { onChange(action.target); }} + noMargin {...field} > <Card.Heading>{action.label}</Card.Heading> @@ -140,8 +138,10 @@ export function BootstrapStep({ onOptionSelect, settingsData, repoName, onStepSt error={errors.repository?.title?.message} invalid={!!errors.repository?.title} required + noMargin > <Input + id="repository-title" {...register('repository.title', { required: t('provisioning.bootstrap-step.error-field-required', 'This field is required.'), })} diff --git a/public/app/features/provisioning/Wizard/ConnectPage.tsx b/public/app/features/provisioning/Wizard/ConnectPage.tsx index a696a5049e3..0504fd8bf7b 100644 --- a/public/app/features/provisioning/Wizard/ConnectPage.tsx +++ b/public/app/features/provisioning/Wizard/ConnectPage.tsx @@ -1,11 +1,13 @@ import { useParams } from 'react-router-dom-v5-compat'; +import { useTranslate } from '@grafana/i18n'; import { Page } from 'app/core/components/Page/Page'; import { ProvisioningWizard } from './ProvisioningWizard'; import { RepoType } from './types'; export default function ConnectPage() { + const { t } = useTranslate(); const { type } = useParams<{ type: RepoType }>(); if (!type) { @@ -17,7 +19,10 @@ export default function ConnectPage() { navId="provisioning" pageNav={{ text: type === 'github' ? 'Configure Git Sync' : 'Configure local file path', - subTitle: 'Connect to an external storage to manage your resources', + subTitle: t( + 'provisioning.connect-page.subTitle.connect-external-storage-manage-resources', + 'Connect to an external storage to manage your resources' + ), }} > <Page.Contents> diff --git a/public/app/features/provisioning/Wizard/ConnectStep.tsx b/public/app/features/provisioning/Wizard/ConnectStep.tsx index 954a95efdc9..a02b73fc0b5 100644 --- a/public/app/features/provisioning/Wizard/ConnectStep.tsx +++ b/public/app/features/provisioning/Wizard/ConnectStep.tsx @@ -28,6 +28,7 @@ export function ConnectStep() { <> <TokenPermissionsInfo /> <Field + noMargin label={t('provisioning.connect-step.label-access-token', 'GitHub access token')} required description={t( @@ -62,6 +63,7 @@ export function ConnectStep() { </Field> <Field + noMargin label={t('provisioning.connect-step.label-repository-url', 'GitHub repository URL')} error={errors.repository?.url?.message} invalid={!!errors.repository?.url} @@ -83,11 +85,13 @@ export function ConnectStep() { ), }, })} + id={'repository-url'} placeholder={t('provisioning.connect-step.placeholder-github-url', 'https://github.com/username/repo')} /> </Field> <Field + noMargin label={t('provisioning.connect-step.label-branch', 'Branch name')} description={t('provisioning.connect-step.description-branch', 'Branch to use for the GitHub repository')} error={errors.repository?.branch?.message} @@ -95,11 +99,13 @@ export function ConnectStep() { > <Input {...register('repository.branch')} + id={'repository-branch'} placeholder={t('provisioning.connect-step.placeholder-branch', 'main')} /> </Field> <Field + noMargin label={t('provisioning.connect-step.label-path', 'Path to subdirectory in repository')} error={errors.repository?.path?.message} invalid={!!errors.repository?.path} @@ -108,13 +114,14 @@ export function ConnectStep() { 'This is the path to a subdirectory in your GitHub repository where dashboards will be stored and provisioned from' )} > - <Input {...register('repository.path')} /> + <Input {...register('repository.path')} id="repository-path" /> </Field> </> )} {type === 'local' && ( <Field + noMargin label={t('provisioning.connect-step.label-local-path', 'Local path')} error={errors.repository?.path?.message} invalid={!!errors.repository?.path} @@ -123,6 +130,7 @@ export function ConnectStep() { {...register('repository.path', { required: t('provisioning.connect-step.error-field-required', 'This field is required.'), })} + id="repository-local-path" placeholder={t('provisioning.connect-step.placeholder-local-path', '/path/to/repo')} /> </Field> diff --git a/public/app/features/provisioning/Wizard/ProvisioningWizard.tsx b/public/app/features/provisioning/Wizard/ProvisioningWizard.tsx index 18713ac2562..90f562ca228 100644 --- a/public/app/features/provisioning/Wizard/ProvisioningWizard.tsx +++ b/public/app/features/provisioning/Wizard/ProvisioningWizard.tsx @@ -4,8 +4,7 @@ import { FormProvider, useForm } from 'react-hook-form'; import { useNavigate } from 'react-router-dom-v5-compat'; import { AppEvents, GrafanaTheme2 } from '@grafana/data'; -import { useTranslate } from '@grafana/i18n'; -import { TFunction } from '@grafana/i18n/internal'; +import { TFunction, useTranslate } from '@grafana/i18n'; import { getAppEvents, isFetchError } from '@grafana/runtime'; import { Alert, Box, Button, Stack, Text, useStyles2 } from '@grafana/ui'; import { useDeleteRepositoryMutation, useGetFrontendSettingsQuery } from 'app/api/clients/provisioning'; @@ -238,7 +237,6 @@ export function ProvisioningWizard({ type }: { type: RepoType }) { <FormPrompt onDiscard={handleCancel} confirmRedirect={isDirty && activeStep !== 'finish' && !isCancelling} /> <Stack direction="column"> <Box marginBottom={2}> - {/* eslint-disable-next-line @grafana/no-untranslated-strings */} <Text element="h2"> {currentStepIndex + 1}. {currentStepConfig?.title} </Text> @@ -259,7 +257,11 @@ export function ProvisioningWizard({ type }: { type: RepoType }) { /> )} {activeStep === 'synchronize' && ( - <SynchronizeStep onStepStatusUpdate={setStepStatusInfo} requiresMigration={requiresMigration} /> + <SynchronizeStep + onStepStatusUpdate={setStepStatusInfo} + requiresMigration={requiresMigration} + isLegacyStorage={Boolean(settingsQuery.data?.legacyStorage)} + /> )} {activeStep === 'finish' && <FinishStep />} </div> diff --git a/public/app/features/provisioning/Wizard/SynchronizeStep.tsx b/public/app/features/provisioning/Wizard/SynchronizeStep.tsx index 087381ae6ec..f7822be4bde 100644 --- a/public/app/features/provisioning/Wizard/SynchronizeStep.tsx +++ b/public/app/features/provisioning/Wizard/SynchronizeStep.tsx @@ -12,13 +12,14 @@ import { StepStatusInfo, WizardFormData } from './types'; export interface SynchronizeStepProps { onStepStatusUpdate: (info: StepStatusInfo) => void; requiresMigration: boolean; + isLegacyStorage?: boolean; } -export function SynchronizeStep({ onStepStatusUpdate, requiresMigration }: SynchronizeStepProps) { +export function SynchronizeStep({ onStepStatusUpdate, requiresMigration, isLegacyStorage }: SynchronizeStepProps) { const [createJob] = useCreateRepositoryJobsMutation(); const { getValues, register, watch } = useFormContext<WizardFormData>(); const repoType = watch('repository.type'); - const supportsHistory = requiresMigration && repoType === 'github'; + const supportsHistory = repoType === 'github' && isLegacyStorage; const [job, setJob] = useState<Job>(); const { t } = useTranslate(); const startSynchronization = async () => { @@ -117,9 +118,10 @@ export function SynchronizeStep({ onStepStatusUpdate, requiresMigration }: Synch <Text element="h3"> <Trans i18nKey="provisioning.synchronize-step.synchronization-options">Synchronization options</Trans> </Text> - <Field> + <Field noMargin> <Checkbox {...register('migrate.history')} + id="migrate-history" label={t('provisioning.wizard.sync-option-history', 'History')} description={ <Trans i18nKey="provisioning.synchronize-step.synchronization-description"> diff --git a/public/app/features/query/components/QueryEditorRowHeader.tsx b/public/app/features/query/components/QueryEditorRowHeader.tsx index 79c1cb76534..443f95b04f8 100644 --- a/public/app/features/query/components/QueryEditorRowHeader.tsx +++ b/public/app/features/query/components/QueryEditorRowHeader.tsx @@ -138,7 +138,6 @@ 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>; } diff --git a/public/app/features/query/components/QueryGroupOptions.tsx b/public/app/features/query/components/QueryGroupOptions.tsx index 35baa0901bb..995f74c1608 100644 --- a/public/app/features/query/components/QueryGroupOptions.tsx +++ b/public/app/features/query/components/QueryGroupOptions.tsx @@ -169,7 +169,7 @@ export const QueryGroupOptionsEditor = React.memo(({ options, dataSource, data, <Input id="cache-timeout-id" type="text" - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="60" spellCheck={false} onBlur={onCacheTimeoutBlur} @@ -193,7 +193,7 @@ export const QueryGroupOptionsEditor = React.memo(({ options, dataSource, data, </InlineLabel> <Input type="number" - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder={`${dataSource.cachingConfig.TTLMs}`} spellCheck={false} onBlur={onQueryCachingTTLBlur} @@ -226,7 +226,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 + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder={`${realMd}`} spellCheck={false} onBlur={onMaxDataPointsBlur} @@ -267,7 +267,7 @@ export const QueryGroupOptionsEditor = React.memo(({ options, dataSource, data, <Input id="min-interval-input" type="text" - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder={`${minIntervalOnDs}`} spellCheck={false} onBlur={onMinIntervalBlur} @@ -359,7 +359,7 @@ export const QueryGroupOptionsEditor = React.memo(({ options, dataSource, data, <Input id="relative-time-input" type="text" - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="1h" onChange={onRelativeTimeChange} onBlur={onOverrideTime} @@ -385,7 +385,7 @@ export const QueryGroupOptionsEditor = React.memo(({ options, dataSource, data, <Input id="time-shift-input" type="text" - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="1h" onChange={onTimeShiftChange} onBlur={onTimeShift} diff --git a/public/app/features/query/state/updateQueries.test.ts b/public/app/features/query/state/updateQueries.test.ts index 579a8c59ec2..b0c7e2de673 100644 --- a/public/app/features/query/state/updateQueries.test.ts +++ b/public/app/features/query/state/updateQueries.test.ts @@ -1,11 +1,14 @@ import { DataSourceApi, DataSourceWithQueryExportSupport, DataSourceWithQueryImportSupport } from '@grafana/data'; import { ExpressionDatasourceRef } from '@grafana/runtime/internal'; import { DataQuery } from '@grafana/schema'; -import { TestQuery } from 'app/core/utils/query.test'; import { TemplateSrv } from 'app/features/templating/template_srv'; import { updateQueries } from './updateQueries'; +interface TestQuery extends DataQuery { + name?: string; +} + const oldUidDS = { uid: 'old-uid', type: 'old-type', diff --git a/public/app/features/sandbox/TestStuffPage.tsx b/public/app/features/sandbox/TestStuffPage.tsx index d61da257f1c..990ad6f2462 100644 --- a/public/app/features/sandbox/TestStuffPage.tsx +++ b/public/app/features/sandbox/TestStuffPage.tsx @@ -1,5 +1,5 @@ +/* eslint-disable @grafana/i18n/no-untranslated-strings */ import { NavModelItem } from '@grafana/data'; -import { Trans } from '@grafana/i18n'; import { usePluginLinks } from '@grafana/runtime'; import { Button, LinkButton, Stack, Text } from '@grafana/ui'; import { Page } from 'app/core/components/Page/Page'; @@ -19,26 +19,22 @@ export const TestStuffPage = () => { return ( <Page navModel={{ node: node, main: node }}> <LinkToBasicApp extensionPointId="grafana/sandbox/testing" /> - <Text variant="h5"> - <Trans i18nKey="sandbox.test-stuff-page.application-notifications-toasts-testing"> - Application notifications (toasts) testing - </Trans> - </Text> + <Text variant="h5">Application notifications (toasts) testing</Text> <Stack> <Button onClick={() => notifyApp.success('Success toast', 'some more text goes here')} variant="primary"> - <Trans i18nKey="sandbox.test-stuff-page.success">Success</Trans> + Success </Button> <Button onClick={() => notifyApp.warning('Warning toast', 'some more text goes here', 'bogus-trace-99999')} variant="secondary" > - <Trans i18nKey="sandbox.test-stuff-page.warning">Warning</Trans> + Warning </Button> <Button onClick={() => notifyApp.error('Error toast', 'some more text goes here', 'bogus-trace-fdsfdfsfds')} variant="destructive" > - <Trans i18nKey="sandbox.test-stuff-page.error">Error</Trans> + Error </Button> </Stack> </Page> diff --git a/public/app/features/search/page/components/ActionRow.tsx b/public/app/features/search/page/components/ActionRow.tsx index 23de16ab8ce..dce8e0256dd 100644 --- a/public/app/features/search/page/components/ActionRow.tsx +++ b/public/app/features/search/page/components/ActionRow.tsx @@ -2,8 +2,7 @@ import { css } from '@emotion/css'; import { FormEvent } from 'react'; import { GrafanaTheme2, SelectableValue } from '@grafana/data'; -import { Trans, useTranslate } from '@grafana/i18n'; -import { TFunction } from '@grafana/i18n/internal'; +import { TFunction, Trans, useTranslate } from '@grafana/i18n'; import { config } from '@grafana/runtime'; import { Button, Checkbox, Stack, RadioButtonGroup, useStyles2 } from '@grafana/ui'; import { SortPicker } from 'app/core/components/Select/SortPicker'; diff --git a/public/app/features/search/service/bluge.ts b/public/app/features/search/service/bluge.ts index 756658c9a69..47573a386a1 100644 --- a/public/app/features/search/service/bluge.ts +++ b/public/app/features/search/service/bluge.ts @@ -6,6 +6,7 @@ import { SelectableValue, toDataFrame, } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { config, getBackendSrv } from '@grafana/runtime'; import { TermCount } from 'app/core/components/TagFilter/TagFilter'; @@ -87,8 +88,8 @@ export class BlugeSearcher implements GrafanaSearcher { // This should eventually be filled by an API call, but hardcoded is a good start getSortOptions(): Promise<SelectableValue[]> { const opts: SelectableValue[] = [ - { value: folderViewSort, label: 'Alphabetically (A-Z)' }, - { value: '-name_sort', label: 'Alphabetically (Z-A)' }, + { value: folderViewSort, label: t('search.bluge-searcher.opts.label.alphabetically-az', 'Alphabetically (A-Z)') }, + { value: '-name_sort', label: t('search.bluge-searcher.opts.label.alphabetically-za', 'Alphabetically (Z-A)') }, ]; if (config.licenseInfo.enabledFeatures.analytics) { diff --git a/public/app/features/search/service/unified.ts b/public/app/features/search/service/unified.ts index 2746ca81748..80649b1ace7 100644 --- a/public/app/features/search/service/unified.ts +++ b/public/app/features/search/service/unified.ts @@ -1,6 +1,7 @@ import { isEmpty } from 'lodash'; import { DataFrame, DataFrameView, getDisplayProcessor, SelectableValue, toDataFrame } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { config, getBackendSrv } from '@grafana/runtime'; import { TermCount } from 'app/core/components/TagFilter/TagFilter'; import kbn from 'app/core/utils/kbn'; @@ -93,8 +94,11 @@ export class UnifiedSearcher implements GrafanaSearcher { // TODO: Implement this correctly getSortOptions(): Promise<SelectableValue[]> { const opts: SelectableValue[] = [ - { value: folderViewSort, label: 'Alphabetically (A-Z)' }, - { value: '-name_sort', label: 'Alphabetically (Z-A)' }, + { + value: folderViewSort, + label: t('search.unified-searcher.opts.label.alphabetically-az', 'Alphabetically (A-Z)'), + }, + { value: '-name_sort', label: t('search.unified-searcher.opts.label.alphabetically-za', 'Alphabetically (Z-A)') }, ]; if (config.licenseInfo.enabledFeatures.analytics) { diff --git a/public/app/features/serviceaccounts/ServiceAccountPage.tsx b/public/app/features/serviceaccounts/ServiceAccountPage.tsx index f1a19534348..76f17e879fe 100644 --- a/public/app/features/serviceaccounts/ServiceAccountPage.tsx +++ b/public/app/features/serviceaccounts/ServiceAccountPage.tsx @@ -63,6 +63,7 @@ export const ServiceAccountPageUnconnected = ({ loadServiceAccountTokens, updateServiceAccount, }: Props): JSX.Element => { + const { t } = useTranslate(); const [newToken, setNewToken] = useState(''); const [isTokenModalOpen, setIsTokenModalOpen] = useState(false); const [isDeleteModalOpen, setIsDeleteModalOpen] = useState(false); @@ -83,7 +84,10 @@ export const ServiceAccountPageUnconnected = ({ const pageNav: NavModelItem = { text: serviceAccount.name, img: serviceAccount.avatarUrl, - subTitle: 'Manage settings for an individual service account.', + subTitle: t( + 'serviceaccounts.service-account-page-unconnected.page-nav.subTitle.manage-settings-individual-service-account', + 'Manage settings for an individual service account.' + ), }; useEffect(() => { @@ -94,8 +98,6 @@ export const ServiceAccountPageUnconnected = ({ } }, [loadServiceAccount, loadServiceAccountTokens, id]); - const { t } = useTranslate(); - const onProfileChange = (serviceAccount: ServiceAccountDTO) => { updateServiceAccount(serviceAccount); }; diff --git a/public/app/features/support-bundles/SupportBundlesCreate.tsx b/public/app/features/support-bundles/SupportBundlesCreate.tsx index 9a3714f0874..5422ba347a9 100644 --- a/public/app/features/support-bundles/SupportBundlesCreate.tsx +++ b/public/app/features/support-bundles/SupportBundlesCreate.tsx @@ -1,7 +1,7 @@ import { useEffect } from 'react'; import { connect, ConnectedProps } from 'react-redux'; -import { Trans } from '@grafana/i18n'; +import { Trans, useTranslate } from '@grafana/i18n'; import { Button, Field, Checkbox, LinkButton, Stack, Alert } from '@grafana/ui'; import { Form } from 'app/core/components/Form/Form'; import { Page } from 'app/core/components/Page/Page'; @@ -35,6 +35,7 @@ export const SupportBundlesCreateUnconnected = ({ loadSupportBundleCollectors, createSupportBundle, }: Props): JSX.Element => { + const { t } = useTranslate(); const onSubmit = (data: Record<string, boolean>) => { const selectedLabelsArray = Object.keys(data).filter((key) => data[key]); createSupportBundle({ collectors: selectedLabelsArray }); @@ -58,7 +59,16 @@ export const SupportBundlesCreateUnconnected = ({ ); return ( - <Page navId="support-bundles" pageNav={{ text: 'Create support bundle' }} subTitle={subTitle}> + <Page + navId="support-bundles" + pageNav={{ + text: t( + 'support-bundles.support-bundles-create-unconnected.text.create-support-bundle', + 'Create support bundle' + ), + }} + subTitle={subTitle} + > <Page.Contents isLoading={isLoading}> {loadCollectorsError && <Alert title={loadCollectorsError} severity="error" />} {createBundleError && <Alert title={createBundleError} severity="error" />} diff --git a/public/app/features/teams/CreateTeam.tsx b/public/app/features/teams/CreateTeam.tsx index b4e3e67b000..2467ca9d422 100644 --- a/public/app/features/teams/CreateTeam.tsx +++ b/public/app/features/teams/CreateTeam.tsx @@ -81,7 +81,7 @@ export const CreateTeam = (): JSX.Element => { 'This is optional and is primarily used for allowing custom team avatars' )} > - {/* eslint-disable-next-line @grafana/no-untranslated-strings */} + {/* eslint-disable-next-line @grafana/i18n/no-untranslated-strings */} <Input {...register('email')} type="email" id="team-email" placeholder="email@test.com" /> </Field> </FieldSet> diff --git a/public/app/features/teams/TeamGroupSync.tsx b/public/app/features/teams/TeamGroupSync.tsx index 05ea9719ffa..d05365dc3bf 100644 --- a/public/app/features/teams/TeamGroupSync.tsx +++ b/public/app/features/teams/TeamGroupSync.tsx @@ -167,7 +167,9 @@ export class TeamGroupSync extends PureComponent<Props, State> { {groups.length === 0 && !isAdding && (highlightTrial() ? ( - <TeamSyncUpgradeContent action={{ onClick: this.onToggleAdding, text: 'Add group' }} /> + <TeamSyncUpgradeContent + action={{ onClick: this.onToggleAdding, text: t('teams.team-group-sync.text.add-group', 'Add group') }} + /> ) : ( <EmptyListCTA onClick={this.onToggleAdding} diff --git a/public/app/features/teams/TeamSettings.tsx b/public/app/features/teams/TeamSettings.tsx index 0d936c2f386..126a5cef78e 100644 --- a/public/app/features/teams/TeamSettings.tsx +++ b/public/app/features/teams/TeamSettings.tsx @@ -78,7 +78,7 @@ export const TeamSettings = ({ team, updateTeam }: Props) => { )} disabled={!canWriteTeamSettings} > - {/* eslint-disable-next-line @grafana/no-untranslated-strings */} + {/* eslint-disable-next-line @grafana/i18n/no-untranslated-strings */} <Input {...register('email')} placeholder="team@email.com" type="email" id="email-input" /> </Field> <Button type="submit" disabled={!canWriteTeamSettings}> diff --git a/public/app/features/teams/state/navModel.ts b/public/app/features/teams/state/navModel.ts index 4a3edfbb769..51bcbb4c357 100644 --- a/public/app/features/teams/state/navModel.ts +++ b/public/app/features/teams/state/navModel.ts @@ -1,4 +1,5 @@ import { NavModelItem, NavModel } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { featureEnabled } from '@grafana/runtime'; import { ProBadge } from 'app/core/components/Upgrade/ProBadge'; import config from 'app/core/config'; @@ -25,7 +26,7 @@ export function buildNavModel(team: Team): NavModelItem { const navModel: NavModelItem = { img: team.avatarUrl, id: 'team-' + team.uid, - subTitle: 'Manage members and settings', + subTitle: t('teams.build-nav-model.nav-model.subTitle.manage-members-and-settings', 'Manage members and settings'), url: `org/teams/edit/${team.uid}`, text: team.name, children: [ @@ -35,7 +36,7 @@ export function buildNavModel(team: Team): NavModelItem { active: false, icon: 'sliders-v-alt', id: `team-settings-${team.uid}`, - text: 'Settings', + text: t('teams.build-nav-model.nav-model.text.settings', 'Settings'), url: `org/teams/edit/${team.uid}/settings`, }, ], @@ -52,7 +53,7 @@ export function buildNavModel(team: Team): NavModelItem { active: false, icon: 'users-alt', id: `team-members-${team.uid}`, - text: 'Members', + text: t('teams.build-nav-model.text.members', 'Members'), url: `org/teams/edit/${team.uid}/members`, }); } @@ -61,7 +62,7 @@ export function buildNavModel(team: Team): NavModelItem { active: false, icon: 'sync', id: `team-groupsync-${team.uid}`, - text: 'External group sync', + text: t('teams.build-nav-model.team-group-sync.text.external-group-sync', 'External group sync'), url: `org/teams/edit/${team.uid}/groupsync`, }; diff --git a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/UnaryOperationEditor.tsx b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/UnaryOperationEditor.tsx index 1e8b48d4f8f..a51a77dd7f8 100644 --- a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/UnaryOperationEditor.tsx +++ b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/UnaryOperationEditor.tsx @@ -59,11 +59,7 @@ export const UnaryOperationEditor = (props: { > <Select options={ops} value={unary?.operator ?? ops[0].value} onChange={onUnaryOperationChanged} /> </InlineField> - <InlineField - // eslint-disable-next-line @grafana/no-untranslated-strings - label="(" - labelWidth={2} - > + <InlineField label="(" labelWidth={2}> <Select placeholder={t('transformers.unary-operation-editor.placeholder-field', 'Field')} className="min-width-11" @@ -72,7 +68,6 @@ export const UnaryOperationEditor = (props: { onChange={onUnaryValueChanged} /> </InlineField> - {/* eslint-disable-next-line @grafana/no-untranslated-strings */} <InlineLabel width={2}>)</InlineLabel> </InlineFieldRow> </> diff --git a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/WindowOptionsEditor.tsx b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/WindowOptionsEditor.tsx index fe962a6658f..52d42a9bffe 100644 --- a/public/app/features/transformers/editors/CalculateFieldTransformerEditor/WindowOptionsEditor.tsx +++ b/public/app/features/transformers/editors/CalculateFieldTransformerEditor/WindowOptionsEditor.tsx @@ -22,12 +22,24 @@ export const WindowOptionsEditor = (props: { const { window } = options; const selectOptions = names.map((v) => ({ label: v, value: v })); const typeOptions = [ - { label: 'Trailing', value: WindowAlignment.Trailing }, - { label: 'Centered', value: WindowAlignment.Centered }, + { + label: t('transformers.window-options-editor.type-options.label.trailing', 'Trailing'), + value: WindowAlignment.Trailing, + }, + { + label: t('transformers.window-options-editor.type-options.label.centered', 'Centered'), + value: WindowAlignment.Centered, + }, ]; const windowSizeModeOptions = [ - { label: 'Percentage', value: WindowSizeMode.Percentage }, - { label: 'Fixed', value: WindowSizeMode.Fixed }, + { + label: t('transformers.window-options-editor.window-size-mode-options.label.percentage', 'Percentage'), + value: WindowSizeMode.Percentage, + }, + { + label: t('transformers.window-options-editor.window-size-mode-options.label.fixed', 'Fixed'), + value: WindowSizeMode.Fixed, + }, ]; const updateWindowOptions = (v: WindowOptions) => { diff --git a/public/app/features/transformers/editors/ConvertFieldTypeTransformerEditor.tsx b/public/app/features/transformers/editors/ConvertFieldTypeTransformerEditor.tsx index 1416a906038..5daf673ac16 100644 --- a/public/app/features/transformers/editors/ConvertFieldTypeTransformerEditor.tsx +++ b/public/app/features/transformers/editors/ConvertFieldTypeTransformerEditor.tsx @@ -38,8 +38,14 @@ export const ConvertFieldTypeTransformerEditor = ({ // Format timezone options const tzs = getTimeZones(); - timeZoneOptions.push({ label: 'Browser', value: 'browser' }); - timeZoneOptions.push({ label: 'UTC', value: 'utc' }); + timeZoneOptions.push({ + label: t('transformers.convert-field-type-transformer-editor.label.browser', 'Browser'), + value: 'browser', + }); + timeZoneOptions.push({ + label: t('transformers.convert-field-type-transformer-editor.label.utc', 'UTC'), + value: 'utc', + }); for (const tz of tzs) { timeZoneOptions.push({ label: tz, value: tz }); } @@ -168,7 +174,7 @@ export const ConvertFieldTypeTransformerEditor = ({ > <Input value={c.dateFormat} - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder={'e.g. YYYY-MM-DD'} onChange={onInputFormat(idx)} width={24} @@ -187,7 +193,7 @@ export const ConvertFieldTypeTransformerEditor = ({ > <Input value={c.joinWith} - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder={'JSON'} onChange={onJoinWithChange(idx)} width={16} @@ -205,7 +211,7 @@ export const ConvertFieldTypeTransformerEditor = ({ > <Input value={c.dateFormat} - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder={'e.g. YYYY-MM-DD'} onChange={onInputFormat(idx)} width={24} diff --git a/public/app/features/transformers/editors/FormatTimeTransformerEditor.tsx b/public/app/features/transformers/editors/FormatTimeTransformerEditor.tsx index 76e0c131600..d5690d5e4fd 100644 --- a/public/app/features/transformers/editors/FormatTimeTransformerEditor.tsx +++ b/public/app/features/transformers/editors/FormatTimeTransformerEditor.tsx @@ -81,7 +81,7 @@ export function FormatTimeTransfomerEditor({ value={options.timeField} onChange={onSelectField} /* don't translate here as this references a field name */ - /* eslint-disable-next-line @grafana/no-untranslated-strings */ + /* eslint-disable-next-line @grafana/i18n/no-untranslated-strings */ placeholder="time" isClearable /> diff --git a/public/app/features/transformers/editors/GroupingToMatrixTransformerEditor.tsx b/public/app/features/transformers/editors/GroupingToMatrixTransformerEditor.tsx index 4543f7e99b9..1ac201c2874 100644 --- a/public/app/features/transformers/editors/GroupingToMatrixTransformerEditor.tsx +++ b/public/app/features/transformers/editors/GroupingToMatrixTransformerEditor.tsx @@ -62,11 +62,46 @@ export const GroupingToMatrixTransformerEditor = ({ ); const specialValueOptions: Array<SelectableValue<SpecialValue>> = [ - { label: 'Null', value: SpecialValue.Null, description: 'Null value' }, - { label: 'True', value: SpecialValue.True, description: 'Boolean true value' }, - { label: 'False', value: SpecialValue.False, description: 'Boolean false value' }, - { label: 'Zero', value: SpecialValue.Zero, description: 'Number 0 value' }, - { label: 'Empty', value: SpecialValue.Empty, description: 'Empty string' }, + { + label: t('transformers.grouping-to-matrix-transformer-editor.special-value-options.label.null', 'Null'), + value: SpecialValue.Null, + description: t( + 'transformers.grouping-to-matrix-transformer-editor.special-value-options.description.null-value', + 'Null value' + ), + }, + { + label: t('transformers.grouping-to-matrix-transformer-editor.special-value-options.label.true', 'True'), + value: SpecialValue.True, + description: t( + 'transformers.grouping-to-matrix-transformer-editor.special-value-options.description.boolean-true-value', + 'Boolean true value' + ), + }, + { + label: t('transformers.grouping-to-matrix-transformer-editor.special-value-options.label.false', 'False'), + value: SpecialValue.False, + description: t( + 'transformers.grouping-to-matrix-transformer-editor.special-value-options.description.boolean-false-value', + 'Boolean false value' + ), + }, + { + label: t('transformers.grouping-to-matrix-transformer-editor.special-value-options.label.zero', 'Zero'), + value: SpecialValue.Zero, + description: t( + 'transformers.grouping-to-matrix-transformer-editor.special-value-options.description.number-value', + 'Number 0 value' + ), + }, + { + label: t('transformers.grouping-to-matrix-transformer-editor.special-value-options.label.empty', 'Empty'), + value: SpecialValue.Empty, + description: t( + 'transformers.grouping-to-matrix-transformer-editor.special-value-options.description.empty-string', + 'Empty string' + ), + }, ]; const onSelectEmptyValue = useCallback( diff --git a/public/app/features/transformers/editors/JoinByFieldTransformerEditor.tsx b/public/app/features/transformers/editors/JoinByFieldTransformerEditor.tsx index d8c5078db25..2da5236af27 100644 --- a/public/app/features/transformers/editors/JoinByFieldTransformerEditor.tsx +++ b/public/app/features/transformers/editors/JoinByFieldTransformerEditor.tsx @@ -90,7 +90,7 @@ export function SeriesToFieldsTransformerEditor({ input, options, onChange }: Tr value={options.byField} onChange={onSelectField} /* don't translate here as this references a field name */ - /* eslint-disable-next-line @grafana/no-untranslated-strings */ + /* eslint-disable-next-line @grafana/i18n/no-untranslated-strings */ placeholder="time" isClearable /> diff --git a/public/app/features/transformers/editors/ReduceTransformerEditor.tsx b/public/app/features/transformers/editors/ReduceTransformerEditor.tsx index 82fb258a793..6ceb74a2195 100644 --- a/public/app/features/transformers/editors/ReduceTransformerEditor.tsx +++ b/public/app/features/transformers/editors/ReduceTransformerEditor.tsx @@ -22,14 +22,20 @@ export const ReduceTransformerEditor = ({ options, onChange }: TransformerUIProp const modes: Array<SelectableValue<ReduceTransformerMode>> = [ { - label: 'Series to rows', + label: t('transformers.reduce-transformer-editor.modes.label.series-to-rows', 'Series to rows'), value: ReduceTransformerMode.SeriesToRows, - description: 'Create a table with one row for each series value', + description: t( + 'transformers.reduce-transformer-editor.modes.description.create-table-series-value', + 'Create a table with one row for each series value' + ), }, { - label: 'Reduce fields', + label: t('transformers.reduce-transformer-editor.modes.label.reduce-fields', 'Reduce fields'), value: ReduceTransformerMode.ReduceFields, - description: 'Collapse each field into a single value', + description: t( + 'transformers.reduce-transformer-editor.modes.description.collapse-field-single-value', + 'Collapse each field into a single value' + ), }, ]; diff --git a/public/app/features/transformers/extractFields/ExtractFieldsTransformerEditor.tsx b/public/app/features/transformers/extractFields/ExtractFieldsTransformerEditor.tsx index 4e7a987b430..dad03f2bf65 100644 --- a/public/app/features/transformers/extractFields/ExtractFieldsTransformerEditor.tsx +++ b/public/app/features/transformers/extractFields/ExtractFieldsTransformerEditor.tsx @@ -118,7 +118,7 @@ export const extractFieldsTransformerEditor = ({ {options.format === FieldExtractorID.RegExp && ( <InlineFieldRow> <InlineField - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings label="RegExp" labelWidth={16} interactive={true} @@ -127,7 +127,7 @@ export const extractFieldsTransformerEditor = ({ })} > <Input - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="/(?<NewField>.*)/" value={options.regExp} onChange={onRegexpChange} diff --git a/public/app/features/transformers/extractFields/components/JSONPathEditor.tsx b/public/app/features/transformers/extractFields/components/JSONPathEditor.tsx index 5c30fb9884d..a91c19471fc 100644 --- a/public/app/features/transformers/extractFields/components/JSONPathEditor.tsx +++ b/public/app/features/transformers/extractFields/components/JSONPathEditor.tsx @@ -3,6 +3,7 @@ import { useState } from 'react'; import * as React from 'react'; import { Trans, useTranslate } from '@grafana/i18n'; +import { t } from '@grafana/i18n/internal'; import { Button, InlineField, InlineFieldRow, IconButton, Input } from '@grafana/ui'; import { JSONPath } from '../types'; @@ -93,11 +94,57 @@ export function JSONPathEditor({ options, onChange }: Props) { const getTooltips = () => { const mapValidPaths = [ - { path: 'object', description: '=> extract fields from object' }, - { path: 'object.value1', description: '=> extract value1' }, - { path: 'object.value2', description: '=> extract value2' }, - { path: 'object.value2[0]', description: '=> extract value2 first element' }, - { path: 'object.value2[1]', description: '=> extract value2 second element' }, + { + path: 'object', + description: t( + 'transformers.get-tooltips.map-valid-paths.description.extract-fields-from-object', + '=> extract fields from object' + ), + }, + { + path: 'object.value1', + description: ( + <Trans + i18nKey="transformers.get-tooltips.map-valid-paths.description.extract-value" + values={{ value: 'value1' }} + > + => extract <code>{'{{ value }}'}</code> + </Trans> + ), + }, + { + path: 'object.value2', + description: ( + <Trans + i18nKey="transformers.get-tooltips.map-valid-paths.description.extract-value" + values={{ value: 'value2' }} + > + => extract <code>{'{{ value }}'}</code> + </Trans> + ), + }, + { + path: 'object.value2[0]', + description: ( + <Trans + i18nKey="transformers.get-tooltips.map-valid-paths.description.extract-value-first-element" + values={{ value: 'value2' }} + > + => extract <code>{'{{ value }}'}</code> first element + </Trans> + ), + }, + { + path: 'object.value2[1]', + description: ( + <Trans + i18nKey="transformers.get-tooltips.map-valid-paths.description.extract-value-second-element" + values={{ value: 'value2' }} + > + => extract <code>{'{{ value }}'}</code> second element + </Trans> + ), + }, ]; return { diff --git a/public/app/features/transformers/joinByLabels/JoinByLabelsTransformerEditor.tsx b/public/app/features/transformers/joinByLabels/JoinByLabelsTransformerEditor.tsx index 198538439df..c9ea029af28 100644 --- a/public/app/features/transformers/joinByLabels/JoinByLabelsTransformerEditor.tsx +++ b/public/app/features/transformers/joinByLabels/JoinByLabelsTransformerEditor.tsx @@ -147,7 +147,6 @@ 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} diff --git a/public/app/features/transformers/partitionByValues/PartitionByValuesEditor.tsx b/public/app/features/transformers/partitionByValues/PartitionByValuesEditor.tsx index 6bb5bb2c08d..7c5379d94c1 100644 --- a/public/app/features/transformers/partitionByValues/PartitionByValuesEditor.tsx +++ b/public/app/features/transformers/partitionByValues/PartitionByValuesEditor.tsx @@ -29,6 +29,7 @@ export function PartitionByValuesEditor({ options, onChange, }: TransformerUIProps<PartitionByValuesTransformerOptions>) { + const { t } = useTranslate(); const names = useFieldDisplayNames(input); const allSelectOptions = useSelectOptions(names); const selectOptions = useMemo(() => { @@ -64,13 +65,19 @@ export function PartitionByValuesEditor({ } const namingModesOptions = [ - { label: 'As label', value: namingModes.asLabels }, - { label: 'As frame name', value: namingModes.frameName }, + { + label: t('transformers.partition-by-values-editor.naming-modes-options.label.as-label', 'As label'), + value: namingModes.asLabels, + }, + { + label: t('transformers.partition-by-values-editor.naming-modes-options.label.as-frame-name', 'As frame name'), + value: namingModes.frameName, + }, ]; const KeepFieldsOptions = [ - { label: 'Yes', value: true }, - { label: 'No', value: false }, + { label: t('transformers.partition-by-values-editor.keep-fields-options.label.yes', 'Yes'), value: true }, + { label: t('transformers.partition-by-values-editor.keep-fields-options.label.no', 'No'), value: false }, ]; const removeField = useCallback( @@ -90,7 +97,6 @@ export function PartitionByValuesEditor({ }, [onChange, options] ); - const { t } = useTranslate(); if (input.length > 1) { return ( diff --git a/public/app/features/transformers/regression/regressionEditor.tsx b/public/app/features/transformers/regression/regressionEditor.tsx index 8e4b352a9bc..1d99ae1a655 100644 --- a/public/app/features/transformers/regression/regressionEditor.tsx +++ b/public/app/features/transformers/regression/regressionEditor.tsx @@ -32,9 +32,16 @@ export const RegressionTransformerEditor = ({ options, onChange, }: TransformerUIProps<RegressionTransformerOptions>) => { + const { t } = useTranslate(); const modelTypeOptions = [ - { label: 'Linear', value: ModelType.linear }, - { label: 'Polynomial', value: ModelType.polynomial }, + { + label: t('transformers.regression-transformer-editor.model-type-options.label.linear', 'Linear'), + value: ModelType.linear, + }, + { + label: t('transformers.regression-transformer-editor.model-type-options.label.polynomial', 'Polynomial'), + value: ModelType.polynomial, + }, ]; useEffect(() => { @@ -73,8 +80,6 @@ export const RegressionTransformerEditor = ({ } }); - const { t } = useTranslate(); - return ( <> <InlineField @@ -138,10 +143,10 @@ export const RegressionTransformerEditor = ({ <Select<number> value={options.degree ?? DEFAULTS.degree} options={[ - { label: 'Quadratic', value: 2 }, - { label: 'Cubic', value: 3 }, - { label: 'Quartic', value: 4 }, - { label: 'Quintic', value: 5 }, + { label: t('transformers.regression-transformer-editor.label.quadratic', 'Quadratic'), value: 2 }, + { label: t('transformers.regression-transformer-editor.label.cubic', 'Cubic'), value: 3 }, + { label: t('transformers.regression-transformer-editor.label.quartic', 'Quartic'), value: 4 }, + { label: t('transformers.regression-transformer-editor.label.quintic', 'Quintic'), value: 5 }, ]} onChange={(v) => { onChange({ ...options, degree: v.value }); diff --git a/public/app/features/transformers/spatial/SpatialTransformerEditor.tsx b/public/app/features/transformers/spatial/SpatialTransformerEditor.tsx index d24a3cd7ed4..cd9e39ea289 100644 --- a/public/app/features/transformers/spatial/SpatialTransformerEditor.tsx +++ b/public/app/features/transformers/spatial/SpatialTransformerEditor.tsx @@ -11,6 +11,7 @@ import { TransformerUIProps, TransformerCategory, } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { FrameGeometrySourceMode } from '@grafana/schema'; import { useTheme2 } from '@grafana/ui'; import { addLocationFields } from 'app/features/geo/editor/locationEditor'; @@ -37,15 +38,25 @@ const supplier = ( options: [ { value: SpatialAction.Prepare, - label: 'Prepare spatial field', + label: t('transformers.supplier.label.prepare-spatial-field', 'Prepare spatial field'), description: 'Set a geometry field based on the results of other fields', }, { value: SpatialAction.Calculate, - label: 'Calculate value', - description: 'Use the geometry to define a new field (heading/distance/area)', + label: t('transformers.supplier.label.calculate-value', 'Calculate value'), + description: t( + 'transformers.supplier.description.geometry-define-field-headingdistancearea', + 'Use the geometry to define a new field (heading/distance/area)' + ), + }, + { + value: SpatialAction.Modify, + label: t('transformers.supplier.label.transform', 'Transform'), + description: t( + 'transformers.supplier.description.apply-spatial-operations-to-the-geometry', + 'Apply spatial operations to the geometry' + ), }, - { value: SpatialAction.Modify, label: 'Transform', description: 'Apply spatial operations to the geometry' }, ], }, }); @@ -58,9 +69,9 @@ const supplier = ( defaultValue: SpatialCalculation.Heading, settings: { options: [ - { value: SpatialCalculation.Heading, label: 'Heading' }, - { value: SpatialCalculation.Area, label: 'Area' }, - { value: SpatialCalculation.Distance, label: 'Distance' }, + { value: SpatialCalculation.Heading, label: t('transformers.supplier.label.heading', 'Heading') }, + { value: SpatialCalculation.Area, label: t('transformers.supplier.label.area', 'Area') }, + { value: SpatialCalculation.Distance, label: t('transformers.supplier.label.distance', 'Distance') }, ], }, }); @@ -74,13 +85,16 @@ const supplier = ( options: [ { value: SpatialOperation.AsLine, - label: 'As line', + label: t('transformers.supplier.label.as-line', 'As line'), description: 'Create a single line feature with a vertex at each row', }, { value: SpatialOperation.LineBuilder, - label: 'Line builder', - description: 'Create a line between two points', + label: t('transformers.supplier.label.line-builder', 'Line builder'), + description: t( + 'transformers.supplier.description.create-a-line-between-two-points', + 'Create a line between two points' + ), }, ], }, diff --git a/public/app/features/transformers/spatial/optionsHelper.tsx b/public/app/features/transformers/spatial/optionsHelper.tsx index e493dfc7d0c..98e1b9bbfe2 100644 --- a/public/app/features/transformers/spatial/optionsHelper.tsx +++ b/public/app/features/transformers/spatial/optionsHelper.tsx @@ -2,6 +2,7 @@ import { set, get as lodashGet } from 'lodash'; import { StandardEditorContext, TransformerUIProps, PanelOptionsEditorBuilder } from '@grafana/data'; import { NestedValueAccess, PanelOptionsSupplier } from '@grafana/data/internal'; +import { t } from '@grafana/i18n/internal'; import { OptionsPaneCategoryDescriptor } from 'app/features/dashboard/components/PanelEditor/OptionsPaneCategoryDescriptor'; import { fillOptionsPaneItems } from 'app/features/dashboard/components/PanelEditor/getVisualizationOptions'; import { setOptionImmutably } from 'app/features/dashboard/components/PanelEditor/utils'; @@ -15,7 +16,10 @@ export function getTransformerOptionPane<T = any>( options: props.options, }; - const root = new OptionsPaneCategoryDescriptor({ id: 'root', title: 'root' }); + const root = new OptionsPaneCategoryDescriptor({ + id: 'root', + title: t('transformers.get-transformer-option-pane.root.title.root', 'root'), + }); const getOptionsPaneCategory = (categoryNames?: string[]): OptionsPaneCategoryDescriptor => { if (categoryNames?.length) { const key = categoryNames[0]; diff --git a/public/app/features/transformers/utils.ts b/public/app/features/transformers/utils.ts index 540de803932..a2de094cb1f 100644 --- a/public/app/features/transformers/utils.ts +++ b/public/app/features/transformers/utils.ts @@ -9,6 +9,7 @@ import { VariableOrigin, VariableSuggestion, } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { getTemplateSrv } from '@grafana/runtime'; export const getAllFieldNamesFromDataFrames = (frames: DataFrame[], withBaseFieldNames = false) => { @@ -89,8 +90,8 @@ export function getTimezoneOptions(includeInternal: boolean) { // Browser and UTC. We add the manually to avoid // funky string manipulation. if (includeInternal) { - timeZoneOptions.push({ label: 'Browser', value: 'browser' }); - timeZoneOptions.push({ label: 'UTC', value: 'utc' }); + timeZoneOptions.push({ label: t('transformers.get-timezone-options.label.browser', 'Browser'), value: 'browser' }); + timeZoneOptions.push({ label: t('transformers.get-timezone-options.label.utc', 'UTC'), value: 'utc' }); } // Add all other timezones diff --git a/public/app/features/users/UsersActionBar.tsx b/public/app/features/users/UsersActionBar.tsx index 2f6dc05d98a..9f25fca437e 100644 --- a/public/app/features/users/UsersActionBar.tsx +++ b/public/app/features/users/UsersActionBar.tsx @@ -47,7 +47,7 @@ export const UsersActionBarUnconnected = ({ const { t } = useTranslate(); const options = [ - { label: 'Users', value: 'users' }, + { label: t('users.users-action-bar-unconnected.options.label.users', 'Users'), value: 'users' }, { label: `Pending Invites (${pendingInvitesCount})`, value: 'invites' }, ]; const canAddToOrg: boolean = contextSrv.hasPermission(AccessControlAction.OrgUsersAdd); diff --git a/public/app/features/variables/adhoc/adapter.ts b/public/app/features/variables/adhoc/adapter.ts index 280a16eb723..fb6605fd959 100644 --- a/public/app/features/variables/adhoc/adapter.ts +++ b/public/app/features/variables/adhoc/adapter.ts @@ -1,6 +1,7 @@ import { cloneDeep } from 'lodash'; import { AdHocVariableModel } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { dispatch } from '../../../store/store'; import { VariableAdapter } from '../adapters'; @@ -17,7 +18,10 @@ const noop = async () => {}; export const createAdHocVariableAdapter = (): VariableAdapter<AdHocVariableModel> => { return { id: 'adhoc', - description: 'Add key/value filters on the fly.', + description: t( + 'variables.create-ad-hoc-variable-adapter.description.add-keyvalue-filters-on-the-fly', + 'Add key/value filters on the fly.' + ), name: 'Ad hoc filters', initialState: initialAdHocVariableModelState, reducer: adHocVariableReducer, diff --git a/public/app/features/variables/custom/adapter.ts b/public/app/features/variables/custom/adapter.ts index 040d2b1363d..642f856cf5b 100644 --- a/public/app/features/variables/custom/adapter.ts +++ b/public/app/features/variables/custom/adapter.ts @@ -1,6 +1,7 @@ import { cloneDeep } from 'lodash'; import { CustomVariableModel } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { dispatch } from '../../../store/store'; import { VariableAdapter } from '../adapters'; @@ -16,7 +17,10 @@ import { customVariableReducer, initialCustomVariableModelState } from './reduce export const createCustomVariableAdapter = (): VariableAdapter<CustomVariableModel> => { return { id: 'custom', - description: 'Define variable values manually', + description: t( + 'variables.create-custom-variable-adapter.description.define-variable-values-manually', + 'Define variable values manually' + ), name: 'Custom', initialState: initialCustomVariableModelState, reducer: customVariableReducer, diff --git a/public/app/features/variables/datasource/DataSourceVariableEditor.test.tsx b/public/app/features/variables/datasource/DataSourceVariableEditor.test.tsx index 639775dd88d..67400bbd998 100644 --- a/public/app/features/variables/datasource/DataSourceVariableEditor.test.tsx +++ b/public/app/features/variables/datasource/DataSourceVariableEditor.test.tsx @@ -29,7 +29,7 @@ describe('DataSourceVariableEditor', () => { render(<DataSourceVariableEditor {...props} />); const selectContainer = getSelectParent(screen.getByLabelText('Type')); - expect(selectContainer).toHaveTextContent('Prometheus'); + expect(selectContainer).toHaveTextContent('Choose'); }); it('calls the handler when the data source is changed', async () => { diff --git a/public/app/features/variables/datasource/reducer.ts b/public/app/features/variables/datasource/reducer.ts index 2414f6818c3..42ed0d2c083 100644 --- a/public/app/features/variables/datasource/reducer.ts +++ b/public/app/features/variables/datasource/reducer.ts @@ -7,6 +7,7 @@ import { VariableOption, VariableRefresh, } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { ALL_VARIABLE_TEXT, ALL_VARIABLE_VALUE } from '../constants'; import { getInstanceState } from '../state/selectors'; @@ -52,12 +53,20 @@ export const dataSourceVariableSlice = createSlice({ } if (isDefault(source, regex)) { - options.push({ text: 'default', value: 'default', selected: false }); + options.push({ + text: t('variables.data-source-variable-slice.text.default', 'default'), + value: 'default', + selected: false, + }); } } if (options.length === 0) { - options.push({ text: 'No data sources found', value: '', selected: false }); + options.push({ + text: t('variables.data-source-variable-slice.text.no-data-sources-found', 'No data sources found'), + value: '', + selected: false, + }); } if (instanceState.includeAll) { diff --git a/public/app/features/variables/inspect/utils.ts b/public/app/features/variables/inspect/utils.ts index ec83bca224e..8459bcd6d2f 100644 --- a/public/app/features/variables/inspect/utils.ts +++ b/public/app/features/variables/inspect/utils.ts @@ -1,4 +1,5 @@ import { DataLinkBuiltInVars } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { Graph } from 'app/core/utils/dag'; import { mapSet } from 'app/core/utils/set'; import { stringifyPanelModel } from 'app/features/dashboard/state/PanelModel'; @@ -332,7 +333,9 @@ export const transformUsagesToNetwork = (usages: VariableUsageTree[]): UsagesToN const { variable, tree } = usage; const result: UsagesToNetwork = { variable, - nodes: [{ id: 'dashboard', label: 'dashboard' }], + nodes: [ + { id: 'dashboard', label: t('variables.transform-usages-to-network.result.label.dashboard', 'dashboard') }, + ], edges: [], showGraph: false, }; diff --git a/public/app/features/variables/interval/adapter.ts b/public/app/features/variables/interval/adapter.ts index 0210261858d..8841f763482 100644 --- a/public/app/features/variables/interval/adapter.ts +++ b/public/app/features/variables/interval/adapter.ts @@ -1,6 +1,7 @@ import { cloneDeep } from 'lodash'; import { IntervalVariableModel } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { dispatch } from '../../../store/store'; import { VariableAdapter } from '../adapters'; @@ -15,7 +16,11 @@ import { initialIntervalVariableModelState, intervalVariableReducer } from './re export const createIntervalVariableAdapter = (): VariableAdapter<IntervalVariableModel> => { return { id: 'interval', - description: 'Define a timespan interval (ex 1m, 1h, 1d)', + description: t( + 'variables.create-interval-variable-adapter.description.define-timespan-interval', + 'Define a timespan interval (for example: {{timeIntervals}})', + { timeIntervals: '1m, 1h, 1d' } + ), name: 'Interval', initialState: initialIntervalVariableModelState, reducer: intervalVariableReducer, diff --git a/public/app/features/variables/interval/reducer.ts b/public/app/features/variables/interval/reducer.ts index b0868e27fd3..073837b04a6 100644 --- a/public/app/features/variables/interval/reducer.ts +++ b/public/app/features/variables/interval/reducer.ts @@ -37,6 +37,7 @@ export const intervalVariableSlice = createSlice({ // add auto option if missing if (options.length && options[0].text !== 'auto') { options.unshift({ + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings text: 'auto', value: '$__auto_interval_' + instanceState.name, selected: false, diff --git a/public/app/features/variables/query/adapter.ts b/public/app/features/variables/query/adapter.ts index e320eb6ed11..cd5ca4f9894 100644 --- a/public/app/features/variables/query/adapter.ts +++ b/public/app/features/variables/query/adapter.ts @@ -1,6 +1,7 @@ import { cloneDeep } from 'lodash'; import { QueryVariableModel, VariableRefresh } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { dispatch } from '../../../store/store'; import { VariableAdapter } from '../adapters'; @@ -16,7 +17,10 @@ import { initialQueryVariableModelState, queryVariableReducer } from './reducer' export const createQueryVariableAdapter = (): VariableAdapter<QueryVariableModel> => { return { id: 'query', - description: 'Variable values are fetched from a datasource query', + description: t( + 'variables.create-query-variable-adapter.description.variable-values-fetched-datasource-query', + 'Variable values are fetched from a datasource query' + ), name: 'Query', initialState: initialQueryVariableModelState, reducer: queryVariableReducer, diff --git a/public/app/features/visualization/data-hover/DataHoverRows.tsx b/public/app/features/visualization/data-hover/DataHoverRows.tsx index c85c9bff7cf..d99fcfd04f9 100644 --- a/public/app/features/visualization/data-hover/DataHoverRows.tsx +++ b/public/app/features/visualization/data-hover/DataHoverRows.tsx @@ -87,7 +87,6 @@ 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> @@ -98,7 +97,6 @@ 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> diff --git a/public/app/plugins/datasource/azuremonitor/components/ConfigEditor/AppRegistrationCredentials.tsx b/public/app/plugins/datasource/azuremonitor/components/ConfigEditor/AppRegistrationCredentials.tsx index 079ca77c760..43c64786b52 100644 --- a/public/app/plugins/datasource/azuremonitor/components/ConfigEditor/AppRegistrationCredentials.tsx +++ b/public/app/plugins/datasource/azuremonitor/components/ConfigEditor/AppRegistrationCredentials.tsx @@ -88,7 +88,7 @@ export const AppRegistrationCredentials = (props: AppRegistrationCredentialsProp <Input aria-label={t('components.app-registration-credentials.aria-label-tenant-id', 'Tenant ID')} className="width-30" - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" value={credentials.tenantId || ''} onChange={onTenantIdChange} @@ -106,7 +106,7 @@ export const AppRegistrationCredentials = (props: AppRegistrationCredentialsProp <Input className="width-30" aria-label={t('components.app-registration-credentials.aria-label-client-id', 'Client ID')} - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" value={credentials.clientId || ''} onChange={onClientIdChange} @@ -150,7 +150,7 @@ export const AppRegistrationCredentials = (props: AppRegistrationCredentialsProp <Input className="width-30" aria-label={t('components.app-registration-credentials.aria-label-client-secret', 'Client Secret')} - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" value={credentials.clientSecret || ''} onChange={onClientSecretChange} diff --git a/public/app/plugins/datasource/azuremonitor/components/ConfigEditor/ConfigEditor.tsx b/public/app/plugins/datasource/azuremonitor/components/ConfigEditor/ConfigEditor.tsx index 0db9064ee63..a6496ffee44 100644 --- a/public/app/plugins/datasource/azuremonitor/components/ConfigEditor/ConfigEditor.tsx +++ b/public/app/plugins/datasource/azuremonitor/components/ConfigEditor/ConfigEditor.tsx @@ -154,7 +154,7 @@ export class ConfigEditor extends PureComponent<Props, State> { value={options.jsonData.timeout} type="number" className="width-15" - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="30" onChange={onTimeoutChange} /> diff --git a/public/app/plugins/datasource/azuremonitor/components/LogsQueryEditor/AdvancedResourcePicker.tsx b/public/app/plugins/datasource/azuremonitor/components/LogsQueryEditor/AdvancedResourcePicker.tsx index 8359486c9f4..c60a8f0f6c7 100644 --- a/public/app/plugins/datasource/azuremonitor/components/LogsQueryEditor/AdvancedResourcePicker.tsx +++ b/public/app/plugins/datasource/azuremonitor/components/LogsQueryEditor/AdvancedResourcePicker.tsx @@ -74,7 +74,7 @@ const AdvancedResourcePicker = ({ resources, onChange }: ResourcePickerProps<str id={`input-advanced-resource-picker-${index + 1}`} value={resource} onChange={(event) => onResourceChange(index, event.currentTarget.value)} - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="ex: /subscriptions/$subId" data-testid={`input-advanced-resource-picker-${index + 1}`} /> diff --git a/public/app/plugins/datasource/azuremonitor/components/LogsQueryEditor/LogsQueryEditor.test.tsx b/public/app/plugins/datasource/azuremonitor/components/LogsQueryEditor/LogsQueryEditor.test.tsx index 9eadee09f48..106a7e4e66a 100644 --- a/public/app/plugins/datasource/azuremonitor/components/LogsQueryEditor/LogsQueryEditor.test.tsx +++ b/public/app/plugins/datasource/azuremonitor/components/LogsQueryEditor/LogsQueryEditor.test.tsx @@ -6,9 +6,9 @@ import { dateTime, LoadingState } from '@grafana/data'; import createMockDatasource from '../../__mocks__/datasource'; import createMockQuery from '../../__mocks__/query'; import { ResultFormat } from '../../dataquery.gen'; -import { createMockResourcePickerData } from '../MetricsQueryEditor/MetricsQueryEditor.test'; import LogsQueryEditor from './LogsQueryEditor'; +import { createMockResourcePickerData } from './mocks'; jest.mock('@grafana/runtime', () => ({ ...jest.requireActual('@grafana/runtime'), diff --git a/public/app/plugins/datasource/azuremonitor/components/LogsQueryEditor/mocks.ts b/public/app/plugins/datasource/azuremonitor/components/LogsQueryEditor/mocks.ts new file mode 100644 index 00000000000..ecd27888afa --- /dev/null +++ b/public/app/plugins/datasource/azuremonitor/components/LogsQueryEditor/mocks.ts @@ -0,0 +1,26 @@ +import createMockDatasource from '../../__mocks__/datasource'; +import { createMockInstanceSetttings } from '../../__mocks__/instanceSettings'; +import { + createMockSubscriptions, + createMockResourceGroupsBySubscription, + mockResourcesByResourceGroup, +} from '../../__mocks__/resourcePickerRows'; +import ResourcePickerData from '../../resourcePicker/resourcePickerData'; + +export function createMockResourcePickerData() { + const mockDatasource = createMockDatasource(); + const mockResourcePicker = new ResourcePickerData( + createMockInstanceSetttings(), + mockDatasource.azureMonitorDatasource, + mockDatasource.azureResourceGraphDatasource + ); + + mockResourcePicker.getSubscriptions = jest.fn().mockResolvedValue(createMockSubscriptions()); + mockResourcePicker.getResourceGroupsBySubscriptionId = jest + .fn() + .mockResolvedValue(createMockResourceGroupsBySubscription()); + mockResourcePicker.getResourcesForResourceGroup = jest.fn().mockResolvedValue(mockResourcesByResourceGroup()); + mockResourcePicker.getResourceURIFromWorkspace = jest.fn().mockReturnValue(''); + mockResourcePicker.getResourceURIDisplayProperties = jest.fn().mockResolvedValue({}); + return mockResourcePicker; +} diff --git a/public/app/plugins/datasource/azuremonitor/components/MetricsQueryEditor/AdvancedResourcePicker.tsx b/public/app/plugins/datasource/azuremonitor/components/MetricsQueryEditor/AdvancedResourcePicker.tsx index 31389d5b4d8..a7cfb9cb522 100644 --- a/public/app/plugins/datasource/azuremonitor/components/MetricsQueryEditor/AdvancedResourcePicker.tsx +++ b/public/app/plugins/datasource/azuremonitor/components/MetricsQueryEditor/AdvancedResourcePicker.tsx @@ -73,7 +73,7 @@ const AdvancedResourcePicker = ({ resources, onChange }: ResourcePickerProps<Azu id={`input-advanced-resource-picker-subscription`} value={resources[0]?.subscription ?? ''} onChange={(event) => onCommonPropChange({ subscription: event.currentTarget.value })} - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX" /> </InlineField> @@ -91,7 +91,7 @@ const AdvancedResourcePicker = ({ resources, onChange }: ResourcePickerProps<Azu id={`input-advanced-resource-picker-metricNamespace`} value={resources[0]?.metricNamespace ?? ''} onChange={(event) => onCommonPropChange({ metricNamespace: event.currentTarget.value })} - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="Microsoft.Insights/metricNamespaces" /> </InlineField> @@ -111,7 +111,7 @@ const AdvancedResourcePicker = ({ resources, onChange }: ResourcePickerProps<Azu id={`input-advanced-resource-picker-region`} value={resources[0]?.region ?? ''} onChange={(event) => onCommonPropChange({ region: event.currentTarget.value })} - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="northeurope" /> </InlineField> @@ -142,7 +142,7 @@ const AdvancedResourcePicker = ({ resources, onChange }: ResourcePickerProps<Azu onChange={(event) => onResourceChange(index, { ...resource, resourceGroup: event.currentTarget.value }) } - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="resource-group" /> <AccessoryButton diff --git a/public/app/plugins/datasource/azuremonitor/components/MetricsQueryEditor/MetricsQueryEditor.test.tsx b/public/app/plugins/datasource/azuremonitor/components/MetricsQueryEditor/MetricsQueryEditor.test.tsx index 3a129c12a70..cf92f83b896 100644 --- a/public/app/plugins/datasource/azuremonitor/components/MetricsQueryEditor/MetricsQueryEditor.test.tsx +++ b/public/app/plugins/datasource/azuremonitor/components/MetricsQueryEditor/MetricsQueryEditor.test.tsx @@ -2,17 +2,11 @@ import { render, screen, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import createMockDatasource from '../../__mocks__/datasource'; -import { createMockInstanceSetttings } from '../../__mocks__/instanceSettings'; import createMockPanelData from '../../__mocks__/panelData'; import createMockQuery from '../../__mocks__/query'; -import { - createMockResourceGroupsBySubscription, - createMockSubscriptions, - mockResourcesByResourceGroup, -} from '../../__mocks__/resourcePickerRows'; import { selectors } from '../../e2e/selectors'; -import ResourcePickerData from '../../resourcePicker/resourcePickerData'; import { selectOptionInTest } from '../../utils/testUtils'; +import { createMockResourcePickerData } from '../LogsQueryEditor/mocks'; import MetricsQueryEditor from './MetricsQueryEditor'; @@ -30,24 +24,6 @@ const variableOptionGroup = { options: [], }; -export function createMockResourcePickerData() { - const mockDatasource = createMockDatasource(); - const mockResourcePicker = new ResourcePickerData( - createMockInstanceSetttings(), - mockDatasource.azureMonitorDatasource, - mockDatasource.azureResourceGraphDatasource - ); - - mockResourcePicker.getSubscriptions = jest.fn().mockResolvedValue(createMockSubscriptions()); - mockResourcePicker.getResourceGroupsBySubscriptionId = jest - .fn() - .mockResolvedValue(createMockResourceGroupsBySubscription()); - mockResourcePicker.getResourcesForResourceGroup = jest.fn().mockResolvedValue(mockResourcesByResourceGroup()); - mockResourcePicker.getResourceURIFromWorkspace = jest.fn().mockReturnValue(''); - mockResourcePicker.getResourceURIDisplayProperties = jest.fn().mockResolvedValue({}); - return mockResourcePicker; -} - describe('MetricsQueryEditor', () => { const originalScrollIntoView = window.HTMLElement.prototype.scrollIntoView; const mockPanelData = createMockPanelData(); diff --git a/public/app/plugins/datasource/azuremonitor/components/QueryEditor/QueryEditor.test.tsx b/public/app/plugins/datasource/azuremonitor/components/QueryEditor/QueryEditor.test.tsx index 86c9e27dc7d..202e27e604b 100644 --- a/public/app/plugins/datasource/azuremonitor/components/QueryEditor/QueryEditor.test.tsx +++ b/public/app/plugins/datasource/azuremonitor/components/QueryEditor/QueryEditor.test.tsx @@ -10,7 +10,7 @@ import createMockQuery from '../../__mocks__/query'; import { selectors } from '../../e2e/selectors'; import { AzureQueryType, ResultFormat } from '../../types'; import { selectOptionInTest } from '../../utils/testUtils'; -import { createMockResourcePickerData } from '../MetricsQueryEditor/MetricsQueryEditor.test'; +import { createMockResourcePickerData } from '../LogsQueryEditor/mocks'; import QueryEditor from './QueryEditor'; diff --git a/public/app/plugins/datasource/azuremonitor/components/TracesQueryEditor/TracesQueryEditor.test.tsx b/public/app/plugins/datasource/azuremonitor/components/TracesQueryEditor/TracesQueryEditor.test.tsx index ce84d546d58..09f390aaa37 100644 --- a/public/app/plugins/datasource/azuremonitor/components/TracesQueryEditor/TracesQueryEditor.test.tsx +++ b/public/app/plugins/datasource/azuremonitor/components/TracesQueryEditor/TracesQueryEditor.test.tsx @@ -3,7 +3,7 @@ import userEvent from '@testing-library/user-event'; import createMockDatasource from '../../__mocks__/datasource'; import createMockQuery from '../../__mocks__/query'; -import { createMockResourcePickerData } from '../MetricsQueryEditor/MetricsQueryEditor.test'; +import { createMockResourcePickerData } from '../LogsQueryEditor/mocks'; import TracesQueryEditor from './TracesQueryEditor'; diff --git a/public/app/plugins/datasource/cloud-monitoring/components/__snapshots__/VariableQueryEditor.test.tsx.snap b/public/app/plugins/datasource/cloud-monitoring/components/__snapshots__/VariableQueryEditor.test.tsx.snap index 5506942fcce..fa53a1bac2d 100644 --- a/public/app/plugins/datasource/cloud-monitoring/components/__snapshots__/VariableQueryEditor.test.tsx.snap +++ b/public/app/plugins/datasource/cloud-monitoring/components/__snapshots__/VariableQueryEditor.test.tsx.snap @@ -67,7 +67,7 @@ exports[`VariableQueryEditor renders correctly 1`] = ` </div> </div> <div - class="css-zyjsuv-input-suffix" + class="css-1h17wob-input-suffix" > <svg aria-hidden="true" diff --git a/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableQueryEditor.test.tsx b/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableQueryEditor.test.tsx index 1d871de1da6..be8cb585d4c 100644 --- a/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableQueryEditor.test.tsx +++ b/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableQueryEditor.test.tsx @@ -190,7 +190,7 @@ describe('VariableEditor', () => { render(<VariableQueryEditor {...props} />); await waitFor(() => { - expect(screen.getByDisplayValue('Tags.blah')).toBeInTheDocument(); + expect(screen.queryByText('Tags.blah')).toBeInTheDocument(); }); const filterItem = screen.getByTestId('cloudwatch-multifilter-item'); diff --git a/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableQueryEditor.tsx b/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableQueryEditor.tsx index 0c3215c0d0d..c2d39f88c8f 100644 --- a/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableQueryEditor.tsx +++ b/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableQueryEditor.tsx @@ -1,6 +1,6 @@ import { css } from '@emotion/css'; -import { GrafanaTheme2, QueryEditorProps, SelectableValue } from '@grafana/data'; +import { GrafanaTheme2, QueryEditorProps, SelectableValue, toOption } from '@grafana/data'; import { EditorField } from '@grafana/plugin-ui'; import { config } from '@grafana/runtime'; import { useStyles2 } from '@grafana/ui'; @@ -41,6 +41,37 @@ const queryTypes: Array<{ value: string; label: string }> = [ : []), ]; +const attributeNames: string[] = [ + 'AmiLaunchIndex', + 'Architecture', + 'ClientToken', + 'EbsOptimized', + 'EnaSupport', + 'Hypervisor', + 'IamInstanceProfile', + 'ImageId', + 'InstanceId', + 'InstanceLifecycle', + 'InstanceType', + 'KernelId', + 'KeyName', + 'LaunchTime', + 'Platform', + 'PrivateDnsName', + 'PrivateIpAddress', + 'PublicDnsName', + 'PublicIpAddress', + 'RamdiskId', + 'RootDeviceName', + 'RootDeviceType', + 'SourceDestCheck', + 'SpotInstanceRequestId', + 'SriovNetSupport', + 'SubnetId', + 'VirtualizationType', + 'VpcId', +]; + export const VariableQueryEditor = ({ query, datasource, onChange }: Props) => { const parsedQuery = migrateVariableQuery(query); @@ -98,6 +129,10 @@ export const VariableQueryEditor = ({ query, datasource, onChange }: Props) => { } return { ...query, metricName, dimensionKey, dimensionFilters }; }; + const allAttributeNames = attributeNames.includes(parsedQuery.attributeName) + ? attributeNames + : [...attributeNames, parsedQuery.attributeName]; + const attributeOptions = allAttributeNames.map(toOption); const hasRegionField = [ VariableQueryType.Metrics, @@ -211,10 +246,13 @@ export const VariableQueryEditor = ({ query, datasource, onChange }: Props) => { )} {parsedQuery.queryType === VariableQueryType.EC2InstanceAttributes && ( <> - <VariableTextField + <VariableQueryField value={parsedQuery.attributeName} - onBlur={(value: string) => onQueryChange({ ...parsedQuery, attributeName: value })} + options={attributeOptions} + onChange={(value: string) => onQueryChange({ ...parsedQuery, attributeName: value })} label="Attribute name" + inputId={`variable-query-instance-attribute-${query.refId}`} + allowCustomValue interactive={true} tooltip={ <> diff --git a/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableQueryField.tsx b/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableQueryField.tsx index de3a1af573b..06f8eb2c6f5 100644 --- a/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableQueryField.tsx +++ b/public/app/plugins/datasource/cloudwatch/components/VariableQueryEditor/VariableQueryField.tsx @@ -1,6 +1,6 @@ import { SelectableValue } from '@grafana/data'; import { EditorField } from '@grafana/plugin-ui'; -import { Alert, Select } from '@grafana/ui'; +import { Alert, PopoverContent, Select } from '@grafana/ui'; import { VariableQueryType } from '../../types'; import { removeMarginBottom } from '../styles'; @@ -13,6 +13,8 @@ interface VariableQueryFieldProps<T> { inputId?: string; allowCustomValue?: boolean; isLoading?: boolean; + tooltip?: PopoverContent; + interactive?: boolean; error?: string; } @@ -24,11 +26,19 @@ export const VariableQueryField = <T extends string | VariableQueryType>({ allowCustomValue = false, isLoading = false, inputId = label, + tooltip, + interactive, error, }: VariableQueryFieldProps<T>) => { return ( <> - <EditorField label={label} htmlFor={inputId} className={removeMarginBottom}> + <EditorField + label={label} + tooltip={tooltip} + tooltipInteractive={interactive} + htmlFor={inputId} + className={removeMarginBottom} + > <Select aria-label={label} allowCustomValue={allowCustomValue} diff --git a/public/app/plugins/datasource/grafana-postgresql-datasource/configuration/ConfigurationEditor.tsx b/public/app/plugins/datasource/grafana-postgresql-datasource/configuration/ConfigurationEditor.tsx index 5d8cb9aae06..273c60df162 100644 --- a/public/app/plugins/datasource/grafana-postgresql-datasource/configuration/ConfigurationEditor.tsx +++ b/public/app/plugins/datasource/grafana-postgresql-datasource/configuration/ConfigurationEditor.tsx @@ -10,7 +10,14 @@ import { } from '@grafana/data'; import { ConfigSection, ConfigSubSection, DataSourceDescription, EditorStack } from '@grafana/plugin-ui'; import { config } from '@grafana/runtime'; -import { ConnectionLimits, Divider, TLSSecretsConfig, useMigrateDatabaseFields } from '@grafana/sql'; +import { + ConnectionLimits, + Divider, + MaxLifetimeField, + MaxOpenConnectionsField, + TLSSecretsConfig, + useMigrateDatabaseFields, +} from '@grafana/sql'; import { Input, Select, @@ -76,6 +83,14 @@ export const PostgresConfigEditor = (props: DataSourcePluginOptionsEditorProps<P }; }; + const onMaxConnectionsChanged = (number?: number) => { + updateDatasourcePluginJsonDataOption(props, 'maxOpenConns', number); + }; + + const onMaxLifetimeChanged = (number?: number) => { + updateDatasourcePluginJsonDataOption(props, 'connMaxLifetime', number); + }; + const onTimeScaleDBChanged = (event: SyntheticEvent<HTMLInputElement>) => { updateDatasourcePluginJsonDataOption(props, 'timescaledb', event.currentTarget.checked); }; @@ -397,8 +412,18 @@ export const PostgresConfigEditor = (props: DataSourcePluginOptionsEditorProps<P </Field> </ConfigSubSection> - <ConnectionLimits options={options} onOptionsChange={onOptionsChange} /> - + {config.featureToggles.postgresDSUsePGX ? ( + <ConfigSubSection title="Connection limits"> + <MaxOpenConnectionsField + labelWidth={WIDTH_LONG} + jsonData={jsonData} + onMaxConnectionsChanged={onMaxConnectionsChanged} + /> + <MaxLifetimeField labelWidth={WIDTH_LONG} jsonData={jsonData} onMaxLifetimeChanged={onMaxLifetimeChanged} /> + </ConfigSubSection> + ) : ( + <ConnectionLimits options={options} onOptionsChange={onOptionsChange} /> + )} {config.secureSocksDSProxyEnabled && ( <SecureSocksProxySettings options={options} onOptionsChange={onOptionsChange} /> )} diff --git a/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/QueryEditor.test.tsx b/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/QueryEditor.test.tsx index 5e7ed1e300d..779ffcbb497 100644 --- a/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/QueryEditor.test.tsx +++ b/public/app/plugins/datasource/grafana-pyroscope-datasource/QueryEditor/QueryEditor.test.tsx @@ -4,7 +4,7 @@ import userEvent from '@testing-library/user-event'; import { CoreApp, PluginType } from '@grafana/data'; import { PyroscopeDataSource } from '../datasource'; -import { mockFetchPyroscopeDatasourceSettings } from '../datasource.test'; +import { mockFetchPyroscopeDatasourceSettings } from '../mocks'; import { ProfileTypeMessage } from '../types'; import { Props, QueryEditor } from './QueryEditor'; diff --git a/public/app/plugins/datasource/grafana-pyroscope-datasource/dataquery.cue b/public/app/plugins/datasource/grafana-pyroscope-datasource/dataquery.cue index 67a62cc71e4..8e277aa6265 100644 --- a/public/app/plugins/datasource/grafana-pyroscope-datasource/dataquery.cue +++ b/public/app/plugins/datasource/grafana-pyroscope-datasource/dataquery.cue @@ -42,6 +42,8 @@ composableKinds: DataQuery: { // Sets the maximum number of nodes in the flamegraph. maxNodes?: int64 #PyroscopeQueryType: "metrics" | "profile" | *"both" @cuetsy(kind="type") + // If set to true, the response will contain annotations + annotations?: bool } }] lenses: [] diff --git a/public/app/plugins/datasource/grafana-pyroscope-datasource/dataquery.gen.ts b/public/app/plugins/datasource/grafana-pyroscope-datasource/dataquery.gen.ts index 2995e242acb..8513d2f7d8e 100644 --- a/public/app/plugins/datasource/grafana-pyroscope-datasource/dataquery.gen.ts +++ b/public/app/plugins/datasource/grafana-pyroscope-datasource/dataquery.gen.ts @@ -15,6 +15,10 @@ export type PyroscopeQueryType = ('metrics' | 'profile' | 'both'); export const defaultPyroscopeQueryType: PyroscopeQueryType = 'both'; export interface GrafanaPyroscopeDataQuery extends common.DataQuery { + /** + * If set to true, the response will contain annotations + */ + annotations?: boolean; /** * Allows to group the results. */ diff --git a/public/app/plugins/datasource/grafana-pyroscope-datasource/datasource.test.ts b/public/app/plugins/datasource/grafana-pyroscope-datasource/datasource.test.ts index 8eb122b9258..08c768d8c57 100644 --- a/public/app/plugins/datasource/grafana-pyroscope-datasource/datasource.test.ts +++ b/public/app/plugins/datasource/grafana-pyroscope-datasource/datasource.test.ts @@ -1,38 +1,11 @@ -import { - AbstractLabelOperator, - CoreApp, - DataSourceInstanceSettings, - PluginMetaInfo, - PluginType, - DataSourceJsonData, - makeTimeRange, -} from '@grafana/data'; -import { getBackendSrv, setBackendSrv, TemplateSrv } from '@grafana/runtime'; +import { AbstractLabelOperator, CoreApp, makeTimeRange } from '@grafana/data'; +import { TemplateSrv } from '@grafana/runtime'; import { defaultPyroscopeQueryType } from './dataquery.gen'; import { normalizeQuery, PyroscopeDataSource } from './datasource'; +import { defaultSettings, mockFetchPyroscopeDatasourceSettings } from './mocks'; import { Query } from './types'; -/** The datasource QueryEditor fetches datasource settings to send to the extension's `configure` method */ -export function mockFetchPyroscopeDatasourceSettings( - datasourceSettings?: Partial<DataSourceInstanceSettings<DataSourceJsonData>> -) { - const settings = { ...defaultSettings, ...datasourceSettings }; - const returnValues: Record<string, unknown> = { - [`/api/datasources/uid/${settings.uid}`]: settings, - }; - setBackendSrv({ - ...getBackendSrv(), - get: function <T>(path: string) { - const value = returnValues[path]; - if (value) { - return Promise.resolve(value as T); - } - return Promise.reject({ message: 'reject' }); - }, - }); -} - function setupDatasource() { mockFetchPyroscopeDatasourceSettings(); const templateSrv = { @@ -175,21 +148,3 @@ const defaultQuery = (query: Partial<Query>): Query => { ...query, }; }; - -const defaultSettings: DataSourceInstanceSettings = { - id: 0, - uid: 'pyroscope', - type: 'profiling', - name: 'pyroscope', - access: 'proxy', - meta: { - id: 'pyroscope', - name: 'pyroscope', - type: PluginType.datasource, - info: {} as PluginMetaInfo, - module: '', - baseUrl: '', - }, - jsonData: {}, - readOnly: false, -}; diff --git a/public/app/plugins/datasource/grafana-pyroscope-datasource/mocks.ts b/public/app/plugins/datasource/grafana-pyroscope-datasource/mocks.ts new file mode 100644 index 00000000000..4edd8433967 --- /dev/null +++ b/public/app/plugins/datasource/grafana-pyroscope-datasource/mocks.ts @@ -0,0 +1,41 @@ +import { DataSourceInstanceSettings, DataSourceJsonData, PluginMetaInfo, PluginType } from '@grafana/data'; +import { setBackendSrv, getBackendSrv } from '@grafana/runtime'; + +export const defaultSettings: DataSourceInstanceSettings = { + id: 0, + uid: 'pyroscope', + type: 'profiling', + name: 'pyroscope', + access: 'proxy', + meta: { + id: 'pyroscope', + name: 'pyroscope', + type: PluginType.datasource, + info: {} as PluginMetaInfo, + module: '', + baseUrl: '', + }, + jsonData: {}, + readOnly: false, +}; + +/** The datasource QueryEditor fetches datasource settings to send to the extension's `configure` method */ + +export function mockFetchPyroscopeDatasourceSettings( + datasourceSettings?: Partial<DataSourceInstanceSettings<DataSourceJsonData>> +) { + const settings = { ...defaultSettings, ...datasourceSettings }; + const returnValues: Record<string, unknown> = { + [`/api/datasources/uid/${settings.uid}`]: settings, + }; + setBackendSrv({ + ...getBackendSrv(), + get: function <T>(path: string) { + const value = returnValues[path]; + if (value) { + return Promise.resolve(value as T); + } + return Promise.reject({ message: 'reject' }); + }, + }); +} diff --git a/public/app/plugins/datasource/mssql/CheatSheet.tsx b/public/app/plugins/datasource/mssql/CheatSheet.tsx index da7cefa99b1..586ae818e47 100644 --- a/public/app/plugins/datasource/mssql/CheatSheet.tsx +++ b/public/app/plugins/datasource/mssql/CheatSheet.tsx @@ -56,7 +56,7 @@ export function CheatSheet() { </li> </ul> <Trans i18nKey="cheat-sheet.macros">Macros:</Trans> - {/* eslint-disable @grafana/no-untranslated-strings */} + {/* eslint-disable @grafana/i18n/no-untranslated-strings */} <ul className={styles.ulPadding}> <li>$__time(column) -> column AS time</li> <li>$__timeEpoch(column) -> DATEDIFF(second, '1970-01-01', column) AS time</li> @@ -84,13 +84,13 @@ export function CheatSheet() { <li>$__unixEpochGroup(column,'5m') -> FLOOR(column/300)*300</li> <li>$__unixEpochGroupAlias(column,'5m') -> FLOOR(column/300)*300 AS [time]</li> </ul> - {/* eslint-enable @grafana/no-untranslated-strings */} + {/* eslint-enable @grafana/i18n/no-untranslated-strings */} <p> <Trans i18nKey="cheat-sheet.example-time-group" values={{ timeGroupMacro: '$__timeGroup' }}> Example of group by and order by with {'{{timeGroupMacro}}'}: </Trans> </p> - {/* eslint-disable @grafana/no-untranslated-strings */} + {/* eslint-disable @grafana/i18n/no-untranslated-strings */} <pre> <code> SELECT $__timeGroup(date_time_col, '1h') AS time, sum(value) as value <br /> @@ -102,11 +102,11 @@ export function CheatSheet() { <br /> </code> </pre> - {/* eslint-enable @grafana/no-untranslated-strings */} + {/* eslint-enable @grafana/i18n/no-untranslated-strings */} <Trans i18nKey="cheat-sheet.condtional-macros"> Or build your own conditionals using these macros which just return the values: </Trans> - {/* eslint-disable @grafana/no-untranslated-strings */} + {/* eslint-disable @grafana/i18n/no-untranslated-strings */} <ul className={styles.ulPadding}> <li>$__timeFrom() -> '2017-04-21T05:01:17Z'</li> <li>$__timeTo() -> '2017-04-21T05:01:17Z'</li> @@ -115,7 +115,7 @@ export function CheatSheet() { <li>$__unixEpochNanoFrom() -> 1494410783152415214</li> <li>$__unixEpochNanoTo() -> 1494497183142514872</li> </ul> - {/* eslint-enable @grafana/no-untranslated-strings */} + {/* eslint-enable @grafana/i18n/no-untranslated-strings */} </div> ); } diff --git a/public/app/plugins/datasource/mssql/azureauth/AzureCredentialsForm.tsx b/public/app/plugins/datasource/mssql/azureauth/AzureCredentialsForm.tsx index 17d45809fcf..b5ba267fb56 100644 --- a/public/app/plugins/datasource/mssql/azureauth/AzureCredentialsForm.tsx +++ b/public/app/plugins/datasource/mssql/azureauth/AzureCredentialsForm.tsx @@ -180,7 +180,7 @@ export const AzureCredentialsForm = (props: Props) => { > <Input width={45} - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" value={credentials.tenantId || ''} onChange={onTenantIdChange} @@ -197,7 +197,7 @@ export const AzureCredentialsForm = (props: Props) => { > <Input width={45} - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" value={credentials.clientId || ''} onChange={onClientIdChange} @@ -242,7 +242,7 @@ export const AzureCredentialsForm = (props: Props) => { <Input width={45} aria-label={t('azureauth.azure-credentials-form.aria-label-client-secret', 'Client Secret')} - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" value={credentials.clientSecret || ''} onChange={onClientSecretChange} diff --git a/public/app/plugins/datasource/mssql/configuration/ConfigurationEditor.tsx b/public/app/plugins/datasource/mssql/configuration/ConfigurationEditor.tsx index 1bbf02dc2c7..b0cff13b748 100644 --- a/public/app/plugins/datasource/mssql/configuration/ConfigurationEditor.tsx +++ b/public/app/plugins/datasource/mssql/configuration/ConfigurationEditor.tsx @@ -162,7 +162,7 @@ export const ConfigurationEditor = (props: DataSourcePluginOptionsEditorProps<Ms name="host" type="text" value={dsSettings.url || ''} - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="localhost:1433" onChange={onDSOptionChanged('url')} /> @@ -367,7 +367,7 @@ export const ConfigurationEditor = (props: DataSourcePluginOptionsEditorProps<Ms value={dsSettings.user || ''} placeholder={ jsonData.authenticationType === MSSQLAuthenticationType.kerberosRaw - ? // eslint-disable-next-line @grafana/no-untranslated-strings + ? // eslint-disable-next-line @grafana/i18n/no-untranslated-strings 'name@EXAMPLE.COM' : t('configuration.configuration-editor.placeholder-user', 'user') } @@ -434,7 +434,7 @@ export const ConfigurationEditor = (props: DataSourcePluginOptionsEditorProps<Ms > <Input width={LONG_WIDTH} - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="1m" value={jsonData.timeInterval || ''} onChange={onUpdateDatasourceJsonDataOption(props, 'timeInterval')} diff --git a/public/app/plugins/datasource/mssql/configuration/Kerberos.tsx b/public/app/plugins/datasource/mssql/configuration/Kerberos.tsx index af39c3fc21e..a8e2f3ee9f2 100644 --- a/public/app/plugins/datasource/mssql/configuration/Kerberos.tsx +++ b/public/app/plugins/datasource/mssql/configuration/Kerberos.tsx @@ -62,7 +62,7 @@ export const KerberosConfig = (props: DataSourcePluginOptionsEditorProps<MssqlOp error={'Keytab file path is required'} > <Input - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="/home/grot/grot.keytab" onChange={onKeytabFileChanged} width={LONG_WIDTH} @@ -85,7 +85,7 @@ export const KerberosConfig = (props: DataSourcePluginOptionsEditorProps<MssqlOp )} > <Input - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="/tmp/krb5cc_1000" onChange={onCredentialCacheChanged} width={LONG_WIDTH} @@ -124,7 +124,7 @@ export const KerberosConfig = (props: DataSourcePluginOptionsEditorProps<MssqlOp )} > <Input - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="/home/grot/cache.json" onChange={onCredentialCacheFileChanged} width={LONG_WIDTH} @@ -179,7 +179,7 @@ export const KerberosAdvancedSettings = (props: DataSourcePluginOptionsEditorPro <Input type="text" width={LONG_WIDTH} - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="0" defaultValue={jsonData.UDPConnectionLimit} onChange={(e) => { @@ -207,7 +207,7 @@ export const KerberosAdvancedSettings = (props: DataSourcePluginOptionsEditorPro <Input type="text" width={LONG_WIDTH} - // eslint-disable-next-line @grafana/no-untranslated-strings + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings placeholder="true" defaultValue={jsonData.enableDNSLookupKDC} onChange={onDNSLookupKDCChanged} diff --git a/public/app/plugins/datasource/tempo/SearchTraceQLEditor/TagsInput.test.tsx b/public/app/plugins/datasource/tempo/SearchTraceQLEditor/TagsInput.test.tsx index 60b5378ddd3..ac348dc8fe9 100644 --- a/public/app/plugins/datasource/tempo/SearchTraceQLEditor/TagsInput.test.tsx +++ b/public/app/plugins/datasource/tempo/SearchTraceQLEditor/TagsInput.test.tsx @@ -8,7 +8,7 @@ import { initTemplateSrv } from '../test/test_utils'; import { Scope } from '../types'; import TagsInput from './TagsInput'; -import { v1Tags, v2Tags } from './utils.test'; +import { v1Tags, v2Tags } from './mocks'; describe('TagsInput', () => { let user: ReturnType<typeof userEvent.setup>; diff --git a/public/app/plugins/datasource/tempo/SearchTraceQLEditor/mocks.ts b/public/app/plugins/datasource/tempo/SearchTraceQLEditor/mocks.ts new file mode 100644 index 00000000000..547b50f8c4f --- /dev/null +++ b/public/app/plugins/datasource/tempo/SearchTraceQLEditor/mocks.ts @@ -0,0 +1,24 @@ +import { uniq } from 'lodash'; + +import { intrinsics } from '../traceql/traceql'; + +export const testIntrinsics = uniq(['duration', 'kind', 'name', 'status'].concat(intrinsics)); + +export const v1Tags = ['bar', 'foo']; + +export const v2Tags = [ + { + name: 'resource', + tags: ['cluster', 'container'], + }, + { + name: 'span', + tags: ['db'], + }, + { + name: 'intrinsic', + tags: testIntrinsics, + }, +]; + +export const emptyTags = []; diff --git a/public/app/plugins/datasource/tempo/SearchTraceQLEditor/utils.test.ts b/public/app/plugins/datasource/tempo/SearchTraceQLEditor/utils.test.ts index df4974921aa..3bdb9875635 100644 --- a/public/app/plugins/datasource/tempo/SearchTraceQLEditor/utils.test.ts +++ b/public/app/plugins/datasource/tempo/SearchTraceQLEditor/utils.test.ts @@ -5,6 +5,7 @@ import { TempoDatasource } from '../datasource'; import TempoLanguageProvider from '../language_provider'; import { intrinsics } from '../traceql/traceql'; +import { emptyTags, testIntrinsics, v1Tags, v2Tags } from './mocks'; import { filterToQuerySection, getAllTags, @@ -155,21 +156,3 @@ describe('filterToQuerySection returns the correct query section for a filter', expect(result).toBe('span.foo=~"bar|baz"'); }); }); - -export const emptyTags = []; -export const testIntrinsics = uniq(['duration', 'kind', 'name', 'status'].concat(intrinsics)); -export const v1Tags = ['bar', 'foo']; -export const v2Tags = [ - { - name: 'resource', - tags: ['cluster', 'container'], - }, - { - name: 'span', - tags: ['db'], - }, - { - name: 'intrinsic', - tags: testIntrinsics, - }, -]; diff --git a/public/app/plugins/datasource/tempo/language_provider.test.ts b/public/app/plugins/datasource/tempo/language_provider.test.ts index ca3c7c5e9d8..4a8a8bb1b83 100644 --- a/public/app/plugins/datasource/tempo/language_provider.test.ts +++ b/public/app/plugins/datasource/tempo/language_provider.test.ts @@ -1,6 +1,6 @@ import { uniq } from 'lodash'; -import { v1Tags, v2Tags } from './SearchTraceQLEditor/utils.test'; +import { v1Tags, v2Tags } from './SearchTraceQLEditor/mocks'; import { TraceqlSearchScope } from './dataquery.gen'; import { TempoDatasource } from './datasource'; import TempoLanguageProvider from './language_provider'; diff --git a/public/app/plugins/datasource/tempo/package.json b/public/app/plugins/datasource/tempo/package.json index 3898c6f9def..f2780ff3b9d 100644 --- a/public/app/plugins/datasource/tempo/package.json +++ b/public/app/plugins/datasource/tempo/package.json @@ -18,7 +18,7 @@ "@lezer/lr": "1.4.2", "@opentelemetry/api": "1.9.0", "@opentelemetry/exporter-collector": "0.25.0", - "@opentelemetry/semantic-conventions": "1.28.0", + "@opentelemetry/semantic-conventions": "1.34.0", "buffer": "6.0.3", "events": "3.3.0", "i18next": "^24.0.0", diff --git a/public/app/plugins/datasource/tempo/traceql/autocomplete.test.ts b/public/app/plugins/datasource/tempo/traceql/autocomplete.test.ts index d659ebc30e8..91b534f120c 100644 --- a/public/app/plugins/datasource/tempo/traceql/autocomplete.test.ts +++ b/public/app/plugins/datasource/tempo/traceql/autocomplete.test.ts @@ -1,7 +1,7 @@ import { DataSourceInstanceSettings, PluginMetaInfo, PluginType } from '@grafana/data'; import { monacoTypes } from '@grafana/ui'; -import { emptyTags, testIntrinsics, v1Tags, v2Tags } from '../SearchTraceQLEditor/utils.test'; +import { v1Tags, v2Tags, emptyTags, testIntrinsics } from '../SearchTraceQLEditor/mocks'; import { TempoDatasource } from '../datasource'; import TempoLanguageProvider from '../language_provider'; import { Scope, TempoJsonData } from '../types'; diff --git a/public/app/plugins/panel/alertlist/GroupByWithLoading.tsx b/public/app/plugins/panel/alertlist/GroupByWithLoading.tsx index 30b54432538..3cb04653b22 100644 --- a/public/app/plugins/panel/alertlist/GroupByWithLoading.tsx +++ b/public/app/plugins/panel/alertlist/GroupByWithLoading.tsx @@ -2,6 +2,7 @@ import { isEmpty, uniq } from 'lodash'; import { useEffect, useMemo } from 'react'; import { SelectableValue } from '@grafana/data'; +import { useTranslate } from '@grafana/i18n'; import { Icon, MultiSelect } from '@grafana/ui'; import { useUnifiedAlertingSelector } from 'app/features/alerting/unified/hooks/useUnifiedAlertingSelector'; import { fetchAllPromRulesAction } from 'app/features/alerting/unified/state/actions'; @@ -24,6 +25,7 @@ interface Props { } export const GroupBy = (props: Props) => { + const { t } = useTranslate(); const { onChange, id, defaultValue, dataSource } = props; const dispatch = useDispatch(); @@ -65,8 +67,8 @@ export const GroupBy = (props: Props) => { id={id} isLoading={loading} defaultValue={defaultValue} - aria-label={'group by label keys'} - placeholder="Group by" + aria-label={t('alertlist.group-by.aria-label-group-by-label-keys', 'group by label keys')} + placeholder={t('alertlist.group-by.placeholder-group-by', 'Group by')} prefix={<Icon name={'tag-alt'} />} onChange={(items) => { onChange(items.map((item) => item.value ?? '')); diff --git a/public/app/plugins/panel/alertlist/UnifiedAlertList.tsx b/public/app/plugins/panel/alertlist/UnifiedAlertList.tsx index be6401e3ad1..fa81e2bc8ec 100644 --- a/public/app/plugins/panel/alertlist/UnifiedAlertList.tsx +++ b/public/app/plugins/panel/alertlist/UnifiedAlertList.tsx @@ -4,6 +4,7 @@ import { useEffect, useMemo } from 'react'; import { useEffectOnce, useToggle } from 'react-use'; import { GrafanaTheme2, PanelProps } from '@grafana/data'; +import { Trans, useTranslate } from '@grafana/i18n'; import { TimeRangeUpdatedEvent } from '@grafana/runtime'; import { Alert, @@ -94,6 +95,7 @@ const fetchPromAndRuler = ({ }; function UnifiedAlertList(props: PanelProps<UnifiedAlertListOptions>) { + const { t } = useTranslate(); const dispatch = useDispatch(); const [limitInstances, toggleLimit] = useToggle(true); const [, gmaViewAllowed] = useAlertingAbility(AlertingAction.ViewAlertRule); @@ -249,7 +251,7 @@ function UnifiedAlertList(props: PanelProps<UnifiedAlertListOptions>) { </section> )} {/* loading moved here to avoid twitching */} - {renderLoading && <LoadingPlaceholder text="Loading..." />} + {renderLoading && <LoadingPlaceholder text={t('alertlist.unified-alert-list.text-loading', 'Loading...')} />} </ScrollContainer> ); } @@ -450,12 +452,17 @@ export const getStyles = (theme: GrafanaTheme2) => ({ }); export function UnifiedAlertListPanel(props: PanelProps<UnifiedAlertListOptions>) { + const { t } = useTranslate(); const [, gmaReadAllowed] = useAlertingAbility(AlertingAction.ViewAlertRule); const [, externalReadAllowed] = useAlertingAbility(AlertingAction.ViewExternalAlertRule); if (!gmaReadAllowed && !externalReadAllowed) { return ( - <Alert title="Permission required">Sorry, you do not have the required permissions to read alert rules</Alert> + <Alert title={t('alertlist.unified-alert-list-panel.title-permission-required', 'Permission required')}> + <Trans i18nKey="alertlist.unified-alert-list-panel.body-permission-required"> + Sorry, you do not have the required permissions to read alert rules. + </Trans> + </Alert> ); } diff --git a/public/app/plugins/panel/alertlist/module.tsx b/public/app/plugins/panel/alertlist/module.tsx index 2d0e2ef64c5..c176845cf1e 100644 --- a/public/app/plugins/panel/alertlist/module.tsx +++ b/public/app/plugins/panel/alertlist/module.tsx @@ -1,4 +1,5 @@ import { DataSourceInstanceSettings, PanelPlugin } from '@grafana/data'; +import { Trans } from '@grafana/i18n'; import { Button, Stack } from '@grafana/ui'; import { NestedFolderPicker } from 'app/core/components/NestedFolderPicker/NestedFolderPicker'; import { DataSourcePicker } from 'app/features/datasources/components/picker/DataSourcePicker'; @@ -127,7 +128,7 @@ const unifiedAlertList = new PanelPlugin<UnifiedAlertListOptions>(UnifiedAlertLi }} /> <Button variant="secondary" onClick={() => props.onChange(null)}> - Clear + <Trans i18nKey="alertlist.unified-alert-list.clear">Clear</Trans> </Button> </Stack> ); diff --git a/public/app/plugins/panel/alertlist/unified-alerting/UngroupedView.tsx b/public/app/plugins/panel/alertlist/unified-alerting/UngroupedView.tsx index 35a58263e22..df9591a9507 100644 --- a/public/app/plugins/panel/alertlist/unified-alerting/UngroupedView.tsx +++ b/public/app/plugins/panel/alertlist/unified-alerting/UngroupedView.tsx @@ -2,6 +2,7 @@ import { css, cx } from '@emotion/css'; import { useLocation } from 'react-use'; import { GrafanaTheme2, intervalToAbbreviatedDurationString } from '@grafana/data'; +import { useTranslate, Trans } from '@grafana/i18n'; import { Icon, Stack, useStyles2 } from '@grafana/ui'; import alertDef from 'app/features/alerting/state/alertDef'; import { Spacer } from 'app/features/alerting/unified/components/Spacer'; @@ -36,6 +37,7 @@ function getGrafanaInstancesTotal(totals: Partial<Record<AlertInstanceTotalState } const UngroupedModeView = ({ rules, options, handleInstancesLimit, limitInstances, hideViewRuleLinkText }: Props) => { + const { t } = useTranslate(); const styles = useStyles2(getStyles); const stateStyle = useStyles2(getStateTagStyles); const { href: returnTo } = useLocation(); @@ -93,9 +95,11 @@ const UngroupedModeView = ({ rules, options, handleInstancesLimit, limitInstance target="__blank" className={styles.link} rel="noopener" - aria-label="View alert rule" + aria-label={t('alertlist.ungrouped-mode-view.aria-label-view-alert-rule', 'View alert rule')} > - <span className={cx({ [styles.hidden]: hideViewRuleLinkText })}>View alert rule</span> + <span className={cx({ [styles.hidden]: hideViewRuleLinkText })}> + <Trans i18nKey="alertlist.ungrouped-mode-view.view-alert-rule">View alert rule</Trans> + </span> <Icon name={'external-link-alt'} size="sm" /> </a> )} @@ -105,15 +109,14 @@ const UngroupedModeView = ({ rules, options, handleInstancesLimit, limitInstance {alertStateToReadable(alertingRule.state)} </span>{' '} {firstActiveAt && alertingRule.state !== PromAlertingRuleState.Inactive && ( - <> - for{' '} - <span> - {intervalToAbbreviatedDurationString({ - start: firstActiveAt, - end: Date.now(), - })} - </span> - </> + <Trans + i18nKey="alertlist.ungrouped-mode-view.active-for" + values={{ + duration: intervalToAbbreviatedDurationString({ start: firstActiveAt, end: Date.now() }), + }} + > + for <span>{'{{duration}}'}</span> + </Trans> )} </div> </div> diff --git a/public/app/plugins/panel/annolist/AnnoListPanel.tsx b/public/app/plugins/panel/annolist/AnnoListPanel.tsx index 9ad76a71491..2e01cd495a1 100644 --- a/public/app/plugins/panel/annolist/AnnoListPanel.tsx +++ b/public/app/plugins/panel/annolist/AnnoListPanel.tsx @@ -12,6 +12,8 @@ import { locationUtil, PanelProps, } from '@grafana/data'; +import { Trans } from '@grafana/i18n'; +import { t } from '@grafana/i18n/internal'; import { config, getBackendSrv, locationService } from '@grafana/runtime'; import { Button, ScrollContainer, stylesFactory, TagList } from '@grafana/ui'; import { AbstractList } from '@grafana/ui/internal'; @@ -247,7 +249,11 @@ export class AnnoListPanel extends PureComponent<Props, State> { render() { const { loaded, annotations, queryUser, queryTags } = this.state; if (!loaded) { - return <div>loading...</div>; + return ( + <div> + <Trans i18nKey="annolist.anno-list-panel.loading">Loading...</Trans> + </div> + ); } // Previously we showed inidication that it covered all time @@ -262,14 +268,20 @@ export class AnnoListPanel extends PureComponent<Props, State> { <ScrollContainer minHeight="100%"> {hasFilter && ( <div className={this.style.filter}> - <b>Filter:</b> + <b> + <Trans i18nKey="annolist.anno-list-panel.filter">Filter:</Trans> + </b> {queryUser && ( <Button size="sm" variant="secondary" fill="text" onClick={this.onClearUser} - aria-label={`Remove filter: ${queryUser.email}`} + aria-label={t( + 'annolist.anno-list-panel.aria-label-remove-filter', + 'Remove filter: {{filterToRemove}}', + { filterToRemove: queryUser.email } + )} > {queryUser.email} </Button> @@ -287,7 +299,11 @@ export class AnnoListPanel extends PureComponent<Props, State> { </div> )} - {annotations.length < 1 && <div className={this.style.noneFound}>No Annotations Found</div>} + {annotations.length < 1 && ( + <div className={this.style.noneFound}> + <Trans i18nKey="annolist.anno-list-panel.no-annotations-found">No annotations found</Trans> + </div> + )} <AbstractList items={annotations} renderItem={this.renderItem} getItemKey={(item) => `${item.id}`} /> </ScrollContainer> diff --git a/public/app/plugins/panel/annolist/AnnotationListItem.tsx b/public/app/plugins/panel/annolist/AnnotationListItem.tsx index 4731081b03a..ecf22f9f597 100644 --- a/public/app/plugins/panel/annolist/AnnotationListItem.tsx +++ b/public/app/plugins/panel/annolist/AnnotationListItem.tsx @@ -2,6 +2,7 @@ import { css } from '@emotion/css'; import { MouseEvent } from 'react'; import { AnnotationEvent, DateTimeInput, GrafanaTheme2, PanelProps } from '@grafana/data'; +import { Trans } from '@grafana/i18n'; import { Card, TagList, Tooltip, RenderUserContentAsHTML, useStyles2 } from '@grafana/ui'; import { Options } from './panelcfg.gen'; @@ -79,8 +80,10 @@ const Avatar = ({ onClick, avatarUrl, login, email }: AvatarProps) => { }; const tooltipContent = ( <span> - Created by: - <br /> {email} + <Trans i18nKey="annolist.annotation-list-item.tooltip-created-by"> + Created by: + <br /> {{ email }} + </Trans> </span> ); diff --git a/public/app/plugins/panel/barchart/TickSpacingEditor.tsx b/public/app/plugins/panel/barchart/TickSpacingEditor.tsx index 123e058e956..57a811d864f 100644 --- a/public/app/plugins/panel/barchart/TickSpacingEditor.tsx +++ b/public/app/plugins/panel/barchart/TickSpacingEditor.tsx @@ -1,4 +1,5 @@ import { SelectableValue, StandardEditorProps } from '@grafana/data'; +import { useTranslate } from '@grafana/i18n'; import { Checkbox, HorizontalGroup, RadioButtonGroup, Tooltip } from '@grafana/ui'; const GAPS_OPTIONS: Array<SelectableValue<number>> = [ @@ -25,6 +26,7 @@ const GAPS_OPTIONS: Array<SelectableValue<number>> = [ ]; export const TickSpacingEditor = (props: StandardEditorProps<number>) => { + const { t } = useTranslate(); let value = props.value ?? 0; const isRTL = value < 0; if (isRTL) { @@ -50,9 +52,15 @@ export const TickSpacingEditor = (props: StandardEditorProps<number>) => { <HorizontalGroup> <RadioButtonGroup value={gap.value} options={GAPS_OPTIONS} onChange={onSpacingChange} /> {value !== 0 && ( - <Tooltip content="Require space from the right side" placement="top"> + <Tooltip + content={t( + 'barchart.tick-spacing-editor.content-require-space-from-the-right-side', + 'Require space from the right side' + )} + placement="top" + > <div> - <Checkbox value={isRTL} onChange={onRTLChange} label="RTL" /> + <Checkbox value={isRTL} onChange={onRTLChange} label={t('barchart.tick-spacing-editor.label-rtl', 'RTL')} /> </div> </Tooltip> )} diff --git a/public/app/plugins/panel/canvas/components/CanvasContextMenu.tsx b/public/app/plugins/panel/canvas/components/CanvasContextMenu.tsx index ea0dffe4c2a..bc37fed0d8f 100644 --- a/public/app/plugins/panel/canvas/components/CanvasContextMenu.tsx +++ b/public/app/plugins/panel/canvas/components/CanvasContextMenu.tsx @@ -4,6 +4,7 @@ import * as React from 'react'; import { first } from 'rxjs/operators'; import { SelectableValue } from '@grafana/data'; +import { useTranslate } from '@grafana/i18n'; import { ContextMenu, MenuItem, MenuItemProps } from '@grafana/ui'; import { ElementState } from 'app/features/canvas/runtime/element'; import { FrameState } from 'app/features/canvas/runtime/frame'; @@ -21,6 +22,7 @@ type Props = { }; export const CanvasContextMenu = ({ scene, panel, onVisibilityChange }: Props) => { + const { t } = useTranslate(); const inlineEditorOpen = panel.state.openInlineEdit; const [isMenuVisible, setIsMenuVisible] = useState<boolean>(false); const [anchorPoint, setAnchorPoint] = useState<AnchorPoint>({ x: 0, y: 0 }); @@ -76,7 +78,11 @@ export const CanvasContextMenu = ({ scene, panel, onVisibilityChange }: Props) = // This is disabled when panel is in edit mode because opening inline editor over panel editor is not ideal UX const openCloseEditorMenuItem = !scene.isPanelEditing && ( <MenuItem - label={inlineEditorOpen ? 'Close Editor' : 'Open Editor'} + label={ + inlineEditorOpen + ? t('canvas.canvas-context-menu.close-editor', 'Close Editor') + : t('canvas.canvas-context-menu.open-editor', 'Open Editor') + } onClick={() => { if (scene.inlineEditingCallback) { if (inlineEditorOpen) { @@ -102,7 +108,11 @@ export const CanvasContextMenu = ({ scene, panel, onVisibilityChange }: Props) = return ( element && element.item.hasEditMode && ( - <MenuItem label="Edit" onClick={onClickEditElementMenuItem} className={styles.menuItem} /> + <MenuItem + label={t('canvas.canvas-context-menu.render-menu-items.edit-element-menu-item.label-edit', 'Edit')} + onClick={onClickEditElementMenuItem} + className={styles.menuItem} + /> ) ); } @@ -144,7 +154,7 @@ export const CanvasContextMenu = ({ scene, panel, onVisibilityChange }: Props) = const addItemMenuItem = ( <MenuItem - label="Add item" + label={t('canvas.canvas-context-menu.render-menu-items.add-item-menu-item.label-add-item', 'Add item')} className={styles.menuItem} childItems={getTypeOptionsSubmenu()} customSubMenuContainerStyles={{ maxHeight: '150px', overflowY: 'auto' }} @@ -153,7 +163,10 @@ export const CanvasContextMenu = ({ scene, panel, onVisibilityChange }: Props) = const setBackgroundMenuItem = ( <MenuItem - label={'Set background'} + label={t( + 'canvas.canvas-context-menu.render-menu-items.set-background-menu-item.label-set-background', + 'Set background' + )} onClick={() => { if (scene.setBackgroundCallback) { scene.setBackgroundCallback(anchorPoint); @@ -169,7 +182,7 @@ export const CanvasContextMenu = ({ scene, panel, onVisibilityChange }: Props) = <> {editElementMenuItem()} <MenuItem - label="Delete" + label={t('canvas.canvas-context-menu.render-menu-items.label-delete', 'Delete')} onClick={() => { contextMenuAction(LayerActionID.Delete); closeContextMenu(); @@ -177,7 +190,7 @@ export const CanvasContextMenu = ({ scene, panel, onVisibilityChange }: Props) = className={styles.menuItem} /> <MenuItem - label="Duplicate" + label={t('canvas.canvas-context-menu.render-menu-items.label-duplicate', 'Duplicate')} onClick={() => { contextMenuAction(LayerActionID.Duplicate); closeContextMenu(); @@ -185,7 +198,7 @@ export const CanvasContextMenu = ({ scene, panel, onVisibilityChange }: Props) = className={styles.menuItem} /> <MenuItem - label="Bring to front" + label={t('canvas.canvas-context-menu.render-menu-items.label-bring-to-front', 'Bring to front')} onClick={() => { contextMenuAction(LayerActionID.MoveTop); closeContextMenu(); @@ -193,7 +206,7 @@ export const CanvasContextMenu = ({ scene, panel, onVisibilityChange }: Props) = className={styles.menuItem} /> <MenuItem - label="Send to back" + label={t('canvas.canvas-context-menu.render-menu-items.label-send-to-back', 'Send to back')} onClick={() => { contextMenuAction(LayerActionID.MoveBottom); closeContextMenu(); diff --git a/public/app/plugins/panel/canvas/editor/LineStyleEditor.tsx b/public/app/plugins/panel/canvas/editor/LineStyleEditor.tsx index 58aac8c148a..e76eb7b9680 100644 --- a/public/app/plugins/panel/canvas/editor/LineStyleEditor.tsx +++ b/public/app/plugins/panel/canvas/editor/LineStyleEditor.tsx @@ -1,6 +1,7 @@ import { useCallback } from 'react'; import { SelectableValue, StandardEditorProps } from '@grafana/data'; +import { useTranslate } from '@grafana/i18n'; import { Field, RadioButtonGroup, Switch } from '@grafana/ui'; import { LineStyle } from '../types'; @@ -24,6 +25,7 @@ export const defaultLineStyleConfig: LineStyleConfig = { }; export const LineStyleEditor = ({ value, onChange }: Props) => { + const { t } = useTranslate(); if (!value) { value = defaultLineStyleConfig; } else if (typeof value !== 'object') { @@ -53,7 +55,7 @@ export const LineStyleEditor = ({ value, onChange }: Props) => { {value.style !== LineStyle.Solid && ( <> <br /> - <Field label="Animate"> + <Field label={t('canvas.line-style-editor.label-animate', 'Animate')}> <Switch value={value.animate} onChange={(e) => onAnimateChange(e.currentTarget.checked)} /> </Field> </> diff --git a/public/app/plugins/panel/canvas/editor/element/APIEditor.tsx b/public/app/plugins/panel/canvas/editor/element/APIEditor.tsx index 2aaba7bf09f..fc7f2ec2f11 100644 --- a/public/app/plugins/panel/canvas/editor/element/APIEditor.tsx +++ b/public/app/plugins/panel/canvas/editor/element/APIEditor.tsx @@ -6,6 +6,7 @@ import { StringFieldConfigSettings, SelectableValue, } from '@grafana/data'; +import { useTranslate, Trans } from '@grafana/i18n'; import { Button, Field, InlineField, InlineFieldRow, JSONFormatter, RadioButtonGroup, Select } from '@grafana/ui'; import { StringValueEditor } from 'app/core/components/OptionsUI/string'; import { defaultApiConfig } from 'app/features/canvas/elements/button'; @@ -50,6 +51,7 @@ const contentTypeOptions: SelectableValue[] = [ ]; export function APIEditor({ value, context, onChange }: Props) { + const { t } = useTranslate(); const LABEL_WIDTH = 13; if (!value) { @@ -136,8 +138,11 @@ export function APIEditor({ value, context, onChange }: Props) { const renderTestAPIButton = (api: APIEditorConfig) => { if (api && api.endpoint) { return ( - <Button onClick={() => callApi(api)} title="Test API"> - Test API + <Button + onClick={() => callApi(api)} + title={t('canvas.apieditor.render-test-apibutton.title-test-api', 'Test API')} + > + <Trans i18nKey="canvas.apieditor.render-test-apibutton.test-api">Test API</Trans> </Button> ); } @@ -148,7 +153,7 @@ export function APIEditor({ value, context, onChange }: Props) { return ( <> <InlineFieldRow> - <InlineField label="Endpoint" labelWidth={LABEL_WIDTH} grow={true}> + <InlineField label={t('canvas.apieditor.label-endpoint', 'Endpoint')} labelWidth={LABEL_WIDTH} grow={true}> <StringValueEditor context={context} value={value?.endpoint} @@ -158,13 +163,18 @@ export function APIEditor({ value, context, onChange }: Props) { </InlineField> </InlineFieldRow> <InlineFieldRow> - <InlineField label="Method" labelWidth={LABEL_WIDTH} grow={true}> + <InlineField label={t('canvas.apieditor.label-method', 'Method')} labelWidth={LABEL_WIDTH} grow={true}> <RadioButtonGroup value={value?.method} options={httpMethodOptions} onChange={onMethodChange} fullWidth /> </InlineField> </InlineFieldRow> {value?.method !== HttpRequestMethod.GET && ( <InlineFieldRow> - <InlineField label="Content-Type" labelWidth={LABEL_WIDTH} grow={true}> + <InlineField + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings + label="Content-Type" + labelWidth={LABEL_WIDTH} + grow={true} + > <Select options={contentTypeOptions} allowCustomValue={true} @@ -177,14 +187,14 @@ export function APIEditor({ value, context, onChange }: Props) { )} <br /> - <Field label="Query parameters"> + <Field label={t('canvas.apieditor.label-query-parameters', 'Query parameters')}> <ParamsEditor value={value?.queryParams ?? []} onChange={onQueryParamsChange} /> </Field> - <Field label="Header parameters"> + <Field label={t('canvas.apieditor.label-header-parameters', 'Header parameters')}> <ParamsEditor value={value?.headerParams ?? []} onChange={onHeaderParamsChange} /> </Field> {value?.method !== HttpRequestMethod.GET && value?.contentType && ( - <Field label="Payload"> + <Field label={t('canvas.apieditor.label-payload', 'Payload')}> <StringValueEditor context={context} value={value?.data ?? '{}'} diff --git a/public/app/plugins/panel/canvas/editor/element/ButtonStyleEditor.tsx b/public/app/plugins/panel/canvas/editor/element/ButtonStyleEditor.tsx index e2a7fe599ed..a6eb0febbea 100644 --- a/public/app/plugins/panel/canvas/editor/element/ButtonStyleEditor.tsx +++ b/public/app/plugins/panel/canvas/editor/element/ButtonStyleEditor.tsx @@ -1,6 +1,7 @@ import { useCallback } from 'react'; import { SelectableValue, StandardEditorProps } from '@grafana/data'; +import { useTranslate } from '@grafana/i18n'; import { ButtonVariant, InlineField, InlineFieldRow, Select } from '@grafana/ui'; import { defaultStyleConfig } from 'app/features/canvas/elements/button'; @@ -18,6 +19,7 @@ const variantOptions: SelectableValue[] = [ ]; export const ButtonStyleEditor = ({ value, onChange }: Props) => { + const { t } = useTranslate(); if (!value) { value = defaultStyleConfig; } @@ -35,7 +37,7 @@ export const ButtonStyleEditor = ({ value, onChange }: Props) => { return ( <> <InlineFieldRow> - <InlineField label="Variant" grow={true}> + <InlineField label={t('canvas.button-style-editor.label-variant', 'Variant')} grow={true}> <Select options={variantOptions} value={value?.variant} onChange={onVariantChange} /> </InlineField> </InlineFieldRow> diff --git a/public/app/plugins/panel/canvas/editor/element/ParamsEditor.tsx b/public/app/plugins/panel/canvas/editor/element/ParamsEditor.tsx index c23df5f2348..62864a96326 100644 --- a/public/app/plugins/panel/canvas/editor/element/ParamsEditor.tsx +++ b/public/app/plugins/panel/canvas/editor/element/ParamsEditor.tsx @@ -1,6 +1,7 @@ import { useState } from 'react'; import * as React from 'react'; +import { useTranslate } from '@grafana/i18n'; import { IconButton, Input, Stack } from '@grafana/ui'; interface Props { @@ -9,6 +10,7 @@ interface Props { } export const ParamsEditor = ({ value, onChange }: Props) => { + const { t } = useTranslate(); const [paramName, setParamName] = useState(''); const [paramValue, setParamValue] = useState(''); @@ -46,16 +48,33 @@ export const ParamsEditor = ({ value, onChange }: Props) => { return ( <div> <Stack direction="row"> - <Input placeholder="Key" value={paramName} onChange={changeParamName} /> - <Input placeholder="Value" value={paramValue} onChange={changeParamValue} /> - <IconButton aria-label="add" name="plus-circle" onClick={addParam} disabled={isAddParamsDisabled} /> + <Input + placeholder={t('canvas.params-editor.placeholder-key', 'Key')} + value={paramName} + onChange={changeParamName} + /> + <Input + placeholder={t('canvas.params-editor.placeholder-value', 'Value')} + value={paramValue} + onChange={changeParamValue} + /> + <IconButton + aria-label={t('canvas.params-editor.aria-label-add', 'Add')} + name="plus-circle" + onClick={addParam} + disabled={isAddParamsDisabled} + /> </Stack> <Stack direction="column"> {Array.from(value || []).map((entry) => ( <Stack key={entry[0]} direction="row"> <Input disabled value={entry[0]} /> <Input disabled value={entry[1]} /> - <IconButton aria-label="delete" onClick={removeParam(entry[0])} name="trash-alt" /> + <IconButton + aria-label={t('canvas.params-editor.aria-label-delete', 'Delete')} + onClick={removeParam(entry[0])} + name="trash-alt" + /> </Stack> ))} </Stack> diff --git a/public/app/plugins/panel/canvas/editor/element/PlacementEditor.tsx b/public/app/plugins/panel/canvas/editor/element/PlacementEditor.tsx index 9baee2d1d31..a207b1a1f92 100644 --- a/public/app/plugins/panel/canvas/editor/element/PlacementEditor.tsx +++ b/public/app/plugins/panel/canvas/editor/element/PlacementEditor.tsx @@ -2,6 +2,7 @@ import { useObservable } from 'react-use'; import { Subject } from 'rxjs'; import { SelectableValue, StandardEditorProps } from '@grafana/data'; +import { Trans, useTranslate } from '@grafana/i18n'; import { Field, Icon, InlineField, InlineFieldRow, Select, Stack } from '@grafana/ui'; import { NumberInput } from 'app/core/components/OptionsUI/NumberInput'; @@ -32,13 +33,18 @@ const verticalOptions: Array<SelectableValue<VerticalConstraint>> = [ type Props = StandardEditorProps<unknown, CanvasEditorOptions, Options>; export function PlacementEditor({ item }: Props) { + const { t } = useTranslate(); const settings = item.settings; // Will force a rerender whenever the subject changes useObservable(settings?.scene ? settings.scene.moved : new Subject()); if (!settings) { - return <div>Loading...</div>; + return ( + <div> + <Trans i18nKey="canvas.placement-editor.loading">Loading...</Trans> + </div> + ); } const element = settings.element; @@ -95,7 +101,7 @@ export function PlacementEditor({ item }: Props) { <div> <QuickPositioning onPositionChange={onPositionChange} settings={settings} element={element} /> <br /> - <Field label="Constraints"> + <Field label={t('canvas.placement-editor.label-constraints', 'Constraints')}> <Stack direction="row"> <ConstraintSelectionBox onVerticalConstraintChange={onVerticalConstraintChange} @@ -121,7 +127,7 @@ export function PlacementEditor({ item }: Props) { <br /> - <Field label="Position"> + <Field label={t('canvas.placement-editor.label-position', 'Position')}> <> {places.map((p) => { const v = placement![p]; diff --git a/public/app/plugins/panel/canvas/editor/element/QuickPositioning.tsx b/public/app/plugins/panel/canvas/editor/element/QuickPositioning.tsx index c63a14aabc6..b8d8da31e09 100644 --- a/public/app/plugins/panel/canvas/editor/element/QuickPositioning.tsx +++ b/public/app/plugins/panel/canvas/editor/element/QuickPositioning.tsx @@ -1,6 +1,7 @@ import { css } from '@emotion/css'; import { GrafanaTheme2 } from '@grafana/data'; +import { useTranslate } from '@grafana/i18n'; import { IconButton, useStyles2 } from '@grafana/ui'; import { ElementState } from 'app/features/canvas/runtime/element'; import { QuickPlacement } from 'app/features/canvas/types'; @@ -16,6 +17,7 @@ type Props = { }; export const QuickPositioning = ({ onPositionChange, element, settings }: Props) => { + const { t } = useTranslate(); const styles = useStyles2(getStyles); const onQuickPositioningChange = (position: QuickPlacement) => { @@ -70,41 +72,41 @@ export const QuickPositioning = ({ onPositionChange, element, settings }: Props) onClick={() => onQuickPositioningChange(QuickPlacement.Left)} className={styles.button} size="lg" - tooltip="Align left" + tooltip={t('canvas.quick-positioning.tooltip-align-left', 'Align left')} /> <IconButton name="horizontal-align-center" onClick={() => onQuickPositioningChange(QuickPlacement.HorizontalCenter)} className={styles.button} size="lg" - tooltip="Align horizontal centers" + tooltip={t('canvas.quick-positioning.tooltip-align-horizontal-centers', 'Align horizontal centers')} /> <IconButton name="horizontal-align-right" onClick={() => onQuickPositioningChange(QuickPlacement.Right)} className={styles.button} size="lg" - tooltip="Align right" + tooltip={t('canvas.quick-positioning.tooltip-align-right', 'Align right')} /> <IconButton name="vertical-align-top" onClick={() => onQuickPositioningChange(QuickPlacement.Top)} size="lg" - tooltip="Align top" + tooltip={t('canvas.quick-positioning.tooltip-align-top', 'Align top')} /> <IconButton name="vertical-align-center" onClick={() => onQuickPositioningChange(QuickPlacement.VerticalCenter)} className={styles.button} size="lg" - tooltip="Align vertical centers" + tooltip={t('canvas.quick-positioning.tooltip-align-vertical-centers', 'Align vertical centers')} /> <IconButton name="vertical-align-bottom" onClick={() => onQuickPositioningChange(QuickPlacement.Bottom)} className={styles.button} size="lg" - tooltip="Align bottom" + tooltip={t('canvas.quick-positioning.tooltip-align-bottom', 'Align bottom')} /> </div> ); diff --git a/public/app/plugins/panel/canvas/editor/inline/InlineEdit.tsx b/public/app/plugins/panel/canvas/editor/inline/InlineEdit.tsx index 49ff4fe511b..05ec36f2a0c 100644 --- a/public/app/plugins/panel/canvas/editor/inline/InlineEdit.tsx +++ b/public/app/plugins/panel/canvas/editor/inline/InlineEdit.tsx @@ -4,6 +4,7 @@ import Draggable, { DraggableEventHandler } from 'react-draggable'; import { Resizable, ResizeCallbackData } from 'react-resizable'; import { Dimensions2D, GrafanaTheme2 } from '@grafana/data'; +import { Trans, useTranslate } from '@grafana/i18n'; import { IconButton, Portal, useStyles2 } from '@grafana/ui'; import store from 'app/core/store'; import { Scene } from 'app/features/canvas/runtime/scene'; @@ -20,6 +21,7 @@ const OFFSET_X = 10; const OFFSET_Y = 32; export function InlineEdit({ onClose, id, scene }: Props) { + const { t } = useTranslate(); const root = scene.root.div?.getBoundingClientRect(); const windowHeight = window.innerHeight; const windowWidth = window.innerWidth; @@ -83,13 +85,15 @@ export function InlineEdit({ onClose, id, scene }: Props) { > <strong className={styles.inlineEditorHeader}> <div className={styles.placeholder} /> - <div>Canvas Inline Editor</div> + <div> + <Trans i18nKey="canvas.inline-edit.canvas-inline-editor">Canvas Inline Editor</Trans> + </div> <IconButton name="times" size="xl" className={styles.inlineEditorClose} onClick={onClose} - tooltip="Close inline editor" + tooltip={t('canvas.inline-edit.tooltip-close-inline-editor', 'Close inline editor')} /> </strong> <div className={styles.inlineEditorContentWrapper}> diff --git a/public/app/plugins/panel/canvas/editor/inline/InlineEditBody.tsx b/public/app/plugins/panel/canvas/editor/inline/InlineEditBody.tsx index 8c6a2764035..2ca542b5852 100644 --- a/public/app/plugins/panel/canvas/editor/inline/InlineEditBody.tsx +++ b/public/app/plugins/panel/canvas/editor/inline/InlineEditBody.tsx @@ -5,6 +5,7 @@ import { useObservable } from 'react-use'; import { DataFrame, GrafanaTheme2, PanelOptionsEditorBuilder, StandardEditorContext } from '@grafana/data'; import { NestedValueAccess, PanelOptionsSupplier } from '@grafana/data/internal'; +import { useTranslate, Trans } from '@grafana/i18n'; import { useStyles2 } from '@grafana/ui'; import { AddLayerButton } from 'app/core/components/Layers/AddLayerButton'; import { FrameState } from 'app/features/canvas/runtime/frame'; @@ -25,6 +26,7 @@ import { getLayerEditor } from '../layer/layerEditor'; import { TabsEditor } from './TabsEditor'; export function InlineEditBody() { + const { t } = useTranslate(); const activePanel = useObservable(activePanelSubject); const instanceState = activePanel?.panel.context?.instanceState; const styles = useStyles2(getStyles); @@ -103,12 +105,20 @@ export function InlineEditBody() { <> <div style={topLevelItemsContainerStyle}>{pane.items.map((item) => item.render())}</div> <div style={topLevelItemsContainerStyle}> - <AddLayerButton onChange={(sel) => onAddItem(sel, rootLayer)} options={typeOptions} label={'Add item'} /> + <AddLayerButton + onChange={(sel) => onAddItem(sel, rootLayer)} + options={typeOptions} + label={t('canvas.inline-edit-body.label-add-item', 'Add item')} + /> </div> <div style={topLevelItemsContainerStyle}> <TabsEditor onTabChange={onTabChange} /> {pane.categories.map((p) => renderOptionsPaneCategoryDescriptor(p))} - {noElementSelected && <div className={styles.selectElement}>Please select an element</div>} + {noElementSelected && ( + <div className={styles.selectElement}> + <Trans i18nKey="canvas.inline-edit-body.please-select-an-element">Please select an element</Trans> + </div> + )} </div> </> ); diff --git a/public/app/plugins/panel/canvas/editor/layer/TreeNavigationEditor.tsx b/public/app/plugins/panel/canvas/editor/layer/TreeNavigationEditor.tsx index b78c1ab9fe6..bc66fc46de5 100644 --- a/public/app/plugins/panel/canvas/editor/layer/TreeNavigationEditor.tsx +++ b/public/app/plugins/panel/canvas/editor/layer/TreeNavigationEditor.tsx @@ -4,6 +4,7 @@ import Tree, { TreeNodeProps } from 'rc-tree'; import { Key, useEffect, useMemo, useState } from 'react'; import { GrafanaTheme2, StandardEditorProps } from '@grafana/data'; +import { Trans, useTranslate } from '@grafana/i18n'; import { config } from '@grafana/runtime'; import { Button, Icon, Stack, useStyles2, useTheme2 } from '@grafana/ui'; import { AddLayerButton } from 'app/core/components/Layers/AddLayerButton'; @@ -22,6 +23,7 @@ import { getTreeData, onNodeDrop, TreeElement } from './tree'; let allowSelection = true; export const TreeNavigationEditor = ({ item }: StandardEditorProps<unknown, TreeViewEditorProps, Options>) => { + const { t } = useTranslate(); const [treeData, setTreeData] = useState(getTreeData(item?.settings?.scene.root)); const [autoExpandParent, setAutoExpandParent] = useState(true); const [expandedKeys, setExpandedKeys] = useState<Key[]>([]); @@ -50,12 +52,20 @@ export const TreeNavigationEditor = ({ item }: StandardEditorProps<unknown, Tree }, [item?.settings?.scene.root, selectedBgColor, selection, selectionByUID]); if (!settings) { - return <div>No settings</div>; + return ( + <div> + <Trans i18nKey="canvas.tree-navigation-editor.no-settings">No settings</Trans> + </div> + ); } const layer = settings.layer; if (!layer) { - return <div>Missing layer?</div>; + return ( + <div> + <Trans i18nKey="canvas.tree-navigation-editor.missing-layer">Missing layer?</Trans> + </div> + ); } const onSelect = (selectedKeys: Key[], info: { node: { dataRef: ElementState } }) => { @@ -95,7 +105,7 @@ export const TreeNavigationEditor = ({ item }: StandardEditorProps<unknown, Tree return ( <Icon name="angle-right" - title={'Node Icon'} + title={t('canvas.tree-navigation-editor.switcher-icon.title-node-icon', 'Node Icon')} style={{ transform: `rotate(${obj.expanded ? 90 : 0}deg)`, fill: theme.colors.text.primary, @@ -150,16 +160,20 @@ export const TreeNavigationEditor = ({ item }: StandardEditorProps<unknown, Tree <Stack justifyContent="space-between" direction="row"> <div className={styles.addLayerButton}> - <AddLayerButton onChange={(sel) => onAddItem(sel, layer)} options={typeOptions} label={'Add item'} /> + <AddLayerButton + onChange={(sel) => onAddItem(sel, layer)} + options={typeOptions} + label={t('canvas.tree-navigation-editor.label-add-item', 'Add item')} + /> </div> {selection.length > 0 && ( <Button size="sm" variant="secondary" onClick={onClearSelection}> - Clear selection + <Trans i18nKey="canvas.tree-navigation-editor.clear-selection">Clear selection</Trans> </Button> )} {selection.length > 1 && config.featureToggles.canvasPanelNesting && ( <Button size="sm" variant="secondary" onClick={onFrameSelection}> - Frame selection + <Trans i18nKey="canvas.tree-navigation-editor.frame-selection">Frame selection</Trans> </Button> )} </Stack> diff --git a/public/app/plugins/panel/canvas/editor/layer/TreeNodeTitle.tsx b/public/app/plugins/panel/canvas/editor/layer/TreeNodeTitle.tsx index 4995f960fcc..534836a52aa 100644 --- a/public/app/plugins/panel/canvas/editor/layer/TreeNodeTitle.tsx +++ b/public/app/plugins/panel/canvas/editor/layer/TreeNodeTitle.tsx @@ -1,6 +1,7 @@ import { css } from '@emotion/css'; import { GrafanaTheme2 } from '@grafana/data'; +import { useTranslate } from '@grafana/i18n'; import { IconButton, useStyles2 } from '@grafana/ui'; import { LayerName } from 'app/core/components/Layers/LayerName'; import { ElementState } from 'app/features/canvas/runtime/element'; @@ -17,6 +18,7 @@ interface Props { } export const TreeNodeTitle = ({ settings, nodeData, setAllowSelection }: Props) => { + const { t } = useTranslate(); const element = nodeData.dataRef; const name = nodeData.dataRef.getName(); @@ -72,17 +74,17 @@ export const TreeNodeTitle = ({ settings, nodeData, setAllowSelection }: Props) <div className={styles.actionButtonsWrapper}> <IconButton name="copy" - title="Duplicate" + title={t('canvas.tree-node-title.title-duplicate', 'Duplicate')} className={styles.actionIcon} onClick={() => onDuplicate(element)} - tooltip="Duplicate" + tooltip={t('canvas.tree-node-title.tooltip-duplicate', 'Duplicate')} /> <IconButton name="trash-alt" - title="remove" + title={t('canvas.tree-node-title.title-remove', 'Remove')} className={styles.actionIcon} onClick={() => onDelete(element)} - tooltip="Remove" + tooltip={t('canvas.tree-node-title.tooltip-remove', 'Remove')} /> </div> )} diff --git a/public/app/plugins/panel/canvas/editor/panZoomHelp.tsx b/public/app/plugins/panel/canvas/editor/panZoomHelp.tsx index a6e22d1d4e4..fc5be5ff1b7 100644 --- a/public/app/plugins/panel/canvas/editor/panZoomHelp.tsx +++ b/public/app/plugins/panel/canvas/editor/panZoomHelp.tsx @@ -1,18 +1,20 @@ import { css } from '@emotion/css'; import { StandardEditorProps, GrafanaTheme2 } from '@grafana/data'; +import { useTranslate, Trans } from '@grafana/i18n'; import { Alert, Icon, Stack, useStyles2 } from '@grafana/ui'; const helpUrl = 'https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/canvas/'; export const PanZoomHelp = ({}: StandardEditorProps<string, unknown, unknown, unknown>) => { + const { t } = useTranslate(); const styles = useStyles2(getStyles); return ( <> <Stack direction="row"> <Alert - title="Pan and zoom controls" + title={t('canvas.pan-zoom-help.title-pan-and-zoom-controls', 'Pan and zoom controls')} severity="info" buttonContent={<Icon name="question-circle" size="xl" />} className={styles.alert} @@ -26,14 +28,22 @@ export const PanZoomHelp = ({}: StandardEditorProps<string, unknown, unknown, un <Stack direction="column"> <ul> <li> - Pan: + <Trans i18nKey="canvas.pan-zoom-help.pan-title">Pan:</Trans> <ul> - <li>Middle mouse</li> - <li>CTRL + right mouse</li> + <li> + <Trans i18nKey="canvas.pan-zoom-help.middle-mouse">Middle mouse</Trans> + </li> + <li> + <Trans i18nKey="canvas.pan-zoom-help.ctrl-right-mouse">CTRL + right mouse</Trans> + </li> </ul> </li> - <li>Zoom: Scroll wheel</li> - <li>Reset: Double click</li> + <li> + <Trans i18nKey="canvas.pan-zoom-help.zoom-scroll-wheel">Zoom: Scroll wheel</Trans> + </li> + <li> + <Trans i18nKey="canvas.pan-zoom-help.reset-double-click">Reset: Double click</Trans> + </li> </ul> </Stack> </Alert> diff --git a/public/app/plugins/panel/datagrid/components/AddColumn.tsx b/public/app/plugins/panel/datagrid/components/AddColumn.tsx index 96353fc430e..f4e6deaa6df 100644 --- a/public/app/plugins/panel/datagrid/components/AddColumn.tsx +++ b/public/app/plugins/panel/datagrid/components/AddColumn.tsx @@ -1,6 +1,8 @@ import { useState } from 'react'; import * as React from 'react'; +import { useTranslate } from '@grafana/i18n'; + import { SimpleInput } from './SimpleInput'; interface AddColumnProps { @@ -9,6 +11,7 @@ interface AddColumnProps { } export const AddColumn = ({ divStyle, onColumnInputBlur }: AddColumnProps) => { + const { t } = useTranslate(); const [showInput, setShowInput] = useState<boolean>(false); const setupColumnInput = () => { @@ -27,7 +30,7 @@ export const AddColumn = ({ divStyle, onColumnInputBlur }: AddColumnProps) => { return ( <div className={divStyle}> {showInput ? ( - <SimpleInput placeholder="Column Name" onBlur={onBlur} /> + <SimpleInput placeholder={t('datagrid.add-column.placeholder-column-name', 'Column name')} onBlur={onBlur} /> ) : ( <button onClick={setupColumnInput}>+</button> )} diff --git a/public/app/plugins/panel/datagrid/components/DatagridContextMenu.tsx b/public/app/plugins/panel/datagrid/components/DatagridContextMenu.tsx index 1e06330c88d..1db654bbc0b 100644 --- a/public/app/plugins/panel/datagrid/components/DatagridContextMenu.tsx +++ b/public/app/plugins/panel/datagrid/components/DatagridContextMenu.tsx @@ -4,6 +4,7 @@ import * as React from 'react'; import { DataFrame, FieldType } from '@grafana/data'; import { convertFieldType } from '@grafana/data/internal'; +import { useTranslate } from '@grafana/i18n'; import { reportInteraction } from '@grafana/runtime'; import { ContextMenu, MenuGroup, MenuItem } from '@grafana/ui'; import { MenuDivider } from '@grafana/ui/internal'; @@ -39,6 +40,7 @@ export const DatagridContextMenu = ({ columnFreezeIndex, renameColumnClicked, }: ContextMenuProps) => { + const { t } = useTranslate(); let selectedRows: number[] = []; let selectedColumns: number[] = []; const { row, column, x, y, isHeaderMenu } = menuData; @@ -118,7 +120,7 @@ export const DatagridContextMenu = ({ {showDeleteColumn || showDeleteRow ? <MenuDivider /> : null} {showClearRow ? ( <MenuItem - label="Clear row" + label={t('datagrid.datagrid-context-menu.render-context-menu-items.label-clear-row', 'Clear row')} onClick={() => { reportInteraction(INTERACTION_EVENT_NAME, { item: INTERACTION_ITEM.CONTEXT_MENU_ACTION, @@ -130,7 +132,7 @@ export const DatagridContextMenu = ({ ) : null} {showClearColumn ? ( <MenuItem - label="Clear column" + label={t('datagrid.datagrid-context-menu.render-context-menu-items.label-clear-column', 'Clear column')} onClick={() => { const field = data.fields[column]; field.values = field.values.map(() => null); @@ -146,7 +148,7 @@ export const DatagridContextMenu = ({ ) : null} {showClearRow || showClearColumn ? <MenuDivider /> : null} <MenuItem - label="Remove all data" + label={t('datagrid.datagrid-context-menu.render-context-menu-items.label-remove-all-data', 'Remove all data')} onClick={() => { reportInteraction(INTERACTION_EVENT_NAME, { item: INTERACTION_ITEM.CONTEXT_MENU_ACTION, @@ -156,7 +158,7 @@ export const DatagridContextMenu = ({ }} /> <MenuItem - label="Search..." + label={t('datagrid.datagrid-context-menu.render-context-menu-items.label-search', 'Search...')} onClick={() => { reportInteraction(INTERACTION_EVENT_NAME, { item: INTERACTION_ITEM.CONTEXT_MENU_ACTION, @@ -216,7 +218,9 @@ export const DatagridContextMenu = ({ return ( <> {fieldTypeConversionData.length ? ( - <MenuGroup label="Set field type"> + <MenuGroup + label={t('datagrid.datagrid-context-menu.render-header-menu-items.label-set-field-type', 'Set field type')} + > {fieldTypeConversionData.map((conversionData, index) => ( <MenuItem key={index} @@ -259,10 +263,13 @@ export const DatagridContextMenu = ({ } }} /> - <MenuItem label="Rename column" onClick={renameColumnClicked} /> + <MenuItem + label={t('datagrid.datagrid-context-menu.render-header-menu-items.label-rename-column', 'Rename column')} + onClick={renameColumnClicked} + /> <MenuDivider /> <MenuItem - label="Delete column" + label={t('datagrid.datagrid-context-menu.render-header-menu-items.label-delete-column', 'Delete column')} onClick={() => { reportInteraction(INTERACTION_EVENT_NAME, { item: INTERACTION_ITEM.HEADER_MENU_ACTION, @@ -278,7 +285,7 @@ export const DatagridContextMenu = ({ }} /> <MenuItem - label="Clear column" + label={t('datagrid.datagrid-context-menu.render-header-menu-items.label-clear-column', 'Clear column')} onClick={() => { const field = data.fields[column]; field.values = field.values.map(() => null); diff --git a/public/app/plugins/panel/debug/CursorView.tsx b/public/app/plugins/panel/debug/CursorView.tsx index 92e2c429d3a..43ea8b39835 100644 --- a/public/app/plugins/panel/debug/CursorView.tsx +++ b/public/app/plugins/panel/debug/CursorView.tsx @@ -9,6 +9,7 @@ import { DataHoverClearEvent, BusEventBase, } from '@grafana/data'; +import { Trans } from '@grafana/i18n'; import { CustomScrollbar } from '@grafana/ui'; import { DataHoverView } from 'app/features/visualization/data-hover/DataHoverView'; @@ -58,13 +59,19 @@ export class CursorView extends Component<Props, State> { render() { const { event } = this.state; if (!event) { - return <div>no events yet</div>; + return ( + <div> + <Trans i18nKey="debug.cursor-view.no-events-yet">No events yet</Trans> + </div> + ); } const { type, payload, origin } = event; return ( <CustomScrollbar autoHeightMin="100%" autoHeightMax="100%"> - <h3>Origin: {(origin as any)?.path}</h3> - <span>Type: {type}</span> + {/* eslint-disable-next-line @grafana/i18n/no-untranslated-strings */} + <h3>event.origin: {(origin as any)?.path}</h3> + {/* eslint-disable-next-line @grafana/i18n/no-untranslated-strings */} + <span>event.type: {type}</span> {Boolean(payload) && ( <> <pre>{JSON.stringify(payload.point, null, ' ')}</pre> diff --git a/public/app/plugins/panel/debug/EventBusLogger.tsx b/public/app/plugins/panel/debug/EventBusLogger.tsx index 60db004e48a..472b451215c 100644 --- a/public/app/plugins/panel/debug/EventBusLogger.tsx +++ b/public/app/plugins/panel/debug/EventBusLogger.tsx @@ -67,6 +67,7 @@ export class EventBusLoggerPanel extends PureComponent<Props, State> { return ( <CustomScrollbar autoHeightMin="100%" autoHeightMax="100%"> {this.history.map((v, idx) => ( + // eslint-disable-next-line @grafana/i18n/no-untranslated-strings <div key={v.key}> {JSON.stringify(v.path)} {v.type} / X:{JSON.stringify(v.payload.x)} / Y:{JSON.stringify(v.payload.y)} </div> diff --git a/public/app/plugins/panel/debug/RenderInfoViewer.tsx b/public/app/plugins/panel/debug/RenderInfoViewer.tsx index 663a7dd7c98..f4d8783a0b1 100644 --- a/public/app/plugins/panel/debug/RenderInfoViewer.tsx +++ b/public/app/plugins/panel/debug/RenderInfoViewer.tsx @@ -9,6 +9,8 @@ import { PanelProps, ReducerID, } from '@grafana/data'; +import { Trans } from '@grafana/i18n'; +import { t } from '@grafana/i18n/internal'; import { IconButton } from '@grafana/ui'; import { Options, UpdateConfig } from './panelcfg.gen'; @@ -74,12 +76,43 @@ export class RenderInfoViewer extends Component<Props> { return ( <div> <div> - <IconButton name="step-backward" title="reset counters" onClick={this.resetCounters} tooltip="Step back" /> + <IconButton + name="step-backward" + title={t('debug.render-info-viewer.title-reset-counters', 'Reset counters')} + onClick={this.resetCounters} + tooltip={t('debug.render-info-viewer.tooltip-step-back', 'Step back')} + /> <span> - {showCounters.render && <span>Render: {this.counters.render} </span>} - {showCounters.dataChanged && <span>Data: {this.counters.dataChanged} </span>} - {showCounters.schemaChanged && <span>Schema: {this.counters.schemaChanged} </span>} - <span>TIME: {elapsed}ms</span> + {showCounters.render && ( + <span> + <Trans i18nKey="debug.render-info-viewer.render-counter" values={{ numRenders: this.counters.render }}> + Render: {'{{numRenders}}'}  + </Trans> + </span> + )} + {showCounters.dataChanged && ( + <span> + <Trans + i18nKey="debug.render-info-viewer.data-counter" + values={{ numDataChanges: this.counters.dataChanged }} + > + Data: {'{{numDataChanges}}'}  + </Trans> + </span> + )} + {showCounters.schemaChanged && ( + <span> + <Trans + i18nKey="debug.render-info-viewer.schema-counter" + values={{ numSchemaChanges: this.counters.schemaChanged }} + > + Schema: {'{{numSchemaChanges}}'}  + </Trans> + </span> + )} + <span> + <Trans i18nKey="debug.render-info-viewer.elapsed-time">Time: {{ elapsed }}ms</Trans> + </span> </span> </div> @@ -92,9 +125,15 @@ export class RenderInfoViewer extends Component<Props> { <table className="filter-table"> <thead> <tr> - <td>Field</td> - <td>Type</td> - <td>Last</td> + <td> + <Trans i18nKey="debug.render-info-viewer.field">Field</Trans> + </td> + <td> + <Trans i18nKey="debug.render-info-viewer.type">Type</Trans> + </td> + <td> + <Trans i18nKey="debug.render-info-viewer.last">Last</Trans> + </td> </tr> </thead> <tbody> diff --git a/public/app/plugins/panel/debug/StateView.tsx b/public/app/plugins/panel/debug/StateView.tsx index 1b7309d00fe..e7151a4712f 100644 --- a/public/app/plugins/panel/debug/StateView.tsx +++ b/public/app/plugins/panel/debug/StateView.tsx @@ -1,11 +1,13 @@ import { FormEvent } from 'react'; import { PanelOptionsEditorProps, PanelProps } from '@grafana/data'; +import { Trans, useTranslate } from '@grafana/i18n'; import { Field, Input, usePanelContext } from '@grafana/ui'; import { Options } from './panelcfg.gen'; export function StateView(props: PanelProps<Options>) { + const { t } = useTranslate(); const context = usePanelContext(); const onChangeName = (e: FormEvent<HTMLInputElement>) => { @@ -16,7 +18,7 @@ export function StateView(props: PanelProps<Options>) { return ( <> - <Field label="State name"> + <Field label={t('debug.state-view.label-state-name', 'State name')}> <Input value={context.instanceState?.name ?? ''} onChange={onChangeName} /> </Field> </> @@ -24,5 +26,11 @@ export function StateView(props: PanelProps<Options>) { } export function StateViewEditor({ value, context, onChange, item }: PanelOptionsEditorProps<string>) { - return <div>Current value: {context.instanceState?.name} </div>; + return ( + <div> + <Trans i18nKey="debug.state-view.current-value" values={{ currentValue: context.instanceState?.name }}> + Current value: {'{{currentValue}}'}{' '} + </Trans> + </div> + ); } diff --git a/public/app/plugins/panel/geomap/GeomapPanel.tsx b/public/app/plugins/panel/geomap/GeomapPanel.tsx index 48d0634c436..2b4fc9d021b 100644 --- a/public/app/plugins/panel/geomap/GeomapPanel.tsx +++ b/public/app/plugins/panel/geomap/GeomapPanel.tsx @@ -13,6 +13,7 @@ import * as React from 'react'; import { Subscription } from 'rxjs'; import { DataHoverEvent, PanelData, PanelProps } from '@grafana/data'; +import { t } from '@grafana/i18n/internal'; import { config } from '@grafana/runtime'; import { PanelContext, PanelContextRoot } from '@grafana/ui'; import { appEvents } from 'app/core/app_events'; @@ -33,7 +34,13 @@ import { getActions } from './utils/actions'; import { getLayersExtent } from './utils/getLayersExtent'; import { applyLayerFilter, initLayer } from './utils/layers'; import { pointerClickListener, pointerMoveListener, setTooltipListeners } from './utils/tooltip'; -import { updateMap, getNewOpenLayersMap, notifyPanelEditor, hasVariableDependencies } from './utils/utils'; +import { + updateMap, + getNewOpenLayersMap, + notifyPanelEditor, + hasVariableDependencies, + hasLayerData, +} from './utils/utils'; import { centerPointRegistry, MapCenterID } from './view'; // Allows multiple panels to share the same view instance @@ -203,6 +210,9 @@ export class GeomapPanel extends Component<Props, State> { this.map.setView(view); } } + + // Update legends when data changes + this.setState({ legends: this.getLegends() }); } initMapRef = async (div: HTMLDivElement) => { @@ -387,7 +397,10 @@ export class GeomapPanel extends Component<Props, State> { const legends: ReactNode[] = []; for (const state of this.layers) { if (state.handler.legend) { - legends.push(<div key={state.options.name}>{state.handler.legend}</div>); + const hasData = hasLayerData(state.layer); + if (hasData) { + legends.push(<div key={state.options.name}>{state.handler.legend}</div>); + } } } @@ -411,7 +424,7 @@ export class GeomapPanel extends Component<Props, State> { className={styles.map} // eslint-disable-next-line jsx-a11y/no-noninteractive-tabindex tabIndex={0} // Interactivity is added through the ref - aria-label={`Navigable map`} + aria-label={t('geomap.geomap-panel.aria-label-map', 'Navigable map')} ref={this.initMapRef} ></div> <GeomapOverlay diff --git a/public/app/plugins/panel/geomap/components/DebugOverlay.tsx b/public/app/plugins/panel/geomap/components/DebugOverlay.tsx index 8122f87680e..ae838fef89b 100644 --- a/public/app/plugins/panel/geomap/components/DebugOverlay.tsx +++ b/public/app/plugins/panel/geomap/components/DebugOverlay.tsx @@ -7,6 +7,7 @@ import tinycolor from 'tinycolor2'; import { GrafanaTheme2 } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors/src'; +import { Trans } from '@grafana/i18n'; import { config } from 'app/core/config'; interface Props { @@ -47,11 +48,15 @@ export class DebugOverlay extends PureComponent<Props, State> { <table> <tbody> <tr> - <th>Zoom:</th> + <th> + <Trans i18nKey="geomap.debug-overlay.zoom">Zoom:</Trans> + </th> <td>{zoom?.toFixed(1)}</td> </tr> <tr> - <th>Center: </th> + <th> + <Trans i18nKey="geomap.debug-overlay.center">Center:</Trans>  + </th> <td> {center[0].toFixed(5)}, {center[1].toFixed(5)} </td> diff --git a/public/app/plugins/panel/geomap/components/MarkersLegend.tsx b/public/app/plugins/panel/geomap/components/MarkersLegend.tsx index 34eda649940..df4e83cc800 100644 --- a/public/app/plugins/panel/geomap/components/MarkersLegend.tsx +++ b/public/app/plugins/panel/geomap/components/MarkersLegend.tsx @@ -11,6 +11,7 @@ import { getFieldColorModeForField, GrafanaTheme2, } from '@grafana/data'; +import { useTranslate } from '@grafana/i18n'; import { useStyles2, VizLegendItem } from '@grafana/ui'; import { ColorScale } from 'app/core/components/ColorScale/ColorScale'; import { SanitizedSVG } from 'app/core/components/SVG/SanitizedSVG'; @@ -29,6 +30,7 @@ export interface MarkersLegendProps { } export function MarkersLegend(props: MarkersLegendProps) { + const { t } = useTranslate(); const { layerName, styleConfig, layer } = props; const style = useStyles2(getStyles); @@ -66,7 +68,7 @@ export function MarkersLegend(props: MarkersLegendProps) { <SanitizedSVG src={`public/${symbol}`} className={style.legendSymbol} - title={'Symbol'} + title={t('geomap.markers-legend.title-symbol', 'Symbol')} style={{ fill: color, opacity: opacity }} /> </div> diff --git a/public/app/plugins/panel/geomap/components/MeasureOverlay.tsx b/public/app/plugins/panel/geomap/components/MeasureOverlay.tsx index 2502a4786ef..0d775fdbf42 100644 --- a/public/app/plugins/panel/geomap/components/MeasureOverlay.tsx +++ b/public/app/plugins/panel/geomap/components/MeasureOverlay.tsx @@ -3,6 +3,8 @@ import Map from 'ol/Map'; import { useMemo, useRef, useState } from 'react'; import { GrafanaTheme2, SelectableValue } from '@grafana/data'; +import { selectors } from '@grafana/e2e-selectors'; +import { useTranslate } from '@grafana/i18n'; import { Button, IconButton, RadioButtonGroup, Select } from '@grafana/ui'; import { config } from 'app/core/config'; @@ -16,6 +18,7 @@ type Props = { }; export const MeasureOverlay = ({ map, menuActiveState }: Props) => { + const { t } = useTranslate(); const vector = useRef(new MeasureVectorLayer()); const measureStyle = getStyles(config.theme2); @@ -99,8 +102,9 @@ export const MeasureOverlay = ({ map, menuActiveState }: Props) => { ) : ( <IconButton className={measureStyle.icon} + data-testid={selectors.components.PanelEditor.measureButton} name="ruler-combined" - tooltip="show measure tools" + tooltip={t('geomap.measure-overlay.tooltip-show-measure-tools', 'Show measure tools')} tooltipPlacement="left" onClick={toggleMenu} /> diff --git a/public/app/plugins/panel/geomap/editor/CoordinatesMapViewEditor.tsx b/public/app/plugins/panel/geomap/editor/CoordinatesMapViewEditor.tsx index 0774d472a9f..d62a3e6ea0e 100644 --- a/public/app/plugins/panel/geomap/editor/CoordinatesMapViewEditor.tsx +++ b/public/app/plugins/panel/geomap/editor/CoordinatesMapViewEditor.tsx @@ -1,3 +1,4 @@ +import { useTranslate } from '@grafana/i18n'; import { InlineFieldRow, InlineField } from '@grafana/ui'; import { NumberInput } from 'app/core/components/OptionsUI/NumberInput'; @@ -10,6 +11,7 @@ type Props = { }; export const CoordinatesMapViewEditor = ({ labelWidth, value, onChange }: Props) => { + const { t } = useTranslate(); const onLatitudeChange = (latitude: number | undefined) => { onChange({ ...value, lat: latitude }); }; @@ -21,12 +23,20 @@ export const CoordinatesMapViewEditor = ({ labelWidth, value, onChange }: Props) return ( <> <InlineFieldRow> - <InlineField label="Latitude" labelWidth={labelWidth} grow={true}> + <InlineField + label={t('geomap.coordinates-map-view-editor.label-latitude', 'Latitude')} + labelWidth={labelWidth} + grow={true} + > <NumberInput value={value.lat} min={-90} max={90} step={0.001} onChange={onLatitudeChange} /> </InlineField> </InlineFieldRow> <InlineFieldRow> - <InlineField label="Longitude" labelWidth={labelWidth} grow={true}> + <InlineField + label={t('geomap.coordinates-map-view-editor.label-longitude', 'Longitude')} + labelWidth={labelWidth} + grow={true} + > <NumberInput value={value.lon} min={-180} max={180} step={0.001} onChange={onLongitudeChange} /> </InlineField> </InlineFieldRow> diff --git a/public/app/plugins/panel/geomap/editor/FitMapViewEditor.tsx b/public/app/plugins/panel/geomap/editor/FitMapViewEditor.tsx index d0a05b262af..355ba2dcf79 100644 --- a/public/app/plugins/panel/geomap/editor/FitMapViewEditor.tsx +++ b/public/app/plugins/panel/geomap/editor/FitMapViewEditor.tsx @@ -1,6 +1,7 @@ import { useCallback, useMemo } from 'react'; import { SelectableValue, StandardEditorContext } from '@grafana/data'; +import { useTranslate } from '@grafana/i18n'; import { InlineFieldRow, InlineField, RadioButtonGroup, Select } from '@grafana/ui'; import { NumberInput } from 'app/core/components/OptionsUI/NumberInput'; @@ -33,6 +34,7 @@ const DataScopeOptions: Array<SelectableValue<DataScopeValues>> = ScopeOptions.m })); export const FitMapViewEditor = ({ labelWidth, value, onChange, context }: Props) => { + const { t } = useTranslate(); const layers = useMemo(() => { if (context.options?.layers) { return context.options.layers.map((layer) => ({ @@ -53,7 +55,11 @@ export const FitMapViewEditor = ({ labelWidth, value, onChange, context }: Props const allLayersEditorFragment = ( <InlineFieldRow> - <InlineField label="Layer" labelWidth={labelWidth} grow={true}> + <InlineField + label={t('geomap.fit-map-view-editor.all-layers-editor-fragment.label-layer', 'Layer')} + labelWidth={labelWidth} + grow={true} + > <Select options={layers} onChange={onSelectLayer} placeholder={layers[0]?.label} value={value.layer} /> </InlineField> </InlineFieldRow> @@ -66,10 +72,13 @@ export const FitMapViewEditor = ({ labelWidth, value, onChange, context }: Props const lastOnlyEditorFragment = ( <InlineFieldRow> <InlineField - label="Padding" + label={t('geomap.fit-map-view-editor.last-only-editor-fragment.label-padding', 'Padding')} labelWidth={labelWidth} grow={true} - tooltip="sets padding in relative percent beyond data extent" + tooltip={t( + 'geomap.fit-map-view-editor.last-only-editor-fragment.tooltip-padding-relative-percent-beyond-extent', + 'Sets padding in relative percent beyond data extent' + )} > <NumberInput value={value?.padding ?? 5} min={0} step={1} onChange={onChangePadding} /> </InlineField> @@ -102,7 +111,7 @@ export const FitMapViewEditor = ({ labelWidth, value, onChange, context }: Props return ( <> <InlineFieldRow> - <InlineField label="Data" labelWidth={labelWidth} grow={true}> + <InlineField label={t('geomap.fit-map-view-editor.label-data', 'Data')} labelWidth={labelWidth} grow={true}> <RadioButtonGroup value={currentDataScope} options={DataScopeOptions} diff --git a/public/app/plugins/panel/geomap/editor/FrameSelectionEditor.tsx b/public/app/plugins/panel/geomap/editor/FrameSelectionEditor.tsx index 510a21b7384..ac6647eaa0f 100644 --- a/public/app/plugins/panel/geomap/editor/FrameSelectionEditor.tsx +++ b/public/app/plugins/panel/geomap/editor/FrameSelectionEditor.tsx @@ -1,11 +1,13 @@ import { useCallback } from 'react'; import { FrameMatcherID, MatcherConfig, StandardEditorProps } from '@grafana/data'; +import { useTranslate } from '@grafana/i18n'; import { RefIDMultiPicker, RefIDPicker, stringsToRegexp } from '@grafana/ui/internal'; type Props = StandardEditorProps<MatcherConfig>; export const FrameSelectionEditor = ({ value, context, onChange }: Props) => { + const { t } = useTranslate(); const onFilterChange = useCallback( (v: string) => { onChange( @@ -21,13 +23,19 @@ export const FrameSelectionEditor = ({ value, context, onChange }: Props) => { ); return ( - <RefIDPicker value={value?.options} onChange={onFilterChange} data={context.data} placeholder="Change filter" /> + <RefIDPicker + value={value?.options} + onChange={onFilterChange} + data={context.data} + placeholder={t('geomap.frame-selection-editor.placeholder-change-filter', 'Change filter')} + /> ); }; type FrameMultiSelectionEditorProps = Omit<StandardEditorProps<MatcherConfig>, 'item'>; export const FrameMultiSelectionEditor = ({ value, context, onChange }: FrameMultiSelectionEditorProps) => { + const { t } = useTranslate(); const onFilterChange = useCallback( (v: string[]) => { onChange( @@ -47,7 +55,7 @@ export const FrameMultiSelectionEditor = ({ value, context, onChange }: FrameMul value={value?.options} onChange={onFilterChange} data={context.data} - placeholder="Change filter" + placeholder={t('geomap.frame-multi-selection-editor.placeholder-change-filter', 'Change filter')} /> ); }; diff --git a/public/app/plugins/panel/geomap/editor/GeomapStyleRulesEditor.tsx b/public/app/plugins/panel/geomap/editor/GeomapStyleRulesEditor.tsx index 336077d8b47..c14d78d3314 100644 --- a/public/app/plugins/panel/geomap/editor/GeomapStyleRulesEditor.tsx +++ b/public/app/plugins/panel/geomap/editor/GeomapStyleRulesEditor.tsx @@ -1,6 +1,7 @@ import { useCallback } from 'react'; import { StandardEditorProps, StandardEditorsRegistryItem } from '@grafana/data'; +import { useTranslate } from '@grafana/i18n'; import { Button, useTheme2 } from '@grafana/ui'; import { DEFAULT_STYLE_RULE } from '../layers/data/geojsonLayer'; @@ -12,6 +13,7 @@ import { StyleRuleEditor, StyleRuleEditorSettings } from './StyleRuleEditor'; type Props = StandardEditorProps<FeatureStyleConfig[], StyleRuleEditorSettings, unknown>; export const GeomapStyleRulesEditor = ({ value, onChange, context, item }: Props) => { + const { t } = useTranslate(); const theme = useTheme2(); const settings = item.settings; @@ -61,7 +63,13 @@ export const GeomapStyleRulesEditor = ({ value, onChange, context, item }: Props return ( <> {styleOptions} - <Button size="sm" icon="plus" onClick={onAddRule} variant="secondary" aria-label={'Add geomap style rule'}> + <Button + size="sm" + icon="plus" + onClick={onAddRule} + variant="secondary" + aria-label={t('geomap.geomap-style-rules-editor.aria-label-add-geomap-style-rule', 'Add geomap style rule')} + > {'Add style rule'} </Button> </> diff --git a/public/app/plugins/panel/geomap/editor/LayersEditor.tsx b/public/app/plugins/panel/geomap/editor/LayersEditor.tsx index 73dc8451391..b6b7a33794b 100644 --- a/public/app/plugins/panel/geomap/editor/LayersEditor.tsx +++ b/public/app/plugins/panel/geomap/editor/LayersEditor.tsx @@ -1,6 +1,7 @@ import { DropResult } from '@hello-pangea/dnd'; import { StandardEditorProps } from '@grafana/data'; +import { Trans, useTranslate } from '@grafana/i18n'; import { Container } from '@grafana/ui'; import { AddLayerButton } from 'app/core/components/Layers/AddLayerButton'; import { LayerDragDropList } from 'app/core/components/Layers/LayerDragDropList'; @@ -11,9 +12,14 @@ import { Options, MapLayerState, GeomapInstanceState } from '../types'; type LayersEditorProps = StandardEditorProps<unknown, unknown, Options, GeomapInstanceState>; export const LayersEditor = (props: LayersEditorProps) => { + const { t } = useTranslate(); const { layers, selected, actions } = props.context.instanceState ?? {}; if (!layers || !actions) { - return <div>No layers?</div>; + return ( + <div> + <Trans i18nKey="geomap.layers-editor.no-layers">No layers?</Trans> + </div> + ); } const onDragEnd = (result: DropResult) => { @@ -58,7 +64,7 @@ export const LayersEditor = (props: LayersEditorProps) => { <AddLayerButton onChange={(v) => actions.addlayer(v.value!)} options={getLayersOptions(false).options} - label={'Add layer'} + label={t('geomap.layers-editor.label-add-layer', 'Add layer')} /> </Container> <br /> diff --git a/public/app/plugins/panel/geomap/editor/MapViewEditor.tsx b/public/app/plugins/panel/geomap/editor/MapViewEditor.tsx index 52d5140c304..6a6c49fb74a 100644 --- a/public/app/plugins/panel/geomap/editor/MapViewEditor.tsx +++ b/public/app/plugins/panel/geomap/editor/MapViewEditor.tsx @@ -2,6 +2,7 @@ import { toLonLat } from 'ol/proj'; import { useMemo, useCallback } from 'react'; import { StandardEditorProps, SelectableValue } from '@grafana/data'; +import { useTranslate, Trans } from '@grafana/i18n'; import { Button, InlineField, InlineFieldRow, Select, VerticalGroup } from '@grafana/ui'; import { NumberInput } from 'app/core/components/OptionsUI/NumberInput'; @@ -16,6 +17,7 @@ export const MapViewEditor = ({ onChange, context, }: StandardEditorProps<MapViewConfig, unknown, Options, GeomapInstanceState>) => { + const { t } = useTranslate(); const labelWidth = 10; const views = useMemo(() => { @@ -65,7 +67,7 @@ export const MapViewEditor = ({ return ( <> <InlineFieldRow> - <InlineField label="View" labelWidth={labelWidth} grow={true}> + <InlineField label={t('geomap.map-view-editor.label-view', 'View')} labelWidth={labelWidth} grow={true}> <Select options={views.options} value={views.current} onChange={onSelectView} /> </InlineField> </InlineFieldRow> @@ -77,7 +79,15 @@ export const MapViewEditor = ({ )} <InlineFieldRow> - <InlineField label={value?.id === MapCenterID.Fit ? 'Max Zoom' : 'Zoom'} labelWidth={labelWidth} grow={true}> + <InlineField + label={ + value?.id === MapCenterID.Fit + ? t('geomap.map-view-editor.label-max-zoom', 'Max Zoom') + : t('geomap.map-view-editor.label-zoom', 'Zoom') + } + labelWidth={labelWidth} + grow={true} + > <NumberInput value={value?.zoom ?? 1} min={1} @@ -92,7 +102,9 @@ export const MapViewEditor = ({ <VerticalGroup> <Button variant="secondary" size="sm" fullWidth onClick={onSetCurrentView}> - <span>Use current map settings</span> + <span> + <Trans i18nKey="geomap.map-view-editor.use-current-map-settings">Use current map settings</Trans> + </span> </Button> </VerticalGroup> </> diff --git a/public/app/plugins/panel/geomap/editor/StyleEditor.tsx b/public/app/plugins/panel/geomap/editor/StyleEditor.tsx index 5ac29dfe977..0e0042b256d 100644 --- a/public/app/plugins/panel/geomap/editor/StyleEditor.tsx +++ b/public/app/plugins/panel/geomap/editor/StyleEditor.tsx @@ -4,6 +4,7 @@ import { useObservable } from 'react-use'; import { Observable, of } from 'rxjs'; import { FieldConfigPropertyItem, StandardEditorProps, StandardEditorsRegistryItem, FrameMatcher } from '@grafana/data'; +import { useTranslate } from '@grafana/i18n'; import { ScaleDimensionConfig, ResourceDimensionConfig, @@ -54,6 +55,7 @@ export interface StyleEditorOptions { type Props = StandardEditorProps<StyleConfig, StyleEditorOptions>; export const StyleEditor = (props: Props) => { + const { t } = useTranslate(); const { value, onChange, item } = props; const context = useMemo(() => { if (!item.settings?.frameMatcher) { @@ -129,7 +131,7 @@ export const StyleEditor = (props: Props) => { {featuresHavePoints && ( <> <InlineFieldRow> - <InlineField label={'Symbol'}> + <InlineField label={t('geomap.style-editor.label-symbol', 'Symbol')}> <ResourceDimensionEditor value={value?.symbol ?? defaultStyleConfig.symbol} context={context} @@ -149,7 +151,7 @@ export const StyleEditor = (props: Props) => { /> </InlineField> </InlineFieldRow> - <Field label={'Rotation angle'}> + <Field label={t('geomap.style-editor.label-rotation-angle', 'Rotation angle')}> <ScalarDimensionEditor value={value?.rotation ?? defaultStyleConfig.rotation} context={context} @@ -167,7 +169,7 @@ export const StyleEditor = (props: Props) => { </> )} <InlineFieldRow> - <InlineField label="Color" labelWidth={10}> + <InlineField label={t('geomap.style-editor.label-color', 'Color')} labelWidth={10}> <InlineLabel width={4}> <ColorPicker color={value?.color?.fixed ?? defaultStyleConfig.color.fixed} @@ -179,7 +181,7 @@ export const StyleEditor = (props: Props) => { </InlineField> </InlineFieldRow> <InlineFieldRow> - <InlineField label="Opacity" labelWidth={10} grow> + <InlineField label={t('geomap.style-editor.label-opacity', 'Opacity')} labelWidth={10} grow> <SliderValueEditor value={value?.opacity ?? defaultStyleConfig.opacity} context={context} @@ -202,7 +204,7 @@ export const StyleEditor = (props: Props) => { return ( <> - <Field label={'Size'}> + <Field label={t('geomap.style-editor.label-size', 'Size')}> <ScaleDimensionEditor value={value?.size ?? defaultStyleConfig.size} context={context} @@ -219,7 +221,7 @@ export const StyleEditor = (props: Props) => { </Field> {!settings?.hideSymbol && ( <> - <Field label={'Symbol'}> + <Field label={t('geomap.style-editor.label-symbol', 'Symbol')}> <ResourceDimensionEditor value={value?.symbol ?? defaultStyleConfig.symbol} context={context} @@ -238,7 +240,7 @@ export const StyleEditor = (props: Props) => { } /> </Field> - <Field label={'Symbol Vertical Align'}> + <Field label={t('geomap.style-editor.label-symbol-vertical-align', 'Symbol vertical align')}> <RadioButtonGroup value={value?.symbolAlign?.vertical ?? defaultStyleConfig.symbolAlign.vertical} onChange={onAlignVerticalChange} @@ -249,7 +251,7 @@ export const StyleEditor = (props: Props) => { ]} /> </Field> - <Field label={'Symbol Horizontal Align'}> + <Field label={t('geomap.style-editor.label-symbol-horizontal-align', 'Symbol horizontal align')}> <RadioButtonGroup value={value?.symbolAlign?.horizontal ?? defaultStyleConfig.symbolAlign.horizontal} onChange={onAlignHorizontalChange} @@ -262,7 +264,7 @@ export const StyleEditor = (props: Props) => { </Field> </> )} - <Field label={'Color'}> + <Field label={t('geomap.style-editor.label-color', 'Color')}> <ColorDimensionEditor value={value?.color ?? defaultStyleConfig.color} context={context} @@ -270,7 +272,7 @@ export const StyleEditor = (props: Props) => { item={{} as StandardEditorsRegistryItem} /> </Field> - <Field label={'Fill opacity'}> + <Field label={t('geomap.style-editor.label-fill-opacity', 'Fill opacity')}> <SliderValueEditor value={value?.opacity ?? defaultStyleConfig.opacity} context={context} @@ -287,7 +289,7 @@ export const StyleEditor = (props: Props) => { /> </Field> {settings?.displayRotation && ( - <Field label={'Rotation angle'}> + <Field label={t('geomap.style-editor.label-rotation-angle', 'Rotation angle')}> <ScalarDimensionEditor value={value?.rotation ?? defaultStyleConfig.rotation} context={context} @@ -303,7 +305,7 @@ export const StyleEditor = (props: Props) => { /> </Field> )} - <Field label={'Text label'}> + <Field label={t('geomap.style-editor.label-text-label', 'Text label')}> <TextDimensionEditor value={value?.text ?? defaultTextConfig} context={context} @@ -315,7 +317,7 @@ export const StyleEditor = (props: Props) => { {hasTextLabel && ( <> <HorizontalGroup> - <Field label={'Font size'}> + <Field label={t('geomap.style-editor.label-font-size', 'Font size')}> <NumberValueEditor value={value?.textConfig?.fontSize ?? defaultStyleConfig.textConfig.fontSize} context={context} @@ -323,7 +325,7 @@ export const StyleEditor = (props: Props) => { item={{} as FieldConfigPropertyItem} /> </Field> - <Field label={'X offset'}> + <Field label={t('geomap.style-editor.label-x-offset', 'X offset')}> <NumberValueEditor value={value?.textConfig?.offsetX ?? defaultStyleConfig.textConfig.offsetX} context={context} @@ -331,7 +333,7 @@ export const StyleEditor = (props: Props) => { item={{} as FieldConfigPropertyItem} /> </Field> - <Field label={'Y offset'}> + <Field label={t('geomap.style-editor.label-y-offset', 'Y offset')}> <NumberValueEditor value={value?.textConfig?.offsetY ?? defaultStyleConfig.textConfig.offsetY} context={context} @@ -340,7 +342,7 @@ export const StyleEditor = (props: Props) => { /> </Field> </HorizontalGroup> - <Field label={'Align'}> + <Field label={t('geomap.style-editor.label-align', 'Align')}> <RadioButtonGroup value={value?.textConfig?.textAlign ?? defaultStyleConfig.textConfig.textAlign} onChange={onTextAlignChange} @@ -351,7 +353,7 @@ export const StyleEditor = (props: Props) => { ]} /> </Field> - <Field label={'Baseline'}> + <Field label={t('geomap.style-editor.label-baseline', 'Baseline')}> <RadioButtonGroup value={value?.textConfig?.textBaseline ?? defaultStyleConfig.textConfig.textBaseline} onChange={onTextBaselineChange} diff --git a/public/app/plugins/panel/geomap/editor/StyleRuleEditor.tsx b/public/app/plugins/panel/geomap/editor/StyleRuleEditor.tsx index 97d7ebbdc38..9322b30a1ef 100644 --- a/public/app/plugins/panel/geomap/editor/StyleRuleEditor.tsx +++ b/public/app/plugins/panel/geomap/editor/StyleRuleEditor.tsx @@ -5,6 +5,7 @@ import { useObservable } from 'react-use'; import { Observable } from 'rxjs'; import { GrafanaTheme2, SelectableValue, StandardEditorProps, StandardEditorsRegistryItem } from '@grafana/data'; +import { useTranslate } from '@grafana/i18n'; import { ComparisonOperation } from '@grafana/schema'; import { Button, InlineField, InlineFieldRow, Select, useStyles2 } from '@grafana/ui'; import { comparisonOperationOptions } from '@grafana/ui/internal'; @@ -26,6 +27,7 @@ export interface StyleRuleEditorSettings { type Props = StandardEditorProps<FeatureStyleConfig, StyleRuleEditorSettings, unknown>; export const StyleRuleEditor = ({ value, onChange, item, context }: Props) => { + const { t } = useTranslate(); const settings = item.settings; if (!settings) { // Shouldn't be possible to hit this block, but just in case @@ -132,13 +134,13 @@ export const StyleRuleEditor = ({ value, onChange, item, context }: Props) => { return ( <div className={styles.rule}> <InlineFieldRow className={styles.row}> - <InlineField label="Rule" labelWidth={LABEL_WIDTH} grow={true}> + <InlineField label={t('geomap.style-rule-editor.label-rule', 'Rule')} labelWidth={LABEL_WIDTH} grow={true}> <Select - placeholder={'Feature property'} + placeholder={t('geomap.style-rule-editor.placeholder-feature-property', 'Feature property')} value={propv.current} options={propv.options} onChange={onChangeProperty} - aria-label={'Feature property'} + aria-label={t('geomap.style-rule-editor.aria-label-feature-property', 'Feature property')} isClearable allowCustomValue /> @@ -148,7 +150,7 @@ export const StyleRuleEditor = ({ value, onChange, item, context }: Props) => { value={comparisonOperationOptions.find((v) => v.value === check.operation)} options={comparisonOperationOptions} onChange={onChangeComparison} - aria-label={'Comparison operator'} + aria-label={t('geomap.style-rule-editor.aria-label-comparison-operator', 'Comparison operator')} width={8} /> </InlineField> @@ -156,11 +158,11 @@ export const StyleRuleEditor = ({ value, onChange, item, context }: Props) => { <div className={styles.flexRow}> {(check.operation === ComparisonOperation.EQ || check.operation === ComparisonOperation.NEQ) && ( <Select - placeholder={'value'} + placeholder={t('geomap.style-rule-editor.placeholder-value', 'value')} value={valuev.current} options={valuev.options} onChange={onChangeValue} - aria-label={'Comparison value'} + aria-label={t('geomap.style-rule-editor.aria-label-comparison-value', 'Comparison value')} isClearable allowCustomValue /> @@ -169,7 +171,7 @@ export const StyleRuleEditor = ({ value, onChange, item, context }: Props) => { <NumberInput key={`${check.property}/${check.operation}`} value={!isNaN(Number(check.value)) ? Number(check.value) : 0} - placeholder="numeric value" + placeholder={t('geomap.style-rule-editor.placeholder-numeric-value', 'Numeric value')} onChange={onChangeNumericValue} /> )} @@ -180,7 +182,7 @@ export const StyleRuleEditor = ({ value, onChange, item, context }: Props) => { icon="trash-alt" onClick={() => onDelete()} variant="secondary" - aria-label={'Delete style rule'} + aria-label={t('geomap.style-rule-editor.aria-label-delete-style-rule', 'Delete style rule')} className={styles.button} ></Button> </InlineFieldRow> diff --git a/public/app/plugins/panel/geomap/layers/basemaps/carto.ts b/public/app/plugins/panel/geomap/layers/basemaps/carto.ts index 1d1082e141f..45f65b2b267 100644 --- a/public/app/plugins/panel/geomap/layers/basemaps/carto.ts +++ b/public/app/plugins/panel/geomap/layers/basemaps/carto.ts @@ -45,10 +45,11 @@ export const carto: MapLayerRegistryItem<CartoConfig> = { } else { style += '_nolabels'; } + const scale = window.devicePixelRatio > 1 ? '@2x' : ''; return new TileLayer({ source: new XYZ({ attributions: `<a href="https://carto.com/attribution/">©CARTO</a> <a href="https://www.openstreetmap.org/copyright">©OpenStreetMap</a> contributors`, - url: `https://{1-4}.basemaps.cartocdn.com/${style}/{z}/{x}/{y}.png`, + url: `https://{1-4}.basemaps.cartocdn.com/${style}/{z}/{x}/{y}${scale}.png`, }), }); }, diff --git a/public/app/plugins/panel/geomap/module.tsx b/public/app/plugins/panel/geomap/module.tsx index 993fda575ba..b5376ea7acf 100644 --- a/public/app/plugins/panel/geomap/module.tsx +++ b/public/app/plugins/panel/geomap/module.tsx @@ -1,4 +1,5 @@ import { PanelPlugin } from '@grafana/data'; +import { Trans } from '@grafana/i18n'; import { config } from '@grafana/runtime'; import { commonOptionsBuilder } from '@grafana/ui'; @@ -72,7 +73,13 @@ export const plugin = new PanelPlugin<Options>(GeomapPanel) path: '', name: '', // eslint-disable-next-line react/display-name - editor: () => <div>The basemap layer is configured by the server admin.</div>, + editor: () => ( + <div> + <Trans i18nKey="geomap.plugin.basemap-layer-configured-server-admin"> + The basemap layer is configured by the server admin. + </Trans> + </div> + ), }); } else if (baselayer) { builder.addNestedOptions( diff --git a/public/app/plugins/panel/geomap/utils/utils.test.ts b/public/app/plugins/panel/geomap/utils/utils.test.ts index 658cc4c0ed3..d338233d63c 100644 --- a/public/app/plugins/panel/geomap/utils/utils.test.ts +++ b/public/app/plugins/panel/geomap/utils/utils.test.ts @@ -1,14 +1,17 @@ +import Feature from 'ol/Feature'; +import Point from 'ol/geom/Point'; +import LayerGroup from 'ol/layer/Group'; +import TileLayer from 'ol/layer/Tile'; +import VectorLayer from 'ol/layer/Vector'; +import WebGLPointsLayer from 'ol/layer/WebGLPoints'; +import TileSource from 'ol/source/Tile'; +import VectorSource from 'ol/source/Vector'; + import { getTemplateSrv } from '@grafana/runtime'; // Mock the config module to avoid undefined panels error -jest.mock('app/core/config', () => ({ - config: { - panels: { - debug: { - state: 'alpha', - }, - }, - }, +jest.mock('@grafana/runtime', () => ({ + getTemplateSrv: jest.fn(), })); // Mock the dimensions module since it's imported by utils.ts @@ -24,12 +27,27 @@ jest.mock('app/plugins/datasource/grafana/datasource', () => ({ getGrafanaDatasource: jest.fn(), })); -// Mock the template service -jest.mock('@grafana/runtime', () => ({ - getTemplateSrv: jest.fn(), -})); +import { hasVariableDependencies, hasLayerData } from './utils'; -import { hasVariableDependencies } from './utils'; +// Test fixtures +const createTestFeature = () => new Feature(new Point([0, 0])); + +const createTestVectorSource = (hasFeature = false): VectorSource<Point> => { + const source = new VectorSource<Point>(); + if (hasFeature) { + source.addFeature(createTestFeature()); + } + return source; +}; + +const createTestWebGLStyle = () => ({ + symbol: { + symbolType: 'circle', + size: 8, + color: '#000000', + opacity: 1, + }, +}); describe('hasVariableDependencies', () => { beforeEach(() => { @@ -40,7 +58,6 @@ describe('hasVariableDependencies', () => { const availableVariables = [{ name: 'variable' }]; const mockTemplateSrv = { containsTemplate: jest.fn().mockImplementation((str) => { - // Check if any of the available variables are in the string return availableVariables.some((v) => str.includes(`$${v.name}`)); }), getVariables: jest.fn().mockReturnValue(availableVariables), @@ -99,3 +116,75 @@ describe('hasVariableDependencies', () => { expect(mockTemplateSrv.containsTemplate).toHaveBeenCalledWith(JSON.stringify(obj)); }); }); + +describe('hasLayerData', () => { + it('should return false for empty vector layer', () => { + const layer = new VectorLayer({ + source: createTestVectorSource(), + }); + expect(hasLayerData(layer)).toBe(false); + }); + + it('should return true for vector layer with features', () => { + const layer = new VectorLayer({ + source: createTestVectorSource(true), + }); + expect(hasLayerData(layer)).toBe(true); + }); + + it('should return true for layer group with data', () => { + const vectorLayer = new VectorLayer({ + source: createTestVectorSource(true), + }); + const group = new LayerGroup({ + layers: [vectorLayer], + }); + expect(hasLayerData(group)).toBe(true); + }); + + it('should return false for empty layer group', () => { + const group = new LayerGroup({ + layers: [], + }); + expect(hasLayerData(group)).toBe(false); + }); + + it('should return true for tile layer with source', () => { + const layer = new TileLayer({ + source: new TileSource({}), + }); + expect(hasLayerData(layer)).toBe(true); + }); + + it('should return false for tile layer without source', () => { + const layer = new TileLayer({}); + expect(hasLayerData(layer)).toBe(false); + }); + + it('should return true for WebGLPointsLayer with features', () => { + const layer = new WebGLPointsLayer({ + source: createTestVectorSource(true), + style: createTestWebGLStyle(), + }); + expect(hasLayerData(layer)).toBe(true); + }); + + it('should return false for empty WebGLPointsLayer', () => { + const layer = new WebGLPointsLayer({ + source: createTestVectorSource(), + style: createTestWebGLStyle(), + }); + expect(hasLayerData(layer)).toBe(false); + }); + + it('should return true for layer group with WebGLPointsLayer containing data', () => { + const webglLayer = new WebGLPointsLayer({ + source: createTestVectorSource(true), + style: createTestWebGLStyle(), + }); + const group = new LayerGroup({ + layers: [webglLayer], + }); + expect(hasLayerData(group)).toBe(true); + }); +}); diff --git a/public/app/plugins/panel/geomap/utils/utils.ts b/public/app/plugins/panel/geomap/utils/utils.ts index 4405c317e17..23426d54db4 100644 --- a/public/app/plugins/panel/geomap/utils/utils.ts +++ b/public/app/plugins/panel/geomap/utils/utils.ts @@ -1,5 +1,17 @@ import { Map as OpenLayersMap } from 'ol'; +import Geometry from 'ol/geom/Geometry'; +import Point from 'ol/geom/Point'; import { defaults as interactionDefaults } from 'ol/interaction'; +import BaseLayer from 'ol/layer/Base'; +import LayerGroup from 'ol/layer/Group'; +import ImageLayer from 'ol/layer/Image'; +import TileLayer from 'ol/layer/Tile'; +import VectorLayer from 'ol/layer/Vector'; +import VectorImage from 'ol/layer/VectorImage'; +import WebGLPointsLayer from 'ol/layer/WebGLPoints'; +import ImageSource from 'ol/source/Image'; +import TileSource from 'ol/source/Tile'; +import VectorSource from 'ol/source/Vector'; import { DataFrame, GrafanaTheme2, SelectableValue } from '@grafana/data'; import { getTemplateSrv } from '@grafana/runtime'; @@ -87,7 +99,7 @@ export const getNewOpenLayersMap = (panel: GeomapPanel, options: Options, div: H const view = panel.initMapView(options.view); return (panel.map = new OpenLayersMap({ view: view, - pixelRatio: 1, // or zoom? + pixelRatio: window.devicePixelRatio, // or zoom? layers: [], // loaded explicitly below controls: [], target: div, @@ -153,3 +165,39 @@ export const isUrl = (url: string) => { return false; } }; + +/** + * Checks if a layer has data to display + * @param layer The OpenLayers layer to check + * @returns boolean indicating if the layer has data + */ +export function hasLayerData( + layer: + | LayerGroup + | VectorLayer<VectorSource<Geometry>> + | VectorImage<VectorSource<Geometry>> + | WebGLPointsLayer<VectorSource<Point>> + | TileLayer<TileSource> + | ImageLayer<ImageSource> + | BaseLayer +): boolean { + if (layer instanceof LayerGroup) { + return layer + .getLayers() + .getArray() + .some((subLayer) => hasLayerData(subLayer)); + } + if (layer instanceof VectorLayer || layer instanceof VectorImage) { + const source = layer.getSource(); + return source != null && source.getFeatures().length > 0; + } + if (layer instanceof WebGLPointsLayer) { + const source = layer.getSource(); + return source != null && source.getFeatures().length > 0; + } + if (layer instanceof TileLayer || layer instanceof ImageLayer) { + // For tile/image layers, check if they have a source + return Boolean(layer.getSource()); + } + return false; +} diff --git a/public/app/plugins/panel/gettingstarted/GettingStarted.tsx b/public/app/plugins/panel/gettingstarted/GettingStarted.tsx index 33c27cc9e77..6a5a4f0d20b 100644 --- a/public/app/plugins/panel/gettingstarted/GettingStarted.tsx +++ b/public/app/plugins/panel/gettingstarted/GettingStarted.tsx @@ -3,6 +3,8 @@ import { css, cx } from '@emotion/css'; import { PureComponent } from 'react'; import { PanelProps } from '@grafana/data'; +import { Trans } from '@grafana/i18n'; +import { t } from '@grafana/i18n/internal'; import { config, reportInteraction } from '@grafana/runtime'; import { Button, Spinner, stylesFactory } from '@grafana/ui'; import { contextSrv } from 'app/core/core'; @@ -89,19 +91,23 @@ export class GettingStarted extends PureComponent<PanelProps, State> { <div className={styles.container}> {!checksDone ? ( <div className={styles.loading}> - <div className={styles.loadingText}>Checking completed setup steps</div> + <div className={styles.loadingText}> + <Trans i18nKey="gettingstarted.getting-started.checking-completed-setup-steps"> + Checking completed setup steps + </Trans> + </div> <Spinner size="xl" inline /> </div> ) : ( <> <Button variant="secondary" fill="text" className={styles.dismiss} onClick={this.dismiss}> - Remove this panel + <Trans i18nKey="gettingstarted.getting-started.remove-this-panel">Remove this panel</Trans> </Button> {currentStep === steps.length - 1 && ( <Button className={cx(styles.backForwardButtons, styles.previous)} onClick={this.onPreviousClick} - aria-label="To basic tutorials" + aria-label={t('gettingstarted.getting-started.aria-label-to-basic-tutorials', 'To basic tutorials')} icon="angle-left" variant="secondary" /> @@ -113,7 +119,10 @@ export class GettingStarted extends PureComponent<PanelProps, State> { <Button className={cx(styles.backForwardButtons, styles.forward)} onClick={this.onForwardClick} - aria-label="To advanced tutorials" + aria-label={t( + 'gettingstarted.getting-started.aria-label-to-advanced-tutorials', + 'To advanced tutorials' + )} icon="angle-right" variant="secondary" /> diff --git a/public/app/plugins/panel/gettingstarted/components/DocsCard.tsx b/public/app/plugins/panel/gettingstarted/components/DocsCard.tsx index cb47cbb934e..d18a4383966 100644 --- a/public/app/plugins/panel/gettingstarted/components/DocsCard.tsx +++ b/public/app/plugins/panel/gettingstarted/components/DocsCard.tsx @@ -1,6 +1,7 @@ import { css } from '@emotion/css'; import { GrafanaTheme2 } from '@grafana/data'; +import { Trans, useTranslate } from '@grafana/i18n'; import { reportInteraction } from '@grafana/runtime'; import { Icon, useStyles2 } from '@grafana/ui'; @@ -13,6 +14,7 @@ interface Props { } export const DocsCard = ({ card }: Props) => { + const { t } = useTranslate(); const styles = useStyles2(getStyles, card.done); return ( @@ -23,7 +25,9 @@ export const DocsCard = ({ card }: Props) => { className={styles.url} onClick={() => reportInteraction('grafana_getting_started_docs', { title: card.title, link: card.href })} > - <div className={styles.heading}>{card.done ? 'complete' : card.heading}</div> + <div className={styles.heading}> + {card.done ? t('gettingstarted.docs-card.complete', 'complete') : card.heading} + </div> <h4 className={styles.title}>{card.title}</h4> </a> </div> @@ -34,7 +38,8 @@ export const DocsCard = ({ card }: Props) => { rel="noreferrer" onClick={() => reportInteraction('grafana_getting_started_docs', { title: card.title, link: card.learnHref })} > - Learn how in the docs <Icon name="external-link-alt" /> + <Trans i18nKey="gettingstarted.docs-card.learn-how">Learn how in the docs</Trans>{' '} + <Icon name="external-link-alt" /> </a> </div> ); diff --git a/public/app/plugins/panel/gettingstarted/components/TutorialCard.tsx b/public/app/plugins/panel/gettingstarted/components/TutorialCard.tsx index b58279d6c92..4c857ce0659 100644 --- a/public/app/plugins/panel/gettingstarted/components/TutorialCard.tsx +++ b/public/app/plugins/panel/gettingstarted/components/TutorialCard.tsx @@ -2,6 +2,7 @@ import { css } from '@emotion/css'; import { MouseEvent } from 'react'; import { GrafanaTheme2 } from '@grafana/data'; +import { useTranslate } from '@grafana/i18n'; import { reportInteraction } from '@grafana/runtime'; import { useStyles2 } from '@grafana/ui'; import store from 'app/core/store'; @@ -15,6 +16,7 @@ interface Props { } export const TutorialCard = ({ card }: Props) => { + const { t } = useTranslate(); const styles = useStyles2(getStyles, card.done); return ( @@ -27,7 +29,9 @@ export const TutorialCard = ({ card }: Props) => { > <div className={cardContent}> <div className={styles.type}>{card.type}</div> - <div className={styles.heading}>{card.done ? 'complete' : card.heading}</div> + <div className={styles.heading}> + {card.done ? t('gettingstarted.tutorial-card.complete', 'complete') : card.heading} + </div> <h4 className={styles.cardTitle}>{card.title}</h4> <div className={styles.info}>{card.info}</div> </div> diff --git a/public/app/plugins/panel/histogram/HistogramPanel.tsx b/public/app/plugins/panel/histogram/HistogramPanel.tsx index 6ec723bd766..5e2e245997c 100644 --- a/public/app/plugins/panel/histogram/HistogramPanel.tsx +++ b/public/app/plugins/panel/histogram/HistogramPanel.tsx @@ -9,6 +9,7 @@ import { cacheFieldDisplayNames, getHistogramFields, } from '@grafana/data'; +import { Trans } from '@grafana/i18n'; import { TooltipDisplayMode, TooltipPlugin2, useTheme2 } from '@grafana/ui'; import { TooltipHoverMode } from '@grafana/ui/internal'; @@ -64,7 +65,11 @@ export const HistogramPanel = ({ data, options, width, height }: Props) => { if (!histogram || !histogram.fields.length) { return ( <div className="panel-empty"> - <p>No histogram found in response</p> + <p> + <Trans i18nKey="histogram.histogram-panel.no-histogram-found-in-response"> + No histogram found in response + </Trans> + </p> </div> ); } diff --git a/public/app/plugins/panel/live/LiveChannelEditor.tsx b/public/app/plugins/panel/live/LiveChannelEditor.tsx index 3276992eb37..6a5fa79337d 100644 --- a/public/app/plugins/panel/live/LiveChannelEditor.tsx +++ b/public/app/plugins/panel/live/LiveChannelEditor.tsx @@ -9,6 +9,7 @@ import { GrafanaTheme2, parseLiveChannelAddress, } from '@grafana/data'; +import { useTranslate, Trans } from '@grafana/i18n'; import { Select, Alert, Label, stylesFactory, Combobox } from '@grafana/ui'; import { config } from 'app/core/config'; import { discoveryResources, getAPIGroupDiscoveryList, GroupDiscoveryResource } from 'app/features/apiserver/discovery'; @@ -27,6 +28,7 @@ const scopes: Array<SelectableValue<LiveChannelScope>> = [ ]; export function LiveChannelEditor(props: Props) { + const { t } = useTranslate(); const [channels, setChannels] = useState<Array<SelectableValue<string>>>([]); const [namespaces, paths] = useMemo(() => { const namespaces: Array<SelectableValue<string>> = []; @@ -110,14 +112,18 @@ export function LiveChannelEditor(props: Props) { return ( <> - <Alert title="Grafana Live" severity="info"> - This supports real-time event streams in grafana core. This feature is under heavy development. Expect the - intefaces and structures to change as this becomes more production ready. + <Alert title={t('live.live-channel-editor.title-grafana-live', 'Grafana Live')} severity="info"> + <Trans i18nKey="live.live-channel-editor.description-grafana-live"> + This supports real-time event streams in Grafana core. This feature is under heavy development. Expect the + interfaces and structures to change as this becomes more production ready. + </Trans> </Alert> <div> <div className={style.dropWrap}> - <Label>Scope</Label> + <Label> + <Trans i18nKey="live.live-channel-editor.scope">Scope</Trans> + </Label> <Select options={scopes} value={scopes.find((s) => s.value === scope)} onChange={onScopeChanged} /> </div> @@ -125,7 +131,10 @@ export function LiveChannelEditor(props: Props) { <div className={style.dropWrap}> <Combobox options={getWatchableResources} - placeholder="Select watchable resource" + placeholder={t( + 'live.live-channel-editor.placeholder-select-watchable-resource', + 'Select watchable resource' + )} onChange={(v) => { const resource = (v as any).resource as GroupDiscoveryResource; if (resource) { @@ -142,7 +151,9 @@ export function LiveChannelEditor(props: Props) { {scope && ( <div className={style.dropWrap}> - <Label>Namespace</Label> + <Label> + <Trans i18nKey="live.live-channel-editor.namespace">Namespace</Trans> + </Label> <Select options={namespaces} value={ @@ -159,7 +170,9 @@ export function LiveChannelEditor(props: Props) { {scope && namespace && ( <div className={style.dropWrap}> - <Label>Path</Label> + <Label> + <Trans i18nKey="live.live-channel-editor.path">Path</Trans> + </Label> <Select options={paths} value={findPathOption(paths, path)} diff --git a/public/app/plugins/panel/live/LivePanel.tsx b/public/app/plugins/panel/live/LivePanel.tsx index 98c9b99a32f..998ade58835 100644 --- a/public/app/plugins/panel/live/LivePanel.tsx +++ b/public/app/plugins/panel/live/LivePanel.tsx @@ -18,6 +18,8 @@ import { LiveChannelAddress, StreamingDataFrame, } from '@grafana/data'; +import { Trans } from '@grafana/i18n'; +import { t } from '@grafana/i18n/internal'; import { config, getGrafanaLiveSrv } from '@grafana/runtime'; import { Alert, stylesFactory, JSONFormatter, CustomScrollbar } from '@grafana/ui'; @@ -125,9 +127,12 @@ export class LivePanel extends PureComponent<Props, State> { const preformatted = `[feature_toggles] enable = live`; return ( - <Alert title="Grafana Live" severity="info"> - <p>Grafana live requires a feature flag to run</p> + <Alert title={t('live.live-panel.title-grafana-live', 'Grafana Live')} severity="info"> + <p> + <Trans i18nKey="live.live-panel.grafana-requires-feature">Grafana live requires a feature flag to run</Trans> + </p> + {/* eslint-disable-next-line @grafana/i18n/no-untranslated-strings */} <b>custom.ini:</b> <pre>{preformatted}</pre> </Alert> @@ -141,7 +146,9 @@ export class LivePanel extends PureComponent<Props, State> { if (!message) { return ( <div> - <h4>Waiting for data:</h4> + <h4> + <Trans i18nKey="live.live-panel.waiting-for-data">Waiting for data:</Trans> + </h4> {options.channel?.scope}/{options.channel?.namespace}/{options.channel?.path} </div> ); @@ -246,15 +253,17 @@ export class LivePanel extends PureComponent<Props, State> { const { addr, error } = this.state; if (!addr) { return ( - <Alert title="Grafana Live" severity="info"> - Use the panel editor to pick a channel + <Alert title={t('live.live-panel.title-grafana-live', 'Grafana Live')} severity="info"> + <Trans i18nKey="live.live-panel.panel-editor-channel">Use the panel editor to pick a channel</Trans> </Alert> ); } if (error) { return ( <div> - <h2>ERROR</h2> + <h2> + <Trans i18nKey="live.live-panel.error">Error</Trans> + </h2> <div>{JSON.stringify(error)}</div> </div> ); diff --git a/public/app/plugins/panel/live/LivePublish.tsx b/public/app/plugins/panel/live/LivePublish.tsx index dcc3073843e..7228f9cb629 100644 --- a/public/app/plugins/panel/live/LivePublish.tsx +++ b/public/app/plugins/panel/live/LivePublish.tsx @@ -1,6 +1,7 @@ import { useMemo } from 'react'; import { LiveChannelAddress, isValidLiveChannelAddress } from '@grafana/data'; +import { Trans } from '@grafana/i18n'; import { getBackendSrv, getGrafanaLiveSrv } from '@grafana/runtime'; import { CodeEditor, Button } from '@grafana/ui'; @@ -60,7 +61,9 @@ export function LivePublish({ height, mode, body, addr, onSave }: Props) { showLineNumbers={true} /> <div style={{ height: 32 }}> - <Button onClick={onPublishClicked}>Publish</Button> + <Button onClick={onPublishClicked}> + <Trans i18nKey="live.live-publish.publish">Publish</Trans> + </Button> </div> </> ); diff --git a/public/app/plugins/panel/logs/LogsPanel.tsx b/public/app/plugins/panel/logs/LogsPanel.tsx index 6b8f694122b..6690f392ca9 100644 --- a/public/app/plugins/panel/logs/LogsPanel.tsx +++ b/public/app/plugins/panel/logs/LogsPanel.tsx @@ -30,12 +30,14 @@ import { LoadingState, rangeUtil, } from '@grafana/data'; +import { Trans } from '@grafana/i18n'; import { config, getAppEvents } from '@grafana/runtime'; import { ScrollContainer, usePanelContext, useStyles2 } from '@grafana/ui'; import { getFieldLinksForExplore } from 'app/features/explore/utils/links'; import { ControlledLogRows } from 'app/features/logs/components/ControlledLogRows'; import { InfiniteScroll } from 'app/features/logs/components/InfiniteScroll'; import { LogRowContextModal } from 'app/features/logs/components/log-context/LogRowContextModal'; +import { LogList } from 'app/features/logs/components/panel/LogList'; import { PanelDataErrorView } from 'app/features/panel/components/PanelDataErrorView'; import { combineResponses } from 'app/plugins/datasource/loki/mergeResponses'; @@ -48,6 +50,7 @@ import { GetFieldLinksFn, isCoreApp, isIsFilterLabelActive, + isLogLineMenuCustomItems, isOnClickFilterLabel, isOnClickFilterOutLabel, isOnClickFilterOutString, @@ -107,6 +110,10 @@ interface LogsPanelProps extends PanelProps<Options> { * * If controls are enabled, this function is called when a change is made in one of the options from the controls. * onLogOptionsChange?: (option: keyof LogListControlOptions, value: string | boolean | string[]) => void; + * + * When the feature toggle newLogsPanel is enabled, you can pass extra options to the LogLineMenu component. + * These options are an array of items with { label, onClick } or { divider: true } for dividers. + * logLineMenuCustomItems?: LogLineMenuCustomItem[]; */ } interface LogsPermalinkUrlState { @@ -141,6 +148,7 @@ export const LogsPanel = ({ isFilterLabelActive, logRowMenuIconsBefore, logRowMenuIconsAfter, + logLineMenuCustomItems, enableInfiniteScrolling, onNewLogsReceived, ...options @@ -284,13 +292,19 @@ export const LogsPanel = ({ // Important to memoize stuff here, as panel rerenders a lot for example when resizing. const [logRows, deduplicatedRows, commonLabels] = useMemo(() => { const logs = panelData - ? dataFrameToLogsModel(panelData.series, panelData.request?.intervalMs, undefined, panelData.request?.targets) + ? dataFrameToLogsModel( + panelData.series, + panelData.request?.intervalMs, + undefined, + panelData.request?.targets, + Boolean(enableInfiniteScrolling) + ) : null; const logRows = logs?.rows || []; const commonLabels = logs?.meta?.find((m) => m.label === COMMON_LABELS); const deduplicatedRows = dedupLogRows(logRows, dedupStrategy); return [logRows, deduplicatedRows, commonLabels]; - }, [dedupStrategy, panelData]); + }, [dedupStrategy, enableInfiniteScrolling, panelData]); const onPermalinkClick = useCallback( async (row: LogRowModel) => { @@ -306,6 +320,9 @@ export const LogsPanel = ({ }, [data]); useLayoutEffect(() => { + if (config.featureToggles.newLogsPanel) { + return; + } if (!logsContainerRef.current || !scrollElement || keepScrollPositionRef.current) { keepScrollPositionRef.current = keepScrollPositionRef.current === 'infinite-scroll' ? null : keepScrollPositionRef.current; @@ -448,13 +465,11 @@ export const LogsPanel = ({ [data.request, dataSourcesMap, onNewLogsReceived, panelData, timeZone] ); - if (!data || logRows.length === 0) { - return <PanelDataErrorView fieldConfig={fieldConfig} panelId={id} data={data} needsStringField />; - } - const renderCommonLabels = () => ( <div className={cx(style.labelContainer, isAscending && style.labelContainerAscending)}> - <span className={style.label}>Common labels:</span> + <span className={style.label}> + <Trans i18nKey="logs.logs-panel.render-common-labels.common-labels">Common labels:</Trans> + </span> <LogLabels labels={typeof commonLabels?.value === 'object' ? commonLabels?.value : noCommonLabels} emptyMessage="(no common labels)" @@ -462,6 +477,31 @@ export const LogsPanel = ({ </div> ); + const initialScrollPosition = useMemo(() => { + /** + * In dashboards, users with newest logs at the bottom have the expectation of keeping the scroll at the bottom + * when new data is received. See https://github.com/grafana/grafana/pull/37634 + */ + if (app === CoreApp.Dashboard || app === CoreApp.PanelEditor) { + return sortOrder === LogsSortOrder.Ascending ? 'bottom' : 'top'; + } + return 'top'; + }, [app, sortOrder]); + + const storageKey = useMemo(() => { + if (controlsStorageKey) { + return controlsStorageKey; + } + if (!data.request) { + return undefined; + } + return `${data.request?.dashboardUID}.${id}`; + }, [controlsStorageKey, data.request, id]); + + if (!data || logRows.length === 0) { + return <PanelDataErrorView fieldConfig={fieldConfig} panelId={id} data={data} needsStringField />; + } + // Passing callbacks control the display of the filtering buttons. We want to pass it only if onAddAdHocFilter is defined. const defaultOnClickFilterLabel = onAddAdHocFilter ? handleOnClickFilterLabel : undefined; const defaultOnClickFilterOutLabel = onAddAdHocFilter ? handleOnClickFilterOutLabel : undefined; @@ -482,7 +522,55 @@ export const LogsPanel = ({ getLogRowContextUi={getLogRowContextUi} /> )} - {!showControls ? ( + {config.featureToggles.newLogsPanel && ( + <div + onMouseLeave={onLogContainerMouseLeave} + className={style.logListContainer} + ref={(element: HTMLDivElement) => setScrollElement(element)} + > + {deduplicatedRows.length > 0 && scrollElement && ( + <LogList + app={isCoreApp(app) ? app : CoreApp.Dashboard} + containerElement={scrollElement} + dedupStrategy={dedupStrategy} + displayedFields={displayedFields} + enableLogDetails={enableLogDetails} + getFieldLinks={getFieldLinks} + isLabelFilterActive={isIsFilterLabelActive(isFilterLabelActive) ? isFilterLabelActive : undefined} + initialScrollPosition={initialScrollPosition} + loading={infiniteScrolling} + logLineMenuCustomItems={ + isLogLineMenuCustomItems(logLineMenuCustomItems) ? logLineMenuCustomItems : undefined + } + logs={deduplicatedRows} + logSupportsContext={showContextToggle} + loadMore={enableInfiniteScrolling ? loadMoreLogs : undefined} + onClickFilterLabel={ + isOnClickFilterLabel(onClickFilterLabel) ? onClickFilterLabel : defaultOnClickFilterLabel + } + onClickFilterOutLabel={ + isOnClickFilterOutLabel(onClickFilterOutLabel) ? onClickFilterOutLabel : defaultOnClickFilterOutLabel + } + onClickShowField={displayedFields !== undefined ? onClickShowField : undefined} + onClickHideField={displayedFields !== undefined ? onClickHideField : undefined} + onLogLineHover={onLogRowHover} + onLogOptionsChange={isOnLogOptionsChange(onLogOptionsChange) ? onLogOptionsChange : undefined} + onOpenContext={onOpenContext} + onPermalinkClick={showPermaLink() ? onPermalinkClick : undefined} + permalinkedLogId={getLogsPanelState()?.logs?.id ?? undefined} + showControls={Boolean(showControls)} + showTime={showTime} + sortOrder={sortOrder} + logOptionsStorageKey={storageKey} + syntaxHighlighting={prettifyLogMessage} + timeRange={data.timeRange} + timeZone={timeZone} + wrapLogMessage={wrapLogMessage} + /> + )} + </div> + )} + {!config.featureToggles.newLogsPanel && !showControls && ( <ScrollContainer ref={(scrollElement) => setScrollElement(scrollElement)}> <div onMouseLeave={onLogContainerMouseLeave} className={style.container} ref={logsContainerRef}> {showCommonLabels && !isAscending && renderCommonLabels()} @@ -539,7 +627,8 @@ export const LogsPanel = ({ {showCommonLabels && isAscending && renderCommonLabels()} </div> </ScrollContainer> - ) : ( + )} + {!config.featureToggles.newLogsPanel && showControls && ( <div onMouseLeave={onLogContainerMouseLeave} className={style.controlledLogsContainer}> {showCommonLabels && !isAscending && renderCommonLabels()} <ControlledLogRows @@ -585,7 +674,7 @@ export const LogsPanel = ({ onLogOptionsChange={isOnLogOptionsChange(onLogOptionsChange) ? onLogOptionsChange : undefined} logOptionsStorageKey={controlsStorageKey} // Ascending order causes scroll to stick to the bottom, so previewing is futile - renderPreview={false} + renderPreview={isAscending ? false : true} /> {showCommonLabels && isAscending && renderCommonLabels()} </div> @@ -598,6 +687,13 @@ const getStyles = (theme: GrafanaTheme2) => ({ container: css({ marginBottom: theme.spacing(1.5), }), + logListContainer: css({ + minHeight: '100%', + maxHeight: '100%', + display: 'flex', + flex: 1, + flexDirection: 'column', + }), controlledLogsContainer: css({ height: '100%', }), diff --git a/public/app/plugins/panel/logs/module.tsx b/public/app/plugins/panel/logs/module.tsx index 45952d81f89..c07595ae0bf 100644 --- a/public/app/plugins/panel/logs/module.tsx +++ b/public/app/plugins/panel/logs/module.tsx @@ -1,4 +1,5 @@ import { PanelPlugin, LogsSortOrder, LogsDedupStrategy, LogsDedupDescription } from '@grafana/data'; +import { config } from '@grafana/runtime'; import { LogsPanel } from './LogsPanel'; import { Options } from './panelcfg.gen'; @@ -6,25 +7,30 @@ import { LogsPanelSuggestionsSupplier } from './suggestions'; export const plugin = new PanelPlugin<Options>(LogsPanel) .setPanelOptions((builder) => { + builder.addBooleanSwitch({ + path: 'showTime', + name: 'Time', + description: '', + defaultValue: false, + }); + + if (!config.featureToggles.newLogsPanel) { + builder + .addBooleanSwitch({ + path: 'showLabels', + name: 'Unique labels', + description: '', + defaultValue: false, + }) + .addBooleanSwitch({ + path: 'showCommonLabels', + name: 'Common labels', + description: '', + defaultValue: false, + }); + } + builder - .addBooleanSwitch({ - path: 'showTime', - name: 'Time', - description: '', - defaultValue: false, - }) - .addBooleanSwitch({ - path: 'showLabels', - name: 'Unique labels', - description: '', - defaultValue: false, - }) - .addBooleanSwitch({ - path: 'showCommonLabels', - name: 'Common labels', - description: '', - defaultValue: false, - }) .addBooleanSwitch({ path: 'wrapLogMessage', name: 'Wrap lines', @@ -33,7 +39,7 @@ export const plugin = new PanelPlugin<Options>(LogsPanel) }) .addBooleanSwitch({ path: 'prettifyLogMessage', - name: 'Prettify JSON', + name: config.featureToggles.newLogsPanel ? 'Enable log message highlighting' : 'Prettify JSON', description: '', defaultValue: false, }) diff --git a/public/app/plugins/panel/logs/panelcfg.cue b/public/app/plugins/panel/logs/panelcfg.cue index b1efe883442..c235f43abcf 100644 --- a/public/app/plugins/panel/logs/panelcfg.cue +++ b/public/app/plugins/panel/logs/panelcfg.cue @@ -49,6 +49,7 @@ composableKinds: PanelCfg: { onLogOptionsChange?: _ logRowMenuIconsBefore?: _ logRowMenuIconsAfter?: _ + logLineMenuCustomItems?: _ onNewLogsReceived?: _ displayedFields?: [...string] } @cuetsy(kind="interface") diff --git a/public/app/plugins/panel/logs/panelcfg.gen.ts b/public/app/plugins/panel/logs/panelcfg.gen.ts index 74775a0ee61..0866170944a 100644 --- a/public/app/plugins/panel/logs/panelcfg.gen.ts +++ b/public/app/plugins/panel/logs/panelcfg.gen.ts @@ -17,6 +17,7 @@ export interface Options { enableInfiniteScrolling?: boolean; enableLogDetails: boolean; isFilterLabelActive?: unknown; + logLineMenuCustomItems?: unknown; logRowMenuIconsAfter?: unknown; logRowMenuIconsBefore?: unknown; /** diff --git a/public/app/plugins/panel/logs/types.ts b/public/app/plugins/panel/logs/types.ts index 9019d5750e8..506cc27c4bb 100644 --- a/public/app/plugins/panel/logs/types.ts +++ b/public/app/plugins/panel/logs/types.ts @@ -1,6 +1,7 @@ import React, { ReactNode } from 'react'; import { CoreApp, DataFrame, Field, LinkModel, ScopedVars } from '@grafana/data'; +import { LogLineMenuCustomItem } from 'app/features/logs/components/panel/LogLineMenu'; import { LogListControlOptions } from 'app/features/logs/components/panel/LogList'; export type { Options } from './panelcfg.gen'; @@ -66,3 +67,7 @@ export function isCoreApp(app: unknown): app is CoreApp { const apps = Object.values(CoreApp).map((coreApp) => coreApp.toString()); return typeof app === 'string' && apps.includes(app); } + +export function isLogLineMenuCustomItems(items: unknown): items is LogLineMenuCustomItem[] { + return Array.isArray(items) && items.every((item) => 'divider' in item || ('onClick' in item && 'label' in item)); +} diff --git a/public/app/plugins/panel/news/NewsPanel.tsx b/public/app/plugins/panel/news/NewsPanel.tsx index 1464f4cda5f..c53a7573630 100644 --- a/public/app/plugins/panel/news/NewsPanel.tsx +++ b/public/app/plugins/panel/news/NewsPanel.tsx @@ -1,8 +1,9 @@ import { useEffect } from 'react'; import { PanelProps } from '@grafana/data'; +import { useTranslate, Trans } from '@grafana/i18n'; import { RefreshEvent } from '@grafana/runtime'; -import { Alert, Icon, ScrollContainer } from '@grafana/ui'; +import { Alert, ScrollContainer, TextLink } from '@grafana/ui'; import { News } from './component/News'; import { DEFAULT_FEED_URL } from './constants'; @@ -12,6 +13,7 @@ import { useNewsFeed } from './useNewsFeed'; interface NewsPanelProps extends PanelProps<Options> {} export function NewsPanel(props: NewsPanelProps) { + const { t } = useTranslate(); const { width, options: { feedUrl = DEFAULT_FEED_URL, showImage }, @@ -33,19 +35,22 @@ export function NewsPanel(props: NewsPanelProps) { if (state.error) { return ( - <Alert title="Error loading RSS feed"> - Make sure that the feed URL is correct and that CORS is configured correctly on the server. See{' '} - <a - style={{ textDecoration: 'underline' }} - href="https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/news/" - > - News panel documentation. <Icon name="external-link-alt" /> - </a> + <Alert title={t('news.news-panel.title-error-loading-rss-feed', 'Error loading RSS feed')}> + <Trans i18nKey="news.news-panel.body-error-loading-rss-feed"> + Make sure that the feed URL is correct and that CORS is configured correctly on the server. See{' '} + <TextLink href="https://grafana.com/docs/grafana/latest/panels-visualizations/visualizations/news/" external> + News panel documentation. + </TextLink> + </Trans> </Alert> ); } if (state.loading) { - return <div>Loading...</div>; + return ( + <div> + <Trans i18nKey="news.news-panel.loading">Loading...</Trans> + </div> + ); } if (!state.value) { diff --git a/public/app/plugins/panel/nodeGraph/Edge.tsx b/public/app/plugins/panel/nodeGraph/Edge.tsx index e4802236cef..278b7ecd334 100644 --- a/public/app/plugins/panel/nodeGraph/Edge.tsx +++ b/public/app/plugins/panel/nodeGraph/Edge.tsx @@ -1,5 +1,7 @@ import { MouseEvent, memo } from 'react'; +import { useTranslate } from '@grafana/i18n'; + import { EdgeArrowMarker } from './EdgeArrowMarker'; import { computeNodeCircumferenceStrokeWidth, nodeR } from './Node'; import { EdgeDatumLayout, NodeDatum } from './types'; @@ -19,6 +21,7 @@ interface Props { } export const Edge = memo(function Edge(props: Props) { + const { t } = useTranslate(); const { edge, onClick, onMouseEnter, onMouseLeave, hovering, svgIdNamespace, processedNodesLength } = props; // Not great typing but after we do layout these properties are full objects not just references @@ -60,7 +63,10 @@ export const Edge = memo(function Edge(props: Props) { key={`${edge.id}-${edge.source.y ?? ''}-${processedNodesLength}-g`} onClick={(event) => onClick(event, edge)} style={{ cursor: 'pointer' }} - aria-label={`Edge from: ${source.id} to: ${target.id}`} + aria-label={t('nodeGraph.edge.aria-label-from-to', 'Edge from: {{from}} to: {{to}}', { + from: source.id, + to: target.id, + })} > <line strokeWidth={(hovering ? 1 : 0) + (edge.highlighted ? 1 : 0) + edge.thickness} diff --git a/public/app/plugins/panel/nodeGraph/Marker.tsx b/public/app/plugins/panel/nodeGraph/Marker.tsx index 7f926fc33f7..d8f6b00871d 100644 --- a/public/app/plugins/panel/nodeGraph/Marker.tsx +++ b/public/app/plugins/panel/nodeGraph/Marker.tsx @@ -2,6 +2,7 @@ import { css } from '@emotion/css'; import { MouseEvent, memo } from 'react'; import { GrafanaTheme2 } from '@grafana/data'; +import { useTranslate } from '@grafana/i18n'; import { useStyles2 } from '@grafana/ui'; import { NodesMarker } from './types'; @@ -32,6 +33,7 @@ export const Marker = memo(function Marker(props: { marker: NodesMarker; onClick?: (event: MouseEvent<SVGElement>, marker: NodesMarker) => void; }) { + const { t } = useTranslate(); const { marker, onClick } = props; const { node } = marker; const styles = useStyles2(getStyles); @@ -47,14 +49,20 @@ export const Marker = memo(function Marker(props: { onClick={(event) => { onClick?.(event, marker); }} - aria-label={`Hidden nodes marker: ${node.id}`} + aria-label={t('nodeGraph.marker.aria-label-hidden-marker', 'Hidden nodes marker: {{marker}}', { + marker: node.id, + })} > <circle className={styles.mainCircle} r={nodeR} cx={node.x} cy={node.y} /> <g> <foreignObject x={node.x - 25} y={node.y - 25} width="50" height="50"> <div className={styles.text}> {/* we limit the count to 101 so if we have more than 100 nodes we don't have exact count */} - <span>{marker.count > 100 ? '>100' : marker.count} nodes</span> + <span> + {marker.count > 100 + ? t('nodeGraph.marker.100-node-count', '>100 nodes') + : t('nodeGraph.marker.node-count', '{{count}} nodes', { count: marker.count })} + </span> </div> </foreignObject> </g> diff --git a/public/app/plugins/panel/nodeGraph/Node.tsx b/public/app/plugins/panel/nodeGraph/Node.tsx index 266f43918d3..4b7973ed40d 100644 --- a/public/app/plugins/panel/nodeGraph/Node.tsx +++ b/public/app/plugins/panel/nodeGraph/Node.tsx @@ -4,6 +4,7 @@ import { MouseEvent, memo } from 'react'; import tinycolor from 'tinycolor2'; import { Field, getFieldColorModeForField, GrafanaTheme2 } from '@grafana/data'; +import { useTranslate } from '@grafana/i18n'; import { Icon, useTheme2 } from '@grafana/ui'; import { HoverState } from './NodeGraph'; @@ -82,6 +83,7 @@ export const Node = memo(function Node(props: { onMouseLeave: (id: string) => void; onClick: (event: MouseEvent<SVGElement>, node: NodeDatum) => void; }) { + const { t } = useTranslate(); const { node, onMouseEnter, onMouseLeave, onClick, hovering } = props; const theme = useTheme2(); const styles = getStyles(theme, hovering); @@ -94,7 +96,11 @@ export const Node = memo(function Node(props: { } return ( - <g data-node-id={node.id} className={styles.mainGroup} aria-label={`Node: ${node.title}`}> + <g + data-node-id={node.id} + className={styles.mainGroup} + aria-label={t('nodeGraph.node.aria-label-node-title', 'Node: {{nodeName}}', { nodeName: node.title })} + > <circle data-testid={`node-circle-${node.id}`} className={node.highlighted ? styles.filledCircle : styles.mainCircle} diff --git a/public/app/plugins/panel/nodeGraph/NodeGraph.tsx b/public/app/plugins/panel/nodeGraph/NodeGraph.tsx index b07512ee3c0..27ed878f753 100644 --- a/public/app/plugins/panel/nodeGraph/NodeGraph.tsx +++ b/public/app/plugins/panel/nodeGraph/NodeGraph.tsx @@ -4,6 +4,7 @@ import { memo, MouseEvent, useCallback, useEffect, useMemo, useRef, useState } f import useMeasure from 'react-use/lib/useMeasure'; import { DataFrame, GrafanaTheme2, LinkModel } from '@grafana/data'; +import { Trans, useTranslate } from '@grafana/i18n'; import { Icon, RadioButtonGroup, Spinner, useStyles2 } from '@grafana/ui'; import { Edge } from './Edge'; @@ -126,6 +127,7 @@ interface Props { layoutAlgorithm?: LayoutAlgorithm; } export function NodeGraph({ getLinks, dataFrames, nodeLimit, panelId, zoomMode, layoutAlgorithm }: Props) { + const { t } = useTranslate(); const nodeCountLimit = nodeLimit || defaultNodeCountLimit; const { edges: edgesDataFrames, nodes: nodesDataFrames } = useCategorizeFrames(dataFrames); @@ -243,7 +245,7 @@ export function NodeGraph({ getLinks, dataFrames, nodeLimit, panelId, zoomMode, <div ref={topLevelRef} className={styles.wrapper}> {loading ? ( <div className={styles.loadingWrapper}> - Computing layout  + <Trans i18nKey="nodeGraph.node-graph.computing-layout">Computing layout</Trans>  <Spinner /> </div> ) : null} @@ -305,7 +307,9 @@ export function NodeGraph({ getLinks, dataFrames, nodeLimit, panelId, zoomMode, </g> </svg> ) : ( - <div className={styles.noDataMsg}>No data</div> + <div className={styles.noDataMsg}> + <Trans i18nKey="nodeGraph.node-graph.no-data">No data</Trans> + </div> )} <div className={styles.viewControls}> @@ -342,9 +346,11 @@ export function NodeGraph({ getLinks, dataFrames, nodeLimit, panelId, zoomMode, <div className={styles.alert} style={{ top: panelId ? '0px' : '40px' }} // panelId is undefined in Explore - aria-label={'Nodes hidden warning'} + aria-label={t('nodeGraph.node-graph.aria-label-nodes-hidden-warning', 'Nodes hidden warning')} > - <Icon size="sm" name={'info-circle'} /> {hiddenNodesCount} nodes are hidden for performance reasons. + <Trans i18nKey="nodeGraph.node-graph.hidden-nodes" count={hiddenNodesCount}> + <Icon size="sm" name={'info-circle'} /> {'{{count}}'} nodes are hidden for performance reasons. + </Trans> </div> )} @@ -352,10 +358,14 @@ export function NodeGraph({ getLinks, dataFrames, nodeLimit, panelId, zoomMode, <div className={styles.alert} style={{ top: panelId ? '30px' : '70px' }} - aria-label={'Layered layout performance warning'} + aria-label={t( + 'nodeGraph.node-graph.aria-label-layered-layout-performance-warning', + 'Layered layout performance warning' + )} > - <Icon size="sm" name={'exclamation-triangle'} /> Layered layout may be slow with {processed.nodes.length}{' '} - nodes. + <Trans i18nKey="nodeGraph.node-graph.processed-nodes" count={processed.nodes.length}> + <Icon size="sm" name={'exclamation-triangle'} /> Layered layout may be slow with {'{{count}}'} nodes. + </Trans> </div> )} diff --git a/public/app/plugins/panel/nodeGraph/NodeGraphPanel.tsx b/public/app/plugins/panel/nodeGraph/NodeGraphPanel.tsx index 57c5a74179d..08f1dde71f4 100644 --- a/public/app/plugins/panel/nodeGraph/NodeGraphPanel.tsx +++ b/public/app/plugins/panel/nodeGraph/NodeGraphPanel.tsx @@ -2,6 +2,7 @@ import memoizeOne from 'memoize-one'; import { useId } from 'react'; import { PanelProps } from '@grafana/data'; +import { Trans } from '@grafana/i18n'; import { useLinks } from '../../../features/explore/utils/links'; @@ -16,7 +17,9 @@ export const NodeGraphPanel = ({ width, height, data, options }: PanelProps<Node if (!data || !data.series.length) { return ( <div className="panel-empty"> - <p>No data found in response</p> + <p> + <Trans i18nKey="nodeGraph.node-graph-panel.no-data-found-in-response">No data found in response</Trans> + </p> </div> ); } diff --git a/public/app/plugins/panel/nodeGraph/ViewControls.tsx b/public/app/plugins/panel/nodeGraph/ViewControls.tsx index b0e041ce3ea..ad2160a61d7 100644 --- a/public/app/plugins/panel/nodeGraph/ViewControls.tsx +++ b/public/app/plugins/panel/nodeGraph/ViewControls.tsx @@ -1,6 +1,7 @@ import { css } from '@emotion/css'; import { useState } from 'react'; +import { useTranslate } from '@grafana/i18n'; import { Button, Stack, useStyles2 } from '@grafana/ui'; function getStyles() { @@ -26,6 +27,7 @@ interface Props<Config> { * Control buttons for zoom but also some layout config inputs mainly for debugging. */ export function ViewControls<Config extends Record<string, any>>(props: Props<Config>) { + const { t } = useTranslate(); const { config, onConfigChange, onPlus, onMinus, disableZoomOut, disableZoomIn } = props; const [showConfig, setShowConfig] = useState(false); @@ -41,7 +43,7 @@ export function ViewControls<Config extends Record<string, any>>(props: Props<Co icon={'plus-circle'} onClick={onPlus} size={'md'} - title={'Zoom in'} + title={t('nodeGraph.view-controls.title-zoom-in', 'Zoom in')} variant="secondary" disabled={disableZoomIn} /> @@ -49,7 +51,7 @@ export function ViewControls<Config extends Record<string, any>>(props: Props<Co icon={'minus-circle'} onClick={onMinus} size={'md'} - title={'Zoom out'} + title={t('nodeGraph.view-controls.title-zoom-out', 'Zoom out')} variant="secondary" disabled={disableZoomOut} /> @@ -58,7 +60,9 @@ export function ViewControls<Config extends Record<string, any>>(props: Props<Co {allowConfiguration && ( <Button size={'xs'} fill="text" onClick={() => setShowConfig((showConfig) => !showConfig)}> - {showConfig ? 'Hide config' : 'Show config'} + {showConfig + ? t('nodeGraph.view-controls.hide-config', 'Hide config') + : t('nodeGraph.view-controls.show-config', 'Show config')} </Button> )} diff --git a/public/app/plugins/panel/nodeGraph/editor/ArcOptionsEditor.tsx b/public/app/plugins/panel/nodeGraph/editor/ArcOptionsEditor.tsx index b226cedb41e..ac12f22715d 100644 --- a/public/app/plugins/panel/nodeGraph/editor/ArcOptionsEditor.tsx +++ b/public/app/plugins/panel/nodeGraph/editor/ArcOptionsEditor.tsx @@ -1,6 +1,7 @@ import { css } from '@emotion/css'; import { Field, GrafanaTheme2, StandardEditorProps } from '@grafana/data'; +import { useTranslate, Trans } from '@grafana/i18n'; import { Button, ColorPicker, useStyles2 } from '@grafana/ui'; import { FieldNamePicker } from '@grafana/ui/internal'; @@ -10,6 +11,7 @@ type Settings = { filter: (field: Field) => boolean }; type ArcOptionsEditorProps = StandardEditorProps<ArcOption[], Settings, NodeGraphOptions, undefined>; export const ArcOptionsEditor = ({ value, onChange, context }: ArcOptionsEditorProps) => { + const { t } = useTranslate(); const styles = useStyles2(getStyles); const addArc = () => { @@ -54,12 +56,18 @@ export const ArcOptionsEditor = ({ value, onChange, context }: ArcOptionsEditorP updateField(i, 'color', val); }} /> - <Button size="sm" icon="minus" variant="secondary" onClick={() => removeArc(i)} title="Remove arc" /> + <Button + size="sm" + icon="minus" + variant="secondary" + onClick={() => removeArc(i)} + title={t('nodeGraph.arc-options-editor.title-remove-arc', 'Remove arc')} + /> </div> ); })} <Button size={'sm'} icon="plus" onClick={addArc} variant="secondary"> - Add arc + <Trans i18nKey="nodeGraph.arc-options-editor.add-arc">Add arc</Trans> </Button> </> ); diff --git a/public/app/plugins/panel/nodeGraph/useContextMenu.tsx b/public/app/plugins/panel/nodeGraph/useContextMenu.tsx index dd26f99ebc8..7f90c1846df 100644 --- a/public/app/plugins/panel/nodeGraph/useContextMenu.tsx +++ b/public/app/plugins/panel/nodeGraph/useContextMenu.tsx @@ -3,6 +3,7 @@ import { MouseEvent, useCallback, useState } from 'react'; import * as React from 'react'; import { DataFrame, Field, GrafanaTheme2, LinkModel, LinkTarget } from '@grafana/data'; +import { useTranslate } from '@grafana/i18n'; import { ContextMenu, MenuGroup, MenuItem, useStyles2 } from '@grafana/ui'; import { Config } from './layout'; @@ -199,6 +200,7 @@ function HeaderRow({ label, value }: { label: string; value: string }) { * Shows some field values in a table on top of the context menu. */ function NodeHeader({ node, nodes }: { node: NodeDatum; nodes?: DataFrame }) { + const { t } = useTranslate(); const rows = []; if (nodes) { const fields = getNodeFields(nodes); @@ -210,10 +212,12 @@ function NodeHeader({ node, nodes }: { node: NodeDatum; nodes?: DataFrame }) { } else { // Fallback if we don't have nodes dataFrame. Can happen if we use just the edges frame to construct this. if (node.title) { - rows.push(<HeaderRow key="title" label={'Title'} value={node.title} />); + rows.push(<HeaderRow key="title" label={t('nodeGraph.node-header.label-title', 'Title')} value={node.title} />); } if (node.subTitle) { - rows.push(<HeaderRow key="subtitle" label={'Subtitle'} value={node.subTitle} />); + rows.push( + <HeaderRow key="subtitle" label={t('nodeGraph.node-header.label-subtitle', 'Subtitle')} value={node.subTitle} /> + ); } } @@ -228,6 +232,7 @@ function NodeHeader({ node, nodes }: { node: NodeDatum; nodes?: DataFrame }) { * Shows some of the field values in a table on top of the context menu. */ function EdgeHeader(props: { edge: EdgeDatumLayout; edges: DataFrame }) { + const { t } = useTranslate(); const index = props.edge.dataFrameRowIndex; const fields = getEdgeFields(props.edges); const valueSource = fields.source?.values[index] || ''; @@ -235,7 +240,13 @@ function EdgeHeader(props: { edge: EdgeDatumLayout; edges: DataFrame }) { const rows = []; if (valueSource && valueTarget) { - rows.push(<HeaderRow key={'header-row'} label={'Source → Target'} value={`${valueSource} → ${valueTarget}`} />); + rows.push( + <HeaderRow + key={'header-row'} + label={t('nodeGraph.edge-header.label-source-target', 'Source → Target')} + value={`${valueSource} → ${valueTarget}`} + /> + ); } for (const f of [fields.mainStat, fields.secondaryStat, ...fields.details]) { diff --git a/public/app/plugins/panel/status-history/StatusHistoryPanel.tsx b/public/app/plugins/panel/status-history/StatusHistoryPanel.tsx index d171ba5a634..d8dbcca7769 100644 --- a/public/app/plugins/panel/status-history/StatusHistoryPanel.tsx +++ b/public/app/plugins/panel/status-history/StatusHistoryPanel.tsx @@ -1,6 +1,7 @@ import { useMemo, useState } from 'react'; import { DashboardCursorSync, PanelProps } from '@grafana/data'; +import { Trans } from '@grafana/i18n'; import { AxisPlacement, EventBusPlugin, @@ -79,8 +80,10 @@ export const StatusHistoryPanel = ({ return ( <div className="panel-empty"> <p> - Too many points to visualize properly. <br /> - Update the query to return fewer points. <br />({paginatedFrames[0].length} points received) + <Trans i18nKey="status-history.status-history-panel.too-many-points" count={paginatedFrames[0].length}> + Too many points to visualize properly. <br /> + Update the query to return fewer points. <br />({'{{count}}'} points received) + </Trans> </p> </div> ); diff --git a/public/app/plugins/panel/table/cells/AutoCellOptionsEditor.tsx b/public/app/plugins/panel/table/cells/AutoCellOptionsEditor.tsx index ea5dfaf1182..7c063625d9d 100644 --- a/public/app/plugins/panel/table/cells/AutoCellOptionsEditor.tsx +++ b/public/app/plugins/panel/table/cells/AutoCellOptionsEditor.tsx @@ -1,3 +1,4 @@ +import { useTranslate } from '@grafana/i18n'; import { TableAutoCellOptions, TableColorTextCellOptions } from '@grafana/schema'; import { Field, Switch } from '@grafana/ui'; @@ -8,6 +9,7 @@ export const AutoCellOptionsEditor = ({ onChange, }: TableCellEditorProps<TableAutoCellOptions | TableColorTextCellOptions>) => { // Handle row coloring changes + const { t } = useTranslate(); const onWrapTextChange = () => { cellOptions.wrapText = !cellOptions.wrapText; onChange(cellOptions); @@ -15,8 +17,11 @@ export const AutoCellOptionsEditor = ({ return ( <Field - label="Wrap text" - description="If selected text will be wrapped to the width of text in the configured column" + label={t('table.auto-cell-options-editor.label-wrap-text', 'Wrap text')} + description={t( + 'table.auto-cell-options-editor.description-wrap-text', + 'If selected text will be wrapped to the width of text in the configured column' + )} > <Switch value={cellOptions.wrapText} onChange={onWrapTextChange} /> </Field> diff --git a/public/app/plugins/panel/table/cells/BarGaugeCellOptionsEditor.tsx b/public/app/plugins/panel/table/cells/BarGaugeCellOptionsEditor.tsx index 57e6b9703ee..0600d3fd801 100644 --- a/public/app/plugins/panel/table/cells/BarGaugeCellOptionsEditor.tsx +++ b/public/app/plugins/panel/table/cells/BarGaugeCellOptionsEditor.tsx @@ -1,4 +1,5 @@ import { SelectableValue } from '@grafana/data'; +import { useTranslate } from '@grafana/i18n'; import { BarGaugeDisplayMode, BarGaugeValueMode, TableBarGaugeCellOptions } from '@grafana/schema'; import { Field, RadioButtonGroup, Stack } from '@grafana/ui'; @@ -8,6 +9,7 @@ type Props = TableCellEditorProps<TableBarGaugeCellOptions>; export function BarGaugeCellOptionsEditor({ cellOptions, onChange }: Props) { // Set the display mode on change + const { t } = useTranslate(); const onCellOptionsChange = (v: BarGaugeDisplayMode) => { cellOptions.mode = v; onChange(cellOptions); @@ -20,14 +22,14 @@ export function BarGaugeCellOptionsEditor({ cellOptions, onChange }: Props) { return ( <Stack direction="column" gap={0}> - <Field label="Gauge display mode"> + <Field label={t('table.bar-gauge-cell-options-editor.label-gauge-display-mode', 'Gauge display mode')}> <RadioButtonGroup value={cellOptions?.mode ?? BarGaugeDisplayMode.Gradient} onChange={onCellOptionsChange} options={barGaugeOpts} /> </Field> - <Field label="Value display"> + <Field label={t('table.bar-gauge-cell-options-editor.label-value-display', 'Value display')}> <RadioButtonGroup value={cellOptions?.valueDisplayMode ?? BarGaugeValueMode.Text} onChange={onValueModeChange} diff --git a/public/app/plugins/panel/table/cells/ColorBackgroundCellOptionsEditor.tsx b/public/app/plugins/panel/table/cells/ColorBackgroundCellOptionsEditor.tsx index 0cd943b5cf6..0ae9ff02486 100644 --- a/public/app/plugins/panel/table/cells/ColorBackgroundCellOptionsEditor.tsx +++ b/public/app/plugins/panel/table/cells/ColorBackgroundCellOptionsEditor.tsx @@ -1,4 +1,5 @@ import { SelectableValue } from '@grafana/data'; +import { Trans, useTranslate } from '@grafana/i18n'; import { TableCellBackgroundDisplayMode, TableColoredBackgroundCellOptions } from '@grafana/schema'; import { Field, RadioButtonGroup, Switch, Label, Badge } from '@grafana/ui'; @@ -14,6 +15,7 @@ export const ColorBackgroundCellOptionsEditor = ({ onChange, }: TableCellEditorProps<TableColoredBackgroundCellOptions>) => { // Set the display mode on change + const { t } = useTranslate(); const onCellOptionsChange = (v: TableCellBackgroundDisplayMode) => { cellOptions.mode = v; onChange(cellOptions); @@ -32,15 +34,26 @@ export const ColorBackgroundCellOptionsEditor = ({ }; const label = ( - <Label description="If selected text will be wrapped to the width of text in the configured column"> - {'Wrap text '} - <Badge text="Alpha" color="blue" style={{ fontSize: '11px', marginLeft: '5px', lineHeight: '1.2' }} /> + <Label + description={t( + 'table.color-background-cell-options-editor.description-wrap-text', + 'If selected text will be wrapped to the width of text in the configured column' + )} + > + <Trans i18nKey="table.color-background-cell-options-editor.wrap-text">Wrap text</Trans>{' '} + <Badge + text={t('table.color-background-cell-options-editor.label.text-alpha', 'Alpha')} + color="blue" + style={{ fontSize: '11px', marginLeft: '5px', lineHeight: '1.2' }} + /> </Label> ); return ( <> - <Field label="Background display mode"> + <Field + label={t('table.color-background-cell-options-editor.label-background-display-mode', 'Background display mode')} + > <RadioButtonGroup value={cellOptions?.mode ?? TableCellBackgroundDisplayMode.Gradient} onChange={onCellOptionsChange} @@ -48,8 +61,11 @@ export const ColorBackgroundCellOptionsEditor = ({ /> </Field> <Field - label="Apply to entire row" - description="If selected the entire row will be colored as this cell would be." + label={t('table.color-background-cell-options-editor.label-apply-to-entire-row', 'Apply to entire row')} + description={t( + 'table.color-background-cell-options-editor.description-apply-to-entire-row', + 'If selected the entire row will be colored as this cell would be.' + )} > <Switch value={cellOptions.applyToRow} onChange={onColorRowChange} /> </Field> diff --git a/public/app/plugins/panel/table/cells/ImageCellOptionsEditor.tsx b/public/app/plugins/panel/table/cells/ImageCellOptionsEditor.tsx index 51e711cd367..a9920b8f9c9 100644 --- a/public/app/plugins/panel/table/cells/ImageCellOptionsEditor.tsx +++ b/public/app/plugins/panel/table/cells/ImageCellOptionsEditor.tsx @@ -1,11 +1,13 @@ import { FormEvent } from 'react'; +import { useTranslate } from '@grafana/i18n'; import { TableImageCellOptions } from '@grafana/schema'; import { Field, Input } from '@grafana/ui'; import { TableCellEditorProps } from '../TableCellOptionEditor'; export const ImageCellOptionsEditor = ({ cellOptions, onChange }: TableCellEditorProps<TableImageCellOptions>) => { + const { t } = useTranslate(); const onAltChange = (e: FormEvent<HTMLInputElement>) => { cellOptions.alt = e.currentTarget.value; onChange(cellOptions); @@ -19,13 +21,22 @@ export const ImageCellOptionsEditor = ({ cellOptions, onChange }: TableCellEdito return ( <> <Field - label="Alt text" - description="Alternative text that will be displayed if an image can't be displayed or for users who use a screen reader" + label={t('table.image-cell-options-editor.label-alt-text', 'Alt text')} + description={t( + 'table.image-cell-options-editor.description-alt-text', + "Alternative text that will be displayed if an image can't be displayed or for users who use a screen reader" + )} > <Input onChange={onAltChange} defaultValue={cellOptions.alt} /> </Field> - <Field label="Title text" description="Text that will be displayed when the image is hovered by a cursor"> + <Field + label={t('table.image-cell-options-editor.label-title-text', 'Title text')} + description={t( + 'table.image-cell-options-editor.description-title-text', + 'Text that will be displayed when the image is hovered by a cursor' + )} + > <Input onChange={onTitleChange} defaultValue={cellOptions.title} /> </Field> </> diff --git a/public/app/plugins/panel/table/table-new/cells/AutoCellOptionsEditor.tsx b/public/app/plugins/panel/table/table-new/cells/AutoCellOptionsEditor.tsx index d45bfeb2d50..09b34daa3d0 100644 --- a/public/app/plugins/panel/table/table-new/cells/AutoCellOptionsEditor.tsx +++ b/public/app/plugins/panel/table/table-new/cells/AutoCellOptionsEditor.tsx @@ -1,3 +1,4 @@ +import { useTranslate } from '@grafana/i18n'; import { TableAutoCellOptions, TableColorTextCellOptions } from '@grafana/schema'; import { Field, Switch } from '@grafana/ui'; @@ -8,13 +9,14 @@ export const AutoCellOptionsEditor = ({ onChange, }: TableCellEditorProps<TableAutoCellOptions | TableColorTextCellOptions>) => { // Handle row coloring changes + const { t } = useTranslate(); const onWrapTextChange = () => { cellOptions.wrapText = !cellOptions.wrapText; onChange(cellOptions); }; return ( - <Field label="Wrap text"> + <Field label={t('table.auto-cell-options-editor.label-wrap-text', 'Wrap text')}> <Switch value={cellOptions.wrapText} onChange={onWrapTextChange} /> </Field> ); diff --git a/public/app/plugins/panel/table/table-new/cells/BarGaugeCellOptionsEditor.tsx b/public/app/plugins/panel/table/table-new/cells/BarGaugeCellOptionsEditor.tsx index 57e6b9703ee..0600d3fd801 100644 --- a/public/app/plugins/panel/table/table-new/cells/BarGaugeCellOptionsEditor.tsx +++ b/public/app/plugins/panel/table/table-new/cells/BarGaugeCellOptionsEditor.tsx @@ -1,4 +1,5 @@ import { SelectableValue } from '@grafana/data'; +import { useTranslate } from '@grafana/i18n'; import { BarGaugeDisplayMode, BarGaugeValueMode, TableBarGaugeCellOptions } from '@grafana/schema'; import { Field, RadioButtonGroup, Stack } from '@grafana/ui'; @@ -8,6 +9,7 @@ type Props = TableCellEditorProps<TableBarGaugeCellOptions>; export function BarGaugeCellOptionsEditor({ cellOptions, onChange }: Props) { // Set the display mode on change + const { t } = useTranslate(); const onCellOptionsChange = (v: BarGaugeDisplayMode) => { cellOptions.mode = v; onChange(cellOptions); @@ -20,14 +22,14 @@ export function BarGaugeCellOptionsEditor({ cellOptions, onChange }: Props) { return ( <Stack direction="column" gap={0}> - <Field label="Gauge display mode"> + <Field label={t('table.bar-gauge-cell-options-editor.label-gauge-display-mode', 'Gauge display mode')}> <RadioButtonGroup value={cellOptions?.mode ?? BarGaugeDisplayMode.Gradient} onChange={onCellOptionsChange} options={barGaugeOpts} /> </Field> - <Field label="Value display"> + <Field label={t('table.bar-gauge-cell-options-editor.label-value-display', 'Value display')}> <RadioButtonGroup value={cellOptions?.valueDisplayMode ?? BarGaugeValueMode.Text} onChange={onValueModeChange} diff --git a/public/app/plugins/panel/table/table-new/cells/ColorBackgroundCellOptionsEditor.tsx b/public/app/plugins/panel/table/table-new/cells/ColorBackgroundCellOptionsEditor.tsx index 9a3f51f5820..923c4e29f53 100644 --- a/public/app/plugins/panel/table/table-new/cells/ColorBackgroundCellOptionsEditor.tsx +++ b/public/app/plugins/panel/table/table-new/cells/ColorBackgroundCellOptionsEditor.tsx @@ -1,4 +1,5 @@ import { SelectableValue } from '@grafana/data'; +import { useTranslate } from '@grafana/i18n'; import { TableCellBackgroundDisplayMode, TableColoredBackgroundCellOptions } from '@grafana/schema'; import { Field, RadioButtonGroup, Switch } from '@grafana/ui'; @@ -13,6 +14,7 @@ export const ColorBackgroundCellOptionsEditor = ({ onChange, }: TableCellEditorProps<TableColoredBackgroundCellOptions>) => { // Set the display mode on change + const { t } = useTranslate(); const onCellOptionsChange = (v: TableCellBackgroundDisplayMode) => { cellOptions.mode = v; onChange(cellOptions); @@ -31,7 +33,9 @@ export const ColorBackgroundCellOptionsEditor = ({ return ( <> - <Field label="Background display mode"> + <Field + label={t('table.color-background-cell-options-editor.label-background-display-mode', 'Background display mode')} + > <RadioButtonGroup value={cellOptions?.mode ?? TableCellBackgroundDisplayMode.Gradient} onChange={onCellOptionsChange} @@ -39,12 +43,15 @@ export const ColorBackgroundCellOptionsEditor = ({ /> </Field> <Field - label="Apply to entire row" - description="If selected the entire row will be colored as this cell would be." + label={t('table.color-background-cell-options-editor.label-apply-to-entire-row', 'Apply to entire row')} + description={t( + 'table.color-background-cell-options-editor.description-apply-to-entire-row', + 'If selected the entire row will be colored as this cell would be.' + )} > <Switch value={cellOptions.applyToRow} onChange={onColorRowChange} /> </Field> - <Field label="Wrap text"> + <Field label={t('table.color-background-cell-options-editor.label-wrap-text', 'Wrap text')}> <Switch value={cellOptions.wrapText} onChange={onWrapTextChange} /> </Field> </> diff --git a/public/app/plugins/panel/table/table-new/cells/ImageCellOptionsEditor.tsx b/public/app/plugins/panel/table/table-new/cells/ImageCellOptionsEditor.tsx index 51e711cd367..a9920b8f9c9 100644 --- a/public/app/plugins/panel/table/table-new/cells/ImageCellOptionsEditor.tsx +++ b/public/app/plugins/panel/table/table-new/cells/ImageCellOptionsEditor.tsx @@ -1,11 +1,13 @@ import { FormEvent } from 'react'; +import { useTranslate } from '@grafana/i18n'; import { TableImageCellOptions } from '@grafana/schema'; import { Field, Input } from '@grafana/ui'; import { TableCellEditorProps } from '../TableCellOptionEditor'; export const ImageCellOptionsEditor = ({ cellOptions, onChange }: TableCellEditorProps<TableImageCellOptions>) => { + const { t } = useTranslate(); const onAltChange = (e: FormEvent<HTMLInputElement>) => { cellOptions.alt = e.currentTarget.value; onChange(cellOptions); @@ -19,13 +21,22 @@ export const ImageCellOptionsEditor = ({ cellOptions, onChange }: TableCellEdito return ( <> <Field - label="Alt text" - description="Alternative text that will be displayed if an image can't be displayed or for users who use a screen reader" + label={t('table.image-cell-options-editor.label-alt-text', 'Alt text')} + description={t( + 'table.image-cell-options-editor.description-alt-text', + "Alternative text that will be displayed if an image can't be displayed or for users who use a screen reader" + )} > <Input onChange={onAltChange} defaultValue={cellOptions.alt} /> </Field> - <Field label="Title text" description="Text that will be displayed when the image is hovered by a cursor"> + <Field + label={t('table.image-cell-options-editor.label-title-text', 'Title text')} + description={t( + 'table.image-cell-options-editor.description-title-text', + 'Text that will be displayed when the image is hovered by a cursor' + )} + > <Input onChange={onTitleChange} defaultValue={cellOptions.title} /> </Field> </> diff --git a/public/app/plugins/panel/timeseries/LineStyleEditor.tsx b/public/app/plugins/panel/timeseries/LineStyleEditor.tsx index f5f3d14bc5e..70b961f1bc3 100644 --- a/public/app/plugins/panel/timeseries/LineStyleEditor.tsx +++ b/public/app/plugins/panel/timeseries/LineStyleEditor.tsx @@ -1,6 +1,7 @@ import { useMemo } from 'react'; import { StandardEditorProps, SelectableValue } from '@grafana/data'; +import { useTranslate } from '@grafana/i18n'; import { LineStyle } from '@grafana/schema'; import { HorizontalGroup, IconButton, RadioButtonGroup, Select } from '@grafana/ui'; @@ -55,6 +56,7 @@ const dotOptions: Array<SelectableValue<string>> = [ type Props = StandardEditorProps<LineStyle, unknown>; export const LineStyleEditor = ({ value, onChange }: Props) => { + const { t } = useTranslate(); const options = useMemo(() => (value?.fill === 'dash' ? dashOptions : dotOptions), [value]); const current = useMemo(() => { if (!value?.dash?.length) { @@ -108,12 +110,15 @@ export const LineStyleEditor = ({ value, onChange }: Props) => { <div>   <a - title="The input expects a segment list" + title={t( + 'timeseries.line-style-editor.title-the-input-expects-a-segment-list', + 'The input expects a segment list' + )} href="https://developer.mozilla.org/en-US/docs/Web/API/CanvasRenderingContext2D/setLineDash#Parameters" target="_blank" rel="noreferrer" > - <IconButton name="question-circle" tooltip="Help" /> + <IconButton name="question-circle" tooltip={t('timeseries.line-style-editor.tooltip-help', 'Help')} /> </a> </div> </> diff --git a/public/app/plugins/panel/timeseries/NullsThresholdInput.tsx b/public/app/plugins/panel/timeseries/NullsThresholdInput.tsx index 3e83be1cb25..703cf43b939 100644 --- a/public/app/plugins/panel/timeseries/NullsThresholdInput.tsx +++ b/public/app/plugins/panel/timeseries/NullsThresholdInput.tsx @@ -1,6 +1,7 @@ import * as React from 'react'; import { rangeUtil } from '@grafana/data'; +import { useTranslate } from '@grafana/i18n'; import { Input } from '@grafana/ui'; export enum InputPrefix { @@ -16,6 +17,7 @@ type Props = { }; export const NullsThresholdInput = ({ value, onChange, inputPrefix, isTime }: Props) => { + const { t } = useTranslate(); let defaultValue = rangeUtil.secondsToHms(value / 1000); if (!isTime) { defaultValue = '10'; @@ -57,7 +59,7 @@ export const NullsThresholdInput = ({ value, onChange, inputPrefix, isTime }: Pr return ( <Input autoFocus={false} - placeholder="never" + placeholder={t('timeseries.nulls-threshold-input.placeholder-never', 'Never')} width={10} defaultValue={defaultValue} onKeyDown={handleEnterKey} diff --git a/public/app/plugins/panel/timeseries/TimezonesEditor.tsx b/public/app/plugins/panel/timeseries/TimezonesEditor.tsx index 968c68727ac..6b6040a472e 100644 --- a/public/app/plugins/panel/timeseries/TimezonesEditor.tsx +++ b/public/app/plugins/panel/timeseries/TimezonesEditor.tsx @@ -1,12 +1,14 @@ import { css } from '@emotion/css'; import { GrafanaTheme2, InternalTimeZones, StandardEditorProps } from '@grafana/data'; +import { useTranslate } from '@grafana/i18n'; import { OptionsWithTimezones } from '@grafana/schema'; import { IconButton, TimeZonePicker, useStyles2 } from '@grafana/ui'; type Props = StandardEditorProps<string[], unknown, OptionsWithTimezones>; export const TimezonesEditor = ({ value, onChange }: Props) => { + const { t } = useTranslate(); const styles = useStyles2(getStyles); if (!value || value.length < 1) { @@ -43,9 +45,17 @@ export const TimezonesEditor = ({ value, onChange }: Props) => { value={tz ?? InternalTimeZones.default} /> {idx === value.length - 1 ? ( - <IconButton name="plus" onClick={addTimezone} tooltip="Add timezone" /> + <IconButton + name="plus" + onClick={addTimezone} + tooltip={t('timeseries.timezones-editor.tooltip-add-timezone', 'Add timezone')} + /> ) : ( - <IconButton name="times" onClick={() => removeTimezone(idx)} tooltip="Remove timezone" /> + <IconButton + name="times" + onClick={() => removeTimezone(idx)} + tooltip={t('timeseries.timezones-editor.tooltip-remove-timezone', 'Remove timezone')} + /> )} </li> ))} diff --git a/public/app/plugins/panel/timeseries/plugins/OutsideRangePlugin.tsx b/public/app/plugins/panel/timeseries/plugins/OutsideRangePlugin.tsx index 5dea52b23f8..38d4a677bb4 100644 --- a/public/app/plugins/panel/timeseries/plugins/OutsideRangePlugin.tsx +++ b/public/app/plugins/panel/timeseries/plugins/OutsideRangePlugin.tsx @@ -2,6 +2,7 @@ import { useLayoutEffect, useRef, useState } from 'react'; import uPlot, { TypedArray, Scale } from 'uplot'; import { AbsoluteTimeRange } from '@grafana/data'; +import { Trans } from '@grafana/i18n'; import { UPlotConfigBuilder, Button } from '@grafana/ui'; interface ThresholdControlsPluginProps { @@ -70,13 +71,15 @@ export const OutsideRangePlugin = ({ config, onChangeTimeRange }: ThresholdContr }} > <div> - <div>Data outside time range</div> + <div> + <Trans i18nKey="timeseries.outside-range-plugin.data-outside-time-range">Data outside time range</Trans> + </div> <Button onClick={(v) => onChangeTimeRange({ from: first, to: last })} variant="secondary" data-testid="time-series-zoom-to-data" > - Zoom to data + <Trans i18nKey="timeseries.outside-range-plugin.zoom-to-data">Zoom to data</Trans> </Button> </div> </div> diff --git a/public/app/plugins/panel/timeseries/plugins/annotations2/AnnotationEditor2.tsx b/public/app/plugins/panel/timeseries/plugins/annotations2/AnnotationEditor2.tsx index b5b9b960e27..dccc6e2ed0c 100644 --- a/public/app/plugins/panel/timeseries/plugins/annotations2/AnnotationEditor2.tsx +++ b/public/app/plugins/panel/timeseries/plugins/annotations2/AnnotationEditor2.tsx @@ -4,6 +4,7 @@ import { Controller } from 'react-hook-form'; import { useAsyncFn, useClickAway } from 'react-use'; import { AnnotationEventUIModel, GrafanaTheme2, dateTimeFormat, systemDateFormats } from '@grafana/data'; +import { useTranslate, Trans } from '@grafana/i18n'; import { Button, Field, Stack, TextArea, usePanelContext, useStyles2 } from '@grafana/ui'; import { Form } from 'app/core/components/Form/Form'; import { TagFilter } from 'app/core/components/TagFilter/TagFilter'; @@ -22,6 +23,7 @@ interface AnnotationEditFormDTO { } export const AnnotationEditor2 = ({ annoVals, annoIdx, dismiss, timeZone, ...otherProps }: Props) => { + const { t } = useTranslate(); const styles = useStyles2(getStyles); const { onAnnotationCreate, onAnnotationUpdate } = usePanelContext(); @@ -70,7 +72,11 @@ export const AnnotationEditor2 = ({ annoVals, annoIdx, dismiss, timeZone, ...oth <div ref={clickAwayRef} className={styles.editor} {...otherProps}> <div className={styles.header}> <Stack justifyContent={'space-between'} alignItems={'center'}> - <div>{isUpdatingAnnotation ? 'Edit annotation' : 'Add annotation'}</div> + <div> + {isUpdatingAnnotation + ? t('timeseries.annotation-editor2.edit-annotation', 'Edit annotation') + : t('timeseries.annotation-editor2.add-annotation', 'Add annotation')} + </div> <div>{time}</div> </Stack> </div> @@ -82,7 +88,11 @@ export const AnnotationEditor2 = ({ annoVals, annoIdx, dismiss, timeZone, ...oth return ( <> <div className={styles.content}> - <Field label={'Description'} invalid={!!errors.description} error={errors?.description?.message}> + <Field + label={t('timeseries.annotation-editor2.label-description', 'Description')} + invalid={!!errors.description} + error={errors?.description?.message} + > <TextArea className={styles.textarea} {...register('description', { @@ -90,7 +100,7 @@ export const AnnotationEditor2 = ({ annoVals, annoIdx, dismiss, timeZone, ...oth })} /> </Field> - <Field label={'Tags'}> + <Field label={t('timeseries.annotation-editor2.label-tags', 'Tags')}> <Controller control={control} name="tags" @@ -98,7 +108,7 @@ export const AnnotationEditor2 = ({ annoVals, annoIdx, dismiss, timeZone, ...oth return ( <TagFilter allowCustomValue - placeholder="Add tags" + placeholder={t('timeseries.annotation-editor2.placeholder-add-tags', 'Add tags')} onChange={onChange} tagOptions={getAnnotationTags} tags={field.value} @@ -111,10 +121,12 @@ export const AnnotationEditor2 = ({ annoVals, annoIdx, dismiss, timeZone, ...oth <div className={styles.footer}> <Stack justifyContent={'flex-end'}> <Button size={'sm'} variant="secondary" onClick={dismiss} fill="outline"> - Cancel + <Trans i18nKey="timeseries.annotation-editor2.cancel">Cancel</Trans> </Button> <Button size={'sm'} type={'submit'} disabled={stateIndicator?.loading}> - {stateIndicator?.loading ? 'Saving' : 'Save'} + {stateIndicator?.loading + ? t('timeseries.annotation-editor2.saving', 'Saving') + : t('timeseries.annotation-editor2.save', 'Save')} </Button> </Stack> </div> diff --git a/public/app/plugins/panel/timeseries/plugins/annotations2/AnnotationTooltip2.tsx b/public/app/plugins/panel/timeseries/plugins/annotations2/AnnotationTooltip2.tsx index a504e098f4b..b7f60a1857a 100644 --- a/public/app/plugins/panel/timeseries/plugins/annotations2/AnnotationTooltip2.tsx +++ b/public/app/plugins/panel/timeseries/plugins/annotations2/AnnotationTooltip2.tsx @@ -2,6 +2,7 @@ import { css } from '@emotion/css'; import * as React from 'react'; import { GrafanaTheme2, dateTimeFormat, systemDateFormats, textUtil } from '@grafana/data'; +import { useTranslate } from '@grafana/i18n'; import { HorizontalGroup, IconButton, Tag, usePanelContext, useStyles2 } from '@grafana/ui'; import alertDef from 'app/features/alerting/state/alertDef'; @@ -15,6 +16,7 @@ interface Props { const retFalse = () => false; export const AnnotationTooltip2 = ({ annoVals, annoIdx, timeZone, onEdit }: Props) => { + const { t } = useTranslate(); const annoId = annoVals.id?.[annoIdx]; const styles = useStyles2(getStyles); @@ -74,13 +76,20 @@ export const AnnotationTooltip2 = ({ annoVals, annoIdx, timeZone, onEdit }: Prop </div> {(canEdit || canDelete) && ( <div className={styles.editControls}> - {canEdit && <IconButton name={'pen'} size={'sm'} onClick={onEdit} tooltip="Edit" />} + {canEdit && ( + <IconButton + name={'pen'} + size={'sm'} + onClick={onEdit} + tooltip={t('timeseries.annotation-tooltip2.tooltip-edit', 'Edit')} + /> + )} {canDelete && ( <IconButton name={'trash-alt'} size={'sm'} onClick={() => onAnnotationDelete(annoId)} - tooltip="Delete" + tooltip={t('timeseries.annotation-tooltip2.tooltip-delete', 'Delete')} /> )} </div> diff --git a/public/app/plugins/panel/traces/TracesPanel.tsx b/public/app/plugins/panel/traces/TracesPanel.tsx index cf6fe0fae97..5ad8aebecd8 100644 --- a/public/app/plugins/panel/traces/TracesPanel.tsx +++ b/public/app/plugins/panel/traces/TracesPanel.tsx @@ -3,6 +3,7 @@ import { useMemo, createRef } from 'react'; import { useAsync } from 'react-use'; import { Field, LinkModel, PanelProps } from '@grafana/data'; +import { Trans } from '@grafana/i18n'; import { getDataSourceSrv } from '@grafana/runtime'; import { TraceView } from 'app/features/explore/TraceView/TraceView'; import { SpanLinkFunc } from 'app/features/explore/TraceView/components'; @@ -34,7 +35,9 @@ export const TracesPanel = ({ data, options, replaceVariables }: PanelProps<Trac if (!data || !data.series.length || !traceProp) { return ( <div className="panel-empty"> - <p>No data found in response</p> + <p> + <Trans i18nKey="traces.traces-panel.no-data-found-in-response">No data found in response</Trans> + </p> </div> ); } diff --git a/public/app/plugins/panel/welcome/Welcome.tsx b/public/app/plugins/panel/welcome/Welcome.tsx index a69910c7d39..fbd38c31e44 100644 --- a/public/app/plugins/panel/welcome/Welcome.tsx +++ b/public/app/plugins/panel/welcome/Welcome.tsx @@ -1,6 +1,7 @@ import { css } from '@emotion/css'; import { GrafanaTheme2 } from '@grafana/data'; +import { Trans } from '@grafana/i18n'; import { useStyles2 } from '@grafana/ui'; const helpOptions = [ @@ -15,9 +16,13 @@ export const WelcomeBanner = () => { return ( <div className={styles.container}> - <h1 className={styles.title}>Welcome to Grafana</h1> + <h1 className={styles.title}> + <Trans i18nKey="welcome.welcome-banner.welcome-to-grafana">Welcome to Grafana</Trans> + </h1> <div className={styles.help}> - <h3 className={styles.helpText}>Need help?</h3> + <h3 className={styles.helpText}> + <Trans i18nKey="welcome.welcome-banner.need-help">Need help?</Trans> + </h3> <div className={styles.helpLinks}> {helpOptions.map((option, index) => { return ( diff --git a/public/app/plugins/panel/xychart/SeriesEditor.tsx b/public/app/plugins/panel/xychart/SeriesEditor.tsx index 6b01ba3268d..4553463c6d9 100644 --- a/public/app/plugins/panel/xychart/SeriesEditor.tsx +++ b/public/app/plugins/panel/xychart/SeriesEditor.tsx @@ -12,6 +12,7 @@ import { FieldType, GrafanaTheme2, } from '@grafana/data'; +import { Trans, useTranslate } from '@grafana/i18n'; import { Button, Field, IconButton, Select, useStyles2 } from '@grafana/ui'; import { FieldNamePicker } from '@grafana/ui/internal'; import { LayerName } from 'app/core/components/Layers/LayerName'; @@ -23,6 +24,7 @@ export const SeriesEditor = ({ onChange, context, }: StandardEditorProps<XYSeriesConfig[], unknown, Options>) => { + const { t } = useTranslate(); const style = useStyles2(getStyles); // reset opts when mapping changes (no way to do this in panel opts builder?) @@ -81,7 +83,7 @@ export const SeriesEditor = ({ {mapping === SeriesMapping.Manual && ( <> <Button icon="plus" size="sm" variant="secondary" onClick={addSeries} className={style.marginBot}> - Add series + <Trans i18nKey="xychart.series-editor.add-series">Add series</Trans> </Button> <div className={style.marginBot}> @@ -92,7 +94,9 @@ export const SeriesEditor = ({ className={index === selectedIdx ? `${style.row} ${style.sel}` : style.row} onClick={() => setSelectedIdx(index)} role="button" - aria-label={`Select series ${index + 1}`} + aria-label={t('xychart.series-editor.aria-label-select-series', 'Select series {{seriesNum}}', { + seriesNum: index + 1, + })} tabIndex={0} onKeyPress={(e) => { if (e.key === 'Enter') { @@ -111,10 +115,9 @@ export const SeriesEditor = ({ /> <IconButton name="trash-alt" - title={'remove'} className={cx(style.actionIcon)} onClick={() => deleteSeries(index)} - tooltip="Delete series" + tooltip={t('xychart.series-editor.tooltip-delete-series', 'Delete series')} /> </div> ); @@ -125,9 +128,13 @@ export const SeriesEditor = ({ {selectedIdx >= 0 && series != null && ( <Fragment key={formKey}> - <Field label="Frame"> + <Field label={t('xychart.series-editor.label-frame', 'Frame')}> <Select - placeholder={mapping === SeriesMapping.Auto ? 'All frames' : 'Select frame'} + placeholder={ + mapping === SeriesMapping.Auto + ? t('xychart.series-editor.placeholder-all-frames', 'All frames') + : t('xychart.series-editor.placeholder-select-frame', 'Select frame') + } isClearable={true} options={context.data.map((frame, index) => ({ value: index, @@ -150,7 +157,7 @@ export const SeriesEditor = ({ }} /> </Field> - <Field label="X field"> + <Field label={t('xychart.series-editor.label-x-field', 'X field')}> <FieldNamePicker value={series.x?.matcher.options as string} context={context} @@ -184,7 +191,7 @@ export const SeriesEditor = ({ }} /> </Field> - <Field label="Y field"> + <Field label={t('xychart.series-editor.label-y-field', 'Y field')}> <FieldNamePicker value={series.y?.matcher?.options as string} context={context} @@ -219,7 +226,7 @@ export const SeriesEditor = ({ }} /> </Field> - <Field label="Size field"> + <Field label={t('xychart.series-editor.label-size-field', 'Size field')}> <FieldNamePicker value={series.size?.matcher?.options as string} context={context} @@ -255,7 +262,7 @@ export const SeriesEditor = ({ }} /> </Field> - <Field label="Color field"> + <Field label={t('xychart.series-editor.label-color-field', 'Color field')}> <FieldNamePicker value={series.color?.matcher?.options as string} context={context} diff --git a/public/app/routes/routes.tsx b/public/app/routes/routes.tsx index c79d39a2bb5..90b70ca5a9c 100644 --- a/public/app/routes/routes.tsx +++ b/public/app/routes/routes.tsx @@ -188,7 +188,11 @@ export function getAppRoutes(): RouteDescriptor[] { }, { path: '/monitoring', - component: () => <NavLandingPage navId="monitoring" />, + component: () => <Navigate replace to="/observability" />, + }, + { + path: '/observability', + component: () => <NavLandingPage navId="observability" />, }, { path: '/infrastructure', @@ -527,6 +531,13 @@ export function getAppRoutes(): RouteDescriptor[] { () => import(/* webpackChunkName: "BookmarksPage"*/ 'app/features/bookmarks/BookmarksPage') ), }, + config.featureToggles.restoreDashboards && { + path: '/dashboard/recently-deleted', + roles: () => ['Admin', 'ServerAdmin'], + component: SafeDynamicImport( + () => import(/* webpackChunkName: "RecentlyDeletedPage" */ 'app/features/browse-dashboards/RecentlyDeletedPage') + ), + }, { // Redirect the /femt dev page to the root path: '/femt', diff --git a/public/locales/cs-CZ/grafana.json b/public/locales/cs-CZ/grafana.json index 50a97ceb3f1..990e60e48a9 100644 --- a/public/locales/cs-CZ/grafana.json +++ b/public/locales/cs-CZ/grafana.json @@ -72,6 +72,11 @@ }, "admin-edit-org-page": { "label-name": "Název", + "page-nav": { + "subTitle": { + "manage-settings-roles-organization": "" + } + }, "render-missing-permission-message": { "title-access-denied": "Přístup nebyl povolen" } @@ -233,6 +238,13 @@ "upgrade-info": { "title": "Licence Enterprise" }, + "user-admin-page": { + "page-nav": { + "subTitle": { + "manage-settings-for-an-individual-user": "" + } + } + }, "user-create-page": { "label-email": "E-mail", "label-name": "Název", @@ -243,9 +255,16 @@ "label-ldap": "LDAP" }, "user-list-admin-page-un-connected": { + "label": { + "active-last-days": "", + "all-users": "Všichni uživatelé" + }, "placeholder-search-login-email": "Hledat uživatele podle přihlašovacího jména, e-mailu nebo jména." }, "user-list-anonymous-devices-page-un-connected": { + "label": { + "active-last-days": "" + }, "placeholder-search-devices-by-ip-address": "Hledat zařízení podle IP adresy." }, "user-list-page": { @@ -364,6 +383,12 @@ "no-grouping": "Žádné seskupování" }, "alert-group-alerts-table": { + "columns": { + "label": { + "instance-labels": "", + "notification-state": "Stav oznámení" + } + }, "duration": "po dobu {{time}}" }, "alert-group-filter": { @@ -451,6 +476,11 @@ "description-section": "Zadejte název pro identifikaci {{entityName}}.", "label-metric": "Metrika", "label-name": "Název", + "message": { + "must-enter-a-metric-name": "", + "must-enter-a-name": "", + "please-select-a-data-source": "Vyberte zdroj dat" + }, "metric-aria-label-metric": "metrika", "metric-placeholder-recorded-metric": "Zadejte název nové zaznamenané metriky", "placeholder-name": "Pojmenujte {{namePlaceholder}}", @@ -503,6 +533,9 @@ "alertmanager-config": { "gma-manual-configuration-description": "Interní konfiguraci správce výstrah Grafana nelze ručně změnit. Chcete-li změnit tuto konfiguraci, upravte jednotlivé zdroje přes uživatelské rozhraní.", "gma-manual-configuration-is-not-supported": "Ruční změny konfigurace nejsou podporovány", + "message": { + "configuration-cannot-be-empty": "" + }, "reset": "Resetovat", "reset-confirmation": "Opravdu chcete obnovit konfiguraci pro „{{alertmanagerName}}“? Kontaktní body a zásady oznamování budou obnoveny do výchozího nastavení.", "resetting-configuration-might-while": "Probíhá obnovení konfigurace, může to chvíli trvat.", @@ -592,6 +625,9 @@ "create-a-contact-point": "Vytvořit kontaktní bod", "label-default-contact-point": "Výchozí kontaktní bod", "label-timing-options": "Možnosti časování", + "message": { + "required": "" + }, "or": "nebo" }, "am-routes-expanded-form": { @@ -613,11 +649,19 @@ "label-override-grouping": "Přepsat seskupení", "label-value": "Hodnota", "matching-labels": "Shodné štítky", + "message": { + "required": "" + }, "placeholder-label": "štítek", "placeholder-value": "hodnota", "remove": "Odebrat", "tooltip-remove-matcher": "Odebrat modul pro porovnávání" }, + "annotation-header-field": { + "message": { + "required": "" + } + }, "annotations": { "dashboard-annotation-field": { "dashboard": "Nástěnka {{dashboardUid}}", @@ -689,6 +733,25 @@ "title": "Všechny události nejde zobrazit" } }, + "central-alert-history-scene": { + "scene": { + "labels-filter-variable": { + "label": { + "labels": "" + } + }, + "transitions-from-filter-variable": { + "label": { + "start-state": "" + } + }, + "transitions-to-filter-variable": { + "label": { + "end-state": "" + } + } + } + }, "channel-sub-form": { "delete": "Odstranit", "duplicate": "Duplikovat", @@ -725,11 +788,17 @@ }, "cloud-data-source-selector": { "label": "Vyberte zdroj dat", - "label-disabled": "Zdroj dat" + "label-disabled": "Zdroj dat", + "message": { + "please-select-a-data-source": "Vyberte zdroj dat" + } }, "cloud-evaluation-behavior": { "description-pending-period": "Období, během kterého musí být splněna podmínka prahové hodnoty pro spuštění výstrahy. Výběrem možnosti „Žádné“ se spustí výstraha okamžitě po splnění podmínky.", "label-pending-period": "Čekající období", + "message": { + "must-be-a-positive-integer": "" + }, "title-set-evaluation-behavior": "Nastavit chování hodnocení" }, "cloud-receiver-form": { @@ -770,6 +839,9 @@ "contact-point-selector": { "aria-label-refresh-contact-points": "Obnovit kontaktní body", "contact-point-picker-label-contact-point": "Kontaktní bod", + "message": { + "contact-point-is-required": "" + }, "title-failed-to-fetch-contact-points": "Nepodařilo se načíst kontaktní body", "tooltip-refresh-contact-points-list": "Obnovit seznam kontaktních bodů" }, @@ -840,6 +912,14 @@ }, "copy-to-clipboard": "Kopírovat „{{label}}“ do schránky", "create-metadata": { + "label": { + "dashboard": "Nástěnka", + "dashboard-and-panel": "", + "evaluation-interval": "Interval hodnocení", + "labels": "Štítky", + "metric-name": "", + "runbook-url": "" + }, "view-dashboard": "Zobrazit nástěnku", "view-panel": "Zobrazit panel" }, @@ -880,9 +960,6 @@ "title-search-panel": "Vyhledávací panel", "title-select-dashboard-and-panel": "Vyberte nástěnku a panel" }, - "data-source-section": { - "import-to-grafana": "Importovat do pravidel Grafany" - }, "datasource-not-found": { "card-description": "Zdroj dat pro tento dotaz nebyl nalezen, buď byl odstraněn nebo není správně nainstalován.", "remove-query": "Odebrat dotaz", @@ -964,6 +1041,11 @@ "text-loading-template": "Načítání šablony…", "title-failed-to-fetch-notification-template": "Nepodařilo se načíst šablonu oznámení" }, + "edit-mute-timing-page": { + "text": { + "edit-time-interval": "" + } + }, "editor": { "edit-alert-rule": "", "edit-recording-rule": "", @@ -977,6 +1059,11 @@ "error-summary-button": { "content-show-all-errors": "" }, + "evaluate-every-validation-options": { + "message": { + "required": "" + } + }, "evaluation-behavior-summary": { "evaluate": "", "label-evaluate": "Vyhodnotit", @@ -994,6 +1081,9 @@ "evaluation-group-creation-modal": { "description-group-name": "Skupina vyhodnotí všechna svá pravidla ve stejném intervalu hodnocení.", "description-often-rules-group-evaluated": "Jak často jsou vyhodnocena všechna pravidla ve skupině.", + "message": { + "required": "" + }, "placeholder-enter-a-name": "Zadejte název", "title-new-evaluation-group": "Nová hodnotící skupina" }, @@ -1016,12 +1106,24 @@ "title-permission-editrecreate-silence": "Nemáte oprávnění k úpravě/obnovení tohoto potlačení", "title-silence-not-found": "Existující potlačení „{{silenceId}}“ nebylo nalezeno" }, + "existing-silence-editor-page": { + "page-nav": { + "text": { + "edit-silence": "" + } + } + }, "export": { "subtitle": { "formats": "Vyberte formát a stáhněte soubor nebo zkopírujte obsah do schránky", "one-format": "Stáhněte soubor nebo zkopírujte obsah do schránky" } }, + "export-new-grafana-rule-page": { + "text": { + "export-new-grafana-rule": "" + } + }, "export-new-rule-button": { "tooltip-export-new-grafana-rule": "Exportovat nové pravidlo Grafany" }, @@ -1047,6 +1149,16 @@ "no-data": "Žádná data", "page-counter": "" }, + "feature-toggle-page": { + "nav-model": { + "subTitle": { + "enable-alerting-grafana-config": "" + }, + "text": { + "alerting-is-not-enabled": "" + } + } + }, "federated-rule-warning": { "experimental": "Federované skupiny pravidel jsou v současné době experimentální funkce.", "read-documentation": "Přečtěte si dokumentaci", @@ -1054,6 +1166,13 @@ }, "file-export-inline-documentation": { "api-provisioning": "Formát {{name}} je platný pouze pro zajištění rozhraní API. <3>Další informace najdete v dokumentaci.</3>", + "export-inline-doc": { + "title": { + "apiprovisioning-format": "", + "fileprovisioning-format": "", + "terraformprovisioning-format": "" + } + }, "file-provisioning": "Formát {{name}} je platný pouze pro zajištění souboru. <3>Další informace najdete v dokumentaci.</3>", "terraform-provisioning": "Formát {{name}} je platný pouze pro zajištění Terraformu. <3>Další informace najdete v dokumentaci.</3>" }, @@ -1061,6 +1180,20 @@ "copy-code": "Kopírovat kód", "download": "Stáhnout" }, + "filter-options": { + "label": { + "alert-rule": "Pravidlo výstrahy", + "all": "Vše", + "error": "Chyba", + "firing": "", + "no-data": "Žádná data", + "normal": "Normální", + "ok": "OK", + "pending": "Nevyřízeno", + "recording-rule": "Pravidlo nahrávání", + "recovering": "Probíhá obnovení" + } + }, "filter-view-results": { "aria-label-filteredrulelist": "seznam filtrovaných pravidel" }, @@ -1095,7 +1228,10 @@ } }, "folder-selector": { - "description-select-folder": "Vyberte složku, do které chcete uložit pravidlo." + "description-select-folder": "Vyberte složku, do které chcete uložit pravidlo.", + "message": { + "select-a-folder": "" + } }, "folderAndGroup": { "evaluation": { @@ -1110,15 +1246,88 @@ "for-input": { "description-pending": "Období, během kterého musí být splněna podmínka prahové hodnoty pro spuštění výstrahy. Výběrem možnosti „Žádné“ se spustí výstraha okamžitě po splnění podmínky." }, + "for-validation-options": { + "message": { + "required": "" + } + }, "generate-alert-data-modal": { "add-alert-data": "Přidat data výstrahy", "add-alert-data-to-payload": "Přidat data výstrah k datovému obsahu", + "alert-options": { + "label": { + "firing": "", + "resolved": "" + } + }, "review-alert-payload": " Zkontrolujte data výstrahy a přidejte je k datovému obsahu:", "title-add-custom-alerts": "Přidejte vlastní výstrahy" }, + "get-alert-suggestions": { + "documentation": { + "annotations-attached-alert": "", + "fingerprint-identify-alert": "", + "grafana-external-alertmanager": "", + "organization-alert": "", + "time-the-alert-started-firing": "" + }, + "value": { + "labels-attached-alert": "", + "status-alert-firing-resolved": "" + } + }, + "get-cloud-scenes": { + "title": { + "mimir-alertmanager": "" + } + }, + "get-global-suggestions": { + "value": { + "an-array-containing-all-alerts": "" + } + }, + "get-grafana-alertmanager-scenes": { + "title": { + "grafana-alertmanager": "" + } + }, + "get-grafana-managed-scenes": { + "title": { + "grafanamanaged-alert-rules": "Pravidla výstrah spravovaná Grafanou" + } + }, + "get-mimir-managed-rules-per-group-scenes": { + "rule-group-handler": { + "label": { + "rule-group": "" + } + }, + "title": { + "mimirmanaged-alert-rules-per-rule-group": "" + } + }, + "get-mimir-managed-rules-scenes": { + "title": { + "mimirmanaged-alert-rules": "" + } + }, "get-preview-results": { "title-error": "Chyba" }, + "get-state-display-model": { + "text": { + "alerting": "", + "error": "", + "firing": "", + "inactive": "", + "no-data": "", + "ok": "OK", + "paused": "", + "pending": "", + "recovering": "", + "unknown": "" + } + }, "getting-stared": { "learn-more": "Více informací a podrobný postup najdete v našem <2>tutoriálu na téma upozorňování Grafana</2>" }, @@ -1160,6 +1369,10 @@ "label-disable-resolved-message": "Zakázat vyřešenou zprávu" }, "grafana-evaluation-behavior-step": { + "message": { + "must-be-a-positive-integer": "", + "must-enter-a-group-name": "" + }, "missing-series-resolve-placeholder": "Výchozí: 2", "or": "nebo", "placeholder-select-an-evaluation-group": "Vyberte hodnotící skupinu…", @@ -1176,6 +1389,11 @@ "body-invalid-rule-id": "Pravidlo UID v adrese URL stránky je neplatné. Zkontrolujte adresu URL a zkuste to znovu.", "title-invalid-rule-id": "Neplatné ID pravidla" }, + "grafana-modify-export-page": { + "text": { + "modify-export": "" + } + }, "grafana-mute-timing-exporter-preview": { "text-loading": "Načítání…" }, @@ -1228,6 +1446,9 @@ }, "group-and-namespace-fields": { "group-picker-label-group": "Skupina", + "message": { + "required": "" + }, "namespace-picker-label-namespace": "Jmenný prostor" }, "group-by": { @@ -1284,14 +1505,19 @@ "header": { "tooltip-remove": "Odebrat výraz „{{refId}}“" }, + "history-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "Úspěch" + } + }, "home": { "label-get-started": "Začínáme", "label-insights": "观察", "title-alerting": "Výstrahy" }, - "import-from-dsrules": { - "description-folder-import-rules": "Složka, do které chcete importovat pravidla" - }, "import-to-gma": { "action-button": "Importovat", "additional-settings": "Další nastavení", @@ -1299,8 +1525,9 @@ "confirm-modal": { "confirm": "Importovat", "loading": "Načítání…", - "loading-body": "Probíhá příprava dat k importu. Může to chvíli trvat…", + "loading-body": "", "no-rules-body": "Neexistují žádná pravidla k importu. Vyberte jiný jmenný prostor nebo skupinu pravidel.", + "no-rules-body-yaml": "", "no-rules-title": "Žádná pravidla k importu", "plugin-rules-warning": { "text": "Zjistili jsme, že některá pravidla jsou spravována pluginy. Tato pravidla nebudou importována.", @@ -1319,11 +1546,12 @@ "label": "Skupina" }, "import-location-and-filters": "Importovat lokalitu a filtry", + "import-source": "", "namespace": { "description": "Zadejte a vyhledejte existující jmenný prostor", "label": "Jmenný prostor" }, - "pageTitle": "Importovat pravidla výstrah ze zdroje dat do pravidel spravovaných Grafanou", + "pageTitle": "", "pause": { "label": "Pozastavit importovaná pravidla pro upozorňování" }, @@ -1331,10 +1559,26 @@ "label": "Pozastavit importovaná pravidla pro nahrávání" }, "recording-rules": "Pravidla nahrávání", + "source": { + "datasource": "", + "datasource-description": "", + "yaml": "", + "yaml-description": "" + }, "success": "Pravidla výstrah byla úspěšně importována do pravidel spravovaných Grafanou.", "target-folder": { + "description": "Složka, do které chcete importovat pravidla", "label": "Cílová složka" - } + }, + "yaml": { + "description": "", + "label": "", + "required-message": "", + "target-datasource": "Cílový zdroj dat", + "target-datasource-description": "", + "target-datasource-required": "" + }, + "yaml-error": "" }, "insights": { "monitor-status-of-system": "Sledujte stav svého systému", @@ -1410,6 +1654,9 @@ "text-loading-existing-labels": "Načítání stávajících štítků" }, "labels-without-suggestions": { + "message": { + "required": "" + }, "placeholder-key": "klíč", "placeholder-value": "hodnota" }, @@ -1451,6 +1698,24 @@ "log-record-viewer-by-timestamp": { "aria-label-state-history-by-timestamp": "Historie stavu podle časového razítka" }, + "log-timeline-viewer": { + "label": { + "firing": "", + "mixed": "", + "no-data": "", + "normal": "Normální", + "pending": "Nevyřízeno", + "recovering": "Probíhá obnovení" + } + }, + "loki-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "Úspěch" + } + }, "loki-state-history": { "clear-filters": "Vymazat filtry", "common-labels": "Běžné štítky", @@ -1463,6 +1728,14 @@ "button": "Spravovat oprávnění", "title": "Spravovat oprávnění" }, + "manual-and-automatic-routing": { + "routing-options": { + "label": { + "select-contact-point": "", + "use-notification-policy": "" + } + } + }, "matcher-filter": { "filter-alerts-using-label-querying-without-braces": "Filtrovat výstrahy pomocí dotazování na štítky bez složených závorek, např.:", "filter-alerts-using-label-querying-without-spaces": "Filtrujte výstrahy pomocí dotazu na štítky bez mezer, např.:", @@ -1480,6 +1753,9 @@ "label-operator": "Operátor", "label-refine-affected-alerts": "Upřesnit dotčené výstrahy", "label-value": "Hodnota", + "message": { + "required": "" + }, "placeholder-label": "štítek", "placeholder-value": "hodnota", "remove": "Odebrat", @@ -1511,6 +1787,16 @@ "aria-label": "Další", "button-text": "Další" }, + "multiple-data-source-picker": { + "get-data-source-options": { + "grouped-options": { + "label": { + "data-sources-with-configured-alert-rules": "", + "other-data-sources": "" + } + } + } + }, "mute-timing-actions-buttons": { "text-disabled": "Zakázáno", "title-delete-mute-timing": "Odstranit časování ztlumení" @@ -1574,11 +1860,26 @@ "read-more": "Zjistěte víc o zásadách oznamování.", "title-notification-routing": "Směrování oznámení" }, + "new-mute-timing-page": { + "text": { + "add-time-interval": "" + } + }, "new-rule-from-panel-button": { "body-no-alerting-capable-query-found": "Nelze vytvořit výstrahy z tohoto panelu, protože nebyl nalezen žádný dotaz na zdroj dat, který by spustil upozorňování.", "new-alert-rule": "Nové pravidlo výstrahy", "title-no-alerting-capable-query-found": "Nebyl nalezen žádný dotaz, který by spustil upozorňování" }, + "new-silence-page": { + "page-nav": { + "subTitle": { + "configure-silences-notifications-particular-alert": "" + }, + "text": { + "silence-alert-rule": "Potlačit pravidlo výstrahy" + } + } + }, "no-alert-managers-available": { "body-no-alertmanager-found": "Nenašli jsme žádné externí správce výstrah a možná nemáte přístup k vestavěnému správci výstrah Grafana.", "title-no-alertmanager-found": "Nebyl nalezen žádný správce výstrah" @@ -1809,6 +2110,9 @@ "expressions": "Výrazy", "loading-data-sources": "Načítání zdrojů dat…", "manipulate-returned-queries-other-operations": "Spravujte data získaná z dotazů pomocí matematických a dalších operací.", + "message": { + "a-valid-expression-is-required": "" + }, "no-compatible-sources": "Zdá se, že nemáte žádné kompatibilní zdroje dat", "title-deactivate-advanced-options": "Deaktivovat pokročilé možnosti", "title-queries-expressions-configured": "Nebyly nakonfigurovány žádné dotazy ani výrazy" @@ -1860,7 +2164,8 @@ }, "recording-rules": { "description-target-data-source": "Zdroj dat Prometheus, do kterého se uloží pravidla záznamu", - "label-target-data-source": "Cílový zdroj dat" + "label-target-data-source": "Cílový zdroj dat", + "target-data-source-required": "" }, "recording-rules-name-space-and-group-step": { "description-select-namespace-group-recording": "Vyberte jmenný prostor a skupinu pro pravidlo záznamu.", @@ -2127,6 +2432,9 @@ "collapse-all": "Sbalit vše", "expand-all": "Rozbalit vše" }, + "rule-list-v2": { + "import-to-gma": "" + }, "rule-modify-export": { "text-loading-the-rule": "Načítání pravidla…", "title-cannot-exist": "Pravidlo nelze načíst. Pravidlo neexistuje", @@ -2206,6 +2514,10 @@ "label-saved-searches": "Uložená hledání" }, "health": "Kondice", + "label": { + "hide": "Skrýt", + "show": "Zobrazit" + }, "manage-alerts": "V těchto zdrojích dat můžete prostřednictvím uživatelského rozhraní upozorňování vybrat možnost Správa upozorňování. Odtud můžete spravovat tato pravidla výstrah v uživatelském rozhraní Grafana i ve zdroji dat, kde byla nakonfigurována.", "placeholder-all-data-sources": "Všechny zdroje dat", "plugin-rules": "Pravidla pluginu", @@ -2302,6 +2614,9 @@ "label-comment": "Komentář", "label-created-by": "Autor", "label-duration": "Doba trvání", + "message": { + "required": "" + }, "placeholder-whos-creating-the-silence": "Kdo vytváří potlačení", "save-silence": "Uložit potlačení", "saving": "Ukládání…" @@ -2340,6 +2655,12 @@ "title-alert-rule-types": "Typy pravidel výstrahy" }, "state-history": { + "columns": { + "label": { + "state": "Stav", + "time": "Čas" + } + }, "filter-group": "Skupina filtrů", "filter-group-tooltip": "Filtrujte každou skupinu historie stavů podle přesné shody nebo regulárního výrazu, například:", "placeholder-search": "Hledat", @@ -2379,6 +2700,9 @@ "label-examples-documentation": "Příklady dokumentace", "label-template-group": "Skupina šablony", "label-template-group-name": "Název skupiny šablon", + "message": { + "required": "" + }, "new-template-name-placeholder-give-your-template-group-a-name": "Pojmenujte skupinu šablony", "title-error-saving-template": "Chyba při ukládání šablony", "title-templating-cheat-sheet": "Předloha pro tvorbu šablon" @@ -2401,6 +2725,11 @@ "existing-templates-selector-aria-label-choose-notification-template": "Vyberte šablonu oznámení", "existing-templates-selector-placeholder-choose-notification-template": "Vyberte šablonu oznámení", "loading": "Načítání…", + "template-options": { + "label": { + "select-notification-template": "" + } + }, "tooltip-copy": "Zkopírujte vybranou šablonu oznámení do schránky. Můžete ji použít ve vlastní záložce." }, "templates": { @@ -2503,10 +2832,39 @@ } }, "use-columns": { + "columns": { + "label": { + "alert-rule-targeted": "", + "alerts-silenced": "", + "health": "Kondice", + "matching-labels": "Shodné štítky", + "name": "Název", + "schedule": "Naplánovat", + "state": "Stav", + "time-range": "Časový rozsah" + } + }, + "label": { + "actions": "Akce", + "created": "Vytvořeno", + "group": "Skupina", + "labels": "Štítky", + "next-evaluation": "Další hodnocení", + "state": "Stav", + "summary": "Shrnutí" + }, "title-edit": "Upravit", "title-recreate": "Znovu vytvořit", "title-unsilence": "Zrušit potlačení" }, + "use-combined-labels": { + "grouped-options": { + "label": { + "from-alerts": "", + "from-system": "" + } + } + }, "use-create-dropdown-menu-actions": { "label-delete": "Odstranit", "label-edit": "Upravit", @@ -2540,6 +2898,17 @@ "title-edit-notification-policy": "Upravit zásadu oznamování" } }, + "use-page-nav": { + "page-nav": { + "text": { + "details": "Podrobnosti", + "history": "Historie", + "instances": "Instance", + "query-and-conditions": "", + "versions": "Verze" + } + } + }, "use-state-history-modal": { "state-history-modal": { "title-state-history": "Zobrazit historii" @@ -2560,6 +2929,36 @@ "body": "Obsah YAML v editoru zahrnuje pouze konfiguraci pravidla výstrahy <1></1>Chcete-li nakonfigurovat Prometheus, musíte poskytnout zbytek <4>obsahu konfiguračního souboru.</4>" } }, + "alertlist": { + "group-by": { + "aria-label-group-by-label-keys": "", + "placeholder-group-by": "Seřadit podle" + }, + "ungrouped-mode-view": { + "active-for": "", + "aria-label-view-alert-rule": "", + "view-alert-rule": "" + }, + "unified-alert-list": { + "clear": "Vymazat", + "text-loading": "Načítání…" + }, + "unified-alert-list-panel": { + "body-permission-required": "", + "title-permission-required": "" + } + }, + "annolist": { + "anno-list-panel": { + "aria-label-remove-filter": "", + "filter": "", + "loading": "Načítání…", + "no-annotations-found": "" + }, + "annotation-list-item": { + "tooltip-created-by": "" + } + }, "annotations": { "annotation-field-mapper": { "annotation": "Anotace", @@ -2656,6 +3055,11 @@ "configuration-required": "Vyžadována konfigurace", "refer-documentation-configure-authentication": "Postup konfigurace ověřování naleznete v dokumentaci" }, + "field-map": { + "label": { + "none": "Žádné" + } + }, "fields": { "allow-assign-grafana-admin-description": "", "allow-assign-grafana-admin-label": "", @@ -2759,7 +3163,18 @@ "use-refresh-token-description": "", "use-refresh-token-label": "", "validate-hosted-domain-description": "", - "validate-hosted-domain-label": "" + "validate-hosted-domain-label": "", + "workload-identity-token-file-description": "", + "workload-identity-token-file-label": "", + "workload-identity-token-file-required": "" + }, + "get-page-nav": { + "subTitle": { + "configure-authentication-providers": "" + }, + "text": { + "authentication": "Ověření" + } }, "provider-card": { "text-badge-enabled": "Povoleno", @@ -2795,6 +3210,12 @@ "auth-config-auth-config-page-unconnected": { "subtitle": "Spravujte nastavení ověření a konfigurujte jednotné přihlašování. Další informace najdete v naší <2>dokumentaci</2>." }, + "barchart": { + "tick-spacing-editor": { + "content-require-space-from-the-right-side": "", + "label-rtl": "" + } + }, "bookmarks-page": { "empty": { "message": "Zdá se, že jste dosud nevytvořili žádné záložky", @@ -2933,11 +3354,199 @@ "text-this-repository-is-read-only": "Pokud máte přímý přístup k cíli, zkopírujte JSON a vložte ho tam." }, "canvas": { + "apieditor": { + "label-endpoint": "", + "label-header-parameters": "", + "label-method": "Metoda", + "label-payload": "Datový obsah", + "label-query-parameters": "Parametry dotazu", + "render-test-apibutton": { + "test-api": "", + "title-test-api": "" + } + }, + "button-item": { + "label": { + "center": "", + "left": "", + "right": "" + }, + "placeholder": { + "auto": "Automaticky" + } + }, + "button-style-editor": { + "label-variant": "Varianta" + }, + "canvas-context-menu": { + "close-editor": "", + "open-editor": "", + "render-menu-items": { + "add-item-menu-item": { + "label-add-item": "" + }, + "edit-element-menu-item": { + "label-edit": "Upravit" + }, + "label-bring-to-front": "", + "label-delete": "Odstranit", + "label-duplicate": "Duplikovat", + "label-send-to-back": "", + "set-background-menu-item": { + "label-set-background": "" + } + } + }, + "cloud-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automaticky" + } + }, + "ellipse-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automaticky" + } + }, + "inline-edit": { + "canvas-inline-editor": "", + "tooltip-close-inline-editor": "" + }, + "inline-edit-body": { + "label-add-item": "", + "please-select-an-element": "" + }, + "line-style-editor": { + "label-animate": "" + }, + "metric-value-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automaticky" + } + }, "not-found-display": { "not-found": "<0>Nenalezeno: </0><config />" }, + "pan-zoom-help": { + "ctrl-right-mouse": "", + "middle-mouse": "", + "pan-title": "", + "reset-double-click": "", + "title-pan-and-zoom-controls": "", + "zoom-scroll-wheel": "" + }, + "parallelogram-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automaticky" + } + }, + "params-editor": { + "aria-label-add": "Přidat", + "aria-label-delete": "Odstranit", + "placeholder-key": "Klíč", + "placeholder-value": "Hodnota" + }, + "placement-editor": { + "label-constraints": "", + "label-position": "", + "loading": "Načítání…" + }, + "quick-positioning": { + "tooltip-align-bottom": "", + "tooltip-align-horizontal-centers": "", + "tooltip-align-left": "", + "tooltip-align-right": "", + "tooltip-align-top": "", + "tooltip-align-vertical-centers": "" + }, + "rectangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automaticky" + } + }, "text-display": { "double-click-to-set": "Dvojklikem nastavíte text" + }, + "text-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automaticky" + } + }, + "tree-navigation-editor": { + "clear-selection": "Vymazat výběr", + "frame-selection": "", + "label-add-item": "", + "missing-layer": "", + "no-settings": "", + "switcher-icon": { + "title-node-icon": "" + } + }, + "tree-node-title": { + "title-duplicate": "Duplikovat", + "title-remove": "Odebrat", + "tooltip-duplicate": "Duplikovat", + "tooltip-remove": "Odebrat" + }, + "triangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automaticky" + } } }, "carousel": { @@ -3017,6 +3626,22 @@ } }, "connections": { + "add-new-connection": { + "filter-by-options": { + "label": { + "all": "Vše", + "installed": "Nainstalované", + "new-updates": "" + } + }, + "label": { + "by-downloads": "", + "by-name-az": "", + "by-name-za": "", + "by-published-date": "", + "by-updated-date": "" + } + }, "advisor-redirect-notice": { "aria-label-link-to-advisor": "Odkaz na poradce", "body": "Vyzkoušejte nového poradce a odhalte potenciální problémy se zdroji dat a pluginy.", @@ -3033,6 +3658,22 @@ "body": "Zdroje dat mají nový domov! Na stránce Připojení, která je dostupná přímo z hlavní nabídky, si můžete prohlížet nové zdroje dat nebo spravovat ty stávající.", "go-to-connections": "Přejít na Připojení" }, + "data-source-details-page": { + "subTitle": { + "datasource-could-found": "" + }, + "text": { + "unknown-datasource": "" + } + }, + "new-data-source-page": { + "subTitle": { + "choose-a-data-source-type": "" + }, + "text": { + "add-data-source": "Přidat zdroj dat" + } + }, "no-access-modal": { "connection-contact-grafana-admin": "Chcete-li přidat nové připojení, obraťte se na správce Grafany.", "editor-warning": "Editoři nemohou přidávat nová připojení. Zkontrolujte, jestli je již nakonfigurováno ve <2>Zdrojích dat</2>.", @@ -3045,6 +3686,18 @@ "search": { "aria-label-search-all": "Hledat vše", "placeholder": "Hledat vše" + }, + "use-data-source-settings-nav": { + "node": { + "subTitle": { + "data-source-error": "" + } + }, + "page-nav": { + "text": { + "data-source-nav-node": "" + } + } } }, "core": { @@ -3340,6 +3993,11 @@ "title-plugin-dashboard": "Plugin nástěnky" }, "dash-nav": { + "on-open-snapshot-original": { + "title": { + "proceed-to-external-site": "" + } + }, "render-left-actions": { "text-public": "Veřejná", "tooltip-view-as-scene": "Zobrazit jako scénu" @@ -3351,11 +4009,26 @@ "dashboard-loading": { "cancel-loading-dashboard": "Zrušit načítání nástěnky" }, + "dashboard-page-error": { + "text": { + "not-found": "Nenalezeno" + } + }, "dashboard-settings": { "actions": { "close": "Zavřít" } }, + "dashboard-slice": { + "title": { + "dashboard-init-failed": "" + } + }, + "dashboard-srv": { + "message": { + "edit-dashboard-json": "" + } + }, "dashboard-validation": { "body-dashboard-failed-schema-validation": "Validace je poskytována pro účely vývoje a mělo by být bezpečné ji ignorovat. Pokud jste vývojář Grafany, zvažte kontrolu a aktualizaci schématu nástěnky", "title-checking-dashboard-validity": "Kontrola platnosti nástěnky", @@ -3451,6 +4124,13 @@ "values": "Hodnoty oddělené čárkou", "values-placeholder": "1, 10, mykey : myvalue, myvalue, escaped, value" }, + "datasource-options": { + "name-filter": "", + "name-filter-description": "", + "name-filter-placeholder": "", + "type": "Typ", + "type-placeholder": "" + }, "description": "Popis", "description-placeholder": "Popisný text", "label": "Štítek", @@ -3469,8 +4149,8 @@ "category": "Možnosti výběru", "custom-all-value": "Vlastní hodnota všeho", "custom-all-value-description": "Zástupný regulární výraz nebo jiná hodnota reprezentující vše", - "include-all": "Zahrnout možnost Vše", - "include-all-description": "Povoluje možnost zahrnout všechny hodnoty", + "include-all": "", + "include-all-description": "", "multi-value": "Vícehodnotové" }, "type-category": "Možnosti {{type}}" @@ -3496,14 +4176,97 @@ "errors": { "failed-to-load": "Nástěnku se nepodařilo načíst" }, + "fetch-dashboard": { + "message": { + "failed-to-fetch-dashboard": "" + } + }, "gen-aihistory": { "aria-label-send-custom-feedback": "Odeslat vlastní zpětnou vazbu", "footer-text": "Tento obsah je generován umělou inteligencí pomocí <2>pluginu Grafana LLM</2>", "placeholder-tell-ai-what-to-do-next": "Řekněte AI, co má dělat dál…" }, + "general-settings-unconnected": { + "editable-options": { + "label": { + "editable": "Upravitelné", + "readonly": "" + } + } + }, + "get-debug-dashboard": { + "title": { + "annotations": "Vysvětlivky" + } + }, + "get-errors": { + "message": { + "error-loading-data": "" + } + }, "get-field-override-categories": { "label-add-field-override": "Přidat přepsání pole", - "label-add-override-property": "Přidat vlastnost přepsání" + "label-add-override-property": "Přidat vlastnost přepsání", + "title": { + "add-button": "" + } + }, + "get-library-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "Informace", + "name": "Název" + } + }, + "get-library-viz-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "Informace", + "name": "Název" + } + }, + "get-panel-editor-tabs": { + "text": { + "alert": "", + "query": "Dotaz", + "transform-data": "" + } + }, + "get-panel-frame-category": { + "descriptor": { + "title": { + "panel-options": "Možnosti panelu" + } + }, + "direction-options": { + "label": { + "horizontal": "Horizontální", + "vertical": "Vertikální" + } + }, + "title": { + "description": "Popis", + "max-per-row": "Max. počet na řádek", + "panel-links": "Propojení panelů", + "repeat-by-variable": "Opakovat podle proměnné", + "repeat-direction": "Opakovat směr", + "repeat-options": "Možnosti opakování", + "title": "Název", + "transparent-background": "Průhledné pozadí" + } + }, + "get-panel-menu": { + "text": { + "extensions": "" + } }, "help-wizard": { "copy-to-clipboard": "Kopírovat do schránky", @@ -3516,10 +4279,21 @@ "randomize-field-names-label-field-names": "Názvy polí", "randomize-labels-label-labels": "Štítky", "randomize-string-values-label-string-values": "Hodnoty řetězců", + "tabs": { + "label": { + "data": "Data", + "snapshot": "Snímek" + } + }, "title-complete-git-hub-comment-clipboard": "Kopírovat celý komentář na GitHubu do schránky", "title-get-help-with-this-panel": "Získat nápovědu k tomuto panelu", "troubleshooting-docs": "Dokumenty pro řešení problémů" }, + "init-dashboard": { + "message": { + "failed-create-dashboard-model": "" + } + }, "inspect": { "data-tab": "Data", "error-tab": "Chyba", @@ -3572,6 +4346,16 @@ "rows": "Celkový počet řádků", "table-title": "Statistiky" }, + "k8s-dashboard-api": { + "title": { + "deleted": "" + } + }, + "k8s-dashboard-v2api": { + "title": { + "deleted": "" + } + }, "layout": { "common": { "copy": "Kopírovat", @@ -3584,6 +4368,13 @@ "panel-layout-disabled": "Vyberte řádek nebo záložku pro změnu možností rozvržení panelu" } }, + "legacy-dashboard-api": { + "fetch-error": { + "message": { + "dashboard-not-found": "" + } + } + }, "make-editable": { "dashboard-not-editable": "Nástěnku není možné upravovat", "make-editable": "Nastavit jako upravitelné" @@ -3603,6 +4394,20 @@ "menu-use-library-panel": "Použít panel knihovny" }, "new-panel-title": "Nový panel", + "on-create-new-row": { + "new-row": { + "title": { + "row-title": "" + } + } + }, + "on-create-new-widget-panel": { + "new-panel": { + "title": { + "widget-title": "" + } + } + }, "options": { "description": "Popis", "title-option": "Název" @@ -3664,6 +4469,30 @@ "paused": "Tato nástěnka byla pozastavena správcem", "try-again-later": "Zkuste to později znovu" }, + "remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, + "repeat-row-select": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, + "repeat-row-select2": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, "revert-dashboard-modal": { "body-restore-version": "Opravdu chcete obnovit nástěnku na verzi {{version}}? Veškeré neuložené změny budou ztraceny.", "title-restore-version": "Obnovit verzi" @@ -3777,6 +4606,18 @@ "sub-menu-un-connected": { "aria-label-template-variables": "Proměnné šablony" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "tabs-layout": { "delete-tab-text": "Odstraněním této záložky dojde také k odebrání všech panelů. Opravdu chcete pokračovat?", "delete-tab-title": "Odstranit záložku?", @@ -3982,7 +4823,10 @@ }, "unthemed-dashboard-row": { "aria-label-delete-row": "Odstranit řádek", - "learn-more": "Zjistěte víc" + "learn-more": "Zjistěte víc", + "title": { + "delete-row": "Odstranit řádek" + } }, "validation": { "invalid-dashboard-id": "Nelze najít platné ID na Grafana.com", @@ -4017,6 +4861,16 @@ }, "visualization-select-pane": { "placeholder-search-for": "Hledat…", + "radio-options": { + "description": { + "reusable-panels-share-between-multiple-dashboards": "" + }, + "label": { + "library-panels": "Panely knihovny", + "suggestions": "", + "visualizations": "" + } + }, "title-close": "Zavřít" }, "viz-panel": { @@ -4067,12 +4921,25 @@ "label-data-source": "Zdroj dat", "label-use-static-key-dimensions": "Použít dimenze statického klíče" }, + "add-to-dashboard": { + "message": { + "could-navigate-selected-dashboard-please-again": "", + "could-panel-dashboard-please-again": "" + } + }, "add-to-dashboard-form": { "cancel": "Zrušit", "description-choose-where-to-add-the-panel": "Vyberte, kam chcete panel přidat.", "description-select-which-dashboard-panel-created": "Vyberte, na které nástěnce bude vytvořen panel.", + "label": { + "existing-dashboard": "Existující nástěnka", + "new-dashboard": "Nová nástěnka" + }, "label-dashboard": "Nástěnka", "label-target-dashboard": "Cílová nástěnka", + "message": { + "this-field-is-required": "Toto pole je povinné." + }, "open-dashboard": "Otevřít nástěnku", "open-in-new-tab": "Otevřít v nové záložce", "title-error-adding-the-panel": "Chyba při přidávání panelu" @@ -4110,6 +4977,25 @@ "it-cannot-contain-or": "Nemůže obsahovat „//“ nebo „..“.", "least-valid-character": "Musí mít alespoň jeden platný znak." }, + "build-new-dashboard-save-model": { + "data": { + "title": { + "new-dashboard": "Nová nástěnka" + } + } + }, + "build-new-dashboard-save-model-v2": { + "data": { + "title": { + "new-dashboard": "Nová nástěnka" + } + } + }, + "config-public-dashboard": { + "title": { + "revoke-public-url": "Odvolat veřejnou adresu URL" + } + }, "constant-variable-form": { "constant-options": "Možnosti konstanty", "label-value": "Hodnota", @@ -4157,22 +5043,89 @@ "value-not-saved": "Hodnota ještě není uložena v databázi Grafany", "view-pull-request-in-git-hub": "Zobrazit pull request v GitHubu" }, + "dashboard-scene": { + "text": { + "edit-panel": "", + "view-panel": "Zobrazit panel" + }, + "title": { + "dashboard": "Nástěnka", + "discard-changes-to-dashboard": "" + } + }, + "dashboard-scene-page-state-manager": { + "message": { + "dashboard-not-found": "" + } + }, + "dashboard-scene-page-state-manager-v2": { + "message": { + "dashboard-not-found": "" + } + }, "data-source-variable-form": { "data-source-options": "Možnosti zdroje dat", "description-instance-name-filter": "Filtr regulárních výrazů, pro které můžete vybrat instance zdroje dat v seznamu hodnot proměnných. Ponechte prázdné pro vše.", "example-instance-name-filter": "Příklad: <codeExample />", "selection-options": "Možnosti výběru" }, + "default-grid-layout-manager": { + "row": { + "title": { + "row-title": "" + } + } + }, "description-label": { "description": "Popis" }, + "edit-link-view": { + "edit-link-page-nav": { + "text": { + "edit-link": "Upravit odkaz" + } + } + }, "email-list": { "aria-label-emailmenu": "Přepnout e-mailovou nabídku" }, + "embedded-dashboard-test-page": { + "subTitle": { + "showing-dashboard-panel-tests-pie-chart": "" + }, + "text": { + "embedding-dashboard": "" + } + }, "empty-transformations-message": { "add-transformation": "Přidat transformaci" }, + "get-edit-options": { + "title": { + "column-options": "", + "row-height-options": "" + } + }, + "get-panel-frame-options": { + "descriptor": { + "title": { + "panel-options": "Možnosti panelu" + } + }, + "title": { + "description": "Popis", + "panel-links": "Propojení panelů", + "title": "Název", + "transparent-background": "Průhledné pozadí" + } + }, + "get-workflow-options": { + "label": { + "push-to-a-new-branch": "" + } + }, "group-by-variable-form": { + "alert-not-supported": "", "description-enables-users-custom-values": "Umožňuje uživatelům přidávat vlastní hodnoty do seznamu", "description-provide-dimensions-as-csv-dimension-name-dimension-id": "Zadejte rozměry ve formátu CSV: {{name}}, {{value}}", "group-by-options": "Možnosti Seřadit podle", @@ -4191,6 +5144,12 @@ "randomize-field-names-label-field-names": "Názvy polí", "randomize-labels-label-labels": "Štítky", "randomize-string-values-label-string-values": "Hodnoty řetězců", + "tabs": { + "label": { + "data": "Data", + "snapshot": "Snímek" + } + }, "title-complete-git-hub-comment-clipboard": "Kopírovat celý komentář na GitHubu do schránky", "title-get-help-with-this-panel": "Získat nápovědu k tomuto panelu", "troubleshooting-docs": "Dokumenty pro řešení problémů", @@ -4235,6 +5194,14 @@ "body-name-already-exists": "Ve vybrané složce už existuje nástěnka se stejným názvem. Chcete přesto tuto nástěnku uložit?", "title-name-already-exists": "Název již existuje" }, + "on-remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, "panel-data-alerting-tab-rendered": { "alert": { "title-errors-loading-rules": "Chyby při načítání pravidel" @@ -4256,6 +5223,11 @@ "table-view-aria-label-toggletableview": "Přepnout zobrazení tabulky", "table-view-label-table-view": "Zobrazení tabulky" }, + "panel-editor": { + "text": { + "edit-panel": "" + } + }, "panel-editor-renderer": { "aria-label-open-options-pane": "Otevřít podokno možností", "tooltip-open-options-pane": "Otevřít podokno možností" @@ -4264,8 +5236,22 @@ "body-panel-plugin-not-loaded": "Před zahájením kontroly se ujistěte, že panel, který chcete zkontrolovat, je viditelný a byl zobrazen.", "title-panel-plugin-not-loaded": "Plugin panelu nebyl načten" }, + "panel-menu-behavior": { + "async-func": { + "text": { + "extensions": "", + "metrics-drilldown": "" + } + } + }, "panel-viz-type-picker": { "placeholder-search-for": "Hledat…", + "radio-options": { + "label": { + "suggestions": "", + "visualizations": "" + } + }, "title-close": "Zavřít" }, "provisioned-delete-modal": { @@ -4292,6 +5278,15 @@ "query-options": "Možnosti dotazu", "selection-options": "Možnosti výběru" }, + "resource-export": { + "label": { + "classic": "", + "json": "JSON", + "v1-resource": "", + "v2-resource": "", + "yaml": "" + } + }, "revert-dashboard-modal": { "body-restore-version": "Opravdu chcete obnovit nástěnku na verzi {{version}}? Veškeré neuložené změny budou ztraceny.", "title-restore-version": "Obnovit verzi" @@ -4402,6 +5397,18 @@ "solo-panel-page": { "loading": "Načítání" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "text-box-variable-form": { "placeholder-default-value-if-any": "(volitelné)", "text-options": "Možnosti textu" @@ -4412,6 +5419,13 @@ "title-field-label": { "title": "Název" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "transformations-drawer": { "search-box-suffix": { "tooltip-clear-search": "Vymazat vyhledávání" @@ -4427,6 +5441,13 @@ "save-dashboard": "Uložit nástěnku", "title-unsaved-changes": "Neuložené změny" }, + "use-dashboard-edit-page-nav": { + "page-nav": { + "text": { + "settings": "Nastavení" + } + } + }, "variable-check-indicator": { "aria-label-variable-referenced-dashboard": "Na tuto proměnnou neodkazuje žádná proměnná ani nástěnka.", "aria-label-variable-referenced-other-variables-dashboard": "Na tuto proměnnou odkazují jiné proměnné nebo nástěnka.", @@ -4443,7 +5464,10 @@ "placeholder-descriptive-text": "Popisný text", "placeholder-label-name": "Název štítku", "placeholder-variable-name": "Název proměnné", - "text-running-query": "Spouštění dotazu…" + "text-running-query": "Spouštění dotazu…", + "title": { + "delete-variable": "Odstranit proměnnou" + } }, "variable-editor-list": { "definition": "Definice", @@ -4625,6 +5649,25 @@ "message": "Nebyly nalezeny žádné zdroje dat" } }, + "datagrid": { + "add-column": { + "placeholder-column-name": "" + }, + "datagrid-context-menu": { + "render-context-menu-items": { + "label-clear-column": "", + "label-clear-row": "", + "label-remove-all-data": "", + "label-search": "Vyhledávání…" + }, + "render-header-menu-items": { + "label-clear-column": "", + "label-delete-column": "", + "label-rename-column": "", + "label-set-field-type": "" + } + } + }, "datasources": { "add-new-data-source-button": { "tooltip-no-permission": "Nemáte oprávnění ke konfiguraci nových zdrojů dat" @@ -4646,6 +5689,46 @@ "label-default": "Výchozí", "label-name": "Název" }, + "build-categories": { + "categories": { + "title": { + "cloud": "", + "distributed-tracing": "", + "enterprise-plugins": "Pluginy Enterprise", + "industrial-io-t": "", + "logging-document-databases": "", + "others": "", + "profiling": "", + "sql": "", + "time-series-databases": "" + } + } + }, + "build-nav-model": { + "analytics": { + "text": { + "insights": "观察" + } + }, + "caching": { + "text": { + "cache": "" + } + }, + "ds-permissions": { + "text": { + "permissions": "Oprávnění" + } + }, + "nav-model": { + "text": { + "settings": "Nastavení" + } + }, + "text": { + "dashboards": "Nástěnky" + } + }, "button-row": { "delete": "Odstranit", "save-and-test": "Uložit a otestovat", @@ -4681,6 +5764,11 @@ "data-source-read-only-message": { "title-provisioned-data-source": "Zajištěný zdroj dat" }, + "data-source-settings-reducer": { + "message": { + "testing-could-couple-minutes": "" + } + }, "data-source-type-card": { "aria-label-learn-more": "{{dataSourcePluginName}}, zjistěte víc." }, @@ -4698,13 +5786,88 @@ "footer": { "add-csv-or-spreadsheet": "Přidat soubor CSV nebo tabulku" }, + "get-enterprise-phantom-plugins": { + "description": { + "adobe-analytics-datasource": "", + "app-dynamics-integration-and-data-source": "", + "atlassian-statuspage-datasource": "", + "aurora-data-source": "", + "azure-cosmos-db-datasource": "", + "azure-devops-datasource": "", + "catchpoint-datasource": "", + "cloudflare-datasource": "", + "cockroach-db-datasource": "", + "data-dog-integration-and-data-source": "", + "drone-datasource": "", + "git-lab-integration-and-datasource": "", + "honeycomb-integration-and-datasource": "", + "jira-integration-and-datasource": "", + "logic-monitor-devices-datasource": "", + "mongo-db-integration-and-data-source": "", + "netlify-datasource": "", + "new-relic-integration-and-data-source": "", + "pager-duty-datasource": "", + "salesforce-integration-and-datasource": "", + "sap-hana-integration-and-data-source": "", + "service-now-integration-and-data-source": "", + "signal-fx-integration-and-datasource": "", + "snowflake-integration-and-data-source": "", + "sumo-logic-integration-and-datasource": "", + "visualize-and-explore-dynatrace-data": "", + "visualize-and-explore-oracle-sql": "", + "visualize-and-explore-splunk-logs": "", + "wavefront-integration-and-data-source": "", + "zendesk-datasource": "" + } + }, + "get-grafana-cloud-phantom-plugin": { + "description": { + "hosted-graphite-prometheus-and-loki": "" + } + }, "new-data-source-view": { "cancel": "Zrušit", "placeholder-filter-by-name-or-type": "Filtrovat podle názvu nebo typu" }, + "update-data-source": { + "error-info": { + "message": { + "an-unexpected-error-occurred": "" + } + } + }, "use-data-source-info": { "badge-text-not-supported": "Nepodporováno", - "badge-text-supported": "Podporováno" + "badge-text-supported": "Podporováno", + "label": { + "alerting": "Výstrahy", + "type": "Typ" + } + }, + "use-delete-loaded-data-source": { + "title": { + "delete": "Odstranit" + } + } + }, + "debug": { + "cursor-view": { + "no-events-yet": "" + }, + "render-info-viewer": { + "data-counter": "", + "elapsed-time": "", + "field": "Pole", + "last": "", + "render-counter": "", + "schema-counter": "", + "title-reset-counters": "", + "tooltip-step-back": "", + "type": "Typ" + }, + "state-view": { + "current-value": "", + "label-state-name": "" } }, "dimensions": { @@ -4773,6 +5936,19 @@ "remove-value-mapping-aria-label-delete-value-mapping": "Odstranit mapování hodnoty", "remove-value-mapping-tooltip-delete": "Odstranit", "set-color": "Nastavit barvu", + "special-match-options": { + "description": { + "boolean-false-values": "", + "boolean-true-values": "", + "empty-string": "", + "matches-against-number-na-n-not-a-number": "", + "matches-null-and-undefined-values": "", + "matches-null-undefined-and-na-n": "" + }, + "label": { + "empty": "Prázdný" + } + }, "tooltip-remove-color": "Odebrat barvu", "tooltip-remove-icon": "Odebrat ikonu" }, @@ -4788,6 +5964,20 @@ "display-text": "Zobrazit text", "icon": "Ikona", "label-add-a-new-mapping": "Přidat nové mapování", + "mapping-types": { + "description": { + "match-a-numerical-range-of-values": "", + "match-a-regular-expression-with-replacement": "", + "match-a-specific-text-value": "", + "match-boolean-empty-values": "" + }, + "label": { + "range": "", + "regex": "", + "special": "", + "value": "Hodnota" + } + }, "update": "Aktualizovat" } }, @@ -4812,6 +6002,7 @@ }, "explore": { "accordian-logs": { + "events": "", "footer": "Časová razítka událostí jsou relativní k času zahájení celé stopy." }, "accordian-references": { @@ -4822,6 +6013,11 @@ "basic-extensions": { "aria-label-add": "Přidat" }, + "build-dashboard-panel-from-explore-state": { + "title": { + "new-panel": "" + } + }, "clear": "Vymazat", "confirm-navigation-modal": { "cancel": "Zrušit", @@ -4908,6 +6104,33 @@ "title-table": "Tabulka", "title-traces": "Stopy" }, + "explore-query-inspector": { + "data-tab": { + "label": { + "data": "Data" + } + }, + "error-tab": { + "label": { + "error": "Chyba" + } + }, + "json-tab": { + "label": { + "json": "JSON" + } + }, + "query-tab": { + "label": { + "query": "Dotaz" + } + }, + "stats-tab": { + "label": { + "stats": "Statistiky" + } + } + }, "explore-run-query-button": { "run-button": { "aria-label-run-query-options": "Spustit možnosti dotazu" @@ -4921,10 +6144,23 @@ "description-explore-disabled": "Chcete-li povolit možnost Prozkoumat, povolte ji v konfiguraci Grafany:", "title-explore-disabled": "Možnost Prozkoumat je zakázána" }, + "get-field-links-for-explore": { + "text": { + "data": "Data", + "raw-value": "" + } + }, "get-matches-metadata": { "matches": "0 shod" }, "legacy-create-span-link-factory": { + "text": { + "tags": "Tagy" + }, + "title": { + "related-logs": "", + "session-for-this-span": "Relace pro tento rozsah" + }, "title-explore-metrics-for-this-span": "Prozkoumat metriky pro tento rozsah", "title-explore-split": "Prozkoumat protokoly k tomuto tématu v rozděleném zobrazení", "title-session-for-this-span": "Relace pro tento rozsah" @@ -4965,6 +6201,10 @@ }, "logs-meta-row": { "download": "Stáhnout", + "label": { + "deduplication-count": "", + "showing-only-selected-fields": "" + }, "show-original-line": "Zobrazit původní řádek" }, "logs-sample-panel": { @@ -5146,6 +6386,21 @@ "run-query-button": "Spustit dotaz", "switch-datasource-button": "Přepnout zdroj dat a spustit dotaz" }, + "scoped-vars-from-span": { + "text": { + "span": "" + } + }, + "scoped-vars-from-tags": { + "text": { + "tags": "Tagy" + } + }, + "scoped-vars-from-trace": { + "text": { + "trace": "Trasovat" + } + }, "search-bar-input": { "placeholder-find": "Najít…", "suffix": { @@ -5180,9 +6435,25 @@ "tooltip-tag-key": "Klíč tagu, který bude použit k získání hodnoty tagu. Atributy a zdroje rozsahu budou vyhledány pro klíč tagu" }, "span-detail": { + "label": { + "kind": "", + "library-name": "", + "library-version": "", + "status": "Stav:", + "status-message": "", + "trace-state": "" + }, "label-resource-attributes": "Atributy zdroje", "label-span-attributes": "Atributy rozsahu", "label-stack-trace": "Trasování zásobníku", + "overview-items": { + "label": { + "child-count": "", + "duration": "", + "service": "", + "start-time": "" + } + }, "warnings": "Varování" }, "span-filters": { @@ -5289,6 +6560,18 @@ "title-node-graph": "Graf uzlu" }, "unthemed-logs": { + "description": { + "show-results-in-logs-visualisation": "", + "show-results-in-table-visualisation": "", + "show-results-newest-to-oldest": "", + "show-results-oldest-to-newest": "" + }, + "label": { + "logs": "Protokoly", + "newest-first": "Seřadit od nejnovějších", + "oldest-first": "Seřadit od nejstarších", + "table": "Tabulka" + }, "label-deduplication": "Deduplikace", "label-display-results": "Zobrazit výsledky", "label-prettify-json": "Zkrášlit JSON", @@ -5304,6 +6587,15 @@ }, "unthemed-virtualized-trace-view": { "title-scroll-to-top": "Posunout nahoru" + }, + "use-focus-span-link": { + "create-focus-span-link": { + "link": { + "title": { + "deep-link-to-this-span": "" + } + } + } } }, "export": { @@ -5389,6 +6681,15 @@ "folder-repo": { "badge-text": "Zajištěno" }, + "folders": { + "get-loading-nav": { + "main": { + "title": { + "loading": "Načítání" + } + } + } + }, "forgot-password": { "back-button": "Zpět na přihlášení", "change-password": { @@ -5418,10 +6719,102 @@ "incomplete-request-error": "Je mi líto, ale vaši žádost se mi nepodařilo dokončit. Zkuste to znovu.", "send-custom-feedback": "Odeslat" }, + "geomap": { + "coordinates-map-view-editor": { + "label-latitude": "", + "label-longitude": "" + }, + "debug-overlay": { + "center": "", + "zoom": "" + }, + "fit-map-view-editor": { + "all-layers-editor-fragment": { + "label-layer": "" + }, + "label-data": "Data", + "last-only-editor-fragment": { + "label-padding": "", + "tooltip-padding-relative-percent-beyond-extent": "" + } + }, + "frame-multi-selection-editor": { + "placeholder-change-filter": "" + }, + "frame-selection-editor": { + "placeholder-change-filter": "" + }, + "geomap-panel": { + "aria-label-map": "" + }, + "geomap-style-rules-editor": { + "aria-label-add-geomap-style-rule": "" + }, + "layers-editor": { + "label-add-layer": "", + "no-layers": "" + }, + "map-view-editor": { + "label-max-zoom": "", + "label-view": "Zobrazit", + "label-zoom": "Přiblížení", + "use-current-map-settings": "" + }, + "markers-legend": { + "title-symbol": "Symbol" + }, + "measure-overlay": { + "tooltip-show-measure-tools": "" + }, + "plugin": { + "basemap-layer-configured-server-admin": "" + }, + "style-editor": { + "label-align": "", + "label-baseline": "", + "label-color": "Barva", + "label-fill-opacity": "", + "label-font-size": "", + "label-opacity": "", + "label-rotation-angle": "", + "label-size": "", + "label-symbol": "Symbol", + "label-symbol-horizontal-align": "", + "label-symbol-vertical-align": "", + "label-text-label": "", + "label-x-offset": "", + "label-y-offset": "" + }, + "style-rule-editor": { + "aria-label-comparison-operator": "Operátor porovnání", + "aria-label-comparison-value": "", + "aria-label-delete-style-rule": "", + "aria-label-feature-property": "", + "label-rule": "Pravidlo", + "placeholder-feature-property": "", + "placeholder-numeric-value": "", + "placeholder-value": "hodnota" + } + }, "get-enterprise": { "requires-license": "Vyžaduje licenci Grafana Enterprise", "title": "Enterprise" }, + "gettingstarted": { + "docs-card": { + "complete": "dokončit", + "learn-how": "" + }, + "getting-started": { + "aria-label-to-advanced-tutorials": "", + "aria-label-to-basic-tutorials": "", + "checking-completed-setup-steps": "", + "remove-this-panel": "" + }, + "tutorial-card": { + "complete": "dokončit" + } + }, "gops": { "config-card": { "text-loading-configuration": "Načítání konfigurace…" @@ -5438,6 +6831,74 @@ }, "progress-status": { "your-progress": "Váš postup" + }, + "use-get-configuration-for-ui": { + "get-connect-data-source-configuration": { + "title": { + "connect-data-source": "" + } + }, + "title": { + "essentials": "Nezbytnosti" + } + }, + "use-get-essentials-configuration": { + "essential-content": { + "description": { + "configure-grafana-alerting": "", + "create-integration-alerting-contact-point": "", + "initialize-incident-plugin-declare-manage-incidents": "", + "practice-solving-an-incident": "", + "receive-alerts-oncall-notifications-within-environment": "", + "select-chat-ops-channels-to-route-notifications": "" + }, + "label": { + "add": "Přidat", + "connect": "Připojit", + "initialize": "", + "select-integration": "", + "start-drill": "" + }, + "title": { + "add-slack-notifications-to-irm-integrations": "", + "connect-alerting-to-irm": "", + "connect-irm-to-your-slack-workspace": "", + "connect-your-messaging-workspace-to-incident": "", + "connect-your-messaging-workspace-to-on-call": "", + "create-incident-drill": "", + "detect": "Detekovat", + "initialize-incident-plugin": "", + "messaging-workspace-channel-on-call-integration": "", + "respond": "", + "test-your-configuration": "" + } + }, + "get-grafana-alerting-config-steps": { + "description": { + "create-alert-monitor-system": "", + "create-on-call-integration-alerting-contact-point": "", + "create-slos-to-monitor-your-service": "" + }, + "label": { + "connect": "Připojit", + "create": "Vytvořit", + "enable": "Povolit" + }, + "steps": { + "label": { + "edit": "Upravit" + }, + "title": { + "update-default-contact-point": "" + } + }, + "title": { + "connect-alerting-to-on-call": "", + "create-alert-rule": "", + "create-slo": "", + "enable-slo-alerting": "" + } + } } }, "grafana": { @@ -5804,14 +7265,18 @@ "duplicate-panel": "Duplikovat panel", "exit-edit/setting-views": "Ukončit zobrazení úprav/nastavení", "expand-all-rows": "Rozbalit všechny řádky", + "explore-panel": "", "go-to-dashboards": "Přejít na nástěnky", "go-to-explore": "Přejít na kartu Prozkoumat", "go-to-home-dashboard": "Přejít na domovskou nástěnku", "go-to-profile": "Přejít na profil", + "inspect-panel": "", "make-time-range-permanent": "Nastavit absolutní/trvalý časový rozsah", "move-time-range-back": "Přesunout časový rozsah dozadu", "move-time-range-forward": "Přesunout časový rozsah dopředu", "open-search": "Otevřít vyhledávání", + "open-share-embed-drawer": "", + "open-share-link-drawer": "", "open-shared-modal": "Sdílet snímek panelu", "paste-time-range": "Vložit časový rozsah", "refresh-all-panels": "Obnovit všechny panely", @@ -5837,6 +7302,11 @@ "support-bundle": "Balíček podpory obsahující informace ohledně vaší instance Grafana a nakonfigurovaných zdrojů dat můžete také získat v části <1>Balíčky podpory</1>.", "troubleshooting-help": "Chcete-li požádat o pomoc s řešením problémů, odešlete snímek tohoto panelu technické podpoře Grafana Labs. Snímek obsahuje data odpovědi na dotaz a nastavení panelu." }, + "histogram": { + "histogram-panel": { + "no-histogram-found-in-response": "" + } + }, "inspector": { "inspect-data-tab": { "loading": "Načítání", @@ -5890,6 +7360,9 @@ "label-name": "Název", "label-password": "Heslo", "label-username": "Uživatelské jméno", + "message": { + "email-is-invalid": "" + }, "placeholder-name-optional": "Název (nepovinné)", "placeholder-password": "Heslo", "placeholder-username": "Uživatelské jméno", @@ -6155,8 +7628,26 @@ "discard-local-changes": "Zahodit místní změny", "title-dashboard-changed": "Nástěnka byla změněna" }, + "live-channel-editor": { + "description-grafana-live": "", + "namespace": "Jmenný prostor", + "path": "Cesta", + "placeholder-select-watchable-resource": "", + "scope": "", + "title-grafana-live": "" + }, "live-connection-warning": { "title-connection-to-server-is-lost": "Spojení se serverem bylo přerušeno…" + }, + "live-panel": { + "error": "Chyba", + "grafana-requires-feature": "", + "panel-editor-channel": "", + "title-grafana-live": "", + "waiting-for-data": "" + }, + "live-publish": { + "publish": "" } }, "lock-icon": "ikona zámku", @@ -6203,6 +7694,13 @@ } }, "logs": { + "get-dataframe-fields": { + "vars": { + "text": { + "labels": "Štítky" + } + } + }, "infinite-scroll": { "end-of-range": "Konec vybraného časového rozsahu.", "load-more": "Posunutím načtete další", @@ -6283,6 +7781,11 @@ "shortcut": "ALT + výběr pro opětovné povolení" } }, + "log-series-to-logs-model": { + "label": { + "total-bytes-processed": "" + } + }, "logs-controls": { "deduplication": "Deduplikace", "disable-highlighting": "Zakázat zvýraznění", @@ -6317,6 +7820,11 @@ "scroll-top": "Posunout nahoru", "start-of-range": "Začátek rozsahu" }, + "logs-panel": { + "render-common-labels": { + "common-labels": "" + } + }, "out-of-range-message": { "end-of-the-selected-time-range": "Konec vybraného časového rozsahu." }, @@ -6373,6 +7881,14 @@ }, "snapshot-list-table": { "title-delete": "Odstranit" + }, + "unthemed-dashboard-import": { + "subTitle": { + "import-dashboard-from-file-or-grafanacom": "" + }, + "text": { + "import-dashboard": "Importovat nástěnku" + } } }, "migrate-to-cloud": { @@ -7030,8 +8546,63 @@ "close": "Zavřít zásuvku" }, "link-title": "Přejít na blog Grafana Labs", + "news-panel": { + "body-error-loading-rss-feed": "", + "loading": "Načítání…", + "title-error-loading-rss-feed": "" + }, "title": "Novinky z blogu" }, + "nodeGraph": { + "arc-options-editor": { + "add-arc": "", + "title-remove-arc": "" + }, + "edge": { + "aria-label-from-to": "" + }, + "edge-header": { + "label-source-target": "" + }, + "marker": { + "100-node-count": "", + "aria-label-hidden-marker": "", + "node-count_one": "", + "node-count_few": "", + "node-count_many": "", + "node-count_other": "" + }, + "node": { + "aria-label-node-title": "" + }, + "node-graph": { + "aria-label-layered-layout-performance-warning": "", + "aria-label-nodes-hidden-warning": "", + "computing-layout": "", + "no-data": "Žádná data", + "hidden-nodes_one": "", + "hidden-nodes_few": "", + "hidden-nodes_many": "", + "hidden-nodes_other": "", + "processed-nodes_one": "", + "processed-nodes_few": "", + "processed-nodes_many": "", + "processed-nodes_other": "" + }, + "node-graph-panel": { + "no-data-found-in-response": "" + }, + "node-header": { + "label-subtitle": "", + "label-title": "Název" + }, + "view-controls": { + "hide-config": "", + "show-config": "", + "title-zoom-in": "", + "title-zoom-out": "" + } + }, "notifications": { "empty-state": { "description": "Oznámení, která jste obdrželi, se zobrazí tady", @@ -7073,6 +8644,11 @@ "label-organization-name": "Název organizace", "placeholder-org-name": "Název organizace" }, + "org-details-page": { + "title": { + "confirm-preferences-update": "" + } + }, "org-profile": { "label-organization-name": "Název organizace", "label-organization-profile": "Profil organizace", @@ -7092,7 +8668,10 @@ "tooltip": "Teď můžete vybrat možnost „Žádná základní role“ a přidat oprávnění k vlastním potřebám. Více informací najdete v <1>naší dokumentaci</1>." }, "user-invite-page": { - "sub-title": "Pošlete pozvánku nebo přidejte stávajícího uživatele Grafany do organizace.<1> {{orgName}}</1>" + "sub-title": "Pošlete pozvánku nebo přidejte stávajícího uživatele Grafany do organizace.<1> {{orgName}}</1>", + "text": { + "invite-user": "" + } } }, "org-picker": { @@ -7104,6 +8683,38 @@ } }, "panel": { + "get-calculation-value-data-links-variable-suggestions": { + "value-calc-var": { + "label": { + "calculation-name": "" + } + } + }, + "get-data-links-variable-suggestions": { + "value-time-var": { + "label": { + "time": "Čas" + } + } + }, + "get-field-links-supplier": { + "text": { + "data": "Data", + "field": "Pole", + "series": "", + "value": "Hodnota" + } + }, + "get-field-vars": { + "label": { + "name": "Název" + } + }, + "get-panel-links-variable-suggestions": { + "label": { + "all-variables": "" + } + }, "header-menu": { "copy": "Kopírovat", "create-library-panel": "Vytvořit panel knihovny", @@ -7164,6 +8775,13 @@ "select-placeholder": "Filtrovat podle typu" }, "playlist": { + "playlist-new-page": { + "page-nav": { + "text": { + "new-playlist": "Nový playlist" + } + } + }, "playlist-table-rows": { "aria-label-playlist-item": "Položka playlistu, {{itemType}}, {{itemValue}}", "multiple-dashboards-found": "Bylo nalezeno více položek: {{items}}", @@ -7180,6 +8798,12 @@ "label-mode": "Režim", "label-time-and-refresh": "Načasovat a obnovit", "label-variables": "Proměnné", + "modes": { + "label": { + "kiosk": "Kiosek", + "normal": "Normální" + } + }, "title-start-playlist": "Spustit playlist" } }, @@ -7246,6 +8870,19 @@ }, "browse": { "aria-label-plugin-type-filter": "Filtr typu pluginu", + "filter-by-options": { + "label": { + "all": "Vše", + "installed": "Nainstalované", + "new-updates": "" + } + }, + "label": { + "all": "Vše", + "applications": "", + "data-sources": "Zdroje dat", + "panels": "Panely" + }, "label-search": "Hledat", "label-state": "Stav", "label-type": "Typ", @@ -7327,12 +8964,24 @@ "empty-state": { "message": "Nebyly nalezeny žádné pluginy" }, + "extensions-log-data-source": { + "message": { + "ok": "OK" + } + }, "filter": { "disabled": "Tento filtr byl zakázán, protože server Grafana nemá přístup ke grafana.com", "sort": "Třídit", "sort-list": "Třídit seznam pluginů", "state": "Stav" }, + "get-feature-state-info": { + "text": { + "alpha": "", + "beta": "Beta", + "deprecated": "Zastaralé" + } + }, "get-started-with-app": { "disable": "Deaktivovat", "enable": "Povolit" @@ -7389,6 +9038,16 @@ "plugin-details-header-dependencies": { "grafana-dependency": "Grafana {{grafanaDependency}}" }, + "plugin-details-page": { + "not-found-model": { + "subTitle": { + "requested-belong-plugin": "" + }, + "text": { + "unknown-plugin": "" + } + } + }, "plugin-details-signature": { "body-invalid-plugin-signature": "Grafana Labs kontroluje každý plugin, aby ověřila, že má platný digitální podpis. Ověření podpisu pluginu je součástí našich bezpečnostních opatření, abychom zajistili, že pluginy jsou bezpečné a důvěryhodné. Grafana Labs nemůže zaručit integritu tohoto nepodepsaného pluginu. Vyzvěte autora pluginu, aby požádal o podepsání.", "read-more-about-plugins-signing": "Zjistěte víc o podepisování pluginů.", @@ -7434,6 +9093,13 @@ "search-field": { "placeholder-search-grafana-plugins": "Hledat pluginy Grafana" }, + "use-plugin-details-tabs": { + "nav-model-children": { + "text": { + "dashboards": "Nástěnky" + } + } + }, "version-install-button": { "text-installed": "Nainstalované" }, @@ -7553,6 +9219,11 @@ "label-git-hub-features": "Funkce GitHubu", "label-realtime-feedback": "Zpětná vazba v reálném čase" }, + "connect-page": { + "subTitle": { + "connect-external-storage-manage-resources": "" + } + }, "connect-repository-button": { "configure": "Konfigurovat", "configure-file": "Konfigurovat zajištění souborů", @@ -7586,7 +9257,13 @@ }, "edit-repository-page": { "back-to-repositories": "Zpět na úložiště", - "repository-config-exists-configuration": "Ujistěte se, že konfigurace úložiště existuje v konfiguračním souboru." + "repository-config-exists-configuration": "Ujistěte se, že konfigurace úložiště existuje v konfiguračním souboru.", + "subTitle": { + "configure-repository-storing-resources": "" + }, + "text": { + "configure-repository": "" + } }, "empty-state": { "no-jobs": "Žádné úlohy…" @@ -7649,6 +9326,11 @@ "no-results-matching-your-query": "Vašemu dotazu neodpovídají žádné výsledky", "placeholder-search": "Hledat" }, + "get-default-values": { + "title": { + "repository": "Úložiště" + } + }, "getting-started": { "alert-temporary-outage": "Když připojíte celou instanci, nástěnky nebudou během migrace k dispozici. Doporučujeme uživatele před zahájením procesu varovat.", "modal-description-public-access": "Nastavte veřejný přístup k vaší instanci Grafana pro povolení integrace GitHubu", @@ -7793,7 +9475,18 @@ "dashboard-preview": "Náhled nástěnky", "existing-dashboard": "Existující nástěnka", "history": "Historie", + "message": { + "removed-from-repo-test-ui": "", + "updated-from-repo-test-ui": "" + }, "repository": "Úložiště", + "tab-info": { + "label": { + "dry-run-result-after-apply": "", + "existing-from-grafana": "", + "file-from-repository": "" + } + }, "title-error-saving-file": "Chyba při ukládání souboru" }, "setup-modal": { @@ -8214,14 +9907,6 @@ "reload-button": "Znovu načíst", "title": "Soubor aplikace nelze najít" }, - "sandbox": { - "test-stuff-page": { - "application-notifications-toasts-testing": "Testování aplikačních (vyskakovacích) oznámení", - "error": "Chyba", - "success": "Úspěch", - "warning": "Varování" - } - }, "save-dashboards": { "message-length": { "info": "Zpráva obsahuje {{messageLength}} znaků, maximální délka je 500 znaků. Před uložením ji zkraťte.", @@ -8281,6 +9966,14 @@ "view-as-folders": "Zobrazit podle složek", "view-as-list": "Zobrazit jako seznam" }, + "bluge-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } + }, "dashboard-actions": { "import": "Importovat", "new": "Nové", @@ -8308,6 +10001,14 @@ "search-results-table": { "aria-label-search-results-table": "Hledat tabulku výsledků", "no-data": "Žádné hodnoty" + }, + "unified-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } } }, "select": { @@ -8379,6 +10080,11 @@ "delete-service-account": "Odstranit účet služby", "disable-service-account": "Zakázat účet služby", "enable-service-account": "Povolit účet služby", + "page-nav": { + "subTitle": { + "manage-settings-individual-service-account": "" + } + }, "title-delete-service-account": "Odstranit účet služby", "title-disable-service-account": "Zakázat účet služby", "tokens": "Tokeny", @@ -8695,6 +10401,14 @@ "sort-picker": { "select-aria-label": "Třídit" }, + "status-history": { + "status-history-panel": { + "too-many-points_one": "", + "too-many-points_few": "", + "too-many-points_many": "", + "too-many-points_other": "" + } + }, "support-bundles": { "new-bundle-button": { "new-support-bundle": "Nový balíček podpory" @@ -8702,7 +10416,10 @@ "support-bundles-create-unconnected": { "cancel": "Zrušit", "create": "Vytvořit", - "sub-title": "Vyberte komponenty balíčku podpory. Balíček podpory bude k dispozici po dobu 3 dnů od vytvoření." + "sub-title": "Vyberte komponenty balíčku podpory. Balíček podpory bude k dispozici po dobu 3 dnů od vytvoření.", + "text": { + "create-support-bundle": "" + } }, "support-bundles-unconnected": { "created-on": "Vytvořeno", @@ -8717,10 +10434,35 @@ "login": "Přihlášení" }, "table": { + "auto-cell-options-editor": { + "description-wrap-text": "", + "label-wrap-text": "" + }, + "bar-gauge-cell-options-editor": { + "label-gauge-display-mode": "", + "label-value-display": "" + }, + "color-background-cell-options-editor": { + "description-apply-to-entire-row": "", + "description-wrap-text": "", + "label": { + "text-alpha": "" + }, + "label-apply-to-entire-row": "", + "label-background-display-mode": "", + "label-wrap-text": "", + "wrap-text": "" + }, "container": { "content": "Zobrazení příliš mnoha sloupců v jedné tabulce může ovlivnit výkon a zhoršit čitelnost dat. Zvažte upřesnění dotazů.", "show-all-series": "Zobrazit všechny sloupce", "show-only-series": "Zobrazuje se pouze {{MAX_NUMBER_OF_COLUMNS}} sloupců" + }, + "image-cell-options-editor": { + "description-alt-text": "", + "description-title-text": "", + "label-alt-text": "", + "label-title-text": "" } }, "tag-filter": { @@ -8736,6 +10478,24 @@ "select-placeholder": "Vyberte tým" }, "teams": { + "build-nav-model": { + "nav-model": { + "subTitle": { + "manage-members-and-settings": "" + }, + "text": { + "settings": "Nastavení" + } + }, + "team-group-sync": { + "text": { + "external-group-sync": "Synchronizace externí skupiny" + } + }, + "text": { + "members": "Členové" + } + }, "create-team": { "create": "Vytvořit", "description-email": "Toto je volitelné a používá se především k povolení vlastních týmových avatarů", @@ -8757,6 +10517,9 @@ "external-group-sync": "Synchronizace externí skupiny", "label-add-external-group": "Přidat externí skupinu", "team-sync-upgrade": "Přidejte skupinu a povolte týmovou synchronizaci zdarma během zkušební verze Grafana Pro", + "text": { + "add-group": "Přidat skupinu" + }, "title-there-external-groups": "Neexistují žádné externí skupiny pro synchronizaci", "tooltip-add-external-group": "Příklad skupiny LDAP: {{example}}" }, @@ -8858,6 +10621,42 @@ "select-search-input": "Zadejte pro vyhledávání (země, město, zkratka)" } }, + "timeseries": { + "annotation-editor2": { + "add-annotation": "Přidat vysvětlivku", + "cancel": "Zrušit", + "edit-annotation": "", + "label-description": "Popis", + "label-tags": "Tagy", + "placeholder-add-tags": "", + "save": "Uložit", + "saving": "Ukládání" + }, + "annotation-tooltip2": { + "tooltip-delete": "Odstranit", + "tooltip-edit": "Upravit" + }, + "line-style-editor": { + "title-the-input-expects-a-segment-list": "", + "tooltip-help": "Nápověda" + }, + "nulls-threshold-input": { + "placeholder-never": "Nikdy" + }, + "outside-range-plugin": { + "data-outside-time-range": "", + "zoom-to-data": "" + }, + "timezones-editor": { + "tooltip-add-timezone": "", + "tooltip-remove-timezone": "" + } + }, + "traces": { + "traces-panel": { + "no-data-found-in-response": "" + } + }, "transformations": { "empty": { "add-transformation-body": "Transformace umožňují měnit data různými způsoby před zobrazením vaší vizualizace.<1></1>To zahrnuje spojování dat, přejmenování polí, provádění výpočtů, formátování dat pro zobrazení a další.", @@ -8894,6 +10693,10 @@ "convert-field-type-transformer-editor": { "aria-label-add-a-convert-field-type-transformer": "Přidat transformátor typu pole konverze", "aria-label-remove-convert-field-type-transformer": "Odebrat transformátor typu pole konverze", + "label": { + "browser": "Prohlížeč", + "utc": "" + }, "label-as": "jako", "label-date-format": "Formát data", "label-field": "Pole", @@ -8980,11 +10783,32 @@ "tooltip-format": "Výstupní formát pro pole zadané jako <2>řetězec formátu Moment.js</2>.", "tooltip-timezone-manually": "Nastavit časové pásmo data manuálně" }, + "get-timezone-options": { + "label": { + "browser": "Prohlížeč", + "utc": "" + } + }, "get-tooltips": { "description": "Platná cesta objektu json.", "json-value": "Hodnota JSON:", + "map-valid-paths": { + "description": { + "extract-fields-from-object": "", + "extract-value": "", + "extract-value-first-element": "", + "extract-value-second-element": "" + } + }, "valid-paths": "Platné cesty:" }, + "get-transformer-option-pane": { + "root": { + "title": { + "root": "" + } + } + }, "group-by-field-configuration": { "placeholder-ignored": "Ignorováno", "placeholder-select-stats": "Vyberte statistiky" @@ -9001,7 +10825,23 @@ "label-cell-value": "Hodnota buňky", "label-column": "Sloupec", "label-empty-value": "Prázdná hodnota", - "label-row": "Řádek" + "label-row": "Řádek", + "special-value-options": { + "description": { + "boolean-false-value": "", + "boolean-true-value": "", + "empty-string": "", + "null-value": "", + "number-value": "" + }, + "label": { + "empty": "Prázdný", + "false": "", + "null": "", + "true": "", + "zero": "" + } + } }, "histogram-transformer-editor": { "placeholder-auto": "Automaticky", @@ -9064,10 +10904,22 @@ "tooltip-naming": "Nastavuje způsob zobrazování názvů vybraných polí. Název snímku je obvykle lepší pro tabulková data" }, "partition-by-values-editor": { + "keep-fields-options": { + "label": { + "no": "Ne", + "yes": "Ano" + } + }, "label-field": "Pole", "label-keep-fields": "Ponechat pole", "label-naming": "Pojmenování", "label-select-field": "Vyberte pole", + "naming-modes-options": { + "label": { + "as-frame-name": "", + "as-label": "" + } + }, "partition-values-works-single-frame": "Rozdělení podle hodnot funguje jenom s jedním snímkem.", "tooltip-keeps-partition-fields-frames": "Udržuje pole oddílů ve snímcích" }, @@ -9089,6 +10941,16 @@ "label-include-time": "Zahrnout čas", "label-labels-to-fields": "Štítky k polím", "label-mode": "Režim", + "modes": { + "description": { + "collapse-field-single-value": "", + "create-table-series-value": "" + }, + "label": { + "reduce-fields": "", + "series-to-rows": "" + } + }, "placeholder-choose-stat": "Vyberte statistiku" }, "regex-matcher-editor": { @@ -9096,11 +10958,23 @@ "variable-regex-documentation": "" }, "regression-transformer-editor": { + "label": { + "cubic": "", + "quadratic": "", + "quartic": "", + "quintic": "" + }, "label-degree": "titul", "label-model-type": "Typ modelu", "label-predicted-points": "Předpovězené body", "label-x-field": "Pole X", "label-y-field": "Pole Y", + "model-type-options": { + "label": { + "linear": "", + "polynomial": "" + } + }, "tooltip-number-of-xy-points-to-predict": "Počet bodů X, Y k předpovědi" }, "rename-by-regex-transformer-editor": { @@ -9118,6 +10992,23 @@ "label-reverse": "Dozadu", "placeholder-select-field": "Vyberte pole" }, + "supplier": { + "description": { + "apply-spatial-operations-to-the-geometry": "", + "create-a-line-between-two-points": "", + "geometry-define-field-headingdistancearea": "" + }, + "label": { + "area": "", + "as-line": "", + "calculate-value": "", + "distance": "", + "heading": "", + "line-builder": "", + "prepare-spatial-field": "", + "transform": "" + } + }, "time-series-table-transform-editor": { "label-stat": "Statistika", "label-time-field": "Pole času", @@ -9151,7 +11042,19 @@ "placeholder-auto": "Automaticky", "placeholder-field": "Pole", "tooltip-window-size": "Délka okna", - "tooltip-window-size-percent": "Nastavit velikost okna jako procento celkových dat" + "tooltip-window-size-percent": "Nastavit velikost okna jako procento celkových dat", + "type-options": { + "label": { + "centered": "", + "trailing": "" + } + }, + "window-size-mode-options": { + "label": { + "fixed": "", + "percentage": "" + } + } } }, "upgrade-box": { @@ -9208,6 +11111,11 @@ }, "users-action-bar-unconnected": { "invite": "Pozvat", + "options": { + "label": { + "users": "Uživatelé" + } + }, "placeholder-search-login-email": "Hledat uživatele podle přihlašovacího jména, e-mailu nebo jména" } }, @@ -9251,6 +11159,32 @@ "confirm-delete-modal": { "title-delete-variable": "Odstranit proměnnou" }, + "create-ad-hoc-variable-adapter": { + "description": { + "add-keyvalue-filters-on-the-fly": "" + } + }, + "create-custom-variable-adapter": { + "description": { + "define-variable-values-manually": "" + } + }, + "create-interval-variable-adapter": { + "description": { + "define-timespan-interval": "" + } + }, + "create-query-variable-adapter": { + "description": { + "variable-values-fetched-datasource-query": "" + } + }, + "data-source-variable-slice": { + "text": { + "default": "", + "no-data-sources-found": "Nebyly nalezeny žádné zdroje dat" + } + }, "empty-state": { "button-title": "Přidat proměnnou", "info-box-content": "Proměnné umožňují interaktivnější a dynamičtější nástěnky. Namísto pevného kódování parametrů, jako jsou názvy serverů nebo senzorů, můžete ve svých dotazech na metriky použít proměnné. Proměnné jsou zobrazeny jako seznamy v horní části nástěnky. Tyto rozevírací seznamy usnadňují změnu dat zobrazovaných na nástěnce.", @@ -9277,6 +11211,13 @@ "placeholder-default-value-if-any": "výchozí hodnota, pokud existuje", "text-options": "Možnosti textu" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "unknown-table": { "loading": "Načítání…", "no-unknowns": "Nebyly nalezeny žádné přejmenované nebo chybějící proměnné.", @@ -9333,5 +11274,25 @@ "data-hover-view": { "link": "Odkaz" } + }, + "welcome": { + "welcome-banner": { + "need-help": "Potřebujete pomoc?", + "welcome-to-grafana": "" + } + }, + "xychart": { + "series-editor": { + "add-series": "", + "aria-label-select-series": "", + "label-color-field": "", + "label-frame": "Obrazový rám", + "label-size-field": "", + "label-x-field": "Pole X", + "label-y-field": "Pole Y", + "placeholder-all-frames": "", + "placeholder-select-frame": "", + "tooltip-delete-series": "" + } } } \ No newline at end of file diff --git a/public/locales/de-DE/grafana.json b/public/locales/de-DE/grafana.json index 9e2c394928b..1c472d93750 100644 --- a/public/locales/de-DE/grafana.json +++ b/public/locales/de-DE/grafana.json @@ -72,6 +72,11 @@ }, "admin-edit-org-page": { "label-name": "Name", + "page-nav": { + "subTitle": { + "manage-settings-roles-organization": "" + } + }, "render-missing-permission-message": { "title-access-denied": "Zugriff verweigert" } @@ -233,6 +238,13 @@ "upgrade-info": { "title": "Enterprise-Lizenz" }, + "user-admin-page": { + "page-nav": { + "subTitle": { + "manage-settings-for-an-individual-user": "" + } + } + }, "user-create-page": { "label-email": "E-Mail-Adresse", "label-name": "Name", @@ -243,9 +255,16 @@ "label-ldap": "LDAP" }, "user-list-admin-page-un-connected": { + "label": { + "active-last-days": "", + "all-users": "Alle Nutzer" + }, "placeholder-search-login-email": "Nutzer nach Login, E-Mail-Adresse oder Name suchen." }, "user-list-anonymous-devices-page-un-connected": { + "label": { + "active-last-days": "" + }, "placeholder-search-devices-by-ip-address": "Geräte anhand der IP-Adresse suchen." }, "user-list-page": { @@ -364,6 +383,12 @@ "no-grouping": "Keine Gruppierung" }, "alert-group-alerts-table": { + "columns": { + "label": { + "instance-labels": "", + "notification-state": "Benachrichtigungsstatus" + } + }, "duration": "für {{time}}" }, "alert-group-filter": { @@ -443,6 +468,11 @@ "description-section": "Geben Sie einen Namen ein, um Ihr {{entityName}} zu identifizieren.", "label-metric": "Metrik", "label-name": "Name", + "message": { + "must-enter-a-metric-name": "", + "must-enter-a-name": "", + "please-select-a-data-source": "Bitte wählen Sie eine Datenquelle aus" + }, "metric-aria-label-metric": "metrisch", "metric-placeholder-recorded-metric": "Geben Sie den Namen der neu aufgezeichneten Metrik an", "placeholder-name": "Geben Sie Ihrem {{namePlaceholder}} einen Namen", @@ -495,6 +525,9 @@ "alertmanager-config": { "gma-manual-configuration-description": "Die interne Grafana-Alertmanager-Konfiguration kann nicht manuell geändert werden. Bearbeiten Sie die individuellen Ressourcen über die Benutzeroberfläche, um diese Konfiguration zu ändern.", "gma-manual-configuration-is-not-supported": "Manuelle Konfigurationsänderungen werden nicht unterstützt", + "message": { + "configuration-cannot-be-empty": "" + }, "reset": "Zurücksetzen", "reset-confirmation": "Sind Sie sicher, dass Sie die Konfiguration für „{{alertmanagerName}}“ zurücksetzen möchten? Kontaktpunkte und Benachrichtigungsrichtlinien werden auf ihre Standardeinstellungen zurückgesetzt.", "resetting-configuration-might-while": "Konfiguration wird zurückgesetzt, dies kann etwas dauern.", @@ -584,6 +617,9 @@ "create-a-contact-point": "Kontaktpunkt erstellen", "label-default-contact-point": "Standard-Kontaktpunkt", "label-timing-options": "Timing-Optionen", + "message": { + "required": "" + }, "or": "oder" }, "am-routes-expanded-form": { @@ -605,11 +641,19 @@ "label-override-grouping": "Gruppierung überschreiben", "label-value": "Wert", "matching-labels": "Übereinstimmende Labels", + "message": { + "required": "" + }, "placeholder-label": "Label", "placeholder-value": "Wert", "remove": "Entfernen", "tooltip-remove-matcher": "Matcher entfernen" }, + "annotation-header-field": { + "message": { + "required": "" + } + }, "annotations": { "dashboard-annotation-field": { "dashboard": "Dashboard {{dashboardUid}}", @@ -681,6 +725,25 @@ "title": "Es können nicht alle Ereignisse angezeigt werden" } }, + "central-alert-history-scene": { + "scene": { + "labels-filter-variable": { + "label": { + "labels": "" + } + }, + "transitions-from-filter-variable": { + "label": { + "start-state": "" + } + }, + "transitions-to-filter-variable": { + "label": { + "end-state": "" + } + } + } + }, "channel-sub-form": { "delete": "Löschen", "duplicate": "Duplikat", @@ -717,11 +780,17 @@ }, "cloud-data-source-selector": { "label": "Datenquelle auswählen", - "label-disabled": "Datenquelle" + "label-disabled": "Datenquelle", + "message": { + "please-select-a-data-source": "Bitte wählen Sie eine Datenquelle aus" + } }, "cloud-evaluation-behavior": { "description-pending-period": "Zeitraum, in dem die Schwellenwertbedingung erfüllt sein muss, damit eine Warnung ausgelöst wird. Wenn Sie „Keine“ auswählen, wird die Warnung sofort ausgelöst, sobald die Bedingung erfüllt ist.", "label-pending-period": "Wartezeit", + "message": { + "must-be-a-positive-integer": "" + }, "title-set-evaluation-behavior": "Bewertungsverhalten festlegen" }, "cloud-receiver-form": { @@ -762,6 +831,9 @@ "contact-point-selector": { "aria-label-refresh-contact-points": "Kontaktpunkte aktualisieren", "contact-point-picker-label-contact-point": "Kontaktpunkt", + "message": { + "contact-point-is-required": "" + }, "title-failed-to-fetch-contact-points": "Kontaktpunkte konnten nicht abgerufen werden", "tooltip-refresh-contact-points-list": "Liste der Kontaktpunkte aktualisieren" }, @@ -828,6 +900,14 @@ }, "copy-to-clipboard": "„{{label}}“ in die Zwischenablage kopieren", "create-metadata": { + "label": { + "dashboard": "Dashboard", + "dashboard-and-panel": "", + "evaluation-interval": "Evaluierungsintervall", + "labels": "Labels", + "metric-name": "", + "runbook-url": "" + }, "view-dashboard": "Dashboard anzeigen", "view-panel": "Panel anzeigen" }, @@ -868,9 +948,6 @@ "title-search-panel": "Suchpanel", "title-select-dashboard-and-panel": "Dashboard und Panel auswählen" }, - "data-source-section": { - "import-to-grafana": "Zu Grafana-Regeln importieren" - }, "datasource-not-found": { "card-description": "Die Datenquelle für diese Abfrage wurde nicht gefunden. Sie wurde entweder entfernt oder nicht korrekt installiert.", "remove-query": "Abfrage entfernen", @@ -952,6 +1029,11 @@ "text-loading-template": "Vorlage wird geladen ...", "title-failed-to-fetch-notification-template": "Die Benachrichtigungsvorlage konnte nicht abgerufen werden" }, + "edit-mute-timing-page": { + "text": { + "edit-time-interval": "" + } + }, "editor": { "edit-alert-rule": "", "edit-recording-rule": "", @@ -965,6 +1047,11 @@ "error-summary-button": { "content-show-all-errors": "" }, + "evaluate-every-validation-options": { + "message": { + "required": "" + } + }, "evaluation-behavior-summary": { "evaluate": "", "label-evaluate": "Bewerten", @@ -982,6 +1069,9 @@ "evaluation-group-creation-modal": { "description-group-name": "Eine Gruppe bewertet ihre gesamten Regeln über das gleiche Bewertungsintervall.", "description-often-rules-group-evaluated": "Wie oft alle Regeln in der Gruppe bewertet werden.", + "message": { + "required": "" + }, "placeholder-enter-a-name": "Name eingeben", "title-new-evaluation-group": "Neue Evaluierungsgruppe" }, @@ -1004,12 +1094,24 @@ "title-permission-editrecreate-silence": "Sie sind nicht berechtigt, diese Stummschaltung zu bearbeiten/neu zu erstellen", "title-silence-not-found": "Vorhandene Stummschaltung „{{silenceId}}“ nicht gefunden" }, + "existing-silence-editor-page": { + "page-nav": { + "text": { + "edit-silence": "" + } + } + }, "export": { "subtitle": { "formats": "Wählen Sie das Format aus und laden Sie die Datei herunter oder kopieren Sie die Inhalte in die Zwischenablage", "one-format": "Laden Sie die Datei herunter oder kopieren Sie die Inhalte in die Zwischenablage" } }, + "export-new-grafana-rule-page": { + "text": { + "export-new-grafana-rule": "" + } + }, "export-new-rule-button": { "tooltip-export-new-grafana-rule": "Neue Grafana-Regel exportieren" }, @@ -1035,6 +1137,16 @@ "no-data": "Keine Daten", "page-counter": "" }, + "feature-toggle-page": { + "nav-model": { + "subTitle": { + "enable-alerting-grafana-config": "" + }, + "text": { + "alerting-is-not-enabled": "" + } + } + }, "federated-rule-warning": { "experimental": "Verbundene Regelgruppen sind momentan eine experimentelle Funktion.", "read-documentation": "Dokumentation lesen", @@ -1042,6 +1154,13 @@ }, "file-export-inline-documentation": { "api-provisioning": "{{name}} Format ist nur für die API-Bereitstellung gültig. <3>Lesen Sie mehr in den Dokumenten.</3>", + "export-inline-doc": { + "title": { + "apiprovisioning-format": "", + "fileprovisioning-format": "", + "terraformprovisioning-format": "" + } + }, "file-provisioning": "{{name}} Format ist nur für die Dateibereitstellung gültig. <3>Lesen Sie mehr in den Dokumenten.</3>", "terraform-provisioning": "{{name}} Format ist nur für die Terraform-Bereitstellung gültig. <3>Lesen Sie mehr in den Dokumenten.</3>" }, @@ -1049,6 +1168,20 @@ "copy-code": "Code kopieren", "download": "Download" }, + "filter-options": { + "label": { + "alert-rule": "Warnregel", + "all": "Alle", + "error": "Fehler", + "firing": "", + "no-data": "Keine Daten", + "normal": "Normal", + "ok": "OK", + "pending": "Ausstehend", + "recording-rule": "Aufnahmeregel", + "recovering": "Wird wiederhergestellt" + } + }, "filter-view-results": { "aria-label-filteredrulelist": "gefilterte Regelliste" }, @@ -1083,7 +1216,10 @@ } }, "folder-selector": { - "description-select-folder": "Wählen Sie einen Ordner, in dem Sie Ihre Regel speichern." + "description-select-folder": "Wählen Sie einen Ordner, in dem Sie Ihre Regel speichern.", + "message": { + "select-a-folder": "" + } }, "folderAndGroup": { "evaluation": { @@ -1098,15 +1234,88 @@ "for-input": { "description-pending": "Zeitraum, in dem die Schwellenwertbedingung erfüllt sein muss, damit eine Warnung ausgelöst wird. Wenn Sie „Keine“ auswählen, wird die Warnung sofort ausgelöst, sobald die Bedingung erfüllt ist." }, + "for-validation-options": { + "message": { + "required": "" + } + }, "generate-alert-data-modal": { "add-alert-data": "Warnungsdaten hinzufügen", "add-alert-data-to-payload": "Warnungsdaten zum Payload hinzufügen", + "alert-options": { + "label": { + "firing": "", + "resolved": "" + } + }, "review-alert-payload": " Überprüfen Sie Warnungsdaten, um sie der Nutzlast hinzuzufügen:", "title-add-custom-alerts": "Benutzerdefinierte Warnungen hinzufügen" }, + "get-alert-suggestions": { + "documentation": { + "annotations-attached-alert": "", + "fingerprint-identify-alert": "", + "grafana-external-alertmanager": "", + "organization-alert": "", + "time-the-alert-started-firing": "" + }, + "value": { + "labels-attached-alert": "", + "status-alert-firing-resolved": "" + } + }, + "get-cloud-scenes": { + "title": { + "mimir-alertmanager": "" + } + }, + "get-global-suggestions": { + "value": { + "an-array-containing-all-alerts": "" + } + }, + "get-grafana-alertmanager-scenes": { + "title": { + "grafana-alertmanager": "" + } + }, + "get-grafana-managed-scenes": { + "title": { + "grafanamanaged-alert-rules": "Von Grafana verwaltete Warnregeln" + } + }, + "get-mimir-managed-rules-per-group-scenes": { + "rule-group-handler": { + "label": { + "rule-group": "" + } + }, + "title": { + "mimirmanaged-alert-rules-per-rule-group": "" + } + }, + "get-mimir-managed-rules-scenes": { + "title": { + "mimirmanaged-alert-rules": "" + } + }, "get-preview-results": { "title-error": "Fehler" }, + "get-state-display-model": { + "text": { + "alerting": "", + "error": "", + "firing": "", + "inactive": "", + "no-data": "", + "ok": "OK", + "paused": "", + "pending": "", + "recovering": "", + "unknown": "" + } + }, "getting-stared": { "learn-more": "Eine praktische Einführung finden Sie in unserem <2>Tutorial für die ersten Schritte mit Grafana Alerting</2>" }, @@ -1148,6 +1357,10 @@ "label-disable-resolved-message": "Nachricht zur Behebung deaktivieren" }, "grafana-evaluation-behavior-step": { + "message": { + "must-be-a-positive-integer": "", + "must-enter-a-group-name": "" + }, "missing-series-resolve-placeholder": "Standard: 2", "or": "oder", "placeholder-select-an-evaluation-group": "Wählen Sie eine Bewertungsgruppe aus …", @@ -1164,6 +1377,11 @@ "body-invalid-rule-id": "Die Regel-UID in der Seiten-URL ist ungültig. Bitte überprüfen Sie den Link und versuchen Sie es erneut.", "title-invalid-rule-id": "Ungültige Regel-ID" }, + "grafana-modify-export-page": { + "text": { + "modify-export": "" + } + }, "grafana-mute-timing-exporter-preview": { "text-loading": "Lädt ...." }, @@ -1216,6 +1434,9 @@ }, "group-and-namespace-fields": { "group-picker-label-group": "Gruppe", + "message": { + "required": "" + }, "namespace-picker-label-namespace": "Namensraum" }, "group-by": { @@ -1272,14 +1493,19 @@ "header": { "tooltip-remove": "Ausdruck „{{refId}}“ entfernen" }, + "history-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "Erfolg" + } + }, "home": { "label-get-started": "Erste Schritte", "label-insights": "Insights", "title-alerting": "Meldungen" }, - "import-from-dsrules": { - "description-folder-import-rules": "Der Ordner, in den die Regeln importiert werden sollen" - }, "import-to-gma": { "action-button": "Importieren", "additional-settings": "Zusätzliche Einstellungen", @@ -1287,8 +1513,9 @@ "confirm-modal": { "confirm": "Importieren", "loading": "Wird geladen ...", - "loading-body": "Die Daten für den Import werden vorbereitet. Dies kann eine Weile dauern ...", + "loading-body": "", "no-rules-body": "Es gibt keine Regeln, die importiert werden könnten. Bitte wählen Sie einen anderen Namensraum oder eine andere Regelgruppe.", + "no-rules-body-yaml": "", "no-rules-title": "Keine Regeln zum Importieren", "plugin-rules-warning": { "text": "Wir haben festgestellt, dass einige Regeln über Plugins verwaltet werden. Diese Regeln werden nicht importiert.", @@ -1307,11 +1534,12 @@ "label": "Gruppe" }, "import-location-and-filters": "Standort und Filter importieren", + "import-source": "", "namespace": { "description": "Tippen Sie, um einen vorhandenen Namensraum zu suchen", "label": "Namensraum" }, - "pageTitle": "Warnregeln aus einer Datenquelle zu von Grafana verwalteten Regeln importieren", + "pageTitle": "", "pause": { "label": "Importierte Warnregeln pausieren" }, @@ -1319,10 +1547,26 @@ "label": "Importierte Aufnahmeregeln pausieren" }, "recording-rules": "Aufnahmeregeln", + "source": { + "datasource": "", + "datasource-description": "", + "yaml": "", + "yaml-description": "" + }, "success": "Die Warnregeln wurden erfolgreich zu von Grafana verwalteten Regeln importiert.", "target-folder": { + "description": "Der Ordner, in den die Regeln importiert werden sollen", "label": "Zielordner" - } + }, + "yaml": { + "description": "", + "label": "", + "required-message": "", + "target-datasource": "Zieldatenquelle", + "target-datasource-description": "", + "target-datasource-required": "" + }, + "yaml-error": "" }, "insights": { "monitor-status-of-system": "Überwachen Sie den Status Ihres Systems", @@ -1398,6 +1642,9 @@ "text-loading-existing-labels": "Vorhandene Labels werden geladen" }, "labels-without-suggestions": { + "message": { + "required": "" + }, "placeholder-key": "Key", "placeholder-value": "Wert" }, @@ -1437,6 +1684,24 @@ "log-record-viewer-by-timestamp": { "aria-label-state-history-by-timestamp": "Statusverlauf nach Zeitstempel" }, + "log-timeline-viewer": { + "label": { + "firing": "", + "mixed": "", + "no-data": "", + "normal": "Normal", + "pending": "Ausstehend", + "recovering": "Wird wiederhergestellt" + } + }, + "loki-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "Erfolg" + } + }, "loki-state-history": { "clear-filters": "Filter zurücksetzen", "common-labels": "Allgemeine Labels", @@ -1449,6 +1714,14 @@ "button": "Berechtigungen verwalten", "title": "Berechtigungen verwalten" }, + "manual-and-automatic-routing": { + "routing-options": { + "label": { + "select-contact-point": "", + "use-notification-policy": "" + } + } + }, "matcher-filter": { "filter-alerts-using-label-querying-without-braces": "Filtern Sie Warnungen mithilfe von Labels, ohne Klammern zu verwenden, z. B.:", "filter-alerts-using-label-querying-without-spaces": "Filtern Sie Warnungen mithilfe von Label-Abfragen, ohne Leerzeichen; Beispiel:", @@ -1466,6 +1739,9 @@ "label-operator": "Bediener", "label-refine-affected-alerts": "Betroffene Warnungen optimieren", "label-value": "Wert", + "message": { + "required": "" + }, "placeholder-label": "Label", "placeholder-value": "Wert", "remove": "Entfernen", @@ -1497,6 +1773,16 @@ "aria-label": "Mehr", "button-text": "Mehr" }, + "multiple-data-source-picker": { + "get-data-source-options": { + "grouped-options": { + "label": { + "data-sources-with-configured-alert-rules": "", + "other-data-sources": "" + } + } + } + }, "mute-timing-actions-buttons": { "text-disabled": "Deaktiviert", "title-delete-mute-timing": "Stummschaltung löschen" @@ -1560,11 +1846,26 @@ "read-more": "Lesen Sie mehr über Benachrichtigungsrichtlinien.", "title-notification-routing": "Benachrichtigungs-Routing" }, + "new-mute-timing-page": { + "text": { + "add-time-interval": "" + } + }, "new-rule-from-panel-button": { "body-no-alerting-capable-query-found": "Über dieses Panel können keine Warnungen erstellt werden, da keine Abfrage an eine Datenquelle, die für Warnungen geeignet ist, gefunden wurde.", "new-alert-rule": "Neue Warnregel", "title-no-alerting-capable-query-found": "Keine für Benachrichtigungen geeignete Abfrage gefunden" }, + "new-silence-page": { + "page-nav": { + "subTitle": { + "configure-silences-notifications-particular-alert": "" + }, + "text": { + "silence-alert-rule": "Warnregel stummschalten" + } + } + }, "no-alert-managers-available": { "body-no-alertmanager-found": "Wir konnten keine externen Alertmanager finden. Möglicherweise haben Sie keinen Zugriff auf den integrierten Alertmanager von Grafana.", "title-no-alertmanager-found": "Kein Alertmanager gefunden" @@ -1791,6 +2092,9 @@ "expressions": "Ausdrücke", "loading-data-sources": "Datenquellen werden geladen ...", "manipulate-returned-queries-other-operations": "Manipulieren Sie Daten, die von Abfragen mit mathematischen und anderen Operationen zurückgegeben werden.", + "message": { + "a-valid-expression-is-required": "" + }, "no-compatible-sources": "Anscheinend haben Sie keine kompatiblen Datenquellen", "title-deactivate-advanced-options": "Erweiterte Optionen deaktivieren", "title-queries-expressions-configured": "Es wurden keine Abfragen oder Ausdrücke konfiguriert" @@ -1842,7 +2146,8 @@ }, "recording-rules": { "description-target-data-source": "Die Prometheus-Datenquelle zur Speicherung der Aufnahmeregeln", - "label-target-data-source": "Zieldatenquelle" + "label-target-data-source": "Zieldatenquelle", + "target-data-source-required": "" }, "recording-rules-name-space-and-group-step": { "description-select-namespace-group-recording": "Wählen Sie den Namensraum und die Gruppe für Ihre Aufnahmeregel.", @@ -2103,6 +2408,9 @@ "collapse-all": "Alle einklappen", "expand-all": "Alle ausklappen" }, + "rule-list-v2": { + "import-to-gma": "" + }, "rule-modify-export": { "text-loading-the-rule": "Regel wird geladen …", "title-cannot-exist": "Die Regel kann nicht geladen werden. Die Regel existiert nicht", @@ -2180,6 +2488,10 @@ "label-saved-searches": "Gespeicherte Suchen" }, "health": "Zustand", + "label": { + "hide": "Ausblenden", + "show": "Anzeigen" + }, "manage-alerts": "In diesen Datenquellen können Sie über die Alerting-Benutzeroberfläche „Warnungen verwalten“ auswählen, um diese Warnregeln sowohl in der Grafana-Benutzeroberfläche als auch in der Datenquelle, in der sie konfiguriert wurden, verwalten zu können.", "placeholder-all-data-sources": "Alle Datenquellen", "plugin-rules": "Plugin-Regeln", @@ -2276,6 +2588,9 @@ "label-comment": "Kommentar", "label-created-by": "Erstellt von", "label-duration": "Dauer", + "message": { + "required": "" + }, "placeholder-whos-creating-the-silence": "Wer die Stummschaltung erstellt", "save-silence": "Stummschaltung speichern", "saving": "Wird gespeichert …" @@ -2314,6 +2629,12 @@ "title-alert-rule-types": "Warnregeltypen" }, "state-history": { + "columns": { + "label": { + "state": "Status", + "time": "Zeit" + } + }, "filter-group": "Gruppe filtern", "filter-group-tooltip": "Filtern Sie jede Statusverlaufsgruppe entweder nach genauer Übereinstimmung oder einem regulären Ausdruck, zum Beispiel:", "placeholder-search": "Suche", @@ -2353,6 +2674,9 @@ "label-examples-documentation": "Beispiele Dokumentation", "label-template-group": "Vorlagengruppe", "label-template-group-name": "Name der Vorlagengruppe", + "message": { + "required": "" + }, "new-template-name-placeholder-give-your-template-group-a-name": "Benennen Sie Ihre Vorlagengruppe", "title-error-saving-template": "Fehler beim Speichern der Vorlage", "title-templating-cheat-sheet": "Vorlagen-Cheat-Sheet" @@ -2375,6 +2699,11 @@ "existing-templates-selector-aria-label-choose-notification-template": "Benachrichtigungsvorlage auswählen", "existing-templates-selector-placeholder-choose-notification-template": "Benachrichtigungsvorlage auswählen", "loading": "Wird geladen ...", + "template-options": { + "label": { + "select-notification-template": "" + } + }, "tooltip-copy": "Kopieren Sie die ausgewählte Benachrichtigungsvorlage in die Zwischenablage. Sie können sie im benutzerdefinierten Tab verwenden." }, "templates": { @@ -2477,10 +2806,39 @@ } }, "use-columns": { + "columns": { + "label": { + "alert-rule-targeted": "", + "alerts-silenced": "", + "health": "Zustand", + "matching-labels": "Übereinstimmende Labels", + "name": "Name", + "schedule": "Planen", + "state": "Status", + "time-range": "Zeitbereich" + } + }, + "label": { + "actions": "Aktionen", + "created": "Erstellt", + "group": "Gruppe", + "labels": "Labels", + "next-evaluation": "Nächste Evaluierung", + "state": "Status", + "summary": "Zusammenfassung" + }, "title-edit": "Bearbeiten", "title-recreate": "Neu erstellen", "title-unsilence": "Ruhezeit aufheben" }, + "use-combined-labels": { + "grouped-options": { + "label": { + "from-alerts": "", + "from-system": "" + } + } + }, "use-create-dropdown-menu-actions": { "label-delete": "Löschen", "label-edit": "Bearbeiten", @@ -2514,6 +2872,17 @@ "title-edit-notification-policy": "Benachrichtigungsrichtlinie bearbeiten" } }, + "use-page-nav": { + "page-nav": { + "text": { + "details": "Details", + "history": "Verlauf", + "instances": "Instanzen", + "query-and-conditions": "", + "versions": "Versionen" + } + } + }, "use-state-history-modal": { "state-history-modal": { "title-state-history": "Statusverlauf" @@ -2534,6 +2903,36 @@ "body": "Der YAML-Inhalt im Editor enthält nur die Warnregel-Konfiguration <1></1>Um Prometheus zu konfigurieren, müssen Sie den Rest des <4>Konfigurationsdatei-Inhalts angeben.</4>" } }, + "alertlist": { + "group-by": { + "aria-label-group-by-label-keys": "", + "placeholder-group-by": "Gruppieren nach" + }, + "ungrouped-mode-view": { + "active-for": "", + "aria-label-view-alert-rule": "", + "view-alert-rule": "" + }, + "unified-alert-list": { + "clear": "Löschen", + "text-loading": "Wird geladen ..." + }, + "unified-alert-list-panel": { + "body-permission-required": "", + "title-permission-required": "" + } + }, + "annolist": { + "anno-list-panel": { + "aria-label-remove-filter": "", + "filter": "", + "loading": "Wird geladen ...", + "no-annotations-found": "" + }, + "annotation-list-item": { + "tooltip-created-by": "" + } + }, "annotations": { "annotation-field-mapper": { "annotation": "Anmerkung", @@ -2630,6 +3029,11 @@ "configuration-required": "Konfiguration erforderlich", "refer-documentation-configure-authentication": "Erfahren Sie in der Dokumentation, wie Sie die Authentifizierung konfigurieren" }, + "field-map": { + "label": { + "none": "Keine" + } + }, "fields": { "allow-assign-grafana-admin-description": "", "allow-assign-grafana-admin-label": "", @@ -2733,7 +3137,18 @@ "use-refresh-token-description": "", "use-refresh-token-label": "", "validate-hosted-domain-description": "", - "validate-hosted-domain-label": "" + "validate-hosted-domain-label": "", + "workload-identity-token-file-description": "", + "workload-identity-token-file-label": "", + "workload-identity-token-file-required": "" + }, + "get-page-nav": { + "subTitle": { + "configure-authentication-providers": "" + }, + "text": { + "authentication": "Authentifizierung" + } }, "provider-card": { "text-badge-enabled": "Aktiviert", @@ -2769,6 +3184,12 @@ "auth-config-auth-config-page-unconnected": { "subtitle": "Verwalten Sie Ihre Authentifizierungseinstellungen und konfigurieren Sie einmalige Anmeldungen. Erfahren Sie mehr in unserer <2>Dokumentation</2>." }, + "barchart": { + "tick-spacing-editor": { + "content-require-space-from-the-right-side": "", + "label-rtl": "" + } + }, "bookmarks-page": { "empty": { "message": "Offenbar haben Sie noch keine Lesezeichen erstellt", @@ -2897,11 +3318,199 @@ "text-this-repository-is-read-only": "Wenn Sie direkten Zugriff auf das Ziel haben, kopieren Sie den JSON und fügen Sie ihn dort ein." }, "canvas": { + "apieditor": { + "label-endpoint": "", + "label-header-parameters": "", + "label-method": "Methode", + "label-payload": "Payload", + "label-query-parameters": "Abfrageparameter", + "render-test-apibutton": { + "test-api": "", + "title-test-api": "" + } + }, + "button-item": { + "label": { + "center": "", + "left": "", + "right": "" + }, + "placeholder": { + "auto": "Auto" + } + }, + "button-style-editor": { + "label-variant": "Variante" + }, + "canvas-context-menu": { + "close-editor": "", + "open-editor": "", + "render-menu-items": { + "add-item-menu-item": { + "label-add-item": "" + }, + "edit-element-menu-item": { + "label-edit": "Bearbeiten" + }, + "label-bring-to-front": "", + "label-delete": "Löschen", + "label-duplicate": "Duplikat", + "label-send-to-back": "", + "set-background-menu-item": { + "label-set-background": "" + } + } + }, + "cloud-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } + }, + "ellipse-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } + }, + "inline-edit": { + "canvas-inline-editor": "", + "tooltip-close-inline-editor": "" + }, + "inline-edit-body": { + "label-add-item": "", + "please-select-an-element": "" + }, + "line-style-editor": { + "label-animate": "" + }, + "metric-value-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } + }, "not-found-display": { "not-found": "<0>Nicht gefunden: </0><config />" }, + "pan-zoom-help": { + "ctrl-right-mouse": "", + "middle-mouse": "", + "pan-title": "", + "reset-double-click": "", + "title-pan-and-zoom-controls": "", + "zoom-scroll-wheel": "" + }, + "parallelogram-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } + }, + "params-editor": { + "aria-label-add": "Hinzufügen", + "aria-label-delete": "Löschen", + "placeholder-key": "Key", + "placeholder-value": "Wert" + }, + "placement-editor": { + "label-constraints": "", + "label-position": "", + "loading": "Wird geladen ..." + }, + "quick-positioning": { + "tooltip-align-bottom": "", + "tooltip-align-horizontal-centers": "", + "tooltip-align-left": "", + "tooltip-align-right": "", + "tooltip-align-top": "", + "tooltip-align-vertical-centers": "" + }, + "rectangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } + }, "text-display": { "double-click-to-set": "Klicken Sie doppelt, um Text festzulegen" + }, + "text-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } + }, + "tree-navigation-editor": { + "clear-selection": "Auswahl löschen", + "frame-selection": "", + "label-add-item": "", + "missing-layer": "", + "no-settings": "", + "switcher-icon": { + "title-node-icon": "" + } + }, + "tree-node-title": { + "title-duplicate": "Duplikat", + "title-remove": "Entfernen", + "tooltip-duplicate": "Duplikat", + "tooltip-remove": "Entfernen" + }, + "triangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } } }, "carousel": { @@ -2981,6 +3590,22 @@ } }, "connections": { + "add-new-connection": { + "filter-by-options": { + "label": { + "all": "Alle", + "installed": "Installiert", + "new-updates": "" + } + }, + "label": { + "by-downloads": "", + "by-name-az": "", + "by-name-za": "", + "by-published-date": "", + "by-updated-date": "" + } + }, "advisor-redirect-notice": { "aria-label-link-to-advisor": "Link zu Advisor", "body": "Probieren Sie den neuen Advisor aus, um mögliche Probleme mit Ihren Datenquellen und Plugins zu erkennen.", @@ -2997,6 +3622,22 @@ "body": "Datenquellen haben ein neues Zuhause! Sie können neue Datenquellen entdecken oder bereits bestehende auf der Seite „Verbindungen“ verwalten, die über das Hauptmenü zugänglich ist.", "go-to-connections": "Zu den Verbindungen" }, + "data-source-details-page": { + "subTitle": { + "datasource-could-found": "" + }, + "text": { + "unknown-datasource": "" + } + }, + "new-data-source-page": { + "subTitle": { + "choose-a-data-source-type": "" + }, + "text": { + "add-data-source": "Datenquelle hinzufügen" + } + }, "no-access-modal": { "connection-contact-grafana-admin": "Kontaktieren Sie Ihren Grafana-Administrator, um eine neue Verbindung hinzuzufügen.", "editor-warning": "Editoren können keine neuen Verbindungen hinzufügen. Sie können prüfen, ob es bereits in <2>Datenquellen</2> konfiguriert ist.", @@ -3009,6 +3650,18 @@ "search": { "aria-label-search-all": "Alle durchsuchen", "placeholder": "Alle durchsuchen" + }, + "use-data-source-settings-nav": { + "node": { + "subTitle": { + "data-source-error": "" + } + }, + "page-nav": { + "text": { + "data-source-nav-node": "" + } + } } }, "core": { @@ -3304,6 +3957,11 @@ "title-plugin-dashboard": "Plugin-Dashboard" }, "dash-nav": { + "on-open-snapshot-original": { + "title": { + "proceed-to-external-site": "" + } + }, "render-left-actions": { "text-public": "Öffentlich", "tooltip-view-as-scene": "Als Szene anzeigen" @@ -3315,11 +3973,26 @@ "dashboard-loading": { "cancel-loading-dashboard": "Laden des Dashboards abbrechen" }, + "dashboard-page-error": { + "text": { + "not-found": "Nicht gefunden" + } + }, "dashboard-settings": { "actions": { "close": "Schließen" } }, + "dashboard-slice": { + "title": { + "dashboard-init-failed": "" + } + }, + "dashboard-srv": { + "message": { + "edit-dashboard-json": "" + } + }, "dashboard-validation": { "body-dashboard-failed-schema-validation": "Die Validierung dient Entwicklungszwecken und kann problemlos ignoriert werden. Wenn Sie Grafana-Entwickler sind, könnten Sie das Dashboard-Schema überprüfen und aktualisieren", "title-checking-dashboard-validity": "Die Gültigkeit des Dashboards wird überprüft", @@ -3415,6 +4088,13 @@ "values": "Werte werden durch Komma getrennt", "values-placeholder": "1, 10, mykey: myvalue, myvalue, escaped, value" }, + "datasource-options": { + "name-filter": "", + "name-filter-description": "", + "name-filter-placeholder": "", + "type": "Typ", + "type-placeholder": "" + }, "description": "Beschreibung", "description-placeholder": "Beschreibender Text", "label": "Label", @@ -3433,8 +4113,8 @@ "category": "Auswahloptionen", "custom-all-value": "Alle Werte benutzerdefiniert", "custom-all-value-description": "Ein Platzhalter-Regex oder ein anderer Wert, um „Alle“ darzustellen", - "include-all": "Option „Alle einschließen“", - "include-all-description": "Aktiviert eine Option, mit der alle Werte einbezogen werden", + "include-all": "", + "include-all-description": "", "multi-value": "Mehrwertig" }, "type-category": "{{type}} Optionen" @@ -3460,14 +4140,97 @@ "errors": { "failed-to-load": "Dashboard konnte nicht geladen werden" }, + "fetch-dashboard": { + "message": { + "failed-to-fetch-dashboard": "" + } + }, "gen-aihistory": { "aria-label-send-custom-feedback": "Individuelles Feedback senden", "footer-text": "Dieser Inhalt wurde mithilfe des <2>Grafana LLM-Plugins</2> KI-generiert", "placeholder-tell-ai-what-to-do-next": "Sagen Sie der KI, was als nächstes zu tun ist ..." }, + "general-settings-unconnected": { + "editable-options": { + "label": { + "editable": "Editierbar", + "readonly": "" + } + } + }, + "get-debug-dashboard": { + "title": { + "annotations": "Anmerkungen" + } + }, + "get-errors": { + "message": { + "error-loading-data": "" + } + }, "get-field-override-categories": { "label-add-field-override": "Feldüberschreibung hinzufügen", - "label-add-override-property": "Überschreibungseigenschaft hinzufügen" + "label-add-override-property": "Überschreibungseigenschaft hinzufügen", + "title": { + "add-button": "" + } + }, + "get-library-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "Informationen", + "name": "Name" + } + }, + "get-library-viz-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "Informationen", + "name": "Name" + } + }, + "get-panel-editor-tabs": { + "text": { + "alert": "", + "query": "Abfrage", + "transform-data": "" + } + }, + "get-panel-frame-category": { + "descriptor": { + "title": { + "panel-options": "Fenster-Optionen" + } + }, + "direction-options": { + "label": { + "horizontal": "Horizontal", + "vertical": "Vertikal" + } + }, + "title": { + "description": "Beschreibung", + "max-per-row": "Max. pro Zeile", + "panel-links": "Panel-Links", + "repeat-by-variable": "Nach Variable wiederholen", + "repeat-direction": "Richtung wiederholen", + "repeat-options": "Optionen wiederholen", + "title": "Titel", + "transparent-background": "Transparenter Hintergrund" + } + }, + "get-panel-menu": { + "text": { + "extensions": "" + } }, "help-wizard": { "copy-to-clipboard": "In die Zwischenablage kopieren", @@ -3480,10 +4243,21 @@ "randomize-field-names-label-field-names": "Feldnamen", "randomize-labels-label-labels": "Labels", "randomize-string-values-label-string-values": "String-Werte", + "tabs": { + "label": { + "data": "Daten", + "snapshot": "Schnappschuss" + } + }, "title-complete-git-hub-comment-clipboard": "Kopieren Sie einen kompletten GitHub-Kommentar in die Zwischenablage", "title-get-help-with-this-panel": "Hilfe für dieses Panel erhalten", "troubleshooting-docs": "Dokumente zur Fehlerbehebung" }, + "init-dashboard": { + "message": { + "failed-create-dashboard-model": "" + } + }, "inspect": { "data-tab": "Daten", "error-tab": "Fehler", @@ -3536,6 +4310,16 @@ "rows": "Gesamtanzahl an Zeilen", "table-title": "Statistiken" }, + "k8s-dashboard-api": { + "title": { + "deleted": "" + } + }, + "k8s-dashboard-v2api": { + "title": { + "deleted": "" + } + }, "layout": { "common": { "copy": "Kopieren", @@ -3548,6 +4332,13 @@ "panel-layout-disabled": "Wählen Sie eine Zeile oder Registerkarte, um die Panel-Layout-Optionen zu ändern" } }, + "legacy-dashboard-api": { + "fetch-error": { + "message": { + "dashboard-not-found": "" + } + } + }, "make-editable": { "dashboard-not-editable": "Dashboard nicht bearbeitbar", "make-editable": "Bearbeitbar machen" @@ -3567,6 +4358,20 @@ "menu-use-library-panel": "Bibliotheks-Panel verwenden" }, "new-panel-title": "Neues Panel", + "on-create-new-row": { + "new-row": { + "title": { + "row-title": "" + } + } + }, + "on-create-new-widget-panel": { + "new-panel": { + "title": { + "widget-title": "" + } + } + }, "options": { "description": "Beschreibung", "title-option": "Titel" @@ -3626,6 +4431,30 @@ "paused": "Dieses Dashboard wurde vom Administrator pausiert", "try-again-later": "Versuchen Sie es später erneut" }, + "remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, + "repeat-row-select": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, + "repeat-row-select2": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, "revert-dashboard-modal": { "body-restore-version": "Sind Sie sicher, dass Sie das Dashboard auf die Version {{version}} zurücksetzen möchten? Alle nicht gespeicherten Änderungen gehen verloren.", "title-restore-version": "Version wiederherstellen" @@ -3739,6 +4568,18 @@ "sub-menu-un-connected": { "aria-label-template-variables": "Vorlagenvariablen" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "tabs-layout": { "delete-tab-text": "Wenn Sie diese Registerkarte löschen, werden auch alle Panels entfernt. Sind Sie sicher, dass Sie fortfahren möchten?", "delete-tab-title": "Registerkarte löschen?", @@ -3944,7 +4785,10 @@ }, "unthemed-dashboard-row": { "aria-label-delete-row": "Zeile löschen", - "learn-more": "Mehr erfahren" + "learn-more": "Mehr erfahren", + "title": { + "delete-row": "Zeile löschen" + } }, "validation": { "invalid-dashboard-id": "Konnte keine gültige Grafana.com-ID finden", @@ -3979,6 +4823,16 @@ }, "visualization-select-pane": { "placeholder-search-for": "Suche nach ...", + "radio-options": { + "description": { + "reusable-panels-share-between-multiple-dashboards": "" + }, + "label": { + "library-panels": "Bibliotheks-Panels", + "suggestions": "", + "visualizations": "" + } + }, "title-close": "Schließen" }, "viz-panel": { @@ -4029,12 +4883,25 @@ "label-data-source": "Datenquelle", "label-use-static-key-dimensions": "Statische Key-Dimensionen verwenden" }, + "add-to-dashboard": { + "message": { + "could-navigate-selected-dashboard-please-again": "", + "could-panel-dashboard-please-again": "" + } + }, "add-to-dashboard-form": { "cancel": "Abbrechen", "description-choose-where-to-add-the-panel": "Wählen Sie, wo das Panel hinzugefügt werden soll.", "description-select-which-dashboard-panel-created": "Wählen Sie, in welchem Dashboard das Panel erstellt wird.", + "label": { + "existing-dashboard": "Vorhandenes Dashboard", + "new-dashboard": "Neues Dashboard" + }, "label-dashboard": "Dashboard", "label-target-dashboard": "Ziel-Dashboard", + "message": { + "this-field-is-required": "Dieses Feld ist erforderlich." + }, "open-dashboard": "Dashboard öffnen", "open-in-new-tab": "In neuem Tab öffnen", "title-error-adding-the-panel": "Fehler beim Hinzufügen des Panels" @@ -4072,6 +4939,25 @@ "it-cannot-contain-or": "Darf nicht „//“ oder „..“ enthalten.", "least-valid-character": "Mindestens ein gültiges Zeichen muss enthalten sein." }, + "build-new-dashboard-save-model": { + "data": { + "title": { + "new-dashboard": "Neues Dashboard" + } + } + }, + "build-new-dashboard-save-model-v2": { + "data": { + "title": { + "new-dashboard": "Neues Dashboard" + } + } + }, + "config-public-dashboard": { + "title": { + "revoke-public-url": "Öffentliche URL widerrufen" + } + }, "constant-variable-form": { "constant-options": "Konstante Optionen", "label-value": "Wert", @@ -4119,22 +5005,89 @@ "value-not-saved": "Der Wert ist noch nicht in der Grafana-Datenbank gespeichert", "view-pull-request-in-git-hub": "Pull-Anfrage in GitHub anzeigen" }, + "dashboard-scene": { + "text": { + "edit-panel": "", + "view-panel": "Panel anzeigen" + }, + "title": { + "dashboard": "Dashboard", + "discard-changes-to-dashboard": "" + } + }, + "dashboard-scene-page-state-manager": { + "message": { + "dashboard-not-found": "" + } + }, + "dashboard-scene-page-state-manager-v2": { + "message": { + "dashboard-not-found": "" + } + }, "data-source-variable-form": { "data-source-options": "Datenquellenoptionen", "description-instance-name-filter": "Regex-Filter, für den Datenquelleninstanzen aus der Liste der Variablenwerte ausgewählt werden sollen. Für alle leer lassen.", "example-instance-name-filter": "Beispiel: <codeExample />", "selection-options": "Auswahloptionen" }, + "default-grid-layout-manager": { + "row": { + "title": { + "row-title": "" + } + } + }, "description-label": { "description": "Beschreibung" }, + "edit-link-view": { + "edit-link-page-nav": { + "text": { + "edit-link": "Link bearbeiten" + } + } + }, "email-list": { "aria-label-emailmenu": "E-Mail-Menü umschalten" }, + "embedded-dashboard-test-page": { + "subTitle": { + "showing-dashboard-panel-tests-pie-chart": "" + }, + "text": { + "embedding-dashboard": "" + } + }, "empty-transformations-message": { "add-transformation": "Transformation hinzufügen" }, + "get-edit-options": { + "title": { + "column-options": "", + "row-height-options": "" + } + }, + "get-panel-frame-options": { + "descriptor": { + "title": { + "panel-options": "Fenster-Optionen" + } + }, + "title": { + "description": "Beschreibung", + "panel-links": "Panel-Links", + "title": "Titel", + "transparent-background": "Transparenter Hintergrund" + } + }, + "get-workflow-options": { + "label": { + "push-to-a-new-branch": "" + } + }, "group-by-variable-form": { + "alert-not-supported": "", "description-enables-users-custom-values": "Ermöglicht Nutzern, individuelle Werte zur Liste hinzuzufügen", "description-provide-dimensions-as-csv-dimension-name-dimension-id": "Dimensionen als CSV angeben: {{name}}, {{value}}", "group-by-options": "Nach Optionen gruppieren", @@ -4153,6 +5106,12 @@ "randomize-field-names-label-field-names": "Feldnamen", "randomize-labels-label-labels": "Labels", "randomize-string-values-label-string-values": "String-Werte", + "tabs": { + "label": { + "data": "Daten", + "snapshot": "Schnappschuss" + } + }, "title-complete-git-hub-comment-clipboard": "Kopieren Sie einen kompletten GitHub-Kommentar in die Zwischenablage", "title-get-help-with-this-panel": "Hilfe für dieses Panel erhalten", "troubleshooting-docs": "Dokumente zur Fehlerbehebung", @@ -4195,6 +5154,14 @@ "body-name-already-exists": "Ein Dashboard mit demselben Namen im ausgewählten Ordner existiert bereits. Möchten Sie dieses Dashboard trotzdem speichern?", "title-name-already-exists": "Der Name existiert bereits" }, + "on-remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, "panel-data-alerting-tab-rendered": { "alert": { "title-errors-loading-rules": "Fehler beim Laden der Regeln" @@ -4216,6 +5183,11 @@ "table-view-aria-label-toggletableview": "Tabellenansicht umschalten", "table-view-label-table-view": "Tabellenansicht" }, + "panel-editor": { + "text": { + "edit-panel": "" + } + }, "panel-editor-renderer": { "aria-label-open-options-pane": "Optionsfenster öffnen", "tooltip-open-options-pane": "Optionsfenster öffnen" @@ -4224,8 +5196,22 @@ "body-panel-plugin-not-loaded": "Achten Sie darauf, dass das Panel, das Sie prüfen möchten, sichtbar ist und angezeigt wurde, bevor Sie die Prüfung starten.", "title-panel-plugin-not-loaded": "Panel-Plugin nicht geladen" }, + "panel-menu-behavior": { + "async-func": { + "text": { + "extensions": "", + "metrics-drilldown": "" + } + } + }, "panel-viz-type-picker": { "placeholder-search-for": "Suche nach ...", + "radio-options": { + "label": { + "suggestions": "", + "visualizations": "" + } + }, "title-close": "Schließen" }, "provisioned-delete-modal": { @@ -4252,6 +5238,15 @@ "query-options": "Abfrageoptionen", "selection-options": "Auswahloptionen" }, + "resource-export": { + "label": { + "classic": "", + "json": "JSON", + "v1-resource": "", + "v2-resource": "", + "yaml": "" + } + }, "revert-dashboard-modal": { "body-restore-version": "Sind Sie sicher, dass Sie das Dashboard auf die Version {{version}} zurücksetzen möchten? Alle nicht gespeicherten Änderungen gehen verloren.", "title-restore-version": "Version wiederherstellen" @@ -4360,6 +5355,18 @@ "solo-panel-page": { "loading": "Wird geladen" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "text-box-variable-form": { "placeholder-default-value-if-any": "(optional)", "text-options": "Textoptionen" @@ -4370,6 +5377,13 @@ "title-field-label": { "title": "Titel" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "transformations-drawer": { "search-box-suffix": { "tooltip-clear-search": "Suche löschen" @@ -4385,6 +5399,13 @@ "save-dashboard": "Dashboard speichern", "title-unsaved-changes": "Nicht gespeicherte Änderungen" }, + "use-dashboard-edit-page-nav": { + "page-nav": { + "text": { + "settings": "Einstellungen" + } + } + }, "variable-check-indicator": { "aria-label-variable-referenced-dashboard": "Diese Variable wird von keiner Variable bzw. keinem Dashboard referenziert.", "aria-label-variable-referenced-other-variables-dashboard": "Diese Variable wird von anderen Variablen oder Dashboards referenziert.", @@ -4401,7 +5422,10 @@ "placeholder-descriptive-text": "Beschreibender Text", "placeholder-label-name": "Label-Name", "placeholder-variable-name": "Variablenname", - "text-running-query": "Abfrage wird ausgeführt …" + "text-running-query": "Abfrage wird ausgeführt …", + "title": { + "delete-variable": "Variable löschen" + } }, "variable-editor-list": { "definition": "Definition", @@ -4583,6 +5607,25 @@ "message": "Keine Datenquellen gefunden" } }, + "datagrid": { + "add-column": { + "placeholder-column-name": "" + }, + "datagrid-context-menu": { + "render-context-menu-items": { + "label-clear-column": "", + "label-clear-row": "", + "label-remove-all-data": "", + "label-search": "Suche ..." + }, + "render-header-menu-items": { + "label-clear-column": "", + "label-delete-column": "", + "label-rename-column": "", + "label-set-field-type": "" + } + } + }, "datasources": { "add-new-data-source-button": { "tooltip-no-permission": "Sie haben keine Berechtigung, neue Datenquellen zu konfigurieren" @@ -4604,6 +5647,46 @@ "label-default": "Standard", "label-name": "Name" }, + "build-categories": { + "categories": { + "title": { + "cloud": "Cloud", + "distributed-tracing": "", + "enterprise-plugins": "Enterprise-Plugins", + "industrial-io-t": "", + "logging-document-databases": "", + "others": "", + "profiling": "", + "sql": "", + "time-series-databases": "" + } + } + }, + "build-nav-model": { + "analytics": { + "text": { + "insights": "Insights" + } + }, + "caching": { + "text": { + "cache": "" + } + }, + "ds-permissions": { + "text": { + "permissions": "Berechtigungen" + } + }, + "nav-model": { + "text": { + "settings": "Einstellungen" + } + }, + "text": { + "dashboards": "Dashboards" + } + }, "button-row": { "delete": "Löschen", "save-and-test": "Speichern und testen", @@ -4639,6 +5722,11 @@ "data-source-read-only-message": { "title-provisioned-data-source": "Bereitgestellte Datenquelle" }, + "data-source-settings-reducer": { + "message": { + "testing-could-couple-minutes": "" + } + }, "data-source-type-card": { "aria-label-learn-more": "{{dataSourcePluginName}}, erfahren Sie mehr." }, @@ -4656,13 +5744,88 @@ "footer": { "add-csv-or-spreadsheet": "CSV oder Tabelle hinzufügen" }, + "get-enterprise-phantom-plugins": { + "description": { + "adobe-analytics-datasource": "", + "app-dynamics-integration-and-data-source": "", + "atlassian-statuspage-datasource": "", + "aurora-data-source": "", + "azure-cosmos-db-datasource": "", + "azure-devops-datasource": "", + "catchpoint-datasource": "", + "cloudflare-datasource": "", + "cockroach-db-datasource": "", + "data-dog-integration-and-data-source": "", + "drone-datasource": "", + "git-lab-integration-and-datasource": "", + "honeycomb-integration-and-datasource": "", + "jira-integration-and-datasource": "", + "logic-monitor-devices-datasource": "", + "mongo-db-integration-and-data-source": "", + "netlify-datasource": "", + "new-relic-integration-and-data-source": "", + "pager-duty-datasource": "", + "salesforce-integration-and-datasource": "", + "sap-hana-integration-and-data-source": "", + "service-now-integration-and-data-source": "", + "signal-fx-integration-and-datasource": "", + "snowflake-integration-and-data-source": "", + "sumo-logic-integration-and-datasource": "", + "visualize-and-explore-dynatrace-data": "", + "visualize-and-explore-oracle-sql": "", + "visualize-and-explore-splunk-logs": "", + "wavefront-integration-and-data-source": "", + "zendesk-datasource": "" + } + }, + "get-grafana-cloud-phantom-plugin": { + "description": { + "hosted-graphite-prometheus-and-loki": "" + } + }, "new-data-source-view": { "cancel": "Abbrechen", "placeholder-filter-by-name-or-type": "Nach Name oder Typ filtern" }, + "update-data-source": { + "error-info": { + "message": { + "an-unexpected-error-occurred": "" + } + } + }, "use-data-source-info": { "badge-text-not-supported": "Nicht unterstützt", - "badge-text-supported": "Unterstützt" + "badge-text-supported": "Unterstützt", + "label": { + "alerting": "Meldungen", + "type": "Typ" + } + }, + "use-delete-loaded-data-source": { + "title": { + "delete": "Löschen" + } + } + }, + "debug": { + "cursor-view": { + "no-events-yet": "" + }, + "render-info-viewer": { + "data-counter": "", + "elapsed-time": "", + "field": "Feld", + "last": "", + "render-counter": "", + "schema-counter": "", + "title-reset-counters": "", + "tooltip-step-back": "", + "type": "Typ" + }, + "state-view": { + "current-value": "", + "label-state-name": "" } }, "dimensions": { @@ -4731,6 +5894,19 @@ "remove-value-mapping-aria-label-delete-value-mapping": "Wertezuordnung löschen", "remove-value-mapping-tooltip-delete": "Löschen", "set-color": "Farbe festlegen", + "special-match-options": { + "description": { + "boolean-false-values": "", + "boolean-true-values": "", + "empty-string": "", + "matches-against-number-na-n-not-a-number": "", + "matches-null-and-undefined-values": "", + "matches-null-undefined-and-na-n": "" + }, + "label": { + "empty": "Leer" + } + }, "tooltip-remove-color": "Farbe entfernen", "tooltip-remove-icon": "Symbol entfernen" }, @@ -4746,6 +5922,20 @@ "display-text": "Anzeigetext", "icon": "Symbol", "label-add-a-new-mapping": "Neues Mapping hinzufügen", + "mapping-types": { + "description": { + "match-a-numerical-range-of-values": "", + "match-a-regular-expression-with-replacement": "", + "match-a-specific-text-value": "", + "match-boolean-empty-values": "" + }, + "label": { + "range": "", + "regex": "", + "special": "", + "value": "Wert" + } + }, "update": "Aktualisieren" } }, @@ -4770,6 +5960,7 @@ }, "explore": { "accordian-logs": { + "events": "", "footer": "Die Zeitstempel des Ereignisses hängen von der Startzeit des vollständigen Trace ab." }, "accordian-references": { @@ -4780,6 +5971,11 @@ "basic-extensions": { "aria-label-add": "Hinzufügen" }, + "build-dashboard-panel-from-explore-state": { + "title": { + "new-panel": "" + } + }, "clear": "Löschen", "confirm-navigation-modal": { "cancel": "Abbrechen", @@ -4866,6 +6062,33 @@ "title-table": "Tabelle", "title-traces": "Traces" }, + "explore-query-inspector": { + "data-tab": { + "label": { + "data": "Daten" + } + }, + "error-tab": { + "label": { + "error": "Fehler" + } + }, + "json-tab": { + "label": { + "json": "JSON" + } + }, + "query-tab": { + "label": { + "query": "Abfrage" + } + }, + "stats-tab": { + "label": { + "stats": "Statistiken" + } + } + }, "explore-run-query-button": { "run-button": { "aria-label-run-query-options": "Optionen zum Ausführen von Abfragen" @@ -4879,10 +6102,23 @@ "description-explore-disabled": "Sie können Explore in der Grafana-Konfiguration aktivieren:", "title-explore-disabled": "Explore ist deaktiviert" }, + "get-field-links-for-explore": { + "text": { + "data": "Daten", + "raw-value": "" + } + }, "get-matches-metadata": { "matches": "0 Übereinstimmungen" }, "legacy-create-span-link-factory": { + "text": { + "tags": "Tags" + }, + "title": { + "related-logs": "", + "session-for-this-span": "Sitzung für diese Spanne" + }, "title-explore-metrics-for-this-span": "Metriken für diese Spanne ansehen", "title-explore-split": "Untersuchen Sie die Logs hierfür in der geteilten Ansicht", "title-session-for-this-span": "Sitzung für diese Spanne" @@ -4923,6 +6159,10 @@ }, "logs-meta-row": { "download": "Download", + "label": { + "deduplication-count": "", + "showing-only-selected-fields": "" + }, "show-original-line": "Ursprüngliche Zeile anzeigen" }, "logs-sample-panel": { @@ -5104,6 +6344,21 @@ "run-query-button": "Abfrage ausführen", "switch-datasource-button": "Datenquelle wechseln und Abfrage ausführen" }, + "scoped-vars-from-span": { + "text": { + "span": "" + } + }, + "scoped-vars-from-tags": { + "text": { + "tags": "Tags" + } + }, + "scoped-vars-from-trace": { + "text": { + "trace": "Trace" + } + }, "search-bar-input": { "placeholder-find": "Suchen ...", "suffix": { @@ -5138,9 +6393,25 @@ "tooltip-tag-key": "Tag-Key, der genutzt wird, um den Tag-Wert zu erhalten. Die Attribute und Ressourcen einer Spanne werden nach dem Tag-Key durchsucht" }, "span-detail": { + "label": { + "kind": "", + "library-name": "", + "library-version": "", + "status": "Status:", + "status-message": "", + "trace-state": "" + }, "label-resource-attributes": "Ressourcenattribute", "label-span-attributes": "Attribute der Spanne", "label-stack-trace": "Stacktrace", + "overview-items": { + "label": { + "child-count": "", + "duration": "", + "service": "", + "start-time": "" + } + }, "warnings": "Warnungen" }, "span-filters": { @@ -5247,6 +6518,18 @@ "title-node-graph": "Knotendiagramm" }, "unthemed-logs": { + "description": { + "show-results-in-logs-visualisation": "", + "show-results-in-table-visualisation": "", + "show-results-newest-to-oldest": "", + "show-results-oldest-to-newest": "" + }, + "label": { + "logs": "Logs", + "newest-first": "Neueste zuerst", + "oldest-first": "Älteste zuerst", + "table": "Tabelle" + }, "label-deduplication": "Deduplizierung", "label-display-results": "Ergebnisse anzeigen", "label-prettify-json": "JSON verschönern", @@ -5262,6 +6545,15 @@ }, "unthemed-virtualized-trace-view": { "title-scroll-to-top": "Nach oben scrollen" + }, + "use-focus-span-link": { + "create-focus-span-link": { + "link": { + "title": { + "deep-link-to-this-span": "" + } + } + } } }, "export": { @@ -5347,6 +6639,15 @@ "folder-repo": { "badge-text": "Bereitgestellt" }, + "folders": { + "get-loading-nav": { + "main": { + "title": { + "loading": "Wird geladen" + } + } + } + }, "forgot-password": { "back-button": "Zurück zur Anmeldung", "change-password": { @@ -5376,10 +6677,102 @@ "incomplete-request-error": "Leider konnte ich Ihre Anfrage nicht abschließen. Bitte versuchen Sie es erneut.", "send-custom-feedback": "Senden" }, + "geomap": { + "coordinates-map-view-editor": { + "label-latitude": "", + "label-longitude": "" + }, + "debug-overlay": { + "center": "", + "zoom": "" + }, + "fit-map-view-editor": { + "all-layers-editor-fragment": { + "label-layer": "" + }, + "label-data": "Daten", + "last-only-editor-fragment": { + "label-padding": "", + "tooltip-padding-relative-percent-beyond-extent": "" + } + }, + "frame-multi-selection-editor": { + "placeholder-change-filter": "" + }, + "frame-selection-editor": { + "placeholder-change-filter": "" + }, + "geomap-panel": { + "aria-label-map": "" + }, + "geomap-style-rules-editor": { + "aria-label-add-geomap-style-rule": "" + }, + "layers-editor": { + "label-add-layer": "", + "no-layers": "" + }, + "map-view-editor": { + "label-max-zoom": "", + "label-view": "Anzeigen", + "label-zoom": "Zoom", + "use-current-map-settings": "" + }, + "markers-legend": { + "title-symbol": "Symbol" + }, + "measure-overlay": { + "tooltip-show-measure-tools": "" + }, + "plugin": { + "basemap-layer-configured-server-admin": "" + }, + "style-editor": { + "label-align": "", + "label-baseline": "", + "label-color": "Farbe", + "label-fill-opacity": "", + "label-font-size": "", + "label-opacity": "", + "label-rotation-angle": "", + "label-size": "", + "label-symbol": "Symbol", + "label-symbol-horizontal-align": "", + "label-symbol-vertical-align": "", + "label-text-label": "", + "label-x-offset": "", + "label-y-offset": "" + }, + "style-rule-editor": { + "aria-label-comparison-operator": "Vergleichsoperator", + "aria-label-comparison-value": "", + "aria-label-delete-style-rule": "", + "aria-label-feature-property": "", + "label-rule": "Regel", + "placeholder-feature-property": "", + "placeholder-numeric-value": "", + "placeholder-value": "Wert" + } + }, "get-enterprise": { "requires-license": "Erfordert eine Grafana-Enterprise-Lizenz", "title": "Enterprise" }, + "gettingstarted": { + "docs-card": { + "complete": "abschließen", + "learn-how": "" + }, + "getting-started": { + "aria-label-to-advanced-tutorials": "", + "aria-label-to-basic-tutorials": "", + "checking-completed-setup-steps": "", + "remove-this-panel": "" + }, + "tutorial-card": { + "complete": "abschließen" + } + }, "gops": { "config-card": { "text-loading-configuration": "Konfiguration wird geladen ..." @@ -5396,6 +6789,74 @@ }, "progress-status": { "your-progress": "Ihr Fortschritt" + }, + "use-get-configuration-for-ui": { + "get-connect-data-source-configuration": { + "title": { + "connect-data-source": "" + } + }, + "title": { + "essentials": "Das Wichtigste" + } + }, + "use-get-essentials-configuration": { + "essential-content": { + "description": { + "configure-grafana-alerting": "", + "create-integration-alerting-contact-point": "", + "initialize-incident-plugin-declare-manage-incidents": "", + "practice-solving-an-incident": "", + "receive-alerts-oncall-notifications-within-environment": "", + "select-chat-ops-channels-to-route-notifications": "" + }, + "label": { + "add": "Hinzufügen", + "connect": "Verbinden", + "initialize": "", + "select-integration": "", + "start-drill": "" + }, + "title": { + "add-slack-notifications-to-irm-integrations": "", + "connect-alerting-to-irm": "", + "connect-irm-to-your-slack-workspace": "", + "connect-your-messaging-workspace-to-incident": "", + "connect-your-messaging-workspace-to-on-call": "", + "create-incident-drill": "", + "detect": "Erkennen", + "initialize-incident-plugin": "", + "messaging-workspace-channel-on-call-integration": "", + "respond": "", + "test-your-configuration": "" + } + }, + "get-grafana-alerting-config-steps": { + "description": { + "create-alert-monitor-system": "", + "create-on-call-integration-alerting-contact-point": "", + "create-slos-to-monitor-your-service": "" + }, + "label": { + "connect": "Verbinden", + "create": "Erstellen", + "enable": "Aktivieren" + }, + "steps": { + "label": { + "edit": "Bearbeiten" + }, + "title": { + "update-default-contact-point": "" + } + }, + "title": { + "connect-alerting-to-on-call": "", + "create-alert-rule": "Alarmregel erstellen", + "create-slo": "", + "enable-slo-alerting": "" + } + } } }, "grafana": { @@ -5762,14 +7223,18 @@ "duplicate-panel": "Fenster duplizieren", "exit-edit/setting-views": "Ansicht beenden/einstellen", "expand-all-rows": "Alle Zeilen erweitern", + "explore-panel": "", "go-to-dashboards": "Gehe zu Dashboards", "go-to-explore": "Gehe zu Erkunden", "go-to-home-dashboard": "Gehe zu Home-Dashboard", "go-to-profile": "Gehe zu Profil", + "inspect-panel": "", "make-time-range-permanent": "Zeitspanne absolut/dauerhaft machen", "move-time-range-back": "Zeitspanne zurück bewegen", "move-time-range-forward": "Zeitbereich nach vorne verschieben", "open-search": "Suche öffnen", + "open-share-embed-drawer": "", + "open-share-link-drawer": "", "open-shared-modal": "Panel-Snapshot teilen", "paste-time-range": "Zeitraum einfügen", "refresh-all-panels": "Alle Fenster aktualisieren", @@ -5795,6 +7260,11 @@ "support-bundle": "Sie können im <1>Abschnitt „Support-Bundles“</1> auch ein Support-Bundle abrufen, das Informationen zu Ihrer Grafana-Instanz und zu Ihren konfigurierten Datenquellen enthält.", "troubleshooting-help": "Um Hilfe bei der Fehlerbehebung anzufordern, senden Sie bitte einen Screenshot dieses Panels an den technischen Support von Grafana Labs. Der Snapshot enthält Abfrageantwortdaten und Panel-Einstellungen." }, + "histogram": { + "histogram-panel": { + "no-histogram-found-in-response": "" + } + }, "inspector": { "inspect-data-tab": { "loading": "Wird geladen", @@ -5844,6 +7314,9 @@ "label-name": "Name", "label-password": "Passwort", "label-username": "Benutzername", + "message": { + "email-is-invalid": "" + }, "placeholder-name-optional": "Name (optional)", "placeholder-password": "Passwort", "placeholder-username": "Benutzername", @@ -6103,8 +7576,26 @@ "discard-local-changes": "Lokale Änderungen verwerfen", "title-dashboard-changed": "Dashboard geändert" }, + "live-channel-editor": { + "description-grafana-live": "", + "namespace": "Namensraum", + "path": "Pfad", + "placeholder-select-watchable-resource": "", + "scope": "", + "title-grafana-live": "" + }, "live-connection-warning": { "title-connection-to-server-is-lost": "Verbindung zum Server unterbrochen ..." + }, + "live-panel": { + "error": "Fehler", + "grafana-requires-feature": "", + "panel-editor-channel": "", + "title-grafana-live": "", + "waiting-for-data": "" + }, + "live-publish": { + "publish": "" } }, "lock-icon": "Schloss-Symbol", @@ -6151,6 +7642,13 @@ } }, "logs": { + "get-dataframe-fields": { + "vars": { + "text": { + "labels": "Labels" + } + } + }, "infinite-scroll": { "end-of-range": "Ende des ausgewählten Zeitbereichs.", "load-more": "Scrollen Sie nach unten, um weitere zu laden", @@ -6231,6 +7729,11 @@ "shortcut": "Alt+Auswahl zum erneuten Aktivieren" } }, + "log-series-to-logs-model": { + "label": { + "total-bytes-processed": "" + } + }, "logs-controls": { "deduplication": "Deduplizierung", "disable-highlighting": "Markierung deaktivieren", @@ -6265,6 +7768,11 @@ "scroll-top": "Nach oben scrollen", "start-of-range": "Anfang des Bereichs" }, + "logs-panel": { + "render-common-labels": { + "common-labels": "" + } + }, "out-of-range-message": { "end-of-the-selected-time-range": "Ende des ausgewählten Zeitbereichs." }, @@ -6321,6 +7829,14 @@ }, "snapshot-list-table": { "title-delete": "Löschen" + }, + "unthemed-dashboard-import": { + "subTitle": { + "import-dashboard-from-file-or-grafanacom": "" + }, + "text": { + "import-dashboard": "Dashboard importieren" + } } }, "migrate-to-cloud": { @@ -6978,8 +8494,57 @@ "close": "Fach schließen" }, "link-title": "Zum Grafana-Labs-Blog", + "news-panel": { + "body-error-loading-rss-feed": "", + "loading": "Wird geladen ...", + "title-error-loading-rss-feed": "" + }, "title": "Das Neueste aus dem Blog" }, + "nodeGraph": { + "arc-options-editor": { + "add-arc": "", + "title-remove-arc": "" + }, + "edge": { + "aria-label-from-to": "" + }, + "edge-header": { + "label-source-target": "" + }, + "marker": { + "100-node-count": "", + "aria-label-hidden-marker": "", + "node-count_one": "", + "node-count_other": "" + }, + "node": { + "aria-label-node-title": "" + }, + "node-graph": { + "aria-label-layered-layout-performance-warning": "", + "aria-label-nodes-hidden-warning": "", + "computing-layout": "", + "no-data": "Keine Daten", + "hidden-nodes_one": "", + "hidden-nodes_other": "", + "processed-nodes_one": "", + "processed-nodes_other": "" + }, + "node-graph-panel": { + "no-data-found-in-response": "" + }, + "node-header": { + "label-subtitle": "", + "label-title": "Titel" + }, + "view-controls": { + "hide-config": "", + "show-config": "", + "title-zoom-in": "", + "title-zoom-out": "" + } + }, "notifications": { "empty-state": { "description": "Benachrichtigungen, die Sie erhalten haben, werden hier angezeigt", @@ -7021,6 +8586,11 @@ "label-organization-name": "Organisationsname", "placeholder-org-name": "Org.-Name" }, + "org-details-page": { + "title": { + "confirm-preferences-update": "" + } + }, "org-profile": { "label-organization-name": "Organisationsname", "label-organization-profile": "Organisationsprofil", @@ -7040,7 +8610,10 @@ "tooltip": "Sie können jetzt die Option „Keine Basisrolle“ auswählen und Berechtigungen zu Ihren benutzerdefinierten Anforderungen hinzufügen. Weitere Informationen finden Sie in <1>unserer Dokumentation</1>." }, "user-invite-page": { - "sub-title": "Versenden Sie eine Einladung oder fügen Sie einen bestehenden Grafana-Nutzer zur Organisation hinzu.<1> {{orgName}}</1>" + "sub-title": "Versenden Sie eine Einladung oder fügen Sie einen bestehenden Grafana-Nutzer zur Organisation hinzu.<1> {{orgName}}</1>", + "text": { + "invite-user": "" + } } }, "org-picker": { @@ -7052,6 +8625,38 @@ } }, "panel": { + "get-calculation-value-data-links-variable-suggestions": { + "value-calc-var": { + "label": { + "calculation-name": "" + } + } + }, + "get-data-links-variable-suggestions": { + "value-time-var": { + "label": { + "time": "Zeit" + } + } + }, + "get-field-links-supplier": { + "text": { + "data": "Daten", + "field": "Feld", + "series": "", + "value": "Wert" + } + }, + "get-field-vars": { + "label": { + "name": "Name" + } + }, + "get-panel-links-variable-suggestions": { + "label": { + "all-variables": "" + } + }, "header-menu": { "copy": "Kopieren", "create-library-panel": "Bibliotheksleiste erstellen", @@ -7112,6 +8717,13 @@ "select-placeholder": "Nach Typ filtern" }, "playlist": { + "playlist-new-page": { + "page-nav": { + "text": { + "new-playlist": "Neue Playlist" + } + } + }, "playlist-table-rows": { "aria-label-playlist-item": "Playlist-Element, {{itemType}}, {{itemValue}}", "multiple-dashboards-found": "Mehrere Elemente gefunden: {{items}}", @@ -7128,6 +8740,12 @@ "label-mode": "Modus", "label-time-and-refresh": "Zeit und Aktualisierung", "label-variables": "Variable", + "modes": { + "label": { + "kiosk": "Kiosk", + "normal": "Normal" + } + }, "title-start-playlist": "Playlist starten" } }, @@ -7194,6 +8812,19 @@ }, "browse": { "aria-label-plugin-type-filter": "Plugin-Typ-Filter", + "filter-by-options": { + "label": { + "all": "Alle", + "installed": "Installiert", + "new-updates": "" + } + }, + "label": { + "all": "Alle", + "applications": "", + "data-sources": "Datenquellen", + "panels": "Fenster" + }, "label-search": "Suche", "label-state": "Status", "label-type": "Typ", @@ -7275,12 +8906,24 @@ "empty-state": { "message": "Keine Plugins gefunden" }, + "extensions-log-data-source": { + "message": { + "ok": "OK" + } + }, "filter": { "disabled": "Dieser Filter wurde deaktiviert, da der Grafana-Server nicht auf grafana.com zugreifen kann", "sort": "Sortieren", "sort-list": "Plugin-Liste sortieren", "state": "Status" }, + "get-feature-state-info": { + "text": { + "alpha": "", + "beta": "Beta", + "deprecated": "Veraltet" + } + }, "get-started-with-app": { "disable": "Deaktivieren", "enable": "Aktivieren" @@ -7337,6 +8980,16 @@ "plugin-details-header-dependencies": { "grafana-dependency": "Grafana {{grafanaDependency}}" }, + "plugin-details-page": { + "not-found-model": { + "subTitle": { + "requested-belong-plugin": "" + }, + "text": { + "unknown-plugin": "" + } + } + }, "plugin-details-signature": { "body-invalid-plugin-signature": "Grafana Labs überprüft jedes Plugin, um zu verifizieren, dass es eine gültige digitale Signatur aufweist. Die Verifizierung der Plugin-Signatur ist Teil unserer Sicherheitsmaßnahmen. Dadurch wird sichergestellt, dass Plugins sicher und vertrauenswürdig sind. Grafana Labs kann die Integrität dieses unsignierten Plugins nicht garantieren. Bitten Sie den Autor des Plugins, dessen Signatur anzufordern.", "read-more-about-plugins-signing": "Erfahren Sie mehr über das Signieren von Plugins.", @@ -7382,6 +9035,13 @@ "search-field": { "placeholder-search-grafana-plugins": "Grafana-Plugins suchen" }, + "use-plugin-details-tabs": { + "nav-model-children": { + "text": { + "dashboards": "Dashboards" + } + } + }, "version-install-button": { "text-installed": "Installiert" }, @@ -7499,6 +9159,11 @@ "label-git-hub-features": "GitHub-Funktionen", "label-realtime-feedback": "Echtzeit-Feedback" }, + "connect-page": { + "subTitle": { + "connect-external-storage-manage-resources": "" + } + }, "connect-repository-button": { "configure": "Konfigurieren", "configure-file": "Datei-Bereitstellung konfigurieren", @@ -7532,7 +9197,13 @@ }, "edit-repository-page": { "back-to-repositories": "Zurück zu den Repositorys", - "repository-config-exists-configuration": "Achten Sie darauf, dass die Repository-config in der Konfigurationsdatei vorhanden ist." + "repository-config-exists-configuration": "Achten Sie darauf, dass die Repository-config in der Konfigurationsdatei vorhanden ist.", + "subTitle": { + "configure-repository-storing-resources": "" + }, + "text": { + "configure-repository": "" + } }, "empty-state": { "no-jobs": "Keine Aufträge ..." @@ -7595,6 +9266,11 @@ "no-results-matching-your-query": "Keine passenden Ergebnisse zu Ihrer Abfrage", "placeholder-search": "Suche" }, + "get-default-values": { + "title": { + "repository": "Repository" + } + }, "getting-started": { "alert-temporary-outage": "Wenn Sie Ihre gesamte Instanz verbinden, sind während der Ausführung der Migration keine Dashboards verfügbar. Wir empfehlen Ihnen, Ihre Nutzer vor Beginn des Prozesses zu benachrichtigen.", "modal-description-public-access": "Richten Sie zur Aktivierung der GitHub-Integration den öffentlichen Zugriff auf Ihre Grafana-Instanz ein", @@ -7739,7 +9415,18 @@ "dashboard-preview": "Dashboard-Vorschau", "existing-dashboard": "Vorhandenes Dashboard", "history": "Verlauf", + "message": { + "removed-from-repo-test-ui": "", + "updated-from-repo-test-ui": "" + }, "repository": "Repository", + "tab-info": { + "label": { + "dry-run-result-after-apply": "", + "existing-from-grafana": "", + "file-from-repository": "" + } + }, "title-error-saving-file": "Fehler beim Speichern der Datei" }, "setup-modal": { @@ -8152,14 +9839,6 @@ "reload-button": "Neu laden", "title": "Die Anwendungsdatei konnte nicht gefunden werden" }, - "sandbox": { - "test-stuff-page": { - "application-notifications-toasts-testing": "Testen von Anwendungsbenachrichtigungen (Toasts)", - "error": "Fehler", - "success": "Erfolg", - "warning": "Warnung" - } - }, "save-dashboards": { "message-length": { "info": "Die Nachricht ist {{messageLength}} Zeichen lang und überschreitet die maximale Länge von 500 Zeichen. Bitte kürzen Sie sie vor dem Speichern.", @@ -8219,6 +9898,14 @@ "view-as-folders": "Nach Ordnern anzeigen", "view-as-list": "Als Liste anzeigen" }, + "bluge-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } + }, "dashboard-actions": { "import": "Importieren", "new": "Neu", @@ -8246,6 +9933,14 @@ "search-results-table": { "aria-label-search-results-table": "Suchergebnistabelle", "no-data": "Keine Werte" + }, + "unified-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } } }, "select": { @@ -8317,6 +10012,11 @@ "delete-service-account": "Dienstkonto löschen", "disable-service-account": "Dienstkonto deaktivieren", "enable-service-account": "Dienstkonto aktivieren", + "page-nav": { + "subTitle": { + "manage-settings-individual-service-account": "" + } + }, "title-delete-service-account": "Dienstkonto löschen", "title-disable-service-account": "Dienstkonto deaktivieren", "tokens": "Tokens", @@ -8633,6 +10333,12 @@ "sort-picker": { "select-aria-label": "Sortieren" }, + "status-history": { + "status-history-panel": { + "too-many-points_one": "", + "too-many-points_other": "" + } + }, "support-bundles": { "new-bundle-button": { "new-support-bundle": "Neues Support-Paket" @@ -8640,7 +10346,10 @@ "support-bundles-create-unconnected": { "cancel": "Abbrechen", "create": "Erstellen", - "sub-title": "Wählen Sie die Komponenten für das Support-Paket. Das Support-Paket ist nach der Erstellung 3 Tage lang verfügbar." + "sub-title": "Wählen Sie die Komponenten für das Support-Paket. Das Support-Paket ist nach der Erstellung 3 Tage lang verfügbar.", + "text": { + "create-support-bundle": "" + } }, "support-bundles-unconnected": { "created-on": "Erstellt am", @@ -8655,10 +10364,35 @@ "login": "Anmelden" }, "table": { + "auto-cell-options-editor": { + "description-wrap-text": "", + "label-wrap-text": "" + }, + "bar-gauge-cell-options-editor": { + "label-gauge-display-mode": "", + "label-value-display": "" + }, + "color-background-cell-options-editor": { + "description-apply-to-entire-row": "", + "description-wrap-text": "", + "label": { + "text-alpha": "" + }, + "label-apply-to-entire-row": "", + "label-background-display-mode": "", + "label-wrap-text": "", + "wrap-text": "" + }, "container": { "content": "Wenn zu viele Spalten in einer Tabelle angezeigt werden, kann dies die Leistung beeinträchtigen und die Daten können schwieriger zu lesen sein. Präzisieren Sie, sofern möglich, Ihre Abfragen.", "show-all-series": "Alle Spalten anzeigen", "show-only-series": "Nur {{MAX_NUMBER_OF_COLUMNS}} Spalten werden angezeigt" + }, + "image-cell-options-editor": { + "description-alt-text": "", + "description-title-text": "", + "label-alt-text": "", + "label-title-text": "" } }, "tag-filter": { @@ -8674,6 +10408,24 @@ "select-placeholder": "Wählen Sie ein Team" }, "teams": { + "build-nav-model": { + "nav-model": { + "subTitle": { + "manage-members-and-settings": "" + }, + "text": { + "settings": "Einstellungen" + } + }, + "team-group-sync": { + "text": { + "external-group-sync": "Synchronisierung der externen Gruppe" + } + }, + "text": { + "members": "Mitglieder" + } + }, "create-team": { "create": "Erstellen", "description-email": "Dies ist optional und wird hauptsächlich genutzt, um individuelle Team-Avatare zu ermöglichen", @@ -8695,6 +10447,9 @@ "external-group-sync": "Synchronisierung der externen Gruppe", "label-add-external-group": "Externe Gruppe hinzufügen", "team-sync-upgrade": "Fügen Sie eine Gruppe hinzu, um die Team-Synchronisierung während Ihrer Testversion von Grafana Pro kostenlos zu aktivieren", + "text": { + "add-group": "Gruppe hinzufügen" + }, "title-there-external-groups": "Es gibt keine externen Gruppen, mit denen synchronisiert werden könnte", "tooltip-add-external-group": "Beispiel für eine LDAP-Gruppe: {{example}}" }, @@ -8796,6 +10551,42 @@ "select-search-input": "Suchbegriff eingeben (Land, Stadt, Abkürzung)" } }, + "timeseries": { + "annotation-editor2": { + "add-annotation": "Anmerkung hinzufügen", + "cancel": "Abbrechen", + "edit-annotation": "", + "label-description": "Beschreibung", + "label-tags": "Tags", + "placeholder-add-tags": "", + "save": "Speichern", + "saving": "Einsparen" + }, + "annotation-tooltip2": { + "tooltip-delete": "Löschen", + "tooltip-edit": "Bearbeiten" + }, + "line-style-editor": { + "title-the-input-expects-a-segment-list": "", + "tooltip-help": "Hilfe" + }, + "nulls-threshold-input": { + "placeholder-never": "Nie" + }, + "outside-range-plugin": { + "data-outside-time-range": "", + "zoom-to-data": "" + }, + "timezones-editor": { + "tooltip-add-timezone": "", + "tooltip-remove-timezone": "" + } + }, + "traces": { + "traces-panel": { + "no-data-found-in-response": "" + } + }, "transformations": { "empty": { "add-transformation-body": "Mithilfe von Transformationen können Daten auf verschiedene Arten geändert werden, bevor Ihre Visualisierung angezeigt wird.<1></1>Dies beinhaltet die Verknüpfung von Daten, das Umbenennen von Feldern, die Erstellung von Berechnungen, das Formatieren von Daten für die Anzeige und mehr.", @@ -8832,6 +10623,10 @@ "convert-field-type-transformer-editor": { "aria-label-add-a-convert-field-type-transformer": "Transformator für „Feldtyp konvertieren“ hinzufügen", "aria-label-remove-convert-field-type-transformer": "Transformator für „Feldtyp konvertieren“ entfernen", + "label": { + "browser": "Browser", + "utc": "" + }, "label-as": "als", "label-date-format": "Datumsformat", "label-field": "Feld", @@ -8918,11 +10713,32 @@ "tooltip-format": "Das Ausgabeformat für das Feld, das als <2>Moment.js-Format-String</2> angegeben ist.", "tooltip-timezone-manually": "Stellen Sie die Zeitzone des Datums manuell ein" }, + "get-timezone-options": { + "label": { + "browser": "Browser", + "utc": "" + } + }, "get-tooltips": { "description": "Ein gültiger Pfad eines JSON-Objekts.", "json-value": "JSON-Wert:", + "map-valid-paths": { + "description": { + "extract-fields-from-object": "", + "extract-value": "", + "extract-value-first-element": "", + "extract-value-second-element": "" + } + }, "valid-paths": "Gültige Pfade:" }, + "get-transformer-option-pane": { + "root": { + "title": { + "root": "" + } + } + }, "group-by-field-configuration": { "placeholder-ignored": "Ignoriert", "placeholder-select-stats": "Statistiken auswählen" @@ -8939,7 +10755,23 @@ "label-cell-value": "Zellenwert", "label-column": "Spalte", "label-empty-value": "Leerer Wert", - "label-row": "Zeile" + "label-row": "Zeile", + "special-value-options": { + "description": { + "boolean-false-value": "", + "boolean-true-value": "", + "empty-string": "", + "null-value": "", + "number-value": "" + }, + "label": { + "empty": "Leer", + "false": "", + "null": "", + "true": "", + "zero": "" + } + } }, "histogram-transformer-editor": { "placeholder-auto": "Auto", @@ -9002,10 +10834,22 @@ "tooltip-naming": "Bestimmt, wie die Namen der ausgewählten Felder angezeigt werden. Da der Frame-Name normalerweise für tabellarische Daten besser ist" }, "partition-by-values-editor": { + "keep-fields-options": { + "label": { + "no": "Nein", + "yes": "Ja" + } + }, "label-field": "Feld", "label-keep-fields": "Felder beibehalten", "label-naming": "Benennung", "label-select-field": "Feld auswählen", + "naming-modes-options": { + "label": { + "as-frame-name": "", + "as-label": "" + } + }, "partition-values-works-single-frame": "Partitionieren nach Werten funktioniert nur mit einem einzelnen Frame.", "tooltip-keeps-partition-fields-frames": "Behält die Partitionsfelder in den Frames" }, @@ -9027,6 +10871,16 @@ "label-include-time": "Zeit einbeziehen", "label-labels-to-fields": "Labels zu Feldern", "label-mode": "Modus", + "modes": { + "description": { + "collapse-field-single-value": "", + "create-table-series-value": "" + }, + "label": { + "reduce-fields": "", + "series-to-rows": "" + } + }, "placeholder-choose-stat": "Statistik auswählen" }, "regex-matcher-editor": { @@ -9034,11 +10888,23 @@ "variable-regex-documentation": "" }, "regression-transformer-editor": { + "label": { + "cubic": "", + "quadratic": "", + "quartic": "", + "quintic": "" + }, "label-degree": "Grad", "label-model-type": "Modelltyp", "label-predicted-points": "Prognostizierte Punkte", "label-x-field": "X-Feld", "label-y-field": "Y-Feld", + "model-type-options": { + "label": { + "linear": "", + "polynomial": "" + } + }, "tooltip-number-of-xy-points-to-predict": "Anzahl der zu prognostizierenden X-, Y-Punkte" }, "rename-by-regex-transformer-editor": { @@ -9056,6 +10922,23 @@ "label-reverse": "Rückwärts", "placeholder-select-field": "Feld auswählen" }, + "supplier": { + "description": { + "apply-spatial-operations-to-the-geometry": "", + "create-a-line-between-two-points": "", + "geometry-define-field-headingdistancearea": "" + }, + "label": { + "area": "", + "as-line": "", + "calculate-value": "", + "distance": "", + "heading": "", + "line-builder": "", + "prepare-spatial-field": "", + "transform": "" + } + }, "time-series-table-transform-editor": { "label-stat": "Stat.", "label-time-field": "Zeitfeld", @@ -9089,7 +10972,19 @@ "placeholder-auto": "Auto", "placeholder-field": "Feld", "tooltip-window-size": "Fenster-Größe", - "tooltip-window-size-percent": "Legen Sie die Fenster-Größe als Prozentsatz der Gesamtdaten fest" + "tooltip-window-size-percent": "Legen Sie die Fenster-Größe als Prozentsatz der Gesamtdaten fest", + "type-options": { + "label": { + "centered": "", + "trailing": "" + } + }, + "window-size-mode-options": { + "label": { + "fixed": "", + "percentage": "" + } + } } }, "upgrade-box": { @@ -9146,6 +11041,11 @@ }, "users-action-bar-unconnected": { "invite": "Einladen", + "options": { + "label": { + "users": "Benutzer" + } + }, "placeholder-search-login-email": "Nutzer nach Login, E-Mail-Adresse oder Name suchen" } }, @@ -9189,6 +11089,32 @@ "confirm-delete-modal": { "title-delete-variable": "Variable löschen" }, + "create-ad-hoc-variable-adapter": { + "description": { + "add-keyvalue-filters-on-the-fly": "" + } + }, + "create-custom-variable-adapter": { + "description": { + "define-variable-values-manually": "" + } + }, + "create-interval-variable-adapter": { + "description": { + "define-timespan-interval": "" + } + }, + "create-query-variable-adapter": { + "description": { + "variable-values-fetched-datasource-query": "" + } + }, + "data-source-variable-slice": { + "text": { + "default": "", + "no-data-sources-found": "Keine Datenquellen gefunden" + } + }, "empty-state": { "button-title": "Variable hinzufügen", "info-box-content": "Variablen ermöglichen interaktivere und dynamischere Dashboards. Anstatt Dinge wie Server- oder Sensornamen in Ihren Metrik-Abfragen fest zu codieren, können Sie stattdessen Variablen verwenden. Variablen werden als Listenfelder oben im Dashboard angezeigt. Mit diesen Drop-down-Listen können die Daten, die in Ihrem Dashboard angezeigt werden sollen, einfach geändert werden.", @@ -9215,6 +11141,13 @@ "placeholder-default-value-if-any": "Standardwert, falls vorhanden", "text-options": "Textoptionen" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "unknown-table": { "loading": "Wird geladen ...", "no-unknowns": "Keine umbenannten oder fehlenden Variablen gefunden.", @@ -9271,5 +11204,25 @@ "data-hover-view": { "link": "Link" } + }, + "welcome": { + "welcome-banner": { + "need-help": "Brauchen Sie Hilfe?", + "welcome-to-grafana": "" + } + }, + "xychart": { + "series-editor": { + "add-series": "", + "aria-label-select-series": "", + "label-color-field": "", + "label-frame": "Frame", + "label-size-field": "", + "label-x-field": "X-Feld", + "label-y-field": "Y-Feld", + "placeholder-all-frames": "", + "placeholder-select-frame": "", + "tooltip-delete-series": "" + } } } \ No newline at end of file diff --git a/public/locales/en-US/grafana.json b/public/locales/en-US/grafana.json index c3c0c0ba8e3..cf8eaaf5f50 100644 --- a/public/locales/en-US/grafana.json +++ b/public/locales/en-US/grafana.json @@ -72,6 +72,11 @@ }, "admin-edit-org-page": { "label-name": "Name", + "page-nav": { + "subTitle": { + "manage-settings-roles-organization": "Manage settings and user roles for an organization." + } + }, "render-missing-permission-message": { "title-access-denied": "Access denied" } @@ -233,6 +238,13 @@ "upgrade-info": { "title": "Enterprise license" }, + "user-admin-page": { + "page-nav": { + "subTitle": { + "manage-settings-for-an-individual-user": "Manage settings for an individual user." + } + } + }, "user-create-page": { "label-email": "Email", "label-name": "Name", @@ -243,9 +255,16 @@ "label-ldap": "LDAP" }, "user-list-admin-page-un-connected": { + "label": { + "active-last-days": "Active last 30 days", + "all-users": "All users" + }, "placeholder-search-login-email": "Search user by login, email, or name." }, "user-list-anonymous-devices-page-un-connected": { + "label": { + "active-last-days": "Active last 30 days" + }, "placeholder-search-devices-by-ip-address": "Search devices by IP address." }, "user-list-page": { @@ -364,6 +383,12 @@ "no-grouping": "No grouping" }, "alert-group-alerts-table": { + "columns": { + "label": { + "instance-labels": "Instance labels", + "notification-state": "Notification state" + } + }, "duration": "for {{time}}" }, "alert-group-filter": { @@ -443,6 +468,11 @@ "description-section": "Enter a name to identify your {{entityName}}.", "label-metric": "Metric", "label-name": "Name", + "message": { + "must-enter-a-metric-name": "Must enter a metric name", + "must-enter-a-name": "Must enter a name", + "please-select-a-data-source": "Please select a data source" + }, "metric-aria-label-metric": "metric", "metric-placeholder-recorded-metric": "Give the name of the new recorded metric", "placeholder-name": "Give your {{namePlaceholder}} a name", @@ -495,6 +525,9 @@ "alertmanager-config": { "gma-manual-configuration-description": "The internal Grafana Alertmanager configuration cannot be manually changed. To change this configuration, edit the individual resources through the UI.", "gma-manual-configuration-is-not-supported": "Manual configuration changes not supported", + "message": { + "configuration-cannot-be-empty": "Configuration cannot be empty" + }, "reset": "Reset", "reset-confirmation": "Are you sure you want to reset configuration for \"{{alertmanagerName}}\"? Contact points and notification policies will be reset to their defaults.", "resetting-configuration-might-while": "Resetting configuration, this might take a while.", @@ -584,6 +617,9 @@ "create-a-contact-point": "Create a contact point", "label-default-contact-point": "Default contact point", "label-timing-options": "Timing options", + "message": { + "required": "Required." + }, "or": "or" }, "am-routes-expanded-form": { @@ -605,11 +641,19 @@ "label-override-grouping": "Override grouping", "label-value": "Value", "matching-labels": "Matching labels", + "message": { + "required": "Required." + }, "placeholder-label": "label", "placeholder-value": "value", "remove": "Remove", "tooltip-remove-matcher": "Remove matcher" }, + "annotation-header-field": { + "message": { + "required": "Required." + } + }, "annotations": { "dashboard-annotation-field": { "dashboard": "Dashboard {{dashboardUid}}", @@ -681,6 +725,25 @@ "title": "Unable to display all events" } }, + "central-alert-history-scene": { + "scene": { + "labels-filter-variable": { + "label": { + "labels": "Labels: " + } + }, + "transitions-from-filter-variable": { + "label": { + "start-state": "Start state:" + } + }, + "transitions-to-filter-variable": { + "label": { + "end-state": "End state:" + } + } + } + }, "channel-sub-form": { "delete": "Delete", "duplicate": "Duplicate", @@ -717,11 +780,17 @@ }, "cloud-data-source-selector": { "label": "Select data source", - "label-disabled": "Data source" + "label-disabled": "Data source", + "message": { + "please-select-a-data-source": "Please select a 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", + "message": { + "must-be-a-positive-integer": "Must be a positive integer." + }, "title-set-evaluation-behavior": "Set evaluation behavior" }, "cloud-receiver-form": { @@ -762,6 +831,9 @@ "contact-point-selector": { "aria-label-refresh-contact-points": "Refresh contact points", "contact-point-picker-label-contact-point": "Contact point", + "message": { + "contact-point-is-required": "Contact point is required." + }, "title-failed-to-fetch-contact-points": "Failed to fetch contact points", "tooltip-refresh-contact-points-list": "Refresh contact points list" }, @@ -828,6 +900,14 @@ }, "copy-to-clipboard": "Copy \"{{label}}\" to clipboard", "create-metadata": { + "label": { + "dashboard": "Dashboard", + "dashboard-and-panel": "Dashboard and panel", + "evaluation-interval": "Evaluation interval", + "labels": "Labels", + "metric-name": "Metric name", + "runbook-url": "Runbook URL" + }, "view-dashboard": "View dashboard", "view-panel": "View panel" }, @@ -868,9 +948,6 @@ "title-search-panel": "Search panel", "title-select-dashboard-and-panel": "Select dashboard and panel" }, - "data-source-section": { - "import-to-grafana": "Import to Grafana rules" - }, "datasource-not-found": { "card-description": "The datasource for this query was not found, it was either removed or is not installed correctly.", "remove-query": "Remove query", @@ -952,6 +1029,11 @@ "text-loading-template": "Loading template...", "title-failed-to-fetch-notification-template": "Failed to fetch notification template" }, + "edit-mute-timing-page": { + "text": { + "edit-time-interval": "Edit time interval" + } + }, "editor": { "edit-alert-rule": "Edit alert rule", "edit-recording-rule": "Edit recording rule", @@ -965,6 +1047,11 @@ "error-summary-button": { "content-show-all-errors": "Show all errors" }, + "evaluate-every-validation-options": { + "message": { + "required": "Required." + } + }, "evaluation-behavior-summary": { "evaluate": "Every {{interval}}", "label-evaluate": "Evaluate", @@ -982,6 +1069,9 @@ "evaluation-group-creation-modal": { "description-group-name": "A group evaluates all its rules over the same evaluation interval.", "description-often-rules-group-evaluated": "How often all rules in the group are evaluated.", + "message": { + "required": "Required." + }, "placeholder-enter-a-name": "Enter a name", "title-new-evaluation-group": "New evaluation group" }, @@ -1004,12 +1094,24 @@ "title-permission-editrecreate-silence": "You do not have permission to edit/recreate this silence", "title-silence-not-found": "Existing silence \"{{silenceId}}\" not found" }, + "existing-silence-editor-page": { + "page-nav": { + "text": { + "edit-silence": "Edit silence" + } + } + }, "export": { "subtitle": { "formats": "Select the format and download the file or copy the contents to clipboard", "one-format": "Download the file or copy the contents to clipboard" } }, + "export-new-grafana-rule-page": { + "text": { + "export-new-grafana-rule": "Export new Grafana rule" + } + }, "export-new-rule-button": { "tooltip-export-new-grafana-rule": "Export new grafana rule" }, @@ -1035,6 +1137,16 @@ "no-data": "No data", "page-counter": "{{pageStart}} - {{pageEnd}} of {{numPages}}" }, + "feature-toggle-page": { + "nav-model": { + "subTitle": { + "enable-alerting-grafana-config": "To enable alerting, enable it in the Grafana config" + }, + "text": { + "alerting-is-not-enabled": "Alerting is not enabled" + } + } + }, "federated-rule-warning": { "experimental": "Federated rule groups are currently an experimental feature.", "read-documentation": "Read documentation", @@ -1042,6 +1154,13 @@ }, "file-export-inline-documentation": { "api-provisioning": "{{name}} format is only valid for API Provisioning. <3>Read more in the docs.</3>", + "export-inline-doc": { + "title": { + "apiprovisioning-format": "API-provisioning format", + "fileprovisioning-format": "File-provisioning format", + "terraformprovisioning-format": "Terraform-provisioning format" + } + }, "file-provisioning": "{{name}} format is only valid for File Provisioning. <3>Read more in the docs.</3>", "terraform-provisioning": "{{name}} format is only valid for Terraform Provisioning. <3>Read more in the docs.</3>" }, @@ -1083,7 +1202,10 @@ } }, "folder-selector": { - "description-select-folder": "Select a folder to store your rule in." + "description-select-folder": "Select a folder to store your rule in.", + "message": { + "select-a-folder": "Select a folder" + } }, "folderAndGroup": { "evaluation": { @@ -1098,15 +1220,88 @@ "for-input": { "description-pending": "Period during which the threshold condition must be met to trigger an alert. Selecting \"None\" triggers the alert immediately once the condition is met." }, + "for-validation-options": { + "message": { + "required": "Required." + } + }, "generate-alert-data-modal": { "add-alert-data": "Add alert data", "add-alert-data-to-payload": "Add alert data to payload", + "alert-options": { + "label": { + "firing": "Firing", + "resolved": "Resolved" + } + }, "review-alert-payload": " Review alert data to add to the payload:", "title-add-custom-alerts": "Add custom alerts" }, + "get-alert-suggestions": { + "documentation": { + "annotations-attached-alert": "A set of annotations attached to the alert.", + "fingerprint-identify-alert": "Fingerprint that can be used to identify the alert.", + "grafana-external-alertmanager": "Back link to Grafana or external Alertmanager.", + "organization-alert": "The ID of the organization that owns the alert.", + "time-the-alert-started-firing": "Time the alert started firing." + }, + "value": { + "labels-attached-alert": "A set of labels attached to the alert.", + "status-alert-firing-resolved": "Status of the alert. It can be `firing` or `resolved`" + } + }, + "get-cloud-scenes": { + "title": { + "mimir-alertmanager": "Mimir Alertmanager" + } + }, + "get-global-suggestions": { + "value": { + "an-array-containing-all-alerts": "An Array containing all alerts" + } + }, + "get-grafana-alertmanager-scenes": { + "title": { + "grafana-alertmanager": "Grafana Alertmanager" + } + }, + "get-grafana-managed-scenes": { + "title": { + "grafanamanaged-alert-rules": "Grafana-managed alert rules" + } + }, + "get-mimir-managed-rules-per-group-scenes": { + "rule-group-handler": { + "label": { + "rule-group": "Rule Group" + } + }, + "title": { + "mimirmanaged-alert-rules-per-rule-group": "Mimir-managed alert rules - per rule group" + } + }, + "get-mimir-managed-rules-scenes": { + "title": { + "mimirmanaged-alert-rules": "Mimir-managed alert rules" + } + }, "get-preview-results": { "title-error": "Error" }, + "get-state-display-model": { + "text": { + "alerting": "ALERTING", + "error": "ERROR", + "firing": "FIRING", + "inactive": "INACTIVE", + "no-data": "NO DATA", + "ok": "OK", + "paused": "PAUSED", + "pending": "PENDING", + "recovering": "RECOVERING", + "unknown": "UNKNOWN" + } + }, "getting-stared": { "learn-more": "For a hands-on introduction, refer to our <2>tutorial to get started with Grafana Alerting</2>" }, @@ -1148,6 +1343,10 @@ "label-disable-resolved-message": "Disable resolved message" }, "grafana-evaluation-behavior-step": { + "message": { + "must-be-a-positive-integer": "Must be a positive integer.", + "must-enter-a-group-name": "Must enter a group name" + }, "missing-series-resolve-placeholder": "Default: 2", "or": "or", "placeholder-select-an-evaluation-group": "Select an evaluation group...", @@ -1164,6 +1363,11 @@ "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-modify-export-page": { + "text": { + "modify-export": "Modify export" + } + }, "grafana-mute-timing-exporter-preview": { "text-loading": "Loading...." }, @@ -1216,6 +1420,9 @@ }, "group-and-namespace-fields": { "group-picker-label-group": "Group", + "message": { + "required": "Required." + }, "namespace-picker-label-namespace": "Namespace" }, "group-by": { @@ -1272,14 +1479,19 @@ "header": { "tooltip-remove": "Remove expression \"{{refId}}\"" }, + "history-apidatasource": { + "message": { + "data-source-is-working": "Data source is working" + }, + "title": { + "success": "Success" + } + }, "home": { "label-get-started": "Get started", "label-insights": "Insights", "title-alerting": "Alerting" }, - "import-from-dsrules": { - "description-folder-import-rules": "The folder to import the rules to" - }, "import-to-gma": { "action-button": "Import", "additional-settings": "Additional settings", @@ -1287,8 +1499,9 @@ "confirm-modal": { "confirm": "Import", "loading": "Loading...", - "loading-body": "Preparing data to be imported.This can take a while...", + "loading-body": "Preparing data to be imported. This can take a while...", "no-rules-body": "There are no rules to import. Please select a different namespace or rule group.", + "no-rules-body-yaml": "There are no rules to import. Please select a different yaml file.", "no-rules-title": "No rules to import", "plugin-rules-warning": { "text": "We have detected that some rules are managed by plugins. These rules will not be imported.", @@ -1307,11 +1520,12 @@ "label": "Group" }, "import-location-and-filters": "Import location and filters", + "import-source": "Import source", "namespace": { "description": "Type to search for an existing namespace", "label": "Namespace" }, - "pageTitle": "Import alert rules from a data source to Grafana-managed rules", + "pageTitle": "Import alert rules", "pause": { "label": "Pause imported alerting rules" }, @@ -1319,10 +1533,26 @@ "label": "Pause imported recording rules" }, "recording-rules": "Recording rules", + "source": { + "datasource": "Existing data source-managed rules", + "datasource-description": "Import rules from existing data sources", + "yaml": "Prometheus YAML file", + "yaml-description": "Import rules from a Prometheus YAML file." + }, "success": "Successfully imported alert rules to Grafana-managed rules.", "target-folder": { + "description": "The folder to import the rules to", "label": "Target folder" - } + }, + "yaml": { + "description": "Select a Prometheus-compatible YAML file to import", + "label": "Prometheus YAML file", + "required-message": "Please select a file", + "target-datasource": "Target data source", + "target-datasource-description": "Select the data source that will be queried by the imported rules. Make sure metrics used in the imported rules are available in this data source.", + "target-datasource-required": "Please select a target data source" + }, + "yaml-error": "Failed to parse YAML file: {{error}}" }, "insights": { "monitor-status-of-system": "Monitor the status of your system", @@ -1398,6 +1628,9 @@ "text-loading-existing-labels": "Loading existing labels" }, "labels-without-suggestions": { + "message": { + "required": "Required." + }, "placeholder-key": "key", "placeholder-value": "value" }, @@ -1437,6 +1670,24 @@ "log-record-viewer-by-timestamp": { "aria-label-state-history-by-timestamp": "State history by timestamp" }, + "log-timeline-viewer": { + "label": { + "firing": "Firing", + "mixed": "Mixed", + "no-data": "No Data", + "normal": "Normal", + "pending": "Pending", + "recovering": "Recovering" + } + }, + "loki-apidatasource": { + "message": { + "data-source-is-working": "Data source is working" + }, + "title": { + "success": "Success" + } + }, "loki-state-history": { "clear-filters": "Clear filters", "common-labels": "Common labels", @@ -1449,6 +1700,14 @@ "button": "Manage permissions", "title": "Manage permissions" }, + "manual-and-automatic-routing": { + "routing-options": { + "label": { + "select-contact-point": "Select contact point", + "use-notification-policy": "Use notification policy" + } + } + }, "matcher-filter": { "filter-alerts-using-label-querying-without-braces": "Filter alerts using label querying without braces, ex:", "filter-alerts-using-label-querying-without-spaces": "Filter alerts using label querying without spaces, ex:", @@ -1466,6 +1725,9 @@ "label-operator": "Operator", "label-refine-affected-alerts": "Refine affected alerts", "label-value": "Value", + "message": { + "required": "Required." + }, "placeholder-label": "label", "placeholder-value": "value", "remove": "Remove", @@ -1497,6 +1759,16 @@ "aria-label": "More", "button-text": "More" }, + "multiple-data-source-picker": { + "get-data-source-options": { + "grouped-options": { + "label": { + "data-sources-with-configured-alert-rules": "Data sources with configured alert rules", + "other-data-sources": "Other data sources" + } + } + } + }, "mute-timing-actions-buttons": { "text-disabled": "Disabled", "title-delete-mute-timing": "Delete mute timing" @@ -1560,11 +1832,26 @@ "read-more": "Read about notification policies.", "title-notification-routing": "Notification routing" }, + "new-mute-timing-page": { + "text": { + "add-time-interval": "Add time interval" + } + }, "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" }, + "new-silence-page": { + "page-nav": { + "subTitle": { + "configure-silences-notifications-particular-alert": "Configure silences to stop notifications from a particular alert rule" + }, + "text": { + "silence-alert-rule": "Silence alert rule" + } + } + }, "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" @@ -1791,6 +2078,9 @@ "expressions": "Expressions", "loading-data-sources": "Loading data sources...", "manipulate-returned-queries-other-operations": "Manipulate data returned from queries with math and other operations.", + "message": { + "a-valid-expression-is-required": "A valid expression is required" + }, "no-compatible-sources": "You appear to have no compatible data sources", "title-deactivate-advanced-options": "Deactivate advanced options", "title-queries-expressions-configured": "No queries or expressions have been configured" @@ -1842,7 +2132,8 @@ }, "recording-rules": { "description-target-data-source": "The Prometheus data source to store recording rules in", - "label-target-data-source": "Target data source" + "label-target-data-source": "Target data source", + "target-data-source-required": "Please select a target data source" }, "recording-rules-name-space-and-group-step": { "description-select-namespace-group-recording": "Select the Namespace and Group for your recording rule.", @@ -2103,6 +2394,9 @@ "collapse-all": "Collapse all", "expand-all": "Expand all" }, + "rule-list-v2": { + "import-to-gma": "Import alert rules" + }, "rule-modify-export": { "text-loading-the-rule": "Loading the rule...", "title-cannot-exist": "Cannot load the rule. The rule does not exist", @@ -2181,6 +2475,10 @@ "placeholder-search-input": "Search by name or enter filter query..." }, "health": "Health", + "label": { + "hide": "Hide", + "show": "Show" + }, "manage-alerts": "In these data sources, you can select Manage alerts via Alerting UI to be able to manage these alert rules in the Grafana UI as well as in the data source where they were configured.", "placeholder-all-data-sources": "All data sources", "plugin-rules": "Plugin rules", @@ -2277,6 +2575,9 @@ "label-comment": "Comment", "label-created-by": "Created By", "label-duration": "Duration", + "message": { + "required": "Required." + }, "placeholder-whos-creating-the-silence": "Who's creating the silence", "save-silence": "Save silence", "saving": "Saving..." @@ -2315,6 +2616,12 @@ "title-alert-rule-types": "Alert rule types" }, "state-history": { + "columns": { + "label": { + "state": "State", + "time": "Time" + } + }, "filter-group": "Filter group", "filter-group-tooltip": "Filter each state history group either by exact match or a regular expression, for example:", "placeholder-search": "Search", @@ -2354,6 +2661,9 @@ "label-examples-documentation": "Examples documentation", "label-template-group": "Template group", "label-template-group-name": "Template group name", + "message": { + "required": "Required." + }, "new-template-name-placeholder-give-your-template-group-a-name": "Give your template group a name", "title-error-saving-template": "Error saving template", "title-templating-cheat-sheet": "Templating cheat sheet" @@ -2376,6 +2686,11 @@ "existing-templates-selector-aria-label-choose-notification-template": "Choose notification template", "existing-templates-selector-placeholder-choose-notification-template": "Choose notification template", "loading": "Loading...", + "template-options": { + "label": { + "select-notification-template": "Select notification template" + } + }, "tooltip-copy": "Copy selected notification template to clipboard. You can use it in the custom tab." }, "templates": { @@ -2478,10 +2793,39 @@ } }, "use-columns": { + "columns": { + "label": { + "alert-rule-targeted": "Alert rule targeted", + "alerts-silenced": "Alerts silenced", + "health": "Health", + "matching-labels": "Matching labels", + "name": "Name", + "schedule": "Schedule", + "state": "State", + "time-range": "Time range" + } + }, + "label": { + "actions": "Actions", + "created": "Created", + "group": "Group", + "labels": "Labels", + "next-evaluation": "Next evaluation", + "state": "State", + "summary": "Summary" + }, "title-edit": "Edit", "title-recreate": "Recreate", "title-unsilence": "Unsilence" }, + "use-combined-labels": { + "grouped-options": { + "label": { + "from-alerts": "From alerts", + "from-system": "From system" + } + } + }, "use-create-dropdown-menu-actions": { "label-delete": "Delete", "label-edit": "Edit", @@ -2515,6 +2859,17 @@ "title-edit-notification-policy": "Edit notification policy" } }, + "use-page-nav": { + "page-nav": { + "text": { + "details": "Details", + "history": "History", + "instances": "Instances", + "query-and-conditions": "Query and conditions", + "versions": "Versions" + } + } + }, "use-state-history-modal": { "state-history-modal": { "title-state-history": "State history" @@ -2535,6 +2890,36 @@ "body": "The YAML content in the editor only contains alert rule configuration <1></1>To configure Prometheus, you need to provide the rest of the <4>configuration file content.</4>" } }, + "alertlist": { + "group-by": { + "aria-label-group-by-label-keys": "group by label keys", + "placeholder-group-by": "Group by" + }, + "ungrouped-mode-view": { + "active-for": "for <1>{{duration}}</1>", + "aria-label-view-alert-rule": "View alert rule", + "view-alert-rule": "View alert rule" + }, + "unified-alert-list": { + "clear": "Clear", + "text-loading": "Loading..." + }, + "unified-alert-list-panel": { + "body-permission-required": "Sorry, you do not have the required permissions to read alert rules.", + "title-permission-required": "Permission required" + } + }, + "annolist": { + "anno-list-panel": { + "aria-label-remove-filter": "Remove filter: {{filterToRemove}}", + "filter": "Filter:", + "loading": "Loading...", + "no-annotations-found": "No annotations found" + }, + "annotation-list-item": { + "tooltip-created-by": "Created by:<1></1> {{email}}" + } + }, "annotations": { "annotation-field-mapper": { "annotation": "Annotation", @@ -2631,6 +3016,11 @@ "configuration-required": "Configuration required", "refer-documentation-configure-authentication": "Refer to the documentation on how to configure authentication" }, + "field-map": { + "label": { + "none": "None" + } + }, "fields": { "allow-assign-grafana-admin-description": "If enabled, it will automatically sync the Grafana server administrator role.", "allow-assign-grafana-admin-label": "Allow assign Grafana admin", @@ -2734,7 +3124,18 @@ "use-refresh-token-description": "If enabled, Grafana will fetch a new access token using the refresh token provided by the OAuth2 provider.", "use-refresh-token-label": "Use refresh token", "validate-hosted-domain-description": "If enabled, Grafana will match the Hosted Domain retrieved from the Google ID Token against the \"{{ allowedDomainsLabel }}\" list specified by the user.", - "validate-hosted-domain-label": "Validate hosted domain" + "validate-hosted-domain-label": "Validate hosted domain", + "workload-identity-token-file-description": "The file path to the token file used to authenticate to the OAuth2 provider. This is only required when client authentication is set to \"workload_identity\". Defaults to /var/run/secrets/azure/tokens/azure-identity-token.", + "workload-identity-token-file-label": "{{ workloadIdentityLabel }} token file", + "workload-identity-token-file-required": "This field must be set when client authentication is set to \"Workload identity\"." + }, + "get-page-nav": { + "subTitle": { + "configure-authentication-providers": "Configure authentication providers" + }, + "text": { + "authentication": "Authentication" + } }, "provider-card": { "text-badge-enabled": "Enabled", @@ -2770,6 +3171,12 @@ "auth-config-auth-config-page-unconnected": { "subtitle": "Manage your auth settings and configure single sign-on. Find out more in our <2>documentation</2>." }, + "barchart": { + "tick-spacing-editor": { + "content-require-space-from-the-right-side": "Require space from the right side", + "label-rtl": "RTL" + } + }, "bookmarks-page": { "empty": { "message": "It looks like you haven’t created any bookmarks yet", @@ -2898,11 +3305,199 @@ "text-this-repository-is-read-only": "If you have direct access to the target, copy the JSON and paste it there." }, "canvas": { + "apieditor": { + "label-endpoint": "Endpoint", + "label-header-parameters": "Header parameters", + "label-method": "Method", + "label-payload": "Payload", + "label-query-parameters": "Query parameters", + "render-test-apibutton": { + "test-api": "Test API", + "title-test-api": "Test API" + } + }, + "button-item": { + "label": { + "center": "Center", + "left": "Left", + "right": "Right" + }, + "placeholder": { + "auto": "Auto" + } + }, + "button-style-editor": { + "label-variant": "Variant" + }, + "canvas-context-menu": { + "close-editor": "Close Editor", + "open-editor": "Open Editor", + "render-menu-items": { + "add-item-menu-item": { + "label-add-item": "Add item" + }, + "edit-element-menu-item": { + "label-edit": "Edit" + }, + "label-bring-to-front": "Bring to front", + "label-delete": "Delete", + "label-duplicate": "Duplicate", + "label-send-to-back": "Send to back", + "set-background-menu-item": { + "label-set-background": "Set background" + } + } + }, + "cloud-item": { + "label": { + "bottom": "Bottom", + "center": "Center", + "left": "Left", + "middle": "Middle", + "right": "Right", + "top": "Top" + }, + "placeholder": { + "auto": "Auto" + } + }, + "ellipse-item": { + "label": { + "bottom": "Bottom", + "center": "Center", + "left": "Left", + "middle": "Middle", + "right": "Right", + "top": "Top" + }, + "placeholder": { + "auto": "Auto" + } + }, + "inline-edit": { + "canvas-inline-editor": "Canvas Inline Editor", + "tooltip-close-inline-editor": "Close inline editor" + }, + "inline-edit-body": { + "label-add-item": "Add item", + "please-select-an-element": "Please select an element" + }, + "line-style-editor": { + "label-animate": "Animate" + }, + "metric-value-item": { + "label": { + "bottom": "Bottom", + "center": "Center", + "left": "Left", + "middle": "Middle", + "right": "Right", + "top": "Top" + }, + "placeholder": { + "auto": "Auto" + } + }, "not-found-display": { "not-found": "<0>Not found: </0><config />" }, + "pan-zoom-help": { + "ctrl-right-mouse": "CTRL + right mouse", + "middle-mouse": "Middle mouse", + "pan-title": "Pan:", + "reset-double-click": "Reset: Double click", + "title-pan-and-zoom-controls": "Pan and zoom controls", + "zoom-scroll-wheel": "Zoom: Scroll wheel" + }, + "parallelogram-item": { + "label": { + "bottom": "Bottom", + "center": "Center", + "left": "Left", + "middle": "Middle", + "right": "Right", + "top": "Top" + }, + "placeholder": { + "auto": "Auto" + } + }, + "params-editor": { + "aria-label-add": "Add", + "aria-label-delete": "Delete", + "placeholder-key": "Key", + "placeholder-value": "Value" + }, + "placement-editor": { + "label-constraints": "Constraints", + "label-position": "Position", + "loading": "Loading..." + }, + "quick-positioning": { + "tooltip-align-bottom": "Align bottom", + "tooltip-align-horizontal-centers": "Align horizontal centers", + "tooltip-align-left": "Align left", + "tooltip-align-right": "Align right", + "tooltip-align-top": "Align top", + "tooltip-align-vertical-centers": "Align vertical centers" + }, + "rectangle-item": { + "label": { + "bottom": "Bottom", + "center": "Center", + "left": "Left", + "middle": "Middle", + "right": "Right", + "top": "Top" + }, + "placeholder": { + "auto": "Auto" + } + }, "text-display": { "double-click-to-set": "Double click to set text" + }, + "text-item": { + "label": { + "bottom": "Bottom", + "center": "Center", + "left": "Left", + "middle": "Middle", + "right": "Right", + "top": "Top" + }, + "placeholder": { + "auto": "Auto" + } + }, + "tree-navigation-editor": { + "clear-selection": "Clear selection", + "frame-selection": "Frame selection", + "label-add-item": "Add item", + "missing-layer": "Missing layer?", + "no-settings": "No settings", + "switcher-icon": { + "title-node-icon": "Node Icon" + } + }, + "tree-node-title": { + "title-duplicate": "Duplicate", + "title-remove": "Remove", + "tooltip-duplicate": "Duplicate", + "tooltip-remove": "Remove" + }, + "triangle-item": { + "label": { + "bottom": "Bottom", + "center": "Center", + "left": "Left", + "middle": "Middle", + "right": "Right", + "top": "Top" + }, + "placeholder": { + "auto": "Auto" + } } }, "carousel": { @@ -2982,6 +3577,22 @@ } }, "connections": { + "add-new-connection": { + "filter-by-options": { + "label": { + "all": "All", + "installed": "Installed", + "new-updates": "New Updates" + } + }, + "label": { + "by-downloads": "By downloads", + "by-name-az": "By name (A-Z)", + "by-name-za": "By name (Z-A)", + "by-published-date": "By published date", + "by-updated-date": "By updated date" + } + }, "advisor-redirect-notice": { "aria-label-link-to-advisor": "Link to Advisor", "body": "Try the new Advisor to uncover potential issues with your data sources and plugins.", @@ -2998,6 +3609,22 @@ "body": "Data sources have a new home! You can discover new data sources or manage existing ones in the Connections page, accessible from the main menu.", "go-to-connections": "Go to connections" }, + "data-source-details-page": { + "subTitle": { + "datasource-could-found": "No datasource with this ID could be found." + }, + "text": { + "unknown-datasource": "Unknown datasource" + } + }, + "new-data-source-page": { + "subTitle": { + "choose-a-data-source-type": "Choose a data source type" + }, + "text": { + "add-data-source": "Add data source" + } + }, "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</2>.", @@ -3010,6 +3637,18 @@ "search": { "aria-label-search-all": "Search all", "placeholder": "Search all" + }, + "use-data-source-settings-nav": { + "node": { + "subTitle": { + "data-source-error": "Data Source Error" + } + }, + "page-nav": { + "text": { + "data-source-nav-node": "Data Source Nav Node" + } + } } }, "core": { @@ -3305,6 +3944,11 @@ "title-plugin-dashboard": "Plugin dashboard" }, "dash-nav": { + "on-open-snapshot-original": { + "title": { + "proceed-to-external-site": "Proceed to external site?" + } + }, "render-left-actions": { "text-public": "Public", "tooltip-view-as-scene": "View as Scene" @@ -3316,11 +3960,26 @@ "dashboard-loading": { "cancel-loading-dashboard": "Cancel loading dashboard" }, + "dashboard-page-error": { + "text": { + "not-found": "Not found" + } + }, "dashboard-settings": { "actions": { "close": "Close" } }, + "dashboard-slice": { + "title": { + "dashboard-init-failed": "Dashboard init failed" + } + }, + "dashboard-srv": { + "message": { + "edit-dashboard-json": "Edit Dashboard JSON" + } + }, "dashboard-validation": { "body-dashboard-failed-schema-validation": "Validation is provided for development purposes and should be safe to ignore. If you are a Grafana developer, consider checking and updating the dashboard schema", "title-checking-dashboard-validity": "Checking dashboard validity", @@ -3416,6 +4075,13 @@ "values": "Values separated by comma", "values-placeholder": "1, 10, mykey : myvalue, myvalue, escaped,value" }, + "datasource-options": { + "name-filter": "Name filter", + "name-filter-description": "Regex filter for which data source instances to include. Leave empty for all.", + "name-filter-placeholder": "Example: /^prod/", + "type": "Type", + "type-placeholder": "Choose data source type" + }, "description": "Description", "description-placeholder": "Descriptive text", "label": "Label", @@ -3434,8 +4100,8 @@ "category": "Selection options", "custom-all-value": "Custom all value", "custom-all-value-description": "A wildcard regex or other value to represent All", - "include-all": "Include All option", - "include-all-description": "Enables an option to include all values", + "include-all": "Include All value", + "include-all-description": "Enables a single option that represent all values", "multi-value": "Multi-value" }, "type-category": "{{type}} options" @@ -3461,14 +4127,97 @@ "errors": { "failed-to-load": "Failed to load dashboard" }, + "fetch-dashboard": { + "message": { + "failed-to-fetch-dashboard": "Failed to fetch dashboard" + } + }, "gen-aihistory": { "aria-label-send-custom-feedback": "Send custom feedback", "footer-text": "This content is AI-generated using the <2>Grafana LLM plugin</2>", "placeholder-tell-ai-what-to-do-next": "Tell AI what to do next..." }, + "general-settings-unconnected": { + "editable-options": { + "label": { + "editable": "Editable", + "readonly": "Read-only" + } + } + }, + "get-debug-dashboard": { + "title": { + "annotations": "Annotations" + } + }, + "get-errors": { + "message": { + "error-loading-data": "Error loading data" + } + }, "get-field-override-categories": { "label-add-field-override": "Add field override", - "label-add-override-property": "Add override property" + "label-add-override-property": "Add override property", + "title": { + "add-button": "add button" + } + }, + "get-library-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "Library panel options" + } + }, + "title": { + "information": "Information", + "name": "Name" + } + }, + "get-library-viz-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "Library panel options" + } + }, + "title": { + "information": "Information", + "name": "Name" + } + }, + "get-panel-editor-tabs": { + "text": { + "alert": "Alert", + "query": "Query", + "transform-data": "Transform data" + } + }, + "get-panel-frame-category": { + "descriptor": { + "title": { + "panel-options": "Panel options" + } + }, + "direction-options": { + "label": { + "horizontal": "Horizontal", + "vertical": "Vertical" + } + }, + "title": { + "description": "Description", + "max-per-row": "Max per row", + "panel-links": "Panel links", + "repeat-by-variable": "Repeat by variable", + "repeat-direction": "Repeat direction", + "repeat-options": "Repeat options", + "title": "Title", + "transparent-background": "Transparent background" + } + }, + "get-panel-menu": { + "text": { + "extensions": "Extensions" + } }, "help-wizard": { "copy-to-clipboard": "Copy to clipboard", @@ -3481,10 +4230,21 @@ "randomize-field-names-label-field-names": "Field names", "randomize-labels-label-labels": "Labels", "randomize-string-values-label-string-values": "String values", + "tabs": { + "label": { + "data": "Data", + "snapshot": "Snapshot" + } + }, "title-complete-git-hub-comment-clipboard": "Copy a complete GitHub comment to the clipboard", "title-get-help-with-this-panel": "Get help with this panel", "troubleshooting-docs": "Troubleshooting docs" }, + "init-dashboard": { + "message": { + "failed-create-dashboard-model": "Failed create dashboard model" + } + }, "inspect": { "data-tab": "Data", "error-tab": "Error", @@ -3537,6 +4297,16 @@ "rows": "Total number rows", "table-title": "Stats" }, + "k8s-dashboard-api": { + "title": { + "deleted": "deleted" + } + }, + "k8s-dashboard-v2api": { + "title": { + "deleted": "deleted" + } + }, "layout": { "common": { "copy": "Copy", @@ -3549,6 +4319,13 @@ "panel-layout-disabled": "Select a row or tab to change panel layout options" } }, + "legacy-dashboard-api": { + "fetch-error": { + "message": { + "dashboard-not-found": "Dashboard not found" + } + } + }, "make-editable": { "dashboard-not-editable": "Dashboard not editable", "make-editable": "Make editable" @@ -3568,6 +4345,20 @@ "menu-use-library-panel": "Use library panel" }, "new-panel-title": "New panel", + "on-create-new-row": { + "new-row": { + "title": { + "row-title": "Row title" + } + } + }, + "on-create-new-widget-panel": { + "new-panel": { + "title": { + "widget-title": "Widget title" + } + } + }, "options": { "description": "Description", "title-option": "Title" @@ -3627,6 +4418,30 @@ "paused": "This dashboard has been paused by the administrator", "try-again-later": "Try again later" }, + "remove-panel": { + "text": { + "remove-panel": "Are you sure you want to remove this panel?" + }, + "title": { + "remove-panel": "Remove panel" + } + }, + "repeat-row-select": { + "variable-options": { + "label": { + "disable-repeating": "Disable repeating", + "no-template-variables-found": "No template variables found" + } + } + }, + "repeat-row-select2": { + "variable-options": { + "label": { + "disable-repeating": "Disable repeating", + "no-template-variables-found": "No template variables found" + } + } + }, "revert-dashboard-modal": { "body-restore-version": "Are you sure you want to restore the dashboard to version {{version}}? All unsaved changes will be lost.", "title-restore-version": "Restore version" @@ -3740,6 +4555,18 @@ "sub-menu-un-connected": { "aria-label-template-variables": "Template variables" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "Dashboard JSON used to help troubleshoot visualization issues" + }, + "label": { + "git-hub-comment": "GitHub comment", + "panel-support-snapshot": "Panel support snapshot" + }, + "title": { + "copy-to-clipboard-failed": "Copy to clipboard failed" + } + }, "tabs-layout": { "delete-tab-text": "Deleting this tab will also remove all panels. Are you sure you want to continue?", "delete-tab-title": "Delete tab?", @@ -3945,7 +4772,10 @@ }, "unthemed-dashboard-row": { "aria-label-delete-row": "Delete row", - "learn-more": "Learn more" + "learn-more": "Learn more", + "title": { + "delete-row": "Delete row" + } }, "validation": { "invalid-dashboard-id": "Could not find a valid Grafana.com ID", @@ -3980,6 +4810,16 @@ }, "visualization-select-pane": { "placeholder-search-for": "Search for...", + "radio-options": { + "description": { + "reusable-panels-share-between-multiple-dashboards": "Reusable panels you can share between multiple dashboards." + }, + "label": { + "library-panels": "Library panels", + "suggestions": "Suggestions", + "visualizations": "Visualizations" + } + }, "title-close": "Close" }, "viz-panel": { @@ -4030,12 +4870,25 @@ "label-data-source": "Data source", "label-use-static-key-dimensions": "Use static key dimensions" }, + "add-to-dashboard": { + "message": { + "could-navigate-selected-dashboard-please-again": "Could not navigate to the selected dashboard. Please try again.", + "could-panel-dashboard-please-again": "Could not add panel to dashboard. Please try again." + } + }, "add-to-dashboard-form": { "cancel": "Cancel", "description-choose-where-to-add-the-panel": "Choose where to add the panel.", "description-select-which-dashboard-panel-created": "Select in which dashboard the panel will be created.", + "label": { + "existing-dashboard": "Existing dashboard", + "new-dashboard": "New dashboard" + }, "label-dashboard": "Dashboard", "label-target-dashboard": "Target dashboard", + "message": { + "this-field-is-required": "This field is required." + }, "open-dashboard": "Open dashboard", "open-in-new-tab": "Open in new tab", "title-error-adding-the-panel": "Error adding the panel" @@ -4073,6 +4926,25 @@ "it-cannot-contain-or": "It cannot contain '//' or '..'.", "least-valid-character": "It must have at least one valid character." }, + "build-new-dashboard-save-model": { + "data": { + "title": { + "new-dashboard": "New dashboard" + } + } + }, + "build-new-dashboard-save-model-v2": { + "data": { + "title": { + "new-dashboard": "New dashboard" + } + } + }, + "config-public-dashboard": { + "title": { + "revoke-public-url": "Revoke public URL" + } + }, "constant-variable-form": { "constant-options": "Constant options", "label-value": "Value", @@ -4120,22 +4992,89 @@ "value-not-saved": "The value is not yet saved in the Grafana database", "view-pull-request-in-git-hub": "View pull request in GitHub" }, + "dashboard-scene": { + "text": { + "edit-panel": "Edit panel", + "view-panel": "View panel" + }, + "title": { + "dashboard": "Dashboard", + "discard-changes-to-dashboard": "Discard changes to dashboard?" + } + }, + "dashboard-scene-page-state-manager": { + "message": { + "dashboard-not-found": "Dashboard not found" + } + }, + "dashboard-scene-page-state-manager-v2": { + "message": { + "dashboard-not-found": "Dashboard not found" + } + }, "data-source-variable-form": { "data-source-options": "Data source options", "description-instance-name-filter": "Regex filter for which data source instances to choose from in the variable value list. Leave empty for all.", "example-instance-name-filter": "Example: <codeExample />", "selection-options": "Selection options" }, + "default-grid-layout-manager": { + "row": { + "title": { + "row-title": "Row title" + } + } + }, "description-label": { "description": "Description" }, + "edit-link-view": { + "edit-link-page-nav": { + "text": { + "edit-link": "Edit link" + } + } + }, "email-list": { "aria-label-emailmenu": "Toggle email menu" }, + "embedded-dashboard-test-page": { + "subTitle": { + "showing-dashboard-panel-tests-pie-chart": "Showing dashboard: Panel Tests - Pie chart" + }, + "text": { + "embedding-dashboard": "Embedding dashboard" + } + }, "empty-transformations-message": { "add-transformation": "Add transformation" }, + "get-edit-options": { + "title": { + "column-options": "Column options", + "row-height-options": "Row height options" + } + }, + "get-panel-frame-options": { + "descriptor": { + "title": { + "panel-options": "Panel options" + } + }, + "title": { + "description": "Description", + "panel-links": "Panel links", + "title": "Title", + "transparent-background": "Transparent background" + } + }, + "get-workflow-options": { + "label": { + "push-to-a-new-branch": "Push to a new branch" + } + }, "group-by-variable-form": { + "alert-not-supported": "This data source does not support group by variables", "description-enables-users-custom-values": "Enables users to add custom values to the list", "description-provide-dimensions-as-csv-dimension-name-dimension-id": "Provide dimensions as CSV: {{name}}, {{value}}", "group-by-options": "Group by options", @@ -4154,6 +5093,12 @@ "randomize-field-names-label-field-names": "Field names", "randomize-labels-label-labels": "Labels", "randomize-string-values-label-string-values": "String values", + "tabs": { + "label": { + "data": "Data", + "snapshot": "Snapshot" + } + }, "title-complete-git-hub-comment-clipboard": "Copy a complete GitHub comment to the clipboard", "title-get-help-with-this-panel": "Get help with this panel", "troubleshooting-docs": "Troubleshooting docs", @@ -4196,6 +5141,14 @@ "body-name-already-exists": "A dashboard with the same name in selected folder already exists. Would you still like to save this dashboard?", "title-name-already-exists": "Name already exists" }, + "on-remove-panel": { + "text": { + "remove-panel": "Are you sure you want to remove this panel?" + }, + "title": { + "remove-panel": "Remove panel" + } + }, "panel-data-alerting-tab-rendered": { "alert": { "title-errors-loading-rules": "Errors loading rules" @@ -4217,6 +5170,11 @@ "table-view-aria-label-toggletableview": "Toggle table view", "table-view-label-table-view": "Table view" }, + "panel-editor": { + "text": { + "edit-panel": "Edit panel" + } + }, "panel-editor-renderer": { "aria-label-open-options-pane": "Open options pane", "tooltip-open-options-pane": "Open options pane" @@ -4225,8 +5183,22 @@ "body-panel-plugin-not-loaded": "Make sure the panel you want to inspect is visible and has been displayed before opening inspect.", "title-panel-plugin-not-loaded": "Panel plugin not loaded" }, + "panel-menu-behavior": { + "async-func": { + "text": { + "extensions": "Extensions", + "metrics-drilldown": "Metrics drilldown" + } + } + }, "panel-viz-type-picker": { "placeholder-search-for": "Search for...", + "radio-options": { + "label": { + "suggestions": "Suggestions", + "visualizations": "Visualizations" + } + }, "title-close": "Close" }, "provisioned-delete-modal": { @@ -4253,6 +5225,15 @@ "query-options": "Query options", "selection-options": "Selection options" }, + "resource-export": { + "label": { + "classic": "Classic", + "json": "JSON", + "v1-resource": "V1 Resource", + "v2-resource": "V2 Resource", + "yaml": "YAML" + } + }, "revert-dashboard-modal": { "body-restore-version": "Are you sure you want to restore the dashboard to version {{version}}? All unsaved changes will be lost.", "title-restore-version": "Restore version" @@ -4361,6 +5342,18 @@ "solo-panel-page": { "loading": "Loading" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "Dashboard JSON used to help troubleshoot visualization issues" + }, + "label": { + "git-hub-comment": "GitHub comment", + "panel-support-snapshot": "Panel support snapshot" + }, + "title": { + "copy-to-clipboard-failed": "Copy to clipboard failed" + } + }, "text-box-variable-form": { "placeholder-default-value-if-any": "(optional)", "text-options": "Text options" @@ -4371,6 +5364,13 @@ "title-field-label": { "title": "Title" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "dashboard" + } + } + }, "transformations-drawer": { "search-box-suffix": { "tooltip-clear-search": "Clear search" @@ -4386,6 +5386,13 @@ "save-dashboard": "Save dashboard", "title-unsaved-changes": "Unsaved changes" }, + "use-dashboard-edit-page-nav": { + "page-nav": { + "text": { + "settings": "Settings" + } + } + }, "variable-check-indicator": { "aria-label-variable-referenced-dashboard": "This variable is not referenced by any variable or dashboard.", "aria-label-variable-referenced-other-variables-dashboard": "This variable is referenced by other variables or dashboard.", @@ -4402,7 +5409,10 @@ "placeholder-descriptive-text": "Descriptive text", "placeholder-label-name": "Label name", "placeholder-variable-name": "Variable name", - "text-running-query": "Running query..." + "text-running-query": "Running query...", + "title": { + "delete-variable": "Delete variable" + } }, "variable-editor-list": { "definition": "Definition", @@ -4584,6 +5594,25 @@ "message": "No data sources found" } }, + "datagrid": { + "add-column": { + "placeholder-column-name": "Column name" + }, + "datagrid-context-menu": { + "render-context-menu-items": { + "label-clear-column": "Clear column", + "label-clear-row": "Clear row", + "label-remove-all-data": "Remove all data", + "label-search": "Search..." + }, + "render-header-menu-items": { + "label-clear-column": "Clear column", + "label-delete-column": "Delete column", + "label-rename-column": "Rename column", + "label-set-field-type": "Set field type" + } + } + }, "datasources": { "add-new-data-source-button": { "tooltip-no-permission": "You do not have permission to configure new data sources" @@ -4605,6 +5634,46 @@ "label-default": "Default", "label-name": "Name" }, + "build-categories": { + "categories": { + "title": { + "cloud": "Cloud", + "distributed-tracing": "Distributed tracing", + "enterprise-plugins": "Enterprise plugins", + "industrial-io-t": "Industrial & IoT", + "logging-document-databases": "Logging & document databases", + "others": "Others", + "profiling": "Profiling", + "sql": "SQL", + "time-series-databases": "Time series databases" + } + } + }, + "build-nav-model": { + "analytics": { + "text": { + "insights": "Insights" + } + }, + "caching": { + "text": { + "cache": "Cache" + } + }, + "ds-permissions": { + "text": { + "permissions": "Permissions" + } + }, + "nav-model": { + "text": { + "settings": "Settings" + } + }, + "text": { + "dashboards": "Dashboards" + } + }, "button-row": { "delete": "Delete", "save-and-test": "Save & test", @@ -4640,6 +5709,11 @@ "data-source-read-only-message": { "title-provisioned-data-source": "Provisioned data source" }, + "data-source-settings-reducer": { + "message": { + "testing-could-couple-minutes": "Testing... this could take up to a couple of minutes" + } + }, "data-source-type-card": { "aria-label-learn-more": "{{dataSourcePluginName}}, learn more." }, @@ -4657,13 +5731,88 @@ "footer": { "add-csv-or-spreadsheet": "Add csv or spreadsheet" }, + "get-enterprise-phantom-plugins": { + "description": { + "adobe-analytics-datasource": "Adobe Analytics datasource", + "app-dynamics-integration-and-data-source": "AppDynamics integration and data source", + "atlassian-statuspage-datasource": "Atlassian Statuspage datasource", + "aurora-data-source": "Aurora data source", + "azure-cosmos-db-datasource": "Azure CosmosDB datasource", + "azure-devops-datasource": "Azure Devops datasource", + "catchpoint-datasource": "Catchpoint datasource", + "cloudflare-datasource": "Cloudflare datasource", + "cockroach-db-datasource": "CockroachDB datasource", + "data-dog-integration-and-data-source": "DataDog integration and data source", + "drone-datasource": "Drone datasource", + "git-lab-integration-and-datasource": "GitLab integration and datasource", + "honeycomb-integration-and-datasource": "Honeycomb integration and datasource", + "jira-integration-and-datasource": "Jira integration and datasource", + "logic-monitor-devices-datasource": "LogicMonitor Devices datasource", + "mongo-db-integration-and-data-source": "MongoDB integration and data source", + "netlify-datasource": "Netlify datasource", + "new-relic-integration-and-data-source": "New Relic integration and data source", + "pager-duty-datasource": "PagerDuty datasource", + "salesforce-integration-and-datasource": "Salesforce integration and datasource", + "sap-hana-integration-and-data-source": "SAP HANA® integration and data source", + "service-now-integration-and-data-source": "ServiceNow integration and data source", + "signal-fx-integration-and-datasource": "SignalFx integration and datasource", + "snowflake-integration-and-data-source": "Snowflake integration and data source", + "sumo-logic-integration-and-datasource": "SumoLogic integration and datasource", + "visualize-and-explore-dynatrace-data": "Visualize and explore Dynatrace data", + "visualize-and-explore-oracle-sql": "Visualize and explore Oracle SQL", + "visualize-and-explore-splunk-logs": "Visualize and explore Splunk logs", + "wavefront-integration-and-data-source": "Wavefront integration and data source", + "zendesk-datasource": "Zendesk datasource" + } + }, + "get-grafana-cloud-phantom-plugin": { + "description": { + "hosted-graphite-prometheus-and-loki": "Hosted Graphite, Prometheus, and Loki" + } + }, "new-data-source-view": { "cancel": "Cancel", "placeholder-filter-by-name-or-type": "Filter by name or type" }, + "update-data-source": { + "error-info": { + "message": { + "an-unexpected-error-occurred": "An unexpected error occurred." + } + } + }, "use-data-source-info": { "badge-text-not-supported": "Not supported", - "badge-text-supported": "Supported" + "badge-text-supported": "Supported", + "label": { + "alerting": "Alerting", + "type": "Type" + } + }, + "use-delete-loaded-data-source": { + "title": { + "delete": "Delete" + } + } + }, + "debug": { + "cursor-view": { + "no-events-yet": "No events yet" + }, + "render-info-viewer": { + "data-counter": "Data: {{numDataChanges}} ", + "elapsed-time": "Time: {{elapsed}}ms", + "field": "Field", + "last": "Last", + "render-counter": "Render: {{numRenders}} ", + "schema-counter": "Schema: {{numSchemaChanges}} ", + "title-reset-counters": "Reset counters", + "tooltip-step-back": "Step back", + "type": "Type" + }, + "state-view": { + "current-value": "Current value: {{currentValue}} ", + "label-state-name": "State name" } }, "dimensions": { @@ -4732,6 +5881,19 @@ "remove-value-mapping-aria-label-delete-value-mapping": "Delete value mapping", "remove-value-mapping-tooltip-delete": "Delete", "set-color": "Set color", + "special-match-options": { + "description": { + "boolean-false-values": "Boolean false values", + "boolean-true-values": "Boolean true values", + "empty-string": "Empty string", + "matches-against-number-na-n-not-a-number": "Matches against Number.NaN (not a number)", + "matches-null-and-undefined-values": "Matches null and undefined values", + "matches-null-undefined-and-na-n": "Matches null, undefined and NaN" + }, + "label": { + "empty": "Empty" + } + }, "tooltip-remove-color": "Remove color", "tooltip-remove-icon": "Remove icon" }, @@ -4747,6 +5909,20 @@ "display-text": "Display text", "icon": "Icon", "label-add-a-new-mapping": "Add a new mapping", + "mapping-types": { + "description": { + "match-a-numerical-range-of-values": "Match a numerical range of values", + "match-a-regular-expression-with-replacement": "Match a regular expression with replacement", + "match-a-specific-text-value": "Match a specific text value", + "match-boolean-empty-values": "Match on null, NaN, boolean and empty values" + }, + "label": { + "range": "Range", + "regex": "Regex", + "special": "Special", + "value": "Value" + } + }, "update": "Update" } }, @@ -4771,6 +5947,7 @@ }, "explore": { "accordian-logs": { + "events": "Events", "footer": "Event timestamps are relative to the start time of the full trace." }, "accordian-references": { @@ -4781,6 +5958,11 @@ "basic-extensions": { "aria-label-add": "Add" }, + "build-dashboard-panel-from-explore-state": { + "title": { + "new-panel": "New Panel" + } + }, "clear": "Clear", "confirm-navigation-modal": { "cancel": "Cancel", @@ -4867,6 +6049,33 @@ "title-table": "Table", "title-traces": "Traces" }, + "explore-query-inspector": { + "data-tab": { + "label": { + "data": "Data" + } + }, + "error-tab": { + "label": { + "error": "Error" + } + }, + "json-tab": { + "label": { + "json": "JSON" + } + }, + "query-tab": { + "label": { + "query": "Query" + } + }, + "stats-tab": { + "label": { + "stats": "Stats" + } + } + }, "explore-run-query-button": { "run-button": { "aria-label-run-query-options": "Run query options" @@ -4880,10 +6089,23 @@ "description-explore-disabled": "To enable Explore, enable it in the Grafana config:", "title-explore-disabled": "Explore is disabled" }, + "get-field-links-for-explore": { + "text": { + "data": "Data", + "raw-value": "Raw value" + } + }, "get-matches-metadata": { "matches": "0 matches" }, "legacy-create-span-link-factory": { + "text": { + "tags": "Tags" + }, + "title": { + "related-logs": "Related logs", + "session-for-this-span": "Session for this span" + }, "title-explore-metrics-for-this-span": "Explore metrics for this span", "title-explore-split": "Explore the logs for this in split view", "title-session-for-this-span": "Session for this span" @@ -4924,6 +6146,10 @@ }, "logs-meta-row": { "download": "Download", + "label": { + "deduplication-count": "Deduplication count", + "showing-only-selected-fields": "Showing only selected fields" + }, "show-original-line": "Show original line" }, "logs-sample-panel": { @@ -5105,6 +6331,21 @@ "run-query-button": "Run query", "switch-datasource-button": "Switch data source and run query" }, + "scoped-vars-from-span": { + "text": { + "span": "Span" + } + }, + "scoped-vars-from-tags": { + "text": { + "tags": "Tags" + } + }, + "scoped-vars-from-trace": { + "text": { + "trace": "Trace" + } + }, "search-bar-input": { "placeholder-find": "Find...", "suffix": { @@ -5139,9 +6380,25 @@ "tooltip-tag-key": "Tag key which will be used to get the tag value. A span's attributes and resources will be searched for the tag key" }, "span-detail": { + "label": { + "kind": "Kind:", + "library-name": "Library Name:", + "library-version": "Library Version:", + "status": "Status:", + "status-message": "Status Message:", + "trace-state": "Trace State:" + }, "label-resource-attributes": "Resource attributes", "label-span-attributes": "Span attributes", "label-stack-trace": "Stack trace", + "overview-items": { + "label": { + "child-count": "Child Count:", + "duration": "Duration:", + "service": "Service:", + "start-time": "Start Time:" + } + }, "warnings": "Warnings" }, "span-filters": { @@ -5248,6 +6505,18 @@ "title-node-graph": "Node graph" }, "unthemed-logs": { + "description": { + "show-results-in-logs-visualisation": "Show results in logs visualisation", + "show-results-in-table-visualisation": "Show results in table visualisation", + "show-results-newest-to-oldest": "Show results newest to oldest", + "show-results-oldest-to-newest": "Show results oldest to newest" + }, + "label": { + "logs": "Logs", + "newest-first": "Newest first", + "oldest-first": "Oldest first", + "table": "Table" + }, "label-deduplication": "Deduplication", "label-display-results": "Display results", "label-prettify-json": "Prettify JSON", @@ -5263,6 +6532,15 @@ }, "unthemed-virtualized-trace-view": { "title-scroll-to-top": "Scroll to top" + }, + "use-focus-span-link": { + "create-focus-span-link": { + "link": { + "title": { + "deep-link-to-this-span": "Deep link to this span" + } + } + } } }, "export": { @@ -5348,6 +6626,15 @@ "folder-repo": { "badge-text": "Provisioned" }, + "folders": { + "get-loading-nav": { + "main": { + "title": { + "loading": "Loading" + } + } + } + }, "forgot-password": { "back-button": "Back to login", "change-password": { @@ -5377,10 +6664,102 @@ "incomplete-request-error": "Sorry, I was unable to complete your request. Please try again.", "send-custom-feedback": "Send" }, + "geomap": { + "coordinates-map-view-editor": { + "label-latitude": "Latitude", + "label-longitude": "Longitude" + }, + "debug-overlay": { + "center": "Center:", + "zoom": "Zoom:" + }, + "fit-map-view-editor": { + "all-layers-editor-fragment": { + "label-layer": "Layer" + }, + "label-data": "Data", + "last-only-editor-fragment": { + "label-padding": "Padding", + "tooltip-padding-relative-percent-beyond-extent": "Sets padding in relative percent beyond data extent" + } + }, + "frame-multi-selection-editor": { + "placeholder-change-filter": "Change filter" + }, + "frame-selection-editor": { + "placeholder-change-filter": "Change filter" + }, + "geomap-panel": { + "aria-label-map": "Navigable map" + }, + "geomap-style-rules-editor": { + "aria-label-add-geomap-style-rule": "Add geomap style rule" + }, + "layers-editor": { + "label-add-layer": "Add layer", + "no-layers": "No layers?" + }, + "map-view-editor": { + "label-max-zoom": "Max Zoom", + "label-view": "View", + "label-zoom": "Zoom", + "use-current-map-settings": "Use current map settings" + }, + "markers-legend": { + "title-symbol": "Symbol" + }, + "measure-overlay": { + "tooltip-show-measure-tools": "Show measure tools" + }, + "plugin": { + "basemap-layer-configured-server-admin": "The basemap layer is configured by the server admin." + }, + "style-editor": { + "label-align": "Align", + "label-baseline": "Baseline", + "label-color": "Color", + "label-fill-opacity": "Fill opacity", + "label-font-size": "Font size", + "label-opacity": "Opacity", + "label-rotation-angle": "Rotation angle", + "label-size": "Size", + "label-symbol": "Symbol", + "label-symbol-horizontal-align": "Symbol horizontal align", + "label-symbol-vertical-align": "Symbol vertical align", + "label-text-label": "Text label", + "label-x-offset": "X offset", + "label-y-offset": "Y offset" + }, + "style-rule-editor": { + "aria-label-comparison-operator": "Comparison operator", + "aria-label-comparison-value": "Comparison value", + "aria-label-delete-style-rule": "Delete style rule", + "aria-label-feature-property": "Feature property", + "label-rule": "Rule", + "placeholder-feature-property": "Feature property", + "placeholder-numeric-value": "Numeric value", + "placeholder-value": "value" + } + }, "get-enterprise": { "requires-license": "Requires a Grafana Enterprise license", "title": "Enterprise" }, + "gettingstarted": { + "docs-card": { + "complete": "complete", + "learn-how": "Learn how in the docs" + }, + "getting-started": { + "aria-label-to-advanced-tutorials": "To advanced tutorials", + "aria-label-to-basic-tutorials": "To basic tutorials", + "checking-completed-setup-steps": "Checking completed setup steps", + "remove-this-panel": "Remove this panel" + }, + "tutorial-card": { + "complete": "complete" + } + }, "gops": { "config-card": { "text-loading-configuration": "Loading configuration...." @@ -5397,6 +6776,74 @@ }, "progress-status": { "your-progress": "Your progress" + }, + "use-get-configuration-for-ui": { + "get-connect-data-source-configuration": { + "title": { + "connect-data-source": "Connect data source" + } + }, + "title": { + "essentials": "Essentials" + } + }, + "use-get-essentials-configuration": { + "essential-content": { + "description": { + "configure-grafana-alerting": "Configure Grafana Alerting", + "create-integration-alerting-contact-point": "Create an IRM integration for an alerting contact point.", + "initialize-incident-plugin-declare-manage-incidents": "Initialize the Incident plugin to declare and manage incidents.", + "practice-solving-an-incident": "Practice solving an Incident", + "receive-alerts-oncall-notifications-within-environment": "Receive alerts and oncall notifications within your chat environment.", + "select-chat-ops-channels-to-route-notifications": "Select ChatOps channels to route notifications" + }, + "label": { + "add": "Add", + "connect": "Connect", + "initialize": "Initialize", + "select-integration": "Select integration", + "start-drill": "Start drill" + }, + "title": { + "add-slack-notifications-to-irm-integrations": "Add Slack notifications to IRM integrations", + "connect-alerting-to-irm": "Connect alerting to IRM", + "connect-irm-to-your-slack-workspace": "Connect IRM to your Slack workspace", + "connect-your-messaging-workspace-to-incident": "Connect your Messaging workspace to Incident", + "connect-your-messaging-workspace-to-on-call": "Connect your Messaging workspace to OnCall", + "create-incident-drill": "Create Incident drill", + "detect": "Detect", + "initialize-incident-plugin": "Initialize Incident plugin", + "messaging-workspace-channel-on-call-integration": "Add Messaging workspace channel to OnCall Integration", + "respond": "Respond", + "test-your-configuration": "Test your configuration" + } + }, + "get-grafana-alerting-config-steps": { + "description": { + "create-alert-monitor-system": "Create an alert rule to monitor your system.", + "create-on-call-integration-alerting-contact-point": "Create an OnCall integration for an alerting contact point.", + "create-slos-to-monitor-your-service": "Create SLOs to monitor your service." + }, + "label": { + "connect": "Connect", + "create": "Create", + "enable": "Enable" + }, + "steps": { + "label": { + "edit": "Edit" + }, + "title": { + "update-default-contact-point": "Update default contact point" + } + }, + "title": { + "connect-alerting-to-on-call": "Connect alerting to OnCall", + "create-alert-rule": "Create alert rule", + "create-slo": "Create SLO", + "enable-slo-alerting": "Enable SLO alerting" + } + } } }, "grafana": { @@ -5763,14 +7210,18 @@ "duplicate-panel": "Duplicate Panel", "exit-edit/setting-views": "Exit edit/setting views", "expand-all-rows": "Expand all rows", + "explore-panel": "Explore panel", "go-to-dashboards": "Go to Dashboards", "go-to-explore": "Go to Explore", "go-to-home-dashboard": "Go to Home Dashboard", "go-to-profile": "Go to Profile", + "inspect-panel": "Inspect panel", "make-time-range-permanent": "Make time range absolute/permanent", "move-time-range-back": "Move time range back", "move-time-range-forward": "Move time range forward", "open-search": "Open search", + "open-share-embed-drawer": "Share panel embed", + "open-share-link-drawer": "Share panel link", "open-shared-modal": "Share panel snapshot", "paste-time-range": "Paste time range", "refresh-all-panels": "Refresh all panels", @@ -5796,6 +7247,11 @@ "support-bundle": "You can also retrieve a support bundle containing information concerning your Grafana instance and configured datasources in the <1>support bundles section</1>.", "troubleshooting-help": "To request troubleshooting help, send a snapshot of this panel to Grafana Labs Technical Support. The snapshot contains query response data and panel settings." }, + "histogram": { + "histogram-panel": { + "no-histogram-found-in-response": "No histogram found in response" + } + }, "inspector": { "inspect-data-tab": { "loading": "Loading", @@ -5845,6 +7301,9 @@ "label-name": "Name", "label-password": "Password", "label-username": "Username", + "message": { + "email-is-invalid": "Email is invalid" + }, "placeholder-name-optional": "Name (optional)", "placeholder-password": "Password", "placeholder-username": "Username", @@ -6104,8 +7563,26 @@ "discard-local-changes": "Discard local changes", "title-dashboard-changed": "Dashboard changed" }, + "live-channel-editor": { + "description-grafana-live": "This supports real-time event streams in Grafana core. This feature is under heavy development. Expect the interfaces and structures to change as this becomes more production ready.", + "namespace": "Namespace", + "path": "Path", + "placeholder-select-watchable-resource": "Select watchable resource", + "scope": "Scope", + "title-grafana-live": "Grafana Live" + }, "live-connection-warning": { "title-connection-to-server-is-lost": "Connection to server is lost..." + }, + "live-panel": { + "error": "Error", + "grafana-requires-feature": "Grafana live requires a feature flag to run", + "panel-editor-channel": "Use the panel editor to pick a channel", + "title-grafana-live": "Grafana Live", + "waiting-for-data": "Waiting for data:" + }, + "live-publish": { + "publish": "Publish" } }, "lock-icon": "lock icon", @@ -6152,6 +7629,13 @@ } }, "logs": { + "get-dataframe-fields": { + "vars": { + "text": { + "labels": "Labels" + } + } + }, "infinite-scroll": { "end-of-range": "End of the selected time range.", "load-more": "Scroll to load more", @@ -6232,6 +7716,11 @@ "shortcut": "alt+select to enable again" } }, + "log-series-to-logs-model": { + "label": { + "total-bytes-processed": "Total bytes processed" + } + }, "logs-controls": { "deduplication": "Deduplication", "disable-highlighting": "Disable highlighting", @@ -6266,6 +7755,11 @@ "scroll-top": "Scroll to top", "start-of-range": "Start of range" }, + "logs-panel": { + "render-common-labels": { + "common-labels": "Common labels:" + } + }, "out-of-range-message": { "end-of-the-selected-time-range": "End of the selected time range." }, @@ -6322,6 +7816,14 @@ }, "snapshot-list-table": { "title-delete": "Delete" + }, + "unthemed-dashboard-import": { + "subTitle": { + "import-dashboard-from-file-or-grafanacom": "Import dashboard from file or Grafana.com" + }, + "text": { + "import-dashboard": "Import dashboard" + } } }, "migrate-to-cloud": { @@ -6979,8 +8481,57 @@ "close": "Close drawer" }, "link-title": "Go to Grafana labs blog", + "news-panel": { + "body-error-loading-rss-feed": "Make sure that the feed URL is correct and that CORS is configured correctly on the server. See <2>News panel documentation.</2>", + "loading": "Loading...", + "title-error-loading-rss-feed": "Error loading RSS feed" + }, "title": "Latest from the blog" }, + "nodeGraph": { + "arc-options-editor": { + "add-arc": "Add arc", + "title-remove-arc": "Remove arc" + }, + "edge": { + "aria-label-from-to": "Edge from: {{from}} to: {{to}}" + }, + "edge-header": { + "label-source-target": "Source → Target" + }, + "marker": { + "100-node-count": ">100 nodes", + "aria-label-hidden-marker": "Hidden nodes marker: {{marker}}", + "node-count_one": "{{count}} node", + "node-count_other": "{{count}} nodes" + }, + "node": { + "aria-label-node-title": "Node: {{nodeName}}" + }, + "node-graph": { + "aria-label-layered-layout-performance-warning": "Layered layout performance warning", + "aria-label-nodes-hidden-warning": "Nodes hidden warning", + "computing-layout": "Computing layout", + "hidden-nodes_one": "<0></0> {{count}} node is hidden for performance reasons.", + "hidden-nodes_other": "<0></0> {{count}} nodes are hidden for performance reasons.", + "no-data": "No data", + "processed-nodes_one": "<0></0> Layered layout may be slow with {{count}} node.", + "processed-nodes_other": "<0></0> Layered layout may be slow with {{count}} nodes." + }, + "node-graph-panel": { + "no-data-found-in-response": "No data found in response" + }, + "node-header": { + "label-subtitle": "Subtitle", + "label-title": "Title" + }, + "view-controls": { + "hide-config": "Hide config", + "show-config": "Show config", + "title-zoom-in": "Zoom in", + "title-zoom-out": "Zoom out" + } + }, "notifications": { "empty-state": { "description": "Notifications you have received will appear here", @@ -7022,6 +8573,11 @@ "label-organization-name": "Organization name", "placeholder-org-name": "Org name" }, + "org-details-page": { + "title": { + "confirm-preferences-update": "Confirm preferences update" + } + }, "org-profile": { "label-organization-name": "Organization name", "label-organization-profile": "Organization profile", @@ -7041,7 +8597,10 @@ "tooltip": "You can now select the \"No basic role\" option and add permissions to your custom needs. You can find more information in <1>our documentation</1>." }, "user-invite-page": { - "sub-title": "Send invitation or add existing Grafana user to the organization.<1> {{orgName}}</1>" + "sub-title": "Send invitation or add existing Grafana user to the organization.<1> {{orgName}}</1>", + "text": { + "invite-user": "Invite user" + } } }, "org-picker": { @@ -7053,6 +8612,38 @@ } }, "panel": { + "get-calculation-value-data-links-variable-suggestions": { + "value-calc-var": { + "label": { + "calculation-name": "Calculation name" + } + } + }, + "get-data-links-variable-suggestions": { + "value-time-var": { + "label": { + "time": "Time" + } + } + }, + "get-field-links-supplier": { + "text": { + "data": "Data", + "field": "Field", + "series": "Series", + "value": "Value" + } + }, + "get-field-vars": { + "label": { + "name": "Name" + } + }, + "get-panel-links-variable-suggestions": { + "label": { + "all-variables": "All variables" + } + }, "header-menu": { "copy": "Copy", "create-library-panel": "Create library panel", @@ -7113,6 +8704,13 @@ "select-placeholder": "Filter by type" }, "playlist": { + "playlist-new-page": { + "page-nav": { + "text": { + "new-playlist": "New playlist" + } + } + }, "playlist-table-rows": { "aria-label-playlist-item": "Playlist item, {{itemType}}, {{itemValue}}", "multiple-dashboards-found": "Multiple items found: {{items}}", @@ -7129,6 +8727,12 @@ "label-mode": "Mode", "label-time-and-refresh": "Time and refresh", "label-variables": "Variables", + "modes": { + "label": { + "kiosk": "Kiosk", + "normal": "Normal" + } + }, "title-start-playlist": "Start playlist" } }, @@ -7195,6 +8799,19 @@ }, "browse": { "aria-label-plugin-type-filter": "Plugin type filter", + "filter-by-options": { + "label": { + "all": "All", + "installed": "Installed", + "new-updates": "New Updates" + } + }, + "label": { + "all": "All", + "applications": "Applications", + "data-sources": "Data sources", + "panels": "Panels" + }, "label-search": "Search", "label-state": "State", "label-type": "Type", @@ -7276,12 +8893,24 @@ "empty-state": { "message": "No plugins found" }, + "extensions-log-data-source": { + "message": { + "ok": "OK" + } + }, "filter": { "disabled": "This filter has been disabled because the Grafana server cannot access grafana.com", "sort": "Sort", "sort-list": "Sort Plugins List", "state": "State" }, + "get-feature-state-info": { + "text": { + "alpha": "Alpha", + "beta": "Beta", + "deprecated": "Deprecated" + } + }, "get-started-with-app": { "disable": "Disable", "enable": "Enable" @@ -7338,6 +8967,16 @@ "plugin-details-header-dependencies": { "grafana-dependency": "Grafana {{grafanaDependency}}" }, + "plugin-details-page": { + "not-found-model": { + "subTitle": { + "requested-belong-plugin": "The requested ID does not belong to any plugin" + }, + "text": { + "unknown-plugin": "Unknown plugin" + } + } + }, "plugin-details-signature": { "body-invalid-plugin-signature": "Grafana Labs checks each plugin to verify that it has a valid digital signature. Plugin signature verification is part of our security measures to ensure plugins are safe and trustworthy. Grafana Labs can’t guarantee the integrity of this unsigned plugin. Ask the plugin author to request it to be signed.", "read-more-about-plugins-signing": "Read more about plugins signing.", @@ -7383,6 +9022,13 @@ "search-field": { "placeholder-search-grafana-plugins": "Search Grafana plugins" }, + "use-plugin-details-tabs": { + "nav-model-children": { + "text": { + "dashboards": "Dashboards" + } + } + }, "version-install-button": { "text-installed": "Installed" }, @@ -7500,6 +9146,11 @@ "label-git-hub-features": "GitHub features", "label-realtime-feedback": "Realtime feedback" }, + "connect-page": { + "subTitle": { + "connect-external-storage-manage-resources": "Connect to an external storage to manage your resources" + } + }, "connect-repository-button": { "configure": "Configure", "configure-file": "Configure file provisioning", @@ -7533,7 +9184,13 @@ }, "edit-repository-page": { "back-to-repositories": "Back to repositories", - "repository-config-exists-configuration": "Make sure the repository config exists in the configuration file." + "repository-config-exists-configuration": "Make sure the repository config exists in the configuration file.", + "subTitle": { + "configure-repository-storing-resources": "Configure a repository for storing your resources." + }, + "text": { + "configure-repository": "Configure repository" + } }, "empty-state": { "no-jobs": "No jobs..." @@ -7596,6 +9253,11 @@ "no-results-matching-your-query": "No results matching your query", "placeholder-search": "Search" }, + "get-default-values": { + "title": { + "repository": "Repository" + } + }, "getting-started": { "alert-temporary-outage": "When you connect your whole instance, dashboards will be unavailable while running the migration. We recommend warning your users before starting the process.", "modal-description-public-access": "Set up public access to your Grafana instance to enable GitHub integration", @@ -7740,7 +9402,18 @@ "dashboard-preview": "Dashboard Preview", "existing-dashboard": "Existing dashboard", "history": "History", + "message": { + "removed-from-repo-test-ui": "removed from repo test UI", + "updated-from-repo-test-ui": "updated from repo test UI" + }, "repository": "Repository", + "tab-info": { + "label": { + "dry-run-result-after-apply": "Dry run (result after apply)", + "existing-from-grafana": "Existing (from Grafana)", + "file-from-repository": "File (from repository)" + } + }, "title-error-saving-file": "Error saving file" }, "setup-modal": { @@ -8153,14 +9826,6 @@ "reload-button": "Reload", "title": "Unable to find application file" }, - "sandbox": { - "test-stuff-page": { - "application-notifications-toasts-testing": "Application notifications (toasts) testing", - "error": "Error", - "success": "Success", - "warning": "Warning" - } - }, "save-dashboards": { "message-length": { "info": "The message is {{messageLength}} characters, which exceeds the maximum length of 500 characters. Please shorten it before saving.", @@ -8220,6 +9885,14 @@ "view-as-folders": "View by folders", "view-as-list": "View as list" }, + "bluge-searcher": { + "opts": { + "label": { + "alphabetically-az": "Alphabetically (A-Z)", + "alphabetically-za": "Alphabetically (Z-A)" + } + } + }, "dashboard-actions": { "import": "Import", "new": "New", @@ -8247,6 +9920,14 @@ "search-results-table": { "aria-label-search-results-table": "Search results table", "no-data": "No values" + }, + "unified-searcher": { + "opts": { + "label": { + "alphabetically-az": "Alphabetically (A-Z)", + "alphabetically-za": "Alphabetically (Z-A)" + } + } } }, "select": { @@ -8318,6 +9999,11 @@ "delete-service-account": "Delete service account", "disable-service-account": "Disable service account", "enable-service-account": "Enable service account", + "page-nav": { + "subTitle": { + "manage-settings-individual-service-account": "Manage settings for an individual service account." + } + }, "title-delete-service-account": "Delete service account", "title-disable-service-account": "Disable service account", "tokens": "Tokens", @@ -8634,6 +10320,12 @@ "sort-picker": { "select-aria-label": "Sort" }, + "status-history": { + "status-history-panel": { + "too-many-points_one": "Too many points to visualize properly. <1></1>Update the query to return fewer points. <3></3>({{count}} point received)", + "too-many-points_other": "Too many points to visualize properly. <1></1>Update the query to return fewer points. <3></3>({{count}} points received)" + } + }, "support-bundles": { "new-bundle-button": { "new-support-bundle": "New support bundle" @@ -8641,7 +10333,10 @@ "support-bundles-create-unconnected": { "cancel": "Cancel", "create": "Create", - "sub-title": "Choose the components for the support bundle. The support bundle will be available for 3 days after creation." + "sub-title": "Choose the components for the support bundle. The support bundle will be available for 3 days after creation.", + "text": { + "create-support-bundle": "Create support bundle" + } }, "support-bundles-unconnected": { "created-on": "Created on", @@ -8656,10 +10351,35 @@ "login": "Login" }, "table": { + "auto-cell-options-editor": { + "description-wrap-text": "If selected text will be wrapped to the width of text in the configured column", + "label-wrap-text": "Wrap text" + }, + "bar-gauge-cell-options-editor": { + "label-gauge-display-mode": "Gauge display mode", + "label-value-display": "Value display" + }, + "color-background-cell-options-editor": { + "description-apply-to-entire-row": "If selected the entire row will be colored as this cell would be.", + "description-wrap-text": "If selected text will be wrapped to the width of text in the configured column", + "label": { + "text-alpha": "Alpha" + }, + "label-apply-to-entire-row": "Apply to entire row", + "label-background-display-mode": "Background display mode", + "label-wrap-text": "Wrap text", + "wrap-text": "Wrap text" + }, "container": { "content": "Showing too many columns in a single table may impact performance and make data harder to read. Consider refining your queries.", "show-all-series": "Show all columns", "show-only-series": "Showing only {{MAX_NUMBER_OF_COLUMNS}} columns" + }, + "image-cell-options-editor": { + "description-alt-text": "Alternative text that will be displayed if an image can't be displayed or for users who use a screen reader", + "description-title-text": "Text that will be displayed when the image is hovered by a cursor", + "label-alt-text": "Alt text", + "label-title-text": "Title text" } }, "tag-filter": { @@ -8675,6 +10395,24 @@ "select-placeholder": "Select a team" }, "teams": { + "build-nav-model": { + "nav-model": { + "subTitle": { + "manage-members-and-settings": "Manage members and settings" + }, + "text": { + "settings": "Settings" + } + }, + "team-group-sync": { + "text": { + "external-group-sync": "External group sync" + } + }, + "text": { + "members": "Members" + } + }, "create-team": { "create": "Create", "description-email": "This is optional and is primarily used for allowing custom team avatars", @@ -8696,6 +10434,9 @@ "external-group-sync": "External group sync", "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", + "text": { + "add-group": "Add group" + }, "title-there-external-groups": "There are no external groups to sync with", "tooltip-add-external-group": "LDAP group example: {{example}}" }, @@ -8797,6 +10538,42 @@ "select-search-input": "Type to search (country, city, abbreviation)" } }, + "timeseries": { + "annotation-editor2": { + "add-annotation": "Add annotation", + "cancel": "Cancel", + "edit-annotation": "Edit annotation", + "label-description": "Description", + "label-tags": "Tags", + "placeholder-add-tags": "Add tags", + "save": "Save", + "saving": "Saving" + }, + "annotation-tooltip2": { + "tooltip-delete": "Delete", + "tooltip-edit": "Edit" + }, + "line-style-editor": { + "title-the-input-expects-a-segment-list": "The input expects a segment list", + "tooltip-help": "Help" + }, + "nulls-threshold-input": { + "placeholder-never": "Never" + }, + "outside-range-plugin": { + "data-outside-time-range": "Data outside time range", + "zoom-to-data": "Zoom to data" + }, + "timezones-editor": { + "tooltip-add-timezone": "Add timezone", + "tooltip-remove-timezone": "Remove timezone" + } + }, + "traces": { + "traces-panel": { + "no-data-found-in-response": "No data found in response" + } + }, "transformations": { "empty": { "add-transformation-body": "Transformations allow data to be changed in various ways before your visualization is shown.<1></1>This includes joining data together, renaming fields, making calculations, formatting data for display, and more.", @@ -8833,6 +10610,10 @@ "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": { + "browser": "Browser", + "utc": "UTC" + }, "label-as": "as", "label-date-format": "Date format", "label-field": "Field", @@ -8919,11 +10700,32 @@ "tooltip-format": "The output format for the field specified as a <2>Moment.js format string</2>.", "tooltip-timezone-manually": "Set the timezone of the date manually" }, + "get-timezone-options": { + "label": { + "browser": "Browser", + "utc": "UTC" + } + }, "get-tooltips": { "description": "A valid path of an json object.", "json-value": "JSON Value:", + "map-valid-paths": { + "description": { + "extract-fields-from-object": "=> extract fields from object", + "extract-value": "=> extract <1>{{ value }}</1>", + "extract-value-first-element": "=> extract <1>{{ value }}</1> first element", + "extract-value-second-element": "=> extract <1>{{ value }}</1> second element" + } + }, "valid-paths": "Valid Paths:" }, + "get-transformer-option-pane": { + "root": { + "title": { + "root": "root" + } + } + }, "group-by-field-configuration": { "placeholder-ignored": "Ignored", "placeholder-select-stats": "Select stats" @@ -8940,7 +10742,23 @@ "label-cell-value": "Cell value", "label-column": "Column", "label-empty-value": "Empty value", - "label-row": "Row" + "label-row": "Row", + "special-value-options": { + "description": { + "boolean-false-value": "Boolean false value", + "boolean-true-value": "Boolean true value", + "empty-string": "Empty string", + "null-value": "Null value", + "number-value": "Number 0 value" + }, + "label": { + "empty": "Empty", + "false": "False", + "null": "Null", + "true": "True", + "zero": "Zero" + } + } }, "histogram-transformer-editor": { "placeholder-auto": "Auto", @@ -9003,10 +10821,22 @@ "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": { + "keep-fields-options": { + "label": { + "no": "No", + "yes": "Yes" + } + }, "label-field": "Field", "label-keep-fields": "Keep fields", "label-naming": "Naming", "label-select-field": "Select field", + "naming-modes-options": { + "label": { + "as-frame-name": "As frame name", + "as-label": "As label" + } + }, "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" }, @@ -9028,6 +10858,16 @@ "label-include-time": "Include time", "label-labels-to-fields": "Labels to fields", "label-mode": "Mode", + "modes": { + "description": { + "collapse-field-single-value": "Collapse each field into a single value", + "create-table-series-value": "Create a table with one row for each series value" + }, + "label": { + "reduce-fields": "Reduce fields", + "series-to-rows": "Series to rows" + } + }, "placeholder-choose-stat": "Choose stat" }, "regex-matcher-editor": { @@ -9035,11 +10875,23 @@ "variable-regex-documentation": "Formats multi-value variable into a regex string" }, "regression-transformer-editor": { + "label": { + "cubic": "Cubic", + "quadratic": "Quadratic", + "quartic": "Quartic", + "quintic": "Quintic" + }, "label-degree": "Degree", "label-model-type": "Model type", "label-predicted-points": "Predicted points", "label-x-field": "X field", "label-y-field": "Y field", + "model-type-options": { + "label": { + "linear": "Linear", + "polynomial": "Polynomial" + } + }, "tooltip-number-of-xy-points-to-predict": "Number of X,Y points to predict" }, "rename-by-regex-transformer-editor": { @@ -9057,6 +10909,23 @@ "label-reverse": "Reverse", "placeholder-select-field": "Select field" }, + "supplier": { + "description": { + "apply-spatial-operations-to-the-geometry": "Apply spatial operations to the geometry", + "create-a-line-between-two-points": "Create a line between two points", + "geometry-define-field-headingdistancearea": "Use the geometry to define a new field (heading/distance/area)" + }, + "label": { + "area": "Area", + "as-line": "As line", + "calculate-value": "Calculate value", + "distance": "Distance", + "heading": "Heading", + "line-builder": "Line builder", + "prepare-spatial-field": "Prepare spatial field", + "transform": "Transform" + } + }, "time-series-table-transform-editor": { "label-stat": "Stat", "label-time-field": "Time field", @@ -9090,7 +10959,19 @@ "placeholder-auto": "Auto", "placeholder-field": "Field", "tooltip-window-size": "Window size", - "tooltip-window-size-percent": "Set the window size as a percentage of the total data" + "tooltip-window-size-percent": "Set the window size as a percentage of the total data", + "type-options": { + "label": { + "centered": "Centered", + "trailing": "Trailing" + } + }, + "window-size-mode-options": { + "label": { + "fixed": "Fixed", + "percentage": "Percentage" + } + } } }, "upgrade-box": { @@ -9147,6 +11028,11 @@ }, "users-action-bar-unconnected": { "invite": "Invite", + "options": { + "label": { + "users": "Users" + } + }, "placeholder-search-login-email": "Search user by login, email or name" } }, @@ -9190,6 +11076,32 @@ "confirm-delete-modal": { "title-delete-variable": "Delete variable" }, + "create-ad-hoc-variable-adapter": { + "description": { + "add-keyvalue-filters-on-the-fly": "Add key/value filters on the fly." + } + }, + "create-custom-variable-adapter": { + "description": { + "define-variable-values-manually": "Define variable values manually" + } + }, + "create-interval-variable-adapter": { + "description": { + "define-timespan-interval": "Define a timespan interval (for example: {{timeIntervals}})" + } + }, + "create-query-variable-adapter": { + "description": { + "variable-values-fetched-datasource-query": "Variable values are fetched from a datasource query" + } + }, + "data-source-variable-slice": { + "text": { + "default": "default", + "no-data-sources-found": "No data sources found" + } + }, "empty-state": { "button-title": "Add variable", "info-box-content": "Variables enable more interactive and dynamic dashboards. Instead of hard-coding things like server or sensor names in your metric queries you can use variables in their place. Variables are shown as list boxes at the top of the dashboard. These drop-down lists make it easy to change the data being displayed in your dashboard.", @@ -9216,6 +11128,13 @@ "placeholder-default-value-if-any": "default value, if any", "text-options": "Text options" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "dashboard" + } + } + }, "unknown-table": { "loading": "Loading...", "no-unknowns": "No renamed or missing variables found.", @@ -9272,5 +11191,25 @@ "data-hover-view": { "link": "Link" } + }, + "welcome": { + "welcome-banner": { + "need-help": "Need help?", + "welcome-to-grafana": "Welcome to Grafana" + } + }, + "xychart": { + "series-editor": { + "add-series": "Add series", + "aria-label-select-series": "Select series {{seriesNum}}", + "label-color-field": "Color field", + "label-frame": "Frame", + "label-size-field": "Size field", + "label-x-field": "X field", + "label-y-field": "Y field", + "placeholder-all-frames": "All frames", + "placeholder-select-frame": "Select frame", + "tooltip-delete-series": "Delete series" + } } } diff --git a/public/locales/es-ES/grafana.json b/public/locales/es-ES/grafana.json index 4a412853b45..68e111943c5 100644 --- a/public/locales/es-ES/grafana.json +++ b/public/locales/es-ES/grafana.json @@ -72,6 +72,11 @@ }, "admin-edit-org-page": { "label-name": "Nombre", + "page-nav": { + "subTitle": { + "manage-settings-roles-organization": "" + } + }, "render-missing-permission-message": { "title-access-denied": "Acceso denegado" } @@ -233,6 +238,13 @@ "upgrade-info": { "title": "Licencia Enterprise" }, + "user-admin-page": { + "page-nav": { + "subTitle": { + "manage-settings-for-an-individual-user": "" + } + } + }, "user-create-page": { "label-email": "Correo electrónico", "label-name": "Nombre", @@ -243,9 +255,16 @@ "label-ldap": "LDAP" }, "user-list-admin-page-un-connected": { + "label": { + "active-last-days": "", + "all-users": "Todos los usuarios" + }, "placeholder-search-login-email": "Buscar usuario por inicio de sesión, correo electrónico o nombre." }, "user-list-anonymous-devices-page-un-connected": { + "label": { + "active-last-days": "" + }, "placeholder-search-devices-by-ip-address": "Buscar dispositivos por dirección IP." }, "user-list-page": { @@ -364,6 +383,12 @@ "no-grouping": "Sin agrupación" }, "alert-group-alerts-table": { + "columns": { + "label": { + "instance-labels": "", + "notification-state": "Estado de la notificación" + } + }, "duration": "durante {{time}}" }, "alert-group-filter": { @@ -443,6 +468,11 @@ "description-section": "Introduce un nombre para identificar tu {{entityName}}.", "label-metric": "Métrica", "label-name": "Nombre", + "message": { + "must-enter-a-metric-name": "", + "must-enter-a-name": "", + "please-select-a-data-source": "Selecciona una fuente de datos" + }, "metric-aria-label-metric": "métrica", "metric-placeholder-recorded-metric": "Indica el nombre de la nueva métrica registrada", "placeholder-name": "Ponle un nombre a tu {{namePlaceholder}}", @@ -495,6 +525,9 @@ "alertmanager-config": { "gma-manual-configuration-description": "La configuración interna de Grafana Alertmanager no se puede cambiar manualmente. Para cambiar esta configuración, edita los recursos individuales a través de la interfaz de usuario.", "gma-manual-configuration-is-not-supported": "No se admiten cambios de configuración manual", + "message": { + "configuration-cannot-be-empty": "" + }, "reset": "Restablecer", "reset-confirmation": "¿Seguro que quieres restablecer la configuración de «{{alertmanagerName}}»? Los puntos de contacto y las políticas de notificación se restablecerán a sus valores predeterminados.", "resetting-configuration-might-while": "Restableciendo la configuración. Este proceso puede llevar un tiempo.", @@ -584,6 +617,9 @@ "create-a-contact-point": "Crear un punto de contacto", "label-default-contact-point": "Punto de contacto predeterminado", "label-timing-options": "Opciones de temporización", + "message": { + "required": "" + }, "or": "o..." }, "am-routes-expanded-form": { @@ -605,11 +641,19 @@ "label-override-grouping": "Anular agrupación", "label-value": "Valor", "matching-labels": "Etiquetas coincidentes", + "message": { + "required": "" + }, "placeholder-label": "etiqueta", "placeholder-value": "valor", "remove": "Eliminar", "tooltip-remove-matcher": "Quitar buscador de coincidencias" }, + "annotation-header-field": { + "message": { + "required": "" + } + }, "annotations": { "dashboard-annotation-field": { "dashboard": "Dashboard {{dashboardUid}}", @@ -681,6 +725,25 @@ "title": "No se pueden mostrar todos los eventos" } }, + "central-alert-history-scene": { + "scene": { + "labels-filter-variable": { + "label": { + "labels": "" + } + }, + "transitions-from-filter-variable": { + "label": { + "start-state": "" + } + }, + "transitions-to-filter-variable": { + "label": { + "end-state": "" + } + } + } + }, "channel-sub-form": { "delete": "Eliminar", "duplicate": "Duplicar", @@ -717,11 +780,17 @@ }, "cloud-data-source-selector": { "label": "Seleccionar fuente de datos", - "label-disabled": "Fuente de datos" + "label-disabled": "Fuente de datos", + "message": { + "please-select-a-data-source": "Selecciona una fuente de datos" + } }, "cloud-evaluation-behavior": { "description-pending-period": "Periodo durante el cual debe cumplirse la condición de umbral para activar una alerta. Al seleccionar «Ninguno» se activa la alerta inmediatamente una vez que se cumple la condición.", "label-pending-period": "Periodo pendiente", + "message": { + "must-be-a-positive-integer": "" + }, "title-set-evaluation-behavior": "Definir comportamiento de evaluación" }, "cloud-receiver-form": { @@ -762,6 +831,9 @@ "contact-point-selector": { "aria-label-refresh-contact-points": "Actualizar puntos de contacto", "contact-point-picker-label-contact-point": "Punto de contacto", + "message": { + "contact-point-is-required": "" + }, "title-failed-to-fetch-contact-points": "Error al obtener los puntos de contacto", "tooltip-refresh-contact-points-list": "Actualizar lista de puntos de contacto" }, @@ -828,6 +900,14 @@ }, "copy-to-clipboard": "Copiar «{{label}}» al portapapeles", "create-metadata": { + "label": { + "dashboard": "Panel de control", + "dashboard-and-panel": "", + "evaluation-interval": "Intervalo de evaluación", + "labels": "Etiquetas", + "metric-name": "", + "runbook-url": "" + }, "view-dashboard": "Ver dashboard", "view-panel": "Ver panel" }, @@ -868,9 +948,6 @@ "title-search-panel": "Buscar panel", "title-select-dashboard-and-panel": "Seleccionar dashboard y panel" }, - "data-source-section": { - "import-to-grafana": "Importar a las reglas de Grafana" - }, "datasource-not-found": { "card-description": "No se ha encontrado la fuente de datos para esta consulta, se ha eliminado o no está instalada correctamente.", "remove-query": "Eliminar consulta", @@ -952,6 +1029,11 @@ "text-loading-template": "Cargando plantilla...", "title-failed-to-fetch-notification-template": "Error al obtener la plantilla de notificación" }, + "edit-mute-timing-page": { + "text": { + "edit-time-interval": "" + } + }, "editor": { "edit-alert-rule": "", "edit-recording-rule": "", @@ -965,6 +1047,11 @@ "error-summary-button": { "content-show-all-errors": "" }, + "evaluate-every-validation-options": { + "message": { + "required": "" + } + }, "evaluation-behavior-summary": { "evaluate": "", "label-evaluate": "Evaluar", @@ -982,6 +1069,9 @@ "evaluation-group-creation-modal": { "description-group-name": "Un grupo evalúa todas sus reglas en el mismo intervalo de evaluación.", "description-often-rules-group-evaluated": "Frecuencia de evaluación de todas las reglas del grupo.", + "message": { + "required": "" + }, "placeholder-enter-a-name": "Introducir un nombre", "title-new-evaluation-group": "Nuevo grupo de evaluación" }, @@ -1004,12 +1094,24 @@ "title-permission-editrecreate-silence": "No tienes permiso para editar/volver a crear este silencio", "title-silence-not-found": "No se ha encontrado el silencio existente «{{silenceId}}»" }, + "existing-silence-editor-page": { + "page-nav": { + "text": { + "edit-silence": "" + } + } + }, "export": { "subtitle": { "formats": "Selecciona el formato y descarga el archivo o copia el contenido al portapapeles", "one-format": "Descarga el archivo o copia el contenido al portapapeles" } }, + "export-new-grafana-rule-page": { + "text": { + "export-new-grafana-rule": "" + } + }, "export-new-rule-button": { "tooltip-export-new-grafana-rule": "Exportar nueva regla de grafana" }, @@ -1035,6 +1137,16 @@ "no-data": "Sin datos", "page-counter": "" }, + "feature-toggle-page": { + "nav-model": { + "subTitle": { + "enable-alerting-grafana-config": "" + }, + "text": { + "alerting-is-not-enabled": "" + } + } + }, "federated-rule-warning": { "experimental": "Los grupos de reglas federadas son actualmente una característica experimental.", "read-documentation": "Leer documentación", @@ -1042,6 +1154,13 @@ }, "file-export-inline-documentation": { "api-provisioning": "El formato {{name}} solo es válido para el aprovisionamiento de API. <3>Consulta más información en la documentación correspondiente.</3>", + "export-inline-doc": { + "title": { + "apiprovisioning-format": "", + "fileprovisioning-format": "", + "terraformprovisioning-format": "" + } + }, "file-provisioning": "El formato {{name}} solo es válido para el aprovisionamiento de archivos. <3>Consulta más información en la documentación correspondiente.</3>", "terraform-provisioning": "El formato {{name}} solo es válido para el aprovisionamiento de Terraform. <3>Consulta más información en la documentación correspondiente.</3>" }, @@ -1049,6 +1168,20 @@ "copy-code": "Copiar código", "download": "Descargar" }, + "filter-options": { + "label": { + "alert-rule": "Regla de alerta", + "all": "Todo", + "error": "Error", + "firing": "", + "no-data": "Sin datos", + "normal": "Normal", + "ok": "Aceptar", + "pending": "Pendiente", + "recording-rule": "Registrando regla", + "recovering": "En recuperación" + } + }, "filter-view-results": { "aria-label-filteredrulelist": "lista-reglas-filtradas" }, @@ -1083,7 +1216,10 @@ } }, "folder-selector": { - "description-select-folder": "Selecciona una carpeta para almacenar tu regla." + "description-select-folder": "Selecciona una carpeta para almacenar tu regla.", + "message": { + "select-a-folder": "" + } }, "folderAndGroup": { "evaluation": { @@ -1098,15 +1234,88 @@ "for-input": { "description-pending": "Periodo durante el cual debe cumplirse la condición de umbral para activar una alerta. Al seleccionar «Ninguno» se activa la alerta inmediatamente una vez que se cumple la condición." }, + "for-validation-options": { + "message": { + "required": "" + } + }, "generate-alert-data-modal": { "add-alert-data": "Añadir datos de alerta", "add-alert-data-to-payload": "Añadir datos de alerta a la carga útil", + "alert-options": { + "label": { + "firing": "", + "resolved": "" + } + }, "review-alert-payload": "Revisar los datos de alerta para añadir a la carga útil:", "title-add-custom-alerts": "Añadir alertas personalizadas" }, + "get-alert-suggestions": { + "documentation": { + "annotations-attached-alert": "", + "fingerprint-identify-alert": "", + "grafana-external-alertmanager": "", + "organization-alert": "", + "time-the-alert-started-firing": "" + }, + "value": { + "labels-attached-alert": "", + "status-alert-firing-resolved": "" + } + }, + "get-cloud-scenes": { + "title": { + "mimir-alertmanager": "" + } + }, + "get-global-suggestions": { + "value": { + "an-array-containing-all-alerts": "" + } + }, + "get-grafana-alertmanager-scenes": { + "title": { + "grafana-alertmanager": "" + } + }, + "get-grafana-managed-scenes": { + "title": { + "grafanamanaged-alert-rules": "Reglas de alerta gestionadas por Grafana" + } + }, + "get-mimir-managed-rules-per-group-scenes": { + "rule-group-handler": { + "label": { + "rule-group": "" + } + }, + "title": { + "mimirmanaged-alert-rules-per-rule-group": "" + } + }, + "get-mimir-managed-rules-scenes": { + "title": { + "mimirmanaged-alert-rules": "" + } + }, "get-preview-results": { "title-error": "Error" }, + "get-state-display-model": { + "text": { + "alerting": "", + "error": "", + "firing": "", + "inactive": "", + "no-data": "", + "ok": "Aceptar", + "paused": "", + "pending": "", + "recovering": "", + "unknown": "" + } + }, "getting-stared": { "learn-more": "Para conocer una introducción práctica, consulta nuestro <2>tutorial para empezar con las alertas de Grafana</2>" }, @@ -1148,6 +1357,10 @@ "label-disable-resolved-message": "Deshabilitar mensaje resuelto" }, "grafana-evaluation-behavior-step": { + "message": { + "must-be-a-positive-integer": "", + "must-enter-a-group-name": "" + }, "missing-series-resolve-placeholder": "Predeterminado: 2", "or": "o...", "placeholder-select-an-evaluation-group": "Selecciona un grupo de evaluación...", @@ -1164,6 +1377,11 @@ "body-invalid-rule-id": "El UID de la regla en la URL de la página no es válido. Comprueba la URL e inténtalo de nuevo.", "title-invalid-rule-id": "ID de regla no válido" }, + "grafana-modify-export-page": { + "text": { + "modify-export": "" + } + }, "grafana-mute-timing-exporter-preview": { "text-loading": "Cargando…" }, @@ -1216,6 +1434,9 @@ }, "group-and-namespace-fields": { "group-picker-label-group": "Grupo", + "message": { + "required": "" + }, "namespace-picker-label-namespace": "Nombre del espacio" }, "group-by": { @@ -1272,14 +1493,19 @@ "header": { "tooltip-remove": "Quitar la expresión «{{refId}}»" }, + "history-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "Prueba realizada con éxito" + } + }, "home": { "label-get-started": "Empezar", "label-insights": "Información", "title-alerting": "Alertas" }, - "import-from-dsrules": { - "description-folder-import-rules": "La carpeta a la que se importarán las reglas" - }, "import-to-gma": { "action-button": "Importar", "additional-settings": "Configuraciones adicionales", @@ -1287,8 +1513,9 @@ "confirm-modal": { "confirm": "Importar", "loading": "Cargando...", - "loading-body": "Preparando los datos para la importación. Este proceso puede tardar un poco...", + "loading-body": "", "no-rules-body": "No hay reglas que importar. Selecciona un espacio de nombres o un grupo de reglas diferente.", + "no-rules-body-yaml": "", "no-rules-title": "No hay reglas para importar", "plugin-rules-warning": { "text": "Hemos detectado que algunas reglas están gestionadas por plugins. Estas reglas no se importarán.", @@ -1307,11 +1534,12 @@ "label": "Grupo" }, "import-location-and-filters": "Importar ubicación y filtros", + "import-source": "", "namespace": { "description": "Escribe para buscar un espacio de nombres existente", "label": "Nombre del espacio" }, - "pageTitle": "Importar reglas de alerta desde una fuente de datos a las reglas gestionadas por Grafana", + "pageTitle": "", "pause": { "label": "Pausar las reglas de alerta importadas" }, @@ -1319,10 +1547,26 @@ "label": "Pausar las reglas de registro importadas" }, "recording-rules": "Reglas de registro", + "source": { + "datasource": "", + "datasource-description": "", + "yaml": "", + "yaml-description": "" + }, "success": "Reglas de alerta importadas correctamente a las reglas gestionadas por Grafana.", "target-folder": { + "description": "La carpeta a la que se importarán las reglas", "label": "Carpeta de destino" - } + }, + "yaml": { + "description": "", + "label": "", + "required-message": "", + "target-datasource": "Fuente de datos de destino", + "target-datasource-description": "", + "target-datasource-required": "" + }, + "yaml-error": "" }, "insights": { "monitor-status-of-system": "Supervisa el estado de tu sistema", @@ -1398,6 +1642,9 @@ "text-loading-existing-labels": "Cargando etiquetas existentes" }, "labels-without-suggestions": { + "message": { + "required": "" + }, "placeholder-key": "clave", "placeholder-value": "valor" }, @@ -1437,6 +1684,24 @@ "log-record-viewer-by-timestamp": { "aria-label-state-history-by-timestamp": "Historial de estado por marca de tiempo" }, + "log-timeline-viewer": { + "label": { + "firing": "", + "mixed": "", + "no-data": "", + "normal": "Normal", + "pending": "Pendiente", + "recovering": "En recuperación" + } + }, + "loki-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "Prueba realizada con éxito" + } + }, "loki-state-history": { "clear-filters": "Borrar filtros", "common-labels": "Etiquetas comunes", @@ -1449,6 +1714,14 @@ "button": "Gestionar permisos", "title": "Gestionar permisos" }, + "manual-and-automatic-routing": { + "routing-options": { + "label": { + "select-contact-point": "", + "use-notification-policy": "" + } + } + }, "matcher-filter": { "filter-alerts-using-label-querying-without-braces": "Filtrar alertas mediante consulta de etiquetas sin corchetes. Por ej.:", "filter-alerts-using-label-querying-without-spaces": "Filtra alertas mediante una consulta de etiquetas sin espacios. Por ejemplo:", @@ -1466,6 +1739,9 @@ "label-operator": "Operador", "label-refine-affected-alerts": "Refinar las alertas afectadas", "label-value": "Valor", + "message": { + "required": "" + }, "placeholder-label": "etiqueta", "placeholder-value": "valor", "remove": "Eliminar", @@ -1497,6 +1773,16 @@ "aria-label": "Más", "button-text": "Más" }, + "multiple-data-source-picker": { + "get-data-source-options": { + "grouped-options": { + "label": { + "data-sources-with-configured-alert-rules": "", + "other-data-sources": "" + } + } + } + }, "mute-timing-actions-buttons": { "text-disabled": "Desactivado", "title-delete-mute-timing": "Eliminar tiempo de silencio" @@ -1560,11 +1846,26 @@ "read-more": "Consulta más información sobre las políticas de notificación.", "title-notification-routing": "Enrutamiento de notificaciones" }, + "new-mute-timing-page": { + "text": { + "add-time-interval": "" + } + }, "new-rule-from-panel-button": { "body-no-alerting-capable-query-found": "No se pueden crear alertas desde este panel porque no se encuentra ninguna consulta a una fuente de datos con capacidad de alerta.", "new-alert-rule": "Nueva regla de alerta", "title-no-alerting-capable-query-found": "No se ha encontrado ninguna consulta con capacidad de alerta" }, + "new-silence-page": { + "page-nav": { + "subTitle": { + "configure-silences-notifications-particular-alert": "" + }, + "text": { + "silence-alert-rule": "Silenciar regla de alerta" + } + } + }, "no-alert-managers-available": { "body-no-alertmanager-found": "No hemos podido encontrar ningún Alertmanager externo y es posible que no tengas acceso al Alertmanager integrado de Grafana.", "title-no-alertmanager-found": "No se ha encontrado ningún Alertmanager" @@ -1791,6 +2092,9 @@ "expressions": "Expresiones", "loading-data-sources": "Cargando fuentes de datos...", "manipulate-returned-queries-other-operations": "Manipula los datos devueltos por las consultas con operaciones matemáticas y de otro tipo.", + "message": { + "a-valid-expression-is-required": "" + }, "no-compatible-sources": "Parece que no tienes fuentes de datos compatibles", "title-deactivate-advanced-options": "Desactivar opciones avanzadas", "title-queries-expressions-configured": "No se han configurado consultas ni expresiones" @@ -1842,7 +2146,8 @@ }, "recording-rules": { "description-target-data-source": "La fuente de datos de Prometheus para almacenar las reglas de registro en", - "label-target-data-source": "Fuente de datos de destino" + "label-target-data-source": "Fuente de datos de destino", + "target-data-source-required": "" }, "recording-rules-name-space-and-group-step": { "description-select-namespace-group-recording": "Selecciona el espacio de nombres y el grupo para tu regla de registro.", @@ -2103,6 +2408,9 @@ "collapse-all": "Contraer todo", "expand-all": "Expandir todo" }, + "rule-list-v2": { + "import-to-gma": "" + }, "rule-modify-export": { "text-loading-the-rule": "Cargando la regla...", "title-cannot-exist": "No se puede cargar la regla. La regla no existe", @@ -2180,6 +2488,10 @@ "label-saved-searches": "Búsquedas guardadas" }, "health": "Salud", + "label": { + "hide": "Ocultar", + "show": "Mostrar" + }, "manage-alerts": "En estas fuentes de datos, puedes seleccionar Gestionar alertas a través de la interfaz de usuario de Alerting para poder administrar estas reglas de alerta en la interfaz de usuario de Grafana, así como en la fuente de datos donde se configuraron.", "placeholder-all-data-sources": "Todas las fuentes de datos", "plugin-rules": "Reglas del plugin", @@ -2276,6 +2588,9 @@ "label-comment": "Comentario", "label-created-by": "Creado por", "label-duration": "Duración", + "message": { + "required": "" + }, "placeholder-whos-creating-the-silence": "Quién está creando el silencio", "save-silence": "Guardar silencio", "saving": "Guardando…" @@ -2314,6 +2629,12 @@ "title-alert-rule-types": "Tipos de reglas de alerta" }, "state-history": { + "columns": { + "label": { + "state": "Estado", + "time": "Hora" + } + }, "filter-group": "Filtrar grupo", "filter-group-tooltip": "Filtra cada grupo de historial de estado por coincidencia exacta o por una expresión regular, por ejemplo:", "placeholder-search": "Buscar", @@ -2353,6 +2674,9 @@ "label-examples-documentation": "Documentación de ejemplos", "label-template-group": "Grupo de plantillas", "label-template-group-name": "Nombre del grupo de plantillas", + "message": { + "required": "" + }, "new-template-name-placeholder-give-your-template-group-a-name": "Ponle un nombre a tu grupo de plantillas", "title-error-saving-template": "Error al guardar la plantilla", "title-templating-cheat-sheet": "Hoja de trucos de plantillas" @@ -2375,6 +2699,11 @@ "existing-templates-selector-aria-label-choose-notification-template": "Elegir plantilla de notificación", "existing-templates-selector-placeholder-choose-notification-template": "Elegir plantilla de notificación", "loading": "Cargando...", + "template-options": { + "label": { + "select-notification-template": "" + } + }, "tooltip-copy": "Copiar la plantilla de notificación seleccionada en el portapapeles. Puedes usarlo en la pestaña personalizada." }, "templates": { @@ -2477,10 +2806,39 @@ } }, "use-columns": { + "columns": { + "label": { + "alert-rule-targeted": "", + "alerts-silenced": "", + "health": "Salud", + "matching-labels": "Etiquetas coincidentes", + "name": "Nombre", + "schedule": "Programar", + "state": "Estado", + "time-range": "Intervalo de tiempo" + } + }, + "label": { + "actions": "Acciones", + "created": "Creado", + "group": "Grupo", + "labels": "Etiquetas", + "next-evaluation": "Siguiente evaluación", + "state": "Estado", + "summary": "Resumen" + }, "title-edit": "Editar", "title-recreate": "Volver a crear", "title-unsilence": "Anular silencio" }, + "use-combined-labels": { + "grouped-options": { + "label": { + "from-alerts": "", + "from-system": "" + } + } + }, "use-create-dropdown-menu-actions": { "label-delete": "Eliminar", "label-edit": "Editar", @@ -2514,6 +2872,17 @@ "title-edit-notification-policy": "Editar política de notificación" } }, + "use-page-nav": { + "page-nav": { + "text": { + "details": "Detalles", + "history": "Historial", + "instances": "Instancias", + "query-and-conditions": "", + "versions": "Versiones" + } + } + }, "use-state-history-modal": { "state-history-modal": { "title-state-history": "Historial de estado" @@ -2534,6 +2903,36 @@ "body": "El contenido YAML en el editor solo contiene la configuración de la regla de alerta <1></1>Para configurar Prometheus, debes proporcionar el resto del <4>contenido del archivo de configuración.</4>" } }, + "alertlist": { + "group-by": { + "aria-label-group-by-label-keys": "", + "placeholder-group-by": "Agrupar por" + }, + "ungrouped-mode-view": { + "active-for": "", + "aria-label-view-alert-rule": "", + "view-alert-rule": "" + }, + "unified-alert-list": { + "clear": "Borrar", + "text-loading": "Cargando..." + }, + "unified-alert-list-panel": { + "body-permission-required": "", + "title-permission-required": "" + } + }, + "annolist": { + "anno-list-panel": { + "aria-label-remove-filter": "", + "filter": "", + "loading": "Cargando...", + "no-annotations-found": "" + }, + "annotation-list-item": { + "tooltip-created-by": "" + } + }, "annotations": { "annotation-field-mapper": { "annotation": "Notas", @@ -2630,6 +3029,11 @@ "configuration-required": "Configuración requerida", "refer-documentation-configure-authentication": "Consulta la documentación sobre cómo configurar la autenticación" }, + "field-map": { + "label": { + "none": "Ninguno" + } + }, "fields": { "allow-assign-grafana-admin-description": "", "allow-assign-grafana-admin-label": "", @@ -2733,7 +3137,18 @@ "use-refresh-token-description": "", "use-refresh-token-label": "", "validate-hosted-domain-description": "", - "validate-hosted-domain-label": "" + "validate-hosted-domain-label": "", + "workload-identity-token-file-description": "", + "workload-identity-token-file-label": "", + "workload-identity-token-file-required": "" + }, + "get-page-nav": { + "subTitle": { + "configure-authentication-providers": "" + }, + "text": { + "authentication": "Autenticación" + } }, "provider-card": { "text-badge-enabled": "Activado", @@ -2769,6 +3184,12 @@ "auth-config-auth-config-page-unconnected": { "subtitle": "Gestiona tus ajustes de autenticación y configura el inicio de sesión único. Encuentra más información en nuestra <2><0>documentación</0></2>." }, + "barchart": { + "tick-spacing-editor": { + "content-require-space-from-the-right-side": "", + "label-rtl": "" + } + }, "bookmarks-page": { "empty": { "message": "Parece que aún no has creado ningún marcador", @@ -2897,11 +3318,199 @@ "text-this-repository-is-read-only": "Si tienes acceso directo al destino, copia el JSON y pégalo allí." }, "canvas": { + "apieditor": { + "label-endpoint": "", + "label-header-parameters": "", + "label-method": "Método", + "label-payload": "Payload", + "label-query-parameters": "Parámetros de la consulta", + "render-test-apibutton": { + "test-api": "", + "title-test-api": "" + } + }, + "button-item": { + "label": { + "center": "", + "left": "", + "right": "" + }, + "placeholder": { + "auto": "Auto" + } + }, + "button-style-editor": { + "label-variant": "Variante" + }, + "canvas-context-menu": { + "close-editor": "", + "open-editor": "", + "render-menu-items": { + "add-item-menu-item": { + "label-add-item": "" + }, + "edit-element-menu-item": { + "label-edit": "Editar" + }, + "label-bring-to-front": "", + "label-delete": "Eliminar", + "label-duplicate": "Duplicar", + "label-send-to-back": "", + "set-background-menu-item": { + "label-set-background": "" + } + } + }, + "cloud-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } + }, + "ellipse-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } + }, + "inline-edit": { + "canvas-inline-editor": "", + "tooltip-close-inline-editor": "" + }, + "inline-edit-body": { + "label-add-item": "", + "please-select-an-element": "" + }, + "line-style-editor": { + "label-animate": "" + }, + "metric-value-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } + }, "not-found-display": { "not-found": "<0>No se ha encontrado: </0><config />" }, + "pan-zoom-help": { + "ctrl-right-mouse": "", + "middle-mouse": "", + "pan-title": "", + "reset-double-click": "", + "title-pan-and-zoom-controls": "", + "zoom-scroll-wheel": "" + }, + "parallelogram-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } + }, + "params-editor": { + "aria-label-add": "Añadir", + "aria-label-delete": "Eliminar", + "placeholder-key": "Clave", + "placeholder-value": "Valor" + }, + "placement-editor": { + "label-constraints": "", + "label-position": "", + "loading": "Cargando..." + }, + "quick-positioning": { + "tooltip-align-bottom": "", + "tooltip-align-horizontal-centers": "", + "tooltip-align-left": "", + "tooltip-align-right": "", + "tooltip-align-top": "", + "tooltip-align-vertical-centers": "" + }, + "rectangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } + }, "text-display": { "double-click-to-set": "Haz doble clic para establecer el texto" + }, + "text-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } + }, + "tree-navigation-editor": { + "clear-selection": "Eliminar selección", + "frame-selection": "", + "label-add-item": "", + "missing-layer": "", + "no-settings": "", + "switcher-icon": { + "title-node-icon": "" + } + }, + "tree-node-title": { + "title-duplicate": "Duplicar", + "title-remove": "Eliminar", + "tooltip-duplicate": "Duplicar", + "tooltip-remove": "Eliminar" + }, + "triangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } } }, "carousel": { @@ -2981,6 +3590,22 @@ } }, "connections": { + "add-new-connection": { + "filter-by-options": { + "label": { + "all": "Todo", + "installed": "Instalada", + "new-updates": "" + } + }, + "label": { + "by-downloads": "", + "by-name-az": "", + "by-name-za": "", + "by-published-date": "", + "by-updated-date": "" + } + }, "advisor-redirect-notice": { "aria-label-link-to-advisor": "Enlace al Asesor", "body": "Prueba el nuevo Asesor para descubrir posibles problemas con tus fuentes de datos y plugins.", @@ -2997,6 +3622,22 @@ "body": "¡Las fuentes de datos han cambiado de sitio! Puedes descubrir nuevas fuentes de datos o gestionar las existentes en la página Conexiones, accesible desde el menú principal.", "go-to-connections": "Ir a conexiones" }, + "data-source-details-page": { + "subTitle": { + "datasource-could-found": "" + }, + "text": { + "unknown-datasource": "" + } + }, + "new-data-source-page": { + "subTitle": { + "choose-a-data-source-type": "" + }, + "text": { + "add-data-source": "Añadir fuente de datos" + } + }, "no-access-modal": { "connection-contact-grafana-admin": "Para añadir una nueva conexión, ponte en contacto con tu administrador de Grafana.", "editor-warning": "Los editores no pueden añadir nuevas conexiones. Puedes comprobar si ya está configurado en <2>Fuentes de datos</2>.", @@ -3009,6 +3650,18 @@ "search": { "aria-label-search-all": "Buscar todo", "placeholder": "Buscar todo" + }, + "use-data-source-settings-nav": { + "node": { + "subTitle": { + "data-source-error": "" + } + }, + "page-nav": { + "text": { + "data-source-nav-node": "" + } + } } }, "core": { @@ -3304,6 +3957,11 @@ "title-plugin-dashboard": "Dashboard del plugin" }, "dash-nav": { + "on-open-snapshot-original": { + "title": { + "proceed-to-external-site": "" + } + }, "render-left-actions": { "text-public": "Pública", "tooltip-view-as-scene": "Ver como escena" @@ -3315,11 +3973,26 @@ "dashboard-loading": { "cancel-loading-dashboard": "Cancelar la carga del dashboard" }, + "dashboard-page-error": { + "text": { + "not-found": "No encontrado" + } + }, "dashboard-settings": { "actions": { "close": "Cerrar" } }, + "dashboard-slice": { + "title": { + "dashboard-init-failed": "" + } + }, + "dashboard-srv": { + "message": { + "edit-dashboard-json": "" + } + }, "dashboard-validation": { "body-dashboard-failed-schema-validation": "La validación se proporciona con fines de desarrollo y es seguro ignorarla. Si eres desarrollador de Grafana, considera la posibilidad de comprobar y actualizar el esquema del dashboard", "title-checking-dashboard-validity": "Comprobando la validez del dashboard", @@ -3415,6 +4088,13 @@ "values": "Valores separados por coma", "values-placeholder": "1, 10, mykey : myvalue, myvalue, escaped,value" }, + "datasource-options": { + "name-filter": "", + "name-filter-description": "", + "name-filter-placeholder": "", + "type": "Tipo", + "type-placeholder": "" + }, "description": "Descripción", "description-placeholder": "Texto descriptivo", "label": "Etiqueta", @@ -3433,8 +4113,8 @@ "category": "Opciones de selección", "custom-all-value": "Personalizar todos los valores", "custom-all-value-description": "Un regex comodín u otro valor para representar Todo", - "include-all": "Incluir la opción Todo", - "include-all-description": "Habilita una opción para incluir todos los valores", + "include-all": "", + "include-all-description": "", "multi-value": "Multivalor" }, "type-category": "Opciones de {{type}}" @@ -3460,14 +4140,97 @@ "errors": { "failed-to-load": "Error al cargar el panel de control" }, + "fetch-dashboard": { + "message": { + "failed-to-fetch-dashboard": "" + } + }, "gen-aihistory": { "aria-label-send-custom-feedback": "Enviar comentarios personalizados", "footer-text": "Este contenido se ha generado mediante IA utilizando el <2>plugin de Grafana LLM</2>", "placeholder-tell-ai-what-to-do-next": "Indica a la IA qué hacer a continuación..." }, + "general-settings-unconnected": { + "editable-options": { + "label": { + "editable": "Editable", + "readonly": "" + } + } + }, + "get-debug-dashboard": { + "title": { + "annotations": "Anotaciones" + } + }, + "get-errors": { + "message": { + "error-loading-data": "" + } + }, "get-field-override-categories": { "label-add-field-override": "Añadir anulación de campo", - "label-add-override-property": "Añadir propiedad de anulación" + "label-add-override-property": "Añadir propiedad de anulación", + "title": { + "add-button": "" + } + }, + "get-library-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "Información", + "name": "Nombre" + } + }, + "get-library-viz-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "Información", + "name": "Nombre" + } + }, + "get-panel-editor-tabs": { + "text": { + "alert": "", + "query": "Consulta", + "transform-data": "" + } + }, + "get-panel-frame-category": { + "descriptor": { + "title": { + "panel-options": "Opciones del panel" + } + }, + "direction-options": { + "label": { + "horizontal": "Horizontal", + "vertical": "Vertical" + } + }, + "title": { + "description": "Descripción", + "max-per-row": "Máximo por fila", + "panel-links": "Enlaces del panel", + "repeat-by-variable": "Repetir por variable", + "repeat-direction": "Repetir dirección", + "repeat-options": "Repetir opciones", + "title": "Título", + "transparent-background": "Fondo transparente" + } + }, + "get-panel-menu": { + "text": { + "extensions": "" + } }, "help-wizard": { "copy-to-clipboard": "Copiar al portapapeles", @@ -3480,10 +4243,21 @@ "randomize-field-names-label-field-names": "Nombres de campos", "randomize-labels-label-labels": "Etiquetas", "randomize-string-values-label-string-values": "Valores de cadena", + "tabs": { + "label": { + "data": "Datos", + "snapshot": "Instantánea" + } + }, "title-complete-git-hub-comment-clipboard": "Copiar un comentario completo de GitHub en el portapapeles", "title-get-help-with-this-panel": "Obtener ayuda para este panel", "troubleshooting-docs": "Documentos de resolución de problemas" }, + "init-dashboard": { + "message": { + "failed-create-dashboard-model": "" + } + }, "inspect": { "data-tab": "Datos", "error-tab": "Error", @@ -3536,6 +4310,16 @@ "rows": "Número total de filas", "table-title": "Estadísticas" }, + "k8s-dashboard-api": { + "title": { + "deleted": "" + } + }, + "k8s-dashboard-v2api": { + "title": { + "deleted": "" + } + }, "layout": { "common": { "copy": "Copiar", @@ -3548,6 +4332,13 @@ "panel-layout-disabled": "Selecciona una fila o pestaña para cambiar las opciones de diseño del panel" } }, + "legacy-dashboard-api": { + "fetch-error": { + "message": { + "dashboard-not-found": "" + } + } + }, "make-editable": { "dashboard-not-editable": "Dashboard no editable", "make-editable": "Hacer editable" @@ -3567,6 +4358,20 @@ "menu-use-library-panel": "Usar panel de la librería" }, "new-panel-title": "Nuevo panel", + "on-create-new-row": { + "new-row": { + "title": { + "row-title": "" + } + } + }, + "on-create-new-widget-panel": { + "new-panel": { + "title": { + "widget-title": "" + } + } + }, "options": { "description": "Descripción", "title-option": "Título" @@ -3626,6 +4431,30 @@ "paused": "El administrador ha pausado este dashboard", "try-again-later": "Inténtalo de nuevo más tarde" }, + "remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, + "repeat-row-select": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, + "repeat-row-select2": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, "revert-dashboard-modal": { "body-restore-version": "¿Seguro que quieres restaurar el dashboard a la versión {{version}}? Todos los cambios no guardados se perderán.", "title-restore-version": "Restaurar versión" @@ -3739,6 +4568,18 @@ "sub-menu-un-connected": { "aria-label-template-variables": "Variables de plantilla" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "tabs-layout": { "delete-tab-text": "Al eliminar esta pestaña también se eliminarán todos los paneles. ¿Seguro que quieres continuar?", "delete-tab-title": "¿Eliminar pestaña?", @@ -3944,7 +4785,10 @@ }, "unthemed-dashboard-row": { "aria-label-delete-row": "Eliminar fila", - "learn-more": "Más información" + "learn-more": "Más información", + "title": { + "delete-row": "Eliminar fila" + } }, "validation": { "invalid-dashboard-id": "No se ha podido encontrar un ID de Grafana.com válido", @@ -3979,6 +4823,16 @@ }, "visualization-select-pane": { "placeholder-search-for": "Buscar...", + "radio-options": { + "description": { + "reusable-panels-share-between-multiple-dashboards": "" + }, + "label": { + "library-panels": "Paneles de librería", + "suggestions": "", + "visualizations": "" + } + }, "title-close": "Cerrar" }, "viz-panel": { @@ -4029,12 +4883,25 @@ "label-data-source": "Fuente de datos", "label-use-static-key-dimensions": "Usar dimensiones de clave estática" }, + "add-to-dashboard": { + "message": { + "could-navigate-selected-dashboard-please-again": "", + "could-panel-dashboard-please-again": "" + } + }, "add-to-dashboard-form": { "cancel": "Cancelar", "description-choose-where-to-add-the-panel": "Elige dónde añadir el panel.", "description-select-which-dashboard-panel-created": "Selecciona en qué dashboard se creará el panel.", + "label": { + "existing-dashboard": "Dashboard existente", + "new-dashboard": "Nuevo panel de control" + }, "label-dashboard": "Panel de control", "label-target-dashboard": "Dashboard de destino", + "message": { + "this-field-is-required": "Este campo es obligatorio." + }, "open-dashboard": "Abrir panel", "open-in-new-tab": "Abrir en pestaña nueva", "title-error-adding-the-panel": "Error al añadir el panel" @@ -4072,6 +4939,25 @@ "it-cannot-contain-or": "No puede contener «//» ni «..».", "least-valid-character": "Debe tener al menos un carácter válido." }, + "build-new-dashboard-save-model": { + "data": { + "title": { + "new-dashboard": "Nuevo panel de control" + } + } + }, + "build-new-dashboard-save-model-v2": { + "data": { + "title": { + "new-dashboard": "Nuevo panel de control" + } + } + }, + "config-public-dashboard": { + "title": { + "revoke-public-url": "Revocar URL pública" + } + }, "constant-variable-form": { "constant-options": "Opciones permanentes", "label-value": "Valor", @@ -4119,22 +5005,89 @@ "value-not-saved": "El valor aún no se ha guardado en la base de datos de Grafana", "view-pull-request-in-git-hub": "Ver solicitud de extracción en GitHub" }, + "dashboard-scene": { + "text": { + "edit-panel": "", + "view-panel": "Ver panel" + }, + "title": { + "dashboard": "Panel de control", + "discard-changes-to-dashboard": "" + } + }, + "dashboard-scene-page-state-manager": { + "message": { + "dashboard-not-found": "" + } + }, + "dashboard-scene-page-state-manager-v2": { + "message": { + "dashboard-not-found": "" + } + }, "data-source-variable-form": { "data-source-options": "Opciones de fuente de datos", "description-instance-name-filter": "Filtro Regex para elegir las instancias de origen de datos en la lista de valores de variables. Déjalo vacío para todos.", "example-instance-name-filter": "Ejemplo: <codeExample />", "selection-options": "Opciones de selección" }, + "default-grid-layout-manager": { + "row": { + "title": { + "row-title": "" + } + } + }, "description-label": { "description": "Descripción" }, + "edit-link-view": { + "edit-link-page-nav": { + "text": { + "edit-link": "Editar enlace" + } + } + }, "email-list": { "aria-label-emailmenu": "Alternar menú de correo electrónico" }, + "embedded-dashboard-test-page": { + "subTitle": { + "showing-dashboard-panel-tests-pie-chart": "" + }, + "text": { + "embedding-dashboard": "" + } + }, "empty-transformations-message": { "add-transformation": "Añadir transformación" }, + "get-edit-options": { + "title": { + "column-options": "", + "row-height-options": "" + } + }, + "get-panel-frame-options": { + "descriptor": { + "title": { + "panel-options": "Opciones del panel" + } + }, + "title": { + "description": "Descripción", + "panel-links": "Enlaces del panel", + "title": "Título", + "transparent-background": "Fondo transparente" + } + }, + "get-workflow-options": { + "label": { + "push-to-a-new-branch": "" + } + }, "group-by-variable-form": { + "alert-not-supported": "", "description-enables-users-custom-values": "Permite a los usuarios añadir valores personalizados a la lista", "description-provide-dimensions-as-csv-dimension-name-dimension-id": "Proporcionar dimensiones como CSV: {{name}}, {{value}}", "group-by-options": "Agrupar por opciones", @@ -4153,6 +5106,12 @@ "randomize-field-names-label-field-names": "Nombres de campos", "randomize-labels-label-labels": "Etiquetas", "randomize-string-values-label-string-values": "Valores de cadena", + "tabs": { + "label": { + "data": "Datos", + "snapshot": "Instantánea" + } + }, "title-complete-git-hub-comment-clipboard": "Copiar un comentario completo de GitHub en el portapapeles", "title-get-help-with-this-panel": "Obtener ayuda para este panel", "troubleshooting-docs": "Documentos de resolución de problemas", @@ -4195,6 +5154,14 @@ "body-name-already-exists": "Ya existe un dashboard con el mismo nombre en la carpeta seleccionada. ¿Seguro que quieres guardar este dashboard?", "title-name-already-exists": "Este nombre ya existe" }, + "on-remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, "panel-data-alerting-tab-rendered": { "alert": { "title-errors-loading-rules": "Errores al cargar las reglas" @@ -4216,6 +5183,11 @@ "table-view-aria-label-toggletableview": "Alternar vista de tabla", "table-view-label-table-view": "Vista de tabla" }, + "panel-editor": { + "text": { + "edit-panel": "" + } + }, "panel-editor-renderer": { "aria-label-open-options-pane": "Abrir panel de opciones", "tooltip-open-options-pane": "Abrir panel de opciones" @@ -4224,8 +5196,22 @@ "body-panel-plugin-not-loaded": "Asegúrate de que el panel que quieres inspeccionar esté visible y se haya mostrado antes de abrir la inspección.", "title-panel-plugin-not-loaded": "El plugin del panel no se ha cargado" }, + "panel-menu-behavior": { + "async-func": { + "text": { + "extensions": "", + "metrics-drilldown": "" + } + } + }, "panel-viz-type-picker": { "placeholder-search-for": "Buscar...", + "radio-options": { + "label": { + "suggestions": "", + "visualizations": "" + } + }, "title-close": "Cerrar" }, "provisioned-delete-modal": { @@ -4252,6 +5238,15 @@ "query-options": "Opciones de consulta", "selection-options": "Opciones de selección" }, + "resource-export": { + "label": { + "classic": "", + "json": "JSON", + "v1-resource": "", + "v2-resource": "", + "yaml": "" + } + }, "revert-dashboard-modal": { "body-restore-version": "¿Seguro que quieres restaurar el dashboard a la versión {{version}}? Todos los cambios no guardados se perderán.", "title-restore-version": "Restaurar versión" @@ -4360,6 +5355,18 @@ "solo-panel-page": { "loading": "Cargando" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "text-box-variable-form": { "placeholder-default-value-if-any": "(opcional)", "text-options": "Opciones de texto" @@ -4370,6 +5377,13 @@ "title-field-label": { "title": "Título" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "transformations-drawer": { "search-box-suffix": { "tooltip-clear-search": "Borrar búsqueda" @@ -4385,6 +5399,13 @@ "save-dashboard": "Guardar panel de control", "title-unsaved-changes": "Cambios sin guardar" }, + "use-dashboard-edit-page-nav": { + "page-nav": { + "text": { + "settings": "Configuración" + } + } + }, "variable-check-indicator": { "aria-label-variable-referenced-dashboard": "Esta variable no está referenciada por ninguna variable o dashboard.", "aria-label-variable-referenced-other-variables-dashboard": "Esta variable está referenciada por otras variables o dashboards.", @@ -4401,7 +5422,10 @@ "placeholder-descriptive-text": "Texto descriptivo", "placeholder-label-name": "Nombre de la etiqueta", "placeholder-variable-name": "Nombre de la variable", - "text-running-query": "Ejecutando consulta..." + "text-running-query": "Ejecutando consulta...", + "title": { + "delete-variable": "Eliminar variable" + } }, "variable-editor-list": { "definition": "Definición", @@ -4583,6 +5607,25 @@ "message": "No se ha encontrado ninguna fuente de datos" } }, + "datagrid": { + "add-column": { + "placeholder-column-name": "" + }, + "datagrid-context-menu": { + "render-context-menu-items": { + "label-clear-column": "", + "label-clear-row": "", + "label-remove-all-data": "", + "label-search": "Buscar…" + }, + "render-header-menu-items": { + "label-clear-column": "", + "label-delete-column": "", + "label-rename-column": "", + "label-set-field-type": "" + } + } + }, "datasources": { "add-new-data-source-button": { "tooltip-no-permission": "No tienes permiso para configurar nuevas fuentes de datos" @@ -4604,6 +5647,46 @@ "label-default": "Por defecto", "label-name": "Nombre" }, + "build-categories": { + "categories": { + "title": { + "cloud": "Nube", + "distributed-tracing": "", + "enterprise-plugins": "Plugins Enterprise", + "industrial-io-t": "", + "logging-document-databases": "", + "others": "", + "profiling": "", + "sql": "", + "time-series-databases": "" + } + } + }, + "build-nav-model": { + "analytics": { + "text": { + "insights": "Información" + } + }, + "caching": { + "text": { + "cache": "" + } + }, + "ds-permissions": { + "text": { + "permissions": "Permisos" + } + }, + "nav-model": { + "text": { + "settings": "Configuración" + } + }, + "text": { + "dashboards": "Paneles de control" + } + }, "button-row": { "delete": "Eliminar", "save-and-test": "Guardar y probar", @@ -4639,6 +5722,11 @@ "data-source-read-only-message": { "title-provisioned-data-source": "Fuente de datos aprovisionada" }, + "data-source-settings-reducer": { + "message": { + "testing-could-couple-minutes": "" + } + }, "data-source-type-card": { "aria-label-learn-more": "{{dataSourcePluginName}}, obtén más información." }, @@ -4656,13 +5744,88 @@ "footer": { "add-csv-or-spreadsheet": "Añadir CSV u hoja de cálculo" }, + "get-enterprise-phantom-plugins": { + "description": { + "adobe-analytics-datasource": "", + "app-dynamics-integration-and-data-source": "", + "atlassian-statuspage-datasource": "", + "aurora-data-source": "", + "azure-cosmos-db-datasource": "", + "azure-devops-datasource": "", + "catchpoint-datasource": "", + "cloudflare-datasource": "", + "cockroach-db-datasource": "", + "data-dog-integration-and-data-source": "", + "drone-datasource": "", + "git-lab-integration-and-datasource": "", + "honeycomb-integration-and-datasource": "", + "jira-integration-and-datasource": "", + "logic-monitor-devices-datasource": "", + "mongo-db-integration-and-data-source": "", + "netlify-datasource": "", + "new-relic-integration-and-data-source": "", + "pager-duty-datasource": "", + "salesforce-integration-and-datasource": "", + "sap-hana-integration-and-data-source": "", + "service-now-integration-and-data-source": "", + "signal-fx-integration-and-datasource": "", + "snowflake-integration-and-data-source": "", + "sumo-logic-integration-and-datasource": "", + "visualize-and-explore-dynatrace-data": "", + "visualize-and-explore-oracle-sql": "", + "visualize-and-explore-splunk-logs": "", + "wavefront-integration-and-data-source": "", + "zendesk-datasource": "" + } + }, + "get-grafana-cloud-phantom-plugin": { + "description": { + "hosted-graphite-prometheus-and-loki": "" + } + }, "new-data-source-view": { "cancel": "Cancelar", "placeholder-filter-by-name-or-type": "Filtrar por nombre o tipo" }, + "update-data-source": { + "error-info": { + "message": { + "an-unexpected-error-occurred": "" + } + } + }, "use-data-source-info": { "badge-text-not-supported": "No admitida", - "badge-text-supported": "Consolidada" + "badge-text-supported": "Consolidada", + "label": { + "alerting": "Alertas", + "type": "Tipo" + } + }, + "use-delete-loaded-data-source": { + "title": { + "delete": "Eliminar" + } + } + }, + "debug": { + "cursor-view": { + "no-events-yet": "" + }, + "render-info-viewer": { + "data-counter": "", + "elapsed-time": "", + "field": "Campo", + "last": "", + "render-counter": "", + "schema-counter": "", + "title-reset-counters": "", + "tooltip-step-back": "", + "type": "Tipo" + }, + "state-view": { + "current-value": "", + "label-state-name": "" } }, "dimensions": { @@ -4731,6 +5894,19 @@ "remove-value-mapping-aria-label-delete-value-mapping": "Eliminar asignación de valor", "remove-value-mapping-tooltip-delete": "Eliminar", "set-color": "Establecer color", + "special-match-options": { + "description": { + "boolean-false-values": "", + "boolean-true-values": "", + "empty-string": "", + "matches-against-number-na-n-not-a-number": "", + "matches-null-and-undefined-values": "", + "matches-null-undefined-and-na-n": "" + }, + "label": { + "empty": "Vacío" + } + }, "tooltip-remove-color": "Quitar color", "tooltip-remove-icon": "Quitar icono" }, @@ -4746,6 +5922,20 @@ "display-text": "Visualizar texto", "icon": "Icono", "label-add-a-new-mapping": "Añadir nueva asignación", + "mapping-types": { + "description": { + "match-a-numerical-range-of-values": "", + "match-a-regular-expression-with-replacement": "", + "match-a-specific-text-value": "", + "match-boolean-empty-values": "" + }, + "label": { + "range": "", + "regex": "", + "special": "", + "value": "Valor" + } + }, "update": "Actualizar" } }, @@ -4770,6 +5960,7 @@ }, "explore": { "accordian-logs": { + "events": "", "footer": "Las marcas de tiempo de los eventos son relativas a la hora de inicio de trazas completas." }, "accordian-references": { @@ -4780,6 +5971,11 @@ "basic-extensions": { "aria-label-add": "Añadir" }, + "build-dashboard-panel-from-explore-state": { + "title": { + "new-panel": "" + } + }, "clear": "Borrar", "confirm-navigation-modal": { "cancel": "Cancelar", @@ -4866,6 +6062,33 @@ "title-table": "Tabla", "title-traces": "Trazas" }, + "explore-query-inspector": { + "data-tab": { + "label": { + "data": "Datos" + } + }, + "error-tab": { + "label": { + "error": "Error" + } + }, + "json-tab": { + "label": { + "json": "JSON" + } + }, + "query-tab": { + "label": { + "query": "Consulta" + } + }, + "stats-tab": { + "label": { + "stats": "Estadísticas" + } + } + }, "explore-run-query-button": { "run-button": { "aria-label-run-query-options": "Opciones de ejecución de la consulta" @@ -4879,10 +6102,23 @@ "description-explore-disabled": "Para habilitar Explorar, habilítalo en la configuración de Grafana:", "title-explore-disabled": "La opción para explorar está deshabilitada" }, + "get-field-links-for-explore": { + "text": { + "data": "Datos", + "raw-value": "" + } + }, "get-matches-metadata": { "matches": "0 coincidencias" }, "legacy-create-span-link-factory": { + "text": { + "tags": "Etiquetas" + }, + "title": { + "related-logs": "", + "session-for-this-span": "Sesión para este intervalo" + }, "title-explore-metrics-for-this-span": "Explorar las métricas de este intervalo", "title-explore-split": "Explorar los logs correspondientes en vista dividida", "title-session-for-this-span": "Sesión para este intervalo" @@ -4923,6 +6159,10 @@ }, "logs-meta-row": { "download": "Descargar", + "label": { + "deduplication-count": "", + "showing-only-selected-fields": "" + }, "show-original-line": "Mostrar línea original" }, "logs-sample-panel": { @@ -5104,6 +6344,21 @@ "run-query-button": "Ejecutar consulta", "switch-datasource-button": "Cambiar la fuente de datos y ejecutar la consulta" }, + "scoped-vars-from-span": { + "text": { + "span": "" + } + }, + "scoped-vars-from-tags": { + "text": { + "tags": "Etiquetas" + } + }, + "scoped-vars-from-trace": { + "text": { + "trace": "Traza" + } + }, "search-bar-input": { "placeholder-find": "Buscando...", "suffix": { @@ -5138,9 +6393,25 @@ "tooltip-tag-key": "Clave de etiqueta que se utilizará para obtener el valor de la etiqueta. Se buscarán los atributos y recursos de un intervalo para la clave de etiqueta" }, "span-detail": { + "label": { + "kind": "", + "library-name": "", + "library-version": "", + "status": "Estado:", + "status-message": "", + "trace-state": "" + }, "label-resource-attributes": "Atributos de recursos", "label-span-attributes": "Atributos de intervalo", "label-stack-trace": "Traza de pilas", + "overview-items": { + "label": { + "child-count": "", + "duration": "", + "service": "", + "start-time": "" + } + }, "warnings": "Advertencias" }, "span-filters": { @@ -5247,6 +6518,18 @@ "title-node-graph": "Gráfico de nodos" }, "unthemed-logs": { + "description": { + "show-results-in-logs-visualisation": "", + "show-results-in-table-visualisation": "", + "show-results-newest-to-oldest": "", + "show-results-oldest-to-newest": "" + }, + "label": { + "logs": "Logs", + "newest-first": "El más reciente primero", + "oldest-first": "El más antiguo primero", + "table": "Tabla" + }, "label-deduplication": "Deduplicación", "label-display-results": "Mostrar resultados", "label-prettify-json": "Prettify JSON", @@ -5262,6 +6545,15 @@ }, "unthemed-virtualized-trace-view": { "title-scroll-to-top": "Desplazarse al inicio" + }, + "use-focus-span-link": { + "create-focus-span-link": { + "link": { + "title": { + "deep-link-to-this-span": "" + } + } + } } }, "export": { @@ -5347,6 +6639,15 @@ "folder-repo": { "badge-text": "Provisionado" }, + "folders": { + "get-loading-nav": { + "main": { + "title": { + "loading": "Cargando" + } + } + } + }, "forgot-password": { "back-button": "Volver al inicio de sesión", "change-password": { @@ -5376,10 +6677,102 @@ "incomplete-request-error": "Lo sentimos, no hemos podido completar tu solicitud. Vuelve a intentarlo.", "send-custom-feedback": "Enviar" }, + "geomap": { + "coordinates-map-view-editor": { + "label-latitude": "", + "label-longitude": "" + }, + "debug-overlay": { + "center": "", + "zoom": "" + }, + "fit-map-view-editor": { + "all-layers-editor-fragment": { + "label-layer": "" + }, + "label-data": "Datos", + "last-only-editor-fragment": { + "label-padding": "", + "tooltip-padding-relative-percent-beyond-extent": "" + } + }, + "frame-multi-selection-editor": { + "placeholder-change-filter": "" + }, + "frame-selection-editor": { + "placeholder-change-filter": "" + }, + "geomap-panel": { + "aria-label-map": "" + }, + "geomap-style-rules-editor": { + "aria-label-add-geomap-style-rule": "" + }, + "layers-editor": { + "label-add-layer": "", + "no-layers": "" + }, + "map-view-editor": { + "label-max-zoom": "", + "label-view": "Vista", + "label-zoom": "Ampliar", + "use-current-map-settings": "" + }, + "markers-legend": { + "title-symbol": "Símbolo" + }, + "measure-overlay": { + "tooltip-show-measure-tools": "" + }, + "plugin": { + "basemap-layer-configured-server-admin": "" + }, + "style-editor": { + "label-align": "", + "label-baseline": "", + "label-color": "Color", + "label-fill-opacity": "", + "label-font-size": "", + "label-opacity": "", + "label-rotation-angle": "", + "label-size": "", + "label-symbol": "Símbolo", + "label-symbol-horizontal-align": "", + "label-symbol-vertical-align": "", + "label-text-label": "", + "label-x-offset": "", + "label-y-offset": "" + }, + "style-rule-editor": { + "aria-label-comparison-operator": "Operador de comparación", + "aria-label-comparison-value": "", + "aria-label-delete-style-rule": "", + "aria-label-feature-property": "", + "label-rule": "Regla", + "placeholder-feature-property": "", + "placeholder-numeric-value": "", + "placeholder-value": "valor" + } + }, "get-enterprise": { "requires-license": "Requiere una licencia de Grafana Enterprise", "title": "Enterprise" }, + "gettingstarted": { + "docs-card": { + "complete": "completada", + "learn-how": "" + }, + "getting-started": { + "aria-label-to-advanced-tutorials": "", + "aria-label-to-basic-tutorials": "", + "checking-completed-setup-steps": "", + "remove-this-panel": "" + }, + "tutorial-card": { + "complete": "completada" + } + }, "gops": { "config-card": { "text-loading-configuration": "Cargando configuración..." @@ -5396,6 +6789,74 @@ }, "progress-status": { "your-progress": "Tu progreso" + }, + "use-get-configuration-for-ui": { + "get-connect-data-source-configuration": { + "title": { + "connect-data-source": "" + } + }, + "title": { + "essentials": "Fundamentos" + } + }, + "use-get-essentials-configuration": { + "essential-content": { + "description": { + "configure-grafana-alerting": "", + "create-integration-alerting-contact-point": "", + "initialize-incident-plugin-declare-manage-incidents": "", + "practice-solving-an-incident": "", + "receive-alerts-oncall-notifications-within-environment": "", + "select-chat-ops-channels-to-route-notifications": "" + }, + "label": { + "add": "Añadir", + "connect": "Conectarse", + "initialize": "", + "select-integration": "", + "start-drill": "" + }, + "title": { + "add-slack-notifications-to-irm-integrations": "", + "connect-alerting-to-irm": "", + "connect-irm-to-your-slack-workspace": "", + "connect-your-messaging-workspace-to-incident": "", + "connect-your-messaging-workspace-to-on-call": "", + "create-incident-drill": "", + "detect": "Detectar", + "initialize-incident-plugin": "", + "messaging-workspace-channel-on-call-integration": "", + "respond": "", + "test-your-configuration": "" + } + }, + "get-grafana-alerting-config-steps": { + "description": { + "create-alert-monitor-system": "", + "create-on-call-integration-alerting-contact-point": "", + "create-slos-to-monitor-your-service": "" + }, + "label": { + "connect": "Conectarse", + "create": "Crear", + "enable": "Habilitar" + }, + "steps": { + "label": { + "edit": "Editar" + }, + "title": { + "update-default-contact-point": "" + } + }, + "title": { + "connect-alerting-to-on-call": "", + "create-alert-rule": "Crear regla de alerta", + "create-slo": "", + "enable-slo-alerting": "" + } + } } }, "grafana": { @@ -5762,14 +7223,18 @@ "duplicate-panel": "Duplicar panel", "exit-edit/setting-views": "Salir de las opciones de edición/ajustes", "expand-all-rows": "Expandir todas las filas", + "explore-panel": "", "go-to-dashboards": "Ir a paneles de control", "go-to-explore": "Ir a Explorar", "go-to-home-dashboard": "Ir al panel de control de inicio", "go-to-profile": "Ir al perfil", + "inspect-panel": "", "make-time-range-permanent": "Hacer que el rango de tiempo sea absoluto/permanente", "move-time-range-back": "Retrasar el rango de tiempo", "move-time-range-forward": "Mover el rango de tiempo hacia delante", "open-search": "Abrir búsqueda", + "open-share-embed-drawer": "", + "open-share-link-drawer": "", "open-shared-modal": "Compartir instantánea del panel", "paste-time-range": "Pegar intervalo de tiempo", "refresh-all-panels": "Actualizar todos los paneles", @@ -5795,6 +7260,11 @@ "support-bundle": "También puedes recuperar un paquete de asistencia que contiene información relativa a tu instancia de Grafana y a las fuentes de datos configuradas en la <1>sección de paquetes de asistencia</1>.", "troubleshooting-help": "Para solicitar ayuda con la resolución de problemas, envía una instantánea de este panel al equipo de asistencia técnica de Grafana Labs. La instantánea contiene los datos de respuesta a la consulta y la configuración del panel." }, + "histogram": { + "histogram-panel": { + "no-histogram-found-in-response": "" + } + }, "inspector": { "inspect-data-tab": { "loading": "Cargando", @@ -5844,6 +7314,9 @@ "label-name": "Nombre", "label-password": "Contraseña", "label-username": "Nombre de usuario", + "message": { + "email-is-invalid": "" + }, "placeholder-name-optional": "Nombre (opcional)", "placeholder-password": "Contraseña", "placeholder-username": "Nombre de usuario", @@ -6103,8 +7576,26 @@ "discard-local-changes": "Descartar cambios locales", "title-dashboard-changed": "Dashboard cambiado" }, + "live-channel-editor": { + "description-grafana-live": "", + "namespace": "Nombre del espacio", + "path": "Ruta", + "placeholder-select-watchable-resource": "", + "scope": "", + "title-grafana-live": "" + }, "live-connection-warning": { "title-connection-to-server-is-lost": "Se ha perdido la conexión con el servidor..." + }, + "live-panel": { + "error": "Error", + "grafana-requires-feature": "", + "panel-editor-channel": "", + "title-grafana-live": "", + "waiting-for-data": "" + }, + "live-publish": { + "publish": "" } }, "lock-icon": "Icono de candado", @@ -6151,6 +7642,13 @@ } }, "logs": { + "get-dataframe-fields": { + "vars": { + "text": { + "labels": "Etiquetas" + } + } + }, "infinite-scroll": { "end-of-range": "Fin del intervalo de tiempo seleccionado.", "load-more": "Desplazarse para cargar más", @@ -6231,6 +7729,11 @@ "shortcut": "Alt+seleccionar para volver a activar" } }, + "log-series-to-logs-model": { + "label": { + "total-bytes-processed": "" + } + }, "logs-controls": { "deduplication": "Deduplicación", "disable-highlighting": "Desactivar resaltado", @@ -6265,6 +7768,11 @@ "scroll-top": "Desplazarse al inicio", "start-of-range": "Inicio del intervalo" }, + "logs-panel": { + "render-common-labels": { + "common-labels": "" + } + }, "out-of-range-message": { "end-of-the-selected-time-range": "Fin del intervalo de tiempo seleccionado." }, @@ -6321,6 +7829,14 @@ }, "snapshot-list-table": { "title-delete": "Eliminar" + }, + "unthemed-dashboard-import": { + "subTitle": { + "import-dashboard-from-file-or-grafanacom": "" + }, + "text": { + "import-dashboard": "Importar panel de control" + } } }, "migrate-to-cloud": { @@ -6978,8 +8494,57 @@ "close": "Cerrar cajón" }, "link-title": "Ir al blog de Grafana Labs", + "news-panel": { + "body-error-loading-rss-feed": "", + "loading": "Cargando...", + "title-error-loading-rss-feed": "" + }, "title": "Últimas entradas del blog" }, + "nodeGraph": { + "arc-options-editor": { + "add-arc": "", + "title-remove-arc": "" + }, + "edge": { + "aria-label-from-to": "" + }, + "edge-header": { + "label-source-target": "" + }, + "marker": { + "100-node-count": "", + "aria-label-hidden-marker": "", + "node-count_one": "", + "node-count_other": "" + }, + "node": { + "aria-label-node-title": "" + }, + "node-graph": { + "aria-label-layered-layout-performance-warning": "", + "aria-label-nodes-hidden-warning": "", + "computing-layout": "", + "no-data": "Sin datos", + "hidden-nodes_one": "", + "hidden-nodes_other": "", + "processed-nodes_one": "", + "processed-nodes_other": "" + }, + "node-graph-panel": { + "no-data-found-in-response": "" + }, + "node-header": { + "label-subtitle": "", + "label-title": "Título" + }, + "view-controls": { + "hide-config": "", + "show-config": "", + "title-zoom-in": "", + "title-zoom-out": "" + } + }, "notifications": { "empty-state": { "description": "Las notificaciones que has recibido aparecerán aquí", @@ -7021,6 +8586,11 @@ "label-organization-name": "Nombre de la organización", "placeholder-org-name": "Nombre de la organización" }, + "org-details-page": { + "title": { + "confirm-preferences-update": "" + } + }, "org-profile": { "label-organization-name": "Nombre de la organización", "label-organization-profile": "Perfil de la organización", @@ -7040,7 +8610,10 @@ "tooltip": "Ahora puedes seleccionar la opción «Sin función básica» y añadir permisos según tus necesidades específicas. Puedes encontrar más información en <1>nuestra documentación</1>." }, "user-invite-page": { - "sub-title": "Envía una invitación o añade un usuario de Grafana existente a la organización.<1> {{orgName}}</1>" + "sub-title": "Envía una invitación o añade un usuario de Grafana existente a la organización.<1> {{orgName}}</1>", + "text": { + "invite-user": "" + } } }, "org-picker": { @@ -7052,6 +8625,38 @@ } }, "panel": { + "get-calculation-value-data-links-variable-suggestions": { + "value-calc-var": { + "label": { + "calculation-name": "" + } + } + }, + "get-data-links-variable-suggestions": { + "value-time-var": { + "label": { + "time": "Hora" + } + } + }, + "get-field-links-supplier": { + "text": { + "data": "Datos", + "field": "Campo", + "series": "", + "value": "Valor" + } + }, + "get-field-vars": { + "label": { + "name": "Nombre" + } + }, + "get-panel-links-variable-suggestions": { + "label": { + "all-variables": "" + } + }, "header-menu": { "copy": "Copiar", "create-library-panel": "Crear panel de librería", @@ -7112,6 +8717,13 @@ "select-placeholder": "Filtro por tipo" }, "playlist": { + "playlist-new-page": { + "page-nav": { + "text": { + "new-playlist": "Nueva lista de reproducción" + } + } + }, "playlist-table-rows": { "aria-label-playlist-item": "Elemento de la lista de reproducción, {{itemType}}, {{itemValue}}", "multiple-dashboards-found": "Se han encontrado varios elementos: {{items}}", @@ -7128,6 +8740,12 @@ "label-mode": "Modo", "label-time-and-refresh": "Tiempo y actualización", "label-variables": "Variables", + "modes": { + "label": { + "kiosk": "Quiosco", + "normal": "Normal" + } + }, "title-start-playlist": "Iniciar lista de reproducción" } }, @@ -7194,6 +8812,19 @@ }, "browse": { "aria-label-plugin-type-filter": "Filtro de tipo de plugin", + "filter-by-options": { + "label": { + "all": "Todo", + "installed": "Instalada", + "new-updates": "" + } + }, + "label": { + "all": "Todo", + "applications": "", + "data-sources": "Orígenes de datos", + "panels": "Paneles" + }, "label-search": "Buscar", "label-state": "Estado", "label-type": "Tipo", @@ -7275,12 +8906,24 @@ "empty-state": { "message": "No se ha encontrado ningún complemento" }, + "extensions-log-data-source": { + "message": { + "ok": "Aceptar" + } + }, "filter": { "disabled": "Este filtro se ha desactivado porque el servidor de Grafana no puede acceder a grafana.com", "sort": "Ordenar", "sort-list": "Ordenar lista de complementos", "state": "Estado" }, + "get-feature-state-info": { + "text": { + "alpha": "", + "beta": "Beta", + "deprecated": "Obsoleto" + } + }, "get-started-with-app": { "disable": "Deshabilitar", "enable": "Habilitar" @@ -7337,6 +8980,16 @@ "plugin-details-header-dependencies": { "grafana-dependency": "{{grafanaDependency}} de Grafana" }, + "plugin-details-page": { + "not-found-model": { + "subTitle": { + "requested-belong-plugin": "" + }, + "text": { + "unknown-plugin": "" + } + } + }, "plugin-details-signature": { "body-invalid-plugin-signature": "Grafana Labs comprueba cada plugin para verificar que tenga una firma digital válida. La verificación de la firma del plugin forma parte de nuestras medidas de seguridad para garantizar que los plugins sean seguros y fiables. Grafana Labs no puede garantizar la integridad de este plugin sin firmar. Pide al autor del plugin que solicite su firma.", "read-more-about-plugins-signing": "Consulta más información sobre la firma de plugins.", @@ -7382,6 +9035,13 @@ "search-field": { "placeholder-search-grafana-plugins": "Buscar plugins de Grafana" }, + "use-plugin-details-tabs": { + "nav-model-children": { + "text": { + "dashboards": "Paneles de control" + } + } + }, "version-install-button": { "text-installed": "Instalada" }, @@ -7499,6 +9159,11 @@ "label-git-hub-features": "Características de GitHub", "label-realtime-feedback": "Comentario en tiempo real" }, + "connect-page": { + "subTitle": { + "connect-external-storage-manage-resources": "" + } + }, "connect-repository-button": { "configure": "Configurar", "configure-file": "Configurar el aprovisionamiento de archivos", @@ -7532,7 +9197,13 @@ }, "edit-repository-page": { "back-to-repositories": "Volver a los repositorios", - "repository-config-exists-configuration": "Asegúrate de que la configuración del repositorio exista en el archivo de configuración." + "repository-config-exists-configuration": "Asegúrate de que la configuración del repositorio exista en el archivo de configuración.", + "subTitle": { + "configure-repository-storing-resources": "" + }, + "text": { + "configure-repository": "" + } }, "empty-state": { "no-jobs": "No hay trabajos..." @@ -7595,6 +9266,11 @@ "no-results-matching-your-query": "No hay resultados que coincidan con tu consulta", "placeholder-search": "Buscar" }, + "get-default-values": { + "title": { + "repository": "Repositorio" + } + }, "getting-started": { "alert-temporary-outage": "Cuando conectes toda tu instancia, los paneles no estarán disponibles mientras se ejecuta la migración. Recomendamos advertir a tus usuarios antes de iniciar el proceso.", "modal-description-public-access": "Configura el acceso público a tu instancia de Grafana para habilitar la integración de GitHub", @@ -7739,7 +9415,18 @@ "dashboard-preview": "Vista previa del dashboard", "existing-dashboard": "Dashboard existente", "history": "Historial", + "message": { + "removed-from-repo-test-ui": "", + "updated-from-repo-test-ui": "" + }, "repository": "Repositorio", + "tab-info": { + "label": { + "dry-run-result-after-apply": "", + "existing-from-grafana": "", + "file-from-repository": "" + } + }, "title-error-saving-file": "Error al guardar el archivo" }, "setup-modal": { @@ -8152,14 +9839,6 @@ "reload-button": "Volver a cargar", "title": "No se puede encontrar el archivo de la aplicación" }, - "sandbox": { - "test-stuff-page": { - "application-notifications-toasts-testing": "Pruebas de notificaciones de aplicaciones (elementos emergentes)", - "error": "Error", - "success": "Prueba realizada con éxito", - "warning": "Advertencia" - } - }, "save-dashboards": { "message-length": { "info": "El mensaje tiene {{messageLength}} caracteres, lo que excede la longitud máxima de 500 caracteres. Acórtalo antes de guardarlo.", @@ -8219,6 +9898,14 @@ "view-as-folders": "Ver por carpetas", "view-as-list": "Ver como lista" }, + "bluge-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } + }, "dashboard-actions": { "import": "Importar", "new": "Nuevo", @@ -8246,6 +9933,14 @@ "search-results-table": { "aria-label-search-results-table": "Tabla de resultados de búsqueda", "no-data": "Sin valores" + }, + "unified-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } } }, "select": { @@ -8317,6 +10012,11 @@ "delete-service-account": "Eliminar cuenta de servicio", "disable-service-account": "Deshabilitar cuenta de servicio", "enable-service-account": "Habilitar cuenta de servicio", + "page-nav": { + "subTitle": { + "manage-settings-individual-service-account": "" + } + }, "title-delete-service-account": "Eliminar cuenta de servicio", "title-disable-service-account": "Deshabilitar cuenta de servicio", "tokens": "Tokens", @@ -8633,6 +10333,12 @@ "sort-picker": { "select-aria-label": "Ordenar" }, + "status-history": { + "status-history-panel": { + "too-many-points_one": "", + "too-many-points_other": "" + } + }, "support-bundles": { "new-bundle-button": { "new-support-bundle": "Nuevo paquete de asistencia" @@ -8640,7 +10346,10 @@ "support-bundles-create-unconnected": { "cancel": "Cancelar", "create": "Crear", - "sub-title": "Elige los componentes para el paquete de asistencia. El paquete de asistencia estará disponible durante 3 días después de la creación." + "sub-title": "Elige los componentes para el paquete de asistencia. El paquete de asistencia estará disponible durante 3 días después de la creación.", + "text": { + "create-support-bundle": "" + } }, "support-bundles-unconnected": { "created-on": "Creado el", @@ -8655,10 +10364,35 @@ "login": "Iniciar sesión" }, "table": { + "auto-cell-options-editor": { + "description-wrap-text": "", + "label-wrap-text": "" + }, + "bar-gauge-cell-options-editor": { + "label-gauge-display-mode": "", + "label-value-display": "" + }, + "color-background-cell-options-editor": { + "description-apply-to-entire-row": "", + "description-wrap-text": "", + "label": { + "text-alpha": "" + }, + "label-apply-to-entire-row": "", + "label-background-display-mode": "", + "label-wrap-text": "", + "wrap-text": "" + }, "container": { "content": "Mostrar demasiadas columnas en una sola tabla puede afectar al rendimiento y dificultar la lectura de los datos. Considera la posibilidad de afinar tus consultas.", "show-all-series": "Mostrar todas las columnas", "show-only-series": "Mostrando solo {{MAX_NUMBER_OF_COLUMNS}} columnas" + }, + "image-cell-options-editor": { + "description-alt-text": "", + "description-title-text": "", + "label-alt-text": "", + "label-title-text": "" } }, "tag-filter": { @@ -8674,6 +10408,24 @@ "select-placeholder": "Seleccionar un equipo" }, "teams": { + "build-nav-model": { + "nav-model": { + "subTitle": { + "manage-members-and-settings": "" + }, + "text": { + "settings": "Configuración" + } + }, + "team-group-sync": { + "text": { + "external-group-sync": "Sincronización de grupo externo" + } + }, + "text": { + "members": "Miembros" + } + }, "create-team": { "create": "Crear", "description-email": "Esto es opcional y se utiliza principalmente para permitir avatares de equipo personalizados", @@ -8695,6 +10447,9 @@ "external-group-sync": "Sincronización de grupo externo", "label-add-external-group": "Añadir grupo externo", "team-sync-upgrade": "Añade un grupo para habilitar la sincronización de equipos de forma gratuita durante tu prueba de Grafana Pro", + "text": { + "add-group": "Añadir grupo" + }, "title-there-external-groups": "No hay grupos externos con los que sincronizarse", "tooltip-add-external-group": "Ejemplo de grupo de LDAP: {{example}}" }, @@ -8796,6 +10551,42 @@ "select-search-input": "Escribir para buscar (país, ciudad, abreviatura)" } }, + "timeseries": { + "annotation-editor2": { + "add-annotation": "Añadir anotación", + "cancel": "Cancelar", + "edit-annotation": "", + "label-description": "Descripción", + "label-tags": "Etiquetas", + "placeholder-add-tags": "", + "save": "Guardar", + "saving": "Guardando" + }, + "annotation-tooltip2": { + "tooltip-delete": "Eliminar", + "tooltip-edit": "Editar" + }, + "line-style-editor": { + "title-the-input-expects-a-segment-list": "", + "tooltip-help": "Ayuda" + }, + "nulls-threshold-input": { + "placeholder-never": "Nunca" + }, + "outside-range-plugin": { + "data-outside-time-range": "", + "zoom-to-data": "" + }, + "timezones-editor": { + "tooltip-add-timezone": "", + "tooltip-remove-timezone": "" + } + }, + "traces": { + "traces-panel": { + "no-data-found-in-response": "" + } + }, "transformations": { "empty": { "add-transformation-body": "Las transformaciones permiten cambiar los datos de varias maneras antes de que se muestre su visualización.<1></1>Aquí se incluyen acciones como unir datos, renombrar campos, hacer cálculos, dar formato a los datos para mostrarlos, etc.", @@ -8832,6 +10623,10 @@ "convert-field-type-transformer-editor": { "aria-label-add-a-convert-field-type-transformer": "Añadir un convertidor de tipo de campo", "aria-label-remove-convert-field-type-transformer": "Quitar convertidor de tipo de campo", + "label": { + "browser": "Navegador", + "utc": "" + }, "label-as": "como", "label-date-format": "Formato de fecha", "label-field": "Campo", @@ -8918,11 +10713,32 @@ "tooltip-format": "El formato de salida para el campo especificado como una <2>cadena de formato Moment.js</2>.", "tooltip-timezone-manually": "Establecer la zona horaria de la fecha manualmente" }, + "get-timezone-options": { + "label": { + "browser": "Navegador", + "utc": "" + } + }, "get-tooltips": { "description": "Una ruta válida de un objeto json.", "json-value": "Valor JSON:", + "map-valid-paths": { + "description": { + "extract-fields-from-object": "", + "extract-value": "", + "extract-value-first-element": "", + "extract-value-second-element": "" + } + }, "valid-paths": "Rutas válidas:" }, + "get-transformer-option-pane": { + "root": { + "title": { + "root": "" + } + } + }, "group-by-field-configuration": { "placeholder-ignored": "Ignorado", "placeholder-select-stats": "Seleccionar estadísticas" @@ -8939,7 +10755,23 @@ "label-cell-value": "Valor de la celda", "label-column": "Columna", "label-empty-value": "Valor vacío", - "label-row": "Fila" + "label-row": "Fila", + "special-value-options": { + "description": { + "boolean-false-value": "", + "boolean-true-value": "", + "empty-string": "", + "null-value": "", + "number-value": "" + }, + "label": { + "empty": "Vacío", + "false": "", + "null": "", + "true": "", + "zero": "" + } + } }, "histogram-transformer-editor": { "placeholder-auto": "Auto", @@ -9002,10 +10834,22 @@ "tooltip-naming": "Establece cómo se muestran los nombres de los campos seleccionados. Como nombre de marco suele ser mejor para datos de tablas" }, "partition-by-values-editor": { + "keep-fields-options": { + "label": { + "no": "No", + "yes": "Sí" + } + }, "label-field": "Campo", "label-keep-fields": "Conservar campos", "label-naming": "Uso de nombres", "label-select-field": "Seleccionar campo", + "naming-modes-options": { + "label": { + "as-frame-name": "", + "as-label": "" + } + }, "partition-values-works-single-frame": "La partición por valores solo funciona con un solo marco.", "tooltip-keeps-partition-fields-frames": "Mantener los campos de partición en los marcos" }, @@ -9027,6 +10871,16 @@ "label-include-time": "Incluir hora", "label-labels-to-fields": "Etiquetas a campos", "label-mode": "Modo", + "modes": { + "description": { + "collapse-field-single-value": "", + "create-table-series-value": "" + }, + "label": { + "reduce-fields": "", + "series-to-rows": "" + } + }, "placeholder-choose-stat": "Elegir estadística" }, "regex-matcher-editor": { @@ -9034,11 +10888,23 @@ "variable-regex-documentation": "" }, "regression-transformer-editor": { + "label": { + "cubic": "", + "quadratic": "", + "quartic": "", + "quintic": "" + }, "label-degree": "Grado", "label-model-type": "Tipo de modelo", "label-predicted-points": "Puntos previstos", "label-x-field": "Campo X", "label-y-field": "Campo Y", + "model-type-options": { + "label": { + "linear": "", + "polynomial": "" + } + }, "tooltip-number-of-xy-points-to-predict": "Número de puntos X,Y para predecir" }, "rename-by-regex-transformer-editor": { @@ -9056,6 +10922,23 @@ "label-reverse": "Reverso", "placeholder-select-field": "Seleccionar campo" }, + "supplier": { + "description": { + "apply-spatial-operations-to-the-geometry": "", + "create-a-line-between-two-points": "", + "geometry-define-field-headingdistancearea": "" + }, + "label": { + "area": "", + "as-line": "", + "calculate-value": "", + "distance": "", + "heading": "", + "line-builder": "", + "prepare-spatial-field": "", + "transform": "" + } + }, "time-series-table-transform-editor": { "label-stat": "Estadística", "label-time-field": "Campo de tiempo", @@ -9089,7 +10972,19 @@ "placeholder-auto": "Auto", "placeholder-field": "Campo", "tooltip-window-size": "Tamaño de la ventana", - "tooltip-window-size-percent": "Establecer el tamaño de la ventana como un porcentaje del total de datos" + "tooltip-window-size-percent": "Establecer el tamaño de la ventana como un porcentaje del total de datos", + "type-options": { + "label": { + "centered": "", + "trailing": "" + } + }, + "window-size-mode-options": { + "label": { + "fixed": "", + "percentage": "" + } + } } }, "upgrade-box": { @@ -9146,6 +11041,11 @@ }, "users-action-bar-unconnected": { "invite": "Invitar", + "options": { + "label": { + "users": "Usuarios" + } + }, "placeholder-search-login-email": "Buscar usuario por inicio de sesión, correo electrónico o nombre" } }, @@ -9189,6 +11089,32 @@ "confirm-delete-modal": { "title-delete-variable": "Eliminar variable" }, + "create-ad-hoc-variable-adapter": { + "description": { + "add-keyvalue-filters-on-the-fly": "" + } + }, + "create-custom-variable-adapter": { + "description": { + "define-variable-values-manually": "" + } + }, + "create-interval-variable-adapter": { + "description": { + "define-timespan-interval": "" + } + }, + "create-query-variable-adapter": { + "description": { + "variable-values-fetched-datasource-query": "" + } + }, + "data-source-variable-slice": { + "text": { + "default": "", + "no-data-sources-found": "No se ha encontrado ninguna fuente de datos" + } + }, "empty-state": { "button-title": "Añadir variable", "info-box-content": "Las variables permiten paneles de control más interactivos y dinámicos. En lugar de codificar elementos como los nombres de los servidores o sensores en las consultas de métricas, puedes usar variables en su lugar. Las variables se muestran como cuadros de lista en la parte superior del panel de control. Estas listas desplegables facilitan la modificación de los datos que se muestran en el panel de control.", @@ -9215,6 +11141,13 @@ "placeholder-default-value-if-any": "valor predeterminado, si lo hay", "text-options": "Opciones de texto" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "unknown-table": { "loading": "Cargando...", "no-unknowns": "No se han encontrado variables renombradas o que falten.", @@ -9271,5 +11204,25 @@ "data-hover-view": { "link": "Enlace" } + }, + "welcome": { + "welcome-banner": { + "need-help": "¿Necesitas ayuda?", + "welcome-to-grafana": "" + } + }, + "xychart": { + "series-editor": { + "add-series": "", + "aria-label-select-series": "", + "label-color-field": "", + "label-frame": "Marco", + "label-size-field": "", + "label-x-field": "Campo X", + "label-y-field": "Campo Y", + "placeholder-all-frames": "", + "placeholder-select-frame": "", + "tooltip-delete-series": "" + } } } \ No newline at end of file diff --git a/public/locales/fr-FR/grafana.json b/public/locales/fr-FR/grafana.json index e81145a6b0a..c07e69cc57f 100644 --- a/public/locales/fr-FR/grafana.json +++ b/public/locales/fr-FR/grafana.json @@ -72,6 +72,11 @@ }, "admin-edit-org-page": { "label-name": "Nom", + "page-nav": { + "subTitle": { + "manage-settings-roles-organization": "" + } + }, "render-missing-permission-message": { "title-access-denied": "Accès refusé" } @@ -233,6 +238,13 @@ "upgrade-info": { "title": "Licence Enterprise" }, + "user-admin-page": { + "page-nav": { + "subTitle": { + "manage-settings-for-an-individual-user": "" + } + } + }, "user-create-page": { "label-email": "Adresse e-mail", "label-name": "Nom", @@ -243,9 +255,16 @@ "label-ldap": "LDAP" }, "user-list-admin-page-un-connected": { + "label": { + "active-last-days": "", + "all-users": "Tous les utilisateurs" + }, "placeholder-search-login-email": "Rechercher un utilisateur par identifiant, e-mail ou nom." }, "user-list-anonymous-devices-page-un-connected": { + "label": { + "active-last-days": "" + }, "placeholder-search-devices-by-ip-address": "Rechercher des appareils par adresse IP." }, "user-list-page": { @@ -364,6 +383,12 @@ "no-grouping": "Aucun groupement" }, "alert-group-alerts-table": { + "columns": { + "label": { + "instance-labels": "", + "notification-state": "État de notification" + } + }, "duration": "pendant {{time}}" }, "alert-group-filter": { @@ -443,6 +468,11 @@ "description-section": "Saisissez un nom pour identifier votre {{entityName}}.", "label-metric": "Métrique", "label-name": "Nom", + "message": { + "must-enter-a-metric-name": "", + "must-enter-a-name": "", + "please-select-a-data-source": "Veuillez sélectionner une source de données" + }, "metric-aria-label-metric": "métrique", "metric-placeholder-recorded-metric": "Donner le nom de la nouvelle métrique enregistrée", "placeholder-name": "Donner un nom à votre {{namePlaceholder}}", @@ -495,6 +525,9 @@ "alertmanager-config": { "gma-manual-configuration-description": "La configuration interne de Grafana Alertmanager ne peut pas être modifiée manuellement. Pour modifier cette configuration, modifiez les ressources individuelles via l’interface utilisateur.", "gma-manual-configuration-is-not-supported": "Les modifications de configuration manuelles ne sont pas prises en charge", + "message": { + "configuration-cannot-be-empty": "" + }, "reset": "Réinitialiser", "reset-confirmation": "Voulez-vous vraiment réinitialiser la configuration pour « {{alertmanagerName}} » ? Les points de contact et les politiques de notification seront réinitialisés à leurs valeurs par défaut.", "resetting-configuration-might-while": "Réinitialisation de la configuration, cela peut prendre un certain temps.", @@ -584,6 +617,9 @@ "create-a-contact-point": "Créer un point de contact", "label-default-contact-point": "Point de contact par défaut", "label-timing-options": "Options d’horaire", + "message": { + "required": "" + }, "or": "ou" }, "am-routes-expanded-form": { @@ -605,11 +641,19 @@ "label-override-grouping": "Remplacer le regroupement", "label-value": "Valeur", "matching-labels": "Étiquettes correspondantes", + "message": { + "required": "" + }, "placeholder-label": "étiquette", "placeholder-value": "valeur", "remove": "Supprimer", "tooltip-remove-matcher": "Supprimer l’élément de correspondance" }, + "annotation-header-field": { + "message": { + "required": "" + } + }, "annotations": { "dashboard-annotation-field": { "dashboard": "Tableau de bord {{dashboardUid}}", @@ -681,6 +725,25 @@ "title": "Impossible d'afficher tous les événements" } }, + "central-alert-history-scene": { + "scene": { + "labels-filter-variable": { + "label": { + "labels": "" + } + }, + "transitions-from-filter-variable": { + "label": { + "start-state": "" + } + }, + "transitions-to-filter-variable": { + "label": { + "end-state": "" + } + } + } + }, "channel-sub-form": { "delete": "Supprimer", "duplicate": "Dupliquer", @@ -717,11 +780,17 @@ }, "cloud-data-source-selector": { "label": "Sélectionner la source de données", - "label-disabled": "Source de données" + "label-disabled": "Source de données", + "message": { + "please-select-a-data-source": "Veuillez sélectionner une source de données" + } }, "cloud-evaluation-behavior": { "description-pending-period": "Période pendant laquelle la condition de seuil doit être remplie pour déclencher une alerte. Sélectionner « Aucun » déclenche l’alerte immédiatement une fois la condition remplie.", "label-pending-period": "Période en attente", + "message": { + "must-be-a-positive-integer": "" + }, "title-set-evaluation-behavior": "Définir le comportement d’évaluation" }, "cloud-receiver-form": { @@ -762,6 +831,9 @@ "contact-point-selector": { "aria-label-refresh-contact-points": "Actualiser les points de contact", "contact-point-picker-label-contact-point": "Point de contact", + "message": { + "contact-point-is-required": "" + }, "title-failed-to-fetch-contact-points": "Échec de la récupération des points de contact", "tooltip-refresh-contact-points-list": "Actualiser la liste des points de contact" }, @@ -828,6 +900,14 @@ }, "copy-to-clipboard": "Copier « {{label}} » dans le presse-papiers", "create-metadata": { + "label": { + "dashboard": "Tableau de bord", + "dashboard-and-panel": "", + "evaluation-interval": "Intervalle d’évaluation", + "labels": "Étiquettes", + "metric-name": "", + "runbook-url": "" + }, "view-dashboard": "Afficher le tableau de bord", "view-panel": "Afficher le panneau" }, @@ -868,9 +948,6 @@ "title-search-panel": "Rechercher le panneau", "title-select-dashboard-and-panel": "Sélectionner le tableau de bord et le panneau" }, - "data-source-section": { - "import-to-grafana": "Importer dans les règles Grafana" - }, "datasource-not-found": { "card-description": "La source de données pour cette requête est introuvable, elle a été supprimée ou n’est pas installée correctement.", "remove-query": "Supprimer la requête", @@ -952,6 +1029,11 @@ "text-loading-template": "Chargement du modèle...", "title-failed-to-fetch-notification-template": "Échec de la récupération du modèle de notification" }, + "edit-mute-timing-page": { + "text": { + "edit-time-interval": "" + } + }, "editor": { "edit-alert-rule": "", "edit-recording-rule": "", @@ -965,6 +1047,11 @@ "error-summary-button": { "content-show-all-errors": "" }, + "evaluate-every-validation-options": { + "message": { + "required": "" + } + }, "evaluation-behavior-summary": { "evaluate": "", "label-evaluate": "Évaluer", @@ -982,6 +1069,9 @@ "evaluation-group-creation-modal": { "description-group-name": "Un groupe évalue toutes ses règles sur le même intervalle d’évaluation.", "description-often-rules-group-evaluated": "Fréquence à laquelle toutes les règles du groupe sont évaluées.", + "message": { + "required": "" + }, "placeholder-enter-a-name": "Saisir un nom", "title-new-evaluation-group": "Nouveau groupe d'évaluation" }, @@ -1004,12 +1094,24 @@ "title-permission-editrecreate-silence": "Vous n’avez pas l’autorisation de modifier/reproduire cette mise en sourdine", "title-silence-not-found": "Mise en sourdine existante « {{silenceId}} » introuvable" }, + "existing-silence-editor-page": { + "page-nav": { + "text": { + "edit-silence": "" + } + } + }, "export": { "subtitle": { "formats": "Sélectionnez le format et téléchargez le fichier ou copiez le contenu dans le presse-papiers", "one-format": "Téléchargez le fichier ou copiez le contenu dans le presse-papiers" } }, + "export-new-grafana-rule-page": { + "text": { + "export-new-grafana-rule": "" + } + }, "export-new-rule-button": { "tooltip-export-new-grafana-rule": "Exporter la nouvelle règle Grafana" }, @@ -1035,6 +1137,16 @@ "no-data": "Aucune donnée", "page-counter": "" }, + "feature-toggle-page": { + "nav-model": { + "subTitle": { + "enable-alerting-grafana-config": "" + }, + "text": { + "alerting-is-not-enabled": "" + } + } + }, "federated-rule-warning": { "experimental": "Les groupes de règles fédérées sont actuellement une fonctionnalité expérimentale.", "read-documentation": "Lire la documentation", @@ -1042,6 +1154,13 @@ }, "file-export-inline-documentation": { "api-provisioning": "Le format {{name}} n’est valide que pour la mise en service de l’API. <3>En savoir plus dans la documentation.</3>", + "export-inline-doc": { + "title": { + "apiprovisioning-format": "", + "fileprovisioning-format": "", + "terraformprovisioning-format": "" + } + }, "file-provisioning": "Le format {{name}} n’est valide que pour la mise en service de fichiers. <3>En savoir plus dans la documentation.</3>", "terraform-provisioning": "Le format {{name}} n’est valide que pour la mise en service de Terraform. <3>En savoir plus dans la documentation.</3>" }, @@ -1049,6 +1168,20 @@ "copy-code": "Copier le code", "download": "Télécharger" }, + "filter-options": { + "label": { + "alert-rule": "Règle d'alerte", + "all": "Tout", + "error": "Erreur", + "firing": "", + "no-data": "Aucune donnée", + "normal": "Normal", + "ok": "OK", + "pending": "En attente", + "recording-rule": "Règle d'enregistrement", + "recovering": "En récupération" + } + }, "filter-view-results": { "aria-label-filteredrulelist": "liste-de-règles-filtrées" }, @@ -1083,7 +1216,10 @@ } }, "folder-selector": { - "description-select-folder": "Sélectionnez un dossier pour stocker votre règle." + "description-select-folder": "Sélectionnez un dossier pour stocker votre règle.", + "message": { + "select-a-folder": "" + } }, "folderAndGroup": { "evaluation": { @@ -1098,15 +1234,88 @@ "for-input": { "description-pending": "Période pendant laquelle la condition de seuil doit être remplie pour déclencher une alerte. Sélectionner « Aucun » déclenche l’alerte immédiatement une fois la condition remplie." }, + "for-validation-options": { + "message": { + "required": "" + } + }, "generate-alert-data-modal": { "add-alert-data": "Ajouter des données d’alerte", "add-alert-data-to-payload": "Ajouter des données d’alerte à la charge utile", + "alert-options": { + "label": { + "firing": "", + "resolved": "" + } + }, "review-alert-payload": " Examiner les données d’alerte à ajouter à la charge utile :", "title-add-custom-alerts": "Ajouter des alertes personnalisées" }, + "get-alert-suggestions": { + "documentation": { + "annotations-attached-alert": "", + "fingerprint-identify-alert": "", + "grafana-external-alertmanager": "", + "organization-alert": "", + "time-the-alert-started-firing": "" + }, + "value": { + "labels-attached-alert": "", + "status-alert-firing-resolved": "" + } + }, + "get-cloud-scenes": { + "title": { + "mimir-alertmanager": "" + } + }, + "get-global-suggestions": { + "value": { + "an-array-containing-all-alerts": "" + } + }, + "get-grafana-alertmanager-scenes": { + "title": { + "grafana-alertmanager": "" + } + }, + "get-grafana-managed-scenes": { + "title": { + "grafanamanaged-alert-rules": "Règles d’alerte gérées par Grafana" + } + }, + "get-mimir-managed-rules-per-group-scenes": { + "rule-group-handler": { + "label": { + "rule-group": "" + } + }, + "title": { + "mimirmanaged-alert-rules-per-rule-group": "" + } + }, + "get-mimir-managed-rules-scenes": { + "title": { + "mimirmanaged-alert-rules": "" + } + }, "get-preview-results": { "title-error": "Erreur" }, + "get-state-display-model": { + "text": { + "alerting": "", + "error": "", + "firing": "", + "inactive": "", + "no-data": "", + "ok": "OK", + "paused": "", + "pending": "", + "recovering": "", + "unknown": "" + } + }, "getting-stared": { "learn-more": "Pour une introduction pratique, reportez-vous à notre <2>tutoriel pour commencer à utiliser Grafana Alerting</2>" }, @@ -1148,6 +1357,10 @@ "label-disable-resolved-message": "Désactiver le message résolu" }, "grafana-evaluation-behavior-step": { + "message": { + "must-be-a-positive-integer": "", + "must-enter-a-group-name": "" + }, "missing-series-resolve-placeholder": "Par défaut : 2", "or": "ou", "placeholder-select-an-evaluation-group": "Sélectionner un groupe d’évaluation...", @@ -1164,6 +1377,11 @@ "body-invalid-rule-id": "L’UID de règle dans l’URL de la page n’est pas valide. Veuillez vérifier l’URL et réessayer.", "title-invalid-rule-id": "ID de règle non valide" }, + "grafana-modify-export-page": { + "text": { + "modify-export": "" + } + }, "grafana-mute-timing-exporter-preview": { "text-loading": "Chargement…" }, @@ -1216,6 +1434,9 @@ }, "group-and-namespace-fields": { "group-picker-label-group": "Groupe", + "message": { + "required": "" + }, "namespace-picker-label-namespace": "Namespace" }, "group-by": { @@ -1272,14 +1493,19 @@ "header": { "tooltip-remove": "Supprimer l’expression « {{refId}} »" }, + "history-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "Succès" + } + }, "home": { "label-get-started": "Commencer", "label-insights": "Aperçus", "title-alerting": "Alerte" }, - "import-from-dsrules": { - "description-folder-import-rules": "Le dossier dans lequel importer les règles" - }, "import-to-gma": { "action-button": "Importer", "additional-settings": "Paramètres supplémentaires", @@ -1287,8 +1513,9 @@ "confirm-modal": { "confirm": "Importer", "loading": "Chargement en cours...", - "loading-body": "Préparation des données à importer. Cela peut prendre un certain temps...", + "loading-body": "", "no-rules-body": "Il n’y a pas de règles à importer. Veuillez sélectionner un autre namespace ou groupe de règles.", + "no-rules-body-yaml": "", "no-rules-title": "Aucune règle à importer", "plugin-rules-warning": { "text": "Nous avons détecté que certaines règles sont gérées par des plugins. Ces règles ne seront pas importées.", @@ -1307,11 +1534,12 @@ "label": "Groupe" }, "import-location-and-filters": "Importer l’emplacement et les filtres", + "import-source": "", "namespace": { "description": "Saisir le texte pour rechercher un namespace existant", "label": "Namespace" }, - "pageTitle": "Importer des règles d’alerte à partir d’une source de données vers des règles gérées par Grafana", + "pageTitle": "", "pause": { "label": "Suspendre les règles d’alerte importées" }, @@ -1319,10 +1547,26 @@ "label": "Suspendre les règles d’enregistrement importées" }, "recording-rules": "Règles d’enregistrement", + "source": { + "datasource": "", + "datasource-description": "", + "yaml": "", + "yaml-description": "" + }, "success": "Les règles d’alerte ont bien été importées dans les règles gérées par Grafana.", "target-folder": { + "description": "Le dossier dans lequel importer les règles", "label": "Dossier cible" - } + }, + "yaml": { + "description": "", + "label": "", + "required-message": "", + "target-datasource": "Source de données cible", + "target-datasource-description": "", + "target-datasource-required": "" + }, + "yaml-error": "" }, "insights": { "monitor-status-of-system": "Surveiller le statut de votre système", @@ -1398,6 +1642,9 @@ "text-loading-existing-labels": "Chargement des étiquettes existantes" }, "labels-without-suggestions": { + "message": { + "required": "" + }, "placeholder-key": "clé", "placeholder-value": "valeur" }, @@ -1437,6 +1684,24 @@ "log-record-viewer-by-timestamp": { "aria-label-state-history-by-timestamp": "Historique des états par horodatage" }, + "log-timeline-viewer": { + "label": { + "firing": "", + "mixed": "", + "no-data": "", + "normal": "Normal", + "pending": "En attente", + "recovering": "En récupération" + } + }, + "loki-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "Succès" + } + }, "loki-state-history": { "clear-filters": "Supprimer les filtres", "common-labels": "Étiquettes communes", @@ -1449,6 +1714,14 @@ "button": "Gérer les autorisations", "title": "Gérer les autorisations" }, + "manual-and-automatic-routing": { + "routing-options": { + "label": { + "select-contact-point": "", + "use-notification-policy": "" + } + } + }, "matcher-filter": { "filter-alerts-using-label-querying-without-braces": "Filtrer les alertes à l'aide de la méthode de recherche d'étiquettes sans accolades, par exemple :", "filter-alerts-using-label-querying-without-spaces": "Filtrer les alertes à l’aide de la méthode de recherche d’étiquettes sans espaces, par exemple :", @@ -1466,6 +1739,9 @@ "label-operator": "Opérateur", "label-refine-affected-alerts": "Affiner les alertes affectées", "label-value": "Valeur", + "message": { + "required": "" + }, "placeholder-label": "étiquette", "placeholder-value": "valeur", "remove": "Supprimer", @@ -1497,6 +1773,16 @@ "aria-label": "Plus", "button-text": "Plus" }, + "multiple-data-source-picker": { + "get-data-source-options": { + "grouped-options": { + "label": { + "data-sources-with-configured-alert-rules": "", + "other-data-sources": "" + } + } + } + }, "mute-timing-actions-buttons": { "text-disabled": "Désactivé", "title-delete-mute-timing": "Supprimer l’horaire de mise en sourdine" @@ -1560,11 +1846,26 @@ "read-more": "En savoir plus sur les politiques de notification.", "title-notification-routing": "Acheminement des notifications" }, + "new-mute-timing-page": { + "text": { + "add-time-interval": "" + } + }, "new-rule-from-panel-button": { "body-no-alerting-capable-query-found": "Impossible de créer des alertes à partir de ce panneau, car aucune requête à une source de données capable d’alerter n’a été trouvée.", "new-alert-rule": "Nouvelle règle d'alerte", "title-no-alerting-capable-query-found": "Aucune requête capable d’alerter n’a été trouvée" }, + "new-silence-page": { + "page-nav": { + "subTitle": { + "configure-silences-notifications-particular-alert": "" + }, + "text": { + "silence-alert-rule": "Mettre en sourdine la règle d’alerte" + } + } + }, "no-alert-managers-available": { "body-no-alertmanager-found": "Nous n’avons trouvé aucun Alertmanager externe et vous n’avez peut-être pas accès à l’Alertmanager Grafana intégré.", "title-no-alertmanager-found": "Aucun Alertmanager trouvé" @@ -1791,6 +2092,9 @@ "expressions": "Expressions", "loading-data-sources": "Chargement des sources de données…", "manipulate-returned-queries-other-operations": "Manipulez les données renvoyées par les requêtes avec des opérations mathématiques et autres.", + "message": { + "a-valid-expression-is-required": "" + }, "no-compatible-sources": "Vous semblez ne pas avoir de sources de données compatibles", "title-deactivate-advanced-options": "Désactiver les options avancées", "title-queries-expressions-configured": "Aucune requête ou expression n’a été configurée" @@ -1842,7 +2146,8 @@ }, "recording-rules": { "description-target-data-source": "La source de données Prometheus dans laquelle stocker les règles d’enregistrement", - "label-target-data-source": "Source de données cible" + "label-target-data-source": "Source de données cible", + "target-data-source-required": "" }, "recording-rules-name-space-and-group-step": { "description-select-namespace-group-recording": "Sélectionnez le namespace et le groupe pour votre règle d’enregistrement.", @@ -2103,6 +2408,9 @@ "collapse-all": "Tout réduire", "expand-all": "Développer tout" }, + "rule-list-v2": { + "import-to-gma": "" + }, "rule-modify-export": { "text-loading-the-rule": "Chargement de la règle...", "title-cannot-exist": "Impossible de charger la règle. La règle n’existe pas", @@ -2180,6 +2488,10 @@ "label-saved-searches": "Recherches enregistrées" }, "health": "Santé", + "label": { + "hide": "Masquer", + "show": "Afficher" + }, "manage-alerts": "Dans ces sources de données, vous pouvez sélectionner Gérer les alertes via l’interface utilisateur d’alerte pour pouvoir gérer ces règles d’alerte dans l’interface utilisateur Grafana, ainsi que dans la source de données où elles ont été configurées.", "placeholder-all-data-sources": "Toutes les sources de données", "plugin-rules": "Règles de plugin", @@ -2276,6 +2588,9 @@ "label-comment": "Commentaire", "label-created-by": "Créé par", "label-duration": "Durée", + "message": { + "required": "" + }, "placeholder-whos-creating-the-silence": "Qui crée la mise en sourdine", "save-silence": "Enregistrer la mise en sourdine", "saving": "Enregistrement en cours..." @@ -2314,6 +2629,12 @@ "title-alert-rule-types": "Types de règles d’alerte" }, "state-history": { + "columns": { + "label": { + "state": "État", + "time": "Heure" + } + }, "filter-group": "Filtrer par groupe", "filter-group-tooltip": "Filtrez chaque groupe d’historique d’état soit par correspondance exacte, soit par une expression régulière, par exemple :", "placeholder-search": "Rechercher", @@ -2353,6 +2674,9 @@ "label-examples-documentation": "Documentation des exemples", "label-template-group": "Groupe de modèles", "label-template-group-name": "Nom du groupe de modèles", + "message": { + "required": "" + }, "new-template-name-placeholder-give-your-template-group-a-name": "Donner un nom au groupe de modèles", "title-error-saving-template": "Erreur lors de l’enregistrement du modèle", "title-templating-cheat-sheet": "Aide-mémoire de modélisation" @@ -2375,6 +2699,11 @@ "existing-templates-selector-aria-label-choose-notification-template": "Choisir un modèle de notification", "existing-templates-selector-placeholder-choose-notification-template": "Choisir un modèle de notification", "loading": "Chargement en cours...", + "template-options": { + "label": { + "select-notification-template": "" + } + }, "tooltip-copy": "Copier le modèle de notification sélectionné dans le presse-papiers. Vous pouvez l’utiliser dans l’onglet personnalisé." }, "templates": { @@ -2477,10 +2806,39 @@ } }, "use-columns": { + "columns": { + "label": { + "alert-rule-targeted": "", + "alerts-silenced": "", + "health": "Santé", + "matching-labels": "Étiquettes correspondantes", + "name": "Nom", + "schedule": "Planifier", + "state": "État", + "time-range": "Plage temporelle" + } + }, + "label": { + "actions": "Actions", + "created": "Créé", + "group": "Groupe", + "labels": "Étiquettes", + "next-evaluation": "Prochaine évaluation", + "state": "État", + "summary": "Synthèse" + }, "title-edit": "Modifier", "title-recreate": "Recréer", "title-unsilence": "Réactiver le son" }, + "use-combined-labels": { + "grouped-options": { + "label": { + "from-alerts": "", + "from-system": "" + } + } + }, "use-create-dropdown-menu-actions": { "label-delete": "Supprimer", "label-edit": "Modifier", @@ -2514,6 +2872,17 @@ "title-edit-notification-policy": "Modifier la politique de notification" } }, + "use-page-nav": { + "page-nav": { + "text": { + "details": "Détails", + "history": "Historique", + "instances": "Instances", + "query-and-conditions": "", + "versions": "Versions" + } + } + }, "use-state-history-modal": { "state-history-modal": { "title-state-history": "Historique de l’état" @@ -2534,6 +2903,36 @@ "body": "Le contenu YAML dans l’éditeur ne contient que la configuration de la règle d’alerte <1></1>Pour configurer Prometheus, vous devez fournir le reste du <4>contenu du fichier de configuration.</4>" } }, + "alertlist": { + "group-by": { + "aria-label-group-by-label-keys": "", + "placeholder-group-by": "Regrouper par" + }, + "ungrouped-mode-view": { + "active-for": "", + "aria-label-view-alert-rule": "", + "view-alert-rule": "" + }, + "unified-alert-list": { + "clear": "Effacer", + "text-loading": "Chargement en cours..." + }, + "unified-alert-list-panel": { + "body-permission-required": "", + "title-permission-required": "" + } + }, + "annolist": { + "anno-list-panel": { + "aria-label-remove-filter": "", + "filter": "", + "loading": "Chargement en cours...", + "no-annotations-found": "" + }, + "annotation-list-item": { + "tooltip-created-by": "" + } + }, "annotations": { "annotation-field-mapper": { "annotation": "Annotation", @@ -2630,6 +3029,11 @@ "configuration-required": "Configuration requise", "refer-documentation-configure-authentication": "Reportez-vous à la documentation sur la façon de configurer l’authentification" }, + "field-map": { + "label": { + "none": "Aucun" + } + }, "fields": { "allow-assign-grafana-admin-description": "", "allow-assign-grafana-admin-label": "", @@ -2733,7 +3137,18 @@ "use-refresh-token-description": "", "use-refresh-token-label": "", "validate-hosted-domain-description": "", - "validate-hosted-domain-label": "" + "validate-hosted-domain-label": "", + "workload-identity-token-file-description": "", + "workload-identity-token-file-label": "", + "workload-identity-token-file-required": "" + }, + "get-page-nav": { + "subTitle": { + "configure-authentication-providers": "" + }, + "text": { + "authentication": "Authentification" + } }, "provider-card": { "text-badge-enabled": "Activé", @@ -2769,6 +3184,12 @@ "auth-config-auth-config-page-unconnected": { "subtitle": "Gérez vos paramètres d’authentification et configurez l’authentification unique. Pour en savoir plus, consultez notre <2>documentation</2>." }, + "barchart": { + "tick-spacing-editor": { + "content-require-space-from-the-right-side": "", + "label-rtl": "" + } + }, "bookmarks-page": { "empty": { "message": "Il semble que vous n'ayez pas encore créé de signets", @@ -2897,11 +3318,199 @@ "text-this-repository-is-read-only": "Si vous avez un accès direct à la cible, copiez le JSON et collez-le à cet endroit." }, "canvas": { + "apieditor": { + "label-endpoint": "", + "label-header-parameters": "", + "label-method": "Méthode", + "label-payload": "Charge utile", + "label-query-parameters": "Paramètres de requête", + "render-test-apibutton": { + "test-api": "", + "title-test-api": "" + } + }, + "button-item": { + "label": { + "center": "", + "left": "", + "right": "" + }, + "placeholder": { + "auto": "Auto" + } + }, + "button-style-editor": { + "label-variant": "Variante" + }, + "canvas-context-menu": { + "close-editor": "", + "open-editor": "", + "render-menu-items": { + "add-item-menu-item": { + "label-add-item": "" + }, + "edit-element-menu-item": { + "label-edit": "Modifier" + }, + "label-bring-to-front": "", + "label-delete": "Supprimer", + "label-duplicate": "Dupliquer", + "label-send-to-back": "", + "set-background-menu-item": { + "label-set-background": "" + } + } + }, + "cloud-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } + }, + "ellipse-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } + }, + "inline-edit": { + "canvas-inline-editor": "", + "tooltip-close-inline-editor": "" + }, + "inline-edit-body": { + "label-add-item": "", + "please-select-an-element": "" + }, + "line-style-editor": { + "label-animate": "" + }, + "metric-value-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } + }, "not-found-display": { "not-found": "<0>Introuvable : </0><config />" }, + "pan-zoom-help": { + "ctrl-right-mouse": "", + "middle-mouse": "", + "pan-title": "", + "reset-double-click": "", + "title-pan-and-zoom-controls": "", + "zoom-scroll-wheel": "" + }, + "parallelogram-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } + }, + "params-editor": { + "aria-label-add": "Ajouter", + "aria-label-delete": "Supprimer", + "placeholder-key": "Clé", + "placeholder-value": "Valeur" + }, + "placement-editor": { + "label-constraints": "", + "label-position": "", + "loading": "Chargement en cours..." + }, + "quick-positioning": { + "tooltip-align-bottom": "", + "tooltip-align-horizontal-centers": "", + "tooltip-align-left": "", + "tooltip-align-right": "", + "tooltip-align-top": "", + "tooltip-align-vertical-centers": "" + }, + "rectangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } + }, "text-display": { "double-click-to-set": "Double-cliquer pour définir le texte" + }, + "text-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } + }, + "tree-navigation-editor": { + "clear-selection": "Effacer la sélection", + "frame-selection": "", + "label-add-item": "", + "missing-layer": "", + "no-settings": "", + "switcher-icon": { + "title-node-icon": "" + } + }, + "tree-node-title": { + "title-duplicate": "Dupliquer", + "title-remove": "Supprimer", + "tooltip-duplicate": "Dupliquer", + "tooltip-remove": "Supprimer" + }, + "triangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } } }, "carousel": { @@ -2981,6 +3590,22 @@ } }, "connections": { + "add-new-connection": { + "filter-by-options": { + "label": { + "all": "Tout", + "installed": "Installé", + "new-updates": "" + } + }, + "label": { + "by-downloads": "", + "by-name-az": "", + "by-name-za": "", + "by-published-date": "", + "by-updated-date": "" + } + }, "advisor-redirect-notice": { "aria-label-link-to-advisor": "Lien vers le conseiller", "body": "Essayez le nouveau conseiller pour découvrir les problèmes potentiels concernant vos sources de données et plugins.", @@ -2997,6 +3622,22 @@ "body": "Les sources de données ont un nouveau foyer ! Vous pouvez découvrir de nouvelles sources de données ou gérer celles qui existent déjà dans la page Connexions, accessible depuis le menu principal.", "go-to-connections": "Accéder aux connexions" }, + "data-source-details-page": { + "subTitle": { + "datasource-could-found": "" + }, + "text": { + "unknown-datasource": "" + } + }, + "new-data-source-page": { + "subTitle": { + "choose-a-data-source-type": "" + }, + "text": { + "add-data-source": "Ajouter la source de données" + } + }, "no-access-modal": { "connection-contact-grafana-admin": "Pour ajouter une nouvelle connexion, contactez votre administrateur Grafana.", "editor-warning": "Les éditeurs ne peuvent pas ajouter de nouvelles connexions. Vous pouvez vérifier si elle est déjà configurée dans <2>Sources de données</2>.", @@ -3009,6 +3650,18 @@ "search": { "aria-label-search-all": "Rechercher tout", "placeholder": "Rechercher tout" + }, + "use-data-source-settings-nav": { + "node": { + "subTitle": { + "data-source-error": "" + } + }, + "page-nav": { + "text": { + "data-source-nav-node": "" + } + } } }, "core": { @@ -3304,6 +3957,11 @@ "title-plugin-dashboard": "Tableau de bord du plugin" }, "dash-nav": { + "on-open-snapshot-original": { + "title": { + "proceed-to-external-site": "" + } + }, "render-left-actions": { "text-public": "Public", "tooltip-view-as-scene": "Afficher en tant que scène" @@ -3315,11 +3973,26 @@ "dashboard-loading": { "cancel-loading-dashboard": "Annuler le chargement du tableau de bord" }, + "dashboard-page-error": { + "text": { + "not-found": "Introuvable" + } + }, "dashboard-settings": { "actions": { "close": "Fermer" } }, + "dashboard-slice": { + "title": { + "dashboard-init-failed": "" + } + }, + "dashboard-srv": { + "message": { + "edit-dashboard-json": "" + } + }, "dashboard-validation": { "body-dashboard-failed-schema-validation": "La validation est fournie à des fins de développement et peut être ignorée en toute sécurité. Si vous êtes un développeur Grafana, pensez à vérifier et à mettre à jour le schéma du tableau de bord", "title-checking-dashboard-validity": "Vérification de la validité du tableau de bord", @@ -3415,6 +4088,13 @@ "values": "Valeurs séparées par une virgule", "values-placeholder": "1, 10, mykey : myvalue, myvalue, escaped,value" }, + "datasource-options": { + "name-filter": "", + "name-filter-description": "", + "name-filter-placeholder": "", + "type": "Type", + "type-placeholder": "" + }, "description": "Description", "description-placeholder": "Texte de description", "label": "Étiquette", @@ -3433,8 +4113,8 @@ "category": "Options de sélection", "custom-all-value": "Personnaliser toutes les valeurs", "custom-all-value-description": "Un caractère générique regex ou une autre valeur pour représenter Tout", - "include-all": "Inclure l’option Tout", - "include-all-description": "Active une option pour inclure toutes les valeurs", + "include-all": "", + "include-all-description": "", "multi-value": "Multi-valeur" }, "type-category": "{{type}} options" @@ -3460,14 +4140,97 @@ "errors": { "failed-to-load": "Échec du chargement du tableau de bord" }, + "fetch-dashboard": { + "message": { + "failed-to-fetch-dashboard": "" + } + }, "gen-aihistory": { "aria-label-send-custom-feedback": "Envoyer un commentaire personnalisé", "footer-text": "Ce contenu est généré par l’IA à l’aide du <2>plugin Grafana LLM</2>", "placeholder-tell-ai-what-to-do-next": "Dites à l’IA que faire ensuite..." }, + "general-settings-unconnected": { + "editable-options": { + "label": { + "editable": "Modifiable", + "readonly": "" + } + } + }, + "get-debug-dashboard": { + "title": { + "annotations": "Annotations" + } + }, + "get-errors": { + "message": { + "error-loading-data": "" + } + }, "get-field-override-categories": { "label-add-field-override": "Ajouter un remplacement de champ", - "label-add-override-property": "Ajouter une propriété de remplacement" + "label-add-override-property": "Ajouter une propriété de remplacement", + "title": { + "add-button": "" + } + }, + "get-library-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "Information", + "name": "Nom" + } + }, + "get-library-viz-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "Information", + "name": "Nom" + } + }, + "get-panel-editor-tabs": { + "text": { + "alert": "", + "query": "Requête", + "transform-data": "" + } + }, + "get-panel-frame-category": { + "descriptor": { + "title": { + "panel-options": "Options du panneau" + } + }, + "direction-options": { + "label": { + "horizontal": "Horizontal", + "vertical": "Vertical" + } + }, + "title": { + "description": "Description", + "max-per-row": "Max par ligne", + "panel-links": "Liens de panneau", + "repeat-by-variable": "Répéter par variable", + "repeat-direction": "Répéter la direction", + "repeat-options": "Répéter les options", + "title": "Titre", + "transparent-background": "Arrière-plan transparent" + } + }, + "get-panel-menu": { + "text": { + "extensions": "" + } }, "help-wizard": { "copy-to-clipboard": "Copier dans le presse-papiers", @@ -3480,10 +4243,21 @@ "randomize-field-names-label-field-names": "Noms des champs", "randomize-labels-label-labels": "Étiquettes", "randomize-string-values-label-string-values": "Valeurs des chaînes de caractères", + "tabs": { + "label": { + "data": "Données", + "snapshot": "Instantané" + } + }, "title-complete-git-hub-comment-clipboard": "Copier un commentaire GitHub complet dans le presse-papiers", "title-get-help-with-this-panel": "Obtenir de l’aide sur ce panneau", "troubleshooting-docs": "Documents de dépannage" }, + "init-dashboard": { + "message": { + "failed-create-dashboard-model": "" + } + }, "inspect": { "data-tab": "Données", "error-tab": "Erreur", @@ -3536,6 +4310,16 @@ "rows": "Nombre total de lignes", "table-title": "Statistiques" }, + "k8s-dashboard-api": { + "title": { + "deleted": "" + } + }, + "k8s-dashboard-v2api": { + "title": { + "deleted": "" + } + }, "layout": { "common": { "copy": "Copier", @@ -3548,6 +4332,13 @@ "panel-layout-disabled": "Sélectionnez une ligne ou un onglet pour modifier les options de disposition du panneau" } }, + "legacy-dashboard-api": { + "fetch-error": { + "message": { + "dashboard-not-found": "" + } + } + }, "make-editable": { "dashboard-not-editable": "Tableau de bord non modifiable", "make-editable": "Rendre modifiable" @@ -3567,6 +4358,20 @@ "menu-use-library-panel": "Utiliser le panneau de bibliothèque" }, "new-panel-title": "Nouveau panneau", + "on-create-new-row": { + "new-row": { + "title": { + "row-title": "" + } + } + }, + "on-create-new-widget-panel": { + "new-panel": { + "title": { + "widget-title": "" + } + } + }, "options": { "description": "Description", "title-option": "Titre" @@ -3626,6 +4431,30 @@ "paused": "Ce tableau de bord a été suspendu par l’administrateur", "try-again-later": "Veuillez réessayer plus tard" }, + "remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, + "repeat-row-select": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, + "repeat-row-select2": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, "revert-dashboard-modal": { "body-restore-version": "Voulez-vous vraiment restaurer le tableau de bord dans sa version {{version}} ? Toutes les modifications non enregistrées seront perdues.", "title-restore-version": "Restaurer la version" @@ -3739,6 +4568,18 @@ "sub-menu-un-connected": { "aria-label-template-variables": "Variables de modèle" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "tabs-layout": { "delete-tab-text": "La suppression de cet onglet supprimera également tous les panneaux. Voulez-vous vraiment continuer ?", "delete-tab-title": "Supprimer l’onglet ?", @@ -3944,7 +4785,10 @@ }, "unthemed-dashboard-row": { "aria-label-delete-row": "Supprimer la ligne", - "learn-more": "En savoir plus" + "learn-more": "En savoir plus", + "title": { + "delete-row": "Supprimer la ligne" + } }, "validation": { "invalid-dashboard-id": "Impossible de trouver un ID Grafana.com valide", @@ -3979,6 +4823,16 @@ }, "visualization-select-pane": { "placeholder-search-for": "Rechercher…", + "radio-options": { + "description": { + "reusable-panels-share-between-multiple-dashboards": "" + }, + "label": { + "library-panels": "Panneaux de bibliothèque", + "suggestions": "", + "visualizations": "" + } + }, "title-close": "Fermer" }, "viz-panel": { @@ -4029,12 +4883,25 @@ "label-data-source": "Source de données", "label-use-static-key-dimensions": "Utiliser des dimensions de clé statiques" }, + "add-to-dashboard": { + "message": { + "could-navigate-selected-dashboard-please-again": "", + "could-panel-dashboard-please-again": "" + } + }, "add-to-dashboard-form": { "cancel": "Annuler", "description-choose-where-to-add-the-panel": "Choisissez où ajouter le panneau.", "description-select-which-dashboard-panel-created": "Sélectionnez dans quel tableau de bord le panneau sera créé.", + "label": { + "existing-dashboard": "Tableau de bord existant", + "new-dashboard": "Nouveau tableau de bord" + }, "label-dashboard": "Tableau de bord", "label-target-dashboard": "Tableau de bord cible", + "message": { + "this-field-is-required": "Ce champ est obligatoire." + }, "open-dashboard": "Ouvrir le tableau de bord", "open-in-new-tab": "Ouvrir dans un nouvel onglet", "title-error-adding-the-panel": "Erreur lors de l’ajout du panneau" @@ -4072,6 +4939,25 @@ "it-cannot-contain-or": "Il ne peut pas contenir « // » ou « .. ».", "least-valid-character": "Il doit contenir au moins un caractère valide." }, + "build-new-dashboard-save-model": { + "data": { + "title": { + "new-dashboard": "Nouveau tableau de bord" + } + } + }, + "build-new-dashboard-save-model-v2": { + "data": { + "title": { + "new-dashboard": "Nouveau tableau de bord" + } + } + }, + "config-public-dashboard": { + "title": { + "revoke-public-url": "Désactiver l'URL publique" + } + }, "constant-variable-form": { "constant-options": "Options constantes", "label-value": "Valeur", @@ -4119,22 +5005,89 @@ "value-not-saved": "La valeur n'est pas encore enregistrée dans la base de données Grafana", "view-pull-request-in-git-hub": "Afficher la demande de fusion dans GitHub" }, + "dashboard-scene": { + "text": { + "edit-panel": "", + "view-panel": "Afficher le panneau" + }, + "title": { + "dashboard": "Tableau de bord", + "discard-changes-to-dashboard": "" + } + }, + "dashboard-scene-page-state-manager": { + "message": { + "dashboard-not-found": "" + } + }, + "dashboard-scene-page-state-manager-v2": { + "message": { + "dashboard-not-found": "" + } + }, "data-source-variable-form": { "data-source-options": "Options de source de données", "description-instance-name-filter": "Filtre Regex pour les instances de source de données à choisir dans la liste des valeurs de variable. Laisser vide pour tout.", "example-instance-name-filter": "Exemple : <codeExample />", "selection-options": "Options de sélection" }, + "default-grid-layout-manager": { + "row": { + "title": { + "row-title": "" + } + } + }, "description-label": { "description": "Description" }, + "edit-link-view": { + "edit-link-page-nav": { + "text": { + "edit-link": "Modifier le lien" + } + } + }, "email-list": { "aria-label-emailmenu": "Basculer vers le menu des e-mails" }, + "embedded-dashboard-test-page": { + "subTitle": { + "showing-dashboard-panel-tests-pie-chart": "" + }, + "text": { + "embedding-dashboard": "" + } + }, "empty-transformations-message": { "add-transformation": "Ajouter une transformation" }, + "get-edit-options": { + "title": { + "column-options": "", + "row-height-options": "" + } + }, + "get-panel-frame-options": { + "descriptor": { + "title": { + "panel-options": "Options du panneau" + } + }, + "title": { + "description": "Description", + "panel-links": "Liens de panneau", + "title": "Titre", + "transparent-background": "Arrière-plan transparent" + } + }, + "get-workflow-options": { + "label": { + "push-to-a-new-branch": "" + } + }, "group-by-variable-form": { + "alert-not-supported": "", "description-enables-users-custom-values": "Permet aux utilisateurs d’ajouter des valeurs personnalisées à la liste", "description-provide-dimensions-as-csv-dimension-name-dimension-id": "Fournir les dimensions en tant que CSV : {{name}}, {{value}}", "group-by-options": "Regrouper par options", @@ -4153,6 +5106,12 @@ "randomize-field-names-label-field-names": "Noms des champs", "randomize-labels-label-labels": "Étiquettes", "randomize-string-values-label-string-values": "Valeurs des chaînes de caractères", + "tabs": { + "label": { + "data": "Données", + "snapshot": "Instantané" + } + }, "title-complete-git-hub-comment-clipboard": "Copier un commentaire GitHub complet dans le presse-papiers", "title-get-help-with-this-panel": "Obtenir de l’aide sur ce panneau", "troubleshooting-docs": "Documents de dépannage", @@ -4195,6 +5154,14 @@ "body-name-already-exists": "Un tableau de bord du même nom existe déjà dans le dossier sélectionné. Voulez-vous toujours enregistrer ce tableau de bord ?", "title-name-already-exists": "Nom déjà existant" }, + "on-remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, "panel-data-alerting-tab-rendered": { "alert": { "title-errors-loading-rules": "Erreurs lors du chargement des règles" @@ -4216,6 +5183,11 @@ "table-view-aria-label-toggletableview": "Basculer la vue du tableau", "table-view-label-table-view": "Vue du tableau" }, + "panel-editor": { + "text": { + "edit-panel": "" + } + }, "panel-editor-renderer": { "aria-label-open-options-pane": "Ouvrir le volet d'options", "tooltip-open-options-pane": "Ouvrir le volet d'options" @@ -4224,8 +5196,22 @@ "body-panel-plugin-not-loaded": "Assurez-vous que le panneau que vous souhaitez inspecter est visible et a été affiché avant d’ouvrir l’inspection.", "title-panel-plugin-not-loaded": "Plugin du panneau non chargé" }, + "panel-menu-behavior": { + "async-func": { + "text": { + "extensions": "", + "metrics-drilldown": "" + } + } + }, "panel-viz-type-picker": { "placeholder-search-for": "Rechercher…", + "radio-options": { + "label": { + "suggestions": "", + "visualizations": "" + } + }, "title-close": "Fermer" }, "provisioned-delete-modal": { @@ -4252,6 +5238,15 @@ "query-options": "Options de recherche", "selection-options": "Options de sélection" }, + "resource-export": { + "label": { + "classic": "", + "json": "JSON", + "v1-resource": "", + "v2-resource": "", + "yaml": "" + } + }, "revert-dashboard-modal": { "body-restore-version": "Voulez-vous vraiment restaurer le tableau de bord dans sa version {{version}} ? Toutes les modifications non enregistrées seront perdues.", "title-restore-version": "Restaurer la version" @@ -4360,6 +5355,18 @@ "solo-panel-page": { "loading": "Chargement en cours" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "text-box-variable-form": { "placeholder-default-value-if-any": "(facultatif)", "text-options": "Options de texte" @@ -4370,6 +5377,13 @@ "title-field-label": { "title": "Titre" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "transformations-drawer": { "search-box-suffix": { "tooltip-clear-search": "Effacer la recherche" @@ -4385,6 +5399,13 @@ "save-dashboard": "Enregistrer le tableau de bord", "title-unsaved-changes": "Modifications non enregistrées" }, + "use-dashboard-edit-page-nav": { + "page-nav": { + "text": { + "settings": "Paramètres" + } + } + }, "variable-check-indicator": { "aria-label-variable-referenced-dashboard": "Cette variable n’est référencée par aucune variable ou aucun tableau de bord.", "aria-label-variable-referenced-other-variables-dashboard": "Cette variable est référencée par d’autres variables ou d’autres tableaux de bord.", @@ -4401,7 +5422,10 @@ "placeholder-descriptive-text": "Texte de description", "placeholder-label-name": "Nom de l’étiquette", "placeholder-variable-name": "Nom de la variable", - "text-running-query": "Exécution de la requête..." + "text-running-query": "Exécution de la requête...", + "title": { + "delete-variable": "Supprimer la variable" + } }, "variable-editor-list": { "definition": "Définition", @@ -4583,6 +5607,25 @@ "message": "Aucune source de données trouvée" } }, + "datagrid": { + "add-column": { + "placeholder-column-name": "" + }, + "datagrid-context-menu": { + "render-context-menu-items": { + "label-clear-column": "", + "label-clear-row": "", + "label-remove-all-data": "", + "label-search": "Recherche..." + }, + "render-header-menu-items": { + "label-clear-column": "", + "label-delete-column": "", + "label-rename-column": "", + "label-set-field-type": "" + } + } + }, "datasources": { "add-new-data-source-button": { "tooltip-no-permission": "Vous n’avez pas l’autorisation de configurer de nouvelles sources de données" @@ -4604,6 +5647,46 @@ "label-default": "Par défaut", "label-name": "Nom" }, + "build-categories": { + "categories": { + "title": { + "cloud": "Cloud", + "distributed-tracing": "", + "enterprise-plugins": "Plugins d’entreprise", + "industrial-io-t": "", + "logging-document-databases": "", + "others": "", + "profiling": "", + "sql": "", + "time-series-databases": "" + } + } + }, + "build-nav-model": { + "analytics": { + "text": { + "insights": "Aperçus" + } + }, + "caching": { + "text": { + "cache": "" + } + }, + "ds-permissions": { + "text": { + "permissions": "Autorisations" + } + }, + "nav-model": { + "text": { + "settings": "Paramètres" + } + }, + "text": { + "dashboards": "Tableaux de bord" + } + }, "button-row": { "delete": "Supprimer", "save-and-test": "Enregistrer et tester", @@ -4639,6 +5722,11 @@ "data-source-read-only-message": { "title-provisioned-data-source": "Source de données mise en service" }, + "data-source-settings-reducer": { + "message": { + "testing-could-couple-minutes": "" + } + }, "data-source-type-card": { "aria-label-learn-more": "{{dataSourcePluginName}}, en savoir plus." }, @@ -4656,13 +5744,88 @@ "footer": { "add-csv-or-spreadsheet": "Ajouter un fichier CSV ou une feuille de calcul" }, + "get-enterprise-phantom-plugins": { + "description": { + "adobe-analytics-datasource": "", + "app-dynamics-integration-and-data-source": "", + "atlassian-statuspage-datasource": "", + "aurora-data-source": "", + "azure-cosmos-db-datasource": "", + "azure-devops-datasource": "", + "catchpoint-datasource": "", + "cloudflare-datasource": "", + "cockroach-db-datasource": "", + "data-dog-integration-and-data-source": "", + "drone-datasource": "", + "git-lab-integration-and-datasource": "", + "honeycomb-integration-and-datasource": "", + "jira-integration-and-datasource": "", + "logic-monitor-devices-datasource": "", + "mongo-db-integration-and-data-source": "", + "netlify-datasource": "", + "new-relic-integration-and-data-source": "", + "pager-duty-datasource": "", + "salesforce-integration-and-datasource": "", + "sap-hana-integration-and-data-source": "", + "service-now-integration-and-data-source": "", + "signal-fx-integration-and-datasource": "", + "snowflake-integration-and-data-source": "", + "sumo-logic-integration-and-datasource": "", + "visualize-and-explore-dynatrace-data": "", + "visualize-and-explore-oracle-sql": "", + "visualize-and-explore-splunk-logs": "", + "wavefront-integration-and-data-source": "", + "zendesk-datasource": "" + } + }, + "get-grafana-cloud-phantom-plugin": { + "description": { + "hosted-graphite-prometheus-and-loki": "" + } + }, "new-data-source-view": { "cancel": "Annuler", "placeholder-filter-by-name-or-type": "Filtrer par nom ou par type" }, - "use-data-source-info": { - "badge-text-not-supported": "Non pris en charge", - "badge-text-supported": "Pris en charge" + "update-data-source": { + "error-info": { + "message": { + "an-unexpected-error-occurred": "" + } + } + }, + "use-data-source-info": { + "badge-text-not-supported": "Non pris en charge", + "badge-text-supported": "Pris en charge", + "label": { + "alerting": "Alerte", + "type": "Type" + } + }, + "use-delete-loaded-data-source": { + "title": { + "delete": "Supprimer" + } + } + }, + "debug": { + "cursor-view": { + "no-events-yet": "" + }, + "render-info-viewer": { + "data-counter": "", + "elapsed-time": "", + "field": "Champ", + "last": "", + "render-counter": "", + "schema-counter": "", + "title-reset-counters": "", + "tooltip-step-back": "", + "type": "Type" + }, + "state-view": { + "current-value": "", + "label-state-name": "" } }, "dimensions": { @@ -4731,6 +5894,19 @@ "remove-value-mapping-aria-label-delete-value-mapping": "Supprimer le mappage de valeur", "remove-value-mapping-tooltip-delete": "Supprimer", "set-color": "Définir la couleur", + "special-match-options": { + "description": { + "boolean-false-values": "", + "boolean-true-values": "", + "empty-string": "", + "matches-against-number-na-n-not-a-number": "", + "matches-null-and-undefined-values": "", + "matches-null-undefined-and-na-n": "" + }, + "label": { + "empty": "Vide" + } + }, "tooltip-remove-color": "Supprimer la couleur", "tooltip-remove-icon": "Supprimer l’icône" }, @@ -4746,6 +5922,20 @@ "display-text": "Afficher le texte", "icon": "Icône", "label-add-a-new-mapping": "Ajouter un nouveau mappage", + "mapping-types": { + "description": { + "match-a-numerical-range-of-values": "", + "match-a-regular-expression-with-replacement": "", + "match-a-specific-text-value": "", + "match-boolean-empty-values": "" + }, + "label": { + "range": "", + "regex": "", + "special": "", + "value": "Valeur" + } + }, "update": "Mettre à jour" } }, @@ -4770,6 +5960,7 @@ }, "explore": { "accordian-logs": { + "events": "", "footer": "Les horodatages d’événement sont relatifs à l’heure de début de la trace complète." }, "accordian-references": { @@ -4780,6 +5971,11 @@ "basic-extensions": { "aria-label-add": "Ajouter" }, + "build-dashboard-panel-from-explore-state": { + "title": { + "new-panel": "" + } + }, "clear": "Effacer", "confirm-navigation-modal": { "cancel": "Annuler", @@ -4866,6 +6062,33 @@ "title-table": "Tableau", "title-traces": "Traces" }, + "explore-query-inspector": { + "data-tab": { + "label": { + "data": "Données" + } + }, + "error-tab": { + "label": { + "error": "Erreur" + } + }, + "json-tab": { + "label": { + "json": "JSON" + } + }, + "query-tab": { + "label": { + "query": "Requête" + } + }, + "stats-tab": { + "label": { + "stats": "Statistiques" + } + } + }, "explore-run-query-button": { "run-button": { "aria-label-run-query-options": "Lancer les options de requête" @@ -4879,10 +6102,23 @@ "description-explore-disabled": "Pour activer Explorer, activez-le dans la configuration Grafana :", "title-explore-disabled": "Explorer est désactivé" }, + "get-field-links-for-explore": { + "text": { + "data": "Données", + "raw-value": "" + } + }, "get-matches-metadata": { "matches": "0 correspondance" }, "legacy-create-span-link-factory": { + "text": { + "tags": "Balises" + }, + "title": { + "related-logs": "", + "session-for-this-span": "Session pour cette durée" + }, "title-explore-metrics-for-this-span": "Explorer les métriques pour cette durée", "title-explore-split": "Explorer les journaux associés en vue fractionnée", "title-session-for-this-span": "Session pour cette durée" @@ -4923,6 +6159,10 @@ }, "logs-meta-row": { "download": "Télécharger", + "label": { + "deduplication-count": "", + "showing-only-selected-fields": "" + }, "show-original-line": "Afficher la ligne d’origine" }, "logs-sample-panel": { @@ -5104,6 +6344,21 @@ "run-query-button": "Exécuter la requête", "switch-datasource-button": "Changer de source de données et exécuter la requête" }, + "scoped-vars-from-span": { + "text": { + "span": "" + } + }, + "scoped-vars-from-tags": { + "text": { + "tags": "Balises" + } + }, + "scoped-vars-from-trace": { + "text": { + "trace": "Trace" + } + }, "search-bar-input": { "placeholder-find": "Rechercher...", "suffix": { @@ -5138,9 +6393,25 @@ "tooltip-tag-key": "Clé de balise qui sera utilisée pour obtenir la valeur de la balise. Les attributs et les ressources d’une période seront recherchés pour la clé de la balise" }, "span-detail": { + "label": { + "kind": "", + "library-name": "", + "library-version": "", + "status": "Statut :", + "status-message": "", + "trace-state": "" + }, "label-resource-attributes": "Attributs de ressource", "label-span-attributes": "Attributs de durée", "label-stack-trace": "Trace de stack", + "overview-items": { + "label": { + "child-count": "", + "duration": "", + "service": "", + "start-time": "" + } + }, "warnings": "Avertissements" }, "span-filters": { @@ -5247,6 +6518,18 @@ "title-node-graph": "Graphique de nœud" }, "unthemed-logs": { + "description": { + "show-results-in-logs-visualisation": "", + "show-results-in-table-visualisation": "", + "show-results-newest-to-oldest": "", + "show-results-oldest-to-newest": "" + }, + "label": { + "logs": "Journaux", + "newest-first": "Plus récent en premier", + "oldest-first": "Plus ancien en premier", + "table": "Tableau" + }, "label-deduplication": "Déduplication", "label-display-results": "Afficher les résultats", "label-prettify-json": "Rendre plus lisible le JSON", @@ -5262,6 +6545,15 @@ }, "unthemed-virtualized-trace-view": { "title-scroll-to-top": "Retour en haut de page" + }, + "use-focus-span-link": { + "create-focus-span-link": { + "link": { + "title": { + "deep-link-to-this-span": "" + } + } + } } }, "export": { @@ -5347,6 +6639,15 @@ "folder-repo": { "badge-text": "Mis en service" }, + "folders": { + "get-loading-nav": { + "main": { + "title": { + "loading": "Chargement en cours" + } + } + } + }, "forgot-password": { "back-button": "Retour à la page de connexion", "change-password": { @@ -5376,10 +6677,102 @@ "incomplete-request-error": "Désolé, je n'ai pas pu répondre à votre demande. Veuillez réessayer.", "send-custom-feedback": "Envoyer" }, + "geomap": { + "coordinates-map-view-editor": { + "label-latitude": "", + "label-longitude": "" + }, + "debug-overlay": { + "center": "", + "zoom": "" + }, + "fit-map-view-editor": { + "all-layers-editor-fragment": { + "label-layer": "" + }, + "label-data": "Données", + "last-only-editor-fragment": { + "label-padding": "", + "tooltip-padding-relative-percent-beyond-extent": "" + } + }, + "frame-multi-selection-editor": { + "placeholder-change-filter": "" + }, + "frame-selection-editor": { + "placeholder-change-filter": "" + }, + "geomap-panel": { + "aria-label-map": "" + }, + "geomap-style-rules-editor": { + "aria-label-add-geomap-style-rule": "" + }, + "layers-editor": { + "label-add-layer": "", + "no-layers": "" + }, + "map-view-editor": { + "label-max-zoom": "", + "label-view": "Afficher", + "label-zoom": "Zoom", + "use-current-map-settings": "" + }, + "markers-legend": { + "title-symbol": "Symbole" + }, + "measure-overlay": { + "tooltip-show-measure-tools": "" + }, + "plugin": { + "basemap-layer-configured-server-admin": "" + }, + "style-editor": { + "label-align": "", + "label-baseline": "", + "label-color": "Couleur", + "label-fill-opacity": "", + "label-font-size": "", + "label-opacity": "", + "label-rotation-angle": "", + "label-size": "", + "label-symbol": "Symbole", + "label-symbol-horizontal-align": "", + "label-symbol-vertical-align": "", + "label-text-label": "", + "label-x-offset": "", + "label-y-offset": "" + }, + "style-rule-editor": { + "aria-label-comparison-operator": "Opérateur de comparaison", + "aria-label-comparison-value": "", + "aria-label-delete-style-rule": "", + "aria-label-feature-property": "", + "label-rule": "Règle", + "placeholder-feature-property": "", + "placeholder-numeric-value": "", + "placeholder-value": "valeur" + } + }, "get-enterprise": { "requires-license": "Nécessite une licence Grafana Enterprise", "title": "Enterprise" }, + "gettingstarted": { + "docs-card": { + "complete": "terminé", + "learn-how": "" + }, + "getting-started": { + "aria-label-to-advanced-tutorials": "", + "aria-label-to-basic-tutorials": "", + "checking-completed-setup-steps": "", + "remove-this-panel": "" + }, + "tutorial-card": { + "complete": "terminé" + } + }, "gops": { "config-card": { "text-loading-configuration": "Chargement de la configuration..." @@ -5396,6 +6789,74 @@ }, "progress-status": { "your-progress": "Votre progression" + }, + "use-get-configuration-for-ui": { + "get-connect-data-source-configuration": { + "title": { + "connect-data-source": "" + } + }, + "title": { + "essentials": "Essentiels" + } + }, + "use-get-essentials-configuration": { + "essential-content": { + "description": { + "configure-grafana-alerting": "", + "create-integration-alerting-contact-point": "", + "initialize-incident-plugin-declare-manage-incidents": "", + "practice-solving-an-incident": "", + "receive-alerts-oncall-notifications-within-environment": "", + "select-chat-ops-channels-to-route-notifications": "" + }, + "label": { + "add": "Ajouter", + "connect": "Connecter", + "initialize": "", + "select-integration": "", + "start-drill": "" + }, + "title": { + "add-slack-notifications-to-irm-integrations": "", + "connect-alerting-to-irm": "", + "connect-irm-to-your-slack-workspace": "", + "connect-your-messaging-workspace-to-incident": "", + "connect-your-messaging-workspace-to-on-call": "", + "create-incident-drill": "", + "detect": "Détecter", + "initialize-incident-plugin": "", + "messaging-workspace-channel-on-call-integration": "", + "respond": "", + "test-your-configuration": "" + } + }, + "get-grafana-alerting-config-steps": { + "description": { + "create-alert-monitor-system": "", + "create-on-call-integration-alerting-contact-point": "", + "create-slos-to-monitor-your-service": "" + }, + "label": { + "connect": "Connecter", + "create": "Créer", + "enable": "Activer" + }, + "steps": { + "label": { + "edit": "Modifier" + }, + "title": { + "update-default-contact-point": "" + } + }, + "title": { + "connect-alerting-to-on-call": "", + "create-alert-rule": "Créer une règle d’alerte", + "create-slo": "", + "enable-slo-alerting": "" + } + } } }, "grafana": { @@ -5762,14 +7223,18 @@ "duplicate-panel": "Dupliquer le panneau", "exit-edit/setting-views": "Quitter les affichages de modification/configuration", "expand-all-rows": "Développer toutes les lignes", + "explore-panel": "", "go-to-dashboards": "Aller aux tableaux de bord", "go-to-explore": "Aller à Explorer", "go-to-home-dashboard": "Aller au tableau de bord d'accueil", "go-to-profile": "Aller au profil", + "inspect-panel": "", "make-time-range-permanent": "Rendre l'intervalle de temps absolu/permanent", "move-time-range-back": "Reculer la plage de temps", "move-time-range-forward": "Avancer la plage de temps", "open-search": "Ouvrir la recherche", + "open-share-embed-drawer": "", + "open-share-link-drawer": "", "open-shared-modal": "Partager l’instantané du panneau", "paste-time-range": "Coller l'intervalle de temps", "refresh-all-panels": "Actualiser tous les panneaux", @@ -5795,6 +7260,11 @@ "support-bundle": "Vous pouvez également récupérer un ensemble d'outils d'assistance contenant des informations concernant votre instance Grafana et les sources de données configurées dans la <1>section des ensembles d'outils d'assistance</1>.", "troubleshooting-help": "Pour demander une aide au dépannage, envoyez un instantané de ce tableau de bord à l'assistance technique de Grafana Labs. L'instantané contient les données de réponse de la requête et les paramètres du tableau de bord." }, + "histogram": { + "histogram-panel": { + "no-histogram-found-in-response": "" + } + }, "inspector": { "inspect-data-tab": { "loading": "Chargement en cours", @@ -5844,6 +7314,9 @@ "label-name": "Nom", "label-password": "Mot de passe", "label-username": "Nom d'utilisateur", + "message": { + "email-is-invalid": "" + }, "placeholder-name-optional": "Nom (facultatif)", "placeholder-password": "Mot de passe", "placeholder-username": "Nom d'utilisateur", @@ -6103,8 +7576,26 @@ "discard-local-changes": "Abandonner les modifications locales", "title-dashboard-changed": "Tableau de bord modifié" }, + "live-channel-editor": { + "description-grafana-live": "", + "namespace": "Namespace", + "path": "Chemin", + "placeholder-select-watchable-resource": "", + "scope": "", + "title-grafana-live": "" + }, "live-connection-warning": { "title-connection-to-server-is-lost": "Connexion au serveur perdue..." + }, + "live-panel": { + "error": "Erreur", + "grafana-requires-feature": "", + "panel-editor-channel": "", + "title-grafana-live": "", + "waiting-for-data": "" + }, + "live-publish": { + "publish": "" } }, "lock-icon": "icône de cadenas", @@ -6151,6 +7642,13 @@ } }, "logs": { + "get-dataframe-fields": { + "vars": { + "text": { + "labels": "Étiquettes" + } + } + }, "infinite-scroll": { "end-of-range": "Fin de la plage de temps sélectionnée.", "load-more": "Faites défiler pour charger plus", @@ -6231,6 +7729,11 @@ "shortcut": "alt+sélectionner pour réactiver" } }, + "log-series-to-logs-model": { + "label": { + "total-bytes-processed": "" + } + }, "logs-controls": { "deduplication": "Déduplication", "disable-highlighting": "Désactiver la surbrillance", @@ -6265,6 +7768,11 @@ "scroll-top": "Retour en haut de page", "start-of-range": "Jour de début de la plage" }, + "logs-panel": { + "render-common-labels": { + "common-labels": "" + } + }, "out-of-range-message": { "end-of-the-selected-time-range": "Fin de la plage de temps sélectionnée." }, @@ -6321,6 +7829,14 @@ }, "snapshot-list-table": { "title-delete": "Supprimer" + }, + "unthemed-dashboard-import": { + "subTitle": { + "import-dashboard-from-file-or-grafanacom": "" + }, + "text": { + "import-dashboard": "Importer un tableau de bord" + } } }, "migrate-to-cloud": { @@ -6978,8 +8494,57 @@ "close": "Fermer le tiroir" }, "link-title": "Accéder au blog Grafana Labs", + "news-panel": { + "body-error-loading-rss-feed": "", + "loading": "Chargement en cours...", + "title-error-loading-rss-feed": "" + }, "title": "Dernières nouvelles sur le blog" }, + "nodeGraph": { + "arc-options-editor": { + "add-arc": "", + "title-remove-arc": "" + }, + "edge": { + "aria-label-from-to": "" + }, + "edge-header": { + "label-source-target": "" + }, + "marker": { + "100-node-count": "", + "aria-label-hidden-marker": "", + "node-count_one": "", + "node-count_other": "" + }, + "node": { + "aria-label-node-title": "" + }, + "node-graph": { + "aria-label-layered-layout-performance-warning": "", + "aria-label-nodes-hidden-warning": "", + "computing-layout": "", + "no-data": "Aucune donnée", + "hidden-nodes_one": "", + "hidden-nodes_other": "", + "processed-nodes_one": "", + "processed-nodes_other": "" + }, + "node-graph-panel": { + "no-data-found-in-response": "" + }, + "node-header": { + "label-subtitle": "", + "label-title": "Titre" + }, + "view-controls": { + "hide-config": "", + "show-config": "", + "title-zoom-in": "", + "title-zoom-out": "" + } + }, "notifications": { "empty-state": { "description": "Les notifications que vous avez reçues apparaîtront ici", @@ -7021,6 +8586,11 @@ "label-organization-name": "Nom de l’organisation", "placeholder-org-name": "Nom de l’org." }, + "org-details-page": { + "title": { + "confirm-preferences-update": "" + } + }, "org-profile": { "label-organization-name": "Nom de l’organisation", "label-organization-profile": "Profil de l’organisation", @@ -7040,7 +8610,10 @@ "tooltip": "Vous pouvez maintenant sélectionner l'option « Aucun rôle de base » et ajouter des autorisations à vos besoins personnalisés. Vous trouverez plus d'informations dans <1>notre documentation</1>." }, "user-invite-page": { - "sub-title": "Envoyez une invitation ou ajoutez un utilisateur Grafana existant à l’organisation.<1>{{orgName}}</1>" + "sub-title": "Envoyez une invitation ou ajoutez un utilisateur Grafana existant à l’organisation.<1>{{orgName}}</1>", + "text": { + "invite-user": "" + } } }, "org-picker": { @@ -7052,6 +8625,38 @@ } }, "panel": { + "get-calculation-value-data-links-variable-suggestions": { + "value-calc-var": { + "label": { + "calculation-name": "" + } + } + }, + "get-data-links-variable-suggestions": { + "value-time-var": { + "label": { + "time": "Heure" + } + } + }, + "get-field-links-supplier": { + "text": { + "data": "Données", + "field": "Champ", + "series": "", + "value": "Valeur" + } + }, + "get-field-vars": { + "label": { + "name": "Nom" + } + }, + "get-panel-links-variable-suggestions": { + "label": { + "all-variables": "" + } + }, "header-menu": { "copy": "Copier", "create-library-panel": "Créer un panneau de bibliothèque", @@ -7112,6 +8717,13 @@ "select-placeholder": "Filtrer par type" }, "playlist": { + "playlist-new-page": { + "page-nav": { + "text": { + "new-playlist": "Nouvelle playlist" + } + } + }, "playlist-table-rows": { "aria-label-playlist-item": "Élément de la liste de lecture, {{itemType}}, {{itemValue}}", "multiple-dashboards-found": "Plusieurs éléments trouvés : {{items}}", @@ -7128,6 +8740,12 @@ "label-mode": "Mode", "label-time-and-refresh": "Heure et actualisation", "label-variables": "Variables", + "modes": { + "label": { + "kiosk": "Kiosque", + "normal": "Normal" + } + }, "title-start-playlist": "Lancer la playlist" } }, @@ -7194,6 +8812,19 @@ }, "browse": { "aria-label-plugin-type-filter": "Filtre de type de plugin", + "filter-by-options": { + "label": { + "all": "Tout", + "installed": "Installé", + "new-updates": "" + } + }, + "label": { + "all": "Tout", + "applications": "", + "data-sources": "Sources de données", + "panels": "Panneaux" + }, "label-search": "Rechercher", "label-state": "État", "label-type": "Type", @@ -7275,12 +8906,24 @@ "empty-state": { "message": "Aucune extension trouvée" }, + "extensions-log-data-source": { + "message": { + "ok": "OK" + } + }, "filter": { "disabled": "Ce filtre a été désactivé car le serveur Grafana ne peut pas accéder à grafana.com", "sort": "Trier", "sort-list": "Trier la liste des plugins", "state": "État" }, + "get-feature-state-info": { + "text": { + "alpha": "", + "beta": "Bêta", + "deprecated": "Obsolète" + } + }, "get-started-with-app": { "disable": "Désactiver", "enable": "Activer" @@ -7337,6 +8980,16 @@ "plugin-details-header-dependencies": { "grafana-dependency": "Grafana {{grafanaDependency}}" }, + "plugin-details-page": { + "not-found-model": { + "subTitle": { + "requested-belong-plugin": "" + }, + "text": { + "unknown-plugin": "" + } + } + }, "plugin-details-signature": { "body-invalid-plugin-signature": "Grafana Labs vérifie chaque plugin pour s’assurer qu’il possède bien une signature numérique valide. La vérification de la signature du plugin fait partie de nos mesures de sécurité pour garantir que les plugins sont sûrs et dignes de confiance. Grafana Labs ne peut pas garantir l’intégrité de ce plugin non signé. Demandez à l’auteur du plugin de demander sa signature.", "read-more-about-plugins-signing": "En savoir plus sur la signature des plugins.", @@ -7382,6 +9035,13 @@ "search-field": { "placeholder-search-grafana-plugins": "Rechercher des plugins Grafana" }, + "use-plugin-details-tabs": { + "nav-model-children": { + "text": { + "dashboards": "Tableaux de bord" + } + } + }, "version-install-button": { "text-installed": "Installé" }, @@ -7499,6 +9159,11 @@ "label-git-hub-features": "Fonctionnalités GitHub", "label-realtime-feedback": "Commentaire en temps réel" }, + "connect-page": { + "subTitle": { + "connect-external-storage-manage-resources": "" + } + }, "connect-repository-button": { "configure": "Configurer", "configure-file": "Configurer la mise en service de fichiers", @@ -7532,7 +9197,13 @@ }, "edit-repository-page": { "back-to-repositories": "Retour aux référentiels", - "repository-config-exists-configuration": "Assurez-vous que la configuration du référentiel existe dans le fichier de configuration." + "repository-config-exists-configuration": "Assurez-vous que la configuration du référentiel existe dans le fichier de configuration.", + "subTitle": { + "configure-repository-storing-resources": "" + }, + "text": { + "configure-repository": "" + } }, "empty-state": { "no-jobs": "Pas de mission..." @@ -7595,6 +9266,11 @@ "no-results-matching-your-query": "Aucun résultat ne correspond à votre requête", "placeholder-search": "Rechercher" }, + "get-default-values": { + "title": { + "repository": "Référentiel" + } + }, "getting-started": { "alert-temporary-outage": "Lorsque vous connectez l’ensemble de votre instance, les tableaux de bord ne seront pas disponibles pendant l’exécution de la migration. Nous vous recommandons d’avertir vos utilisateurs avant de commencer le processus.", "modal-description-public-access": "Configurez l’accès public à votre instance Grafana pour activer l’intégration GitHub", @@ -7739,7 +9415,18 @@ "dashboard-preview": "Aperçu du tableau de bord", "existing-dashboard": "Tableau de bord existant", "history": "Historique", + "message": { + "removed-from-repo-test-ui": "", + "updated-from-repo-test-ui": "" + }, "repository": "Référentiel", + "tab-info": { + "label": { + "dry-run-result-after-apply": "", + "existing-from-grafana": "", + "file-from-repository": "" + } + }, "title-error-saving-file": "Erreur de sauvegarde du fichier" }, "setup-modal": { @@ -8152,14 +9839,6 @@ "reload-button": "Actualiser", "title": "Impossible de trouver le fichier d'application" }, - "sandbox": { - "test-stuff-page": { - "application-notifications-toasts-testing": "Test des notifications d’application (bannières)", - "error": "Erreur", - "success": "Succès", - "warning": "Avertissement" - } - }, "save-dashboards": { "message-length": { "info": "Le message comporte {{messageLength}} caractères, ce qui dépasse la longueur maximale de 500 caractères. Veuillez le raccourcir avant de l'enregistrer.", @@ -8219,6 +9898,14 @@ "view-as-folders": "Voir par dossier", "view-as-list": "Voir en tant que liste" }, + "bluge-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } + }, "dashboard-actions": { "import": "Importer", "new": "Nouveau", @@ -8246,6 +9933,14 @@ "search-results-table": { "aria-label-search-results-table": "Tableau des résultats de recherche", "no-data": "Aucune valeur" + }, + "unified-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } } }, "select": { @@ -8317,6 +10012,11 @@ "delete-service-account": "Supprimer le compte de service", "disable-service-account": "Désactiver le compte de service", "enable-service-account": "Activer le compte de service", + "page-nav": { + "subTitle": { + "manage-settings-individual-service-account": "" + } + }, "title-delete-service-account": "Supprimer le compte de service", "title-disable-service-account": "Désactiver le compte de service", "tokens": "Jetons", @@ -8633,6 +10333,12 @@ "sort-picker": { "select-aria-label": "Trier" }, + "status-history": { + "status-history-panel": { + "too-many-points_one": "", + "too-many-points_other": "" + } + }, "support-bundles": { "new-bundle-button": { "new-support-bundle": "Nouvelle offre groupée d’assistance" @@ -8640,7 +10346,10 @@ "support-bundles-create-unconnected": { "cancel": "Annuler", "create": "Créer", - "sub-title": "Choisissez les composants de l’offre groupée d’assistance. L’offre groupée d’assistance sera disponible pendant 3 jours après sa création." + "sub-title": "Choisissez les composants de l’offre groupée d’assistance. L’offre groupée d’assistance sera disponible pendant 3 jours après sa création.", + "text": { + "create-support-bundle": "" + } }, "support-bundles-unconnected": { "created-on": "Créé le", @@ -8655,10 +10364,35 @@ "login": "Connecter" }, "table": { + "auto-cell-options-editor": { + "description-wrap-text": "", + "label-wrap-text": "" + }, + "bar-gauge-cell-options-editor": { + "label-gauge-display-mode": "", + "label-value-display": "" + }, + "color-background-cell-options-editor": { + "description-apply-to-entire-row": "", + "description-wrap-text": "", + "label": { + "text-alpha": "" + }, + "label-apply-to-entire-row": "", + "label-background-display-mode": "", + "label-wrap-text": "", + "wrap-text": "" + }, "container": { "content": "Afficher trop de colonnes dans un seul tableau peut affecter les performances et rendre les données plus difficiles à lire. Envisagez d'affiner vos requêtes.", "show-all-series": "Afficher toutes les colonnes", "show-only-series": "Afficher seulement {{MAX_NUMBER_OF_COLUMNS}} colonnes" + }, + "image-cell-options-editor": { + "description-alt-text": "", + "description-title-text": "", + "label-alt-text": "", + "label-title-text": "" } }, "tag-filter": { @@ -8674,6 +10408,24 @@ "select-placeholder": "Sélectionner une équipe" }, "teams": { + "build-nav-model": { + "nav-model": { + "subTitle": { + "manage-members-and-settings": "" + }, + "text": { + "settings": "Paramètres" + } + }, + "team-group-sync": { + "text": { + "external-group-sync": "Synchronisation de groupe externe" + } + }, + "text": { + "members": "Membres" + } + }, "create-team": { "create": "Créer", "description-email": "Ceci est facultatif et est principalement utilisé pour autoriser les avatars d’équipe personnalisés", @@ -8695,6 +10447,9 @@ "external-group-sync": "Synchronisation de groupe externe", "label-add-external-group": "Ajouter un groupe externe", "team-sync-upgrade": "Ajoutez un groupe pour activer la synchronisation d’équipe gratuitement pendant votre essai de Grafana Pro", + "text": { + "add-group": "Ajouter un groupe" + }, "title-there-external-groups": "Il n’y a pas de groupes externes avec lesquels se synchroniser", "tooltip-add-external-group": "Exemple de groupe LDAP : {{example}}" }, @@ -8796,6 +10551,42 @@ "select-search-input": "Tapez pour rechercher (pays, ville, abréviation)" } }, + "timeseries": { + "annotation-editor2": { + "add-annotation": "Ajouter une annotation", + "cancel": "Annuler", + "edit-annotation": "", + "label-description": "Description", + "label-tags": "Balises", + "placeholder-add-tags": "", + "save": "Enregistrer", + "saving": "Enregistrement en cours" + }, + "annotation-tooltip2": { + "tooltip-delete": "Supprimer", + "tooltip-edit": "Modifier" + }, + "line-style-editor": { + "title-the-input-expects-a-segment-list": "", + "tooltip-help": "Aide" + }, + "nulls-threshold-input": { + "placeholder-never": "Jamais" + }, + "outside-range-plugin": { + "data-outside-time-range": "", + "zoom-to-data": "" + }, + "timezones-editor": { + "tooltip-add-timezone": "", + "tooltip-remove-timezone": "" + } + }, + "traces": { + "traces-panel": { + "no-data-found-in-response": "" + } + }, "transformations": { "empty": { "add-transformation-body": "Les transformations permettent de modifier les données de différentes manières avant l'affichage de votre visualisation.<1></1>Vous pouvez notamment rassembler des données, renommer des champs, faire des calculs, formater les données à afficher, etc.", @@ -8832,6 +10623,10 @@ "convert-field-type-transformer-editor": { "aria-label-add-a-convert-field-type-transformer": "Ajouter un transformateur de type de champ de conversion", "aria-label-remove-convert-field-type-transformer": "Supprimer le transformateur de type de champ de conversion", + "label": { + "browser": "Navigateur", + "utc": "" + }, "label-as": "comme", "label-date-format": "Format de la date", "label-field": "Champ", @@ -8918,11 +10713,32 @@ "tooltip-format": "Le format de sortie pour le champ spécifié en tant que <2>chaîne de format Moment.js</2>.", "tooltip-timezone-manually": "Définir manuellement le fuseau horaire de la date" }, + "get-timezone-options": { + "label": { + "browser": "Navigateur", + "utc": "" + } + }, "get-tooltips": { "description": "Un chemin valide d’un objet json.", "json-value": "Valeur JSON :", + "map-valid-paths": { + "description": { + "extract-fields-from-object": "", + "extract-value": "", + "extract-value-first-element": "", + "extract-value-second-element": "" + } + }, "valid-paths": "Chemins valides :" }, + "get-transformer-option-pane": { + "root": { + "title": { + "root": "" + } + } + }, "group-by-field-configuration": { "placeholder-ignored": "Ignoré", "placeholder-select-stats": "Sélectionner les statistiques" @@ -8939,7 +10755,23 @@ "label-cell-value": "Valeur de cellule", "label-column": "Colonne", "label-empty-value": "Valeur nulle", - "label-row": "Ligne" + "label-row": "Ligne", + "special-value-options": { + "description": { + "boolean-false-value": "", + "boolean-true-value": "", + "empty-string": "", + "null-value": "", + "number-value": "" + }, + "label": { + "empty": "Vide", + "false": "", + "null": "", + "true": "", + "zero": "" + } + } }, "histogram-transformer-editor": { "placeholder-auto": "Auto", @@ -9002,10 +10834,22 @@ "tooltip-naming": "Définit la façon dont les noms des champs sélectionnés sont affichés. Comme le nom du cadre est généralement préférable pour les données tabulaires" }, "partition-by-values-editor": { + "keep-fields-options": { + "label": { + "no": "Non", + "yes": "Oui" + } + }, "label-field": "Champ", "label-keep-fields": "Conserver les champs", "label-naming": "Dénomination", "label-select-field": "Sélectionner le champ", + "naming-modes-options": { + "label": { + "as-frame-name": "", + "as-label": "" + } + }, "partition-values-works-single-frame": "La partition par valeurs ne fonctionne qu’avec un seul cadre.", "tooltip-keeps-partition-fields-frames": "Conserve les champs de partition dans les cadres" }, @@ -9027,6 +10871,16 @@ "label-include-time": "Inclure l’heure", "label-labels-to-fields": "Étiquettes aux champs", "label-mode": "Mode", + "modes": { + "description": { + "collapse-field-single-value": "", + "create-table-series-value": "" + }, + "label": { + "reduce-fields": "", + "series-to-rows": "" + } + }, "placeholder-choose-stat": "Choisir la statistique" }, "regex-matcher-editor": { @@ -9034,11 +10888,23 @@ "variable-regex-documentation": "" }, "regression-transformer-editor": { + "label": { + "cubic": "", + "quadratic": "", + "quartic": "", + "quintic": "" + }, "label-degree": "Degré", "label-model-type": "Type de modèle", "label-predicted-points": "Points prédits", "label-x-field": "Champ X", "label-y-field": "Champ Y", + "model-type-options": { + "label": { + "linear": "", + "polynomial": "" + } + }, "tooltip-number-of-xy-points-to-predict": "Nombre de points X, Y à prédire" }, "rename-by-regex-transformer-editor": { @@ -9056,6 +10922,23 @@ "label-reverse": "Inverser", "placeholder-select-field": "Sélectionner le champ" }, + "supplier": { + "description": { + "apply-spatial-operations-to-the-geometry": "", + "create-a-line-between-two-points": "", + "geometry-define-field-headingdistancearea": "" + }, + "label": { + "area": "", + "as-line": "", + "calculate-value": "", + "distance": "", + "heading": "", + "line-builder": "", + "prepare-spatial-field": "", + "transform": "" + } + }, "time-series-table-transform-editor": { "label-stat": "Stat", "label-time-field": "Champ horaire", @@ -9089,7 +10972,19 @@ "placeholder-auto": "Auto", "placeholder-field": "Champ", "tooltip-window-size": "Taille de la fenêtre", - "tooltip-window-size-percent": "Définir la taille de la fenêtre en pourcentage du total des données" + "tooltip-window-size-percent": "Définir la taille de la fenêtre en pourcentage du total des données", + "type-options": { + "label": { + "centered": "", + "trailing": "" + } + }, + "window-size-mode-options": { + "label": { + "fixed": "", + "percentage": "" + } + } } }, "upgrade-box": { @@ -9146,6 +11041,11 @@ }, "users-action-bar-unconnected": { "invite": "Inviter", + "options": { + "label": { + "users": "Utilisateurs" + } + }, "placeholder-search-login-email": "Rechercher un utilisateur par identifiant, e-mail ou nom" } }, @@ -9189,6 +11089,32 @@ "confirm-delete-modal": { "title-delete-variable": "Supprimer la variable" }, + "create-ad-hoc-variable-adapter": { + "description": { + "add-keyvalue-filters-on-the-fly": "" + } + }, + "create-custom-variable-adapter": { + "description": { + "define-variable-values-manually": "" + } + }, + "create-interval-variable-adapter": { + "description": { + "define-timespan-interval": "" + } + }, + "create-query-variable-adapter": { + "description": { + "variable-values-fetched-datasource-query": "" + } + }, + "data-source-variable-slice": { + "text": { + "default": "", + "no-data-sources-found": "Aucune source de données trouvée" + } + }, "empty-state": { "button-title": "Ajouter une variable", "info-box-content": "Les variables permettent d'obtenir des tableaux de bord plus interactifs et dynamiques. Au lieu de coder en dur des éléments tels que les noms de serveurs ou de capteurs dans vos requêtes d’indicateurs, vous pouvez utiliser des variables à leur place. Les variables sont affichées sous forme de listes déroulantes en haut du tableau de bord. Ces listes déroulantes permettent de modifier facilement les données affichées dans votre tableau de bord.", @@ -9215,6 +11141,13 @@ "placeholder-default-value-if-any": "valeur par défaut, le cas échéant", "text-options": "Options de texte" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "unknown-table": { "loading": "Chargement en cours...", "no-unknowns": "Aucune variable renommée ou manquante n'a été trouvée.", @@ -9271,5 +11204,25 @@ "data-hover-view": { "link": "Lien" } + }, + "welcome": { + "welcome-banner": { + "need-help": "Vous avez besoin d’aide ?", + "welcome-to-grafana": "" + } + }, + "xychart": { + "series-editor": { + "add-series": "", + "aria-label-select-series": "", + "label-color-field": "", + "label-frame": "Cadre", + "label-size-field": "", + "label-x-field": "Champ X", + "label-y-field": "Champ Y", + "placeholder-all-frames": "", + "placeholder-select-frame": "", + "tooltip-delete-series": "" + } } } \ No newline at end of file diff --git a/public/locales/hu-HU/grafana.json b/public/locales/hu-HU/grafana.json index 56edca8730e..e48aff1a431 100644 --- a/public/locales/hu-HU/grafana.json +++ b/public/locales/hu-HU/grafana.json @@ -72,6 +72,11 @@ }, "admin-edit-org-page": { "label-name": "Név", + "page-nav": { + "subTitle": { + "manage-settings-roles-organization": "" + } + }, "render-missing-permission-message": { "title-access-denied": "Hozzáférés megtagadva" } @@ -233,6 +238,13 @@ "upgrade-info": { "title": "Vállalati licenc" }, + "user-admin-page": { + "page-nav": { + "subTitle": { + "manage-settings-for-an-individual-user": "" + } + } + }, "user-create-page": { "label-email": "E-mail-cím", "label-name": "Név", @@ -243,9 +255,16 @@ "label-ldap": "LDAP" }, "user-list-admin-page-un-connected": { + "label": { + "active-last-days": "", + "all-users": "Összes felhasználó" + }, "placeholder-search-login-email": "Felhasználó keresése felhasználónév, e-mail-cím vagy név alapján." }, "user-list-anonymous-devices-page-un-connected": { + "label": { + "active-last-days": "" + }, "placeholder-search-devices-by-ip-address": "Eszközök keresése IP-cím alapján." }, "user-list-page": { @@ -364,6 +383,12 @@ "no-grouping": "Nincs csoportosítás" }, "alert-group-alerts-table": { + "columns": { + "label": { + "instance-labels": "", + "notification-state": "Értesítési állapot" + } + }, "duration": "ennyi ideig: {{time}}" }, "alert-group-filter": { @@ -443,6 +468,11 @@ "description-section": "Adjon meg egy nevet a(z) {{entityName}} azonosításához.", "label-metric": "Metrika", "label-name": "Név", + "message": { + "must-enter-a-metric-name": "", + "must-enter-a-name": "", + "please-select-a-data-source": "Válasszon adatforrást" + }, "metric-aria-label-metric": "metrika", "metric-placeholder-recorded-metric": "Adja meg az új rögzített metrika nevét", "placeholder-name": "Adja meg a(z) {{namePlaceholder}} nevét", @@ -495,6 +525,9 @@ "alertmanager-config": { "gma-manual-configuration-description": "A belső Grafana riasztáskezelő-konfiguráció manuálisan nem módosítható. A konfiguráció módosításához szerkessze az egyes erőforrásokat a felhasználói felületen keresztül.", "gma-manual-configuration-is-not-supported": "A manuális konfigurációs módosítások nem támogatottak", + "message": { + "configuration-cannot-be-empty": "" + }, "reset": "Visszaállítás", "reset-confirmation": "Biztosan visszaállítja a(z) „{{alertmanagerName}}” konfigurációját? A kapcsolattartási pontok és az értesítési házirendek visszaállnak az alapértelmezett értékekre.", "resetting-configuration-might-while": "Konfiguráció visszaállítása, kis türelmet.", @@ -584,6 +617,9 @@ "create-a-contact-point": "Kapcsolattartási pont létrehozása", "label-default-contact-point": "Alapértelmezett kapcsolattartási pont", "label-timing-options": "Időzítési beállítások", + "message": { + "required": "" + }, "or": "vagy" }, "am-routes-expanded-form": { @@ -605,11 +641,19 @@ "label-override-grouping": "Csoportosítás felülbírálása", "label-value": "Érték", "matching-labels": "Egyező címkék", + "message": { + "required": "" + }, "placeholder-label": "címke", "placeholder-value": "érték", "remove": "Eltávolítás", "tooltip-remove-matcher": "Egyezések eltávolítása" }, + "annotation-header-field": { + "message": { + "required": "" + } + }, "annotations": { "dashboard-annotation-field": { "dashboard": "{{dashboardUid}} irányítópult", @@ -681,6 +725,25 @@ "title": "Nem lehet megjeleníteni az összes eseményt" } }, + "central-alert-history-scene": { + "scene": { + "labels-filter-variable": { + "label": { + "labels": "" + } + }, + "transitions-from-filter-variable": { + "label": { + "start-state": "" + } + }, + "transitions-to-filter-variable": { + "label": { + "end-state": "" + } + } + } + }, "channel-sub-form": { "delete": "Törlés", "duplicate": "Duplikálás", @@ -717,11 +780,17 @@ }, "cloud-data-source-selector": { "label": "Adatforrás kijelölése", - "label-disabled": "Adatforrás" + "label-disabled": "Adatforrás", + "message": { + "please-select-a-data-source": "Válasszon adatforrást" + } }, "cloud-evaluation-behavior": { "description-pending-period": "Az az időszak, amely alatt a küszöbfeltételnek teljesülnie kell a riasztás aktiválásához. A „Nincs” kiválasztása azonnal aktiválja a riasztást, amint a feltétel teljesül.", "label-pending-period": "Függőben lévő időszak", + "message": { + "must-be-a-positive-integer": "" + }, "title-set-evaluation-behavior": "Értékelési viselkedés beállítása" }, "cloud-receiver-form": { @@ -762,6 +831,9 @@ "contact-point-selector": { "aria-label-refresh-contact-points": "Kapcsolattartási pontok frissítése", "contact-point-picker-label-contact-point": "Kapcsolattartási pont", + "message": { + "contact-point-is-required": "" + }, "title-failed-to-fetch-contact-points": "A kapcsolattartási pontok lekérése nem sikerült", "tooltip-refresh-contact-points-list": "Kapcsolattartási pontok listájának frissítése" }, @@ -828,6 +900,14 @@ }, "copy-to-clipboard": "„{{label}}” másolása a vágólapra", "create-metadata": { + "label": { + "dashboard": "Irányítópult", + "dashboard-and-panel": "", + "evaluation-interval": "Értékelési intervallum", + "labels": "Címkék", + "metric-name": "", + "runbook-url": "" + }, "view-dashboard": "Irányítópult megtekintése", "view-panel": "Panel megtekintése" }, @@ -868,9 +948,6 @@ "title-search-panel": "Keresőpanel", "title-select-dashboard-and-panel": "Irányítópult és panel kiválasztása" }, - "data-source-section": { - "import-to-grafana": "Importálás Grafana-szabályokba" - }, "datasource-not-found": { "card-description": "A lekérdezés adatforrása nem található, el lett távolítva vagy nincs megfelelően telepítve.", "remove-query": "Lekérdezés eltávolítása", @@ -952,6 +1029,11 @@ "text-loading-template": "Sablon betöltése…", "title-failed-to-fetch-notification-template": "Az értesítési sablon lekérése nem sikerült" }, + "edit-mute-timing-page": { + "text": { + "edit-time-interval": "" + } + }, "editor": { "edit-alert-rule": "", "edit-recording-rule": "", @@ -965,6 +1047,11 @@ "error-summary-button": { "content-show-all-errors": "" }, + "evaluate-every-validation-options": { + "message": { + "required": "" + } + }, "evaluation-behavior-summary": { "evaluate": "", "label-evaluate": "Értékelés", @@ -982,6 +1069,9 @@ "evaluation-group-creation-modal": { "description-group-name": "A csoport ugyanazon értékelési intervallumban értékeli az összes szabályát.", "description-often-rules-group-evaluated": "A csoport összes szabályának kiértékelési gyakorisága.", + "message": { + "required": "" + }, "placeholder-enter-a-name": "Adjon meg egy nevet", "title-new-evaluation-group": "Új értékelési csoport" }, @@ -1004,12 +1094,24 @@ "title-permission-editrecreate-silence": "Nincs engedélye a némítás szerkesztésére/újbóli létrehozására", "title-silence-not-found": "A meglévő „{{silenceId}}” némítás nem található" }, + "existing-silence-editor-page": { + "page-nav": { + "text": { + "edit-silence": "" + } + } + }, "export": { "subtitle": { "formats": "Válassza ki a formátumot, és töltse le a fájlt, vagy másolja a tartalmat a vágólapra", "one-format": "Töltse le a fájlt, vagy másolja a tartalmat a vágólapra" } }, + "export-new-grafana-rule-page": { + "text": { + "export-new-grafana-rule": "" + } + }, "export-new-rule-button": { "tooltip-export-new-grafana-rule": "Új Grafana-szabály exportálása" }, @@ -1035,6 +1137,16 @@ "no-data": "Nincs adat", "page-counter": "" }, + "feature-toggle-page": { + "nav-model": { + "subTitle": { + "enable-alerting-grafana-config": "" + }, + "text": { + "alerting-is-not-enabled": "" + } + } + }, "federated-rule-warning": { "experimental": "Az összevont szabálycsoportok jelenleg egy kísérleti funkció.", "read-documentation": "Dokumentáció elolvasása", @@ -1042,6 +1154,13 @@ }, "file-export-inline-documentation": { "api-provisioning": "A(z) {{name}} formátum csak API-kiosztásra érvényes. <3>További információ a dokumentációban található.</3>", + "export-inline-doc": { + "title": { + "apiprovisioning-format": "", + "fileprovisioning-format": "", + "terraformprovisioning-format": "" + } + }, "file-provisioning": "A(z) ({{name}}) formátum csak fájlkiépítésre érvényes. <3>További információ a dokumentációban található.</3>", "terraform-provisioning": "A(z) {{name}} formátum csak Terraform-kiépítésre érvényes. <3>További információ a dokumentációban található.</3>" }, @@ -1049,6 +1168,20 @@ "copy-code": "Kód másolása", "download": "Letöltés" }, + "filter-options": { + "label": { + "alert-rule": "Riasztási szabály", + "all": "Összes", + "error": "Hiba", + "firing": "", + "no-data": "Nincs adat", + "normal": "Normál", + "ok": "OK", + "pending": "Függőben", + "recording-rule": "Felvételi szabály", + "recovering": "Helyreállítás" + } + }, "filter-view-results": { "aria-label-filteredrulelist": "szűrt-szabálylista" }, @@ -1083,7 +1216,10 @@ } }, "folder-selector": { - "description-select-folder": "Válasszon egy mappát a szabály tárolásához." + "description-select-folder": "Válasszon egy mappát a szabály tárolásához.", + "message": { + "select-a-folder": "" + } }, "folderAndGroup": { "evaluation": { @@ -1098,15 +1234,88 @@ "for-input": { "description-pending": "Az az időszak, amely alatt a küszöbfeltételnek teljesülnie kell a riasztás aktiválásához. A „Nincs” kiválasztása azonnal aktiválja a riasztást, amint a feltétel teljesül." }, + "for-validation-options": { + "message": { + "required": "" + } + }, "generate-alert-data-modal": { "add-alert-data": "Riasztási adatok hozzáadása", "add-alert-data-to-payload": "Riasztási adatok hozzáadása a hasznos tartalomhoz", + "alert-options": { + "label": { + "firing": "", + "resolved": "" + } + }, "review-alert-payload": " A hasznos tartalomhoz hozzáadandó riasztási adatok áttekintése:", "title-add-custom-alerts": "Egyéni riasztások hozzáadása" }, + "get-alert-suggestions": { + "documentation": { + "annotations-attached-alert": "", + "fingerprint-identify-alert": "", + "grafana-external-alertmanager": "", + "organization-alert": "", + "time-the-alert-started-firing": "" + }, + "value": { + "labels-attached-alert": "", + "status-alert-firing-resolved": "" + } + }, + "get-cloud-scenes": { + "title": { + "mimir-alertmanager": "" + } + }, + "get-global-suggestions": { + "value": { + "an-array-containing-all-alerts": "" + } + }, + "get-grafana-alertmanager-scenes": { + "title": { + "grafana-alertmanager": "" + } + }, + "get-grafana-managed-scenes": { + "title": { + "grafanamanaged-alert-rules": "Grafana által felügyelt riasztási szabályok" + } + }, + "get-mimir-managed-rules-per-group-scenes": { + "rule-group-handler": { + "label": { + "rule-group": "" + } + }, + "title": { + "mimirmanaged-alert-rules-per-rule-group": "" + } + }, + "get-mimir-managed-rules-scenes": { + "title": { + "mimirmanaged-alert-rules": "" + } + }, "get-preview-results": { "title-error": "Hiba" }, + "get-state-display-model": { + "text": { + "alerting": "", + "error": "", + "firing": "", + "inactive": "", + "no-data": "", + "ok": "OK", + "paused": "", + "pending": "", + "recovering": "", + "unknown": "" + } + }, "getting-stared": { "learn-more": "A gyakorlati utasításokhoz tekintse meg a Grafana Alerting használatának megkezdésére vonatkozó <2>oktatóanyagunkat</2>" }, @@ -1148,6 +1357,10 @@ "label-disable-resolved-message": "Megoldott üzenet letiltása" }, "grafana-evaluation-behavior-step": { + "message": { + "must-be-a-positive-integer": "", + "must-enter-a-group-name": "" + }, "missing-series-resolve-placeholder": "Alapértelmezett: 2", "or": "vagy", "placeholder-select-an-evaluation-group": "Értékelési csoport kijelölése…", @@ -1164,6 +1377,11 @@ "body-invalid-rule-id": "Érvénytelen szabály-UID az oldal URL-címében. Ellenőrizze az URL-t, és próbálkozzon újra.", "title-invalid-rule-id": "Érvénytelen szabályazonosító" }, + "grafana-modify-export-page": { + "text": { + "modify-export": "" + } + }, "grafana-mute-timing-exporter-preview": { "text-loading": "Betöltés…" }, @@ -1216,6 +1434,9 @@ }, "group-and-namespace-fields": { "group-picker-label-group": "Csoport", + "message": { + "required": "" + }, "namespace-picker-label-namespace": "Névtér" }, "group-by": { @@ -1272,14 +1493,19 @@ "header": { "tooltip-remove": "„{{refId}}” kifejezés eltávolítása" }, + "history-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "Sikerült" + } + }, "home": { "label-get-started": "Kezdés", "label-insights": "Adatok", "title-alerting": "Riasztás" }, - "import-from-dsrules": { - "description-folder-import-rules": "Az a mappa, amelybe a szabályokat importálni kívánja" - }, "import-to-gma": { "action-button": "Importálás", "additional-settings": "További beállítások", @@ -1287,8 +1513,9 @@ "confirm-modal": { "confirm": "Importálás", "loading": "Betöltés...", - "loading-body": "Az importálandó adatok előkészítése folyamatban van. Ez hosszabb időt is igénybe vehet…", + "loading-body": "", "no-rules-body": "Nincsenek importálandó szabályok. Válasszon másik névteret vagy szabálycsoportot.", + "no-rules-body-yaml": "", "no-rules-title": "Nincsenek importálandó szabályok", "plugin-rules-warning": { "text": "Azt észleltük, hogy bizonyos szabályokat bővítmények kezelnek. Ezek a szabályok nem lesznek importálva.", @@ -1307,11 +1534,12 @@ "label": "Csoport" }, "import-location-and-filters": "Hely és szűrők importálása", + "import-source": "", "namespace": { "description": "Írjon be szöveget egy meglévő névtér kereséséhez", "label": "Névtér" }, - "pageTitle": "Riasztási szabályok importálása adatforrásból a Grafana által felügyelt szabályokba", + "pageTitle": "", "pause": { "label": "Importált riasztási szabályok szüneteltetése" }, @@ -1319,10 +1547,26 @@ "label": "Importált felvételkészítési szabályok szüneteltetése" }, "recording-rules": "Felvételkészítési szabályok", + "source": { + "datasource": "", + "datasource-description": "", + "yaml": "", + "yaml-description": "" + }, "success": "Sikeresen importálta a riasztási szabályokat a Grafana által felügyelt szabályokba.", "target-folder": { + "description": "Az a mappa, amelybe a szabályokat importálni kívánja", "label": "Célmappa" - } + }, + "yaml": { + "description": "", + "label": "", + "required-message": "", + "target-datasource": "Céladatforrás", + "target-datasource-description": "", + "target-datasource-required": "" + }, + "yaml-error": "" }, "insights": { "monitor-status-of-system": "A rendszer állapotának figyelése", @@ -1398,6 +1642,9 @@ "text-loading-existing-labels": "Meglévő címkék betöltése" }, "labels-without-suggestions": { + "message": { + "required": "" + }, "placeholder-key": "kulcs", "placeholder-value": "érték" }, @@ -1437,6 +1684,24 @@ "log-record-viewer-by-timestamp": { "aria-label-state-history-by-timestamp": "Állapotelőzmények időbélyeg szerint" }, + "log-timeline-viewer": { + "label": { + "firing": "", + "mixed": "", + "no-data": "", + "normal": "Normál", + "pending": "Függőben", + "recovering": "Helyreállítás" + } + }, + "loki-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "Sikerült" + } + }, "loki-state-history": { "clear-filters": "Szűrők törlése", "common-labels": "Közös címkék", @@ -1449,6 +1714,14 @@ "button": "Engedélyek kezelése", "title": "Engedélyek kezelése" }, + "manual-and-automatic-routing": { + "routing-options": { + "label": { + "select-contact-point": "", + "use-notification-policy": "" + } + } + }, "matcher-filter": { "filter-alerts-using-label-querying-without-braces": "Szűrheti a riasztásokat zárójelek nélküli címkelekérdezéssel, pl.:", "filter-alerts-using-label-querying-without-spaces": "Szűrheti a riasztásokat szóközök nélküli címkelekérdezéssel, pl.:", @@ -1466,6 +1739,9 @@ "label-operator": "Műveleti jel", "label-refine-affected-alerts": "Érintett riasztások pontosítása", "label-value": "Érték", + "message": { + "required": "" + }, "placeholder-label": "címke", "placeholder-value": "érték", "remove": "Eltávolítás", @@ -1497,6 +1773,16 @@ "aria-label": "Továbbiak", "button-text": "Továbbiak" }, + "multiple-data-source-picker": { + "get-data-source-options": { + "grouped-options": { + "label": { + "data-sources-with-configured-alert-rules": "", + "other-data-sources": "" + } + } + } + }, "mute-timing-actions-buttons": { "text-disabled": "Letiltva", "title-delete-mute-timing": "Némítási időzítés törlése" @@ -1560,11 +1846,26 @@ "read-more": "További információ az értesítési házirendekről.", "title-notification-routing": "Értesítés irányítása" }, + "new-mute-timing-page": { + "text": { + "add-time-interval": "" + } + }, "new-rule-from-panel-button": { "body-no-alerting-capable-query-found": "Nem lehet riasztásokat létrehozni erről a panelről, mert nem található lekérdezés riasztásképes adatforráshoz.", "new-alert-rule": "Új riasztási szabály", "title-no-alerting-capable-query-found": "Nem található riasztásképes lekérdezés" }, + "new-silence-page": { + "page-nav": { + "subTitle": { + "configure-silences-notifications-particular-alert": "" + }, + "text": { + "silence-alert-rule": "Némítási riasztási szabály" + } + } + }, "no-alert-managers-available": { "body-no-alertmanager-found": "Nem találtunk külső riasztáskezelőket, és előfordulhat, hogy nincs hozzáférése a beépített Grafana riasztáskezelőhöz.", "title-no-alertmanager-found": "Nem található riasztáskezelő" @@ -1791,6 +2092,9 @@ "expressions": "Kifejezések", "loading-data-sources": "Adatforrások betöltése…", "manipulate-returned-queries-other-operations": "A lekérdezésekből visszaadott adatok manipulálása matematikai és egyéb műveletekkel.", + "message": { + "a-valid-expression-is-required": "" + }, "no-compatible-sources": "Úgy tűnik, nincs kompatibilis adatforrása", "title-deactivate-advanced-options": "Speciális beállítások inaktiválása", "title-queries-expressions-configured": "Nincs lekérdezés vagy kifejezés konfigurálva" @@ -1842,7 +2146,8 @@ }, "recording-rules": { "description-target-data-source": "A felvételi szabályok tárolására szolgáló Prometheus-adatforrás", - "label-target-data-source": "Céladatforrás" + "label-target-data-source": "Céladatforrás", + "target-data-source-required": "" }, "recording-rules-name-space-and-group-step": { "description-select-namespace-group-recording": "Válassza ki a névteret és a csoportot a felvételkészítési szabályhoz.", @@ -2103,6 +2408,9 @@ "collapse-all": "Összes összecsukása", "expand-all": "Összes kibontása" }, + "rule-list-v2": { + "import-to-gma": "" + }, "rule-modify-export": { "text-loading-the-rule": "A szabály betöltése…", "title-cannot-exist": "A szabály nem tölthető be. A szabály nem létezik", @@ -2180,6 +2488,10 @@ "label-saved-searches": "Mentett keresések" }, "health": "Állapot", + "label": { + "hide": "Elrejtés", + "show": "Megjelenítés" + }, "manage-alerts": "Ezekben az adatforrásokban kiválaszthatja a Riasztások kezelése az Alerting felületén keresztül lehetőséget, hogy kezelhesse ezeket a riasztási szabályokat a Grafana kezelőfelületén, valamint abban az adatforrásban, ahol konfigurálták őket.", "placeholder-all-data-sources": "Összes adatforrás", "plugin-rules": "Bővítményszabályok", @@ -2276,6 +2588,9 @@ "label-comment": "Megjegyzés", "label-created-by": "Létrehozta:", "label-duration": "Időtartam", + "message": { + "required": "" + }, "placeholder-whos-creating-the-silence": "Ki hozza létre a némítást?", "save-silence": "Némítás mentése", "saving": "Mentés..." @@ -2314,6 +2629,12 @@ "title-alert-rule-types": "Riasztási szabálytípusok" }, "state-history": { + "columns": { + "label": { + "state": "Állapot", + "time": "Idő" + } + }, "filter-group": "Szűrőcsoport", "filter-group-tooltip": "Szűrje az egyes állapotelőzmény-csoportokat pontos egyezés vagy reguláris kifejezés alapján, például:", "placeholder-search": "Keresés", @@ -2353,6 +2674,9 @@ "label-examples-documentation": "Példák dokumentációja", "label-template-group": "Sabloncsoport", "label-template-group-name": "Sabloncsoportnév", + "message": { + "required": "" + }, "new-template-name-placeholder-give-your-template-group-a-name": "Adjon nevet a sabloncsoportjának", "title-error-saving-template": "Hiba a sablon mentése során", "title-templating-cheat-sheet": "Sablonkészítés puskalaphoz" @@ -2375,6 +2699,11 @@ "existing-templates-selector-aria-label-choose-notification-template": "Válasszon értesítési sablont", "existing-templates-selector-placeholder-choose-notification-template": "Válasszon értesítési sablont", "loading": "Betöltés...", + "template-options": { + "label": { + "select-notification-template": "" + } + }, "tooltip-copy": "A kijelölt értesítési sablonok másolása a vágólapra. Az egyéni lapon használhatja." }, "templates": { @@ -2477,10 +2806,39 @@ } }, "use-columns": { + "columns": { + "label": { + "alert-rule-targeted": "", + "alerts-silenced": "", + "health": "Állapot", + "matching-labels": "Egyező címkék", + "name": "Név", + "schedule": "Ütemezés", + "state": "Állapot", + "time-range": "Időtartomány" + } + }, + "label": { + "actions": "Műveletek", + "created": "Létrehozva", + "group": "Csoport", + "labels": "Címkék", + "next-evaluation": "Következő értékelés", + "state": "Állapot", + "summary": "Összegzés" + }, "title-edit": "Szerkesztés", "title-recreate": "Újbóli létrehozás", "title-unsilence": "Némítás megszüntetése" }, + "use-combined-labels": { + "grouped-options": { + "label": { + "from-alerts": "", + "from-system": "" + } + } + }, "use-create-dropdown-menu-actions": { "label-delete": "Törlés", "label-edit": "Szerkesztés", @@ -2514,6 +2872,17 @@ "title-edit-notification-policy": "Értesítési házirend szerkesztése" } }, + "use-page-nav": { + "page-nav": { + "text": { + "details": "Részletek", + "history": "Előzmények", + "instances": "Példányok", + "query-and-conditions": "", + "versions": "Verziók" + } + } + }, "use-state-history-modal": { "state-history-modal": { "title-state-history": "Állapotelőzmények" @@ -2534,6 +2903,36 @@ "body": "A szerkesztő YAML-tartalma csak riasztásiszabály-konfigurációt tartalmaz <1></1>A Prometheus konfigurálásához meg kell adnia a <4>konfigurációs fájl többi tartalmát.</4>" } }, + "alertlist": { + "group-by": { + "aria-label-group-by-label-keys": "", + "placeholder-group-by": "Csoportosítási szempont" + }, + "ungrouped-mode-view": { + "active-for": "", + "aria-label-view-alert-rule": "", + "view-alert-rule": "" + }, + "unified-alert-list": { + "clear": "Törlés", + "text-loading": "Betöltés…" + }, + "unified-alert-list-panel": { + "body-permission-required": "", + "title-permission-required": "" + } + }, + "annolist": { + "anno-list-panel": { + "aria-label-remove-filter": "", + "filter": "", + "loading": "Betöltés…", + "no-annotations-found": "" + }, + "annotation-list-item": { + "tooltip-created-by": "" + } + }, "annotations": { "annotation-field-mapper": { "annotation": "Jegyzet", @@ -2630,6 +3029,11 @@ "configuration-required": "Konfigurálás szükséges", "refer-documentation-configure-authentication": "Lásd a hitelesítés konfigurálásával kapcsolatos dokumentációt" }, + "field-map": { + "label": { + "none": "Nincs" + } + }, "fields": { "allow-assign-grafana-admin-description": "", "allow-assign-grafana-admin-label": "", @@ -2733,7 +3137,18 @@ "use-refresh-token-description": "", "use-refresh-token-label": "", "validate-hosted-domain-description": "", - "validate-hosted-domain-label": "" + "validate-hosted-domain-label": "", + "workload-identity-token-file-description": "", + "workload-identity-token-file-label": "", + "workload-identity-token-file-required": "" + }, + "get-page-nav": { + "subTitle": { + "configure-authentication-providers": "" + }, + "text": { + "authentication": "Hitelesítés" + } }, "provider-card": { "text-badge-enabled": "Engedélyezve", @@ -2769,6 +3184,12 @@ "auth-config-auth-config-page-unconnected": { "subtitle": "Saját hitelesítési beállítások kezelése és az egyszeri bejelentkezés konfigurálása. További információkat a <2>dokumentációnkban</2> talál." }, + "barchart": { + "tick-spacing-editor": { + "content-require-space-from-the-right-side": "", + "label-rtl": "" + } + }, "bookmarks-page": { "empty": { "message": "Úgy tűnik, még nem hozott létre könyvjelzőket", @@ -2897,11 +3318,199 @@ "text-this-repository-is-read-only": "Ha közvetlen hozzáférése van a célhoz, másolja ki a JSON-kódot, és illessze be oda." }, "canvas": { + "apieditor": { + "label-endpoint": "", + "label-header-parameters": "", + "label-method": "Metódus", + "label-payload": "Hasznos tartalom", + "label-query-parameters": "Lekérdezési paraméterek", + "render-test-apibutton": { + "test-api": "", + "title-test-api": "" + } + }, + "button-item": { + "label": { + "center": "", + "left": "", + "right": "" + }, + "placeholder": { + "auto": "Automatikus" + } + }, + "button-style-editor": { + "label-variant": "Változat" + }, + "canvas-context-menu": { + "close-editor": "", + "open-editor": "", + "render-menu-items": { + "add-item-menu-item": { + "label-add-item": "" + }, + "edit-element-menu-item": { + "label-edit": "Szerkesztés" + }, + "label-bring-to-front": "", + "label-delete": "Törlés", + "label-duplicate": "Duplikálás", + "label-send-to-back": "", + "set-background-menu-item": { + "label-set-background": "" + } + } + }, + "cloud-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automatikus" + } + }, + "ellipse-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automatikus" + } + }, + "inline-edit": { + "canvas-inline-editor": "", + "tooltip-close-inline-editor": "" + }, + "inline-edit-body": { + "label-add-item": "", + "please-select-an-element": "" + }, + "line-style-editor": { + "label-animate": "" + }, + "metric-value-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automatikus" + } + }, "not-found-display": { "not-found": "<0>Nem található: </0><config />" }, + "pan-zoom-help": { + "ctrl-right-mouse": "", + "middle-mouse": "", + "pan-title": "", + "reset-double-click": "", + "title-pan-and-zoom-controls": "", + "zoom-scroll-wheel": "" + }, + "parallelogram-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automatikus" + } + }, + "params-editor": { + "aria-label-add": "Hozzáadás", + "aria-label-delete": "Törlés", + "placeholder-key": "Kulcs", + "placeholder-value": "Érték" + }, + "placement-editor": { + "label-constraints": "", + "label-position": "", + "loading": "Betöltés…" + }, + "quick-positioning": { + "tooltip-align-bottom": "", + "tooltip-align-horizontal-centers": "", + "tooltip-align-left": "", + "tooltip-align-right": "", + "tooltip-align-top": "", + "tooltip-align-vertical-centers": "" + }, + "rectangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automatikus" + } + }, "text-display": { "double-click-to-set": "Kattintson duplán a szöveg beállításához" + }, + "text-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automatikus" + } + }, + "tree-navigation-editor": { + "clear-selection": "Kijelölés törlése", + "frame-selection": "", + "label-add-item": "", + "missing-layer": "", + "no-settings": "", + "switcher-icon": { + "title-node-icon": "" + } + }, + "tree-node-title": { + "title-duplicate": "Duplikálás", + "title-remove": "Eltávolítás", + "tooltip-duplicate": "Duplikálás", + "tooltip-remove": "Eltávolítás" + }, + "triangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automatikus" + } } }, "carousel": { @@ -2981,6 +3590,22 @@ } }, "connections": { + "add-new-connection": { + "filter-by-options": { + "label": { + "all": "Összes", + "installed": "Telepítve", + "new-updates": "" + } + }, + "label": { + "by-downloads": "", + "by-name-az": "", + "by-name-za": "", + "by-published-date": "", + "by-updated-date": "" + } + }, "advisor-redirect-notice": { "aria-label-link-to-advisor": "Tanácsadóra mutató hivatkozás", "body": "Próbálja ki az új tanácsadót, hogy felfedezze az adatforrásokkal és bővítményekkel kapcsolatos potenciális problémákat.", @@ -2997,6 +3622,22 @@ "body": "Az adatforrások új otthont kaptak! A főmenüből elérhető Kapcsolatok oldalon új adatforrásokat fedezhet fel, vagy kezelheti a meglévőket.", "go-to-connections": "Tovább a kapcsolatokhoz" }, + "data-source-details-page": { + "subTitle": { + "datasource-could-found": "" + }, + "text": { + "unknown-datasource": "" + } + }, + "new-data-source-page": { + "subTitle": { + "choose-a-data-source-type": "" + }, + "text": { + "add-data-source": "Adatforrás hozzáadása" + } + }, "no-access-modal": { "connection-contact-grafana-admin": "Új kapcsolat hozzáadásához vegye fel a kapcsolatot a Grafana-rendszergazdával.", "editor-warning": "A szerkesztők nem adhatnak hozzá új kapcsolatokat. Ellenőrizheti, hogy az <2>Adatforrások</2> menüpontban már be van-e állítva.", @@ -3009,6 +3650,18 @@ "search": { "aria-label-search-all": "Keresés mindenhol", "placeholder": "Keresés mindenhol" + }, + "use-data-source-settings-nav": { + "node": { + "subTitle": { + "data-source-error": "" + } + }, + "page-nav": { + "text": { + "data-source-nav-node": "" + } + } } }, "core": { @@ -3304,6 +3957,11 @@ "title-plugin-dashboard": "Bővítmény-irányítópult" }, "dash-nav": { + "on-open-snapshot-original": { + "title": { + "proceed-to-external-site": "" + } + }, "render-left-actions": { "text-public": "Nyilvános", "tooltip-view-as-scene": "Megtekintés jelenetként" @@ -3315,11 +3973,26 @@ "dashboard-loading": { "cancel-loading-dashboard": "Irányítópult betöltésének megszakítása" }, + "dashboard-page-error": { + "text": { + "not-found": "Nem található" + } + }, "dashboard-settings": { "actions": { "close": "Bezárás" } }, + "dashboard-slice": { + "title": { + "dashboard-init-failed": "" + } + }, + "dashboard-srv": { + "message": { + "edit-dashboard-json": "" + } + }, "dashboard-validation": { "body-dashboard-failed-schema-validation": "Az érvényesítés fejlesztési célokat szolgál, és biztonságosan figyelmen kívül hagyható. Ha Ön Grafana-fejlesztő, fontolja meg az irányítópult-séma ellenőrzését és frissítését", "title-checking-dashboard-validity": "Irányítópult érvényességének ellenőrzése", @@ -3415,6 +4088,13 @@ "values": "Értékek vesszővel elválasztva", "values-placeholder": "1, 10, mykey : myvalue, myvalue, escaped,value" }, + "datasource-options": { + "name-filter": "", + "name-filter-description": "", + "name-filter-placeholder": "", + "type": "Típus", + "type-placeholder": "" + }, "description": "Leírás", "description-placeholder": "Leírószöveg", "label": "Címke", @@ -3433,8 +4113,8 @@ "category": "Kijelölés beállításai", "custom-all-value": "Összes egyedi érték", "custom-all-value-description": "Helyettesítő karakteres reguláris kifejezés vagy más érték, amely az összeset jelöli", - "include-all": "Összes belefoglalása lehetőség", - "include-all-description": "Lehetővé teszi az összes érték belefoglalását", + "include-all": "", + "include-all-description": "", "multi-value": "Többértékű" }, "type-category": "{{type}}-beállítások" @@ -3460,14 +4140,97 @@ "errors": { "failed-to-load": "Az irányítópult betöltése sikertelen volt" }, + "fetch-dashboard": { + "message": { + "failed-to-fetch-dashboard": "" + } + }, "gen-aihistory": { "aria-label-send-custom-feedback": "Egyéni visszajelzés küldése", "footer-text": "Ez a tartalom mesterséges intelligencia által lett generálva a <2>Grafana LLM bővítmény</2> használatával", "placeholder-tell-ai-what-to-do-next": "Mondja meg az MI-nek, mi a következő lépés…" }, + "general-settings-unconnected": { + "editable-options": { + "label": { + "editable": "Szerkeszthető", + "readonly": "" + } + } + }, + "get-debug-dashboard": { + "title": { + "annotations": "Jegyzetek" + } + }, + "get-errors": { + "message": { + "error-loading-data": "" + } + }, "get-field-override-categories": { "label-add-field-override": "Mezőfelülbírálás hozzáadása", - "label-add-override-property": "Felülbírálási tulajdonság hozzáadása" + "label-add-override-property": "Felülbírálási tulajdonság hozzáadása", + "title": { + "add-button": "" + } + }, + "get-library-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "Információ", + "name": "Név" + } + }, + "get-library-viz-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "Információ", + "name": "Név" + } + }, + "get-panel-editor-tabs": { + "text": { + "alert": "", + "query": "Lekérdezés", + "transform-data": "" + } + }, + "get-panel-frame-category": { + "descriptor": { + "title": { + "panel-options": "Panelbeállítások" + } + }, + "direction-options": { + "label": { + "horizontal": "Vízszintes", + "vertical": "Függőleges" + } + }, + "title": { + "description": "Leírás", + "max-per-row": "Max. soronként", + "panel-links": "Panelhivatkozások", + "repeat-by-variable": "Ismétlés változó szerint", + "repeat-direction": "Ismétlési irány", + "repeat-options": "Ismétlési beállítások", + "title": "Cím", + "transparent-background": "Áttetsző háttér" + } + }, + "get-panel-menu": { + "text": { + "extensions": "" + } }, "help-wizard": { "copy-to-clipboard": "Másolás vágólapra", @@ -3480,10 +4243,21 @@ "randomize-field-names-label-field-names": "Mezőnevek", "randomize-labels-label-labels": "Címkék", "randomize-string-values-label-string-values": "Karakterláncértékek", + "tabs": { + "label": { + "data": "Adatok", + "snapshot": "Pillanatkép" + } + }, "title-complete-git-hub-comment-clipboard": "Teljes GitHub-megjegyzés másolása a vágólapra", "title-get-help-with-this-panel": "Segítség kérése ezzel a panellel kapcsolatban", "troubleshooting-docs": "Hibaelhárítási dokumentáció" }, + "init-dashboard": { + "message": { + "failed-create-dashboard-model": "" + } + }, "inspect": { "data-tab": "Adatok", "error-tab": "Hiba", @@ -3536,6 +4310,16 @@ "rows": "Sorok száma összesen", "table-title": "Statisztika" }, + "k8s-dashboard-api": { + "title": { + "deleted": "" + } + }, + "k8s-dashboard-v2api": { + "title": { + "deleted": "" + } + }, "layout": { "common": { "copy": "Másolás", @@ -3548,6 +4332,13 @@ "panel-layout-disabled": "Jelöljön ki egy sort vagy lapot a panel elrendezési beállításainak módosításához" } }, + "legacy-dashboard-api": { + "fetch-error": { + "message": { + "dashboard-not-found": "" + } + } + }, "make-editable": { "dashboard-not-editable": "Nem szerkeszthető irányítópult", "make-editable": "Legyen szerkeszthető" @@ -3567,6 +4358,20 @@ "menu-use-library-panel": "Könyvtárpanel használata" }, "new-panel-title": "Új panel", + "on-create-new-row": { + "new-row": { + "title": { + "row-title": "" + } + } + }, + "on-create-new-widget-panel": { + "new-panel": { + "title": { + "widget-title": "" + } + } + }, "options": { "description": "Leírás", "title-option": "Cím" @@ -3626,6 +4431,30 @@ "paused": "Ezt az irányítópultot az adminisztrátor felfüggesztette", "try-again-later": "Próbálkozzon újra később" }, + "remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, + "repeat-row-select": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, + "repeat-row-select2": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, "revert-dashboard-modal": { "body-restore-version": "Biztosan visszaállítja az irányítópultot a(z) {{version}} verzióra? Az összes nem mentett módosítás elveszik.", "title-restore-version": "Verzió visszaállítása" @@ -3739,6 +4568,18 @@ "sub-menu-un-connected": { "aria-label-template-variables": "Sablonváltozók" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "tabs-layout": { "delete-tab-text": "A lap törlésével az összes panelt is eltávolítja. Biztosan folytatja?", "delete-tab-title": "Törli a lapot?", @@ -3944,7 +4785,10 @@ }, "unthemed-dashboard-row": { "aria-label-delete-row": "Sor törlése", - "learn-more": "További információk" + "learn-more": "További információk", + "title": { + "delete-row": "Sor törlése" + } }, "validation": { "invalid-dashboard-id": "Nem található érvényes Grafana.com-azonosító", @@ -3979,6 +4823,16 @@ }, "visualization-select-pane": { "placeholder-search-for": "Keresés a következőre…", + "radio-options": { + "description": { + "reusable-panels-share-between-multiple-dashboards": "" + }, + "label": { + "library-panels": "Könyvtárpanelek", + "suggestions": "", + "visualizations": "" + } + }, "title-close": "Bezárás" }, "viz-panel": { @@ -4029,12 +4883,25 @@ "label-data-source": "Adatforrás", "label-use-static-key-dimensions": "Statikus kulcsméretek használata" }, + "add-to-dashboard": { + "message": { + "could-navigate-selected-dashboard-please-again": "", + "could-panel-dashboard-please-again": "" + } + }, "add-to-dashboard-form": { "cancel": "Mégse", "description-choose-where-to-add-the-panel": "Válassza ki a panel hozzáadásának helyét.", "description-select-which-dashboard-panel-created": "Válassza ki, melyik irányítópulton kívánja létrehozni a panelt.", + "label": { + "existing-dashboard": "Meglévő irányítópult", + "new-dashboard": "Új irányítópult" + }, "label-dashboard": "Irányítópult", "label-target-dashboard": "Célirányítópult", + "message": { + "this-field-is-required": "A mező kitöltése kötelező." + }, "open-dashboard": "Irányítópult megnyitása", "open-in-new-tab": "Megnyitás új lapon", "title-error-adding-the-panel": "Hiba történt a panel hozzáadásakor" @@ -4072,6 +4939,25 @@ "it-cannot-contain-or": "Nem tartalmazhat „//” vagy „..” karaktert.", "least-valid-character": "Legalább egy érvényes karaktert kell tartalmaznia." }, + "build-new-dashboard-save-model": { + "data": { + "title": { + "new-dashboard": "Új irányítópult" + } + } + }, + "build-new-dashboard-save-model-v2": { + "data": { + "title": { + "new-dashboard": "Új irányítópult" + } + } + }, + "config-public-dashboard": { + "title": { + "revoke-public-url": "Nyilvános URL-cím visszavonása" + } + }, "constant-variable-form": { "constant-options": "Konstansbeállítások", "label-value": "Érték", @@ -4119,22 +5005,89 @@ "value-not-saved": "Az érték még nincs mentve a Grafana-adatbázisban", "view-pull-request-in-git-hub": "Összefésülési kérelem megtekintése a GitHubon" }, + "dashboard-scene": { + "text": { + "edit-panel": "", + "view-panel": "Panel megtekintése" + }, + "title": { + "dashboard": "Irányítópult", + "discard-changes-to-dashboard": "" + } + }, + "dashboard-scene-page-state-manager": { + "message": { + "dashboard-not-found": "" + } + }, + "dashboard-scene-page-state-manager-v2": { + "message": { + "dashboard-not-found": "" + } + }, "data-source-variable-form": { "data-source-options": "Adatforrás beállításai", "description-instance-name-filter": "Reguláris kifejezéses szűrő, amelyhez adatforráspéldányokat választhat a változóérték-listában. Hagyja üresen minden esetben.", "example-instance-name-filter": "Példa: <codeExample /> ", "selection-options": "Kijelölés beállításai" }, + "default-grid-layout-manager": { + "row": { + "title": { + "row-title": "" + } + } + }, "description-label": { "description": "Leírás" }, + "edit-link-view": { + "edit-link-page-nav": { + "text": { + "edit-link": "Hivatkozás szerkesztése" + } + } + }, "email-list": { "aria-label-emailmenu": "E-mail-menü ki- és bekapcsolása" }, + "embedded-dashboard-test-page": { + "subTitle": { + "showing-dashboard-panel-tests-pie-chart": "" + }, + "text": { + "embedding-dashboard": "" + } + }, "empty-transformations-message": { "add-transformation": "Transzformáció hozzáadása" }, + "get-edit-options": { + "title": { + "column-options": "", + "row-height-options": "" + } + }, + "get-panel-frame-options": { + "descriptor": { + "title": { + "panel-options": "Panelbeállítások" + } + }, + "title": { + "description": "Leírás", + "panel-links": "Panelhivatkozások", + "title": "Cím", + "transparent-background": "Áttetsző háttér" + } + }, + "get-workflow-options": { + "label": { + "push-to-a-new-branch": "" + } + }, "group-by-variable-form": { + "alert-not-supported": "", "description-enables-users-custom-values": "Lehetővé teszi a felhasználók számára, hogy egyéni értékeket adjanak a listához", "description-provide-dimensions-as-csv-dimension-name-dimension-id": "Méretek megadása CSV-ként: {{name}}, {{value}}", "group-by-options": "Csoportosítási beállítások", @@ -4153,6 +5106,12 @@ "randomize-field-names-label-field-names": "Mezőnevek", "randomize-labels-label-labels": "Címkék", "randomize-string-values-label-string-values": "Karakterláncértékek", + "tabs": { + "label": { + "data": "Adatok", + "snapshot": "Pillanatkép" + } + }, "title-complete-git-hub-comment-clipboard": "Teljes GitHub-megjegyzés másolása a vágólapra", "title-get-help-with-this-panel": "Segítség kérése ezzel a panellel kapcsolatban", "troubleshooting-docs": "Hibaelhárítási dokumentáció", @@ -4195,6 +5154,14 @@ "body-name-already-exists": "Egy irányítópult már létezik ugyanazzal a névvel a kijelölt mappában. Biztosan menti ezt az irányítópultot?", "title-name-already-exists": "A név már létezik" }, + "on-remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, "panel-data-alerting-tab-rendered": { "alert": { "title-errors-loading-rules": "Hiba történt a szabályok betöltésekor" @@ -4216,6 +5183,11 @@ "table-view-aria-label-toggletableview": "Táblázatos nézet ki- és bekapcsolása", "table-view-label-table-view": "Táblázat nézet" }, + "panel-editor": { + "text": { + "edit-panel": "" + } + }, "panel-editor-renderer": { "aria-label-open-options-pane": "Beállítások ablaktábla megnyitása", "tooltip-open-options-pane": "Beállítások ablaktábla megnyitása" @@ -4224,8 +5196,22 @@ "body-panel-plugin-not-loaded": "A vizsgálat megnyitása előtt győződjön meg arról, hogy a megvizsgálni kívánt panel látható és megjelenik.", "title-panel-plugin-not-loaded": "Panelbővítmény nincs betöltve" }, + "panel-menu-behavior": { + "async-func": { + "text": { + "extensions": "", + "metrics-drilldown": "" + } + } + }, "panel-viz-type-picker": { "placeholder-search-for": "Keresés a következőre…", + "radio-options": { + "label": { + "suggestions": "", + "visualizations": "" + } + }, "title-close": "Bezárás" }, "provisioned-delete-modal": { @@ -4252,6 +5238,15 @@ "query-options": "Lekérdezési beállítások", "selection-options": "Kijelölés beállításai" }, + "resource-export": { + "label": { + "classic": "", + "json": "JSON", + "v1-resource": "", + "v2-resource": "", + "yaml": "" + } + }, "revert-dashboard-modal": { "body-restore-version": "Biztosan visszaállítja az irányítópultot a(z) {{version}} verzióra? Az összes nem mentett módosítás elveszik.", "title-restore-version": "Verzió visszaállítása" @@ -4360,6 +5355,18 @@ "solo-panel-page": { "loading": "Betöltés" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "text-box-variable-form": { "placeholder-default-value-if-any": "(opcionális)", "text-options": "Szövegbeállítások" @@ -4370,6 +5377,13 @@ "title-field-label": { "title": "Cím" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "transformations-drawer": { "search-box-suffix": { "tooltip-clear-search": "Keresés törlése" @@ -4385,6 +5399,13 @@ "save-dashboard": "Irányítópult mentése", "title-unsaved-changes": "Nem mentett változtatások" }, + "use-dashboard-edit-page-nav": { + "page-nav": { + "text": { + "settings": "Beállítások" + } + } + }, "variable-check-indicator": { "aria-label-variable-referenced-dashboard": "Erre a változóra egyetlen változó vagy irányítópult sem hivatkozik.", "aria-label-variable-referenced-other-variables-dashboard": "Erre a változóra más változó vagy irányítópult hivatkozik.", @@ -4401,7 +5422,10 @@ "placeholder-descriptive-text": "Leírószöveg", "placeholder-label-name": "Címkenév", "placeholder-variable-name": "Változónév", - "text-running-query": "Lekérdezés futtatása…" + "text-running-query": "Lekérdezés futtatása…", + "title": { + "delete-variable": "Változó törlése" + } }, "variable-editor-list": { "definition": "Meghatározás", @@ -4583,6 +5607,25 @@ "message": "Nem található adatforrás" } }, + "datagrid": { + "add-column": { + "placeholder-column-name": "" + }, + "datagrid-context-menu": { + "render-context-menu-items": { + "label-clear-column": "", + "label-clear-row": "", + "label-remove-all-data": "", + "label-search": "Keresés…" + }, + "render-header-menu-items": { + "label-clear-column": "", + "label-delete-column": "", + "label-rename-column": "", + "label-set-field-type": "" + } + } + }, "datasources": { "add-new-data-source-button": { "tooltip-no-permission": "Nincs engedélye új adatforrások konfigurálására" @@ -4604,6 +5647,46 @@ "label-default": "Alapértelmezett", "label-name": "Név" }, + "build-categories": { + "categories": { + "title": { + "cloud": "", + "distributed-tracing": "", + "enterprise-plugins": "Vállalati bővítmények", + "industrial-io-t": "", + "logging-document-databases": "", + "others": "", + "profiling": "", + "sql": "", + "time-series-databases": "" + } + } + }, + "build-nav-model": { + "analytics": { + "text": { + "insights": "Adatok" + } + }, + "caching": { + "text": { + "cache": "" + } + }, + "ds-permissions": { + "text": { + "permissions": "Engedélyek" + } + }, + "nav-model": { + "text": { + "settings": "Beállítások" + } + }, + "text": { + "dashboards": "Irányítópultok" + } + }, "button-row": { "delete": "Törlés", "save-and-test": "Mentés és tesztelés", @@ -4639,6 +5722,11 @@ "data-source-read-only-message": { "title-provisioned-data-source": "Kiépített adatforrás" }, + "data-source-settings-reducer": { + "message": { + "testing-could-couple-minutes": "" + } + }, "data-source-type-card": { "aria-label-learn-more": "{{dataSourcePluginName}}, további információk." }, @@ -4656,13 +5744,88 @@ "footer": { "add-csv-or-spreadsheet": "CSV vagy táblázat hozzáadása" }, + "get-enterprise-phantom-plugins": { + "description": { + "adobe-analytics-datasource": "", + "app-dynamics-integration-and-data-source": "", + "atlassian-statuspage-datasource": "", + "aurora-data-source": "", + "azure-cosmos-db-datasource": "", + "azure-devops-datasource": "", + "catchpoint-datasource": "", + "cloudflare-datasource": "", + "cockroach-db-datasource": "", + "data-dog-integration-and-data-source": "", + "drone-datasource": "", + "git-lab-integration-and-datasource": "", + "honeycomb-integration-and-datasource": "", + "jira-integration-and-datasource": "", + "logic-monitor-devices-datasource": "", + "mongo-db-integration-and-data-source": "", + "netlify-datasource": "", + "new-relic-integration-and-data-source": "", + "pager-duty-datasource": "", + "salesforce-integration-and-datasource": "", + "sap-hana-integration-and-data-source": "", + "service-now-integration-and-data-source": "", + "signal-fx-integration-and-datasource": "", + "snowflake-integration-and-data-source": "", + "sumo-logic-integration-and-datasource": "", + "visualize-and-explore-dynatrace-data": "", + "visualize-and-explore-oracle-sql": "", + "visualize-and-explore-splunk-logs": "", + "wavefront-integration-and-data-source": "", + "zendesk-datasource": "" + } + }, + "get-grafana-cloud-phantom-plugin": { + "description": { + "hosted-graphite-prometheus-and-loki": "" + } + }, "new-data-source-view": { "cancel": "Mégse", "placeholder-filter-by-name-or-type": "Szűrés név vagy típus alapján" }, + "update-data-source": { + "error-info": { + "message": { + "an-unexpected-error-occurred": "" + } + } + }, "use-data-source-info": { "badge-text-not-supported": "Nem támogatott", - "badge-text-supported": "Támogatott" + "badge-text-supported": "Támogatott", + "label": { + "alerting": "Riasztás", + "type": "Típus" + } + }, + "use-delete-loaded-data-source": { + "title": { + "delete": "Törlés" + } + } + }, + "debug": { + "cursor-view": { + "no-events-yet": "" + }, + "render-info-viewer": { + "data-counter": "", + "elapsed-time": "", + "field": "Mező", + "last": "", + "render-counter": "", + "schema-counter": "", + "title-reset-counters": "", + "tooltip-step-back": "", + "type": "Típus" + }, + "state-view": { + "current-value": "", + "label-state-name": "" } }, "dimensions": { @@ -4731,6 +5894,19 @@ "remove-value-mapping-aria-label-delete-value-mapping": "Érték-hozzárendelés törlése", "remove-value-mapping-tooltip-delete": "Törlés", "set-color": "Szín beállítása", + "special-match-options": { + "description": { + "boolean-false-values": "", + "boolean-true-values": "", + "empty-string": "", + "matches-against-number-na-n-not-a-number": "", + "matches-null-and-undefined-values": "", + "matches-null-undefined-and-na-n": "" + }, + "label": { + "empty": "Üres" + } + }, "tooltip-remove-color": "Szín eltávolítása", "tooltip-remove-icon": "Ikon eltávolítása" }, @@ -4746,6 +5922,20 @@ "display-text": "Megjelenítési szöveg", "icon": "Ikon", "label-add-a-new-mapping": "Új leképezés hozzáadása", + "mapping-types": { + "description": { + "match-a-numerical-range-of-values": "", + "match-a-regular-expression-with-replacement": "", + "match-a-specific-text-value": "", + "match-boolean-empty-values": "" + }, + "label": { + "range": "", + "regex": "", + "special": "", + "value": "Érték" + } + }, "update": "Frissítés" } }, @@ -4770,6 +5960,7 @@ }, "explore": { "accordian-logs": { + "events": "", "footer": "Az esemény időbélyegei a teljes nyomon követés kezdési időpontjához viszonyítva értendők." }, "accordian-references": { @@ -4780,6 +5971,11 @@ "basic-extensions": { "aria-label-add": "Hozzáadás" }, + "build-dashboard-panel-from-explore-state": { + "title": { + "new-panel": "" + } + }, "clear": "Törlés", "confirm-navigation-modal": { "cancel": "Mégse", @@ -4866,6 +6062,33 @@ "title-table": "Táblázat", "title-traces": "Nyomvonalak" }, + "explore-query-inspector": { + "data-tab": { + "label": { + "data": "Adatok" + } + }, + "error-tab": { + "label": { + "error": "Hiba" + } + }, + "json-tab": { + "label": { + "json": "JSON" + } + }, + "query-tab": { + "label": { + "query": "Lekérdezés" + } + }, + "stats-tab": { + "label": { + "stats": "Statisztika" + } + } + }, "explore-run-query-button": { "run-button": { "aria-label-run-query-options": "Lekérdezésfuttatási beállítások" @@ -4879,10 +6102,23 @@ "description-explore-disabled": "Az Explore-t a Grafana-konfigurációban engedélyezheti:", "title-explore-disabled": "Az Explore le van tiltva" }, + "get-field-links-for-explore": { + "text": { + "data": "Adatok", + "raw-value": "" + } + }, "get-matches-metadata": { "matches": "0 találat" }, "legacy-create-span-link-factory": { + "text": { + "tags": "Címkék" + }, + "title": { + "related-logs": "", + "session-for-this-span": "Munkamenet ehhez az időtartamhoz" + }, "title-explore-metrics-for-this-span": "Fedezze fel az ehhez a terjedelemhez tartozó metrikákat", "title-explore-split": "Ehhez tartozó naplók osztott nézetben", "title-session-for-this-span": "Munkamenet ehhez az időtartamhoz" @@ -4923,6 +6159,10 @@ }, "logs-meta-row": { "download": "Letöltés", + "label": { + "deduplication-count": "", + "showing-only-selected-fields": "" + }, "show-original-line": "Eredeti sor megjelenítése" }, "logs-sample-panel": { @@ -5104,6 +6344,21 @@ "run-query-button": "Lekérdezés futtatása", "switch-datasource-button": "Adatforrás váltása és lekérdezés futtatása" }, + "scoped-vars-from-span": { + "text": { + "span": "" + } + }, + "scoped-vars-from-tags": { + "text": { + "tags": "Címkék" + } + }, + "scoped-vars-from-trace": { + "text": { + "trace": "Nyom" + } + }, "search-bar-input": { "placeholder-find": "Keresés…", "suffix": { @@ -5138,9 +6393,25 @@ "tooltip-tag-key": "Címkekulcs, amelyet a címkeérték lekérésére használnak. A rendszer a terjedelem attribútumai és erőforrásai között keresi a címkekulcsot" }, "span-detail": { + "label": { + "kind": "", + "library-name": "", + "library-version": "", + "status": "Állapot:", + "status-message": "", + "trace-state": "" + }, "label-resource-attributes": "Erőforrás-attribútumok", "label-span-attributes": "Terjedelemattribútumok", "label-stack-trace": "Stack nyomvonala", + "overview-items": { + "label": { + "child-count": "", + "duration": "", + "service": "", + "start-time": "" + } + }, "warnings": "Figyelmeztetések" }, "span-filters": { @@ -5247,6 +6518,18 @@ "title-node-graph": "Csomópontdiagram" }, "unthemed-logs": { + "description": { + "show-results-in-logs-visualisation": "", + "show-results-in-table-visualisation": "", + "show-results-newest-to-oldest": "", + "show-results-oldest-to-newest": "" + }, + "label": { + "logs": "Naplók", + "newest-first": "Újabbat előre", + "oldest-first": "Régebbit előre", + "table": "Táblázat" + }, "label-deduplication": "Duplikálás megszüntetése", "label-display-results": "Eredmények megjelenítése", "label-prettify-json": "JSON szépítése", @@ -5262,6 +6545,15 @@ }, "unthemed-virtualized-trace-view": { "title-scroll-to-top": "Görgetés a tetejére" + }, + "use-focus-span-link": { + "create-focus-span-link": { + "link": { + "title": { + "deep-link-to-this-span": "" + } + } + } } }, "export": { @@ -5347,6 +6639,15 @@ "folder-repo": { "badge-text": "Kiépítve" }, + "folders": { + "get-loading-nav": { + "main": { + "title": { + "loading": "Betöltés" + } + } + } + }, "forgot-password": { "back-button": "Vissza a bejelentkezéshez", "change-password": { @@ -5376,10 +6677,102 @@ "incomplete-request-error": "Sajnos nem sikerült teljesíteni a kérését. Próbálkozzon újra.", "send-custom-feedback": "Küldés" }, + "geomap": { + "coordinates-map-view-editor": { + "label-latitude": "", + "label-longitude": "" + }, + "debug-overlay": { + "center": "", + "zoom": "" + }, + "fit-map-view-editor": { + "all-layers-editor-fragment": { + "label-layer": "" + }, + "label-data": "Adatok", + "last-only-editor-fragment": { + "label-padding": "", + "tooltip-padding-relative-percent-beyond-extent": "" + } + }, + "frame-multi-selection-editor": { + "placeholder-change-filter": "" + }, + "frame-selection-editor": { + "placeholder-change-filter": "" + }, + "geomap-panel": { + "aria-label-map": "" + }, + "geomap-style-rules-editor": { + "aria-label-add-geomap-style-rule": "" + }, + "layers-editor": { + "label-add-layer": "", + "no-layers": "" + }, + "map-view-editor": { + "label-max-zoom": "", + "label-view": "Nézet", + "label-zoom": "Nagyítás", + "use-current-map-settings": "" + }, + "markers-legend": { + "title-symbol": "Szimbólum" + }, + "measure-overlay": { + "tooltip-show-measure-tools": "" + }, + "plugin": { + "basemap-layer-configured-server-admin": "" + }, + "style-editor": { + "label-align": "", + "label-baseline": "", + "label-color": "Szín", + "label-fill-opacity": "", + "label-font-size": "", + "label-opacity": "", + "label-rotation-angle": "", + "label-size": "", + "label-symbol": "Szimbólum", + "label-symbol-horizontal-align": "", + "label-symbol-vertical-align": "", + "label-text-label": "", + "label-x-offset": "", + "label-y-offset": "" + }, + "style-rule-editor": { + "aria-label-comparison-operator": "Összehasonlítás műveleti jele", + "aria-label-comparison-value": "", + "aria-label-delete-style-rule": "", + "aria-label-feature-property": "", + "label-rule": "Szabály", + "placeholder-feature-property": "", + "placeholder-numeric-value": "", + "placeholder-value": "érték" + } + }, "get-enterprise": { "requires-license": "Grafana Enterprise-licenc szükséges", "title": "Enterprise" }, + "gettingstarted": { + "docs-card": { + "complete": "teljes", + "learn-how": "" + }, + "getting-started": { + "aria-label-to-advanced-tutorials": "", + "aria-label-to-basic-tutorials": "", + "checking-completed-setup-steps": "", + "remove-this-panel": "" + }, + "tutorial-card": { + "complete": "teljes" + } + }, "gops": { "config-card": { "text-loading-configuration": "Konfiguráció betöltése…" @@ -5396,6 +6789,74 @@ }, "progress-status": { "your-progress": "Az Ön előrehaladása" + }, + "use-get-configuration-for-ui": { + "get-connect-data-source-configuration": { + "title": { + "connect-data-source": "" + } + }, + "title": { + "essentials": "Alapok" + } + }, + "use-get-essentials-configuration": { + "essential-content": { + "description": { + "configure-grafana-alerting": "", + "create-integration-alerting-contact-point": "", + "initialize-incident-plugin-declare-manage-incidents": "", + "practice-solving-an-incident": "", + "receive-alerts-oncall-notifications-within-environment": "", + "select-chat-ops-channels-to-route-notifications": "" + }, + "label": { + "add": "Hozzáadás", + "connect": "Kapcsolódás", + "initialize": "", + "select-integration": "", + "start-drill": "" + }, + "title": { + "add-slack-notifications-to-irm-integrations": "", + "connect-alerting-to-irm": "", + "connect-irm-to-your-slack-workspace": "", + "connect-your-messaging-workspace-to-incident": "", + "connect-your-messaging-workspace-to-on-call": "", + "create-incident-drill": "", + "detect": "Észlelés", + "initialize-incident-plugin": "", + "messaging-workspace-channel-on-call-integration": "", + "respond": "", + "test-your-configuration": "" + } + }, + "get-grafana-alerting-config-steps": { + "description": { + "create-alert-monitor-system": "", + "create-on-call-integration-alerting-contact-point": "", + "create-slos-to-monitor-your-service": "" + }, + "label": { + "connect": "Kapcsolódás", + "create": "Létrehozás", + "enable": "Engedélyezés" + }, + "steps": { + "label": { + "edit": "Szerkesztés" + }, + "title": { + "update-default-contact-point": "" + } + }, + "title": { + "connect-alerting-to-on-call": "", + "create-alert-rule": "", + "create-slo": "", + "enable-slo-alerting": "" + } + } } }, "grafana": { @@ -5762,14 +7223,18 @@ "duplicate-panel": "Panel duplikálása", "exit-edit/setting-views": "Kilépés a szerkesztési/beállítási nézetekből", "expand-all-rows": "Minden sor kibontása", + "explore-panel": "", "go-to-dashboards": "Ugrás az irányítópultokhoz", "go-to-explore": "Ugrás az Explore-hoz", "go-to-home-dashboard": "Ugrás a kezdő irányítópulthoz", "go-to-profile": "Ugrás a profilhoz", + "inspect-panel": "", "make-time-range-permanent": "Időtartomány abszolúttá/állandóvá tétele", "move-time-range-back": "Időtartomány mozgatása hátra", "move-time-range-forward": "Időtartomány mozgatása előre", "open-search": "Keresés megnyitása", + "open-share-embed-drawer": "", + "open-share-link-drawer": "", "open-shared-modal": "Panel pillanatképének megosztása", "paste-time-range": "Időtartomány beillesztése", "refresh-all-panels": "Minden panel frissítése", @@ -5795,6 +7260,11 @@ "support-bundle": "A < 1 >támogatási csomagokról szóló részben</1> a Grafana-példányra és a konfigurált adatforrásokra vonatkozó információkat tartalmazó támogatási csomagot is lekérheti.", "troubleshooting-help": "Hibaelhárítási segítség kéréséhez küldjön egy pillanatfelvételt erről a panelről a Grafana Labs műszaki ügyfélszolgálatának. A pillanatfelvétel lekérdezési válaszadatokat és panelbeállításokat tartalmaz." }, + "histogram": { + "histogram-panel": { + "no-histogram-found-in-response": "" + } + }, "inspector": { "inspect-data-tab": { "loading": "Betöltés", @@ -5844,6 +7314,9 @@ "label-name": "Név", "label-password": "Jelszó", "label-username": "Felhasználónév", + "message": { + "email-is-invalid": "" + }, "placeholder-name-optional": "Név (opcionális)", "placeholder-password": "Jelszó", "placeholder-username": "Felhasználónév", @@ -6103,8 +7576,26 @@ "discard-local-changes": "Helyi módosítások elvetése", "title-dashboard-changed": "Irányítópult módosítva" }, + "live-channel-editor": { + "description-grafana-live": "", + "namespace": "Névtér", + "path": "Útvonal", + "placeholder-select-watchable-resource": "", + "scope": "", + "title-grafana-live": "" + }, "live-connection-warning": { "title-connection-to-server-is-lost": "Megszakadt a kapcsolat a kiszolgálóval…" + }, + "live-panel": { + "error": "Hiba", + "grafana-requires-feature": "", + "panel-editor-channel": "", + "title-grafana-live": "", + "waiting-for-data": "" + }, + "live-publish": { + "publish": "" } }, "lock-icon": "lakat ikon", @@ -6151,6 +7642,13 @@ } }, "logs": { + "get-dataframe-fields": { + "vars": { + "text": { + "labels": "Címkék" + } + } + }, "infinite-scroll": { "end-of-range": "A kijelölt időtartomány vége.", "load-more": "Továbbiak betöltéséhez görgessen le", @@ -6231,6 +7729,11 @@ "shortcut": "alt+kijelölés az újbóli engedélyezéshez" } }, + "log-series-to-logs-model": { + "label": { + "total-bytes-processed": "" + } + }, "logs-controls": { "deduplication": "Duplikálás megszüntetése", "disable-highlighting": "Kiemelés letiltása", @@ -6265,6 +7768,11 @@ "scroll-top": "Görgetés a tetejére", "start-of-range": "Tartomány kezdete" }, + "logs-panel": { + "render-common-labels": { + "common-labels": "" + } + }, "out-of-range-message": { "end-of-the-selected-time-range": "A kijelölt időtartomány vége." }, @@ -6321,6 +7829,14 @@ }, "snapshot-list-table": { "title-delete": "Törlés" + }, + "unthemed-dashboard-import": { + "subTitle": { + "import-dashboard-from-file-or-grafanacom": "" + }, + "text": { + "import-dashboard": "Irányítópult importálása" + } } }, "migrate-to-cloud": { @@ -6978,8 +8494,57 @@ "close": "Fiók bezárása" }, "link-title": "Tovább a Grafana labs blogjára", + "news-panel": { + "body-error-loading-rss-feed": "", + "loading": "Betöltés…", + "title-error-loading-rss-feed": "" + }, "title": "Újdonságok a blogról" }, + "nodeGraph": { + "arc-options-editor": { + "add-arc": "", + "title-remove-arc": "" + }, + "edge": { + "aria-label-from-to": "" + }, + "edge-header": { + "label-source-target": "" + }, + "marker": { + "100-node-count": "", + "aria-label-hidden-marker": "", + "node-count_one": "", + "node-count_other": "" + }, + "node": { + "aria-label-node-title": "" + }, + "node-graph": { + "aria-label-layered-layout-performance-warning": "", + "aria-label-nodes-hidden-warning": "", + "computing-layout": "", + "no-data": "Nincs adat", + "hidden-nodes_one": "", + "hidden-nodes_other": "", + "processed-nodes_one": "", + "processed-nodes_other": "" + }, + "node-graph-panel": { + "no-data-found-in-response": "" + }, + "node-header": { + "label-subtitle": "", + "label-title": "Cím" + }, + "view-controls": { + "hide-config": "", + "show-config": "", + "title-zoom-in": "", + "title-zoom-out": "" + } + }, "notifications": { "empty-state": { "description": "Itt jelennek meg a kapott értesítések", @@ -7021,6 +8586,11 @@ "label-organization-name": "Szervezet neve", "placeholder-org-name": "Szervezet neve" }, + "org-details-page": { + "title": { + "confirm-preferences-update": "" + } + }, "org-profile": { "label-organization-name": "Szervezet neve", "label-organization-profile": "Szervezeti profil", @@ -7040,7 +8610,10 @@ "tooltip": "Most kiválaszthatja a „Nincs alapvető szerepkör” opciót, és az egyéni igényeinek megfelelő engedélyeket adhat hozzá. További információt a <1>dokumentációnkban</1> talál." }, "user-invite-page": { - "sub-title": "Meghívó küldése vagy meglévő Grafana-felhasználó hozzáadása a szervezethez.<1>{{orgName}}</1>" + "sub-title": "Meghívó küldése vagy meglévő Grafana-felhasználó hozzáadása a szervezethez.<1>{{orgName}}</1>", + "text": { + "invite-user": "" + } } }, "org-picker": { @@ -7052,6 +8625,38 @@ } }, "panel": { + "get-calculation-value-data-links-variable-suggestions": { + "value-calc-var": { + "label": { + "calculation-name": "" + } + } + }, + "get-data-links-variable-suggestions": { + "value-time-var": { + "label": { + "time": "Idő" + } + } + }, + "get-field-links-supplier": { + "text": { + "data": "Adatok", + "field": "Mező", + "series": "", + "value": "Érték" + } + }, + "get-field-vars": { + "label": { + "name": "Név" + } + }, + "get-panel-links-variable-suggestions": { + "label": { + "all-variables": "" + } + }, "header-menu": { "copy": "Másolás", "create-library-panel": "Könyvtárpanel létrehozása", @@ -7112,6 +8717,13 @@ "select-placeholder": "Szűrés típus szerint" }, "playlist": { + "playlist-new-page": { + "page-nav": { + "text": { + "new-playlist": "Új lejátszási lista" + } + } + }, "playlist-table-rows": { "aria-label-playlist-item": "Lejátszásilista-elem, {{itemType}}, {{itemValue}}", "multiple-dashboards-found": "Több találat: {{items}}", @@ -7128,6 +8740,12 @@ "label-mode": "Üzemmód", "label-time-and-refresh": "Idő és frissítés", "label-variables": "Változók", + "modes": { + "label": { + "kiosk": "Kioszk", + "normal": "Normál" + } + }, "title-start-playlist": "Lejátszási lista indítása" } }, @@ -7194,6 +8812,19 @@ }, "browse": { "aria-label-plugin-type-filter": "Bővítménytípus-szűrő", + "filter-by-options": { + "label": { + "all": "Összes", + "installed": "Telepítve", + "new-updates": "" + } + }, + "label": { + "all": "Összes", + "applications": "", + "data-sources": "Adatforrások", + "panels": "Panelek" + }, "label-search": "Keresés", "label-state": "Állapot", "label-type": "Típus", @@ -7275,12 +8906,24 @@ "empty-state": { "message": "Nem található bővítmény" }, + "extensions-log-data-source": { + "message": { + "ok": "OK" + } + }, "filter": { "disabled": "Ez a szűrő le van tiltva, mert a Grafana-kiszolgáló nem fér hozzá a grafana.com webhelyhez", "sort": "Rendezés", "sort-list": "Bővítmények listájának rendezése", "state": "Állapot" }, + "get-feature-state-info": { + "text": { + "alpha": "", + "beta": "Béta", + "deprecated": "Elavult" + } + }, "get-started-with-app": { "disable": "Letiltás", "enable": "Engedélyezés" @@ -7337,6 +8980,16 @@ "plugin-details-header-dependencies": { "grafana-dependency": "Grafana {{grafanaDependency}}" }, + "plugin-details-page": { + "not-found-model": { + "subTitle": { + "requested-belong-plugin": "" + }, + "text": { + "unknown-plugin": "" + } + } + }, "plugin-details-signature": { "body-invalid-plugin-signature": "A Grafana Labs minden egyes bővítményt ellenőriz, hogy rendelkezik-e érvényes digitális aláírással. A bővítményaláírás ellenőrzése a biztonsági intézkedéseink része, amelyek biztosítják a bővítmények biztonságosságát és megbízhatóságát. A Grafana Labs nem tudja garantálni ennek az aláíratlan bővítménynek az integritását. Kérje meg a bővítmény szerzőjét, hogy kérje a bővítmény aláírását.", "read-more-about-plugins-signing": "További információ a bővítmények aláírásáról.", @@ -7382,6 +9035,13 @@ "search-field": { "placeholder-search-grafana-plugins": "Grafana-bővítmények keresése" }, + "use-plugin-details-tabs": { + "nav-model-children": { + "text": { + "dashboards": "Irányítópultok" + } + } + }, "version-install-button": { "text-installed": "Telepítve" }, @@ -7499,6 +9159,11 @@ "label-git-hub-features": "GitHub-funkciók", "label-realtime-feedback": "Valós idejű visszajelzés" }, + "connect-page": { + "subTitle": { + "connect-external-storage-manage-resources": "" + } + }, "connect-repository-button": { "configure": "Konfigurálás", "configure-file": "Fájlkiépítés konfigurálása", @@ -7532,7 +9197,13 @@ }, "edit-repository-page": { "back-to-repositories": "Vissza az adattárakhoz", - "repository-config-exists-configuration": "Győződjön meg arról, hogy a tároló konfigurációja létezik a konfigurációs fájlban." + "repository-config-exists-configuration": "Győződjön meg arról, hogy a tároló konfigurációja létezik a konfigurációs fájlban.", + "subTitle": { + "configure-repository-storing-resources": "" + }, + "text": { + "configure-repository": "" + } }, "empty-state": { "no-jobs": "Nincsenek feladatok…" @@ -7595,6 +9266,11 @@ "no-results-matching-your-query": "Nincs találat a lekérdezésre", "placeholder-search": "Keresés" }, + "get-default-values": { + "title": { + "repository": "Adattár" + } + }, "getting-started": { "alert-temporary-outage": "Ha az egész példányt csatlakoztatja, az áttelepítés futtatása során az irányítópultok nem lesznek elérhetők. Javasoljuk, hogy a folyamat megkezdése előtt figyelmeztesse a felhasználókat.", "modal-description-public-access": "Nyilvános hozzáférés beállítása a Grafana-példányhoz a GitHub-integráció engedélyezéséhez", @@ -7739,7 +9415,18 @@ "dashboard-preview": "Irányítópult előnézete", "existing-dashboard": "Meglévő irányítópult", "history": "Előzmények", + "message": { + "removed-from-repo-test-ui": "", + "updated-from-repo-test-ui": "" + }, "repository": "Adattár", + "tab-info": { + "label": { + "dry-run-result-after-apply": "", + "existing-from-grafana": "", + "file-from-repository": "" + } + }, "title-error-saving-file": "Hiba a fájl mentése közben" }, "setup-modal": { @@ -8152,14 +9839,6 @@ "reload-button": "Újratöltés", "title": "Nem található az alkalmazásfájl" }, - "sandbox": { - "test-stuff-page": { - "application-notifications-toasts-testing": "Alkalmazásértesítések (felugró értesítések) tesztelése", - "error": "Hiba", - "success": "Sikerült", - "warning": "Figyelmeztetés" - } - }, "save-dashboards": { "message-length": { "info": "Az üzenet {{messageLength}} karakter hosszú, amely meghaladja a maximális 500 karaktert. Kérjük, mentés előtt rövidítse le.", @@ -8219,6 +9898,14 @@ "view-as-folders": "Nézet mappák szerint", "view-as-list": "Listanézet" }, + "bluge-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } + }, "dashboard-actions": { "import": "Importálás", "new": "Új", @@ -8246,6 +9933,14 @@ "search-results-table": { "aria-label-search-results-table": "Keresési eredmények táblázata", "no-data": "Nincsenek értékek" + }, + "unified-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } } }, "select": { @@ -8317,6 +10012,11 @@ "delete-service-account": "Szolgáltatási fiók törlése", "disable-service-account": "Szolgáltatási fiók letiltása", "enable-service-account": "Szolgáltatási fiók engedélyezése", + "page-nav": { + "subTitle": { + "manage-settings-individual-service-account": "" + } + }, "title-delete-service-account": "Szolgáltatási fiók törlése", "title-disable-service-account": "Szolgáltatási fiók letiltása", "tokens": "Tokenek", @@ -8633,6 +10333,12 @@ "sort-picker": { "select-aria-label": "Rendezés" }, + "status-history": { + "status-history-panel": { + "too-many-points_one": "", + "too-many-points_other": "" + } + }, "support-bundles": { "new-bundle-button": { "new-support-bundle": "Új támogatási csomag" @@ -8640,7 +10346,10 @@ "support-bundles-create-unconnected": { "cancel": "Mégse", "create": "Létrehozás", - "sub-title": "Válassza ki a támogatási csomag összetevőit. A támogatási csomag a létrehozás után 3 napig lesz elérhető." + "sub-title": "Válassza ki a támogatási csomag összetevőit. A támogatási csomag a létrehozás után 3 napig lesz elérhető.", + "text": { + "create-support-bundle": "" + } }, "support-bundles-unconnected": { "created-on": "Létrehozva:", @@ -8655,10 +10364,35 @@ "login": "Bejelentkezés" }, "table": { + "auto-cell-options-editor": { + "description-wrap-text": "", + "label-wrap-text": "" + }, + "bar-gauge-cell-options-editor": { + "label-gauge-display-mode": "", + "label-value-display": "" + }, + "color-background-cell-options-editor": { + "description-apply-to-entire-row": "", + "description-wrap-text": "", + "label": { + "text-alpha": "" + }, + "label-apply-to-entire-row": "", + "label-background-display-mode": "", + "label-wrap-text": "", + "wrap-text": "" + }, "container": { "content": "Ha túl sok oszlopot jelenít meg egyetlen táblázatban, az hatással lehet a teljesítményre, és megnehezítheti az adatok olvasását. Mérlegelje a lekérdezések pontosítását.", "show-all-series": "Összes oszlop megjelenítése", "show-only-series": "Csak {{MAX_NUMBER_OF_COLUMNS}} oszlop megjelenítése" + }, + "image-cell-options-editor": { + "description-alt-text": "", + "description-title-text": "", + "label-alt-text": "", + "label-title-text": "" } }, "tag-filter": { @@ -8674,6 +10408,24 @@ "select-placeholder": "Csapat kijelölése" }, "teams": { + "build-nav-model": { + "nav-model": { + "subTitle": { + "manage-members-and-settings": "" + }, + "text": { + "settings": "Beállítások" + } + }, + "team-group-sync": { + "text": { + "external-group-sync": "Külső csoport szinkronizálása" + } + }, + "text": { + "members": "Tagok" + } + }, "create-team": { "create": "Létrehozás", "description-email": "Ez nem kötelező, és elsősorban egyéni csapatavatárok engedélyezésére szolgál", @@ -8695,6 +10447,9 @@ "external-group-sync": "Külső csoport szinkronizálása", "label-add-external-group": "Külső csoport hozzáadása", "team-sync-upgrade": "Csoport hozzáadása a csapatszinkronizálás ingyenes engedélyezéséhez a Grafana Pro próbaidőszaka alatt", + "text": { + "add-group": "Csoport hozzáadása" + }, "title-there-external-groups": "Nincsenek szinkronizálandó külső csoportok", "tooltip-add-external-group": "Példa LDAP-csoportra: {{example}}" }, @@ -8796,6 +10551,42 @@ "select-search-input": "Írja be a keresendő szöveget (ország, város, rövidítés)" } }, + "timeseries": { + "annotation-editor2": { + "add-annotation": "Jegyzet hozzáadása", + "cancel": "Mégse", + "edit-annotation": "", + "label-description": "Leírás", + "label-tags": "Címkék", + "placeholder-add-tags": "", + "save": "Mentés", + "saving": "Mentés" + }, + "annotation-tooltip2": { + "tooltip-delete": "Törlés", + "tooltip-edit": "Szerkesztés" + }, + "line-style-editor": { + "title-the-input-expects-a-segment-list": "", + "tooltip-help": "Súgó" + }, + "nulls-threshold-input": { + "placeholder-never": "Soha" + }, + "outside-range-plugin": { + "data-outside-time-range": "", + "zoom-to-data": "" + }, + "timezones-editor": { + "tooltip-add-timezone": "", + "tooltip-remove-timezone": "" + } + }, + "traces": { + "traces-panel": { + "no-data-found-in-response": "" + } + }, "transformations": { "empty": { "add-transformation-body": "A transzformációk lehetővé teszik az adatok különböző módon történő megváltoztatását a vizualizáció megjelenítése előtt.<1></1>Ez magában foglalja az adatok egyesítését, a mezők átnevezését, a számítások elvégzését, az adatok formázását a megjelenítéshez stb.", @@ -8832,6 +10623,10 @@ "convert-field-type-transformer-editor": { "aria-label-add-a-convert-field-type-transformer": "Konvertálandó mezőtípusú transzformátor hozzáadása", "aria-label-remove-convert-field-type-transformer": "Konvertálandó mezőtípusú transzformátor eltávolítása", + "label": { + "browser": "Böngésző", + "utc": "" + }, "label-as": "mint", "label-date-format": "Dátumformátum", "label-field": "Mező", @@ -8918,11 +10713,32 @@ "tooltip-format": "A <2>Moment.js formátumú karakterlánc</2> mező kimeneti formátuma.", "tooltip-timezone-manually": "A dátum időzónájának manuális beállítása" }, + "get-timezone-options": { + "label": { + "browser": "Böngésző", + "utc": "" + } + }, "get-tooltips": { "description": "Egy json-objektum érvényes útvonala.", "json-value": "JSON-érték:", + "map-valid-paths": { + "description": { + "extract-fields-from-object": "", + "extract-value": "", + "extract-value-first-element": "", + "extract-value-second-element": "" + } + }, "valid-paths": "Érvényes útvonalak:" }, + "get-transformer-option-pane": { + "root": { + "title": { + "root": "" + } + } + }, "group-by-field-configuration": { "placeholder-ignored": "Mellőzve", "placeholder-select-stats": "Statisztikák kijelölése" @@ -8939,7 +10755,23 @@ "label-cell-value": "Cellaérték", "label-column": "Oszlop", "label-empty-value": "Üres érték", - "label-row": "Sor" + "label-row": "Sor", + "special-value-options": { + "description": { + "boolean-false-value": "", + "boolean-true-value": "", + "empty-string": "", + "null-value": "", + "number-value": "" + }, + "label": { + "empty": "Üres", + "false": "", + "null": "", + "true": "", + "zero": "" + } + } }, "histogram-transformer-editor": { "placeholder-auto": "Automatikus", @@ -9002,10 +10834,22 @@ "tooltip-naming": "Beállítja, hogyan jelenjen meg a kijelölt mezők neve. Mivel a keret neve általában jobb a táblázatos adatokhoz" }, "partition-by-values-editor": { + "keep-fields-options": { + "label": { + "no": "Nem", + "yes": "Igen" + } + }, "label-field": "Mező", "label-keep-fields": "Mezők megtartása", "label-naming": "Elnevezés", "label-select-field": "Mező kijelölése", + "naming-modes-options": { + "label": { + "as-frame-name": "", + "as-label": "" + } + }, "partition-values-works-single-frame": "Az értékek szerinti partíció csak egyetlen kerettel működik.", "tooltip-keeps-partition-fields-frames": "A partíciós mezőket a keretekben tartja" }, @@ -9027,6 +10871,16 @@ "label-include-time": "Idővel együtt", "label-labels-to-fields": "Címkék mezőkhöz", "label-mode": "Üzemmód", + "modes": { + "description": { + "collapse-field-single-value": "", + "create-table-series-value": "" + }, + "label": { + "reduce-fields": "", + "series-to-rows": "" + } + }, "placeholder-choose-stat": "Válasszon statisztikát" }, "regex-matcher-editor": { @@ -9034,11 +10888,23 @@ "variable-regex-documentation": "" }, "regression-transformer-editor": { + "label": { + "cubic": "", + "quadratic": "", + "quartic": "", + "quintic": "" + }, "label-degree": "Fok", "label-model-type": "Modelltípus", "label-predicted-points": "Előre jelzett pontok", "label-x-field": "X mező", "label-y-field": "Y mező", + "model-type-options": { + "label": { + "linear": "", + "polynomial": "" + } + }, "tooltip-number-of-xy-points-to-predict": "Előre jelzendő X,Y pontok száma" }, "rename-by-regex-transformer-editor": { @@ -9056,6 +10922,23 @@ "label-reverse": "Fordított", "placeholder-select-field": "Mező kijelölése" }, + "supplier": { + "description": { + "apply-spatial-operations-to-the-geometry": "", + "create-a-line-between-two-points": "", + "geometry-define-field-headingdistancearea": "" + }, + "label": { + "area": "", + "as-line": "", + "calculate-value": "", + "distance": "", + "heading": "", + "line-builder": "", + "prepare-spatial-field": "", + "transform": "" + } + }, "time-series-table-transform-editor": { "label-stat": "Statisztika", "label-time-field": "Időmező", @@ -9089,7 +10972,19 @@ "placeholder-auto": "Automatikus", "placeholder-field": "Mező", "tooltip-window-size": "Ablakméret", - "tooltip-window-size-percent": "Az ablakméret beállítása a teljes adat százalékában" + "tooltip-window-size-percent": "Az ablakméret beállítása a teljes adat százalékában", + "type-options": { + "label": { + "centered": "", + "trailing": "" + } + }, + "window-size-mode-options": { + "label": { + "fixed": "", + "percentage": "" + } + } } }, "upgrade-box": { @@ -9146,6 +11041,11 @@ }, "users-action-bar-unconnected": { "invite": "Meghívás", + "options": { + "label": { + "users": "Felhasználók" + } + }, "placeholder-search-login-email": "Felhasználó keresése felhasználónév, e-mail-cím vagy név alapján" } }, @@ -9189,6 +11089,32 @@ "confirm-delete-modal": { "title-delete-variable": "Változó törlése" }, + "create-ad-hoc-variable-adapter": { + "description": { + "add-keyvalue-filters-on-the-fly": "" + } + }, + "create-custom-variable-adapter": { + "description": { + "define-variable-values-manually": "" + } + }, + "create-interval-variable-adapter": { + "description": { + "define-timespan-interval": "" + } + }, + "create-query-variable-adapter": { + "description": { + "variable-values-fetched-datasource-query": "" + } + }, + "data-source-variable-slice": { + "text": { + "default": "", + "no-data-sources-found": "Nem található adatforrás" + } + }, "empty-state": { "button-title": "Változó hozzáadása", "info-box-content": "A változók interaktívabb és dinamikusabb irányítópultot tesznek lehetővé. Használhat változókat ahelyett, hogy a metrikalekérdezésekben rögzítené az olyan dolgokat, mint a kiszolgálók vagy az érzékelők nevei. A változók listamezőként jelennek meg az irányítópult tetején. Ezek a legördülő listák megkönnyítik az irányítópulton megjelenő adatok módosítását.", @@ -9215,6 +11141,13 @@ "placeholder-default-value-if-any": "alapértelmezett érték, ha van", "text-options": "Szövegbeállítások" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "unknown-table": { "loading": "Betöltés...", "no-unknowns": "Nem található átnevezett vagy hiányzó változó.", @@ -9271,5 +11204,25 @@ "data-hover-view": { "link": "Hivatkozás" } + }, + "welcome": { + "welcome-banner": { + "need-help": "Segítségre van szüksége?", + "welcome-to-grafana": "" + } + }, + "xychart": { + "series-editor": { + "add-series": "", + "aria-label-select-series": "", + "label-color-field": "", + "label-frame": "Keret", + "label-size-field": "", + "label-x-field": "X mező", + "label-y-field": "Y mező", + "placeholder-all-frames": "", + "placeholder-select-frame": "", + "tooltip-delete-series": "" + } } } \ No newline at end of file diff --git a/public/locales/i18next-parser.config.cjs b/public/locales/i18next-parser.config.cjs index 3a1b821e06e..10f3bf00594 100644 --- a/public/locales/i18next-parser.config.cjs +++ b/public/locales/i18next-parser.config.cjs @@ -12,7 +12,7 @@ module.exports = { input: [ '../../public/**/*.{tsx,ts}', '!../../public/app/extensions/**/*', // Don't extract from Enterprise - '!../../public/app/plugins/**/*', // Don't extract from core plugins + '!../../public/app/plugins/datasource/**/*', // Don't extract from datasource plugins '../../packages/grafana-ui/**/*.{tsx,ts}', ], output: './public/locales/$LOCALE/$NAMESPACE.json', diff --git a/public/locales/id-ID/grafana.json b/public/locales/id-ID/grafana.json index 82a3115339d..cc26cf74fde 100644 --- a/public/locales/id-ID/grafana.json +++ b/public/locales/id-ID/grafana.json @@ -72,6 +72,11 @@ }, "admin-edit-org-page": { "label-name": "Nama", + "page-nav": { + "subTitle": { + "manage-settings-roles-organization": "" + } + }, "render-missing-permission-message": { "title-access-denied": "Akses ditolak" } @@ -233,6 +238,13 @@ "upgrade-info": { "title": "Lisensi Enterprise" }, + "user-admin-page": { + "page-nav": { + "subTitle": { + "manage-settings-for-an-individual-user": "" + } + } + }, "user-create-page": { "label-email": "Email", "label-name": "Nama", @@ -243,9 +255,16 @@ "label-ldap": "LDAP" }, "user-list-admin-page-un-connected": { + "label": { + "active-last-days": "", + "all-users": "Semua pengguna" + }, "placeholder-search-login-email": "Cari pengguna berdasarkan login, email, atau nama." }, "user-list-anonymous-devices-page-un-connected": { + "label": { + "active-last-days": "" + }, "placeholder-search-devices-by-ip-address": "Cari perangkat berdasarkan alamat IP." }, "user-list-page": { @@ -364,6 +383,12 @@ "no-grouping": "Tidak ada pengelompokan" }, "alert-group-alerts-table": { + "columns": { + "label": { + "instance-labels": "", + "notification-state": "Status pemberitahuan" + } + }, "duration": "untuk {{time}}" }, "alert-group-filter": { @@ -439,6 +464,11 @@ "description-section": "Masukkan nama untuk mengidentifikasi {{entityName}} Anda.", "label-metric": "Metrik", "label-name": "Nama", + "message": { + "must-enter-a-metric-name": "", + "must-enter-a-name": "", + "please-select-a-data-source": "Pilih sumber data" + }, "metric-aria-label-metric": "metrik", "metric-placeholder-recorded-metric": "Beri nama metrik rekaman baru", "placeholder-name": "Beri nama {{namePlaceholder}} Anda", @@ -491,6 +521,9 @@ "alertmanager-config": { "gma-manual-configuration-description": "Konfigurasi internal Alertmanager Grafana tidak dapat diubah secara manual. Untuk mengubah konfigurasi ini, edit setiap sumber daya melalui UI.", "gma-manual-configuration-is-not-supported": "Perubahan konfigurasi manual tidak didukung", + "message": { + "configuration-cannot-be-empty": "" + }, "reset": "Atur ulang", "reset-confirmation": "Anda yakin ingin mengatur ulang konfigurasi untuk \"{{alertmanagerName}}\"? Titik kontak dan kebijakan pemberitahuan akan diatur ulang ke default.", "resetting-configuration-might-while": "Mengatur ulang konfigurasi, harap tunggu.", @@ -580,6 +613,9 @@ "create-a-contact-point": "Buat titik kontak", "label-default-contact-point": "Titik kontak default", "label-timing-options": "Opsi pengaturan waktu", + "message": { + "required": "" + }, "or": "atau" }, "am-routes-expanded-form": { @@ -601,11 +637,19 @@ "label-override-grouping": "Timpa pengelompokan", "label-value": "Nilai", "matching-labels": "Label yang cocok", + "message": { + "required": "" + }, "placeholder-label": "label", "placeholder-value": "nilai", "remove": "Hapus", "tooltip-remove-matcher": "Hapus pencocok" }, + "annotation-header-field": { + "message": { + "required": "" + } + }, "annotations": { "dashboard-annotation-field": { "dashboard": "Dasbor {{dashboardUid}}", @@ -677,6 +721,25 @@ "title": "Tidak dapat menampilkan semua kejadian" } }, + "central-alert-history-scene": { + "scene": { + "labels-filter-variable": { + "label": { + "labels": "" + } + }, + "transitions-from-filter-variable": { + "label": { + "start-state": "" + } + }, + "transitions-to-filter-variable": { + "label": { + "end-state": "" + } + } + } + }, "channel-sub-form": { "delete": "Hapus", "duplicate": "Duplikasikan", @@ -713,11 +776,17 @@ }, "cloud-data-source-selector": { "label": "Pilih sumber data", - "label-disabled": "Sumber data" + "label-disabled": "Sumber data", + "message": { + "please-select-a-data-source": "Pilih sumber data" + } }, "cloud-evaluation-behavior": { "description-pending-period": "Periode ketika syarat ambang batas harus dipenuhi untuk memicu peringatan. Memilih \"Tidak Ada\" akan segera memicu peringatan setelah syarat terpenuhi.", "label-pending-period": "Periode tertunda", + "message": { + "must-be-a-positive-integer": "" + }, "title-set-evaluation-behavior": "Atur perilaku evaluasi" }, "cloud-receiver-form": { @@ -758,6 +827,9 @@ "contact-point-selector": { "aria-label-refresh-contact-points": "Muat ulang titik kontak", "contact-point-picker-label-contact-point": "Titik kontak", + "message": { + "contact-point-is-required": "" + }, "title-failed-to-fetch-contact-points": "Gagal mengambil titik kontak", "tooltip-refresh-contact-points-list": "Muat ulang daftar titik kontak" }, @@ -822,6 +894,14 @@ }, "copy-to-clipboard": "Salin \"{{label}}\" ke papan klip", "create-metadata": { + "label": { + "dashboard": "Dasbor", + "dashboard-and-panel": "", + "evaluation-interval": "Interval evaluasi", + "labels": "Label", + "metric-name": "", + "runbook-url": "" + }, "view-dashboard": "Lihat dasbor", "view-panel": "Lihat panel" }, @@ -862,9 +942,6 @@ "title-search-panel": "Panel pencarian", "title-select-dashboard-and-panel": "Pilih dasbor dan panel" }, - "data-source-section": { - "import-to-grafana": "Impor ke aturan Grafana" - }, "datasource-not-found": { "card-description": "Sumber data untuk kueri ini tidak ditemukan, ini mungkin karena sumber data dihapus atau tidak diinstal dengan benar.", "remove-query": "Hapus kueri", @@ -946,6 +1023,11 @@ "text-loading-template": "Memuat templat...", "title-failed-to-fetch-notification-template": "Gagal mengambil templat pemberitahuan" }, + "edit-mute-timing-page": { + "text": { + "edit-time-interval": "" + } + }, "editor": { "edit-alert-rule": "", "edit-recording-rule": "", @@ -959,6 +1041,11 @@ "error-summary-button": { "content-show-all-errors": "" }, + "evaluate-every-validation-options": { + "message": { + "required": "" + } + }, "evaluation-behavior-summary": { "evaluate": "", "label-evaluate": "Evaluasi", @@ -976,6 +1063,9 @@ "evaluation-group-creation-modal": { "description-group-name": "Grup mengevaluasi semua aturannya selama interval evaluasi yang sama.", "description-often-rules-group-evaluated": "Seberapa sering semua aturan dalam grup dievaluasi.", + "message": { + "required": "" + }, "placeholder-enter-a-name": "Masukkan nama", "title-new-evaluation-group": "Grup evaluasi baru" }, @@ -998,12 +1088,24 @@ "title-permission-editrecreate-silence": "Anda tidak memiliki izin untuk mengedit/membuat ulang kesenyapan ini", "title-silence-not-found": "Kesenyapan yang ada \"{{silenceId}}\" tidak ditemukan" }, + "existing-silence-editor-page": { + "page-nav": { + "text": { + "edit-silence": "" + } + } + }, "export": { "subtitle": { "formats": "Pilih format dan unduh file atau salin konten ke papan klip", "one-format": "Unduh file atau salin konten ke papan klip" } }, + "export-new-grafana-rule-page": { + "text": { + "export-new-grafana-rule": "" + } + }, "export-new-rule-button": { "tooltip-export-new-grafana-rule": "Ekspor aturan grafana baru" }, @@ -1029,6 +1131,16 @@ "no-data": "Tidak ada data", "page-counter": "" }, + "feature-toggle-page": { + "nav-model": { + "subTitle": { + "enable-alerting-grafana-config": "" + }, + "text": { + "alerting-is-not-enabled": "" + } + } + }, "federated-rule-warning": { "experimental": "Saat ini, grup aturan gabungan adalah fitur eksperimental.", "read-documentation": "Baca dokumentasi", @@ -1036,6 +1148,13 @@ }, "file-export-inline-documentation": { "api-provisioning": "Format {{name}} hanya berlaku untuk Penyediaan API. <3>Baca selengkapnya di dokumen.</3>", + "export-inline-doc": { + "title": { + "apiprovisioning-format": "", + "fileprovisioning-format": "", + "terraformprovisioning-format": "" + } + }, "file-provisioning": "Format {{name}} hanya berlaku untuk Penyediaan File. <3>Baca selengkapnya di dokumen.</3>", "terraform-provisioning": "Format {{name}} hanya berlaku untuk Penyediaan Terraform. <3>Baca selengkapnya di dokumen.</3>" }, @@ -1043,6 +1162,20 @@ "copy-code": "Salin kode", "download": "Unduh" }, + "filter-options": { + "label": { + "alert-rule": "Aturan peringatan", + "all": "Semua", + "error": "Kesalahan", + "firing": "", + "no-data": "Tidak ada data", + "normal": "Normal", + "ok": "OK", + "pending": "Tertunda", + "recording-rule": "Aturan pencatatan", + "recovering": "Memulihkan" + } + }, "filter-view-results": { "aria-label-filteredrulelist": "filtered-rule-list" }, @@ -1077,7 +1210,10 @@ } }, "folder-selector": { - "description-select-folder": "Pilih folder untuk menyimpan aturan Anda." + "description-select-folder": "Pilih folder untuk menyimpan aturan Anda.", + "message": { + "select-a-folder": "" + } }, "folderAndGroup": { "evaluation": { @@ -1092,15 +1228,88 @@ "for-input": { "description-pending": "Periode ketika syarat ambang batas harus dipenuhi untuk memicu peringatan. Memilih \"Tidak Ada\" akan segera memicu peringatan setelah syarat terpenuhi." }, + "for-validation-options": { + "message": { + "required": "" + } + }, "generate-alert-data-modal": { "add-alert-data": "Tambah data peringatan", "add-alert-data-to-payload": "Tambahkan data peringatan ke payload", + "alert-options": { + "label": { + "firing": "", + "resolved": "" + } + }, "review-alert-payload": " Tinjau data peringatan untuk ditambahkan ke payload:", "title-add-custom-alerts": "Tambah peringatan kustom" }, + "get-alert-suggestions": { + "documentation": { + "annotations-attached-alert": "", + "fingerprint-identify-alert": "", + "grafana-external-alertmanager": "", + "organization-alert": "", + "time-the-alert-started-firing": "" + }, + "value": { + "labels-attached-alert": "", + "status-alert-firing-resolved": "" + } + }, + "get-cloud-scenes": { + "title": { + "mimir-alertmanager": "" + } + }, + "get-global-suggestions": { + "value": { + "an-array-containing-all-alerts": "" + } + }, + "get-grafana-alertmanager-scenes": { + "title": { + "grafana-alertmanager": "" + } + }, + "get-grafana-managed-scenes": { + "title": { + "grafanamanaged-alert-rules": "Aturan peringatan yang dikelola Grafana" + } + }, + "get-mimir-managed-rules-per-group-scenes": { + "rule-group-handler": { + "label": { + "rule-group": "" + } + }, + "title": { + "mimirmanaged-alert-rules-per-rule-group": "" + } + }, + "get-mimir-managed-rules-scenes": { + "title": { + "mimirmanaged-alert-rules": "" + } + }, "get-preview-results": { "title-error": "Kesalahan" }, + "get-state-display-model": { + "text": { + "alerting": "", + "error": "", + "firing": "", + "inactive": "", + "no-data": "", + "ok": "OK", + "paused": "", + "pending": "", + "recovering": "", + "unknown": "" + } + }, "getting-stared": { "learn-more": "Untuk mempelajari langsung, lihat <2>tutorial kami untuk memulai Peringatan Grafana</2>" }, @@ -1142,6 +1351,10 @@ "label-disable-resolved-message": "Nonaktifkan pesan terselesaikan" }, "grafana-evaluation-behavior-step": { + "message": { + "must-be-a-positive-integer": "", + "must-enter-a-group-name": "" + }, "missing-series-resolve-placeholder": "Default: 2", "or": "atau", "placeholder-select-an-evaluation-group": "Pilih grup evaluasi...", @@ -1158,6 +1371,11 @@ "body-invalid-rule-id": "UID aturan di URL halaman tidak valid. Harap periksa URL dan coba lagi.", "title-invalid-rule-id": "ID aturan tidak valid" }, + "grafana-modify-export-page": { + "text": { + "modify-export": "" + } + }, "grafana-mute-timing-exporter-preview": { "text-loading": "Memuat...." }, @@ -1210,6 +1428,9 @@ }, "group-and-namespace-fields": { "group-picker-label-group": "Grup", + "message": { + "required": "" + }, "namespace-picker-label-namespace": "Ruang nama" }, "group-by": { @@ -1266,14 +1487,19 @@ "header": { "tooltip-remove": "Hapus ekspresi \"{{refId}}\"" }, + "history-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "Berhasil" + } + }, "home": { "label-get-started": "Mulai", "label-insights": "Wawasan", "title-alerting": "Alerting" }, - "import-from-dsrules": { - "description-folder-import-rules": "Folder tempat mengimpor aturan" - }, "import-to-gma": { "action-button": "Impor", "additional-settings": "Pengaturan tambahan", @@ -1281,8 +1507,9 @@ "confirm-modal": { "confirm": "Impor", "loading": "Memuat...", - "loading-body": "Menyiapkan data untuk diimpor. Harap tunggu...", + "loading-body": "", "no-rules-body": "Tidak ada aturan untuk diimpor. Pilih namespace atau grup aturan lain.", + "no-rules-body-yaml": "", "no-rules-title": "Tidak ada aturan untuk diimpor", "plugin-rules-warning": { "text": "Kami telah mendeteksi bahwa beberapa aturan dikelola oleh plugin. Aturan ini tidak akan diimpor.", @@ -1301,11 +1528,12 @@ "label": "Grup" }, "import-location-and-filters": "Impor lokasi dan filter", + "import-source": "", "namespace": { "description": "Ketik untuk mencari namespace yang ada", "label": "Ruang nama" }, - "pageTitle": "Impor aturan peringatan dari sumber data ke aturan yang dikelola Grafana", + "pageTitle": "", "pause": { "label": "Jeda aturan peringatan yang diimpor" }, @@ -1313,10 +1541,26 @@ "label": "Jeda aturan perekaman yang diimpor" }, "recording-rules": "Aturan perekaman", + "source": { + "datasource": "", + "datasource-description": "", + "yaml": "", + "yaml-description": "" + }, "success": "Berhasil mengimpor aturan peringatan ke aturan yang dikelola Grafana.", "target-folder": { + "description": "Folder tempat mengimpor aturan", "label": "Folder target" - } + }, + "yaml": { + "description": "", + "label": "", + "required-message": "", + "target-datasource": "Sumber data target", + "target-datasource-description": "", + "target-datasource-required": "" + }, + "yaml-error": "" }, "insights": { "monitor-status-of-system": "Pantau status sistem Anda", @@ -1392,6 +1636,9 @@ "text-loading-existing-labels": "Memuat label yang ada" }, "labels-without-suggestions": { + "message": { + "required": "" + }, "placeholder-key": "kunci", "placeholder-value": "nilai" }, @@ -1430,6 +1677,24 @@ "log-record-viewer-by-timestamp": { "aria-label-state-history-by-timestamp": "Riwayat status menurut stempel waktu" }, + "log-timeline-viewer": { + "label": { + "firing": "", + "mixed": "", + "no-data": "", + "normal": "Normal", + "pending": "Tertunda", + "recovering": "Memulihkan" + } + }, + "loki-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "Berhasil" + } + }, "loki-state-history": { "clear-filters": "Hapus filter", "common-labels": "Label umum", @@ -1442,6 +1707,14 @@ "button": "Kelola izin", "title": "Kelola izin" }, + "manual-and-automatic-routing": { + "routing-options": { + "label": { + "select-contact-point": "", + "use-notification-policy": "" + } + } + }, "matcher-filter": { "filter-alerts-using-label-querying-without-braces": "Filter peringatan menggunakan kueri label tanpa kurung kurawal, misalnya:", "filter-alerts-using-label-querying-without-spaces": "Filter peringatan menggunakan kueri label tanpa spasi, misalnya:", @@ -1459,6 +1732,9 @@ "label-operator": "Operator", "label-refine-affected-alerts": "Saring peringatan yang terpengaruh", "label-value": "Nilai", + "message": { + "required": "" + }, "placeholder-label": "label", "placeholder-value": "nilai", "remove": "Hapus", @@ -1490,6 +1766,16 @@ "aria-label": "Lebih banyak", "button-text": "Lebih banyak" }, + "multiple-data-source-picker": { + "get-data-source-options": { + "grouped-options": { + "label": { + "data-sources-with-configured-alert-rules": "", + "other-data-sources": "" + } + } + } + }, "mute-timing-actions-buttons": { "text-disabled": "Dinonaktifkan", "title-delete-mute-timing": "Hapus pengaturan waktu pembisuan" @@ -1553,11 +1839,26 @@ "read-more": "Baca tentang kebijakan pemberitahuan.", "title-notification-routing": "Perutean pemberitahuan" }, + "new-mute-timing-page": { + "text": { + "add-time-interval": "" + } + }, "new-rule-from-panel-button": { "body-no-alerting-capable-query-found": "Tidak dapat membuat peringatan dari panel ini karena tidak ada kueri ke sumber data berkemampuan peringatan yang ditemukan.", "new-alert-rule": "Aturan peringatan baru", "title-no-alerting-capable-query-found": "Tidak ada kueri berkemampuan peringatan yang ditemukan" }, + "new-silence-page": { + "page-nav": { + "subTitle": { + "configure-silences-notifications-particular-alert": "" + }, + "text": { + "silence-alert-rule": "Senyapkan aturan peringatan" + } + } + }, "no-alert-managers-available": { "body-no-alertmanager-found": "Kami tidak dapat menemukan Alertmanager eksternal dan Anda mungkin tidak memiliki akses ke Grafana Alertmanager bawaan.", "title-no-alertmanager-found": "Tidak ada Alertmanager yang ditemukan" @@ -1782,6 +2083,9 @@ "expressions": "Pola", "loading-data-sources": "Memuat sumber data...", "manipulate-returned-queries-other-operations": "Manipulasi data yang dikembalikan dari kueri dengan matematika dan operasi lainnya.", + "message": { + "a-valid-expression-is-required": "" + }, "no-compatible-sources": "Tampaknya Anda tidak memiliki sumber data yang kompatibel", "title-deactivate-advanced-options": "Nonaktifkan opsi lanjutan", "title-queries-expressions-configured": "Tidak ada kueri atau pola yang telah dikonfigurasi" @@ -1833,7 +2137,8 @@ }, "recording-rules": { "description-target-data-source": "Sumber data Prometheus untuk menyimpan aturan perekaman", - "label-target-data-source": "Sumber data target" + "label-target-data-source": "Sumber data target", + "target-data-source-required": "" }, "recording-rules-name-space-and-group-step": { "description-select-namespace-group-recording": "Pilih Namespace dan Grup untuk aturan perekaman Anda.", @@ -2091,6 +2396,9 @@ "collapse-all": "Ciutkan semua", "expand-all": "Perluas semua" }, + "rule-list-v2": { + "import-to-gma": "" + }, "rule-modify-export": { "text-loading-the-rule": "Memuat aturan...", "title-cannot-exist": "Tidak dapat memuat aturan. Aturan tidak ada", @@ -2167,6 +2475,10 @@ "label-saved-searches": "Pencarian tersimpan" }, "health": "Kesehatan", + "label": { + "hide": "Sembunyikan", + "show": "Tampilkan" + }, "manage-alerts": "Dalam sumber data ini, Anda dapat memilih Kelola peringatan melalui UI Alerting untuk dapat mengelola aturan peringatan ini di UI Grafana serta di sumber data tempat mereka dikonfigurasi.", "placeholder-all-data-sources": "Semua sumber data", "plugin-rules": "Aturan plugin", @@ -2263,6 +2575,9 @@ "label-comment": "Komentar", "label-created-by": "Dibuat Oleh", "label-duration": "Durasi", + "message": { + "required": "" + }, "placeholder-whos-creating-the-silence": "Siapa yang membuat kesenyapan", "save-silence": "Simpan kesenyapan", "saving": "Menyimpan..." @@ -2301,6 +2616,12 @@ "title-alert-rule-types": "Jenis aturan peringatan" }, "state-history": { + "columns": { + "label": { + "state": "Status", + "time": "Waktu" + } + }, "filter-group": "Filter grup", "filter-group-tooltip": "Filter setiap grup riwayat status, baik berdasarkan pencocokan tepat atau pola reguler, misalnya:", "placeholder-search": "Cari", @@ -2340,6 +2661,9 @@ "label-examples-documentation": "Contoh dokumentasi", "label-template-group": "Grup templat", "label-template-group-name": "Nama grup templat", + "message": { + "required": "" + }, "new-template-name-placeholder-give-your-template-group-a-name": "Beri nama grup templat Anda", "title-error-saving-template": "Kesalahan saat menyimpan templat", "title-templating-cheat-sheet": "Cheat sheet templat" @@ -2362,6 +2686,11 @@ "existing-templates-selector-aria-label-choose-notification-template": "Pilih templat pemberitahuan", "existing-templates-selector-placeholder-choose-notification-template": "Pilih templat pemberitahuan", "loading": "Memuat...", + "template-options": { + "label": { + "select-notification-template": "" + } + }, "tooltip-copy": "Salin templat pemberitahuan yang dipilih ke papan klip. Anda dapat menggunakannya di tab kustom." }, "templates": { @@ -2464,10 +2793,39 @@ } }, "use-columns": { + "columns": { + "label": { + "alert-rule-targeted": "", + "alerts-silenced": "", + "health": "Kesehatan", + "matching-labels": "Label yang cocok", + "name": "Nama", + "schedule": "Jadwal", + "state": "Status", + "time-range": "Rentang waktu" + } + }, + "label": { + "actions": "Tindakan", + "created": "Dibuat", + "group": "Grup", + "labels": "Label", + "next-evaluation": "Evaluasi berikutnya", + "state": "Status", + "summary": "Ringkasan" + }, "title-edit": "Edit", "title-recreate": "Buat ulang", "title-unsilence": "Batalkan Senyap" }, + "use-combined-labels": { + "grouped-options": { + "label": { + "from-alerts": "", + "from-system": "" + } + } + }, "use-create-dropdown-menu-actions": { "label-delete": "Hapus", "label-edit": "Edit", @@ -2501,6 +2859,17 @@ "title-edit-notification-policy": "Edit kebijakan pemberitahuan" } }, + "use-page-nav": { + "page-nav": { + "text": { + "details": "Detail", + "history": "Sejarah", + "instances": "Instans", + "query-and-conditions": "", + "versions": "Versi" + } + } + }, "use-state-history-modal": { "state-history-modal": { "title-state-history": "Riwayat status" @@ -2521,6 +2890,36 @@ "body": "Konten YAML di editor hanya berisi konfigurasi aturan peringatan <1></1>Untuk mengonfigurasi Prometheus, Anda perlu memberikan bagian lain dalam <4>konten file konfigurasi.</4>" } }, + "alertlist": { + "group-by": { + "aria-label-group-by-label-keys": "", + "placeholder-group-by": "Kelompokkan berdasarkan" + }, + "ungrouped-mode-view": { + "active-for": "", + "aria-label-view-alert-rule": "", + "view-alert-rule": "" + }, + "unified-alert-list": { + "clear": "Hapus", + "text-loading": "Memuat..." + }, + "unified-alert-list-panel": { + "body-permission-required": "", + "title-permission-required": "" + } + }, + "annolist": { + "anno-list-panel": { + "aria-label-remove-filter": "", + "filter": "", + "loading": "Memuat...", + "no-annotations-found": "" + }, + "annotation-list-item": { + "tooltip-created-by": "" + } + }, "annotations": { "annotation-field-mapper": { "annotation": "Anotasi", @@ -2617,6 +3016,11 @@ "configuration-required": "Konfigurasi wajib diisi", "refer-documentation-configure-authentication": "Lihat dokumentasi tentang cara mengonfigurasi autentikasi" }, + "field-map": { + "label": { + "none": "Tidak ada" + } + }, "fields": { "allow-assign-grafana-admin-description": "", "allow-assign-grafana-admin-label": "", @@ -2720,7 +3124,18 @@ "use-refresh-token-description": "", "use-refresh-token-label": "", "validate-hosted-domain-description": "", - "validate-hosted-domain-label": "" + "validate-hosted-domain-label": "", + "workload-identity-token-file-description": "", + "workload-identity-token-file-label": "", + "workload-identity-token-file-required": "" + }, + "get-page-nav": { + "subTitle": { + "configure-authentication-providers": "" + }, + "text": { + "authentication": "Autentikasi" + } }, "provider-card": { "text-badge-enabled": "Aktif", @@ -2756,6 +3171,12 @@ "auth-config-auth-config-page-unconnected": { "subtitle": "Kelola pengaturan autentikasi Anda dan konfigurasikan single sign-on. Cari tahu selengkapnya di <2>dokumentasi</2> kami." }, + "barchart": { + "tick-spacing-editor": { + "content-require-space-from-the-right-side": "", + "label-rtl": "" + } + }, "bookmarks-page": { "empty": { "message": "Sepertinya Anda belum membuat bookmark apa pun", @@ -2879,11 +3300,199 @@ "text-this-repository-is-read-only": "Jika Anda memiliki akses langsung ke target, salin JSON dan tempel di sana." }, "canvas": { + "apieditor": { + "label-endpoint": "", + "label-header-parameters": "", + "label-method": "Metode", + "label-payload": "Payload", + "label-query-parameters": "Parameter kueri", + "render-test-apibutton": { + "test-api": "", + "title-test-api": "" + } + }, + "button-item": { + "label": { + "center": "", + "left": "", + "right": "" + }, + "placeholder": { + "auto": "Auto" + } + }, + "button-style-editor": { + "label-variant": "Varian" + }, + "canvas-context-menu": { + "close-editor": "", + "open-editor": "", + "render-menu-items": { + "add-item-menu-item": { + "label-add-item": "" + }, + "edit-element-menu-item": { + "label-edit": "Edit" + }, + "label-bring-to-front": "", + "label-delete": "Hapus", + "label-duplicate": "Duplikasikan", + "label-send-to-back": "", + "set-background-menu-item": { + "label-set-background": "" + } + } + }, + "cloud-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } + }, + "ellipse-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } + }, + "inline-edit": { + "canvas-inline-editor": "", + "tooltip-close-inline-editor": "" + }, + "inline-edit-body": { + "label-add-item": "", + "please-select-an-element": "" + }, + "line-style-editor": { + "label-animate": "" + }, + "metric-value-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } + }, "not-found-display": { "not-found": "<0>Tidak ditemukan: </0><config />" }, + "pan-zoom-help": { + "ctrl-right-mouse": "", + "middle-mouse": "", + "pan-title": "", + "reset-double-click": "", + "title-pan-and-zoom-controls": "", + "zoom-scroll-wheel": "" + }, + "parallelogram-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } + }, + "params-editor": { + "aria-label-add": "Tambahkan", + "aria-label-delete": "Hapus", + "placeholder-key": "Kunci", + "placeholder-value": "Nilai" + }, + "placement-editor": { + "label-constraints": "", + "label-position": "", + "loading": "Memuat..." + }, + "quick-positioning": { + "tooltip-align-bottom": "", + "tooltip-align-horizontal-centers": "", + "tooltip-align-left": "", + "tooltip-align-right": "", + "tooltip-align-top": "", + "tooltip-align-vertical-centers": "" + }, + "rectangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } + }, "text-display": { "double-click-to-set": "Klik dua kali untuk mengatur teks" + }, + "text-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } + }, + "tree-navigation-editor": { + "clear-selection": "Hapus pilihan", + "frame-selection": "", + "label-add-item": "", + "missing-layer": "", + "no-settings": "", + "switcher-icon": { + "title-node-icon": "" + } + }, + "tree-node-title": { + "title-duplicate": "Duplikasikan", + "title-remove": "Hapus", + "tooltip-duplicate": "Duplikasikan", + "tooltip-remove": "Hapus" + }, + "triangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } } }, "carousel": { @@ -2963,6 +3572,22 @@ } }, "connections": { + "add-new-connection": { + "filter-by-options": { + "label": { + "all": "Semua", + "installed": "Diinstal", + "new-updates": "" + } + }, + "label": { + "by-downloads": "", + "by-name-az": "", + "by-name-za": "", + "by-published-date": "", + "by-updated-date": "" + } + }, "advisor-redirect-notice": { "aria-label-link-to-advisor": "Tautan ke Advisor", "body": "Coba Advisor baru untuk mengungkap potensi masalah dengan sumber data dan plugin Anda.", @@ -2979,6 +3604,22 @@ "body": "Sumber data memiliki tempat baru! Anda dapat menemukan sumber data baru atau mengelola yang sudah ada di halaman Koneksi, dapat diakses dari menu utama.", "go-to-connections": "Buka koneksi" }, + "data-source-details-page": { + "subTitle": { + "datasource-could-found": "" + }, + "text": { + "unknown-datasource": "" + } + }, + "new-data-source-page": { + "subTitle": { + "choose-a-data-source-type": "" + }, + "text": { + "add-data-source": "Tambahkan sumber data" + } + }, "no-access-modal": { "connection-contact-grafana-admin": "Untuk menambahkan koneksi baru, hubungi admin Grafana Anda.", "editor-warning": "Editor tidak dapat menambahkan koneksi baru. Anda dapat memeriksa untuk melihat apakah ini sudah dikonfigurasi di <2>Sumber data</2>.", @@ -2991,6 +3632,18 @@ "search": { "aria-label-search-all": "Cari semua", "placeholder": "Cari semua" + }, + "use-data-source-settings-nav": { + "node": { + "subTitle": { + "data-source-error": "" + } + }, + "page-nav": { + "text": { + "data-source-nav-node": "" + } + } } }, "core": { @@ -3286,6 +3939,11 @@ "title-plugin-dashboard": "Dasbor plugin" }, "dash-nav": { + "on-open-snapshot-original": { + "title": { + "proceed-to-external-site": "" + } + }, "render-left-actions": { "text-public": "Publik", "tooltip-view-as-scene": "Tampilkan sebagai Scene" @@ -3297,11 +3955,26 @@ "dashboard-loading": { "cancel-loading-dashboard": "Batalkan memuat dasbor" }, + "dashboard-page-error": { + "text": { + "not-found": "Tidak ditemukan" + } + }, "dashboard-settings": { "actions": { "close": "Tutup" } }, + "dashboard-slice": { + "title": { + "dashboard-init-failed": "" + } + }, + "dashboard-srv": { + "message": { + "edit-dashboard-json": "" + } + }, "dashboard-validation": { "body-dashboard-failed-schema-validation": "Validasi diberikan untuk tujuan pengembangan dan seharusnya aman untuk diabaikan. Jika Anda adalah developer Grafana, pertimbangkan untuk memeriksa dan memperbarui skema dasbor", "title-checking-dashboard-validity": "Memeriksa validitas dasbor", @@ -3397,6 +4070,13 @@ "values": "Nilai dipisahkan dengan koma", "values-placeholder": "1, 10, mykey : myvalue, myvalue, escaped,value" }, + "datasource-options": { + "name-filter": "", + "name-filter-description": "", + "name-filter-placeholder": "", + "type": "Jenis", + "type-placeholder": "" + }, "description": "Deskripsi", "description-placeholder": "Teks deskriptif", "label": "Label", @@ -3415,8 +4095,8 @@ "category": "Opsi pemilihan", "custom-all-value": "Nilai kustom untuk semua", "custom-all-value-description": "Regex wildcard atau nilai lainnya untuk merepresentsaikan Semua", - "include-all": "Sertakan opsi Semua", - "include-all-description": "Mengaktifkan opsi untuk menyertakan semua nilai", + "include-all": "", + "include-all-description": "", "multi-value": "Multi-nilai" }, "type-category": "Opsi {{type}}" @@ -3442,14 +4122,97 @@ "errors": { "failed-to-load": "Gagal memuat dasbor" }, + "fetch-dashboard": { + "message": { + "failed-to-fetch-dashboard": "" + } + }, "gen-aihistory": { "aria-label-send-custom-feedback": "Kirim umpan balik kustom", "footer-text": "Konten ini dibuat AI menggunakan <2>plugin Grafana LLM</2>", "placeholder-tell-ai-what-to-do-next": "Beri tahu AI yang harus dilakukan selanjutnya..." }, + "general-settings-unconnected": { + "editable-options": { + "label": { + "editable": "Dapat diedit", + "readonly": "" + } + } + }, + "get-debug-dashboard": { + "title": { + "annotations": "Anotasi" + } + }, + "get-errors": { + "message": { + "error-loading-data": "" + } + }, "get-field-override-categories": { "label-add-field-override": "Tambah penimpaan bidang", - "label-add-override-property": "Tambah properti penimpaan" + "label-add-override-property": "Tambah properti penimpaan", + "title": { + "add-button": "" + } + }, + "get-library-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "Informasi", + "name": "Nama" + } + }, + "get-library-viz-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "Informasi", + "name": "Nama" + } + }, + "get-panel-editor-tabs": { + "text": { + "alert": "", + "query": "Kueri", + "transform-data": "" + } + }, + "get-panel-frame-category": { + "descriptor": { + "title": { + "panel-options": "Opsi panel" + } + }, + "direction-options": { + "label": { + "horizontal": "Horizontal", + "vertical": "Vertikal" + } + }, + "title": { + "description": "Deskripsi", + "max-per-row": "Maksimum per baris", + "panel-links": "Tautan panel", + "repeat-by-variable": "Ulangi menurut variabel", + "repeat-direction": "Ulangi arah", + "repeat-options": "Opsi pengulangan", + "title": "Judul", + "transparent-background": "Latar belakang transparan" + } + }, + "get-panel-menu": { + "text": { + "extensions": "" + } }, "help-wizard": { "copy-to-clipboard": "Salin ke papan klip", @@ -3462,10 +4225,21 @@ "randomize-field-names-label-field-names": "Nama bidang", "randomize-labels-label-labels": "Label", "randomize-string-values-label-string-values": "Nilai string", + "tabs": { + "label": { + "data": "Data", + "snapshot": "Snapshot" + } + }, "title-complete-git-hub-comment-clipboard": "Salin komentar GitHub lengkap ke papan klip", "title-get-help-with-this-panel": "Dapatkan bantuan dengan panel ini", "troubleshooting-docs": "Dokumen pemecahan masalah" }, + "init-dashboard": { + "message": { + "failed-create-dashboard-model": "" + } + }, "inspect": { "data-tab": "Data", "error-tab": "Kesalahan", @@ -3518,6 +4292,16 @@ "rows": "Total jumlah baris", "table-title": "Statistik" }, + "k8s-dashboard-api": { + "title": { + "deleted": "" + } + }, + "k8s-dashboard-v2api": { + "title": { + "deleted": "" + } + }, "layout": { "common": { "copy": "Salin", @@ -3530,6 +4314,13 @@ "panel-layout-disabled": "Pilih baris atau tab untuk mengubah opsi tata letak panel" } }, + "legacy-dashboard-api": { + "fetch-error": { + "message": { + "dashboard-not-found": "" + } + } + }, "make-editable": { "dashboard-not-editable": "Dasbor tidak dapat diedit", "make-editable": "Jadikan dapat diedit" @@ -3549,6 +4340,20 @@ "menu-use-library-panel": "Gunakan panel pustaka" }, "new-panel-title": "Panel baru", + "on-create-new-row": { + "new-row": { + "title": { + "row-title": "" + } + } + }, + "on-create-new-widget-panel": { + "new-panel": { + "title": { + "widget-title": "" + } + } + }, "options": { "description": "Deskripsi", "title-option": "Judul" @@ -3607,6 +4412,30 @@ "paused": "Dasbor ini telah dijeda oleh administrator", "try-again-later": "Coba lagi nanti" }, + "remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, + "repeat-row-select": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, + "repeat-row-select2": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, "revert-dashboard-modal": { "body-restore-version": "Anda yakin ingin memulihkan dasbor ke versi {{version}}? Semua perubahan yang belum disimpan akan hilang.", "title-restore-version": "Pulihkan versi" @@ -3720,6 +4549,18 @@ "sub-menu-un-connected": { "aria-label-template-variables": "Variabel templat" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "tabs-layout": { "delete-tab-text": "Menghapus tab ini juga akan menghapus semua panel. Anda yakin ingin melanjutkan?", "delete-tab-title": "Hapus tab?", @@ -3925,7 +4766,10 @@ }, "unthemed-dashboard-row": { "aria-label-delete-row": "Hapus baris ", - "learn-more": "Pelajari lebih lanjut" + "learn-more": "Pelajari lebih lanjut", + "title": { + "delete-row": "Hapus baris " + } }, "validation": { "invalid-dashboard-id": "Tidak dapat menemukan ID Grafana.com yang valid", @@ -3960,6 +4804,16 @@ }, "visualization-select-pane": { "placeholder-search-for": "Cari...", + "radio-options": { + "description": { + "reusable-panels-share-between-multiple-dashboards": "" + }, + "label": { + "library-panels": "Panel pustaka", + "suggestions": "", + "visualizations": "" + } + }, "title-close": "Tutup" }, "viz-panel": { @@ -4010,12 +4864,25 @@ "label-data-source": "Sumber data", "label-use-static-key-dimensions": "Gunakan dimensi kunci statis" }, + "add-to-dashboard": { + "message": { + "could-navigate-selected-dashboard-please-again": "", + "could-panel-dashboard-please-again": "" + } + }, "add-to-dashboard-form": { "cancel": "Batalkan", "description-choose-where-to-add-the-panel": "Pilih tempat untuk menambahkan panel.", "description-select-which-dashboard-panel-created": "Pilih dasbor tempat panel akan dibuat.", + "label": { + "existing-dashboard": "Dasbor yang ada", + "new-dashboard": "Dasbor baru" + }, "label-dashboard": "Dasbor", "label-target-dashboard": "Dasbor target", + "message": { + "this-field-is-required": "Bidang ini wajib diisi." + }, "open-dashboard": "Buka dasbor", "open-in-new-tab": "Buka di tab baru", "title-error-adding-the-panel": "Kesalahan saat menambahkan panel" @@ -4053,6 +4920,25 @@ "it-cannot-contain-or": "Tidak boleh berisi '//' atau '..'.", "least-valid-character": "Harus memiliki setidaknya satu karakter yang valid." }, + "build-new-dashboard-save-model": { + "data": { + "title": { + "new-dashboard": "Dasbor baru" + } + } + }, + "build-new-dashboard-save-model-v2": { + "data": { + "title": { + "new-dashboard": "Dasbor baru" + } + } + }, + "config-public-dashboard": { + "title": { + "revoke-public-url": "Cabut URL publik" + } + }, "constant-variable-form": { "constant-options": "Opsi konstan", "label-value": "Nilai", @@ -4100,22 +4986,89 @@ "value-not-saved": "Nilai belum disimpan dalam database Grafana", "view-pull-request-in-git-hub": "Lihat permintaan penggabungan di GitHub" }, + "dashboard-scene": { + "text": { + "edit-panel": "", + "view-panel": "Lihat panel" + }, + "title": { + "dashboard": "Dasbor", + "discard-changes-to-dashboard": "" + } + }, + "dashboard-scene-page-state-manager": { + "message": { + "dashboard-not-found": "" + } + }, + "dashboard-scene-page-state-manager-v2": { + "message": { + "dashboard-not-found": "" + } + }, "data-source-variable-form": { "data-source-options": "Opsi sumber data", "description-instance-name-filter": "Filter regex untuk instans sumber data yang akan dipilih dalam daftar nilai variabel. Biarkan kosong untuk semua.", "example-instance-name-filter": "Contoh: <codeExample />", "selection-options": "Opsi pemilihan" }, + "default-grid-layout-manager": { + "row": { + "title": { + "row-title": "" + } + } + }, "description-label": { "description": "Deskripsi" }, + "edit-link-view": { + "edit-link-page-nav": { + "text": { + "edit-link": "Edit tautan" + } + } + }, "email-list": { "aria-label-emailmenu": "Alihkan tombol menu email" }, + "embedded-dashboard-test-page": { + "subTitle": { + "showing-dashboard-panel-tests-pie-chart": "" + }, + "text": { + "embedding-dashboard": "" + } + }, "empty-transformations-message": { "add-transformation": "Tambahkan transformasi" }, + "get-edit-options": { + "title": { + "column-options": "", + "row-height-options": "" + } + }, + "get-panel-frame-options": { + "descriptor": { + "title": { + "panel-options": "Opsi panel" + } + }, + "title": { + "description": "Deskripsi", + "panel-links": "Tautan panel", + "title": "Judul", + "transparent-background": "Latar belakang transparan" + } + }, + "get-workflow-options": { + "label": { + "push-to-a-new-branch": "" + } + }, "group-by-variable-form": { + "alert-not-supported": "", "description-enables-users-custom-values": "Memungkinkan pengguna untuk menambahkan nilai kustom ke daftar", "description-provide-dimensions-as-csv-dimension-name-dimension-id": "Berikan dimensi sebagai CSV: {{name}}, {{value}}", "group-by-options": "Kelompokkan berdasarkan opsi", @@ -4134,6 +5087,12 @@ "randomize-field-names-label-field-names": "Nama bidang", "randomize-labels-label-labels": "Label", "randomize-string-values-label-string-values": "Nilai string", + "tabs": { + "label": { + "data": "Data", + "snapshot": "Snapshot" + } + }, "title-complete-git-hub-comment-clipboard": "Salin komentar GitHub lengkap ke papan klip", "title-get-help-with-this-panel": "Dapatkan bantuan dengan panel ini", "troubleshooting-docs": "Dokumen pemecahan masalah", @@ -4175,6 +5134,14 @@ "body-name-already-exists": "Dasbor dengan nama yang sama di folder yang dipilih sudah ada. Ingin tetap menyimpan dasbor ini?", "title-name-already-exists": "Nama sudah ada" }, + "on-remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, "panel-data-alerting-tab-rendered": { "alert": { "title-errors-loading-rules": "Kesalahan saat memuat aturan" @@ -4196,6 +5163,11 @@ "table-view-aria-label-toggletableview": "Alihkan tombol tampilan tabel", "table-view-label-table-view": "Tampilan tabel" }, + "panel-editor": { + "text": { + "edit-panel": "" + } + }, "panel-editor-renderer": { "aria-label-open-options-pane": "Buka panel opsi", "tooltip-open-options-pane": "Buka panel opsi" @@ -4204,8 +5176,22 @@ "body-panel-plugin-not-loaded": "Pastikan panel yang ingin Anda periksa terlihat dan telah ditampilkan sebelum membuka inspeksi.", "title-panel-plugin-not-loaded": "Plugin panel belum dimuat" }, + "panel-menu-behavior": { + "async-func": { + "text": { + "extensions": "", + "metrics-drilldown": "" + } + } + }, "panel-viz-type-picker": { "placeholder-search-for": "Cari...", + "radio-options": { + "label": { + "suggestions": "", + "visualizations": "" + } + }, "title-close": "Tutup" }, "provisioned-delete-modal": { @@ -4232,6 +5218,15 @@ "query-options": "Opsi kueri", "selection-options": "Opsi pemilihan" }, + "resource-export": { + "label": { + "classic": "", + "json": "JSON", + "v1-resource": "", + "v2-resource": "", + "yaml": "" + } + }, "revert-dashboard-modal": { "body-restore-version": "Anda yakin ingin memulihkan dasbor ke versi {{version}}? Semua perubahan yang belum disimpan akan hilang.", "title-restore-version": "Pulihkan versi" @@ -4339,6 +5334,18 @@ "solo-panel-page": { "loading": "Memuat" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "text-box-variable-form": { "placeholder-default-value-if-any": "(opsional)", "text-options": "Opsi teks" @@ -4349,6 +5356,13 @@ "title-field-label": { "title": "Judul" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "transformations-drawer": { "search-box-suffix": { "tooltip-clear-search": "Hapus pencarian" @@ -4364,6 +5378,13 @@ "save-dashboard": "Simpan dasbor", "title-unsaved-changes": "Perubahan belum tersimpan" }, + "use-dashboard-edit-page-nav": { + "page-nav": { + "text": { + "settings": "Pengaturan" + } + } + }, "variable-check-indicator": { "aria-label-variable-referenced-dashboard": "Variabel ini tidak direferensikan oleh variabel atau dasbor apa pun.", "aria-label-variable-referenced-other-variables-dashboard": "Variabel ini direferensikan oleh variabel atau dasbor lain.", @@ -4380,7 +5401,10 @@ "placeholder-descriptive-text": "Teks deskriptif", "placeholder-label-name": "Nama label", "placeholder-variable-name": "Nama variabel", - "text-running-query": "Menjalankan kueri..." + "text-running-query": "Menjalankan kueri...", + "title": { + "delete-variable": "Hapus variabel" + } }, "variable-editor-list": { "definition": "Definisi", @@ -4562,6 +5586,25 @@ "message": "Tidak ada sumber data yang ditemukan" } }, + "datagrid": { + "add-column": { + "placeholder-column-name": "" + }, + "datagrid-context-menu": { + "render-context-menu-items": { + "label-clear-column": "", + "label-clear-row": "", + "label-remove-all-data": "", + "label-search": "Cari..." + }, + "render-header-menu-items": { + "label-clear-column": "", + "label-delete-column": "", + "label-rename-column": "", + "label-set-field-type": "" + } + } + }, "datasources": { "add-new-data-source-button": { "tooltip-no-permission": "Anda tidak memiliki izin untuk mengonfigurasi sumber data baru" @@ -4583,6 +5626,46 @@ "label-default": "Default", "label-name": "Nama" }, + "build-categories": { + "categories": { + "title": { + "cloud": "", + "distributed-tracing": "", + "enterprise-plugins": "Plugin Enterprise", + "industrial-io-t": "", + "logging-document-databases": "", + "others": "", + "profiling": "", + "sql": "", + "time-series-databases": "" + } + } + }, + "build-nav-model": { + "analytics": { + "text": { + "insights": "Wawasan" + } + }, + "caching": { + "text": { + "cache": "" + } + }, + "ds-permissions": { + "text": { + "permissions": "Izin" + } + }, + "nav-model": { + "text": { + "settings": "Pengaturan" + } + }, + "text": { + "dashboards": "Dasbor" + } + }, "button-row": { "delete": "Hapus", "save-and-test": "Simpan & tes", @@ -4618,6 +5701,11 @@ "data-source-read-only-message": { "title-provisioned-data-source": "Sumber data yang disediakan" }, + "data-source-settings-reducer": { + "message": { + "testing-could-couple-minutes": "" + } + }, "data-source-type-card": { "aria-label-learn-more": "{{dataSourcePluginName}}, pelajari selengkapnya." }, @@ -4635,13 +5723,88 @@ "footer": { "add-csv-or-spreadsheet": "Tambahkan csv atau spreadsheet" }, + "get-enterprise-phantom-plugins": { + "description": { + "adobe-analytics-datasource": "", + "app-dynamics-integration-and-data-source": "", + "atlassian-statuspage-datasource": "", + "aurora-data-source": "", + "azure-cosmos-db-datasource": "", + "azure-devops-datasource": "", + "catchpoint-datasource": "", + "cloudflare-datasource": "", + "cockroach-db-datasource": "", + "data-dog-integration-and-data-source": "", + "drone-datasource": "", + "git-lab-integration-and-datasource": "", + "honeycomb-integration-and-datasource": "", + "jira-integration-and-datasource": "", + "logic-monitor-devices-datasource": "", + "mongo-db-integration-and-data-source": "", + "netlify-datasource": "", + "new-relic-integration-and-data-source": "", + "pager-duty-datasource": "", + "salesforce-integration-and-datasource": "", + "sap-hana-integration-and-data-source": "", + "service-now-integration-and-data-source": "", + "signal-fx-integration-and-datasource": "", + "snowflake-integration-and-data-source": "", + "sumo-logic-integration-and-datasource": "", + "visualize-and-explore-dynatrace-data": "", + "visualize-and-explore-oracle-sql": "", + "visualize-and-explore-splunk-logs": "", + "wavefront-integration-and-data-source": "", + "zendesk-datasource": "" + } + }, + "get-grafana-cloud-phantom-plugin": { + "description": { + "hosted-graphite-prometheus-and-loki": "" + } + }, "new-data-source-view": { "cancel": "Batalkan", "placeholder-filter-by-name-or-type": "Filter berdasarkan nama atau jenis" }, + "update-data-source": { + "error-info": { + "message": { + "an-unexpected-error-occurred": "" + } + } + }, "use-data-source-info": { "badge-text-not-supported": "Tidak didukung", - "badge-text-supported": "Didukung" + "badge-text-supported": "Didukung", + "label": { + "alerting": "Alerting", + "type": "Jenis" + } + }, + "use-delete-loaded-data-source": { + "title": { + "delete": "Hapus" + } + } + }, + "debug": { + "cursor-view": { + "no-events-yet": "" + }, + "render-info-viewer": { + "data-counter": "", + "elapsed-time": "", + "field": "Bidang", + "last": "", + "render-counter": "", + "schema-counter": "", + "title-reset-counters": "", + "tooltip-step-back": "", + "type": "Jenis" + }, + "state-view": { + "current-value": "", + "label-state-name": "" } }, "dimensions": { @@ -4710,6 +5873,19 @@ "remove-value-mapping-aria-label-delete-value-mapping": "Hapus pemetaan nilai", "remove-value-mapping-tooltip-delete": "Hapus", "set-color": "Atur warna", + "special-match-options": { + "description": { + "boolean-false-values": "", + "boolean-true-values": "", + "empty-string": "", + "matches-against-number-na-n-not-a-number": "", + "matches-null-and-undefined-values": "", + "matches-null-undefined-and-na-n": "" + }, + "label": { + "empty": "Kosong" + } + }, "tooltip-remove-color": "Hapus warna", "tooltip-remove-icon": "Hapus ikon" }, @@ -4725,6 +5901,20 @@ "display-text": "Teks tampilan", "icon": "Ikon", "label-add-a-new-mapping": "Tambahkan pemetaan baru", + "mapping-types": { + "description": { + "match-a-numerical-range-of-values": "", + "match-a-regular-expression-with-replacement": "", + "match-a-specific-text-value": "", + "match-boolean-empty-values": "" + }, + "label": { + "range": "", + "regex": "", + "special": "", + "value": "Nilai" + } + }, "update": "Perbarui" } }, @@ -4749,6 +5939,7 @@ }, "explore": { "accordian-logs": { + "events": "", "footer": "Stempel waktu peristiwa terkait waktu mulai pelacakan penuh." }, "accordian-references": { @@ -4759,6 +5950,11 @@ "basic-extensions": { "aria-label-add": "Tambahkan" }, + "build-dashboard-panel-from-explore-state": { + "title": { + "new-panel": "" + } + }, "clear": "Hapus", "confirm-navigation-modal": { "cancel": "Batalkan", @@ -4845,6 +6041,33 @@ "title-table": "Tabel", "title-traces": "Pelacakan" }, + "explore-query-inspector": { + "data-tab": { + "label": { + "data": "Data" + } + }, + "error-tab": { + "label": { + "error": "Kesalahan" + } + }, + "json-tab": { + "label": { + "json": "JSON" + } + }, + "query-tab": { + "label": { + "query": "Kueri" + } + }, + "stats-tab": { + "label": { + "stats": "Statistik" + } + } + }, "explore-run-query-button": { "run-button": { "aria-label-run-query-options": "Opsi jalankan kueri" @@ -4858,10 +6081,23 @@ "description-explore-disabled": "Untuk mengaktifkan Jelajahi, aktifkan dalam konfigurasi Grafana:", "title-explore-disabled": "Jelajahi dinonaktifkan" }, + "get-field-links-for-explore": { + "text": { + "data": "Data", + "raw-value": "" + } + }, "get-matches-metadata": { "matches": "0 kecocokan" }, "legacy-create-span-link-factory": { + "text": { + "tags": "Tag" + }, + "title": { + "related-logs": "", + "session-for-this-span": "Sesi untuk rentang ini" + }, "title-explore-metrics-for-this-span": "Telusuri metrik untuk rentang ini", "title-explore-split": "Telusuri log untuk ini dalam tampilan terpisah", "title-session-for-this-span": "Sesi untuk rentang ini" @@ -4902,6 +6138,10 @@ }, "logs-meta-row": { "download": "Unduh", + "label": { + "deduplication-count": "", + "showing-only-selected-fields": "" + }, "show-original-line": "Tampilkan baris asli" }, "logs-sample-panel": { @@ -5083,6 +6323,21 @@ "run-query-button": "Jalankan kueri", "switch-datasource-button": "Alihkan sumber data dan jalankan kueri" }, + "scoped-vars-from-span": { + "text": { + "span": "" + } + }, + "scoped-vars-from-tags": { + "text": { + "tags": "Tag" + } + }, + "scoped-vars-from-trace": { + "text": { + "trace": "Pelacakan" + } + }, "search-bar-input": { "placeholder-find": "Cari...", "suffix": { @@ -5117,9 +6372,25 @@ "tooltip-tag-key": "Kunci tag yang akan digunakan untuk mendapatkan nilai tag. Atribut dan sumber daya rentang akan dicari untuk kunci tag" }, "span-detail": { + "label": { + "kind": "", + "library-name": "", + "library-version": "", + "status": "Status:", + "status-message": "", + "trace-state": "" + }, "label-resource-attributes": "Atribut sumber daya", "label-span-attributes": "Atribut rentang", "label-stack-trace": "Jejak stack", + "overview-items": { + "label": { + "child-count": "", + "duration": "", + "service": "", + "start-time": "" + } + }, "warnings": "Peringatan" }, "span-filters": { @@ -5226,6 +6497,18 @@ "title-node-graph": "Grafik node" }, "unthemed-logs": { + "description": { + "show-results-in-logs-visualisation": "", + "show-results-in-table-visualisation": "", + "show-results-newest-to-oldest": "", + "show-results-oldest-to-newest": "" + }, + "label": { + "logs": "Log", + "newest-first": "Terbaru lebih dulu", + "oldest-first": "Terlama lebih dulu", + "table": "Tabel" + }, "label-deduplication": "Deduplikasi", "label-display-results": "Tampilkan hasil", "label-prettify-json": "Rapikan JSON", @@ -5241,6 +6524,15 @@ }, "unthemed-virtualized-trace-view": { "title-scroll-to-top": "Gulir ke atas" + }, + "use-focus-span-link": { + "create-focus-span-link": { + "link": { + "title": { + "deep-link-to-this-span": "" + } + } + } } }, "export": { @@ -5326,6 +6618,15 @@ "folder-repo": { "badge-text": "Disediakan" }, + "folders": { + "get-loading-nav": { + "main": { + "title": { + "loading": "Memuat" + } + } + } + }, "forgot-password": { "back-button": "Kembali ke login", "change-password": { @@ -5355,10 +6656,102 @@ "incomplete-request-error": "Maaf, saya tidak dapat menyelesaikan permintaan Anda. Silakan coba lagi.", "send-custom-feedback": "Kirim" }, + "geomap": { + "coordinates-map-view-editor": { + "label-latitude": "", + "label-longitude": "" + }, + "debug-overlay": { + "center": "", + "zoom": "" + }, + "fit-map-view-editor": { + "all-layers-editor-fragment": { + "label-layer": "" + }, + "label-data": "Data", + "last-only-editor-fragment": { + "label-padding": "", + "tooltip-padding-relative-percent-beyond-extent": "" + } + }, + "frame-multi-selection-editor": { + "placeholder-change-filter": "" + }, + "frame-selection-editor": { + "placeholder-change-filter": "" + }, + "geomap-panel": { + "aria-label-map": "" + }, + "geomap-style-rules-editor": { + "aria-label-add-geomap-style-rule": "" + }, + "layers-editor": { + "label-add-layer": "", + "no-layers": "" + }, + "map-view-editor": { + "label-max-zoom": "", + "label-view": "Lihat", + "label-zoom": "Perbesar", + "use-current-map-settings": "" + }, + "markers-legend": { + "title-symbol": "Simbol" + }, + "measure-overlay": { + "tooltip-show-measure-tools": "" + }, + "plugin": { + "basemap-layer-configured-server-admin": "" + }, + "style-editor": { + "label-align": "", + "label-baseline": "", + "label-color": "Warna", + "label-fill-opacity": "", + "label-font-size": "", + "label-opacity": "", + "label-rotation-angle": "", + "label-size": "", + "label-symbol": "Simbol", + "label-symbol-horizontal-align": "", + "label-symbol-vertical-align": "", + "label-text-label": "", + "label-x-offset": "", + "label-y-offset": "" + }, + "style-rule-editor": { + "aria-label-comparison-operator": "Operator perbandingan", + "aria-label-comparison-value": "", + "aria-label-delete-style-rule": "", + "aria-label-feature-property": "", + "label-rule": "Aturan", + "placeholder-feature-property": "", + "placeholder-numeric-value": "", + "placeholder-value": "nilai" + } + }, "get-enterprise": { "requires-license": "Membutuhkan lisensi Grafana Enterprise", "title": "Enterprise" }, + "gettingstarted": { + "docs-card": { + "complete": "selesai", + "learn-how": "" + }, + "getting-started": { + "aria-label-to-advanced-tutorials": "", + "aria-label-to-basic-tutorials": "", + "checking-completed-setup-steps": "", + "remove-this-panel": "" + }, + "tutorial-card": { + "complete": "selesai" + } + }, "gops": { "config-card": { "text-loading-configuration": "Memuat konfigurasi...." @@ -5375,6 +6768,74 @@ }, "progress-status": { "your-progress": "Progres Anda" + }, + "use-get-configuration-for-ui": { + "get-connect-data-source-configuration": { + "title": { + "connect-data-source": "" + } + }, + "title": { + "essentials": "Esensial" + } + }, + "use-get-essentials-configuration": { + "essential-content": { + "description": { + "configure-grafana-alerting": "", + "create-integration-alerting-contact-point": "", + "initialize-incident-plugin-declare-manage-incidents": "", + "practice-solving-an-incident": "", + "receive-alerts-oncall-notifications-within-environment": "", + "select-chat-ops-channels-to-route-notifications": "" + }, + "label": { + "add": "Tambahkan", + "connect": "Hubungkan", + "initialize": "", + "select-integration": "", + "start-drill": "" + }, + "title": { + "add-slack-notifications-to-irm-integrations": "", + "connect-alerting-to-irm": "", + "connect-irm-to-your-slack-workspace": "", + "connect-your-messaging-workspace-to-incident": "", + "connect-your-messaging-workspace-to-on-call": "", + "create-incident-drill": "", + "detect": "Deteksi", + "initialize-incident-plugin": "", + "messaging-workspace-channel-on-call-integration": "", + "respond": "", + "test-your-configuration": "" + } + }, + "get-grafana-alerting-config-steps": { + "description": { + "create-alert-monitor-system": "", + "create-on-call-integration-alerting-contact-point": "", + "create-slos-to-monitor-your-service": "" + }, + "label": { + "connect": "Hubungkan", + "create": "Buat", + "enable": "Aktifkan" + }, + "steps": { + "label": { + "edit": "Edit" + }, + "title": { + "update-default-contact-point": "" + } + }, + "title": { + "connect-alerting-to-on-call": "", + "create-alert-rule": "", + "create-slo": "", + "enable-slo-alerting": "" + } + } } }, "grafana": { @@ -5741,14 +7202,18 @@ "duplicate-panel": "Duplikasikan Panel", "exit-edit/setting-views": "Keluar dari tampilan edit/pengaturan", "expand-all-rows": "Perluas semua baris", + "explore-panel": "", "go-to-dashboards": "Buka Dasbor", "go-to-explore": "Buka Explore", "go-to-home-dashboard": "Buka Dasbor Beranda", "go-to-profile": "Buka Profil", + "inspect-panel": "", "make-time-range-permanent": "Jadikan rentang waktu absolut/permanen", "move-time-range-back": "Pindahkan rentang waktu mundur", "move-time-range-forward": "Pindahkan rentang waktu ke depan", "open-search": "Buka pencarian", + "open-share-embed-drawer": "", + "open-share-link-drawer": "", "open-shared-modal": "Bagikan snapshot panel", "paste-time-range": "Tempel rentang waktu", "refresh-all-panels": "Muat ulang semua panel", @@ -5774,6 +7239,11 @@ "support-bundle": "Anda juga dapat mengambil bundel dukungan yang berisi informasi mengenai instans Grafana Anda dan sumber data yang dikonfigurasi di bagian <1>bundel dukungan</1>.", "troubleshooting-help": "Untuk meminta bantuan pemecahan masalah, kirim snapshot panel ini ke Dukungan Teknis Grafana Labs. Snapshot berisi data respons kueri dan pengaturan panel." }, + "histogram": { + "histogram-panel": { + "no-histogram-found-in-response": "" + } + }, "inspector": { "inspect-data-tab": { "loading": "Memuat", @@ -5821,6 +7291,9 @@ "label-name": "Nama", "label-password": "Kata sandi", "label-username": "Nama pengguna", + "message": { + "email-is-invalid": "" + }, "placeholder-name-optional": "Nama (opsional)", "placeholder-password": "Kata sandi", "placeholder-username": "Nama pengguna", @@ -6077,8 +7550,26 @@ "discard-local-changes": "Buang perubahan lokal", "title-dashboard-changed": "Dasbor diubah" }, + "live-channel-editor": { + "description-grafana-live": "", + "namespace": "Ruang nama", + "path": "Jalur", + "placeholder-select-watchable-resource": "", + "scope": "Ruang Lingkup", + "title-grafana-live": "" + }, "live-connection-warning": { "title-connection-to-server-is-lost": "Koneksi ke server terputus..." + }, + "live-panel": { + "error": "Kesalahan", + "grafana-requires-feature": "", + "panel-editor-channel": "", + "title-grafana-live": "", + "waiting-for-data": "" + }, + "live-publish": { + "publish": "" } }, "lock-icon": "ikon gembok", @@ -6125,6 +7616,13 @@ } }, "logs": { + "get-dataframe-fields": { + "vars": { + "text": { + "labels": "Label" + } + } + }, "infinite-scroll": { "end-of-range": "Akhir rentang waktu yang dipilih.", "load-more": "Gulir untuk memuat lebih banyak", @@ -6205,6 +7703,11 @@ "shortcut": "alt+pilih untuk mengaktifkan lagi" } }, + "log-series-to-logs-model": { + "label": { + "total-bytes-processed": "" + } + }, "logs-controls": { "deduplication": "Deduplikasi", "disable-highlighting": "Nonaktifkan penyorotan", @@ -6239,6 +7742,11 @@ "scroll-top": "Gulir ke atas", "start-of-range": "Awal rentang" }, + "logs-panel": { + "render-common-labels": { + "common-labels": "" + } + }, "out-of-range-message": { "end-of-the-selected-time-range": "Akhir rentang waktu yang dipilih." }, @@ -6295,6 +7803,14 @@ }, "snapshot-list-table": { "title-delete": "Hapus" + }, + "unthemed-dashboard-import": { + "subTitle": { + "import-dashboard-from-file-or-grafanacom": "" + }, + "text": { + "import-dashboard": "Impor dasbor" + } } }, "migrate-to-cloud": { @@ -6952,8 +8468,54 @@ "close": "Tutup panel samping" }, "link-title": "Buka blog Grafana labs", + "news-panel": { + "body-error-loading-rss-feed": "", + "loading": "Memuat...", + "title-error-loading-rss-feed": "" + }, "title": "Terbaru dari blog" }, + "nodeGraph": { + "arc-options-editor": { + "add-arc": "", + "title-remove-arc": "" + }, + "edge": { + "aria-label-from-to": "" + }, + "edge-header": { + "label-source-target": "" + }, + "marker": { + "100-node-count": "", + "aria-label-hidden-marker": "", + "node-count_other": "" + }, + "node": { + "aria-label-node-title": "" + }, + "node-graph": { + "aria-label-layered-layout-performance-warning": "", + "aria-label-nodes-hidden-warning": "", + "computing-layout": "", + "no-data": "Tidak ada data", + "hidden-nodes_other": "", + "processed-nodes_other": "" + }, + "node-graph-panel": { + "no-data-found-in-response": "" + }, + "node-header": { + "label-subtitle": "", + "label-title": "Judul" + }, + "view-controls": { + "hide-config": "", + "show-config": "", + "title-zoom-in": "", + "title-zoom-out": "" + } + }, "notifications": { "empty-state": { "description": "Pemberitahuan yang Anda terima akan muncul di sini", @@ -6995,6 +8557,11 @@ "label-organization-name": "Nama organisasi", "placeholder-org-name": "Nama organisasi" }, + "org-details-page": { + "title": { + "confirm-preferences-update": "" + } + }, "org-profile": { "label-organization-name": "Nama organisasi", "label-organization-profile": "Profil organisasi", @@ -7014,7 +8581,10 @@ "tooltip": "Anda sekarang dapat memilih opsi \"Tidak ada peran dasar\" dan menambahkan izin ke kebutuhan kustom Anda. Anda dapat menemukan informasi lebih lanjut di <1> dokumentasi kami </1>." }, "user-invite-page": { - "sub-title": "Kirim undangan atau tambahkan pengguna Grafana yang ada ke organisasi.<1> {{orgName}}</1>" + "sub-title": "Kirim undangan atau tambahkan pengguna Grafana yang ada ke organisasi.<1> {{orgName}}</1>", + "text": { + "invite-user": "" + } } }, "org-picker": { @@ -7026,6 +8596,38 @@ } }, "panel": { + "get-calculation-value-data-links-variable-suggestions": { + "value-calc-var": { + "label": { + "calculation-name": "" + } + } + }, + "get-data-links-variable-suggestions": { + "value-time-var": { + "label": { + "time": "Waktu" + } + } + }, + "get-field-links-supplier": { + "text": { + "data": "Data", + "field": "Bidang", + "series": "", + "value": "Nilai" + } + }, + "get-field-vars": { + "label": { + "name": "Nama" + } + }, + "get-panel-links-variable-suggestions": { + "label": { + "all-variables": "" + } + }, "header-menu": { "copy": "Salin", "create-library-panel": "Buat panel pustaka", @@ -7086,6 +8688,13 @@ "select-placeholder": "Filter berdasarkan jenis" }, "playlist": { + "playlist-new-page": { + "page-nav": { + "text": { + "new-playlist": "Daftar putar baru" + } + } + }, "playlist-table-rows": { "aria-label-playlist-item": "Item daftar putar, {{itemType}}, {{itemValue}}", "multiple-dashboards-found": "Beberapa item ditemukan: {{items}}", @@ -7102,6 +8711,12 @@ "label-mode": "Mode", "label-time-and-refresh": "Waktu dan muat ulang", "label-variables": "Variabel", + "modes": { + "label": { + "kiosk": "Kios", + "normal": "Normal" + } + }, "title-start-playlist": "Mulai daftar putar" } }, @@ -7168,6 +8783,19 @@ }, "browse": { "aria-label-plugin-type-filter": "Filter jenis plugin", + "filter-by-options": { + "label": { + "all": "Semua", + "installed": "Diinstal", + "new-updates": "" + } + }, + "label": { + "all": "Semua", + "applications": "", + "data-sources": "Sumber data", + "panels": "Panel" + }, "label-search": "Cari", "label-state": "Status", "label-type": "Jenis", @@ -7249,12 +8877,24 @@ "empty-state": { "message": "Tidak ada plugin yang ditemukan" }, + "extensions-log-data-source": { + "message": { + "ok": "OK" + } + }, "filter": { "disabled": "Filter ini telah dinonaktifkan karena server Grafana tidak dapat mengakses grafana.com", "sort": "Urutkan", "sort-list": "Urutkan Daftar Plugin", "state": "Status" }, + "get-feature-state-info": { + "text": { + "alpha": "", + "beta": "Beta", + "deprecated": "Usang" + } + }, "get-started-with-app": { "disable": "Nonaktifkan", "enable": "Aktifkan" @@ -7311,6 +8951,16 @@ "plugin-details-header-dependencies": { "grafana-dependency": "Grafana {{grafanaDependency}}" }, + "plugin-details-page": { + "not-found-model": { + "subTitle": { + "requested-belong-plugin": "" + }, + "text": { + "unknown-plugin": "" + } + } + }, "plugin-details-signature": { "body-invalid-plugin-signature": "Grafana Labs memeriksa setiap plugin untuk memverifikasi bahwa plugin tersebut memiliki tanda tangan digital yang valid. Verifikasi tanda tangan plugin adalah bagian dari langkah-langkah keamanan kami untuk memastikan plugin aman dan tepercaya. Grafana Labs tidak dapat menjamin integritas plugin yang belum ditandatangani ini. Minta penulis plugin untuk memintanya ditandatangani.", "read-more-about-plugins-signing": "Baca selengkapnya tentang penandatanganan plugin.", @@ -7356,6 +9006,13 @@ "search-field": { "placeholder-search-grafana-plugins": "Cari plugin Grafana" }, + "use-plugin-details-tabs": { + "nav-model-children": { + "text": { + "dashboards": "Dasbor" + } + } + }, "version-install-button": { "text-installed": "Diinstal" }, @@ -7472,6 +9129,11 @@ "label-git-hub-features": "Fitur GitHub", "label-realtime-feedback": "Umpan balik real-time" }, + "connect-page": { + "subTitle": { + "connect-external-storage-manage-resources": "" + } + }, "connect-repository-button": { "configure": "Konfigurasikan", "configure-file": "Konfigurasikan penyediaan file", @@ -7505,7 +9167,13 @@ }, "edit-repository-page": { "back-to-repositories": "Kembali ke repositori", - "repository-config-exists-configuration": "Pastikan konfigurasi repositori ada dalam file konfigurasi." + "repository-config-exists-configuration": "Pastikan konfigurasi repositori ada dalam file konfigurasi.", + "subTitle": { + "configure-repository-storing-resources": "" + }, + "text": { + "configure-repository": "" + } }, "empty-state": { "no-jobs": "Tidak ada pekerjaan..." @@ -7568,6 +9236,11 @@ "no-results-matching-your-query": "Tidak ada hasil yang cocok dengan kueri Anda", "placeholder-search": "Cari" }, + "get-default-values": { + "title": { + "repository": "Repositori" + } + }, "getting-started": { "alert-temporary-outage": "Saat Anda menghubungkan seluruh instans, dasbor tidak akan tersedia saat menjalankan migrasi. Sebaiknya peringatkan pengguna Anda sebelum memulai proses.", "modal-description-public-access": "Siapkan akses publik ke instans Grafana Anda untuk mengaktifkan integrasi GitHub", @@ -7712,7 +9385,18 @@ "dashboard-preview": "Pratinjau Dasbor", "existing-dashboard": "Dasbor yang ada", "history": "Sejarah", + "message": { + "removed-from-repo-test-ui": "", + "updated-from-repo-test-ui": "" + }, "repository": "Repositori", + "tab-info": { + "label": { + "dry-run-result-after-apply": "", + "existing-from-grafana": "", + "file-from-repository": "" + } + }, "title-error-saving-file": "Kesalahan saat menyimpan file" }, "setup-modal": { @@ -8121,14 +9805,6 @@ "reload-button": "Muat ulang", "title": "Tidak dapat menemukan file aplikasi" }, - "sandbox": { - "test-stuff-page": { - "application-notifications-toasts-testing": "Pengujian pemberitahuan aplikasi (toast)", - "error": "Kesalahan", - "success": "Berhasil", - "warning": "PERINGATAN" - } - }, "save-dashboards": { "message-length": { "info": "Pesan memiliki panjang {{messageLength}} karakter, yang melebihi panjang maksimum 500 karakter. Persingkat sebelum menyimpan.", @@ -8188,6 +9864,14 @@ "view-as-folders": "Lihat menurut folder", "view-as-list": "Lihat sebagai daftar" }, + "bluge-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } + }, "dashboard-actions": { "import": "Impor", "new": "Baru", @@ -8215,6 +9899,14 @@ "search-results-table": { "aria-label-search-results-table": "Tabel hasil pencarian", "no-data": "Tidak ada nilai" + }, + "unified-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } } }, "select": { @@ -8286,6 +9978,11 @@ "delete-service-account": "Hapus akun layanan", "disable-service-account": "Nonaktifkan akun layanan", "enable-service-account": "Aktifkan akun layanan", + "page-nav": { + "subTitle": { + "manage-settings-individual-service-account": "" + } + }, "title-delete-service-account": "Hapus akun layanan", "title-disable-service-account": "Nonaktifkan akun layanan", "tokens": "Token", @@ -8602,6 +10299,11 @@ "sort-picker": { "select-aria-label": "Urutkan" }, + "status-history": { + "status-history-panel": { + "too-many-points_other": "" + } + }, "support-bundles": { "new-bundle-button": { "new-support-bundle": "Bundel dukungan baru" @@ -8609,7 +10311,10 @@ "support-bundles-create-unconnected": { "cancel": "Batalkan", "create": "Buat", - "sub-title": "Pilih komponen untuk bundel dukungan. Bundel dukungan akan tersedia selama 3 hari setelah pembuatan." + "sub-title": "Pilih komponen untuk bundel dukungan. Bundel dukungan akan tersedia selama 3 hari setelah pembuatan.", + "text": { + "create-support-bundle": "" + } }, "support-bundles-unconnected": { "created-on": "Dibuat pada", @@ -8624,10 +10329,35 @@ "login": "Login" }, "table": { + "auto-cell-options-editor": { + "description-wrap-text": "", + "label-wrap-text": "" + }, + "bar-gauge-cell-options-editor": { + "label-gauge-display-mode": "", + "label-value-display": "" + }, + "color-background-cell-options-editor": { + "description-apply-to-entire-row": "", + "description-wrap-text": "", + "label": { + "text-alpha": "" + }, + "label-apply-to-entire-row": "", + "label-background-display-mode": "", + "label-wrap-text": "", + "wrap-text": "" + }, "container": { "content": "Menampilkan terlalu banyak kolom dalam satu tabel dapat memengaruhi kinerja dan membuat data lebih sulit dibaca. Pertimbangkan untuk menyempurnakan kueri Anda.", "show-all-series": "Tampilkan semua kolom", "show-only-series": "Menampilkan {{MAX_NUMBER_OF_COLUMNS}} kolom saja" + }, + "image-cell-options-editor": { + "description-alt-text": "", + "description-title-text": "", + "label-alt-text": "", + "label-title-text": "" } }, "tag-filter": { @@ -8643,6 +10373,24 @@ "select-placeholder": "Pilih tim" }, "teams": { + "build-nav-model": { + "nav-model": { + "subTitle": { + "manage-members-and-settings": "" + }, + "text": { + "settings": "Pengaturan" + } + }, + "team-group-sync": { + "text": { + "external-group-sync": "Sinkronisasi grup eksternal" + } + }, + "text": { + "members": "Anggota" + } + }, "create-team": { "create": "Buat", "description-email": "Hal ini opsional dan secara spesifik digunakan untuk mengizinkan avatar tim kustom", @@ -8664,6 +10412,9 @@ "external-group-sync": "Sinkronisasi grup eksternal", "label-add-external-group": "Tambah grup eksternal", "team-sync-upgrade": "Tambahkan grup untuk mengaktifkan sinkronisasi tim secara gratis selama uji coba Grafana Pro Anda", + "text": { + "add-group": "Tambah grup" + }, "title-there-external-groups": "Tidak ada grup eksternal untuk disinkronkan", "tooltip-add-external-group": "Contoh grup LDAP: {{example}}" }, @@ -8765,6 +10516,42 @@ "select-search-input": "Ketik untuk mencari (negara, kota, singkatan)" } }, + "timeseries": { + "annotation-editor2": { + "add-annotation": "Tambahkan anotasi", + "cancel": "Batalkan", + "edit-annotation": "", + "label-description": "Deskripsi", + "label-tags": "Tag", + "placeholder-add-tags": "", + "save": "Simpan", + "saving": "Menyimpan" + }, + "annotation-tooltip2": { + "tooltip-delete": "Hapus", + "tooltip-edit": "Edit" + }, + "line-style-editor": { + "title-the-input-expects-a-segment-list": "", + "tooltip-help": "Bantuan" + }, + "nulls-threshold-input": { + "placeholder-never": "Jangan pernah" + }, + "outside-range-plugin": { + "data-outside-time-range": "", + "zoom-to-data": "" + }, + "timezones-editor": { + "tooltip-add-timezone": "", + "tooltip-remove-timezone": "" + } + }, + "traces": { + "traces-panel": { + "no-data-found-in-response": "" + } + }, "transformations": { "empty": { "add-transformation-body": "Transformasi memungkinkan data diubah dengan berbagai cara sebelum visualisasi Anda ditampilkan.<1></1>Ini termasuk menggabungkan data bersama, mengubah nama bidang, membuat perhitungan, memformat data untuk ditampilkan, dan banyak lagi.", @@ -8801,6 +10588,10 @@ "convert-field-type-transformer-editor": { "aria-label-add-a-convert-field-type-transformer": "Tambahkan transformer jenis bidang konversi", "aria-label-remove-convert-field-type-transformer": "Hapus transformer jenis bidang konversi", + "label": { + "browser": "Browser", + "utc": "" + }, "label-as": "sebagai", "label-date-format": "Format tanggal", "label-field": "Bidang", @@ -8887,11 +10678,32 @@ "tooltip-format": "Format output untuk bidang yang ditentukan sebagai <2>string format Moment.js</2>.", "tooltip-timezone-manually": "Atur zona waktu tanggal secara manual" }, + "get-timezone-options": { + "label": { + "browser": "Browser", + "utc": "" + } + }, "get-tooltips": { "description": "Jalur objek json yang valid.", "json-value": "Nilai JSON:", + "map-valid-paths": { + "description": { + "extract-fields-from-object": "", + "extract-value": "", + "extract-value-first-element": "", + "extract-value-second-element": "" + } + }, "valid-paths": "Jalur yang Valid:" }, + "get-transformer-option-pane": { + "root": { + "title": { + "root": "" + } + } + }, "group-by-field-configuration": { "placeholder-ignored": "Diabaikan", "placeholder-select-stats": "Pilih statistik" @@ -8908,7 +10720,23 @@ "label-cell-value": "Nilai cell", "label-column": "Kolom", "label-empty-value": "Nilai kosong", - "label-row": "Baris" + "label-row": "Baris", + "special-value-options": { + "description": { + "boolean-false-value": "", + "boolean-true-value": "", + "empty-string": "", + "null-value": "", + "number-value": "" + }, + "label": { + "empty": "Kosong", + "false": "", + "null": "", + "true": "", + "zero": "" + } + } }, "histogram-transformer-editor": { "placeholder-auto": "Auto", @@ -8971,10 +10799,22 @@ "tooltip-naming": "Mengatur tampilan nama bidang yang dipilih. Karena nama frame biasanya lebih baik untuk data tabular" }, "partition-by-values-editor": { + "keep-fields-options": { + "label": { + "no": "Tidak", + "yes": "Ya" + } + }, "label-field": "Bidang", "label-keep-fields": "Pertahankan bidang", "label-naming": "Penamaan", "label-select-field": "Pilih bidang", + "naming-modes-options": { + "label": { + "as-frame-name": "", + "as-label": "" + } + }, "partition-values-works-single-frame": "Partisi berdasarkan nilai hanya berfungsi dengan satu frame.", "tooltip-keeps-partition-fields-frames": "Menyimpan bidang partisi di frame" }, @@ -8996,6 +10836,16 @@ "label-include-time": "Sertakan waktu", "label-labels-to-fields": "Label ke bidang", "label-mode": "Mode", + "modes": { + "description": { + "collapse-field-single-value": "", + "create-table-series-value": "" + }, + "label": { + "reduce-fields": "", + "series-to-rows": "" + } + }, "placeholder-choose-stat": "Pilih stat" }, "regex-matcher-editor": { @@ -9003,11 +10853,23 @@ "variable-regex-documentation": "" }, "regression-transformer-editor": { + "label": { + "cubic": "", + "quadratic": "", + "quartic": "", + "quintic": "" + }, "label-degree": "Derajat", "label-model-type": "Tipe model", "label-predicted-points": "Titik prediksi", "label-x-field": "Bidang X", "label-y-field": "Bidang Y", + "model-type-options": { + "label": { + "linear": "", + "polynomial": "" + } + }, "tooltip-number-of-xy-points-to-predict": "Jumlah poin X,Y untuk diprediksi" }, "rename-by-regex-transformer-editor": { @@ -9025,6 +10887,23 @@ "label-reverse": "Balik", "placeholder-select-field": "Pilih bidang" }, + "supplier": { + "description": { + "apply-spatial-operations-to-the-geometry": "", + "create-a-line-between-two-points": "", + "geometry-define-field-headingdistancearea": "" + }, + "label": { + "area": "", + "as-line": "", + "calculate-value": "", + "distance": "", + "heading": "", + "line-builder": "", + "prepare-spatial-field": "", + "transform": "" + } + }, "time-series-table-transform-editor": { "label-stat": "Stat", "label-time-field": "Bidang waktu", @@ -9058,7 +10937,19 @@ "placeholder-auto": "Auto", "placeholder-field": "Bidang", "tooltip-window-size": "Ukuran jendela", - "tooltip-window-size-percent": "Atur ukuran jendela sebagai persentase dari total data" + "tooltip-window-size-percent": "Atur ukuran jendela sebagai persentase dari total data", + "type-options": { + "label": { + "centered": "", + "trailing": "" + } + }, + "window-size-mode-options": { + "label": { + "fixed": "", + "percentage": "" + } + } } }, "upgrade-box": { @@ -9115,6 +11006,11 @@ }, "users-action-bar-unconnected": { "invite": "Undang", + "options": { + "label": { + "users": "Pengguna" + } + }, "placeholder-search-login-email": "Cari pengguna berdasarkan login, email, atau nama" } }, @@ -9158,6 +11054,32 @@ "confirm-delete-modal": { "title-delete-variable": "Hapus variabel" }, + "create-ad-hoc-variable-adapter": { + "description": { + "add-keyvalue-filters-on-the-fly": "" + } + }, + "create-custom-variable-adapter": { + "description": { + "define-variable-values-manually": "" + } + }, + "create-interval-variable-adapter": { + "description": { + "define-timespan-interval": "" + } + }, + "create-query-variable-adapter": { + "description": { + "variable-values-fetched-datasource-query": "" + } + }, + "data-source-variable-slice": { + "text": { + "default": "", + "no-data-sources-found": "Tidak ada sumber data yang ditemukan" + } + }, "empty-state": { "button-title": "Tambah variabel", "info-box-content": "Variabel memungkinkan dasbor yang lebih interaktif dan dinamis. Alih-alih mengodekan hal-hal seperti nama server atau sensor dalam kueri metrik Anda, Anda dapat menggunakan variabel sebagai gantinya. Variabel ditampilkan sebagai kotak daftar di bagian atas dasbor. Daftar dropdown ini memudahkan untuk mengubah data yang ditampilkan di dasbor Anda.", @@ -9184,6 +11106,13 @@ "placeholder-default-value-if-any": "nilai default, jika ada", "text-options": "Opsi teks" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "unknown-table": { "loading": "Memuat...", "no-unknowns": "Tidak ada variabel yang diganti namanya atau hilang.", @@ -9240,5 +11169,25 @@ "data-hover-view": { "link": "Tautan" } + }, + "welcome": { + "welcome-banner": { + "need-help": "Butuh bantuan?", + "welcome-to-grafana": "" + } + }, + "xychart": { + "series-editor": { + "add-series": "", + "aria-label-select-series": "", + "label-color-field": "", + "label-frame": "Frame", + "label-size-field": "", + "label-x-field": "Bidang X", + "label-y-field": "Bidang Y", + "placeholder-all-frames": "", + "placeholder-select-frame": "", + "tooltip-delete-series": "" + } } } \ No newline at end of file diff --git a/public/locales/it-IT/grafana.json b/public/locales/it-IT/grafana.json index 1908975ea3e..78c495bb5ff 100644 --- a/public/locales/it-IT/grafana.json +++ b/public/locales/it-IT/grafana.json @@ -72,6 +72,11 @@ }, "admin-edit-org-page": { "label-name": "Nome", + "page-nav": { + "subTitle": { + "manage-settings-roles-organization": "" + } + }, "render-missing-permission-message": { "title-access-denied": "Accesso negato" } @@ -233,6 +238,13 @@ "upgrade-info": { "title": "Licenza Enterprise" }, + "user-admin-page": { + "page-nav": { + "subTitle": { + "manage-settings-for-an-individual-user": "" + } + } + }, "user-create-page": { "label-email": "E-mail", "label-name": "Nome", @@ -243,9 +255,16 @@ "label-ldap": "LDAP" }, "user-list-admin-page-un-connected": { + "label": { + "active-last-days": "", + "all-users": "Tutti gli utenti" + }, "placeholder-search-login-email": "Cerca un utente usando i dati di accesso, l'email o il nome." }, "user-list-anonymous-devices-page-un-connected": { + "label": { + "active-last-days": "" + }, "placeholder-search-devices-by-ip-address": "Cerca dispositivi per indirizzo IP." }, "user-list-page": { @@ -364,6 +383,12 @@ "no-grouping": "Nessun raggruppamento" }, "alert-group-alerts-table": { + "columns": { + "label": { + "instance-labels": "", + "notification-state": "Stato notifica" + } + }, "duration": "per {{time}}" }, "alert-group-filter": { @@ -443,6 +468,11 @@ "description-section": "Inserisci un nome per identificare il tuo {{entityName}}.", "label-metric": "Metrica", "label-name": "Nome", + "message": { + "must-enter-a-metric-name": "", + "must-enter-a-name": "", + "please-select-a-data-source": "Seleziona un'origine di dati" + }, "metric-aria-label-metric": "metrica", "metric-placeholder-recorded-metric": "Assegna un nome alla nuova metrica registrata", "placeholder-name": "Assegna un nome al tuo {{namePlaceholder}}", @@ -495,6 +525,9 @@ "alertmanager-config": { "gma-manual-configuration-description": "La configurazione interna di Grafana Alertmanager non può essere modificata manualmente. Per modificare questa configurazione, modifica le singole risorse tramite l'interfaccia utente.", "gma-manual-configuration-is-not-supported": "Modifiche alla configurazione manuale non supportate", + "message": { + "configuration-cannot-be-empty": "" + }, "reset": "Ripristino", "reset-confirmation": "Desideri davvero ripristinare la configurazione per \"{{alertmanagerName}}\"? I punti di contatto e i criteri di notifica verranno ripristinati ai valori predefiniti.", "resetting-configuration-might-while": "Reimpostazione della configurazione in corso, l'operazione potrebbe richiedere un po' di tempo.", @@ -584,6 +617,9 @@ "create-a-contact-point": "Crea punto di contatto", "label-default-contact-point": "Punto di contatto predefinito", "label-timing-options": "Opzioni di orario", + "message": { + "required": "" + }, "or": "oppure" }, "am-routes-expanded-form": { @@ -605,11 +641,19 @@ "label-override-grouping": "Sovrascrivi raggruppamento", "label-value": "Valore", "matching-labels": "Etichette corrispondenti", + "message": { + "required": "" + }, "placeholder-label": "etichetta", "placeholder-value": "valore", "remove": "Rimuovi", "tooltip-remove-matcher": "Rimuovi elemento di corrispondenza" }, + "annotation-header-field": { + "message": { + "required": "" + } + }, "annotations": { "dashboard-annotation-field": { "dashboard": "Dashboard {{dashboardUid}}", @@ -681,6 +725,25 @@ "title": "Impossibile visualizzare tutti gli eventi" } }, + "central-alert-history-scene": { + "scene": { + "labels-filter-variable": { + "label": { + "labels": "" + } + }, + "transitions-from-filter-variable": { + "label": { + "start-state": "" + } + }, + "transitions-to-filter-variable": { + "label": { + "end-state": "" + } + } + } + }, "channel-sub-form": { "delete": "Elimina", "duplicate": "Duplica", @@ -717,11 +780,17 @@ }, "cloud-data-source-selector": { "label": "Seleziona origine dati", - "label-disabled": "Sorgente dati" + "label-disabled": "Sorgente dati", + "message": { + "please-select-a-data-source": "Seleziona un'origine di dati" + } }, "cloud-evaluation-behavior": { "description-pending-period": "Periodo durante il quale la condizione di soglia deve essere soddisfatta per attivare un avviso. Selezionando \"Nessuno\" si attiva l'avviso non appena viene soddisfatta la condizione.", "label-pending-period": "Periodo di attesa", + "message": { + "must-be-a-positive-integer": "" + }, "title-set-evaluation-behavior": "Imposta comportamento di valutazione" }, "cloud-receiver-form": { @@ -762,6 +831,9 @@ "contact-point-selector": { "aria-label-refresh-contact-points": "Aggiorna i punti di contatto", "contact-point-picker-label-contact-point": "Punto di contatto", + "message": { + "contact-point-is-required": "" + }, "title-failed-to-fetch-contact-points": "Impossibile recuperare i punti di contatto", "tooltip-refresh-contact-points-list": "Aggiorna l'elenco dei punti di contatto" }, @@ -828,6 +900,14 @@ }, "copy-to-clipboard": "Copia \"{{label}}\" negli appunti", "create-metadata": { + "label": { + "dashboard": "Dashboard", + "dashboard-and-panel": "", + "evaluation-interval": "Intervallo di valutazione", + "labels": "Etichette", + "metric-name": "", + "runbook-url": "" + }, "view-dashboard": "Visualizza dashboard", "view-panel": "Visualizza pannello" }, @@ -868,9 +948,6 @@ "title-search-panel": "Pannello di ricerca", "title-select-dashboard-and-panel": "Seleziona dashboard e pannello" }, - "data-source-section": { - "import-to-grafana": "Importa nelle regole di Grafana" - }, "datasource-not-found": { "card-description": "L'origine dei dati per questa query non è stata trovata, è stata rimossa o non è installata correttamente.", "remove-query": "Rimuovi query", @@ -952,6 +1029,11 @@ "text-loading-template": "Caricamento modello in corso...", "title-failed-to-fetch-notification-template": "Impossibile recuperare il modello di notifica" }, + "edit-mute-timing-page": { + "text": { + "edit-time-interval": "" + } + }, "editor": { "edit-alert-rule": "", "edit-recording-rule": "", @@ -965,6 +1047,11 @@ "error-summary-button": { "content-show-all-errors": "" }, + "evaluate-every-validation-options": { + "message": { + "required": "" + } + }, "evaluation-behavior-summary": { "evaluate": "", "label-evaluate": "Valuta", @@ -982,6 +1069,9 @@ "evaluation-group-creation-modal": { "description-group-name": "Un gruppo valuta tutte le sue regole sullo stesso intervallo di valutazione.", "description-often-rules-group-evaluated": "Con quale frequenza vengono valutate tutte le regole del gruppo.", + "message": { + "required": "" + }, "placeholder-enter-a-name": "Inserisci un nome", "title-new-evaluation-group": "Nuovo gruppo di valutazione" }, @@ -1004,12 +1094,24 @@ "title-permission-editrecreate-silence": "Non hai l'autorizzazione per modificare/ricreare questo silenzio", "title-silence-not-found": "Silenzio esistente \"{{silenceId}}\" non trovato" }, + "existing-silence-editor-page": { + "page-nav": { + "text": { + "edit-silence": "" + } + } + }, "export": { "subtitle": { "formats": "Seleziona il formato e scarica il file o copia il contenuto negli appunti", "one-format": "Scarica il file o copia il contenuto negli appunti" } }, + "export-new-grafana-rule-page": { + "text": { + "export-new-grafana-rule": "" + } + }, "export-new-rule-button": { "tooltip-export-new-grafana-rule": "Esporta nuova regola di grafana" }, @@ -1035,6 +1137,16 @@ "no-data": "Nessun dato", "page-counter": "" }, + "feature-toggle-page": { + "nav-model": { + "subTitle": { + "enable-alerting-grafana-config": "" + }, + "text": { + "alerting-is-not-enabled": "" + } + } + }, "federated-rule-warning": { "experimental": "I gruppi di regole aggregate sono attualmente una funzionalità sperimentale.", "read-documentation": "Leggi documentazione", @@ -1042,6 +1154,13 @@ }, "file-export-inline-documentation": { "api-provisioning": "Il formato {{name}} è valido solo per il provisioning API. <3>Scopri di più nella documentazione.</3>", + "export-inline-doc": { + "title": { + "apiprovisioning-format": "", + "fileprovisioning-format": "", + "terraformprovisioning-format": "" + } + }, "file-provisioning": "Il formato {{name}} è valido solo per il provisioning API. <3>Scopri di più nella documentazione.</3>", "terraform-provisioning": "Il formato {{name}} è valido solo per il provisioning API. <3>Scopri di più nella documentazione.</3>" }, @@ -1049,6 +1168,20 @@ "copy-code": "Copia codice", "download": "Scarica" }, + "filter-options": { + "label": { + "alert-rule": "Regola avviso", + "all": "Tutti", + "error": "Errore", + "firing": "", + "no-data": "Nessun dato", + "normal": "Normale", + "ok": "OK", + "pending": "In sospeso", + "recording-rule": "Regola di registrazione", + "recovering": "Recupero in corso" + } + }, "filter-view-results": { "aria-label-filteredrulelist": "elenco-regole-filtrate" }, @@ -1083,7 +1216,10 @@ } }, "folder-selector": { - "description-select-folder": "Seleziona una cartella in cui archiviare la regola." + "description-select-folder": "Seleziona una cartella in cui archiviare la regola.", + "message": { + "select-a-folder": "" + } }, "folderAndGroup": { "evaluation": { @@ -1098,15 +1234,88 @@ "for-input": { "description-pending": "Periodo durante il quale la condizione di soglia deve essere soddisfatta per attivare un avviso. Selezionando \"Nessuno\" si attiva l'avviso non appena viene soddisfatta la condizione." }, + "for-validation-options": { + "message": { + "required": "" + } + }, "generate-alert-data-modal": { "add-alert-data": "Aggiungi dati di avviso", "add-alert-data-to-payload": "Aggiungi i dati di avviso al carico utile", + "alert-options": { + "label": { + "firing": "", + "resolved": "" + } + }, "review-alert-payload": " Esamina i dati di avviso da aggiungere al carico utile:", "title-add-custom-alerts": "Aggiungi avvisi personalizzati" }, + "get-alert-suggestions": { + "documentation": { + "annotations-attached-alert": "", + "fingerprint-identify-alert": "", + "grafana-external-alertmanager": "", + "organization-alert": "", + "time-the-alert-started-firing": "" + }, + "value": { + "labels-attached-alert": "", + "status-alert-firing-resolved": "" + } + }, + "get-cloud-scenes": { + "title": { + "mimir-alertmanager": "" + } + }, + "get-global-suggestions": { + "value": { + "an-array-containing-all-alerts": "" + } + }, + "get-grafana-alertmanager-scenes": { + "title": { + "grafana-alertmanager": "" + } + }, + "get-grafana-managed-scenes": { + "title": { + "grafanamanaged-alert-rules": "Regole di avviso gestite da Grafana" + } + }, + "get-mimir-managed-rules-per-group-scenes": { + "rule-group-handler": { + "label": { + "rule-group": "" + } + }, + "title": { + "mimirmanaged-alert-rules-per-rule-group": "" + } + }, + "get-mimir-managed-rules-scenes": { + "title": { + "mimirmanaged-alert-rules": "" + } + }, "get-preview-results": { "title-error": "Errore" }, + "get-state-display-model": { + "text": { + "alerting": "", + "error": "", + "firing": "", + "inactive": "", + "no-data": "", + "ok": "OK", + "paused": "", + "pending": "", + "recovering": "", + "unknown": "" + } + }, "getting-stared": { "learn-more": "Per un'introduzione pratica, consulta il nostro <2>tutorial per iniziare con Grafana Alerting</2>" }, @@ -1148,6 +1357,10 @@ "label-disable-resolved-message": "Disabilita messaggio risolto" }, "grafana-evaluation-behavior-step": { + "message": { + "must-be-a-positive-integer": "", + "must-enter-a-group-name": "" + }, "missing-series-resolve-placeholder": "Impostazione predefinita: 2", "or": "oppure", "placeholder-select-an-evaluation-group": "Seleziona un gruppo di valutazione...", @@ -1164,6 +1377,11 @@ "body-invalid-rule-id": "L'UID della regola nell'URL della pagina non è valido. Controlla l'URL e riprova.", "title-invalid-rule-id": "ID regola non valido" }, + "grafana-modify-export-page": { + "text": { + "modify-export": "" + } + }, "grafana-mute-timing-exporter-preview": { "text-loading": "Caricamento in corso..." }, @@ -1216,6 +1434,9 @@ }, "group-and-namespace-fields": { "group-picker-label-group": "Gruppo", + "message": { + "required": "" + }, "namespace-picker-label-namespace": "Namespace" }, "group-by": { @@ -1272,14 +1493,19 @@ "header": { "tooltip-remove": "Rimuovi l'espressione \"{{refId}}\"" }, + "history-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "Operazione riuscita" + } + }, "home": { "label-get-started": "Inizia subito", "label-insights": "Approfondimenti", "title-alerting": "Avvisi" }, - "import-from-dsrules": { - "description-folder-import-rules": "La cartella in cui importare le regole" - }, "import-to-gma": { "action-button": "Importa", "additional-settings": "Impostazioni aggiuntive", @@ -1287,8 +1513,9 @@ "confirm-modal": { "confirm": "Importa", "loading": "Caricamento in corso...", - "loading-body": "Preparazione dei dati da importare. L'operazione potrebbe richiedere un po' di tempo...", + "loading-body": "", "no-rules-body": "Non sono presenti regole da importare. Seleziona uno spazio dei nomi o un gruppo di regole diverso.", + "no-rules-body-yaml": "", "no-rules-title": "Nessuna regola da importare", "plugin-rules-warning": { "text": "Abbiamo rilevato che alcune regole sono gestite da componenti aggiuntivi. Queste regole non verranno importate.", @@ -1307,11 +1534,12 @@ "label": "Gruppo" }, "import-location-and-filters": "Importa posizione e filtri", + "import-source": "", "namespace": { "description": "Digita per cercare uno spazio dei nomi esistente", "label": "Namespace" }, - "pageTitle": "Importa le regole di avviso da un'origine dei dati alle regole gestite da Grafana", + "pageTitle": "", "pause": { "label": "Sospendi le regole di avviso importate" }, @@ -1319,10 +1547,26 @@ "label": "Sospendi le regole di registrazione importate" }, "recording-rules": "Regole di registrazione", + "source": { + "datasource": "", + "datasource-description": "", + "yaml": "", + "yaml-description": "" + }, "success": "Regole di avviso importate correttamente nelle regole gestite da Grafana.", "target-folder": { + "description": "La cartella in cui importare le regole", "label": "Cartella di destinazione" - } + }, + "yaml": { + "description": "", + "label": "", + "required-message": "", + "target-datasource": "Origine dati di destinazione", + "target-datasource-description": "", + "target-datasource-required": "" + }, + "yaml-error": "" }, "insights": { "monitor-status-of-system": "Monitora lo stato del tuo sistema", @@ -1398,6 +1642,9 @@ "text-loading-existing-labels": "Caricamento delle etichette esistenti" }, "labels-without-suggestions": { + "message": { + "required": "" + }, "placeholder-key": "chiave", "placeholder-value": "valore" }, @@ -1437,6 +1684,24 @@ "log-record-viewer-by-timestamp": { "aria-label-state-history-by-timestamp": "Cronologia degli stati per marca temporale" }, + "log-timeline-viewer": { + "label": { + "firing": "", + "mixed": "", + "no-data": "", + "normal": "Normale", + "pending": "In sospeso", + "recovering": "Recupero in corso" + } + }, + "loki-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "Operazione riuscita" + } + }, "loki-state-history": { "clear-filters": "Cancella i filtri", "common-labels": "Etichette comuni", @@ -1449,6 +1714,14 @@ "button": "Gestisci autorizzazioni", "title": "Gestisci autorizzazioni" }, + "manual-and-automatic-routing": { + "routing-options": { + "label": { + "select-contact-point": "", + "use-notification-policy": "" + } + } + }, "matcher-filter": { "filter-alerts-using-label-querying-without-braces": "Filtra gli avvisi utilizzando la query dell'etichetta senza parentesi graffe, ad esempio:", "filter-alerts-using-label-querying-without-spaces": "Filtra gli avvisi utilizzando la query dell'etichetta senza spazi, ad esempio:", @@ -1466,6 +1739,9 @@ "label-operator": "Operatore", "label-refine-affected-alerts": "Perfeziona gli avvisi interessati", "label-value": "Valore", + "message": { + "required": "" + }, "placeholder-label": "etichetta", "placeholder-value": "valore", "remove": "Rimuovi", @@ -1497,6 +1773,16 @@ "aria-label": "Altro", "button-text": "Altro" }, + "multiple-data-source-picker": { + "get-data-source-options": { + "grouped-options": { + "label": { + "data-sources-with-configured-alert-rules": "", + "other-data-sources": "" + } + } + } + }, "mute-timing-actions-buttons": { "text-disabled": "Disabilitato", "title-delete-mute-timing": "Elimina orario di disattivazione dell'audio" @@ -1560,11 +1846,26 @@ "read-more": "Scopri di più sui criteri di notifica.", "title-notification-routing": "Inoltro delle notifiche" }, + "new-mute-timing-page": { + "text": { + "add-time-interval": "" + } + }, "new-rule-from-panel-button": { "body-no-alerting-capable-query-found": "Impossibile creare avvisi da questo pannello perché non è stata trovata alcuna query a un'origine dei dati con funzione di avviso.", "new-alert-rule": "Nuova regola di avviso", "title-no-alerting-capable-query-found": "Nessuna query con funzione di avviso trovata" }, + "new-silence-page": { + "page-nav": { + "subTitle": { + "configure-silences-notifications-particular-alert": "" + }, + "text": { + "silence-alert-rule": "Silenzia regola di avviso" + } + } + }, "no-alert-managers-available": { "body-no-alertmanager-found": "Non è stato possibile trovare alcun Alertmanager esterno e potresti non avere accesso all'Alertmanager Grafana integrato.", "title-no-alertmanager-found": "Nessun Alertmanager trovato" @@ -1791,6 +2092,9 @@ "expressions": "Espressioni", "loading-data-sources": "Caricamento delle origini dei dati in corso...", "manipulate-returned-queries-other-operations": "Modifica i dati che trovi nelle query usando operazioni matematiche e di altro tipo.", + "message": { + "a-valid-expression-is-required": "" + }, "no-compatible-sources": "Sembra che tu non abbia origini dei dati compatibili", "title-deactivate-advanced-options": "Disattiva opzioni avanzate", "title-queries-expressions-configured": "Non è stata configurata alcuna query o espressione" @@ -1842,7 +2146,8 @@ }, "recording-rules": { "description-target-data-source": "L'origine dei dati di Prometheus in cui archiviare le regole di registrazione", - "label-target-data-source": "Origine dati di destinazione" + "label-target-data-source": "Origine dati di destinazione", + "target-data-source-required": "" }, "recording-rules-name-space-and-group-step": { "description-select-namespace-group-recording": "Seleziona lo Spazio dei nomi e il Gruppo per la regola di registrazione.", @@ -2103,6 +2408,9 @@ "collapse-all": "Riduci tutto", "expand-all": "Ingrandisci tutto" }, + "rule-list-v2": { + "import-to-gma": "" + }, "rule-modify-export": { "text-loading-the-rule": "Caricamento della regola in corso...", "title-cannot-exist": "Impossibile caricare la regola. La regola non esiste", @@ -2180,6 +2488,10 @@ "label-saved-searches": "Ricerche salvate" }, "health": "Stato", + "label": { + "hide": "Nascondi", + "show": "Mostra" + }, "manage-alerts": "In queste origini dei dati, è possibile selezionare Gestisci avvisi tramite l'interfaccia utente di avviso per poter gestire queste regole di avviso nell'interfaccia utente di Grafana e nell'origine dei dati in cui sono state configurate.", "placeholder-all-data-sources": "Tutte le fonti dei dati", "plugin-rules": "Regole dei componenti aggiuntivi", @@ -2276,6 +2588,9 @@ "label-comment": "Commento", "label-created-by": "Creato da", "label-duration": "Durata", + "message": { + "required": "" + }, "placeholder-whos-creating-the-silence": "Chi sta creando il silenzio", "save-silence": "Salva disattivazione audio", "saving": "Salvataggio in corso..." @@ -2314,6 +2629,12 @@ "title-alert-rule-types": "Tipi di regole di avviso" }, "state-history": { + "columns": { + "label": { + "state": "Stato", + "time": "Tempo" + } + }, "filter-group": "Filtra gruppo", "filter-group-tooltip": "Filtra ogni gruppo di cronologia degli stati per corrispondenza esatta o per espressione regolare, ad esempio:", "placeholder-search": "Cerca", @@ -2353,6 +2674,9 @@ "label-examples-documentation": "Documentazione di esempio", "label-template-group": "Gruppo modelli", "label-template-group-name": "Nome del gruppo di modelli", + "message": { + "required": "" + }, "new-template-name-placeholder-give-your-template-group-a-name": "Assegna un nome al gruppo di modelli", "title-error-saving-template": "Errore durante il salvataggio del modello", "title-templating-cheat-sheet": "Foglio di riferimento per la creazione di modelli" @@ -2375,6 +2699,11 @@ "existing-templates-selector-aria-label-choose-notification-template": "Scegli il modello di notifica", "existing-templates-selector-placeholder-choose-notification-template": "Scegli il modello di notifica", "loading": "Caricamento in corso...", + "template-options": { + "label": { + "select-notification-template": "" + } + }, "tooltip-copy": "Copia il modello di notifica selezionato negli appunti. Puoi usarlo nella scheda personalizzata." }, "templates": { @@ -2477,10 +2806,39 @@ } }, "use-columns": { + "columns": { + "label": { + "alert-rule-targeted": "", + "alerts-silenced": "", + "health": "Stato", + "matching-labels": "Etichette corrispondenti", + "name": "Nome", + "schedule": "Pianifica", + "state": "Stato", + "time-range": "Intervallo di tempo" + } + }, + "label": { + "actions": "Azioni", + "created": "Creato", + "group": "Gruppo", + "labels": "Etichette", + "next-evaluation": "Prossima valutazione", + "state": "Stato", + "summary": "Indice" + }, "title-edit": "Modifica", "title-recreate": "Ricrea", "title-unsilence": "Riattiva audio" }, + "use-combined-labels": { + "grouped-options": { + "label": { + "from-alerts": "", + "from-system": "" + } + } + }, "use-create-dropdown-menu-actions": { "label-delete": "Elimina", "label-edit": "Modifica", @@ -2514,6 +2872,17 @@ "title-edit-notification-policy": "Modifica i criteri di notifica" } }, + "use-page-nav": { + "page-nav": { + "text": { + "details": "Dettagli", + "history": "Cronologia", + "instances": "Istanze", + "query-and-conditions": "", + "versions": "Versioni" + } + } + }, "use-state-history-modal": { "state-history-modal": { "title-state-history": "Cronologia stati" @@ -2534,6 +2903,36 @@ "body": "Il contenuto YAML nell'editor contiene solo la configurazione della regola di avviso <1></1>Per configurare Prometheus, è necessario fornire il resto del <4>contenuto del file di configurazione.</4>" } }, + "alertlist": { + "group-by": { + "aria-label-group-by-label-keys": "", + "placeholder-group-by": "Raggruppa per" + }, + "ungrouped-mode-view": { + "active-for": "", + "aria-label-view-alert-rule": "", + "view-alert-rule": "" + }, + "unified-alert-list": { + "clear": "Cancella", + "text-loading": "Caricamento in corso..." + }, + "unified-alert-list-panel": { + "body-permission-required": "", + "title-permission-required": "" + } + }, + "annolist": { + "anno-list-panel": { + "aria-label-remove-filter": "", + "filter": "", + "loading": "Caricamento in corso...", + "no-annotations-found": "" + }, + "annotation-list-item": { + "tooltip-created-by": "" + } + }, "annotations": { "annotation-field-mapper": { "annotation": "Annotazioni", @@ -2630,6 +3029,11 @@ "configuration-required": "Configurazione necessaria", "refer-documentation-configure-authentication": "Fare riferimento alla documentazione su come configurare l'autenticazione" }, + "field-map": { + "label": { + "none": "Nessuno" + } + }, "fields": { "allow-assign-grafana-admin-description": "", "allow-assign-grafana-admin-label": "", @@ -2733,7 +3137,18 @@ "use-refresh-token-description": "", "use-refresh-token-label": "", "validate-hosted-domain-description": "", - "validate-hosted-domain-label": "" + "validate-hosted-domain-label": "", + "workload-identity-token-file-description": "", + "workload-identity-token-file-label": "", + "workload-identity-token-file-required": "" + }, + "get-page-nav": { + "subTitle": { + "configure-authentication-providers": "" + }, + "text": { + "authentication": "Autenticazione" + } }, "provider-card": { "text-badge-enabled": "Abilitato", @@ -2769,6 +3184,12 @@ "auth-config-auth-config-page-unconnected": { "subtitle": "Gestisci le impostazioni di autenticazione e configura il Single Sign-On. Scopri di più nella nostra <2>documentazione</2>." }, + "barchart": { + "tick-spacing-editor": { + "content-require-space-from-the-right-side": "", + "label-rtl": "" + } + }, "bookmarks-page": { "empty": { "message": "Sembra che tu non abbia ancora creato alcun segnalibro", @@ -2897,11 +3318,199 @@ "text-this-repository-is-read-only": "Se hai accesso diretto alla destinazione, copia il file JSON e incollalo lì." }, "canvas": { + "apieditor": { + "label-endpoint": "", + "label-header-parameters": "", + "label-method": "Metodo", + "label-payload": "Carico utile", + "label-query-parameters": "Parametri delle query", + "render-test-apibutton": { + "test-api": "", + "title-test-api": "" + } + }, + "button-item": { + "label": { + "center": "", + "left": "", + "right": "" + }, + "placeholder": { + "auto": "Automatico" + } + }, + "button-style-editor": { + "label-variant": "Variante" + }, + "canvas-context-menu": { + "close-editor": "", + "open-editor": "", + "render-menu-items": { + "add-item-menu-item": { + "label-add-item": "" + }, + "edit-element-menu-item": { + "label-edit": "Modifica" + }, + "label-bring-to-front": "", + "label-delete": "Elimina", + "label-duplicate": "Duplica", + "label-send-to-back": "", + "set-background-menu-item": { + "label-set-background": "" + } + } + }, + "cloud-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automatico" + } + }, + "ellipse-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automatico" + } + }, + "inline-edit": { + "canvas-inline-editor": "", + "tooltip-close-inline-editor": "" + }, + "inline-edit-body": { + "label-add-item": "", + "please-select-an-element": "" + }, + "line-style-editor": { + "label-animate": "" + }, + "metric-value-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automatico" + } + }, "not-found-display": { "not-found": "<0>Non trovato: </0><config />" }, + "pan-zoom-help": { + "ctrl-right-mouse": "", + "middle-mouse": "", + "pan-title": "", + "reset-double-click": "", + "title-pan-and-zoom-controls": "", + "zoom-scroll-wheel": "" + }, + "parallelogram-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automatico" + } + }, + "params-editor": { + "aria-label-add": "Aggiungi", + "aria-label-delete": "Elimina", + "placeholder-key": "Codice", + "placeholder-value": "Valore" + }, + "placement-editor": { + "label-constraints": "", + "label-position": "", + "loading": "Caricamento in corso..." + }, + "quick-positioning": { + "tooltip-align-bottom": "", + "tooltip-align-horizontal-centers": "", + "tooltip-align-left": "", + "tooltip-align-right": "", + "tooltip-align-top": "", + "tooltip-align-vertical-centers": "" + }, + "rectangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automatico" + } + }, "text-display": { "double-click-to-set": "Fai doppio clic per impostare il testo" + }, + "text-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automatico" + } + }, + "tree-navigation-editor": { + "clear-selection": "Cancella selezione", + "frame-selection": "", + "label-add-item": "", + "missing-layer": "", + "no-settings": "", + "switcher-icon": { + "title-node-icon": "" + } + }, + "tree-node-title": { + "title-duplicate": "Duplica", + "title-remove": "Rimuovi", + "tooltip-duplicate": "Duplica", + "tooltip-remove": "Rimuovi" + }, + "triangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automatico" + } } }, "carousel": { @@ -2981,6 +3590,22 @@ } }, "connections": { + "add-new-connection": { + "filter-by-options": { + "label": { + "all": "Tutti", + "installed": "Installato", + "new-updates": "" + } + }, + "label": { + "by-downloads": "", + "by-name-az": "", + "by-name-za": "", + "by-published-date": "", + "by-updated-date": "" + } + }, "advisor-redirect-notice": { "aria-label-link-to-advisor": "Collegamento a Advisor", "body": "Prova il nuovo Advisor per scoprire potenziali problemi con le tue origini dei dati e i tuoi componenti aggiuntivi.", @@ -2997,6 +3622,22 @@ "body": "Le origini dei dati hanno una nuova casa! Puoi scoprire nuove origini dei dati o gestire quelle esistenti nella pagina Connessioni, accessibile dal menu principale.", "go-to-connections": "Vai alle connessioni" }, + "data-source-details-page": { + "subTitle": { + "datasource-could-found": "" + }, + "text": { + "unknown-datasource": "" + } + }, + "new-data-source-page": { + "subTitle": { + "choose-a-data-source-type": "" + }, + "text": { + "add-data-source": "Aggiungi origine dei dati" + } + }, "no-access-modal": { "connection-contact-grafana-admin": "Per aggiungere una nuova connessione, contatta l'amministratore Grafana.", "editor-warning": "Gli editor non possono aggiungere nuove connessioni. È possibile verificare se è già configurato in <2>Origini dei dati</2>.", @@ -3009,6 +3650,18 @@ "search": { "aria-label-search-all": "Cerca tutto", "placeholder": "Cerca tutto" + }, + "use-data-source-settings-nav": { + "node": { + "subTitle": { + "data-source-error": "" + } + }, + "page-nav": { + "text": { + "data-source-nav-node": "" + } + } } }, "core": { @@ -3304,6 +3957,11 @@ "title-plugin-dashboard": "Dashboard del componente aggiuntivo" }, "dash-nav": { + "on-open-snapshot-original": { + "title": { + "proceed-to-external-site": "" + } + }, "render-left-actions": { "text-public": "Pubblico", "tooltip-view-as-scene": "Visualizza come Scena" @@ -3315,11 +3973,26 @@ "dashboard-loading": { "cancel-loading-dashboard": "Annulla caricamento della dashboard" }, + "dashboard-page-error": { + "text": { + "not-found": "Non trovato" + } + }, "dashboard-settings": { "actions": { "close": "Chiudi" } }, + "dashboard-slice": { + "title": { + "dashboard-init-failed": "" + } + }, + "dashboard-srv": { + "message": { + "edit-dashboard-json": "" + } + }, "dashboard-validation": { "body-dashboard-failed-schema-validation": "La convalida viene fornita a scopo di sviluppo e può essere tranquillamente ignorata. Se sei uno sviluppatore Grafana, considera la possibilità di controllare e aggiornare lo schema della dashboard", "title-checking-dashboard-validity": "Verifica della validità della dashboard in corso", @@ -3415,6 +4088,13 @@ "values": "Valori separati da virgola", "values-placeholder": "1, 10, mykey: myvalue, myvalue, escaped, value" }, + "datasource-options": { + "name-filter": "", + "name-filter-description": "", + "name-filter-placeholder": "", + "type": "Tipo", + "type-placeholder": "" + }, "description": "Descrizione", "description-placeholder": "Testo descrittivo", "label": "Etichetta", @@ -3433,8 +4113,8 @@ "category": "Seleziona opzioni", "custom-all-value": "Personalizza tutti i valori", "custom-all-value-description": "Un'espressione regolare con carattere jolly o un altro valore che sta per Tutti", - "include-all": "Includi opzione Tutti", - "include-all-description": "Abilita un'opzione per includere tutti i valori", + "include-all": "", + "include-all-description": "", "multi-value": "Valori multipli" }, "type-category": "Opzioni di {{type}}" @@ -3460,14 +4140,97 @@ "errors": { "failed-to-load": "Impossibile caricare il dashboard" }, + "fetch-dashboard": { + "message": { + "failed-to-fetch-dashboard": "" + } + }, "gen-aihistory": { "aria-label-send-custom-feedback": "Invia feedback personalizzato", "footer-text": "Questo contenuto è generato dall'IA utilizzando il <2>componente aggiuntivo Grafana LLM</2>", "placeholder-tell-ai-what-to-do-next": "Di' all'IA cosa fare dopo..." }, + "general-settings-unconnected": { + "editable-options": { + "label": { + "editable": "Modificabile", + "readonly": "" + } + } + }, + "get-debug-dashboard": { + "title": { + "annotations": "Annotazioni" + } + }, + "get-errors": { + "message": { + "error-loading-data": "" + } + }, "get-field-override-categories": { "label-add-field-override": "Aggiungi sovrascrittura campo", - "label-add-override-property": "Aggiungi proprietà di sovrascrittura" + "label-add-override-property": "Aggiungi proprietà di sovrascrittura", + "title": { + "add-button": "" + } + }, + "get-library-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "Informazioni", + "name": "Nome" + } + }, + "get-library-viz-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "Informazioni", + "name": "Nome" + } + }, + "get-panel-editor-tabs": { + "text": { + "alert": "", + "query": "Query", + "transform-data": "" + } + }, + "get-panel-frame-category": { + "descriptor": { + "title": { + "panel-options": "Opzioni pannello" + } + }, + "direction-options": { + "label": { + "horizontal": "Orizzontale", + "vertical": "Verticale" + } + }, + "title": { + "description": "Descrizione", + "max-per-row": "Max per riga", + "panel-links": "Collegamenti del pannello", + "repeat-by-variable": "Ripeti per variabile", + "repeat-direction": "Ripeti la direzione", + "repeat-options": "Ripeti le opzioni", + "title": "Titolo", + "transparent-background": "Sfondo trasparente" + } + }, + "get-panel-menu": { + "text": { + "extensions": "" + } }, "help-wizard": { "copy-to-clipboard": "Copia negli appunti", @@ -3480,10 +4243,21 @@ "randomize-field-names-label-field-names": "Nomi campi", "randomize-labels-label-labels": "Etichette", "randomize-string-values-label-string-values": "Valori stringa", + "tabs": { + "label": { + "data": "Data", + "snapshot": "Istantanea" + } + }, "title-complete-git-hub-comment-clipboard": "Copia un commento completo di GitHub negli appunti", "title-get-help-with-this-panel": "Ottieni assistenza per questo pannello", "troubleshooting-docs": "Documenti per la risoluzione dei problemi" }, + "init-dashboard": { + "message": { + "failed-create-dashboard-model": "" + } + }, "inspect": { "data-tab": "Data", "error-tab": "Errore", @@ -3536,6 +4310,16 @@ "rows": "Numero totale di righe", "table-title": "Statistiche" }, + "k8s-dashboard-api": { + "title": { + "deleted": "" + } + }, + "k8s-dashboard-v2api": { + "title": { + "deleted": "" + } + }, "layout": { "common": { "copy": "Copia", @@ -3548,6 +4332,13 @@ "panel-layout-disabled": "Seleziona una riga o una scheda per modificare le opzioni di layout del pannello" } }, + "legacy-dashboard-api": { + "fetch-error": { + "message": { + "dashboard-not-found": "" + } + } + }, "make-editable": { "dashboard-not-editable": "Dashboard non modificabile", "make-editable": "Rendi modificabile" @@ -3567,6 +4358,20 @@ "menu-use-library-panel": "Usa il pannello della libreria" }, "new-panel-title": "Nuovo pannello", + "on-create-new-row": { + "new-row": { + "title": { + "row-title": "" + } + } + }, + "on-create-new-widget-panel": { + "new-panel": { + "title": { + "widget-title": "" + } + } + }, "options": { "description": "Descrizione", "title-option": "Titolo" @@ -3626,6 +4431,30 @@ "paused": "Questa dashboard è stata sospesa dall'amministratore", "try-again-later": "Riprova più tardi" }, + "remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, + "repeat-row-select": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, + "repeat-row-select2": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, "revert-dashboard-modal": { "body-restore-version": "Desideri davvero ripristinare la dashboard alla versione {{version}}? Tutte le modifiche non salvate andranno perse.", "title-restore-version": "Ripristina versione" @@ -3739,6 +4568,18 @@ "sub-menu-un-connected": { "aria-label-template-variables": "Variabili del modello" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "tabs-layout": { "delete-tab-text": "L'eliminazione di questa scheda rimuoverà anche tutti i pannelli. Desideri continuare?", "delete-tab-title": "Eliminare la scheda?", @@ -3944,7 +4785,10 @@ }, "unthemed-dashboard-row": { "aria-label-delete-row": "Elimina riga", - "learn-more": "Scopri di più" + "learn-more": "Scopri di più", + "title": { + "delete-row": "Elimina riga" + } }, "validation": { "invalid-dashboard-id": "Impossibile trovare un ID Grafana.com valido", @@ -3979,6 +4823,16 @@ }, "visualization-select-pane": { "placeholder-search-for": "Cerca...", + "radio-options": { + "description": { + "reusable-panels-share-between-multiple-dashboards": "" + }, + "label": { + "library-panels": "Pannelli della libreria", + "suggestions": "", + "visualizations": "" + } + }, "title-close": "Chiudi" }, "viz-panel": { @@ -4029,12 +4883,25 @@ "label-data-source": "Sorgente dati", "label-use-static-key-dimensions": "Usa dimensioni chiave statiche" }, + "add-to-dashboard": { + "message": { + "could-navigate-selected-dashboard-please-again": "", + "could-panel-dashboard-please-again": "" + } + }, "add-to-dashboard-form": { "cancel": "Annulla", "description-choose-where-to-add-the-panel": "Scegli dove aggiungere il pannello.", "description-select-which-dashboard-panel-created": "Seleziona in quale dashboard verrà creato il pannello.", + "label": { + "existing-dashboard": "Dashboard esistente", + "new-dashboard": "Nuovo dashboard" + }, "label-dashboard": "Dashboard", "label-target-dashboard": "Dashboard di destinazione", + "message": { + "this-field-is-required": "Questo campo è obbligatorio." + }, "open-dashboard": "Apri dashboard", "open-in-new-tab": "Apri in una nuova scheda", "title-error-adding-the-panel": "Errore durante l'aggiunta del pannello" @@ -4072,6 +4939,25 @@ "it-cannot-contain-or": "Non può contenere \"//\" o \"..\".", "least-valid-character": "Deve contenere almeno un carattere valido." }, + "build-new-dashboard-save-model": { + "data": { + "title": { + "new-dashboard": "Nuovo dashboard" + } + } + }, + "build-new-dashboard-save-model-v2": { + "data": { + "title": { + "new-dashboard": "Nuovo dashboard" + } + } + }, + "config-public-dashboard": { + "title": { + "revoke-public-url": "Revoca URL pubblico" + } + }, "constant-variable-form": { "constant-options": "Opzioni costanti", "label-value": "Valore", @@ -4119,22 +5005,89 @@ "value-not-saved": "Il valore non è ancora stato salvato nel database di Grafana", "view-pull-request-in-git-hub": "Visualizza richiesta pull in GitHub" }, + "dashboard-scene": { + "text": { + "edit-panel": "", + "view-panel": "Visualizza pannello" + }, + "title": { + "dashboard": "Dashboard", + "discard-changes-to-dashboard": "" + } + }, + "dashboard-scene-page-state-manager": { + "message": { + "dashboard-not-found": "" + } + }, + "dashboard-scene-page-state-manager-v2": { + "message": { + "dashboard-not-found": "" + } + }, "data-source-variable-form": { "data-source-options": "Opzioni dell'origine dei dati", "description-instance-name-filter": "Filtro Regex per le istanze di origine dei dati tra cui scegliere nell'elenco dei valori delle variabili. Lascia vuoto per tutti.", "example-instance-name-filter": "Esempio: <codeExample />", "selection-options": "Seleziona opzioni" }, + "default-grid-layout-manager": { + "row": { + "title": { + "row-title": "" + } + } + }, "description-label": { "description": "Descrizione" }, + "edit-link-view": { + "edit-link-page-nav": { + "text": { + "edit-link": "Modifica i collegamenti" + } + } + }, "email-list": { "aria-label-emailmenu": "Attiva/disattiva il menu e-mail" }, + "embedded-dashboard-test-page": { + "subTitle": { + "showing-dashboard-panel-tests-pie-chart": "" + }, + "text": { + "embedding-dashboard": "" + } + }, "empty-transformations-message": { "add-transformation": "Aggiungi trasformazione" }, + "get-edit-options": { + "title": { + "column-options": "", + "row-height-options": "" + } + }, + "get-panel-frame-options": { + "descriptor": { + "title": { + "panel-options": "Opzioni pannello" + } + }, + "title": { + "description": "Descrizione", + "panel-links": "Collegamenti del pannello", + "title": "Titolo", + "transparent-background": "Sfondo trasparente" + } + }, + "get-workflow-options": { + "label": { + "push-to-a-new-branch": "" + } + }, "group-by-variable-form": { + "alert-not-supported": "", "description-enables-users-custom-values": "Consente agli utenti di aggiungere valori personalizzati all'elenco", "description-provide-dimensions-as-csv-dimension-name-dimension-id": "Fornisci le dimensioni come CSV: {{name}}, {{value}}", "group-by-options": "Raggruppa per opzioni", @@ -4153,6 +5106,12 @@ "randomize-field-names-label-field-names": "Nomi campi", "randomize-labels-label-labels": "Etichette", "randomize-string-values-label-string-values": "Valori stringa", + "tabs": { + "label": { + "data": "Data", + "snapshot": "Istantanea" + } + }, "title-complete-git-hub-comment-clipboard": "Copia un commento completo di GitHub negli appunti", "title-get-help-with-this-panel": "Ottieni assistenza per questo pannello", "troubleshooting-docs": "Documenti per la risoluzione dei problemi", @@ -4195,6 +5154,14 @@ "body-name-already-exists": "Esiste già una dashboard con lo stesso nome nella cartella selezionata. Desideri comunque salvare questa dashboard?", "title-name-already-exists": "Nome già in uso" }, + "on-remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, "panel-data-alerting-tab-rendered": { "alert": { "title-errors-loading-rules": "Errori durante il caricamento delle regole" @@ -4216,6 +5183,11 @@ "table-view-aria-label-toggletableview": "Attiva/disattiva visualizzazione tabella", "table-view-label-table-view": "Vista tabella" }, + "panel-editor": { + "text": { + "edit-panel": "" + } + }, "panel-editor-renderer": { "aria-label-open-options-pane": "Apri il riquadro delle opzioni", "tooltip-open-options-pane": "Apri il riquadro delle opzioni" @@ -4224,8 +5196,22 @@ "body-panel-plugin-not-loaded": "Assicurati che il pannello che desideri controllare sia visibile e sia stato visualizzato prima di aprire la funzione di controllo.", "title-panel-plugin-not-loaded": "Componente aggiuntivo del pannello non caricato" }, + "panel-menu-behavior": { + "async-func": { + "text": { + "extensions": "", + "metrics-drilldown": "" + } + } + }, "panel-viz-type-picker": { "placeholder-search-for": "Cerca...", + "radio-options": { + "label": { + "suggestions": "", + "visualizations": "" + } + }, "title-close": "Chiudi" }, "provisioned-delete-modal": { @@ -4252,6 +5238,15 @@ "query-options": "Opzioni query", "selection-options": "Seleziona opzioni" }, + "resource-export": { + "label": { + "classic": "", + "json": "JSON", + "v1-resource": "", + "v2-resource": "", + "yaml": "" + } + }, "revert-dashboard-modal": { "body-restore-version": "Desideri davvero ripristinare la dashboard alla versione {{version}}? Tutte le modifiche non salvate andranno perse.", "title-restore-version": "Ripristina versione" @@ -4360,6 +5355,18 @@ "solo-panel-page": { "loading": "Caricamento" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "text-box-variable-form": { "placeholder-default-value-if-any": "(opzionale)", "text-options": "Opzioni testo" @@ -4370,6 +5377,13 @@ "title-field-label": { "title": "Titolo" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "transformations-drawer": { "search-box-suffix": { "tooltip-clear-search": "Azzera ricerca" @@ -4385,6 +5399,13 @@ "save-dashboard": "Salva dashboard", "title-unsaved-changes": "Modifiche non salvate" }, + "use-dashboard-edit-page-nav": { + "page-nav": { + "text": { + "settings": "Impostazioni" + } + } + }, "variable-check-indicator": { "aria-label-variable-referenced-dashboard": "Questa variabile non è referenziata da nessuna variabile o dashboard.", "aria-label-variable-referenced-other-variables-dashboard": "Questa variabile è referenziata da altre variabili o dashboard.", @@ -4401,7 +5422,10 @@ "placeholder-descriptive-text": "Testo descrittivo", "placeholder-label-name": "Nome etichetta", "placeholder-variable-name": "Nome variabile", - "text-running-query": "Esecuzione della query in corso..." + "text-running-query": "Esecuzione della query in corso...", + "title": { + "delete-variable": "Elimina variabile" + } }, "variable-editor-list": { "definition": "Definizione", @@ -4583,6 +5607,25 @@ "message": "Nessuna origine dati trovata" } }, + "datagrid": { + "add-column": { + "placeholder-column-name": "" + }, + "datagrid-context-menu": { + "render-context-menu-items": { + "label-clear-column": "", + "label-clear-row": "", + "label-remove-all-data": "", + "label-search": "Cerca..." + }, + "render-header-menu-items": { + "label-clear-column": "", + "label-delete-column": "", + "label-rename-column": "", + "label-set-field-type": "" + } + } + }, "datasources": { "add-new-data-source-button": { "tooltip-no-permission": "Non hai l'autorizzazione per configurare nuove origini di dati" @@ -4604,6 +5647,46 @@ "label-default": "Predefinito", "label-name": "Nome" }, + "build-categories": { + "categories": { + "title": { + "cloud": "", + "distributed-tracing": "", + "enterprise-plugins": "Componenti aggiuntivi aziendali", + "industrial-io-t": "", + "logging-document-databases": "", + "others": "", + "profiling": "", + "sql": "", + "time-series-databases": "" + } + } + }, + "build-nav-model": { + "analytics": { + "text": { + "insights": "Approfondimenti" + } + }, + "caching": { + "text": { + "cache": "" + } + }, + "ds-permissions": { + "text": { + "permissions": "Autorizzazioni" + } + }, + "nav-model": { + "text": { + "settings": "Impostazioni" + } + }, + "text": { + "dashboards": "Dashboard" + } + }, "button-row": { "delete": "Elimina", "save-and-test": "Salva e prova", @@ -4639,6 +5722,11 @@ "data-source-read-only-message": { "title-provisioned-data-source": "Origine dati fornita" }, + "data-source-settings-reducer": { + "message": { + "testing-could-couple-minutes": "" + } + }, "data-source-type-card": { "aria-label-learn-more": "{{dataSourcePluginName}}, scopri di più." }, @@ -4656,13 +5744,88 @@ "footer": { "add-csv-or-spreadsheet": "Aggiungi csv o foglio di calcolo" }, + "get-enterprise-phantom-plugins": { + "description": { + "adobe-analytics-datasource": "", + "app-dynamics-integration-and-data-source": "", + "atlassian-statuspage-datasource": "", + "aurora-data-source": "", + "azure-cosmos-db-datasource": "", + "azure-devops-datasource": "", + "catchpoint-datasource": "", + "cloudflare-datasource": "", + "cockroach-db-datasource": "", + "data-dog-integration-and-data-source": "", + "drone-datasource": "", + "git-lab-integration-and-datasource": "", + "honeycomb-integration-and-datasource": "", + "jira-integration-and-datasource": "", + "logic-monitor-devices-datasource": "", + "mongo-db-integration-and-data-source": "", + "netlify-datasource": "", + "new-relic-integration-and-data-source": "", + "pager-duty-datasource": "", + "salesforce-integration-and-datasource": "", + "sap-hana-integration-and-data-source": "", + "service-now-integration-and-data-source": "", + "signal-fx-integration-and-datasource": "", + "snowflake-integration-and-data-source": "", + "sumo-logic-integration-and-datasource": "", + "visualize-and-explore-dynatrace-data": "", + "visualize-and-explore-oracle-sql": "", + "visualize-and-explore-splunk-logs": "", + "wavefront-integration-and-data-source": "", + "zendesk-datasource": "" + } + }, + "get-grafana-cloud-phantom-plugin": { + "description": { + "hosted-graphite-prometheus-and-loki": "" + } + }, "new-data-source-view": { "cancel": "Annulla", "placeholder-filter-by-name-or-type": "Filtra per nome o tipo" }, + "update-data-source": { + "error-info": { + "message": { + "an-unexpected-error-occurred": "" + } + } + }, "use-data-source-info": { "badge-text-not-supported": "Non supportata", - "badge-text-supported": "Supportata" + "badge-text-supported": "Supportata", + "label": { + "alerting": "Avvisi", + "type": "Tipo" + } + }, + "use-delete-loaded-data-source": { + "title": { + "delete": "Elimina" + } + } + }, + "debug": { + "cursor-view": { + "no-events-yet": "" + }, + "render-info-viewer": { + "data-counter": "", + "elapsed-time": "", + "field": "Campo", + "last": "", + "render-counter": "", + "schema-counter": "", + "title-reset-counters": "", + "tooltip-step-back": "", + "type": "Tipo" + }, + "state-view": { + "current-value": "", + "label-state-name": "" } }, "dimensions": { @@ -4731,6 +5894,19 @@ "remove-value-mapping-aria-label-delete-value-mapping": "Elimina mappatura valori", "remove-value-mapping-tooltip-delete": "Elimina", "set-color": "Imposta colore", + "special-match-options": { + "description": { + "boolean-false-values": "", + "boolean-true-values": "", + "empty-string": "", + "matches-against-number-na-n-not-a-number": "", + "matches-null-and-undefined-values": "", + "matches-null-undefined-and-na-n": "" + }, + "label": { + "empty": "Vuoto" + } + }, "tooltip-remove-color": "Rimuovi colore", "tooltip-remove-icon": "Rimuovi icona" }, @@ -4746,6 +5922,20 @@ "display-text": "Testo visualizzato", "icon": "Icona", "label-add-a-new-mapping": "Aggiungi una nuova mappatura", + "mapping-types": { + "description": { + "match-a-numerical-range-of-values": "", + "match-a-regular-expression-with-replacement": "", + "match-a-specific-text-value": "", + "match-boolean-empty-values": "" + }, + "label": { + "range": "", + "regex": "", + "special": "", + "value": "Valore" + } + }, "update": "Aggiorna" } }, @@ -4770,6 +5960,7 @@ }, "explore": { "accordian-logs": { + "events": "", "footer": "Le marche temporali degli eventi sono relativi all'ora di inizio della traccia completa." }, "accordian-references": { @@ -4780,6 +5971,11 @@ "basic-extensions": { "aria-label-add": "Aggiungi" }, + "build-dashboard-panel-from-explore-state": { + "title": { + "new-panel": "" + } + }, "clear": "Cancella", "confirm-navigation-modal": { "cancel": "Annulla", @@ -4866,6 +6062,33 @@ "title-table": "Tabella", "title-traces": "Tracce" }, + "explore-query-inspector": { + "data-tab": { + "label": { + "data": "Data" + } + }, + "error-tab": { + "label": { + "error": "Errore" + } + }, + "json-tab": { + "label": { + "json": "JSON" + } + }, + "query-tab": { + "label": { + "query": "Query" + } + }, + "stats-tab": { + "label": { + "stats": "Statistiche" + } + } + }, "explore-run-query-button": { "run-button": { "aria-label-run-query-options": "Esegui opzioni query" @@ -4879,10 +6102,23 @@ "description-explore-disabled": "Per abilitare Esplora, abilitalo nella configurazione di Grafana:", "title-explore-disabled": "Esplora è disabilitato" }, + "get-field-links-for-explore": { + "text": { + "data": "Data", + "raw-value": "" + } + }, "get-matches-metadata": { "matches": "0 corrispondenze" }, "legacy-create-span-link-factory": { + "text": { + "tags": "Tag" + }, + "title": { + "related-logs": "", + "session-for-this-span": "Sessione per questo intervallo" + }, "title-explore-metrics-for-this-span": "Esplora le metriche per questo intervallo", "title-explore-split": "Esplora i registri relativi a questo argomento nella visualizzazione divisa", "title-session-for-this-span": "Sessione per questo intervallo" @@ -4923,6 +6159,10 @@ }, "logs-meta-row": { "download": "Scarica", + "label": { + "deduplication-count": "", + "showing-only-selected-fields": "" + }, "show-original-line": "Mostra riga originale" }, "logs-sample-panel": { @@ -5104,6 +6344,21 @@ "run-query-button": "Esegui query", "switch-datasource-button": "Cambia origine dati ed esegui query" }, + "scoped-vars-from-span": { + "text": { + "span": "" + } + }, + "scoped-vars-from-tags": { + "text": { + "tags": "Tag" + } + }, + "scoped-vars-from-trace": { + "text": { + "trace": "Traccia" + } + }, "search-bar-input": { "placeholder-find": "Trova...", "suffix": { @@ -5138,9 +6393,25 @@ "tooltip-tag-key": "Chiave tag che verrà utilizzata per ottenere il valore del tag. Gli attributi e le risorse di un intervallo verranno cercati per la chiave del tag" }, "span-detail": { + "label": { + "kind": "", + "library-name": "", + "library-version": "", + "status": "Stato:", + "status-message": "", + "trace-state": "" + }, "label-resource-attributes": "Attributi risorsa", "label-span-attributes": "Attributi intervallo", "label-stack-trace": "Analisi stack", + "overview-items": { + "label": { + "child-count": "", + "duration": "", + "service": "", + "start-time": "" + } + }, "warnings": "Allarmi" }, "span-filters": { @@ -5247,6 +6518,18 @@ "title-node-graph": "Grafico dei nodi" }, "unthemed-logs": { + "description": { + "show-results-in-logs-visualisation": "", + "show-results-in-table-visualisation": "", + "show-results-newest-to-oldest": "", + "show-results-oldest-to-newest": "" + }, + "label": { + "logs": "Registri", + "newest-first": "Prima il più recente", + "oldest-first": "Prima il meno recente", + "table": "Tabella" + }, "label-deduplication": "Deduplicazione", "label-display-results": "Mostra risultati", "label-prettify-json": "Migliora JSON", @@ -5262,6 +6545,15 @@ }, "unthemed-virtualized-trace-view": { "title-scroll-to-top": "Scorri verso l'alto" + }, + "use-focus-span-link": { + "create-focus-span-link": { + "link": { + "title": { + "deep-link-to-this-span": "" + } + } + } } }, "export": { @@ -5347,6 +6639,15 @@ "folder-repo": { "badge-text": "Fornito" }, + "folders": { + "get-loading-nav": { + "main": { + "title": { + "loading": "Caricamento" + } + } + } + }, "forgot-password": { "back-button": "Torna all'accesso", "change-password": { @@ -5376,10 +6677,102 @@ "incomplete-request-error": "Siamo spiacenti, non è stato possibile completare la richiesta. Riprova.", "send-custom-feedback": "Invia" }, + "geomap": { + "coordinates-map-view-editor": { + "label-latitude": "", + "label-longitude": "" + }, + "debug-overlay": { + "center": "", + "zoom": "" + }, + "fit-map-view-editor": { + "all-layers-editor-fragment": { + "label-layer": "" + }, + "label-data": "Data", + "last-only-editor-fragment": { + "label-padding": "", + "tooltip-padding-relative-percent-beyond-extent": "" + } + }, + "frame-multi-selection-editor": { + "placeholder-change-filter": "" + }, + "frame-selection-editor": { + "placeholder-change-filter": "" + }, + "geomap-panel": { + "aria-label-map": "" + }, + "geomap-style-rules-editor": { + "aria-label-add-geomap-style-rule": "" + }, + "layers-editor": { + "label-add-layer": "", + "no-layers": "" + }, + "map-view-editor": { + "label-max-zoom": "", + "label-view": "Visualizza", + "label-zoom": "Zoom", + "use-current-map-settings": "" + }, + "markers-legend": { + "title-symbol": "Simbolo" + }, + "measure-overlay": { + "tooltip-show-measure-tools": "" + }, + "plugin": { + "basemap-layer-configured-server-admin": "" + }, + "style-editor": { + "label-align": "", + "label-baseline": "", + "label-color": "Colore", + "label-fill-opacity": "", + "label-font-size": "", + "label-opacity": "", + "label-rotation-angle": "", + "label-size": "", + "label-symbol": "Simbolo", + "label-symbol-horizontal-align": "", + "label-symbol-vertical-align": "", + "label-text-label": "", + "label-x-offset": "", + "label-y-offset": "" + }, + "style-rule-editor": { + "aria-label-comparison-operator": "Operatore di confronto", + "aria-label-comparison-value": "", + "aria-label-delete-style-rule": "", + "aria-label-feature-property": "", + "label-rule": "Regola", + "placeholder-feature-property": "", + "placeholder-numeric-value": "", + "placeholder-value": "valore" + } + }, "get-enterprise": { "requires-license": "Richiede una licenza Grafana Enterprise", "title": "Enterprise" }, + "gettingstarted": { + "docs-card": { + "complete": "completo", + "learn-how": "" + }, + "getting-started": { + "aria-label-to-advanced-tutorials": "", + "aria-label-to-basic-tutorials": "", + "checking-completed-setup-steps": "", + "remove-this-panel": "" + }, + "tutorial-card": { + "complete": "completo" + } + }, "gops": { "config-card": { "text-loading-configuration": "Caricamento configurazione in corso..." @@ -5396,6 +6789,74 @@ }, "progress-status": { "your-progress": "I tuoi progressi" + }, + "use-get-configuration-for-ui": { + "get-connect-data-source-configuration": { + "title": { + "connect-data-source": "" + } + }, + "title": { + "essentials": "Informazioni di base" + } + }, + "use-get-essentials-configuration": { + "essential-content": { + "description": { + "configure-grafana-alerting": "", + "create-integration-alerting-contact-point": "", + "initialize-incident-plugin-declare-manage-incidents": "", + "practice-solving-an-incident": "", + "receive-alerts-oncall-notifications-within-environment": "", + "select-chat-ops-channels-to-route-notifications": "" + }, + "label": { + "add": "Aggiungi", + "connect": "Connetti", + "initialize": "", + "select-integration": "", + "start-drill": "" + }, + "title": { + "add-slack-notifications-to-irm-integrations": "", + "connect-alerting-to-irm": "", + "connect-irm-to-your-slack-workspace": "", + "connect-your-messaging-workspace-to-incident": "", + "connect-your-messaging-workspace-to-on-call": "", + "create-incident-drill": "", + "detect": "Rileva", + "initialize-incident-plugin": "", + "messaging-workspace-channel-on-call-integration": "", + "respond": "", + "test-your-configuration": "" + } + }, + "get-grafana-alerting-config-steps": { + "description": { + "create-alert-monitor-system": "", + "create-on-call-integration-alerting-contact-point": "", + "create-slos-to-monitor-your-service": "" + }, + "label": { + "connect": "Connetti", + "create": "Crea", + "enable": "Abilita" + }, + "steps": { + "label": { + "edit": "Modifica" + }, + "title": { + "update-default-contact-point": "" + } + }, + "title": { + "connect-alerting-to-on-call": "", + "create-alert-rule": "", + "create-slo": "", + "enable-slo-alerting": "" + } + } } }, "grafana": { @@ -5762,14 +7223,18 @@ "duplicate-panel": "Duplica pannello", "exit-edit/setting-views": "Esci dalle viste di modifica/impostazione", "expand-all-rows": "Espandi tutte le righe", + "explore-panel": "", "go-to-dashboards": "Vai ai dashboard", "go-to-explore": "Vai a Esplora", "go-to-home-dashboard": "Vai al dashboard principale", "go-to-profile": "Vai al profilo", + "inspect-panel": "", "make-time-range-permanent": "Rendi l'intervallo di tempo assoluto/permanente", "move-time-range-back": "Sposta indietro l'intervallo di tempo", "move-time-range-forward": "Sposta avanti l'intervallo di tempo", "open-search": "Apri ricerca", + "open-share-embed-drawer": "", + "open-share-link-drawer": "", "open-shared-modal": "Condividi snapshot del pannello", "paste-time-range": "Incolla intervallo di tempo", "refresh-all-panels": "Aggiorna tutti i pannelli", @@ -5795,6 +7260,11 @@ "support-bundle": "Puoi anche recuperare un pacchetto di supporto contenente informazioni sulla tua istanza di Grafana e sulle origini dati configurate nella <1>sezione dei pacchetti di supporto</1>.", "troubleshooting-help": "Per richiedere assistenza con la risoluzione dei problemi, invia un'istantanea di questo pannello al supporto tecnico di Grafana Labs. L'istantanea contiene i dati di risposta alla query e le impostazioni del pannello." }, + "histogram": { + "histogram-panel": { + "no-histogram-found-in-response": "" + } + }, "inspector": { "inspect-data-tab": { "loading": "Caricamento", @@ -5844,6 +7314,9 @@ "label-name": "Nome", "label-password": "Password", "label-username": "Nome utente", + "message": { + "email-is-invalid": "" + }, "placeholder-name-optional": "Nome (opzionale)", "placeholder-password": "Password", "placeholder-username": "Nome utente", @@ -6103,8 +7576,26 @@ "discard-local-changes": "Annulla modifiche locali", "title-dashboard-changed": "Dashboard modificata" }, + "live-channel-editor": { + "description-grafana-live": "", + "namespace": "Namespace", + "path": "Percorso", + "placeholder-select-watchable-resource": "", + "scope": "", + "title-grafana-live": "" + }, "live-connection-warning": { "title-connection-to-server-is-lost": "Connessione al server persa..." + }, + "live-panel": { + "error": "Errore", + "grafana-requires-feature": "", + "panel-editor-channel": "", + "title-grafana-live": "", + "waiting-for-data": "" + }, + "live-publish": { + "publish": "" } }, "lock-icon": "icona lucchetto", @@ -6151,6 +7642,13 @@ } }, "logs": { + "get-dataframe-fields": { + "vars": { + "text": { + "labels": "Etichette" + } + } + }, "infinite-scroll": { "end-of-range": "Fine dell'intervallo di tempo selezionato.", "load-more": "Scorri per caricare altro", @@ -6231,6 +7729,11 @@ "shortcut": "alt+seleziona per abilitare di nuovo" } }, + "log-series-to-logs-model": { + "label": { + "total-bytes-processed": "" + } + }, "logs-controls": { "deduplication": "Deduplicazione", "disable-highlighting": "Disabilita evidenziazione", @@ -6265,6 +7768,11 @@ "scroll-top": "Scorri verso l'alto", "start-of-range": "Inizio dell'intervallo" }, + "logs-panel": { + "render-common-labels": { + "common-labels": "" + } + }, "out-of-range-message": { "end-of-the-selected-time-range": "Fine dell'intervallo di tempo selezionato." }, @@ -6321,6 +7829,14 @@ }, "snapshot-list-table": { "title-delete": "Elimina" + }, + "unthemed-dashboard-import": { + "subTitle": { + "import-dashboard-from-file-or-grafanacom": "" + }, + "text": { + "import-dashboard": "Importa dashboard" + } } }, "migrate-to-cloud": { @@ -6978,8 +8494,57 @@ "close": "Chiudi cassetto di navigazione" }, "link-title": "Vai al blog di Grafana Labs", + "news-panel": { + "body-error-loading-rss-feed": "", + "loading": "Caricamento in corso...", + "title-error-loading-rss-feed": "" + }, "title": "Ultime dal blog" }, + "nodeGraph": { + "arc-options-editor": { + "add-arc": "", + "title-remove-arc": "" + }, + "edge": { + "aria-label-from-to": "" + }, + "edge-header": { + "label-source-target": "" + }, + "marker": { + "100-node-count": "", + "aria-label-hidden-marker": "", + "node-count_one": "", + "node-count_other": "" + }, + "node": { + "aria-label-node-title": "" + }, + "node-graph": { + "aria-label-layered-layout-performance-warning": "", + "aria-label-nodes-hidden-warning": "", + "computing-layout": "", + "no-data": "Nessun dato", + "hidden-nodes_one": "", + "hidden-nodes_other": "", + "processed-nodes_one": "", + "processed-nodes_other": "" + }, + "node-graph-panel": { + "no-data-found-in-response": "" + }, + "node-header": { + "label-subtitle": "", + "label-title": "Titolo" + }, + "view-controls": { + "hide-config": "", + "show-config": "", + "title-zoom-in": "", + "title-zoom-out": "" + } + }, "notifications": { "empty-state": { "description": "Le notifiche che hai ricevuto verranno visualizzate qui", @@ -7021,6 +8586,11 @@ "label-organization-name": "Nome organizzazione", "placeholder-org-name": "Nome org." }, + "org-details-page": { + "title": { + "confirm-preferences-update": "" + } + }, "org-profile": { "label-organization-name": "Nome organizzazione", "label-organization-profile": "Profilo dell'organizzazione", @@ -7040,7 +8610,10 @@ "tooltip": "Ora puoi selezionare l'opzione \"Nessun ruolo di base\" e aggiungere autorizzazioni in base alle tue esigenze personalizzate. Puoi trovare maggiori informazioni nella <1>nostra documentazione</1>." }, "user-invite-page": { - "sub-title": "Invia un invito o aggiungi un utente Grafana esistente all'organizzazione.<1> {{orgName}}</1>" + "sub-title": "Invia un invito o aggiungi un utente Grafana esistente all'organizzazione.<1> {{orgName}}</1>", + "text": { + "invite-user": "" + } } }, "org-picker": { @@ -7052,6 +8625,38 @@ } }, "panel": { + "get-calculation-value-data-links-variable-suggestions": { + "value-calc-var": { + "label": { + "calculation-name": "" + } + } + }, + "get-data-links-variable-suggestions": { + "value-time-var": { + "label": { + "time": "Tempo" + } + } + }, + "get-field-links-supplier": { + "text": { + "data": "Data", + "field": "Campo", + "series": "", + "value": "Valore" + } + }, + "get-field-vars": { + "label": { + "name": "Nome" + } + }, + "get-panel-links-variable-suggestions": { + "label": { + "all-variables": "" + } + }, "header-menu": { "copy": "Copia", "create-library-panel": "Crea pannello della libreria", @@ -7112,6 +8717,13 @@ "select-placeholder": "Filtra per tipo" }, "playlist": { + "playlist-new-page": { + "page-nav": { + "text": { + "new-playlist": "Nuova playlist" + } + } + }, "playlist-table-rows": { "aria-label-playlist-item": "Elemento playlist, {{itemType}}, {{itemValue}}", "multiple-dashboards-found": "Più elementi trovati: {{items}}", @@ -7128,6 +8740,12 @@ "label-mode": "Modalità", "label-time-and-refresh": "Ora e aggiornamento", "label-variables": "Variabili", + "modes": { + "label": { + "kiosk": "Kiosk ", + "normal": "Normale" + } + }, "title-start-playlist": "Avvia playlist" } }, @@ -7194,6 +8812,19 @@ }, "browse": { "aria-label-plugin-type-filter": "Filtro del tipo di componente aggiuntivo", + "filter-by-options": { + "label": { + "all": "Tutti", + "installed": "Installato", + "new-updates": "" + } + }, + "label": { + "all": "Tutti", + "applications": "", + "data-sources": "Fonti dei dati", + "panels": "Pannelli" + }, "label-search": "Cerca", "label-state": "Stato", "label-type": "Tipo", @@ -7275,12 +8906,24 @@ "empty-state": { "message": "Nessun plug-in trovato" }, + "extensions-log-data-source": { + "message": { + "ok": "OK" + } + }, "filter": { "disabled": "Questo filtro è stato disabilitato perché il server Grafana non può accedere a grafana.com", "sort": "Ordina", "sort-list": "Ordina elenco plug-in", "state": "Stato" }, + "get-feature-state-info": { + "text": { + "alpha": "", + "beta": "Beta", + "deprecated": "Obsoleto" + } + }, "get-started-with-app": { "disable": "Disabilita", "enable": "Abilita" @@ -7337,6 +8980,16 @@ "plugin-details-header-dependencies": { "grafana-dependency": "Grafana {{grafanaDependency}}" }, + "plugin-details-page": { + "not-found-model": { + "subTitle": { + "requested-belong-plugin": "" + }, + "text": { + "unknown-plugin": "" + } + } + }, "plugin-details-signature": { "body-invalid-plugin-signature": "Grafana Labs controlla ogni componente aggiuntivo per verificare che abbia una firma digitale valida. La verifica della firma del componente aggiuntivo fa parte delle nostre misure di sicurezza per garantire che siano sicuri e affidabili. Grafana Labs non può garantire l'integrità di questo componente aggiuntivo non firmato. Chiedi all'autore del componente aggiuntivo di richiederne la firma.", "read-more-about-plugins-signing": "Scopri di più sulla firma dei componenti aggiuntivi.", @@ -7382,6 +9035,13 @@ "search-field": { "placeholder-search-grafana-plugins": "Cerca componente aggiuntivo Grafana" }, + "use-plugin-details-tabs": { + "nav-model-children": { + "text": { + "dashboards": "Dashboard" + } + } + }, "version-install-button": { "text-installed": "Installato" }, @@ -7499,6 +9159,11 @@ "label-git-hub-features": "Funzionalità di GitHub", "label-realtime-feedback": "Feedback in tempo reale" }, + "connect-page": { + "subTitle": { + "connect-external-storage-manage-resources": "" + } + }, "connect-repository-button": { "configure": "Configura", "configure-file": "Configura il provisioning dei file", @@ -7532,7 +9197,13 @@ }, "edit-repository-page": { "back-to-repositories": "Torna ai repository", - "repository-config-exists-configuration": "Assicurati che la configurazione del repository esista nel file di configurazione." + "repository-config-exists-configuration": "Assicurati che la configurazione del repository esista nel file di configurazione.", + "subTitle": { + "configure-repository-storing-resources": "" + }, + "text": { + "configure-repository": "" + } }, "empty-state": { "no-jobs": "Nessuna attività..." @@ -7595,6 +9266,11 @@ "no-results-matching-your-query": "Nessun risultato corrisponde alla tua query", "placeholder-search": "Cerca" }, + "get-default-values": { + "title": { + "repository": "Repository" + } + }, "getting-started": { "alert-temporary-outage": "Quando colleghi l'intera istanza, le dashboard non saranno disponibili durante l'esecuzione della migrazione. Ti consigliamo di avvisare gli utenti prima di avviare il processo.", "modal-description-public-access": "Configura l'accesso pubblico alla tua istanza Grafana per abilitare l'integrazione con GitHub", @@ -7739,7 +9415,18 @@ "dashboard-preview": "Anteprima dashboard", "existing-dashboard": "Dashboard esistente", "history": "Cronologia", + "message": { + "removed-from-repo-test-ui": "", + "updated-from-repo-test-ui": "" + }, "repository": "Repository", + "tab-info": { + "label": { + "dry-run-result-after-apply": "", + "existing-from-grafana": "", + "file-from-repository": "" + } + }, "title-error-saving-file": "Errore nel salvataggio del file" }, "setup-modal": { @@ -8152,14 +9839,6 @@ "reload-button": "Ricarica", "title": "Impossibile trovare il file dell'applicazione" }, - "sandbox": { - "test-stuff-page": { - "application-notifications-toasts-testing": "Test delle notifiche dell'applicazione (avvisi)", - "error": "Errore", - "success": "Operazione riuscita", - "warning": "Attenzione" - } - }, "save-dashboards": { "message-length": { "info": "Il messaggio è di {{messageLength}} caratteri e supera la lunghezza massima di 500 caratteri. Accorcialo prima di salvare.", @@ -8219,6 +9898,14 @@ "view-as-folders": "Visualizza per cartelle", "view-as-list": "Mostra come elenco" }, + "bluge-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } + }, "dashboard-actions": { "import": "Importa", "new": "Nuovo", @@ -8246,6 +9933,14 @@ "search-results-table": { "aria-label-search-results-table": "Tabella dei risultati della ricerca", "no-data": "Nessun valore" + }, + "unified-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } } }, "select": { @@ -8317,6 +10012,11 @@ "delete-service-account": "Elimina account di servizio", "disable-service-account": "Disabilita account di servizio", "enable-service-account": "Abilita account di servizio", + "page-nav": { + "subTitle": { + "manage-settings-individual-service-account": "" + } + }, "title-delete-service-account": "Elimina account di servizio", "title-disable-service-account": "Disabilita account di servizio", "tokens": "Token", @@ -8633,6 +10333,12 @@ "sort-picker": { "select-aria-label": "Ordina" }, + "status-history": { + "status-history-panel": { + "too-many-points_one": "", + "too-many-points_other": "" + } + }, "support-bundles": { "new-bundle-button": { "new-support-bundle": "Nuovo pacchetto di supporto" @@ -8640,7 +10346,10 @@ "support-bundles-create-unconnected": { "cancel": "Annulla", "create": "Crea", - "sub-title": "Scegli i componenti per il pacchetto di supporto. Il pacchetto di supporto sarà disponibile per 3 giorni dopo la creazione." + "sub-title": "Scegli i componenti per il pacchetto di supporto. Il pacchetto di supporto sarà disponibile per 3 giorni dopo la creazione.", + "text": { + "create-support-bundle": "" + } }, "support-bundles-unconnected": { "created-on": "Creato il", @@ -8655,10 +10364,35 @@ "login": "Accedi" }, "table": { + "auto-cell-options-editor": { + "description-wrap-text": "", + "label-wrap-text": "" + }, + "bar-gauge-cell-options-editor": { + "label-gauge-display-mode": "", + "label-value-display": "" + }, + "color-background-cell-options-editor": { + "description-apply-to-entire-row": "", + "description-wrap-text": "", + "label": { + "text-alpha": "" + }, + "label-apply-to-entire-row": "", + "label-background-display-mode": "", + "label-wrap-text": "", + "wrap-text": "" + }, "container": { "content": "La visualizzazione di troppe colonne in una singola tabella può influire sulle prestazioni e rendere più difficile la lettura dei dati. Valuta di perfezionare le query.", "show-all-series": "Mostra tutte le colonne", "show-only-series": "Mostra solo {{MAX_NUMBER_OF_COLUMNS}} colonne" + }, + "image-cell-options-editor": { + "description-alt-text": "", + "description-title-text": "", + "label-alt-text": "", + "label-title-text": "" } }, "tag-filter": { @@ -8674,6 +10408,24 @@ "select-placeholder": "Seleziona un team" }, "teams": { + "build-nav-model": { + "nav-model": { + "subTitle": { + "manage-members-and-settings": "" + }, + "text": { + "settings": "Impostazioni" + } + }, + "team-group-sync": { + "text": { + "external-group-sync": "Sincronizzazione gruppo esterno" + } + }, + "text": { + "members": "Membri" + } + }, "create-team": { "create": "Crea", "description-email": "Questo è facoltativo e viene utilizzato principalmente per consentire avatar di team personalizzati", @@ -8695,6 +10447,9 @@ "external-group-sync": "Sincronizzazione gruppo esterno", "label-add-external-group": "Aggiungi gruppo esterno", "team-sync-upgrade": "Aggiungi un gruppo per abilitare la sincronizzazione del team gratuitamente durante la prova di Grafana Pro", + "text": { + "add-group": "Aggiungi gruppo" + }, "title-there-external-groups": "Non sono presenti gruppi esterni con cui sincronizzarsi", "tooltip-add-external-group": "Esempio di gruppo LDAP: {{example}}" }, @@ -8796,6 +10551,42 @@ "select-search-input": "Digita per cercare (paese, città, abbreviazione)" } }, + "timeseries": { + "annotation-editor2": { + "add-annotation": "Aggiungi annotazione", + "cancel": "Annulla", + "edit-annotation": "", + "label-description": "Descrizione", + "label-tags": "Tag", + "placeholder-add-tags": "", + "save": "Salva", + "saving": "Salvataggio in corso" + }, + "annotation-tooltip2": { + "tooltip-delete": "Elimina", + "tooltip-edit": "Modifica" + }, + "line-style-editor": { + "title-the-input-expects-a-segment-list": "", + "tooltip-help": "Guida" + }, + "nulls-threshold-input": { + "placeholder-never": "Mai" + }, + "outside-range-plugin": { + "data-outside-time-range": "", + "zoom-to-data": "" + }, + "timezones-editor": { + "tooltip-add-timezone": "", + "tooltip-remove-timezone": "" + } + }, + "traces": { + "traces-panel": { + "no-data-found-in-response": "" + } + }, "transformations": { "empty": { "add-transformation-body": "Le trasformazioni consentono di modificare i dati in vari modi prima che vengano mostrati nella visualizzazione.<1></1>Questo include l'unione dei dati, la ridenominazione dei campi, l'esecuzione di calcoli, la formattazione dei dati per la visualizzazione e altro ancora.", @@ -8832,6 +10623,10 @@ "convert-field-type-transformer-editor": { "aria-label-add-a-convert-field-type-transformer": "Aggiungi un trasformatore del tipo di campo di conversione", "aria-label-remove-convert-field-type-transformer": "Rimuovi il trasformatore del tipo di campo di conversione", + "label": { + "browser": "Browser", + "utc": "" + }, "label-as": "come", "label-date-format": "Formato data", "label-field": "Campo", @@ -8918,11 +10713,32 @@ "tooltip-format": "Il formato di output per il campo specificato come <2>stringa di formato Moment.js</2>.", "tooltip-timezone-manually": "Imposta manualmente il fuso orario della data" }, + "get-timezone-options": { + "label": { + "browser": "Browser", + "utc": "" + } + }, "get-tooltips": { "description": "Un percorso valido di un oggetto json.", "json-value": "Valore JSON:", + "map-valid-paths": { + "description": { + "extract-fields-from-object": "", + "extract-value": "", + "extract-value-first-element": "", + "extract-value-second-element": "" + } + }, "valid-paths": "Percorsi validi:" }, + "get-transformer-option-pane": { + "root": { + "title": { + "root": "" + } + } + }, "group-by-field-configuration": { "placeholder-ignored": "Ignorato", "placeholder-select-stats": "Seleziona statistiche" @@ -8939,7 +10755,23 @@ "label-cell-value": "Valore cella", "label-column": "Colonna", "label-empty-value": "Valore vuoto", - "label-row": "Riga" + "label-row": "Riga", + "special-value-options": { + "description": { + "boolean-false-value": "", + "boolean-true-value": "", + "empty-string": "", + "null-value": "", + "number-value": "" + }, + "label": { + "empty": "Vuoto", + "false": "", + "null": "", + "true": "", + "zero": "" + } + } }, "histogram-transformer-editor": { "placeholder-auto": "Automatico", @@ -9002,10 +10834,22 @@ "tooltip-naming": "Imposta la modalità di visualizzazione dei nomi dei campi selezionati. Dato che il nome del fotogramma di solito è più adatto per i dati tabulari" }, "partition-by-values-editor": { + "keep-fields-options": { + "label": { + "no": "No", + "yes": "Sì" + } + }, "label-field": "Campo", "label-keep-fields": "Mantieni i campi", "label-naming": "Denominazione", "label-select-field": "Seleziona campo", + "naming-modes-options": { + "label": { + "as-frame-name": "", + "as-label": "" + } + }, "partition-values-works-single-frame": "Partizione per valori funziona solo con un singolo fotogramma.", "tooltip-keeps-partition-fields-frames": "Mantiene i campi di partizione nei fotogrammi" }, @@ -9027,6 +10871,16 @@ "label-include-time": "Includi l'ora", "label-labels-to-fields": "Etichette ai campi", "label-mode": "Modalità", + "modes": { + "description": { + "collapse-field-single-value": "", + "create-table-series-value": "" + }, + "label": { + "reduce-fields": "", + "series-to-rows": "" + } + }, "placeholder-choose-stat": "Scegli stat" }, "regex-matcher-editor": { @@ -9034,11 +10888,23 @@ "variable-regex-documentation": "" }, "regression-transformer-editor": { + "label": { + "cubic": "", + "quadratic": "", + "quartic": "", + "quintic": "" + }, "label-degree": "Grado", "label-model-type": "Tipo di modello", "label-predicted-points": "Punti previsti", "label-x-field": "Campo X", "label-y-field": "Campo Y", + "model-type-options": { + "label": { + "linear": "", + "polynomial": "" + } + }, "tooltip-number-of-xy-points-to-predict": "Numero di punti X, Y da prevedere" }, "rename-by-regex-transformer-editor": { @@ -9056,6 +10922,23 @@ "label-reverse": "Inverti", "placeholder-select-field": "Seleziona campo" }, + "supplier": { + "description": { + "apply-spatial-operations-to-the-geometry": "", + "create-a-line-between-two-points": "", + "geometry-define-field-headingdistancearea": "" + }, + "label": { + "area": "", + "as-line": "", + "calculate-value": "", + "distance": "", + "heading": "", + "line-builder": "", + "prepare-spatial-field": "", + "transform": "" + } + }, "time-series-table-transform-editor": { "label-stat": "Stat.", "label-time-field": "Campo dell'ora", @@ -9089,7 +10972,19 @@ "placeholder-auto": "Automatico", "placeholder-field": "Campo", "tooltip-window-size": "Dimensioni finestra", - "tooltip-window-size-percent": "Imposta la dimensione della finestra come percentuale dei dati totali" + "tooltip-window-size-percent": "Imposta la dimensione della finestra come percentuale dei dati totali", + "type-options": { + "label": { + "centered": "", + "trailing": "" + } + }, + "window-size-mode-options": { + "label": { + "fixed": "", + "percentage": "" + } + } } }, "upgrade-box": { @@ -9146,6 +11041,11 @@ }, "users-action-bar-unconnected": { "invite": "Invita", + "options": { + "label": { + "users": "Utenti" + } + }, "placeholder-search-login-email": "Cerca un utente usando i dati di accesso, l'email o il nome" } }, @@ -9189,6 +11089,32 @@ "confirm-delete-modal": { "title-delete-variable": "Elimina variabile" }, + "create-ad-hoc-variable-adapter": { + "description": { + "add-keyvalue-filters-on-the-fly": "" + } + }, + "create-custom-variable-adapter": { + "description": { + "define-variable-values-manually": "" + } + }, + "create-interval-variable-adapter": { + "description": { + "define-timespan-interval": "" + } + }, + "create-query-variable-adapter": { + "description": { + "variable-values-fetched-datasource-query": "" + } + }, + "data-source-variable-slice": { + "text": { + "default": "", + "no-data-sources-found": "Nessuna origine dati trovata" + } + }, "empty-state": { "button-title": "Aggiungi variabile", "info-box-content": "Le variabili consentono dashboard più interattivi e dinamici. Invece di codificare elementi come i nomi di server o sensori nelle query delle metriche, è possibile utilizzare le variabili al loro posto. Le variabili vengono visualizzate come caselle di riepilogo nella parte superiore del dashboard. Questi elenchi a discesa semplificano la modifica dei dati visualizzati nel dashboard.", @@ -9215,6 +11141,13 @@ "placeholder-default-value-if-any": "valore predefinito, se presente", "text-options": "Opzioni testo" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "unknown-table": { "loading": "Caricamento in corso...", "no-unknowns": "Nessuna variabile rinominata o mancante trovata.", @@ -9271,5 +11204,25 @@ "data-hover-view": { "link": "Collegamento" } + }, + "welcome": { + "welcome-banner": { + "need-help": "Hai bisogno di aiuto?", + "welcome-to-grafana": "" + } + }, + "xychart": { + "series-editor": { + "add-series": "", + "aria-label-select-series": "", + "label-color-field": "", + "label-frame": "Fotogramma", + "label-size-field": "", + "label-x-field": "Campo X", + "label-y-field": "Campo Y", + "placeholder-all-frames": "", + "placeholder-select-frame": "", + "tooltip-delete-series": "" + } } } \ No newline at end of file diff --git a/public/locales/ja-JP/grafana.json b/public/locales/ja-JP/grafana.json index 7901e383592..4fce64ef6d4 100644 --- a/public/locales/ja-JP/grafana.json +++ b/public/locales/ja-JP/grafana.json @@ -72,6 +72,11 @@ }, "admin-edit-org-page": { "label-name": "名前", + "page-nav": { + "subTitle": { + "manage-settings-roles-organization": "" + } + }, "render-missing-permission-message": { "title-access-denied": "アクセス拒否" } @@ -233,6 +238,13 @@ "upgrade-info": { "title": "エンタープライズライセンス" }, + "user-admin-page": { + "page-nav": { + "subTitle": { + "manage-settings-for-an-individual-user": "" + } + } + }, "user-create-page": { "label-email": "メールアドレス", "label-name": "名前", @@ -243,9 +255,16 @@ "label-ldap": "LDAP" }, "user-list-admin-page-un-connected": { + "label": { + "active-last-days": "", + "all-users": "すべてのユーザー" + }, "placeholder-search-login-email": "ログイン、メールアドレス、または名前でユーザーを検索します。" }, "user-list-anonymous-devices-page-un-connected": { + "label": { + "active-last-days": "" + }, "placeholder-search-devices-by-ip-address": "IPアドレスでデバイスを検索します。" }, "user-list-page": { @@ -364,6 +383,12 @@ "no-grouping": "グループ化なし" }, "alert-group-alerts-table": { + "columns": { + "label": { + "instance-labels": "", + "notification-state": "通知状態" + } + }, "duration": "{{time}}の間" }, "alert-group-filter": { @@ -439,6 +464,11 @@ "description-section": "{{entityName}}を識別できる名前を入力してください。", "label-metric": "メトリック", "label-name": "名前", + "message": { + "must-enter-a-metric-name": "", + "must-enter-a-name": "", + "please-select-a-data-source": "データソースを選択してください" + }, "metric-aria-label-metric": "メトリック", "metric-placeholder-recorded-metric": "新しく記録するメトリックの名前を付けてください", "placeholder-name": "{{namePlaceholder}}に名前を付けてください", @@ -491,6 +521,9 @@ "alertmanager-config": { "gma-manual-configuration-description": "内部Grafana Alertmanager設定は手動で変更できません。この設定を変更するには、UI経由で個々のリソースを編集してください。", "gma-manual-configuration-is-not-supported": "手動構成の変更はサポートされていません", + "message": { + "configuration-cannot-be-empty": "" + }, "reset": "リセット", "reset-confirmation": "「{{alertmanagerName}}」の設定をリセットしてもよろしいですか?連絡先と通知ポリシーはデフォルトにリセットされます。", "resetting-configuration-might-while": "設定をリセットしています。これにはしばらく時間がかかる場合があります。", @@ -580,6 +613,9 @@ "create-a-contact-point": "連絡先を作成", "label-default-contact-point": "デフォルトの連絡先", "label-timing-options": "タイミングオプション", + "message": { + "required": "" + }, "or": "もしくは" }, "am-routes-expanded-form": { @@ -601,11 +637,19 @@ "label-override-grouping": "グループ化を上書き", "label-value": "値", "matching-labels": "一致するラベル", + "message": { + "required": "" + }, "placeholder-label": "ラベル", "placeholder-value": "値", "remove": "削除", "tooltip-remove-matcher": "マッチャーを削除" }, + "annotation-header-field": { + "message": { + "required": "" + } + }, "annotations": { "dashboard-annotation-field": { "dashboard": "ダッシュボード{{dashboardUid}}", @@ -677,6 +721,25 @@ "title": "すべてのイベントを表示できません" } }, + "central-alert-history-scene": { + "scene": { + "labels-filter-variable": { + "label": { + "labels": "" + } + }, + "transitions-from-filter-variable": { + "label": { + "start-state": "" + } + }, + "transitions-to-filter-variable": { + "label": { + "end-state": "" + } + } + } + }, "channel-sub-form": { "delete": "削除", "duplicate": "複製", @@ -713,11 +776,17 @@ }, "cloud-data-source-selector": { "label": "データソースの選択", - "label-disabled": "データソース" + "label-disabled": "データソース", + "message": { + "please-select-a-data-source": "データソースを選択してください" + } }, "cloud-evaluation-behavior": { "description-pending-period": "アラートをトリガーするために、しきい値の条件を満たす必要がある期間。「なし」を選択すると、条件が満たされた時点ですぐにアラートが発生します。", "label-pending-period": "保留期間", + "message": { + "must-be-a-positive-integer": "" + }, "title-set-evaluation-behavior": "評価動作を設定" }, "cloud-receiver-form": { @@ -758,6 +827,9 @@ "contact-point-selector": { "aria-label-refresh-contact-points": "連絡先を更新", "contact-point-picker-label-contact-point": "コンタクトポイント", + "message": { + "contact-point-is-required": "" + }, "title-failed-to-fetch-contact-points": "連絡先の取得に失敗しました", "tooltip-refresh-contact-points-list": "連絡先リストを更新" }, @@ -822,6 +894,14 @@ }, "copy-to-clipboard": "「{{label}}」をクリップボードにコピー", "create-metadata": { + "label": { + "dashboard": "ダッシュボード", + "dashboard-and-panel": "", + "evaluation-interval": "評価間隔", + "labels": "ラベル", + "metric-name": "", + "runbook-url": "" + }, "view-dashboard": "ダッシュボードを表示", "view-panel": "パネルを表示" }, @@ -862,9 +942,6 @@ "title-search-panel": "パネルを検索", "title-select-dashboard-and-panel": "ダッシュボードとパネルを選択" }, - "data-source-section": { - "import-to-grafana": "Grafanaルールにインポート" - }, "datasource-not-found": { "card-description": "このクエリのデータソースが見つかりませんでした。削除されたか正しくインストールされていません。", "remove-query": "クエリを削除", @@ -946,6 +1023,11 @@ "text-loading-template": "テンプレート読み込み中…", "title-failed-to-fetch-notification-template": "通知テンプレートの取得に失敗しました" }, + "edit-mute-timing-page": { + "text": { + "edit-time-interval": "" + } + }, "editor": { "edit-alert-rule": "", "edit-recording-rule": "", @@ -959,6 +1041,11 @@ "error-summary-button": { "content-show-all-errors": "" }, + "evaluate-every-validation-options": { + "message": { + "required": "" + } + }, "evaluation-behavior-summary": { "evaluate": "", "label-evaluate": "評価", @@ -976,6 +1063,9 @@ "evaluation-group-creation-modal": { "description-group-name": "グループはすべてのルールを同じ間隔で評価します。", "description-often-rules-group-evaluated": "グループ内のすべてのルールが評価される頻度。", + "message": { + "required": "" + }, "placeholder-enter-a-name": "名前を入力", "title-new-evaluation-group": "新しい評価グループ" }, @@ -998,12 +1088,24 @@ "title-permission-editrecreate-silence": "このサイレンスを編集/再作成する権限がありません", "title-silence-not-found": "既存のサイレンス「{{silenceId}}」が見つかりません" }, + "existing-silence-editor-page": { + "page-nav": { + "text": { + "edit-silence": "" + } + } + }, "export": { "subtitle": { "formats": "形式を選択してファイルをダウンロードするか、内容をクリップボードにコピーします", "one-format": "ファイルをダウンロードするか、内容をクリップボードにコピーします" } }, + "export-new-grafana-rule-page": { + "text": { + "export-new-grafana-rule": "" + } + }, "export-new-rule-button": { "tooltip-export-new-grafana-rule": "新しいGrafanaルールをエクスポート" }, @@ -1029,6 +1131,16 @@ "no-data": "データなし", "page-counter": "" }, + "feature-toggle-page": { + "nav-model": { + "subTitle": { + "enable-alerting-grafana-config": "" + }, + "text": { + "alerting-is-not-enabled": "" + } + } + }, "federated-rule-warning": { "experimental": "現在、フェデレーションルールグループは実験的機能です。", "read-documentation": "ドキュメントを読む", @@ -1036,6 +1148,13 @@ }, "file-export-inline-documentation": { "api-provisioning": "{{name}}形式はAPIプロビジョニングでのみ有効です。<3>詳細はドキュメントをご覧ください。</3>", + "export-inline-doc": { + "title": { + "apiprovisioning-format": "", + "fileprovisioning-format": "", + "terraformprovisioning-format": "" + } + }, "file-provisioning": "{{name}}形式はファイルプロビジョニングでのみ有効です。<3>詳細はドキュメントをご覧ください。</3>", "terraform-provisioning": "{{name}}形式はTerraformプロビジョニングでのみ有効です。<3>詳細はドキュメントをご覧ください。</3>" }, @@ -1043,6 +1162,20 @@ "copy-code": "コードをコピー", "download": "ダウンロード" }, + "filter-options": { + "label": { + "alert-rule": "アラートルール", + "all": "すべて", + "error": "エラー", + "firing": "", + "no-data": "データなし", + "normal": "通常", + "ok": "OK", + "pending": "保留", + "recording-rule": "録画ルール", + "recovering": "復元中" + } + }, "filter-view-results": { "aria-label-filteredrulelist": "フィルター済みルールリスト" }, @@ -1077,7 +1210,10 @@ } }, "folder-selector": { - "description-select-folder": "ルールを保存するフォルダを選択します。" + "description-select-folder": "ルールを保存するフォルダを選択します。", + "message": { + "select-a-folder": "" + } }, "folderAndGroup": { "evaluation": { @@ -1092,15 +1228,88 @@ "for-input": { "description-pending": "アラートをトリガーするために、しきい値の条件を満たす必要がある期間。「なし」を選択すると、条件が満たされた時点ですぐにアラートが発生します。" }, + "for-validation-options": { + "message": { + "required": "" + } + }, "generate-alert-data-modal": { "add-alert-data": "アラートデータを追加", "add-alert-data-to-payload": "ペイロードにアラートデータを追加", + "alert-options": { + "label": { + "firing": "", + "resolved": "" + } + }, "review-alert-payload": " ペイロードに追加するアラートデータを確認:", "title-add-custom-alerts": "カスタムアラートを追加" }, + "get-alert-suggestions": { + "documentation": { + "annotations-attached-alert": "", + "fingerprint-identify-alert": "", + "grafana-external-alertmanager": "", + "organization-alert": "", + "time-the-alert-started-firing": "" + }, + "value": { + "labels-attached-alert": "", + "status-alert-firing-resolved": "" + } + }, + "get-cloud-scenes": { + "title": { + "mimir-alertmanager": "" + } + }, + "get-global-suggestions": { + "value": { + "an-array-containing-all-alerts": "" + } + }, + "get-grafana-alertmanager-scenes": { + "title": { + "grafana-alertmanager": "" + } + }, + "get-grafana-managed-scenes": { + "title": { + "grafanamanaged-alert-rules": "Grafana管理アラートルール" + } + }, + "get-mimir-managed-rules-per-group-scenes": { + "rule-group-handler": { + "label": { + "rule-group": "" + } + }, + "title": { + "mimirmanaged-alert-rules-per-rule-group": "" + } + }, + "get-mimir-managed-rules-scenes": { + "title": { + "mimirmanaged-alert-rules": "" + } + }, "get-preview-results": { "title-error": "エラー" }, + "get-state-display-model": { + "text": { + "alerting": "", + "error": "", + "firing": "", + "inactive": "", + "no-data": "", + "ok": "OK", + "paused": "", + "pending": "", + "recovering": "", + "unknown": "" + } + }, "getting-stared": { "learn-more": "実践的な入門情報を確認したい場合は、<2>Grafanaアラートを使いはじめるためのチュートリアル</2>を参照してください" }, @@ -1142,6 +1351,10 @@ "label-disable-resolved-message": "解決済みメッセージを無効にする" }, "grafana-evaluation-behavior-step": { + "message": { + "must-be-a-positive-integer": "", + "must-enter-a-group-name": "" + }, "missing-series-resolve-placeholder": "デフォルト:2", "or": "もしくは", "placeholder-select-an-evaluation-group": "評価グループを選択...", @@ -1158,6 +1371,11 @@ "body-invalid-rule-id": "ページURLのルールUIDが無効です。URLを確認して再試行してください。", "title-invalid-rule-id": "無効なルールID" }, + "grafana-modify-export-page": { + "text": { + "modify-export": "" + } + }, "grafana-mute-timing-exporter-preview": { "text-loading": "読み込み中..." }, @@ -1210,6 +1428,9 @@ }, "group-and-namespace-fields": { "group-picker-label-group": "グループ", + "message": { + "required": "" + }, "namespace-picker-label-namespace": "名前空間" }, "group-by": { @@ -1266,14 +1487,19 @@ "header": { "tooltip-remove": "式「{{refId}}」を削除" }, + "history-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "成功" + } + }, "home": { "label-get-started": "開始する", "label-insights": "インサイト", "title-alerting": "アラート" }, - "import-from-dsrules": { - "description-folder-import-rules": "ルールをインポートするフォルダ" - }, "import-to-gma": { "action-button": "インポート", "additional-settings": "追加設定", @@ -1281,8 +1507,9 @@ "confirm-modal": { "confirm": "インポート", "loading": "読み込み中...", - "loading-body": "インポートするデータを準備中です。しばらく時間がかかる場合があります…", + "loading-body": "", "no-rules-body": "インポートするルールはありません。別の名前空間またはルールグループを選択してください。", + "no-rules-body-yaml": "", "no-rules-title": "インポートするルールはありません", "plugin-rules-warning": { "text": "一部のルールがプラグインによって管理されていることが検出されました。これらのルールはインポートされません。", @@ -1301,11 +1528,12 @@ "label": "グループ" }, "import-location-and-filters": "場所とフィルターをインポート", + "import-source": "", "namespace": { "description": "既存の名前空間を検索するために入力してください", "label": "名前空間" }, - "pageTitle": "データソースからGrafana管理ルールにアラートルールをインポート", + "pageTitle": "", "pause": { "label": "インポートしたアラートルールを一時停止" }, @@ -1313,10 +1541,26 @@ "label": "インポートした記録ルールを一時停止" }, "recording-rules": "記録ルール", + "source": { + "datasource": "", + "datasource-description": "", + "yaml": "", + "yaml-description": "" + }, "success": "アラートルールをGrafana管理ルールに正常にインポートしました。", "target-folder": { + "description": "ルールをインポートするフォルダ", "label": "ターゲットフォルダ" - } + }, + "yaml": { + "description": "", + "label": "", + "required-message": "", + "target-datasource": "ターゲットデータソース", + "target-datasource-description": "", + "target-datasource-required": "" + }, + "yaml-error": "" }, "insights": { "monitor-status-of-system": "システムの状態を監視する", @@ -1392,6 +1636,9 @@ "text-loading-existing-labels": "既存のラベルを読み込み中" }, "labels-without-suggestions": { + "message": { + "required": "" + }, "placeholder-key": "キー", "placeholder-value": "値" }, @@ -1430,6 +1677,24 @@ "log-record-viewer-by-timestamp": { "aria-label-state-history-by-timestamp": "タイムスタンプ別の状態履歴" }, + "log-timeline-viewer": { + "label": { + "firing": "", + "mixed": "", + "no-data": "", + "normal": "通常", + "pending": "保留", + "recovering": "復元中" + } + }, + "loki-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "成功" + } + }, "loki-state-history": { "clear-filters": "フィルタをクリア", "common-labels": "共通ラベル", @@ -1442,6 +1707,14 @@ "button": "権限を管理する", "title": "権限を管理する" }, + "manual-and-automatic-routing": { + "routing-options": { + "label": { + "select-contact-point": "", + "use-notification-policy": "" + } + } + }, "matcher-filter": { "filter-alerts-using-label-querying-without-braces": "ブレースなしのラベルクエリを使用してアラートをフィルタします。例:", "filter-alerts-using-label-querying-without-spaces": "スペースなしのラベルクエリでアラートを絞り込みます。例:", @@ -1459,6 +1732,9 @@ "label-operator": "オペレーター", "label-refine-affected-alerts": "影響を受けるアラートを絞り込む", "label-value": "値", + "message": { + "required": "" + }, "placeholder-label": "ラベル", "placeholder-value": "値", "remove": "削除", @@ -1490,6 +1766,16 @@ "aria-label": "その他", "button-text": "その他" }, + "multiple-data-source-picker": { + "get-data-source-options": { + "grouped-options": { + "label": { + "data-sources-with-configured-alert-rules": "", + "other-data-sources": "" + } + } + } + }, "mute-timing-actions-buttons": { "text-disabled": "無効", "title-delete-mute-timing": "ミュート期間を削除" @@ -1553,11 +1839,26 @@ "read-more": "通知ポリシーについて詳しく読む。", "title-notification-routing": "通知ルーティング" }, + "new-mute-timing-page": { + "text": { + "add-time-interval": "" + } + }, "new-rule-from-panel-button": { "body-no-alerting-capable-query-found": "アラート対応データソースへのクエリが見つからないため、このパネルからアラートを作成できません。", "new-alert-rule": "新しいアラートルール", "title-no-alerting-capable-query-found": "アラート対応クエリが見つかりません" }, + "new-silence-page": { + "page-nav": { + "subTitle": { + "configure-silences-notifications-particular-alert": "" + }, + "text": { + "silence-alert-rule": "アラートルールを消音" + } + } + }, "no-alert-managers-available": { "body-no-alertmanager-found": "外部のAlertmanagerが見つかりません。また、内蔵のGrafana Alertmanagerにアクセスできない可能性があります。", "title-no-alertmanager-found": "Alertmanagerが見つかりません" @@ -1782,6 +2083,9 @@ "expressions": "式", "loading-data-sources": "データソース読み込み中...", "manipulate-returned-queries-other-operations": "数式やその他の演算を使用してクエリから返されたデータを操作します。", + "message": { + "a-valid-expression-is-required": "" + }, "no-compatible-sources": "互換性のあるデータソースがないようです", "title-deactivate-advanced-options": "詳細オプションを無効化", "title-queries-expressions-configured": "クエリまたは式が設定されていません" @@ -1833,7 +2137,8 @@ }, "recording-rules": { "description-target-data-source": "記録ルールの保存先のPrometheusデータソース", - "label-target-data-source": "ターゲットデータソース" + "label-target-data-source": "ターゲットデータソース", + "target-data-source-required": "" }, "recording-rules-name-space-and-group-step": { "description-select-namespace-group-recording": "記録ルールの名前空間とグループを選択してください。", @@ -2091,6 +2396,9 @@ "collapse-all": "すべて閉じる", "expand-all": "すべて展開" }, + "rule-list-v2": { + "import-to-gma": "" + }, "rule-modify-export": { "text-loading-the-rule": "ルールを読み込み中...", "title-cannot-exist": "ルールを読み込めません。ルールは存在しません", @@ -2167,6 +2475,10 @@ "label-saved-searches": "保存済みの検索" }, "health": "健康", + "label": { + "hide": "非表示", + "show": "表示" + }, "manage-alerts": "これらのデータソースでは、「アラートUI経由で管理」を選択すると、Grafana UIとアラートルールが設定されたデータソースの両方でこれらのアラートルールを管理できます。", "placeholder-all-data-sources": "すべてのデータソース", "plugin-rules": "プラグインルール", @@ -2263,6 +2575,9 @@ "label-comment": "コメント", "label-created-by": "作成者", "label-duration": "継続時間", + "message": { + "required": "" + }, "placeholder-whos-creating-the-silence": "サイレンスの作成者", "save-silence": "サイレンスを保存", "saving": "保存中…" @@ -2301,6 +2616,12 @@ "title-alert-rule-types": "アラートルールタイプ" }, "state-history": { + "columns": { + "label": { + "state": "ステート", + "time": "時間" + } + }, "filter-group": "グループを絞り込む", "filter-group-tooltip": "各状態履歴グループを完全一致または正規表現で絞り込めます。例:", "placeholder-search": "検索", @@ -2340,6 +2661,9 @@ "label-examples-documentation": "サンプルドキュメント", "label-template-group": "テンプレートグループ", "label-template-group-name": "テンプレートグループ名", + "message": { + "required": "" + }, "new-template-name-placeholder-give-your-template-group-a-name": "テンプレートグループに名前を付けてください", "title-error-saving-template": "テンプレート保存中のエラー", "title-templating-cheat-sheet": "テンプレートチートシート" @@ -2362,6 +2686,11 @@ "existing-templates-selector-aria-label-choose-notification-template": "通知テンプレートを選択", "existing-templates-selector-placeholder-choose-notification-template": "通知テンプレートを選択", "loading": "読み込み中...", + "template-options": { + "label": { + "select-notification-template": "" + } + }, "tooltip-copy": "選択した通知テンプレートをクリップボードにコピーします。カスタムタブで使用できます。" }, "templates": { @@ -2464,10 +2793,39 @@ } }, "use-columns": { + "columns": { + "label": { + "alert-rule-targeted": "", + "alerts-silenced": "", + "health": "健康", + "matching-labels": "一致するラベル", + "name": "名前", + "schedule": "スケジュール", + "state": "ステート", + "time-range": "時間範囲" + } + }, + "label": { + "actions": "操作", + "created": "作成済み", + "group": "グループ", + "labels": "ラベル", + "next-evaluation": "次の評価", + "state": "ステート", + "summary": "概要" + }, "title-edit": "編集", "title-recreate": "再作成", "title-unsilence": "サイレント解除" }, + "use-combined-labels": { + "grouped-options": { + "label": { + "from-alerts": "", + "from-system": "" + } + } + }, "use-create-dropdown-menu-actions": { "label-delete": "削除", "label-edit": "編集", @@ -2501,6 +2859,17 @@ "title-edit-notification-policy": "通知ポリシーを編集" } }, + "use-page-nav": { + "page-nav": { + "text": { + "details": "詳細", + "history": "履歴", + "instances": "インスタンス", + "query-and-conditions": "", + "versions": "バージョン" + } + } + }, "use-state-history-modal": { "state-history-modal": { "title-state-history": "状態履歴" @@ -2521,6 +2890,36 @@ "body": "エディターのYAMLコンテンツにはアラートルール設定のみが含まれています。<1></1>Prometheusを設定するには、<4>設定ファイルの残りの部分</4>を提供する必要があります。。" } }, + "alertlist": { + "group-by": { + "aria-label-group-by-label-keys": "", + "placeholder-group-by": "グループ化" + }, + "ungrouped-mode-view": { + "active-for": "", + "aria-label-view-alert-rule": "", + "view-alert-rule": "" + }, + "unified-alert-list": { + "clear": "消去", + "text-loading": "読み込み中..." + }, + "unified-alert-list-panel": { + "body-permission-required": "", + "title-permission-required": "" + } + }, + "annolist": { + "anno-list-panel": { + "aria-label-remove-filter": "", + "filter": "", + "loading": "読み込み中...", + "no-annotations-found": "" + }, + "annotation-list-item": { + "tooltip-created-by": "" + } + }, "annotations": { "annotation-field-mapper": { "annotation": "注釈", @@ -2617,6 +3016,11 @@ "configuration-required": "設定を行う必要があります", "refer-documentation-configure-authentication": "認証の設定方法についてはドキュメントを参照してください" }, + "field-map": { + "label": { + "none": "なし" + } + }, "fields": { "allow-assign-grafana-admin-description": "", "allow-assign-grafana-admin-label": "", @@ -2720,7 +3124,18 @@ "use-refresh-token-description": "", "use-refresh-token-label": "", "validate-hosted-domain-description": "", - "validate-hosted-domain-label": "" + "validate-hosted-domain-label": "", + "workload-identity-token-file-description": "", + "workload-identity-token-file-label": "", + "workload-identity-token-file-required": "" + }, + "get-page-nav": { + "subTitle": { + "configure-authentication-providers": "" + }, + "text": { + "authentication": "認証" + } }, "provider-card": { "text-badge-enabled": "有効化", @@ -2756,6 +3171,12 @@ "auth-config-auth-config-page-unconnected": { "subtitle": "認証設定を管理し、シングルサインオンを設定します。詳細については、<2>ドキュメント</2>をご覧ください。" }, + "barchart": { + "tick-spacing-editor": { + "content-require-space-from-the-right-side": "", + "label-rtl": "" + } + }, "bookmarks-page": { "empty": { "message": "まだブックマークを作成していないようです", @@ -2879,11 +3300,199 @@ "text-this-repository-is-read-only": "ターゲットに直接アクセスできる場合は、JSONをコピーしてそこに貼り付けます。" }, "canvas": { + "apieditor": { + "label-endpoint": "", + "label-header-parameters": "", + "label-method": "メソッド", + "label-payload": "ペイロード", + "label-query-parameters": "クエリのパラメータ", + "render-test-apibutton": { + "test-api": "", + "title-test-api": "" + } + }, + "button-item": { + "label": { + "center": "", + "left": "", + "right": "" + }, + "placeholder": { + "auto": "自動" + } + }, + "button-style-editor": { + "label-variant": "バリアント" + }, + "canvas-context-menu": { + "close-editor": "", + "open-editor": "", + "render-menu-items": { + "add-item-menu-item": { + "label-add-item": "" + }, + "edit-element-menu-item": { + "label-edit": "編集" + }, + "label-bring-to-front": "", + "label-delete": "削除", + "label-duplicate": "複製", + "label-send-to-back": "", + "set-background-menu-item": { + "label-set-background": "" + } + } + }, + "cloud-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "自動" + } + }, + "ellipse-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "自動" + } + }, + "inline-edit": { + "canvas-inline-editor": "", + "tooltip-close-inline-editor": "" + }, + "inline-edit-body": { + "label-add-item": "", + "please-select-an-element": "" + }, + "line-style-editor": { + "label-animate": "" + }, + "metric-value-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "自動" + } + }, "not-found-display": { "not-found": "<0>見つかりません:</0><config />" }, + "pan-zoom-help": { + "ctrl-right-mouse": "", + "middle-mouse": "", + "pan-title": "", + "reset-double-click": "", + "title-pan-and-zoom-controls": "", + "zoom-scroll-wheel": "" + }, + "parallelogram-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "自動" + } + }, + "params-editor": { + "aria-label-add": "追加", + "aria-label-delete": "削除", + "placeholder-key": "キー", + "placeholder-value": "値" + }, + "placement-editor": { + "label-constraints": "", + "label-position": "", + "loading": "読み込み中..." + }, + "quick-positioning": { + "tooltip-align-bottom": "", + "tooltip-align-horizontal-centers": "", + "tooltip-align-left": "", + "tooltip-align-right": "", + "tooltip-align-top": "", + "tooltip-align-vertical-centers": "" + }, + "rectangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "自動" + } + }, "text-display": { "double-click-to-set": "ダブルクリックしてテキストを設定" + }, + "text-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "自動" + } + }, + "tree-navigation-editor": { + "clear-selection": "選択をクリア", + "frame-selection": "", + "label-add-item": "", + "missing-layer": "", + "no-settings": "", + "switcher-icon": { + "title-node-icon": "" + } + }, + "tree-node-title": { + "title-duplicate": "複製", + "title-remove": "削除", + "tooltip-duplicate": "複製", + "tooltip-remove": "削除" + }, + "triangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "自動" + } } }, "carousel": { @@ -2963,6 +3572,22 @@ } }, "connections": { + "add-new-connection": { + "filter-by-options": { + "label": { + "all": "すべて", + "installed": "インストール済み", + "new-updates": "" + } + }, + "label": { + "by-downloads": "", + "by-name-az": "", + "by-name-za": "", + "by-published-date": "", + "by-updated-date": "" + } + }, "advisor-redirect-notice": { "aria-label-link-to-advisor": "アドバイザーへのリンク", "body": "新しいアドバイザーを試して、データソースとプラグインの潜在的な問題を発見しましょう。", @@ -2979,6 +3604,22 @@ "body": "データソース用の新しいページができました!メインメニューからアクセスできる「接続」ページで、新しいデータソースを探したり、既存のデータソースを管理したりできます。", "go-to-connections": "接続へ移動" }, + "data-source-details-page": { + "subTitle": { + "datasource-could-found": "" + }, + "text": { + "unknown-datasource": "" + } + }, + "new-data-source-page": { + "subTitle": { + "choose-a-data-source-type": "" + }, + "text": { + "add-data-source": "データソースを追加" + } + }, "no-access-modal": { "connection-contact-grafana-admin": "新しい接続を追加するには、Grafana管理者に連絡してください。", "editor-warning": "編集者は新しい接続を追加できません。<2>データソース</2>で構成済みかどうか確認できます。", @@ -2991,6 +3632,18 @@ "search": { "aria-label-search-all": "すべて検索", "placeholder": "すべて検索" + }, + "use-data-source-settings-nav": { + "node": { + "subTitle": { + "data-source-error": "" + } + }, + "page-nav": { + "text": { + "data-source-nav-node": "" + } + } } }, "core": { @@ -3286,6 +3939,11 @@ "title-plugin-dashboard": "プラグインダッシュボード" }, "dash-nav": { + "on-open-snapshot-original": { + "title": { + "proceed-to-external-site": "" + } + }, "render-left-actions": { "text-public": "パブリック", "tooltip-view-as-scene": "シーンとして表示" @@ -3297,11 +3955,26 @@ "dashboard-loading": { "cancel-loading-dashboard": "ダッシュボードの読み込みをキャンセル" }, + "dashboard-page-error": { + "text": { + "not-found": "見つかりません" + } + }, "dashboard-settings": { "actions": { "close": "閉じる" } }, + "dashboard-slice": { + "title": { + "dashboard-init-failed": "" + } + }, + "dashboard-srv": { + "message": { + "edit-dashboard-json": "" + } + }, "dashboard-validation": { "body-dashboard-failed-schema-validation": "検証は開発目的で提供されているため、無視していただいて構いません。Grafana開発者の場合は、ダッシュボードスキーマの確認および更新を検討してください", "title-checking-dashboard-validity": "ダッシュボードの有効性を確認中", @@ -3397,6 +4070,13 @@ "values": "カンマで区切った値", "values-placeholder": "1, 10, mykey : myvalue, myvalue, escaped, value" }, + "datasource-options": { + "name-filter": "", + "name-filter-description": "", + "name-filter-placeholder": "", + "type": "種類", + "type-placeholder": "" + }, "description": "説明", "description-placeholder": "説明用のテキスト", "label": "ラベル", @@ -3415,8 +4095,8 @@ "category": "選択オプション", "custom-all-value": "「すべて」を表すカスタム値", "custom-all-value-description": "「すべて」を表すワイルドカードの正規表現またはその他の値", - "include-all": "「すべて」オプションを含める", - "include-all-description": "すべての値を含めるオプションを有効にします", + "include-all": "", + "include-all-description": "", "multi-value": "複数値" }, "type-category": "{{type}}オプション" @@ -3442,14 +4122,97 @@ "errors": { "failed-to-load": "ダッシュボードの読み込みに失敗しました" }, + "fetch-dashboard": { + "message": { + "failed-to-fetch-dashboard": "" + } + }, "gen-aihistory": { "aria-label-send-custom-feedback": "カスタムフィードバックを送信", "footer-text": "このコンテンツは<2>Grafana LLMプラグイン</2>を使用して、AIによって生成されています", "placeholder-tell-ai-what-to-do-next": "AIに次にすべきことを指示してください..." }, + "general-settings-unconnected": { + "editable-options": { + "label": { + "editable": "編集可能", + "readonly": "" + } + } + }, + "get-debug-dashboard": { + "title": { + "annotations": "注釈" + } + }, + "get-errors": { + "message": { + "error-loading-data": "" + } + }, "get-field-override-categories": { "label-add-field-override": "フィールドオーバーライドを追加", - "label-add-override-property": "オーバーライドプロパティを追加" + "label-add-override-property": "オーバーライドプロパティを追加", + "title": { + "add-button": "" + } + }, + "get-library-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "情報", + "name": "名前" + } + }, + "get-library-viz-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "情報", + "name": "名前" + } + }, + "get-panel-editor-tabs": { + "text": { + "alert": "", + "query": "クエリ", + "transform-data": "" + } + }, + "get-panel-frame-category": { + "descriptor": { + "title": { + "panel-options": "パネルオプション" + } + }, + "direction-options": { + "label": { + "horizontal": "水平方向", + "vertical": "垂直方向" + } + }, + "title": { + "description": "説明", + "max-per-row": "行あたりの最大値", + "panel-links": "パネルリンク", + "repeat-by-variable": "変数の値ごとに繰り返す", + "repeat-direction": "方向を繰り返す", + "repeat-options": "繰り返しオプション", + "title": "タイトル", + "transparent-background": "透明の背景" + } + }, + "get-panel-menu": { + "text": { + "extensions": "" + } }, "help-wizard": { "copy-to-clipboard": "クリップボードにコピー", @@ -3462,10 +4225,21 @@ "randomize-field-names-label-field-names": "フィールド名", "randomize-labels-label-labels": "ラベル", "randomize-string-values-label-string-values": "文字列値", + "tabs": { + "label": { + "data": "データ", + "snapshot": "スナップショット" + } + }, "title-complete-git-hub-comment-clipboard": "GitHubコメント全体をクリップボードにコピー", "title-get-help-with-this-panel": "このパネルのヘルプを取得", "troubleshooting-docs": "トラブルシューティングドキュメント" }, + "init-dashboard": { + "message": { + "failed-create-dashboard-model": "" + } + }, "inspect": { "data-tab": "データ", "error-tab": "エラー", @@ -3518,6 +4292,16 @@ "rows": "総件数", "table-title": "ステータス" }, + "k8s-dashboard-api": { + "title": { + "deleted": "" + } + }, + "k8s-dashboard-v2api": { + "title": { + "deleted": "" + } + }, "layout": { "common": { "copy": "コピー", @@ -3530,6 +4314,13 @@ "panel-layout-disabled": "パネルレイアウトオプションを変更するには、行またはタブを選択してください" } }, + "legacy-dashboard-api": { + "fetch-error": { + "message": { + "dashboard-not-found": "" + } + } + }, "make-editable": { "dashboard-not-editable": "ダッシュボードは編集できません", "make-editable": "編集可能にする" @@ -3549,6 +4340,20 @@ "menu-use-library-panel": "ライブラリパネルを使用" }, "new-panel-title": "新規パネル", + "on-create-new-row": { + "new-row": { + "title": { + "row-title": "" + } + } + }, + "on-create-new-widget-panel": { + "new-panel": { + "title": { + "widget-title": "" + } + } + }, "options": { "description": "説明", "title-option": "タイトル" @@ -3607,6 +4412,30 @@ "paused": "このダッシュボードは管理者によって一時停止されています", "try-again-later": "後でやり直してください" }, + "remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, + "repeat-row-select": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, + "repeat-row-select2": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, "revert-dashboard-modal": { "body-restore-version": "ダッシュボードをバージョン{{version}}に復元してもよろしいですか?未保存の変更はすべて失われます。", "title-restore-version": "バージョンの復元" @@ -3720,6 +4549,18 @@ "sub-menu-un-connected": { "aria-label-template-variables": "テンプレートの変数" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "tabs-layout": { "delete-tab-text": "このタブを削除すると、すべてのパネルも削除されます。続行してもよろしいですか?", "delete-tab-title": "タブを削除しますか?", @@ -3925,7 +4766,10 @@ }, "unthemed-dashboard-row": { "aria-label-delete-row": "行を削除する", - "learn-more": "もっと詳しく" + "learn-more": "もっと詳しく", + "title": { + "delete-row": "行を削除する" + } }, "validation": { "invalid-dashboard-id": "有効なGrafana.com IDが見つかりませんでした", @@ -3960,6 +4804,16 @@ }, "visualization-select-pane": { "placeholder-search-for": "次を検索...", + "radio-options": { + "description": { + "reusable-panels-share-between-multiple-dashboards": "" + }, + "label": { + "library-panels": "ライブラリパネル", + "suggestions": "", + "visualizations": "" + } + }, "title-close": "閉じる" }, "viz-panel": { @@ -4010,12 +4864,25 @@ "label-data-source": "データソース", "label-use-static-key-dimensions": "静的キー次元を使用" }, + "add-to-dashboard": { + "message": { + "could-navigate-selected-dashboard-please-again": "", + "could-panel-dashboard-please-again": "" + } + }, "add-to-dashboard-form": { "cancel": "キャンセル", "description-choose-where-to-add-the-panel": "パネルを追加する場所を選択してください。", "description-select-which-dashboard-panel-created": "パネルを作成するダッシュボードを選択してください。", + "label": { + "existing-dashboard": "既存のダッシュボード", + "new-dashboard": "新しいダッシュボード" + }, "label-dashboard": "ダッシュボード", "label-target-dashboard": "対象のダッシュボード", + "message": { + "this-field-is-required": "このフィールドは必須です。" + }, "open-dashboard": "ダッシュボードを開く", "open-in-new-tab": "新しいタブで開く", "title-error-adding-the-panel": "パネル追加時のエラー" @@ -4053,6 +4920,25 @@ "it-cannot-contain-or": "「//」または「..」を含めることはできません。", "least-valid-character": "少なくとも1つの有効な文字が必要です。" }, + "build-new-dashboard-save-model": { + "data": { + "title": { + "new-dashboard": "新しいダッシュボード" + } + } + }, + "build-new-dashboard-save-model-v2": { + "data": { + "title": { + "new-dashboard": "新しいダッシュボード" + } + } + }, + "config-public-dashboard": { + "title": { + "revoke-public-url": "公開URLを取り消す" + } + }, "constant-variable-form": { "constant-options": "定数オプション", "label-value": "値", @@ -4100,22 +4986,89 @@ "value-not-saved": "値はまだGrafanaデータベースに保存されていません", "view-pull-request-in-git-hub": "GitHubでプルリクエストを表示する" }, + "dashboard-scene": { + "text": { + "edit-panel": "", + "view-panel": "パネルを表示" + }, + "title": { + "dashboard": "ダッシュボード", + "discard-changes-to-dashboard": "" + } + }, + "dashboard-scene-page-state-manager": { + "message": { + "dashboard-not-found": "" + } + }, + "dashboard-scene-page-state-manager-v2": { + "message": { + "dashboard-not-found": "" + } + }, "data-source-variable-form": { "data-source-options": "データソースオプション", "description-instance-name-filter": "変数値リストで選択するデータソースインスタンスの正規表現フィルター。すべての場合は、空欄にしてください。", "example-instance-name-filter": "例:<codeExample />", "selection-options": "選択オプション" }, + "default-grid-layout-manager": { + "row": { + "title": { + "row-title": "" + } + } + }, "description-label": { "description": "説明" }, + "edit-link-view": { + "edit-link-page-nav": { + "text": { + "edit-link": "リンクの編集" + } + } + }, "email-list": { "aria-label-emailmenu": "メールメニューを切り替え" }, + "embedded-dashboard-test-page": { + "subTitle": { + "showing-dashboard-panel-tests-pie-chart": "" + }, + "text": { + "embedding-dashboard": "" + } + }, "empty-transformations-message": { "add-transformation": "変換を追加" }, + "get-edit-options": { + "title": { + "column-options": "", + "row-height-options": "" + } + }, + "get-panel-frame-options": { + "descriptor": { + "title": { + "panel-options": "パネルオプション" + } + }, + "title": { + "description": "説明", + "panel-links": "パネルリンク", + "title": "タイトル", + "transparent-background": "透明の背景" + } + }, + "get-workflow-options": { + "label": { + "push-to-a-new-branch": "" + } + }, "group-by-variable-form": { + "alert-not-supported": "", "description-enables-users-custom-values": "ユーザーがリストにカスタム値を追加できるようにします", "description-provide-dimensions-as-csv-dimension-name-dimension-id": "CSV形式で次のように次元を指定:{{name}}, {{value}}", "group-by-options": "グループ化オプション", @@ -4134,6 +5087,12 @@ "randomize-field-names-label-field-names": "フィールド名", "randomize-labels-label-labels": "ラベル", "randomize-string-values-label-string-values": "文字列値", + "tabs": { + "label": { + "data": "データ", + "snapshot": "スナップショット" + } + }, "title-complete-git-hub-comment-clipboard": "GitHubコメント全体をクリップボードにコピー", "title-get-help-with-this-panel": "このパネルのヘルプを取得", "troubleshooting-docs": "トラブルシューティングドキュメント", @@ -4175,6 +5134,14 @@ "body-name-already-exists": "選択したフォルダに同じ名前のダッシュボードがすでに存在します。このダッシュボードの保存を続行しますか?", "title-name-already-exists": "名前はすでに存在します" }, + "on-remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, "panel-data-alerting-tab-rendered": { "alert": { "title-errors-loading-rules": "ルールの読み込みエラー" @@ -4196,6 +5163,11 @@ "table-view-aria-label-toggletableview": "テーブル表示を切り替え", "table-view-label-table-view": "テーブル表示" }, + "panel-editor": { + "text": { + "edit-panel": "" + } + }, "panel-editor-renderer": { "aria-label-open-options-pane": "オプションペインを開く", "tooltip-open-options-pane": "オプションペインを開く" @@ -4204,8 +5176,22 @@ "body-panel-plugin-not-loaded": "検査を開始する前に、検査対象のパネルが表示されていることを確認してください。", "title-panel-plugin-not-loaded": "パネルプラグインが読み込まれていません" }, + "panel-menu-behavior": { + "async-func": { + "text": { + "extensions": "", + "metrics-drilldown": "" + } + } + }, "panel-viz-type-picker": { "placeholder-search-for": "次を検索...", + "radio-options": { + "label": { + "suggestions": "", + "visualizations": "" + } + }, "title-close": "閉じる" }, "provisioned-delete-modal": { @@ -4232,6 +5218,15 @@ "query-options": "クエリオプション", "selection-options": "選択オプション" }, + "resource-export": { + "label": { + "classic": "", + "json": "JSON", + "v1-resource": "", + "v2-resource": "", + "yaml": "" + } + }, "revert-dashboard-modal": { "body-restore-version": "ダッシュボードをバージョン{{version}}に復元してもよろしいですか?未保存の変更はすべて失われます。", "title-restore-version": "バージョンの復元" @@ -4339,6 +5334,18 @@ "solo-panel-page": { "loading": "読込中" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "text-box-variable-form": { "placeholder-default-value-if-any": "(任意)", "text-options": "テキストオプション" @@ -4349,6 +5356,13 @@ "title-field-label": { "title": "タイトル" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "transformations-drawer": { "search-box-suffix": { "tooltip-clear-search": "検索結果をクリア" @@ -4364,6 +5378,13 @@ "save-dashboard": "ダッシュボードを保存", "title-unsaved-changes": "未保存の変更" }, + "use-dashboard-edit-page-nav": { + "page-nav": { + "text": { + "settings": "設定" + } + } + }, "variable-check-indicator": { "aria-label-variable-referenced-dashboard": "この変数はどの変数やダッシュボードからも参照されていません。", "aria-label-variable-referenced-other-variables-dashboard": "この変数は他の変数やダッシュボードから参照されています。", @@ -4380,7 +5401,10 @@ "placeholder-descriptive-text": "説明用のテキスト", "placeholder-label-name": "ラベル名", "placeholder-variable-name": "変数名", - "text-running-query": "クエリ実行中..." + "text-running-query": "クエリ実行中...", + "title": { + "delete-variable": "変数を削除" + } }, "variable-editor-list": { "definition": "定義", @@ -4562,6 +5586,25 @@ "message": "データソースが見つかりません" } }, + "datagrid": { + "add-column": { + "placeholder-column-name": "" + }, + "datagrid-context-menu": { + "render-context-menu-items": { + "label-clear-column": "", + "label-clear-row": "", + "label-remove-all-data": "", + "label-search": "検索..." + }, + "render-header-menu-items": { + "label-clear-column": "", + "label-delete-column": "", + "label-rename-column": "", + "label-set-field-type": "" + } + } + }, "datasources": { "add-new-data-source-button": { "tooltip-no-permission": "新しいデータソースを設定する権限がありません" @@ -4583,6 +5626,46 @@ "label-default": "初期設定", "label-name": "名前" }, + "build-categories": { + "categories": { + "title": { + "cloud": "", + "distributed-tracing": "", + "enterprise-plugins": "エンタープライズプラグイン", + "industrial-io-t": "", + "logging-document-databases": "", + "others": "", + "profiling": "", + "sql": "", + "time-series-databases": "" + } + } + }, + "build-nav-model": { + "analytics": { + "text": { + "insights": "インサイト" + } + }, + "caching": { + "text": { + "cache": "" + } + }, + "ds-permissions": { + "text": { + "permissions": "権限" + } + }, + "nav-model": { + "text": { + "settings": "設定" + } + }, + "text": { + "dashboards": "ダッシュボード" + } + }, "button-row": { "delete": "削除", "save-and-test": "保存してテスト", @@ -4618,6 +5701,11 @@ "data-source-read-only-message": { "title-provisioned-data-source": "プロビジョニングされたデータソース" }, + "data-source-settings-reducer": { + "message": { + "testing-could-couple-minutes": "" + } + }, "data-source-type-card": { "aria-label-learn-more": "{{dataSourcePluginName}}、詳細はこちら。" }, @@ -4635,13 +5723,88 @@ "footer": { "add-csv-or-spreadsheet": "CSVまたはスプレッドシートを追加" }, + "get-enterprise-phantom-plugins": { + "description": { + "adobe-analytics-datasource": "", + "app-dynamics-integration-and-data-source": "", + "atlassian-statuspage-datasource": "", + "aurora-data-source": "", + "azure-cosmos-db-datasource": "", + "azure-devops-datasource": "", + "catchpoint-datasource": "", + "cloudflare-datasource": "", + "cockroach-db-datasource": "", + "data-dog-integration-and-data-source": "", + "drone-datasource": "", + "git-lab-integration-and-datasource": "", + "honeycomb-integration-and-datasource": "", + "jira-integration-and-datasource": "", + "logic-monitor-devices-datasource": "", + "mongo-db-integration-and-data-source": "", + "netlify-datasource": "", + "new-relic-integration-and-data-source": "", + "pager-duty-datasource": "", + "salesforce-integration-and-datasource": "", + "sap-hana-integration-and-data-source": "", + "service-now-integration-and-data-source": "", + "signal-fx-integration-and-datasource": "", + "snowflake-integration-and-data-source": "", + "sumo-logic-integration-and-datasource": "", + "visualize-and-explore-dynatrace-data": "", + "visualize-and-explore-oracle-sql": "", + "visualize-and-explore-splunk-logs": "", + "wavefront-integration-and-data-source": "", + "zendesk-datasource": "" + } + }, + "get-grafana-cloud-phantom-plugin": { + "description": { + "hosted-graphite-prometheus-and-loki": "" + } + }, "new-data-source-view": { "cancel": "キャンセル", "placeholder-filter-by-name-or-type": "名前または種類で絞り込む" }, + "update-data-source": { + "error-info": { + "message": { + "an-unexpected-error-occurred": "" + } + } + }, "use-data-source-info": { "badge-text-not-supported": "サポート対象外", - "badge-text-supported": "サポート対象" + "badge-text-supported": "サポート対象", + "label": { + "alerting": "アラート", + "type": "種類" + } + }, + "use-delete-loaded-data-source": { + "title": { + "delete": "削除" + } + } + }, + "debug": { + "cursor-view": { + "no-events-yet": "" + }, + "render-info-viewer": { + "data-counter": "", + "elapsed-time": "", + "field": "フィールド", + "last": "", + "render-counter": "", + "schema-counter": "", + "title-reset-counters": "", + "tooltip-step-back": "", + "type": "種類" + }, + "state-view": { + "current-value": "", + "label-state-name": "" } }, "dimensions": { @@ -4710,6 +5873,19 @@ "remove-value-mapping-aria-label-delete-value-mapping": "値マッピングを削除", "remove-value-mapping-tooltip-delete": "削除", "set-color": "色を設定", + "special-match-options": { + "description": { + "boolean-false-values": "", + "boolean-true-values": "", + "empty-string": "", + "matches-against-number-na-n-not-a-number": "", + "matches-null-and-undefined-values": "", + "matches-null-undefined-and-na-n": "" + }, + "label": { + "empty": "空" + } + }, "tooltip-remove-color": "色を削除", "tooltip-remove-icon": "アイコンを削除" }, @@ -4725,6 +5901,20 @@ "display-text": "表示テキスト", "icon": "アイコン", "label-add-a-new-mapping": "新しいマッピングを追加", + "mapping-types": { + "description": { + "match-a-numerical-range-of-values": "", + "match-a-regular-expression-with-replacement": "", + "match-a-specific-text-value": "", + "match-boolean-empty-values": "" + }, + "label": { + "range": "", + "regex": "", + "special": "", + "value": "値" + } + }, "update": "アップデート" } }, @@ -4749,6 +5939,7 @@ }, "explore": { "accordian-logs": { + "events": "", "footer": "イベントのタイムスタンプは完全なトレースの開始時間を基準としています。" }, "accordian-references": { @@ -4759,6 +5950,11 @@ "basic-extensions": { "aria-label-add": "追加" }, + "build-dashboard-panel-from-explore-state": { + "title": { + "new-panel": "" + } + }, "clear": "消去", "confirm-navigation-modal": { "cancel": "キャンセル", @@ -4845,6 +6041,33 @@ "title-table": "テーブル", "title-traces": "トレース" }, + "explore-query-inspector": { + "data-tab": { + "label": { + "data": "データ" + } + }, + "error-tab": { + "label": { + "error": "エラー" + } + }, + "json-tab": { + "label": { + "json": "JSON" + } + }, + "query-tab": { + "label": { + "query": "クエリ" + } + }, + "stats-tab": { + "label": { + "stats": "ステータス" + } + } + }, "explore-run-query-button": { "run-button": { "aria-label-run-query-options": "クエリ実行オプション" @@ -4858,10 +6081,23 @@ "description-explore-disabled": "Exploreを有効にするには、Grafanaの設定で有効にしてください。", "title-explore-disabled": "Exploreは無効です" }, + "get-field-links-for-explore": { + "text": { + "data": "データ", + "raw-value": "" + } + }, "get-matches-metadata": { "matches": "0件の一致" }, "legacy-create-span-link-factory": { + "text": { + "tags": "タグ" + }, + "title": { + "related-logs": "", + "session-for-this-span": "このスパンのセッション" + }, "title-explore-metrics-for-this-span": "このスパンのメトリックを調査", "title-explore-split": "分割ビューでログを詳しく見る", "title-session-for-this-span": "このスパンのセッション" @@ -4902,6 +6138,10 @@ }, "logs-meta-row": { "download": "ダウンロード", + "label": { + "deduplication-count": "", + "showing-only-selected-fields": "" + }, "show-original-line": "元の行を表示" }, "logs-sample-panel": { @@ -5083,6 +6323,21 @@ "run-query-button": "クエリの実行", "switch-datasource-button": "データソースを切り替えてクエリを実行する" }, + "scoped-vars-from-span": { + "text": { + "span": "" + } + }, + "scoped-vars-from-tags": { + "text": { + "tags": "タグ" + } + }, + "scoped-vars-from-trace": { + "text": { + "trace": "トレース" + } + }, "search-bar-input": { "placeholder-find": "検索...", "suffix": { @@ -5117,9 +6372,25 @@ "tooltip-tag-key": "タグ値を取得するために使用されるタグキー。スパンの属性とリソースでタグキーを検索します" }, "span-detail": { + "label": { + "kind": "", + "library-name": "", + "library-version": "", + "status": "ステータス:", + "status-message": "", + "trace-state": "" + }, "label-resource-attributes": "リソース属性", "label-span-attributes": "スパン属性", "label-stack-trace": "スタックトレース", + "overview-items": { + "label": { + "child-count": "", + "duration": "", + "service": "", + "start-time": "" + } + }, "warnings": "警告" }, "span-filters": { @@ -5226,6 +6497,18 @@ "title-node-graph": "ノードグラフ" }, "unthemed-logs": { + "description": { + "show-results-in-logs-visualisation": "", + "show-results-in-table-visualisation": "", + "show-results-newest-to-oldest": "", + "show-results-oldest-to-newest": "" + }, + "label": { + "logs": "ログ", + "newest-first": "新しいものから表示", + "oldest-first": "古いものから表示", + "table": "テーブル" + }, "label-deduplication": "重複排除", "label-display-results": "結果を表示", "label-prettify-json": "JSONの整形", @@ -5241,6 +6524,15 @@ }, "unthemed-virtualized-trace-view": { "title-scroll-to-top": "先頭にスクロール" + }, + "use-focus-span-link": { + "create-focus-span-link": { + "link": { + "title": { + "deep-link-to-this-span": "" + } + } + } } }, "export": { @@ -5326,6 +6618,15 @@ "folder-repo": { "badge-text": "プロビジョニング済み" }, + "folders": { + "get-loading-nav": { + "main": { + "title": { + "loading": "読込中" + } + } + } + }, "forgot-password": { "back-button": "ログイン画面に戻る", "change-password": { @@ -5355,10 +6656,102 @@ "incomplete-request-error": "申し訳ありませんが、リクエストを完了できませんでした。もう一度やり直してください。", "send-custom-feedback": "送金" }, + "geomap": { + "coordinates-map-view-editor": { + "label-latitude": "", + "label-longitude": "" + }, + "debug-overlay": { + "center": "", + "zoom": "" + }, + "fit-map-view-editor": { + "all-layers-editor-fragment": { + "label-layer": "" + }, + "label-data": "データ", + "last-only-editor-fragment": { + "label-padding": "", + "tooltip-padding-relative-percent-beyond-extent": "" + } + }, + "frame-multi-selection-editor": { + "placeholder-change-filter": "" + }, + "frame-selection-editor": { + "placeholder-change-filter": "" + }, + "geomap-panel": { + "aria-label-map": "" + }, + "geomap-style-rules-editor": { + "aria-label-add-geomap-style-rule": "" + }, + "layers-editor": { + "label-add-layer": "", + "no-layers": "" + }, + "map-view-editor": { + "label-max-zoom": "", + "label-view": "表示", + "label-zoom": "ズーム", + "use-current-map-settings": "" + }, + "markers-legend": { + "title-symbol": "シンボル" + }, + "measure-overlay": { + "tooltip-show-measure-tools": "" + }, + "plugin": { + "basemap-layer-configured-server-admin": "" + }, + "style-editor": { + "label-align": "", + "label-baseline": "", + "label-color": "色", + "label-fill-opacity": "", + "label-font-size": "", + "label-opacity": "", + "label-rotation-angle": "", + "label-size": "", + "label-symbol": "シンボル", + "label-symbol-horizontal-align": "", + "label-symbol-vertical-align": "", + "label-text-label": "", + "label-x-offset": "", + "label-y-offset": "" + }, + "style-rule-editor": { + "aria-label-comparison-operator": "比較演算子", + "aria-label-comparison-value": "", + "aria-label-delete-style-rule": "", + "aria-label-feature-property": "", + "label-rule": "ルール", + "placeholder-feature-property": "", + "placeholder-numeric-value": "", + "placeholder-value": "値" + } + }, "get-enterprise": { "requires-license": "Grafana Enterpriseライセンスが必要です", "title": "エンタープライズ" }, + "gettingstarted": { + "docs-card": { + "complete": "完了", + "learn-how": "" + }, + "getting-started": { + "aria-label-to-advanced-tutorials": "", + "aria-label-to-basic-tutorials": "", + "checking-completed-setup-steps": "", + "remove-this-panel": "" + }, + "tutorial-card": { + "complete": "完了" + } + }, "gops": { "config-card": { "text-loading-configuration": "設定を読み込み中..." @@ -5375,6 +6768,74 @@ }, "progress-status": { "your-progress": "進捗状況" + }, + "use-get-configuration-for-ui": { + "get-connect-data-source-configuration": { + "title": { + "connect-data-source": "" + } + }, + "title": { + "essentials": "必須" + } + }, + "use-get-essentials-configuration": { + "essential-content": { + "description": { + "configure-grafana-alerting": "", + "create-integration-alerting-contact-point": "", + "initialize-incident-plugin-declare-manage-incidents": "", + "practice-solving-an-incident": "", + "receive-alerts-oncall-notifications-within-environment": "", + "select-chat-ops-channels-to-route-notifications": "" + }, + "label": { + "add": "追加", + "connect": "接続", + "initialize": "", + "select-integration": "", + "start-drill": "" + }, + "title": { + "add-slack-notifications-to-irm-integrations": "", + "connect-alerting-to-irm": "", + "connect-irm-to-your-slack-workspace": "", + "connect-your-messaging-workspace-to-incident": "", + "connect-your-messaging-workspace-to-on-call": "", + "create-incident-drill": "", + "detect": "検出", + "initialize-incident-plugin": "", + "messaging-workspace-channel-on-call-integration": "", + "respond": "", + "test-your-configuration": "" + } + }, + "get-grafana-alerting-config-steps": { + "description": { + "create-alert-monitor-system": "", + "create-on-call-integration-alerting-contact-point": "", + "create-slos-to-monitor-your-service": "" + }, + "label": { + "connect": "接続", + "create": "作成", + "enable": "有効化" + }, + "steps": { + "label": { + "edit": "編集" + }, + "title": { + "update-default-contact-point": "" + } + }, + "title": { + "connect-alerting-to-on-call": "", + "create-alert-rule": "", + "create-slo": "", + "enable-slo-alerting": "" + } + } } }, "grafana": { @@ -5741,14 +7202,18 @@ "duplicate-panel": "パネルを複製", "exit-edit/setting-views": "編集/設定ビューを終了する", "expand-all-rows": "すべての行を広げる", + "explore-panel": "", "go-to-dashboards": "ダッシュボードへ移動", "go-to-explore": "Exploreに移動", "go-to-home-dashboard": "ホームダッシュボードへ移動", "go-to-profile": "プロフィールへ移動", + "inspect-panel": "", "make-time-range-permanent": "時間範囲を絶対的/永続的にする", "move-time-range-back": "時間範囲を後ろに移動", "move-time-range-forward": "時間範囲を前に移動", "open-search": "検索を開く", + "open-share-embed-drawer": "", + "open-share-link-drawer": "", "open-shared-modal": "パネルスナップショットを共有", "paste-time-range": "時間範囲を貼り付け", "refresh-all-panels": "すべてのパネルを更新", @@ -5774,6 +7239,11 @@ "support-bundle": "<1>サポートバンドルセクション</1>で、Grafanaインスタンスと構成されたデータソースに関する情報を含むサポートバンドルを取得することもできます。", "troubleshooting-help": "トラブルシューティングのヘルプをリクエストするには、このパネルのスナップショットをGrafana Labsテクニカルサポートに送信してください。スナップショットには、クエリ応答データとパネル設定が含まれています。" }, + "histogram": { + "histogram-panel": { + "no-histogram-found-in-response": "" + } + }, "inspector": { "inspect-data-tab": { "loading": "読込中", @@ -5821,6 +7291,9 @@ "label-name": "名前", "label-password": "パスワード", "label-username": "ユーザー名", + "message": { + "email-is-invalid": "" + }, "placeholder-name-optional": "名前(任意)", "placeholder-password": "パスワード", "placeholder-username": "ユーザー名", @@ -6077,8 +7550,26 @@ "discard-local-changes": "ローカルの変更を破棄", "title-dashboard-changed": "ダッシュボードが変更されました" }, + "live-channel-editor": { + "description-grafana-live": "", + "namespace": "名前空間", + "path": "パス", + "placeholder-select-watchable-resource": "", + "scope": "", + "title-grafana-live": "" + }, "live-connection-warning": { "title-connection-to-server-is-lost": "サーバーへの接続が失われました..." + }, + "live-panel": { + "error": "エラー", + "grafana-requires-feature": "", + "panel-editor-channel": "", + "title-grafana-live": "", + "waiting-for-data": "" + }, + "live-publish": { + "publish": "" } }, "lock-icon": "アイコンをロックする", @@ -6125,6 +7616,13 @@ } }, "logs": { + "get-dataframe-fields": { + "vars": { + "text": { + "labels": "ラベル" + } + } + }, "infinite-scroll": { "end-of-range": "選択した時間範囲の終わり。", "load-more": "スクロールしてさらに読み込む", @@ -6205,6 +7703,11 @@ "shortcut": "Altキーを押しながら選択すると再度有効になります" } }, + "log-series-to-logs-model": { + "label": { + "total-bytes-processed": "" + } + }, "logs-controls": { "deduplication": "重複排除", "disable-highlighting": "ハイライトを無効にする", @@ -6239,6 +7742,11 @@ "scroll-top": "一番上までスクロール", "start-of-range": "範囲の開始日" }, + "logs-panel": { + "render-common-labels": { + "common-labels": "" + } + }, "out-of-range-message": { "end-of-the-selected-time-range": "選択した時間範囲の終わり。" }, @@ -6295,6 +7803,14 @@ }, "snapshot-list-table": { "title-delete": "削除" + }, + "unthemed-dashboard-import": { + "subTitle": { + "import-dashboard-from-file-or-grafanacom": "" + }, + "text": { + "import-dashboard": "ダッシュボードをインポート" + } } }, "migrate-to-cloud": { @@ -6952,8 +8468,54 @@ "close": "パネルを閉じる" }, "link-title": "Grafana Labsブログに移動", + "news-panel": { + "body-error-loading-rss-feed": "", + "loading": "読み込み中...", + "title-error-loading-rss-feed": "" + }, "title": "最新ブログから" }, + "nodeGraph": { + "arc-options-editor": { + "add-arc": "", + "title-remove-arc": "" + }, + "edge": { + "aria-label-from-to": "" + }, + "edge-header": { + "label-source-target": "" + }, + "marker": { + "100-node-count": "", + "aria-label-hidden-marker": "", + "node-count_other": "" + }, + "node": { + "aria-label-node-title": "" + }, + "node-graph": { + "aria-label-layered-layout-performance-warning": "", + "aria-label-nodes-hidden-warning": "", + "computing-layout": "", + "no-data": "データなし", + "hidden-nodes_other": "", + "processed-nodes_other": "" + }, + "node-graph-panel": { + "no-data-found-in-response": "" + }, + "node-header": { + "label-subtitle": "", + "label-title": "タイトル" + }, + "view-controls": { + "hide-config": "", + "show-config": "", + "title-zoom-in": "", + "title-zoom-out": "" + } + }, "notifications": { "empty-state": { "description": "受信した通知はここに表示されます", @@ -6995,6 +8557,11 @@ "label-organization-name": "組織名", "placeholder-org-name": "組織名" }, + "org-details-page": { + "title": { + "confirm-preferences-update": "" + } + }, "org-profile": { "label-organization-name": "組織名", "label-organization-profile": "組織プロフィール", @@ -7014,7 +8581,10 @@ "tooltip": "「基本的な役割なし」オプションを選択し、カスタムニーズに権限を追加できるようになりました。詳細については、<1>ドキュメント</1>をご覧ください。" }, "user-invite-page": { - "sub-title": "招待状を送信するか、既存のGrafanaユーザーを組織<1>{{orgName}}</1>に追加します。" + "sub-title": "招待状を送信するか、既存のGrafanaユーザーを組織<1>{{orgName}}</1>に追加します。", + "text": { + "invite-user": "" + } } }, "org-picker": { @@ -7026,6 +8596,38 @@ } }, "panel": { + "get-calculation-value-data-links-variable-suggestions": { + "value-calc-var": { + "label": { + "calculation-name": "" + } + } + }, + "get-data-links-variable-suggestions": { + "value-time-var": { + "label": { + "time": "時間" + } + } + }, + "get-field-links-supplier": { + "text": { + "data": "データ", + "field": "フィールド", + "series": "", + "value": "値" + } + }, + "get-field-vars": { + "label": { + "name": "名前" + } + }, + "get-panel-links-variable-suggestions": { + "label": { + "all-variables": "" + } + }, "header-menu": { "copy": "コピー", "create-library-panel": "ライブラリパネルを作成", @@ -7086,6 +8688,13 @@ "select-placeholder": "タイプで絞り込む" }, "playlist": { + "playlist-new-page": { + "page-nav": { + "text": { + "new-playlist": "新しいプレイリスト" + } + } + }, "playlist-table-rows": { "aria-label-playlist-item": "プレイリスト項目、{{itemType}}、{{itemValue}}", "multiple-dashboards-found": "複数の項目が見つかりました:{{items}}", @@ -7102,6 +8711,12 @@ "label-mode": "モード", "label-time-and-refresh": "時間と更新", "label-variables": "変数", + "modes": { + "label": { + "kiosk": "キオスク", + "normal": "通常" + } + }, "title-start-playlist": "プレイリストを開始" } }, @@ -7168,6 +8783,19 @@ }, "browse": { "aria-label-plugin-type-filter": "プラグインタイプフィルター", + "filter-by-options": { + "label": { + "all": "すべて", + "installed": "インストール済み", + "new-updates": "" + } + }, + "label": { + "all": "すべて", + "applications": "", + "data-sources": "データソース", + "panels": "パネル" + }, "label-search": "検索", "label-state": "ステート", "label-type": "タイプ", @@ -7249,12 +8877,24 @@ "empty-state": { "message": "プラグインが見つかりませんでした" }, + "extensions-log-data-source": { + "message": { + "ok": "OK" + } + }, "filter": { "disabled": "Grafanaサーバーがgrafana.comにアクセスできないため、このフィルタは無効になっています", "sort": "並べ替え", "sort-list": "プラグインリストを並べ替え", "state": "ステート" }, + "get-feature-state-info": { + "text": { + "alpha": "", + "beta": "ベータ版", + "deprecated": "非推奨" + } + }, "get-started-with-app": { "disable": "無効にする", "enable": "有効にする" @@ -7311,6 +8951,16 @@ "plugin-details-header-dependencies": { "grafana-dependency": "Grafana {{grafanaDependency}}" }, + "plugin-details-page": { + "not-found-model": { + "subTitle": { + "requested-belong-plugin": "" + }, + "text": { + "unknown-plugin": "" + } + } + }, "plugin-details-signature": { "body-invalid-plugin-signature": "Grafana Labsは各プラグインをチェックして有効なデジタル署名の有無を確認します。プラグイン署名の検証は、プラグインの安全性と信頼性を確保するためのセキュリティ対策の一環です。Grafana Labsはこの未署名のプラグインの整合性を保証できません。プラグインの作者に署名するようお願いしてください。", "read-more-about-plugins-signing": "プラグインの署名の詳細についてお読みください。", @@ -7356,6 +9006,13 @@ "search-field": { "placeholder-search-grafana-plugins": "Grafanaプラグインを検索" }, + "use-plugin-details-tabs": { + "nav-model-children": { + "text": { + "dashboards": "ダッシュボード" + } + } + }, "version-install-button": { "text-installed": "インストール済み" }, @@ -7472,6 +9129,11 @@ "label-git-hub-features": "GitHub機能", "label-realtime-feedback": "リアルタイムフィードバック" }, + "connect-page": { + "subTitle": { + "connect-external-storage-manage-resources": "" + } + }, "connect-repository-button": { "configure": "構成", "configure-file": "ファイルのプロビジョニングを設定", @@ -7505,7 +9167,13 @@ }, "edit-repository-page": { "back-to-repositories": "リポジトリに戻る", - "repository-config-exists-configuration": "リポジトリ設定が設定ファイルに含まれていることを確認してください。" + "repository-config-exists-configuration": "リポジトリ設定が設定ファイルに含まれていることを確認してください。", + "subTitle": { + "configure-repository-storing-resources": "" + }, + "text": { + "configure-repository": "" + } }, "empty-state": { "no-jobs": "ジョブはありません…" @@ -7568,6 +9236,11 @@ "no-results-matching-your-query": "クエリに一致する結果なし", "placeholder-search": "検索" }, + "get-default-values": { + "title": { + "repository": "レポジトリ" + } + }, "getting-started": { "alert-temporary-outage": "インスタンス全体を接続すると、移行実行中はダッシュボードが利用できなくなります。このプロセスを開始する前に、ユーザーに警告することをお勧めします。", "modal-description-public-access": "GitHub連携を有効にするために、Grafanaインスタンスへの公開アクセスを設定", @@ -7712,7 +9385,18 @@ "dashboard-preview": "ダッシュボードプレビュー", "existing-dashboard": "既存のダッシュボード", "history": "履歴", + "message": { + "removed-from-repo-test-ui": "", + "updated-from-repo-test-ui": "" + }, "repository": "レポジトリ", + "tab-info": { + "label": { + "dry-run-result-after-apply": "", + "existing-from-grafana": "", + "file-from-repository": "" + } + }, "title-error-saving-file": "ファイル保存時のエラー" }, "setup-modal": { @@ -8121,14 +9805,6 @@ "reload-button": "再読み込み", "title": "アプリケーションファイルが見つかりません" }, - "sandbox": { - "test-stuff-page": { - "application-notifications-toasts-testing": "アプリケーション通知(トースト)のテスト", - "error": "エラー", - "success": "成功", - "warning": "警告" - } - }, "save-dashboards": { "message-length": { "info": "メッセージは{{messageLength}}文字で、最大文字数(500文字)を超えています。保存する前に短くしてください。", @@ -8188,6 +9864,14 @@ "view-as-folders": "フォルダ別に表示", "view-as-list": "リストとして表示" }, + "bluge-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } + }, "dashboard-actions": { "import": "インポート", "new": "新規", @@ -8215,6 +9899,14 @@ "search-results-table": { "aria-label-search-results-table": "検索結果テーブル", "no-data": "値がありません" + }, + "unified-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } } }, "select": { @@ -8286,6 +9978,11 @@ "delete-service-account": "サービスアカウントを削除", "disable-service-account": "サービスアカウントを無効化", "enable-service-account": "サービスアカウントを有効化", + "page-nav": { + "subTitle": { + "manage-settings-individual-service-account": "" + } + }, "title-delete-service-account": "サービスアカウントを削除", "title-disable-service-account": "サービスアカウントを無効化", "tokens": "トークン", @@ -8602,6 +10299,11 @@ "sort-picker": { "select-aria-label": "並べ替え" }, + "status-history": { + "status-history-panel": { + "too-many-points_other": "" + } + }, "support-bundles": { "new-bundle-button": { "new-support-bundle": "新しいサポートバンドル" @@ -8609,7 +10311,10 @@ "support-bundles-create-unconnected": { "cancel": "キャンセル", "create": "作成", - "sub-title": "サポートバンドルに含めるコンポーネントを選択してください。サポートバンドルは作成後3日間利用可能です。" + "sub-title": "サポートバンドルに含めるコンポーネントを選択してください。サポートバンドルは作成後3日間利用可能です。", + "text": { + "create-support-bundle": "" + } }, "support-bundles-unconnected": { "created-on": "作成日", @@ -8624,10 +10329,35 @@ "login": "ログイン" }, "table": { + "auto-cell-options-editor": { + "description-wrap-text": "", + "label-wrap-text": "" + }, + "bar-gauge-cell-options-editor": { + "label-gauge-display-mode": "", + "label-value-display": "" + }, + "color-background-cell-options-editor": { + "description-apply-to-entire-row": "", + "description-wrap-text": "", + "label": { + "text-alpha": "" + }, + "label-apply-to-entire-row": "", + "label-background-display-mode": "", + "label-wrap-text": "", + "wrap-text": "" + }, "container": { "content": "1つのテーブルで多すぎる列を表示すると、パフォーマンスに影響を与え、データの読み取りが困難になる可能性があります。クエリを絞り込むことを検討してください。", "show-all-series": "すべての列を表示", "show-only-series": "{{MAX_NUMBER_OF_COLUMNS}}件の列のみ表示" + }, + "image-cell-options-editor": { + "description-alt-text": "", + "description-title-text": "", + "label-alt-text": "", + "label-title-text": "" } }, "tag-filter": { @@ -8643,6 +10373,24 @@ "select-placeholder": "チームを選択" }, "teams": { + "build-nav-model": { + "nav-model": { + "subTitle": { + "manage-members-and-settings": "" + }, + "text": { + "settings": "設定" + } + }, + "team-group-sync": { + "text": { + "external-group-sync": "外部グループ同期" + } + }, + "text": { + "members": "メンバー" + } + }, "create-team": { "create": "作成", "description-email": "これは任意であり、主にカスタムチームのアバターに使用されます", @@ -8664,6 +10412,9 @@ "external-group-sync": "外部グループ同期", "label-add-external-group": "外部グループを追加", "team-sync-upgrade": "Grafana Proの試用期間中にチーム同期を無料で有効にするには、グループを追加してください", + "text": { + "add-group": "グループを追加" + }, "title-there-external-groups": "同期できる外部グループはありません", "tooltip-add-external-group": "LDAPグループの例:{{example}}" }, @@ -8765,6 +10516,42 @@ "select-search-input": "検索するために入力してください(国、都市、略語)" } }, + "timeseries": { + "annotation-editor2": { + "add-annotation": "注釈を追加", + "cancel": "キャンセル", + "edit-annotation": "", + "label-description": "説明", + "label-tags": "タグ", + "placeholder-add-tags": "", + "save": "保存", + "saving": "保存中" + }, + "annotation-tooltip2": { + "tooltip-delete": "削除", + "tooltip-edit": "編集" + }, + "line-style-editor": { + "title-the-input-expects-a-segment-list": "", + "tooltip-help": "ヘルプ" + }, + "nulls-threshold-input": { + "placeholder-never": "なし" + }, + "outside-range-plugin": { + "data-outside-time-range": "", + "zoom-to-data": "" + }, + "timezones-editor": { + "tooltip-add-timezone": "", + "tooltip-remove-timezone": "" + } + }, + "traces": { + "traces-panel": { + "no-data-found-in-response": "" + } + }, "transformations": { "empty": { "add-transformation-body": "変換を使用すると、視覚化が表示される前にさまざまな方法でデータを変更できます。<1></1>これには、データの結合、フィールド名の変更、計算、表示用のデータのフォーマットなどが含まれます。", @@ -8801,6 +10588,10 @@ "convert-field-type-transformer-editor": { "aria-label-add-a-convert-field-type-transformer": "フィールドタイプ変換機能を追加", "aria-label-remove-convert-field-type-transformer": "フィールドタイプ変換機能を削除", + "label": { + "browser": "ブラウザ", + "utc": "" + }, "label-as": "として", "label-date-format": "日付形式", "label-field": "フィールド", @@ -8887,11 +10678,32 @@ "tooltip-format": "<2>Moment.js形式文字列</2>として指定されたフィールドの出力形式。", "tooltip-timezone-manually": "日付のタイムゾーンを手動で設定" }, + "get-timezone-options": { + "label": { + "browser": "ブラウザ", + "utc": "" + } + }, "get-tooltips": { "description": "JSONオブジェクトの有効なパス。", "json-value": "JSON値:", + "map-valid-paths": { + "description": { + "extract-fields-from-object": "", + "extract-value": "", + "extract-value-first-element": "", + "extract-value-second-element": "" + } + }, "valid-paths": "有効なパス:" }, + "get-transformer-option-pane": { + "root": { + "title": { + "root": "" + } + } + }, "group-by-field-configuration": { "placeholder-ignored": "無視", "placeholder-select-stats": "統計を選択" @@ -8908,7 +10720,23 @@ "label-cell-value": "セルの値:", "label-column": "列", "label-empty-value": "空の値", - "label-row": "行" + "label-row": "行", + "special-value-options": { + "description": { + "boolean-false-value": "", + "boolean-true-value": "", + "empty-string": "", + "null-value": "", + "number-value": "" + }, + "label": { + "empty": "空", + "false": "", + "null": "", + "true": "", + "zero": "" + } + } }, "histogram-transformer-editor": { "placeholder-auto": "自動", @@ -8971,10 +10799,22 @@ "tooltip-naming": "選択したフィールドの名前の表示方法を設定します。フレーム名は通常、表形式データに適しています" }, "partition-by-values-editor": { + "keep-fields-options": { + "label": { + "no": "いいえ", + "yes": "はい" + } + }, "label-field": "フィールド", "label-keep-fields": "フィールドを保持", "label-naming": "命名", "label-select-field": "フィールドを選択", + "naming-modes-options": { + "label": { + "as-frame-name": "", + "as-label": "" + } + }, "partition-values-works-single-frame": "値によるパーティション分割は、単一フレームでのみ機能します。", "tooltip-keeps-partition-fields-frames": "フレーム内のパーティションフィールドを保持します" }, @@ -8996,6 +10836,16 @@ "label-include-time": "時間を含める", "label-labels-to-fields": "ラベルをフィールドに", "label-mode": "モード", + "modes": { + "description": { + "collapse-field-single-value": "", + "create-table-series-value": "" + }, + "label": { + "reduce-fields": "", + "series-to-rows": "" + } + }, "placeholder-choose-stat": "統計を選択" }, "regex-matcher-editor": { @@ -9003,11 +10853,23 @@ "variable-regex-documentation": "" }, "regression-transformer-editor": { + "label": { + "cubic": "", + "quadratic": "", + "quartic": "", + "quintic": "" + }, "label-degree": "次数", "label-model-type": "モデルタイプ", "label-predicted-points": "予測ポイント", "label-x-field": "Xフィールド", "label-y-field": "Yフィールド", + "model-type-options": { + "label": { + "linear": "", + "polynomial": "" + } + }, "tooltip-number-of-xy-points-to-predict": "予測するX、Yポイント数" }, "rename-by-regex-transformer-editor": { @@ -9025,6 +10887,23 @@ "label-reverse": "反転", "placeholder-select-field": "フィールドを選択" }, + "supplier": { + "description": { + "apply-spatial-operations-to-the-geometry": "", + "create-a-line-between-two-points": "", + "geometry-define-field-headingdistancearea": "" + }, + "label": { + "area": "", + "as-line": "", + "calculate-value": "", + "distance": "", + "heading": "", + "line-builder": "", + "prepare-spatial-field": "", + "transform": "" + } + }, "time-series-table-transform-editor": { "label-stat": "統計", "label-time-field": "時間フィールド", @@ -9058,7 +10937,19 @@ "placeholder-auto": "自動", "placeholder-field": "フィールド", "tooltip-window-size": "ウィンドウサイズ", - "tooltip-window-size-percent": "ウィンドウサイズを全データの割合として設定します" + "tooltip-window-size-percent": "ウィンドウサイズを全データの割合として設定します", + "type-options": { + "label": { + "centered": "", + "trailing": "" + } + }, + "window-size-mode-options": { + "label": { + "fixed": "", + "percentage": "" + } + } } }, "upgrade-box": { @@ -9115,6 +11006,11 @@ }, "users-action-bar-unconnected": { "invite": "招待", + "options": { + "label": { + "users": "ユーザー" + } + }, "placeholder-search-login-email": "ログイン、メールアドレス、または名前でユーザーを検索" } }, @@ -9158,6 +11054,32 @@ "confirm-delete-modal": { "title-delete-variable": "変数を削除" }, + "create-ad-hoc-variable-adapter": { + "description": { + "add-keyvalue-filters-on-the-fly": "" + } + }, + "create-custom-variable-adapter": { + "description": { + "define-variable-values-manually": "" + } + }, + "create-interval-variable-adapter": { + "description": { + "define-timespan-interval": "" + } + }, + "create-query-variable-adapter": { + "description": { + "variable-values-fetched-datasource-query": "" + } + }, + "data-source-variable-slice": { + "text": { + "default": "", + "no-data-sources-found": "データソースが見つかりません" + } + }, "empty-state": { "button-title": "変数を追加", "info-box-content": "変数を使用すると、よりインタラクティブで動的なダッシュボードが可能になります。メトリッククエリでサーバー名やセンサー名などをハードコーディングする代わりに、変数を使用できます。変数は、ダッシュボードの上部にリストボックスとして表示されます。これらのドロップダウンリストを使用すると、ダッシュボードに表示されているデータを簡単に変更できます。", @@ -9184,6 +11106,13 @@ "placeholder-default-value-if-any": "デフォルト値(ある場合)", "text-options": "テキストオプション" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "unknown-table": { "loading": "読み込み中...", "no-unknowns": "名前が変更された変数や欠落している変数は見つかりませんでした。", @@ -9240,5 +11169,25 @@ "data-hover-view": { "link": "リンク" } + }, + "welcome": { + "welcome-banner": { + "need-help": "サポートが必要ですか?", + "welcome-to-grafana": "" + } + }, + "xychart": { + "series-editor": { + "add-series": "", + "aria-label-select-series": "", + "label-color-field": "", + "label-frame": "フレーム", + "label-size-field": "", + "label-x-field": "Xフィールド", + "label-y-field": "Yフィールド", + "placeholder-all-frames": "", + "placeholder-select-frame": "", + "tooltip-delete-series": "" + } } } \ No newline at end of file diff --git a/public/locales/ko-KR/grafana.json b/public/locales/ko-KR/grafana.json index 6368b25a701..0f974c40ecf 100644 --- a/public/locales/ko-KR/grafana.json +++ b/public/locales/ko-KR/grafana.json @@ -72,6 +72,11 @@ }, "admin-edit-org-page": { "label-name": "이름", + "page-nav": { + "subTitle": { + "manage-settings-roles-organization": "" + } + }, "render-missing-permission-message": { "title-access-denied": "액세스 거부됨" } @@ -233,6 +238,13 @@ "upgrade-info": { "title": "Enterprise 라이선스" }, + "user-admin-page": { + "page-nav": { + "subTitle": { + "manage-settings-for-an-individual-user": "" + } + } + }, "user-create-page": { "label-email": "이메일", "label-name": "이름", @@ -243,9 +255,16 @@ "label-ldap": "LDAP" }, "user-list-admin-page-un-connected": { + "label": { + "active-last-days": "", + "all-users": "모든 사용자" + }, "placeholder-search-login-email": "로그인, 이메일 또는 이름으로 사용자를 검색합니다." }, "user-list-anonymous-devices-page-un-connected": { + "label": { + "active-last-days": "" + }, "placeholder-search-devices-by-ip-address": "IP 주소로 장치를 검색합니다." }, "user-list-page": { @@ -364,6 +383,12 @@ "no-grouping": "그룹화 없음" }, "alert-group-alerts-table": { + "columns": { + "label": { + "instance-labels": "", + "notification-state": "알림 상태" + } + }, "duration": "{{time}} 동안" }, "alert-group-filter": { @@ -439,6 +464,11 @@ "description-section": "{{entityName}}을(를) 식별할 이름을 입력하세요.", "label-metric": "메트릭", "label-name": "이름", + "message": { + "must-enter-a-metric-name": "", + "must-enter-a-name": "", + "please-select-a-data-source": "데이터 소스를 선택하세요" + }, "metric-aria-label-metric": "메트릭", "metric-placeholder-recorded-metric": "새로 기록된 메트릭의 이름을 지정하세요", "placeholder-name": "{{namePlaceholder}}의 이름을 지정하세요", @@ -491,6 +521,9 @@ "alertmanager-config": { "gma-manual-configuration-description": "내부 Grafana Alertmanager 구성은 수동으로 변경할 수 없습니다. 이 구성을 변경하려면 UI를 통해 개별 리소스를 편집하세요.", "gma-manual-configuration-is-not-supported": "수동 구성 변경은 지원되지 않음", + "message": { + "configuration-cannot-be-empty": "" + }, "reset": "재설정", "reset-confirmation": "정말 '{{alertmanagerName}}'에 대한 구성을 재설정하시겠어요? 연락처 및 알림 정책이 기본값으로 재설정됩니다.", "resetting-configuration-might-while": "구성을 재설정하는 중이며, 시간이 걸릴 수 있습니다.", @@ -580,6 +613,9 @@ "create-a-contact-point": "연락처 생성", "label-default-contact-point": "기본 연락처", "label-timing-options": "타이밍 옵션", + "message": { + "required": "" + }, "or": "또는" }, "am-routes-expanded-form": { @@ -601,11 +637,19 @@ "label-override-grouping": "그룹화 재정의", "label-value": "값", "matching-labels": "일치하는 라벨", + "message": { + "required": "" + }, "placeholder-label": "라벨", "placeholder-value": "값", "remove": "제거", "tooltip-remove-matcher": "일치 조건 제거" }, + "annotation-header-field": { + "message": { + "required": "" + } + }, "annotations": { "dashboard-annotation-field": { "dashboard": "대시보드 {{dashboardUid}}", @@ -677,6 +721,25 @@ "title": "모든 이벤트 표시 불가" } }, + "central-alert-history-scene": { + "scene": { + "labels-filter-variable": { + "label": { + "labels": "" + } + }, + "transitions-from-filter-variable": { + "label": { + "start-state": "" + } + }, + "transitions-to-filter-variable": { + "label": { + "end-state": "" + } + } + } + }, "channel-sub-form": { "delete": "삭제", "duplicate": "복제", @@ -713,11 +776,17 @@ }, "cloud-data-source-selector": { "label": "데이터 소스를 선택하세요.", - "label-disabled": "데이터 소스" + "label-disabled": "데이터 소스", + "message": { + "please-select-a-data-source": "데이터 소스를 선택하세요" + } }, "cloud-evaluation-behavior": { "description-pending-period": "경고를 트리거하기 위해 임계값 조건을 충족해야 하는 기간입니다. '없음'을 선택하면 조건이 충족되는 즉시 경고가 트리거됩니다.", "label-pending-period": "보류 기간", + "message": { + "must-be-a-positive-integer": "" + }, "title-set-evaluation-behavior": "평가 동작 설정" }, "cloud-receiver-form": { @@ -758,6 +827,9 @@ "contact-point-selector": { "aria-label-refresh-contact-points": "연락처 새로 고침", "contact-point-picker-label-contact-point": "연락처", + "message": { + "contact-point-is-required": "" + }, "title-failed-to-fetch-contact-points": "연락처 가져오기 실패", "tooltip-refresh-contact-points-list": "연락처 목록 새로 고침" }, @@ -822,6 +894,14 @@ }, "copy-to-clipboard": "'{{label}}'을(를) 클립보드로 복사", "create-metadata": { + "label": { + "dashboard": "대시보드", + "dashboard-and-panel": "", + "evaluation-interval": "평가 간격", + "labels": "라벨", + "metric-name": "", + "runbook-url": "" + }, "view-dashboard": "대시보드 보기", "view-panel": "패널 보기" }, @@ -862,9 +942,6 @@ "title-search-panel": "패널 검색", "title-select-dashboard-and-panel": "대시보드 및 패널 선택" }, - "data-source-section": { - "import-to-grafana": "Grafana 규칙으로 가져오기" - }, "datasource-not-found": { "card-description": "이 쿼리의 데이터 소스가 제거되었거나 올바르게 설치되지 않아 찾을 수 없습니다.", "remove-query": "쿼리 제거", @@ -946,6 +1023,11 @@ "text-loading-template": "템플릿 로딩 중...", "title-failed-to-fetch-notification-template": "알림 템플릿 가져오기 실패" }, + "edit-mute-timing-page": { + "text": { + "edit-time-interval": "" + } + }, "editor": { "edit-alert-rule": "", "edit-recording-rule": "", @@ -959,6 +1041,11 @@ "error-summary-button": { "content-show-all-errors": "" }, + "evaluate-every-validation-options": { + "message": { + "required": "" + } + }, "evaluation-behavior-summary": { "evaluate": "", "label-evaluate": "평가", @@ -976,6 +1063,9 @@ "evaluation-group-creation-modal": { "description-group-name": "그룹은 동일한 평가 간격으로 모든 규칙을 평가합니다.", "description-often-rules-group-evaluated": "그룹의 모든 규칙을 평가하는 빈도입니다.", + "message": { + "required": "" + }, "placeholder-enter-a-name": "이름을 입력하세요", "title-new-evaluation-group": "새 평가 그룹" }, @@ -998,12 +1088,24 @@ "title-permission-editrecreate-silence": "이 알림 끄기를 편집/재생성할 권한이 없습니다", "title-silence-not-found": "기존의 알림 끄기 '{{silenceId}}'을(를) 찾을 수 없습니다" }, + "existing-silence-editor-page": { + "page-nav": { + "text": { + "edit-silence": "" + } + } + }, "export": { "subtitle": { "formats": "형식을 선택하고 파일을 다운로드하거나 클립보드에 콘텐츠를 복사하세요.", "one-format": "파일을 다운로드하거나 클립보드에 콘텐츠를 복사하세요." } }, + "export-new-grafana-rule-page": { + "text": { + "export-new-grafana-rule": "" + } + }, "export-new-rule-button": { "tooltip-export-new-grafana-rule": "새 Grafana 규칙 내보내기" }, @@ -1029,6 +1131,16 @@ "no-data": "데이터 없음", "page-counter": "" }, + "feature-toggle-page": { + "nav-model": { + "subTitle": { + "enable-alerting-grafana-config": "" + }, + "text": { + "alerting-is-not-enabled": "" + } + } + }, "federated-rule-warning": { "experimental": "연합 규칙 그룹은 현재 실험 단계에 있는 기능입니다.", "read-documentation": "문서 읽기", @@ -1036,6 +1148,13 @@ }, "file-export-inline-documentation": { "api-provisioning": "{{name}} 형식은 API 프로비저닝에만 유효합니다. <3>문서에서 자세히 알아보세요.</3>", + "export-inline-doc": { + "title": { + "apiprovisioning-format": "", + "fileprovisioning-format": "", + "terraformprovisioning-format": "" + } + }, "file-provisioning": "{{name}} 형식은 파일 프로비저닝에만 유효합니다. <3>문서에서 자세히 알아보세요.</3>", "terraform-provisioning": "{{name}} 형식은 Terraform 프로비저닝에만 유효합니다. <3>문서에서 자세히 알아보세요.</3>" }, @@ -1043,6 +1162,20 @@ "copy-code": "코드 복사", "download": "다운로드" }, + "filter-options": { + "label": { + "alert-rule": "경고 규칙", + "all": "전체", + "error": "오류", + "firing": "", + "no-data": "데이터 없음", + "normal": "정상", + "ok": "확인", + "pending": "보류 중", + "recording-rule": "기록 규칙", + "recovering": "복구 중" + } + }, "filter-view-results": { "aria-label-filteredrulelist": "필터링된-규칙-목록" }, @@ -1077,7 +1210,10 @@ } }, "folder-selector": { - "description-select-folder": "규칙을 저장할 폴더를 선택하세요." + "description-select-folder": "규칙을 저장할 폴더를 선택하세요.", + "message": { + "select-a-folder": "" + } }, "folderAndGroup": { "evaluation": { @@ -1092,15 +1228,88 @@ "for-input": { "description-pending": "경고를 트리거하기 위해 임계값 조건을 충족해야 하는 기간입니다. '없음'을 선택하면 조건이 충족되는 즉시 경고가 트리거됩니다." }, + "for-validation-options": { + "message": { + "required": "" + } + }, "generate-alert-data-modal": { "add-alert-data": "경고 데이터 추가", "add-alert-data-to-payload": "페이로드에 경고 데이터 추가", + "alert-options": { + "label": { + "firing": "", + "resolved": "" + } + }, "review-alert-payload": " 페이로드에 추가할 경고 데이터 검토:", "title-add-custom-alerts": "사용자 지정 경고 추가" }, + "get-alert-suggestions": { + "documentation": { + "annotations-attached-alert": "", + "fingerprint-identify-alert": "", + "grafana-external-alertmanager": "", + "organization-alert": "", + "time-the-alert-started-firing": "" + }, + "value": { + "labels-attached-alert": "", + "status-alert-firing-resolved": "" + } + }, + "get-cloud-scenes": { + "title": { + "mimir-alertmanager": "" + } + }, + "get-global-suggestions": { + "value": { + "an-array-containing-all-alerts": "" + } + }, + "get-grafana-alertmanager-scenes": { + "title": { + "grafana-alertmanager": "" + } + }, + "get-grafana-managed-scenes": { + "title": { + "grafanamanaged-alert-rules": "Grafana 관리 경고 규칙" + } + }, + "get-mimir-managed-rules-per-group-scenes": { + "rule-group-handler": { + "label": { + "rule-group": "" + } + }, + "title": { + "mimirmanaged-alert-rules-per-rule-group": "" + } + }, + "get-mimir-managed-rules-scenes": { + "title": { + "mimirmanaged-alert-rules": "" + } + }, "get-preview-results": { "title-error": "오류" }, + "get-state-display-model": { + "text": { + "alerting": "", + "error": "", + "firing": "", + "inactive": "", + "no-data": "", + "ok": "확인", + "paused": "", + "pending": "", + "recovering": "", + "unknown": "" + } + }, "getting-stared": { "learn-more": "간단히 실습해 보려면 <2>Grafana 경고 설정을 시작하기 위한 튜토리얼</2>을 참고하세요." }, @@ -1142,6 +1351,10 @@ "label-disable-resolved-message": "해제 메시지 비활성화" }, "grafana-evaluation-behavior-step": { + "message": { + "must-be-a-positive-integer": "", + "must-enter-a-group-name": "" + }, "missing-series-resolve-placeholder": "기본값: 2", "or": "또는", "placeholder-select-an-evaluation-group": "평가 그룹을 선택하세요...", @@ -1158,6 +1371,11 @@ "body-invalid-rule-id": "페이지 URL의 규칙 UID가 유효하지 않습니다. URL을 확인한 후 다시 시도하세요.", "title-invalid-rule-id": "유효하지 않은 규칙 ID" }, + "grafana-modify-export-page": { + "text": { + "modify-export": "" + } + }, "grafana-mute-timing-exporter-preview": { "text-loading": "로딩 중...." }, @@ -1210,6 +1428,9 @@ }, "group-and-namespace-fields": { "group-picker-label-group": "그룹", + "message": { + "required": "" + }, "namespace-picker-label-namespace": "네임스페이스" }, "group-by": { @@ -1266,14 +1487,19 @@ "header": { "tooltip-remove": "'{{refId}}' 표현식 제거" }, + "history-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "성공" + } + }, "home": { "label-get-started": "시작하기", "label-insights": "인사이트", "title-alerting": "경고" }, - "import-from-dsrules": { - "description-folder-import-rules": "규칙을 가져올 폴더" - }, "import-to-gma": { "action-button": "가져오기", "additional-settings": "추가 설정", @@ -1281,8 +1507,9 @@ "confirm-modal": { "confirm": "가져오기", "loading": "로딩 중...", - "loading-body": "가져올 데이터를 준비하는 중입니다. 다소 시간이 걸릴 수 있습니다...", + "loading-body": "", "no-rules-body": "가져올 규칙이 없습니다. 다른 네임스페이스 또는 규칙 그룹을 선택하세요.", + "no-rules-body-yaml": "", "no-rules-title": "가져올 규칙 없음", "plugin-rules-warning": { "text": "일부 규칙이 플러그인에 의해 관리되고 있는 것으로 감지되었습니다. 이러한 규칙은 가져오지 않습니다.", @@ -1301,11 +1528,12 @@ "label": "그룹" }, "import-location-and-filters": "위치 및 필터 가져오기", + "import-source": "", "namespace": { "description": "기존 네임스페이스를 검색하려면 입력하세요", "label": "네임스페이스" }, - "pageTitle": "데이터 소스에서 Grafana 관리 규칙으로 경고 규칙 가져오기", + "pageTitle": "", "pause": { "label": "가져온 경고 규칙 일시 중지" }, @@ -1313,10 +1541,26 @@ "label": "가져온 기록 규칙 일시 중지" }, "recording-rules": "기록 규칙", + "source": { + "datasource": "", + "datasource-description": "", + "yaml": "", + "yaml-description": "" + }, "success": "경고 규칙을 Grafana 관리 규칙으로 가져왔습니다.", "target-folder": { + "description": "규칙을 가져올 폴더", "label": "대상 폴더" - } + }, + "yaml": { + "description": "", + "label": "", + "required-message": "", + "target-datasource": "대상 데이터 소스", + "target-datasource-description": "", + "target-datasource-required": "" + }, + "yaml-error": "" }, "insights": { "monitor-status-of-system": "시스템 상태 모니터링", @@ -1392,6 +1636,9 @@ "text-loading-existing-labels": "기존 라벨 로딩 중" }, "labels-without-suggestions": { + "message": { + "required": "" + }, "placeholder-key": "키", "placeholder-value": "값" }, @@ -1430,6 +1677,24 @@ "log-record-viewer-by-timestamp": { "aria-label-state-history-by-timestamp": "타임스탬프별 상태 이력" }, + "log-timeline-viewer": { + "label": { + "firing": "", + "mixed": "", + "no-data": "", + "normal": "정상", + "pending": "보류 중", + "recovering": "복구 중" + } + }, + "loki-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "성공" + } + }, "loki-state-history": { "clear-filters": "필터 초기화", "common-labels": "일반 라벨", @@ -1442,6 +1707,14 @@ "button": "권한 관리", "title": "권한 관리" }, + "manual-and-automatic-routing": { + "routing-options": { + "label": { + "select-contact-point": "", + "use-notification-policy": "" + } + } + }, "matcher-filter": { "filter-alerts-using-label-querying-without-braces": "중괄호 없이 라벨 쿼리를 사용하여 경고를 필터링합니다. 예:", "filter-alerts-using-label-querying-without-spaces": "공백 없이 라벨 쿼리를 사용하여 경고를 필터링합니다. 예:", @@ -1459,6 +1732,9 @@ "label-operator": "작업 수행자", "label-refine-affected-alerts": "영향을 받는 경고 수정", "label-value": "값", + "message": { + "required": "" + }, "placeholder-label": "라벨", "placeholder-value": "값", "remove": "제거", @@ -1490,6 +1766,16 @@ "aria-label": "더 보기", "button-text": "더 보기" }, + "multiple-data-source-picker": { + "get-data-source-options": { + "grouped-options": { + "label": { + "data-sources-with-configured-alert-rules": "", + "other-data-sources": "" + } + } + } + }, "mute-timing-actions-buttons": { "text-disabled": "비활성화됨", "title-delete-mute-timing": "알림 비활성화 타이밍 삭제" @@ -1553,11 +1839,26 @@ "read-more": "알림 정책에 대해 읽어보세요.", "title-notification-routing": "알림 라우팅" }, + "new-mute-timing-page": { + "text": { + "add-time-interval": "" + } + }, "new-rule-from-panel-button": { "body-no-alerting-capable-query-found": "경고 기능이 있는 데이터 소스에 대한 쿼리를 찾을 수 없으므로 이 패널에서 경고를 생성할 수 없습니다.", "new-alert-rule": "새 경고 규칙", "title-no-alerting-capable-query-found": "경고 기능이 있는 쿼리를 찾을 수 없습니다" }, + "new-silence-page": { + "page-nav": { + "subTitle": { + "configure-silences-notifications-particular-alert": "" + }, + "text": { + "silence-alert-rule": "경고 규칙 끄기" + } + } + }, "no-alert-managers-available": { "body-no-alertmanager-found": "외부 Alertmanager를 찾을 수 없으며 내장된 Grafana Alertmanager에 액세스할 수 없습니다.", "title-no-alertmanager-found": "Alertmanager를 찾을 수 없습니다" @@ -1782,6 +2083,9 @@ "expressions": "표현식", "loading-data-sources": "데이터 소스 로딩 중...", "manipulate-returned-queries-other-operations": "쿼리에서 반환된 데이터를 수학 및 기타 연산으로 조작합니다.", + "message": { + "a-valid-expression-is-required": "" + }, "no-compatible-sources": "호환되는 데이터 소스가 없는 것 같습니다", "title-deactivate-advanced-options": "고급 옵션 비활성화", "title-queries-expressions-configured": "쿼리 또는 표현식이 구성되지 않았습니다" @@ -1833,7 +2137,8 @@ }, "recording-rules": { "description-target-data-source": "기록 규칙을 저장할 Prometheus 데이터 소스", - "label-target-data-source": "대상 데이터 소스" + "label-target-data-source": "대상 데이터 소스", + "target-data-source-required": "" }, "recording-rules-name-space-and-group-step": { "description-select-namespace-group-recording": "기록 규칙에 대한 네임스페이스 및 그룹을 선택하세요.", @@ -2091,6 +2396,9 @@ "collapse-all": "모두 접기", "expand-all": "모두 펼치기" }, + "rule-list-v2": { + "import-to-gma": "" + }, "rule-modify-export": { "text-loading-the-rule": "규칙 로딩 중...", "title-cannot-exist": "규칙을 로딩할 수 없습니다. 규칙이 존재하지 않습니다", @@ -2167,6 +2475,10 @@ "label-saved-searches": "저장된 검색" }, "health": "상태", + "label": { + "hide": "숨기기", + "show": "표시" + }, "manage-alerts": "이러한 데이터 소스에서 경고 UI를 통해 '경고 관리'를 선택하면 Grafana UI와 경고 규칙이 구성된 데이터 소스에서 이러한 경고 규칙을 관리할 수 있습니다.", "placeholder-all-data-sources": "모든 데이터 소스", "plugin-rules": "플러그인 규칙", @@ -2263,6 +2575,9 @@ "label-comment": "코멘트", "label-created-by": "생성자", "label-duration": "지속 시간", + "message": { + "required": "" + }, "placeholder-whos-creating-the-silence": "알림 끄기 생성자", "save-silence": "알림 끄기 저장", "saving": "저장 중..." @@ -2301,6 +2616,12 @@ "title-alert-rule-types": "경고 규칙 유형" }, "state-history": { + "columns": { + "label": { + "state": "상태", + "time": "시간" + } + }, "filter-group": "필터 그룹", "filter-group-tooltip": "정확한 일치 또는 정규 표현식을 사용하여 각 상태 이력 그룹을 필터링합니다. 예:", "placeholder-search": "검색", @@ -2340,6 +2661,9 @@ "label-examples-documentation": "예시 문서", "label-template-group": "템플릿 그룹", "label-template-group-name": "템플릿 그룹 이름", + "message": { + "required": "" + }, "new-template-name-placeholder-give-your-template-group-a-name": "템플릿 그룹의 이름을 지정하세요", "title-error-saving-template": "템플릿 저장 중에 오류 발생", "title-templating-cheat-sheet": "템플릿 치트 시트" @@ -2362,6 +2686,11 @@ "existing-templates-selector-aria-label-choose-notification-template": "알림 템플릿 선택", "existing-templates-selector-placeholder-choose-notification-template": "알림 템플릿 선택", "loading": "로딩 중...", + "template-options": { + "label": { + "select-notification-template": "" + } + }, "tooltip-copy": "선택한 알림 템플릿을 클립보드에 복사합니다. 사용자 지정 탭에서 사용할 수 있습니다." }, "templates": { @@ -2464,10 +2793,39 @@ } }, "use-columns": { + "columns": { + "label": { + "alert-rule-targeted": "", + "alerts-silenced": "", + "health": "상태", + "matching-labels": "일치하는 라벨", + "name": "이름", + "schedule": "일정 예약", + "state": "상태", + "time-range": "시간 범위" + } + }, + "label": { + "actions": "작업", + "created": "생성됨", + "group": "그룹", + "labels": "라벨", + "next-evaluation": "다음 평가", + "state": "상태", + "summary": "요약" + }, "title-edit": "편집", "title-recreate": "재생성", "title-unsilence": "알림 끄기 해제" }, + "use-combined-labels": { + "grouped-options": { + "label": { + "from-alerts": "", + "from-system": "" + } + } + }, "use-create-dropdown-menu-actions": { "label-delete": "삭제", "label-edit": "편집", @@ -2501,6 +2859,17 @@ "title-edit-notification-policy": "알림 정책 편집" } }, + "use-page-nav": { + "page-nav": { + "text": { + "details": "세부 정보", + "history": "이력", + "instances": "인스턴스", + "query-and-conditions": "", + "versions": "버전" + } + } + }, "use-state-history-modal": { "state-history-modal": { "title-state-history": "상태 이력" @@ -2521,6 +2890,36 @@ "body": "편집기의 YAML 콘텐츠에는 경고 규칙 구성만 포함되어 있습니다. <1></1>Prometheus를 구성하려면 <4>구성 파일 콘텐츠의 나머지 부분을 제공해야 합니다.</4>" } }, + "alertlist": { + "group-by": { + "aria-label-group-by-label-keys": "", + "placeholder-group-by": "그룹화 기준" + }, + "ungrouped-mode-view": { + "active-for": "", + "aria-label-view-alert-rule": "", + "view-alert-rule": "" + }, + "unified-alert-list": { + "clear": "초기화", + "text-loading": "로딩 중..." + }, + "unified-alert-list-panel": { + "body-permission-required": "", + "title-permission-required": "" + } + }, + "annolist": { + "anno-list-panel": { + "aria-label-remove-filter": "", + "filter": "", + "loading": "로딩 중...", + "no-annotations-found": "" + }, + "annotation-list-item": { + "tooltip-created-by": "" + } + }, "annotations": { "annotation-field-mapper": { "annotation": "주석", @@ -2617,6 +3016,11 @@ "configuration-required": "구성이 필요합니다", "refer-documentation-configure-authentication": "인증 구성 방법에 대한 문서를 참고하세요" }, + "field-map": { + "label": { + "none": "없음" + } + }, "fields": { "allow-assign-grafana-admin-description": "", "allow-assign-grafana-admin-label": "", @@ -2720,7 +3124,18 @@ "use-refresh-token-description": "", "use-refresh-token-label": "", "validate-hosted-domain-description": "", - "validate-hosted-domain-label": "" + "validate-hosted-domain-label": "", + "workload-identity-token-file-description": "", + "workload-identity-token-file-label": "", + "workload-identity-token-file-required": "" + }, + "get-page-nav": { + "subTitle": { + "configure-authentication-providers": "" + }, + "text": { + "authentication": "인증" + } }, "provider-card": { "text-badge-enabled": "활성화됨", @@ -2756,6 +3171,12 @@ "auth-config-auth-config-page-unconnected": { "subtitle": "인증 설정을 관리하고 싱글 사인온을 구성하세요. 자세한 내용은 Grafana의 <2>문서</2>를 확인하세요." }, + "barchart": { + "tick-spacing-editor": { + "content-require-space-from-the-right-side": "", + "label-rtl": "" + } + }, "bookmarks-page": { "empty": { "message": "아직 북마크를 만들지 않으신 것 같습니다.", @@ -2879,11 +3300,199 @@ "text-this-repository-is-read-only": "대상에 직접 액세스할 수 있는 경우 JSON을 복사하여 붙여넣으세요." }, "canvas": { + "apieditor": { + "label-endpoint": "", + "label-header-parameters": "", + "label-method": "방법", + "label-payload": "페이로드", + "label-query-parameters": "쿼리 파라미터", + "render-test-apibutton": { + "test-api": "", + "title-test-api": "" + } + }, + "button-item": { + "label": { + "center": "", + "left": "", + "right": "" + }, + "placeholder": { + "auto": "자동" + } + }, + "button-style-editor": { + "label-variant": "변형" + }, + "canvas-context-menu": { + "close-editor": "", + "open-editor": "", + "render-menu-items": { + "add-item-menu-item": { + "label-add-item": "" + }, + "edit-element-menu-item": { + "label-edit": "편집" + }, + "label-bring-to-front": "", + "label-delete": "삭제", + "label-duplicate": "복제", + "label-send-to-back": "", + "set-background-menu-item": { + "label-set-background": "" + } + } + }, + "cloud-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "자동" + } + }, + "ellipse-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "자동" + } + }, + "inline-edit": { + "canvas-inline-editor": "", + "tooltip-close-inline-editor": "" + }, + "inline-edit-body": { + "label-add-item": "", + "please-select-an-element": "" + }, + "line-style-editor": { + "label-animate": "" + }, + "metric-value-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "자동" + } + }, "not-found-display": { "not-found": "<0>찾을 수 없음: </0><config />" }, + "pan-zoom-help": { + "ctrl-right-mouse": "", + "middle-mouse": "", + "pan-title": "", + "reset-double-click": "", + "title-pan-and-zoom-controls": "", + "zoom-scroll-wheel": "" + }, + "parallelogram-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "자동" + } + }, + "params-editor": { + "aria-label-add": "추가", + "aria-label-delete": "삭제", + "placeholder-key": "키", + "placeholder-value": "값" + }, + "placement-editor": { + "label-constraints": "", + "label-position": "", + "loading": "로딩 중..." + }, + "quick-positioning": { + "tooltip-align-bottom": "", + "tooltip-align-horizontal-centers": "", + "tooltip-align-left": "", + "tooltip-align-right": "", + "tooltip-align-top": "", + "tooltip-align-vertical-centers": "" + }, + "rectangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "자동" + } + }, "text-display": { "double-click-to-set": "두 번 클릭하여 텍스트 설정" + }, + "text-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "자동" + } + }, + "tree-navigation-editor": { + "clear-selection": "선택 초기화", + "frame-selection": "", + "label-add-item": "", + "missing-layer": "", + "no-settings": "", + "switcher-icon": { + "title-node-icon": "" + } + }, + "tree-node-title": { + "title-duplicate": "복제", + "title-remove": "제거", + "tooltip-duplicate": "복제", + "tooltip-remove": "제거" + }, + "triangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "자동" + } } }, "carousel": { @@ -2963,6 +3572,22 @@ } }, "connections": { + "add-new-connection": { + "filter-by-options": { + "label": { + "all": "전체", + "installed": "설치됨", + "new-updates": "" + } + }, + "label": { + "by-downloads": "", + "by-name-az": "", + "by-name-za": "", + "by-published-date": "", + "by-updated-date": "" + } + }, "advisor-redirect-notice": { "aria-label-link-to-advisor": "어드바이저 링크", "body": "새로운 어드바이저를 사용하여 데이터 소스와 플러그인의 잠재적인 문제를 파악하세요.", @@ -2979,6 +3604,22 @@ "body": "데이터 소스를 위한 새로운 홈이 생겼습니다! 메인 메뉴에서 액세스할 수 있는 연결 페이지에서 새 데이터 소스를 검색하거나 기존 데이터 소스를 관리할 수 있습니다.", "go-to-connections": "연결 페이지로 이동" }, + "data-source-details-page": { + "subTitle": { + "datasource-could-found": "" + }, + "text": { + "unknown-datasource": "" + } + }, + "new-data-source-page": { + "subTitle": { + "choose-a-data-source-type": "" + }, + "text": { + "add-data-source": "데이터 소스 추가" + } + }, "no-access-modal": { "connection-contact-grafana-admin": "새 연결을 추가하려면 Grafana 관리자에게 문의하세요.", "editor-warning": "편집자가 새 연결을 추가할 수 없습니다. <2>데이터 소스</2>에서 이미 구성되어 있는지 확인해 보세요.", @@ -2991,6 +3632,18 @@ "search": { "aria-label-search-all": "모두 검색", "placeholder": "모두 검색" + }, + "use-data-source-settings-nav": { + "node": { + "subTitle": { + "data-source-error": "" + } + }, + "page-nav": { + "text": { + "data-source-nav-node": "" + } + } } }, "core": { @@ -3286,6 +3939,11 @@ "title-plugin-dashboard": "플러그인 대시보드" }, "dash-nav": { + "on-open-snapshot-original": { + "title": { + "proceed-to-external-site": "" + } + }, "render-left-actions": { "text-public": "공개", "tooltip-view-as-scene": "씬으로 보기" @@ -3297,11 +3955,26 @@ "dashboard-loading": { "cancel-loading-dashboard": "대시보드 로딩 취소" }, + "dashboard-page-error": { + "text": { + "not-found": "찾을 수 없음" + } + }, "dashboard-settings": { "actions": { "close": "닫기" } }, + "dashboard-slice": { + "title": { + "dashboard-init-failed": "" + } + }, + "dashboard-srv": { + "message": { + "edit-dashboard-json": "" + } + }, "dashboard-validation": { "body-dashboard-failed-schema-validation": "검증은 개발 목적으로 제공되며 무시해도 괜찮습니다. 사용자 님이 Grafana 개발자인 경우 대시보드 스키마를 확인하고 업데이트하는 것이 좋습니다", "title-checking-dashboard-validity": "대시보드 유효성 확인", @@ -3397,6 +4070,13 @@ "values": "쉼표로 구분된 값", "values-placeholder": "1, 10, mykey : myvalue, myvalue, escaped, value" }, + "datasource-options": { + "name-filter": "", + "name-filter-description": "", + "name-filter-placeholder": "", + "type": "유형", + "type-placeholder": "" + }, "description": "설명", "description-placeholder": "설명 텍스트", "label": "라벨", @@ -3415,8 +4095,8 @@ "category": "선택 옵션", "custom-all-value": "모든 값 사용자 지정", "custom-all-value-description": "전체를 나타내기 위한 와일드카드 정규 표현식 또는 기타 값", - "include-all": "모든 옵션 포함", - "include-all-description": "모든 값을 포함하는 옵션 활성화", + "include-all": "", + "include-all-description": "", "multi-value": "다중-값" }, "type-category": "{{type}} 옵션" @@ -3442,14 +4122,97 @@ "errors": { "failed-to-load": "대시보드 로딩에 실패했습니다." }, + "fetch-dashboard": { + "message": { + "failed-to-fetch-dashboard": "" + } + }, "gen-aihistory": { "aria-label-send-custom-feedback": "사용자 지정 피드백 전송", "footer-text": "이 콘텐츠는 <2>Grafana LLM 플러그인</2>을 사용하여 AI로 생성되었습니다.", "placeholder-tell-ai-what-to-do-next": "AI에게 다음 단계를 알려주세요..." }, + "general-settings-unconnected": { + "editable-options": { + "label": { + "editable": "편집 가능", + "readonly": "" + } + } + }, + "get-debug-dashboard": { + "title": { + "annotations": "주석" + } + }, + "get-errors": { + "message": { + "error-loading-data": "" + } + }, "get-field-override-categories": { "label-add-field-override": "필드 재정의 추가", - "label-add-override-property": "재정의 속성 추가" + "label-add-override-property": "재정의 속성 추가", + "title": { + "add-button": "" + } + }, + "get-library-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "정보", + "name": "이름" + } + }, + "get-library-viz-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "정보", + "name": "이름" + } + }, + "get-panel-editor-tabs": { + "text": { + "alert": "", + "query": "쿼리", + "transform-data": "" + } + }, + "get-panel-frame-category": { + "descriptor": { + "title": { + "panel-options": "패널 옵션" + } + }, + "direction-options": { + "label": { + "horizontal": "가로", + "vertical": "세로" + } + }, + "title": { + "description": "설명", + "max-per-row": "행당 최대 반복 횟수", + "panel-links": "패널 링크", + "repeat-by-variable": "변수별로 반복", + "repeat-direction": "반복 방향", + "repeat-options": "반복 옵션", + "title": "제목", + "transparent-background": "투명 배경" + } + }, + "get-panel-menu": { + "text": { + "extensions": "" + } }, "help-wizard": { "copy-to-clipboard": "클립보드로 복사", @@ -3462,10 +4225,21 @@ "randomize-field-names-label-field-names": "필드 이름", "randomize-labels-label-labels": "라벨", "randomize-string-values-label-string-values": "문자열 값", + "tabs": { + "label": { + "data": "데이터", + "snapshot": "스냅샷" + } + }, "title-complete-git-hub-comment-clipboard": "GitHub 코멘트 전체를 클립보드에 복사", "title-get-help-with-this-panel": "이 패널에 대한 도움말 확인", "troubleshooting-docs": "문제 해결 문서" }, + "init-dashboard": { + "message": { + "failed-create-dashboard-model": "" + } + }, "inspect": { "data-tab": "데이터", "error-tab": "오류", @@ -3518,6 +4292,16 @@ "rows": "총 행 수", "table-title": "통계" }, + "k8s-dashboard-api": { + "title": { + "deleted": "" + } + }, + "k8s-dashboard-v2api": { + "title": { + "deleted": "" + } + }, "layout": { "common": { "copy": "복사", @@ -3530,6 +4314,13 @@ "panel-layout-disabled": "패널 레이아웃 옵션을 변경하려면 행 또는 탭을 선택하세요" } }, + "legacy-dashboard-api": { + "fetch-error": { + "message": { + "dashboard-not-found": "" + } + } + }, "make-editable": { "dashboard-not-editable": "대시보드를 편집할 수 없습니다", "make-editable": "편집 가능하게 설정" @@ -3549,6 +4340,20 @@ "menu-use-library-panel": "라이브러리 패널 사용" }, "new-panel-title": "새 패널", + "on-create-new-row": { + "new-row": { + "title": { + "row-title": "" + } + } + }, + "on-create-new-widget-panel": { + "new-panel": { + "title": { + "widget-title": "" + } + } + }, "options": { "description": "설명", "title-option": "제목" @@ -3607,6 +4412,30 @@ "paused": "이 대시보드는 관리자가 일시 중지했습니다", "try-again-later": "나중에 다시 시도하세요" }, + "remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, + "repeat-row-select": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, + "repeat-row-select2": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, "revert-dashboard-modal": { "body-restore-version": "정말 대시보드를 {{version}} 버전으로 복원하시겠어요? 저장하지 않은 변경 사항은 모두 손실됩니다.", "title-restore-version": "버전 복구" @@ -3720,6 +4549,18 @@ "sub-menu-un-connected": { "aria-label-template-variables": "템플릿 변수" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "tabs-layout": { "delete-tab-text": "이 탭을 삭제하면 패널도 모두 삭제됩니다. 정말 계속하시겠어요?", "delete-tab-title": "탭을 삭제하시겠어요?", @@ -3925,7 +4766,10 @@ }, "unthemed-dashboard-row": { "aria-label-delete-row": "행 삭제", - "learn-more": "자세히 알아보기" + "learn-more": "자세히 알아보기", + "title": { + "delete-row": "행 삭제" + } }, "validation": { "invalid-dashboard-id": "유효한 Grafana.com ID를 찾지 못했습니다.", @@ -3960,6 +4804,16 @@ }, "visualization-select-pane": { "placeholder-search-for": "검색…", + "radio-options": { + "description": { + "reusable-panels-share-between-multiple-dashboards": "" + }, + "label": { + "library-panels": "라이브러리 패널", + "suggestions": "", + "visualizations": "" + } + }, "title-close": "닫기" }, "viz-panel": { @@ -4010,12 +4864,25 @@ "label-data-source": "데이터 소스", "label-use-static-key-dimensions": "고정 키 차원 사용" }, + "add-to-dashboard": { + "message": { + "could-navigate-selected-dashboard-please-again": "", + "could-panel-dashboard-please-again": "" + } + }, "add-to-dashboard-form": { "cancel": "취소", "description-choose-where-to-add-the-panel": "패널을 추가할 위치를 선택합니다.", "description-select-which-dashboard-panel-created": "패널을 생성할 대시보드를 선택하세요.", + "label": { + "existing-dashboard": "기존 대시보드", + "new-dashboard": "새 대시보드" + }, "label-dashboard": "대시보드", "label-target-dashboard": "대상 대시보드", + "message": { + "this-field-is-required": "이 필드는 필수 입력 항목입니다." + }, "open-dashboard": "대시보드 열기", "open-in-new-tab": "새 탭에서 열기", "title-error-adding-the-panel": "패널 추가 중 오류 발생" @@ -4053,6 +4920,25 @@ "it-cannot-contain-or": "'//' 또는 '..'을 포함할 수 없습니다.", "least-valid-character": "하나 이상의 유효한 문자가 있어야 합니다." }, + "build-new-dashboard-save-model": { + "data": { + "title": { + "new-dashboard": "새 대시보드" + } + } + }, + "build-new-dashboard-save-model-v2": { + "data": { + "title": { + "new-dashboard": "새 대시보드" + } + } + }, + "config-public-dashboard": { + "title": { + "revoke-public-url": "공개 URL 철회" + } + }, "constant-variable-form": { "constant-options": "상수 옵션", "label-value": "값", @@ -4100,22 +4986,89 @@ "value-not-saved": "값이 아직 Grafana 데이터베이스에 저장되지 않았습니다.", "view-pull-request-in-git-hub": "GitHub에서 풀 요청 보기" }, + "dashboard-scene": { + "text": { + "edit-panel": "", + "view-panel": "패널 보기" + }, + "title": { + "dashboard": "대시보드", + "discard-changes-to-dashboard": "" + } + }, + "dashboard-scene-page-state-manager": { + "message": { + "dashboard-not-found": "" + } + }, + "dashboard-scene-page-state-manager-v2": { + "message": { + "dashboard-not-found": "" + } + }, "data-source-variable-form": { "data-source-options": "데이터 소스 옵션", "description-instance-name-filter": "변수 값 목록에서 어떤 데이터 소스 인스턴스를 선택할지에 대한 정규 표현식 필터입니다. 모두 비워 둡니다.", "example-instance-name-filter": "예시: <codeExample />", "selection-options": "선택 옵션" }, + "default-grid-layout-manager": { + "row": { + "title": { + "row-title": "" + } + } + }, "description-label": { "description": "설명" }, + "edit-link-view": { + "edit-link-page-nav": { + "text": { + "edit-link": "링크 편집" + } + } + }, "email-list": { "aria-label-emailmenu": "이메일 메뉴 토글" }, + "embedded-dashboard-test-page": { + "subTitle": { + "showing-dashboard-panel-tests-pie-chart": "" + }, + "text": { + "embedding-dashboard": "" + } + }, "empty-transformations-message": { "add-transformation": "변환 추가" }, + "get-edit-options": { + "title": { + "column-options": "", + "row-height-options": "" + } + }, + "get-panel-frame-options": { + "descriptor": { + "title": { + "panel-options": "패널 옵션" + } + }, + "title": { + "description": "설명", + "panel-links": "패널 링크", + "title": "제목", + "transparent-background": "투명 배경" + } + }, + "get-workflow-options": { + "label": { + "push-to-a-new-branch": "" + } + }, "group-by-variable-form": { + "alert-not-supported": "", "description-enables-users-custom-values": "사용자가 목록에 사용자 지정 값을 추가할 수 있습니다", "description-provide-dimensions-as-csv-dimension-name-dimension-id": "차원에 대한 다음 정보를 CSV로 제공: {{name}}, {{value}}", "group-by-options": "옵션을 기준으로 그룹화", @@ -4134,6 +5087,12 @@ "randomize-field-names-label-field-names": "필드 이름", "randomize-labels-label-labels": "라벨", "randomize-string-values-label-string-values": "문자열 값", + "tabs": { + "label": { + "data": "데이터", + "snapshot": "스냅샷" + } + }, "title-complete-git-hub-comment-clipboard": "GitHub 코멘트 전체를 클립보드에 복사", "title-get-help-with-this-panel": "이 패널에 대한 도움말 확인", "troubleshooting-docs": "문제 해결 문서", @@ -4175,6 +5134,14 @@ "body-name-already-exists": "선택한 폴더에 동일한 이름의 대시보드가 이미 존재합니다. 그래도 이 대시보드를 저장하시겠어요?", "title-name-already-exists": "이미 존재하는 이름입니다" }, + "on-remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, "panel-data-alerting-tab-rendered": { "alert": { "title-errors-loading-rules": "규칙 로딩 중 오류 발생" @@ -4196,6 +5163,11 @@ "table-view-aria-label-toggletableview": "표 보기 토글", "table-view-label-table-view": "테이블 보기" }, + "panel-editor": { + "text": { + "edit-panel": "" + } + }, "panel-editor-renderer": { "aria-label-open-options-pane": "옵션 창 열기", "tooltip-open-options-pane": "옵션 창 열기" @@ -4204,8 +5176,22 @@ "body-panel-plugin-not-loaded": "검사하려는 패널이 표시되고 있고 검사를 열기 전에 표시된 상태였는지 확인하세요.", "title-panel-plugin-not-loaded": "패널 플러그인이 로드되지 않음" }, + "panel-menu-behavior": { + "async-func": { + "text": { + "extensions": "", + "metrics-drilldown": "" + } + } + }, "panel-viz-type-picker": { "placeholder-search-for": "검색…", + "radio-options": { + "label": { + "suggestions": "", + "visualizations": "" + } + }, "title-close": "닫기" }, "provisioned-delete-modal": { @@ -4232,6 +5218,15 @@ "query-options": "쿼리 옵션", "selection-options": "선택 옵션" }, + "resource-export": { + "label": { + "classic": "", + "json": "JSON", + "v1-resource": "", + "v2-resource": "", + "yaml": "" + } + }, "revert-dashboard-modal": { "body-restore-version": "정말 대시보드를 {{version}} 버전으로 복원하시겠어요? 저장하지 않은 변경 사항은 모두 손실됩니다.", "title-restore-version": "버전 복구" @@ -4339,6 +5334,18 @@ "solo-panel-page": { "loading": "로딩 중" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "text-box-variable-form": { "placeholder-default-value-if-any": "(선택 사항)", "text-options": "텍스트 옵션" @@ -4349,6 +5356,13 @@ "title-field-label": { "title": "제목" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "transformations-drawer": { "search-box-suffix": { "tooltip-clear-search": "검색 초기화" @@ -4364,6 +5378,13 @@ "save-dashboard": "대시보드 저장", "title-unsaved-changes": "저장되지 않은 변경 사항" }, + "use-dashboard-edit-page-nav": { + "page-nav": { + "text": { + "settings": "설정" + } + } + }, "variable-check-indicator": { "aria-label-variable-referenced-dashboard": "이 변수는 어떤 변수나 대시보드에서도 참조되지 않습니다.", "aria-label-variable-referenced-other-variables-dashboard": "이 변수는 다른 변수 또는 대시보드에서 참조됩니다.", @@ -4380,7 +5401,10 @@ "placeholder-descriptive-text": "설명 텍스트", "placeholder-label-name": "라벨 이름", "placeholder-variable-name": "변수 이름", - "text-running-query": "쿼리 실행 중..." + "text-running-query": "쿼리 실행 중...", + "title": { + "delete-variable": "변수 삭제" + } }, "variable-editor-list": { "definition": "정의", @@ -4562,6 +5586,25 @@ "message": "데이터 소스를 찾을 수 없습니다." } }, + "datagrid": { + "add-column": { + "placeholder-column-name": "" + }, + "datagrid-context-menu": { + "render-context-menu-items": { + "label-clear-column": "", + "label-clear-row": "", + "label-remove-all-data": "", + "label-search": "검색..." + }, + "render-header-menu-items": { + "label-clear-column": "", + "label-delete-column": "", + "label-rename-column": "", + "label-set-field-type": "" + } + } + }, "datasources": { "add-new-data-source-button": { "tooltip-no-permission": "새 데이터 소스를 구성할 권한이 없습니다" @@ -4583,6 +5626,46 @@ "label-default": "기본값", "label-name": "이름" }, + "build-categories": { + "categories": { + "title": { + "cloud": "", + "distributed-tracing": "", + "enterprise-plugins": "기업용 플러그인", + "industrial-io-t": "", + "logging-document-databases": "", + "others": "", + "profiling": "", + "sql": "", + "time-series-databases": "" + } + } + }, + "build-nav-model": { + "analytics": { + "text": { + "insights": "인사이트" + } + }, + "caching": { + "text": { + "cache": "" + } + }, + "ds-permissions": { + "text": { + "permissions": "권한" + } + }, + "nav-model": { + "text": { + "settings": "설정" + } + }, + "text": { + "dashboards": "대시보드" + } + }, "button-row": { "delete": "삭제", "save-and-test": "저장 및 테스트", @@ -4618,6 +5701,11 @@ "data-source-read-only-message": { "title-provisioned-data-source": "프로비저닝된 데이터 소스" }, + "data-source-settings-reducer": { + "message": { + "testing-could-couple-minutes": "" + } + }, "data-source-type-card": { "aria-label-learn-more": "{{dataSourcePluginName}}에 대해 자세히 알아보세요." }, @@ -4635,13 +5723,88 @@ "footer": { "add-csv-or-spreadsheet": "CSV 또는 스프레드시트 추가" }, + "get-enterprise-phantom-plugins": { + "description": { + "adobe-analytics-datasource": "", + "app-dynamics-integration-and-data-source": "", + "atlassian-statuspage-datasource": "", + "aurora-data-source": "", + "azure-cosmos-db-datasource": "", + "azure-devops-datasource": "", + "catchpoint-datasource": "", + "cloudflare-datasource": "", + "cockroach-db-datasource": "", + "data-dog-integration-and-data-source": "", + "drone-datasource": "", + "git-lab-integration-and-datasource": "", + "honeycomb-integration-and-datasource": "", + "jira-integration-and-datasource": "", + "logic-monitor-devices-datasource": "", + "mongo-db-integration-and-data-source": "", + "netlify-datasource": "", + "new-relic-integration-and-data-source": "", + "pager-duty-datasource": "", + "salesforce-integration-and-datasource": "", + "sap-hana-integration-and-data-source": "", + "service-now-integration-and-data-source": "", + "signal-fx-integration-and-datasource": "", + "snowflake-integration-and-data-source": "", + "sumo-logic-integration-and-datasource": "", + "visualize-and-explore-dynatrace-data": "", + "visualize-and-explore-oracle-sql": "", + "visualize-and-explore-splunk-logs": "", + "wavefront-integration-and-data-source": "", + "zendesk-datasource": "" + } + }, + "get-grafana-cloud-phantom-plugin": { + "description": { + "hosted-graphite-prometheus-and-loki": "" + } + }, "new-data-source-view": { "cancel": "취소", "placeholder-filter-by-name-or-type": "이름 또는 유형으로 필터링" }, + "update-data-source": { + "error-info": { + "message": { + "an-unexpected-error-occurred": "" + } + } + }, "use-data-source-info": { "badge-text-not-supported": "지원되지 않음", - "badge-text-supported": "지원됨" + "badge-text-supported": "지원됨", + "label": { + "alerting": "경고", + "type": "유형" + } + }, + "use-delete-loaded-data-source": { + "title": { + "delete": "삭제" + } + } + }, + "debug": { + "cursor-view": { + "no-events-yet": "" + }, + "render-info-viewer": { + "data-counter": "", + "elapsed-time": "", + "field": "필드", + "last": "", + "render-counter": "", + "schema-counter": "", + "title-reset-counters": "", + "tooltip-step-back": "", + "type": "유형" + }, + "state-view": { + "current-value": "", + "label-state-name": "" } }, "dimensions": { @@ -4710,6 +5873,19 @@ "remove-value-mapping-aria-label-delete-value-mapping": "값 매핑 삭제", "remove-value-mapping-tooltip-delete": "삭제", "set-color": "색상 설정", + "special-match-options": { + "description": { + "boolean-false-values": "", + "boolean-true-values": "", + "empty-string": "", + "matches-against-number-na-n-not-a-number": "", + "matches-null-and-undefined-values": "", + "matches-null-undefined-and-na-n": "" + }, + "label": { + "empty": "비어 있음" + } + }, "tooltip-remove-color": "색상 제거", "tooltip-remove-icon": "아이콘 삭제" }, @@ -4725,6 +5901,20 @@ "display-text": "표시할 텍스트", "icon": "아이콘", "label-add-a-new-mapping": "새 매핑 추가", + "mapping-types": { + "description": { + "match-a-numerical-range-of-values": "", + "match-a-regular-expression-with-replacement": "", + "match-a-specific-text-value": "", + "match-boolean-empty-values": "" + }, + "label": { + "range": "", + "regex": "", + "special": "", + "value": "값" + } + }, "update": "업데이트" } }, @@ -4749,6 +5939,7 @@ }, "explore": { "accordian-logs": { + "events": "", "footer": "이벤트 타임스탬프는 전체 트레이스의 시작 시간을 기준으로 합니다." }, "accordian-references": { @@ -4759,6 +5950,11 @@ "basic-extensions": { "aria-label-add": "추가" }, + "build-dashboard-panel-from-explore-state": { + "title": { + "new-panel": "" + } + }, "clear": "초기화", "confirm-navigation-modal": { "cancel": "취소", @@ -4845,6 +6041,33 @@ "title-table": "표", "title-traces": "트레이스" }, + "explore-query-inspector": { + "data-tab": { + "label": { + "data": "데이터" + } + }, + "error-tab": { + "label": { + "error": "오류" + } + }, + "json-tab": { + "label": { + "json": "JSON" + } + }, + "query-tab": { + "label": { + "query": "쿼리" + } + }, + "stats-tab": { + "label": { + "stats": "통계" + } + } + }, "explore-run-query-button": { "run-button": { "aria-label-run-query-options": "쿼리 실행 옵션" @@ -4858,10 +6081,23 @@ "description-explore-disabled": "탐색을 활성화하려면 Grafana 구성에서 활성화하세요.", "title-explore-disabled": "탐색이 비활성화되었습니다" }, + "get-field-links-for-explore": { + "text": { + "data": "데이터", + "raw-value": "" + } + }, "get-matches-metadata": { "matches": "일치 항목 0개" }, "legacy-create-span-link-factory": { + "text": { + "tags": "태그" + }, + "title": { + "related-logs": "", + "session-for-this-span": "이 스팬의 세션" + }, "title-explore-metrics-for-this-span": "이 스팬에 대한 메트릭 탐색", "title-explore-split": "분할 보기에서 이에 대한 로그 탐색", "title-session-for-this-span": "이 스팬의 세션" @@ -4902,6 +6138,10 @@ }, "logs-meta-row": { "download": "다운로드", + "label": { + "deduplication-count": "", + "showing-only-selected-fields": "" + }, "show-original-line": "원래 줄 표시" }, "logs-sample-panel": { @@ -5083,6 +6323,21 @@ "run-query-button": "쿼리 실행", "switch-datasource-button": "데이터 소스 전환 및 쿼리 실행" }, + "scoped-vars-from-span": { + "text": { + "span": "" + } + }, + "scoped-vars-from-tags": { + "text": { + "tags": "태그" + } + }, + "scoped-vars-from-trace": { + "text": { + "trace": "트레이스" + } + }, "search-bar-input": { "placeholder-find": "찾기...", "suffix": { @@ -5117,9 +6372,25 @@ "tooltip-tag-key": "태그 값을 가져오는 데 사용할 태그 키입니다. 태그 키를 찾기 위해 스팬의 속성과 리소스를 검색합니다" }, "span-detail": { + "label": { + "kind": "", + "library-name": "", + "library-version": "", + "status": "상태:", + "status-message": "", + "trace-state": "" + }, "label-resource-attributes": "리소스 속성", "label-span-attributes": "스팬 속성", "label-stack-trace": "스택 트레이스", + "overview-items": { + "label": { + "child-count": "", + "duration": "", + "service": "", + "start-time": "" + } + }, "warnings": "경고" }, "span-filters": { @@ -5226,6 +6497,18 @@ "title-node-graph": "노드 그래프" }, "unthemed-logs": { + "description": { + "show-results-in-logs-visualisation": "", + "show-results-in-table-visualisation": "", + "show-results-newest-to-oldest": "", + "show-results-oldest-to-newest": "" + }, + "label": { + "logs": "로그", + "newest-first": "최신순", + "oldest-first": "오래된 순", + "table": "표" + }, "label-deduplication": "중복 제거", "label-display-results": "결과 표시", "label-prettify-json": "JSON을 보기 좋게 정리", @@ -5241,6 +6524,15 @@ }, "unthemed-virtualized-trace-view": { "title-scroll-to-top": "맨 위로 스크롤" + }, + "use-focus-span-link": { + "create-focus-span-link": { + "link": { + "title": { + "deep-link-to-this-span": "" + } + } + } } }, "export": { @@ -5326,6 +6618,15 @@ "folder-repo": { "badge-text": "프로비저닝됨" }, + "folders": { + "get-loading-nav": { + "main": { + "title": { + "loading": "로딩 중" + } + } + } + }, "forgot-password": { "back-button": "로그인으로 돌아가기", "change-password": { @@ -5355,10 +6656,102 @@ "incomplete-request-error": "죄송합니다. 요청을 완료할 수 없었습니다. 다시 시도해 주세요.", "send-custom-feedback": "전송" }, + "geomap": { + "coordinates-map-view-editor": { + "label-latitude": "", + "label-longitude": "" + }, + "debug-overlay": { + "center": "", + "zoom": "" + }, + "fit-map-view-editor": { + "all-layers-editor-fragment": { + "label-layer": "" + }, + "label-data": "데이터", + "last-only-editor-fragment": { + "label-padding": "", + "tooltip-padding-relative-percent-beyond-extent": "" + } + }, + "frame-multi-selection-editor": { + "placeholder-change-filter": "" + }, + "frame-selection-editor": { + "placeholder-change-filter": "" + }, + "geomap-panel": { + "aria-label-map": "" + }, + "geomap-style-rules-editor": { + "aria-label-add-geomap-style-rule": "" + }, + "layers-editor": { + "label-add-layer": "", + "no-layers": "" + }, + "map-view-editor": { + "label-max-zoom": "", + "label-view": "보기", + "label-zoom": "확대/축소", + "use-current-map-settings": "" + }, + "markers-legend": { + "title-symbol": "기호" + }, + "measure-overlay": { + "tooltip-show-measure-tools": "" + }, + "plugin": { + "basemap-layer-configured-server-admin": "" + }, + "style-editor": { + "label-align": "", + "label-baseline": "", + "label-color": "색상", + "label-fill-opacity": "", + "label-font-size": "", + "label-opacity": "", + "label-rotation-angle": "", + "label-size": "", + "label-symbol": "기호", + "label-symbol-horizontal-align": "", + "label-symbol-vertical-align": "", + "label-text-label": "", + "label-x-offset": "", + "label-y-offset": "" + }, + "style-rule-editor": { + "aria-label-comparison-operator": "비교 연산자", + "aria-label-comparison-value": "", + "aria-label-delete-style-rule": "", + "aria-label-feature-property": "", + "label-rule": "규칙", + "placeholder-feature-property": "", + "placeholder-numeric-value": "", + "placeholder-value": "값" + } + }, "get-enterprise": { "requires-license": "Grafana Enterprise 라이선스 필요", "title": "Enterprise" }, + "gettingstarted": { + "docs-card": { + "complete": "완료", + "learn-how": "" + }, + "getting-started": { + "aria-label-to-advanced-tutorials": "", + "aria-label-to-basic-tutorials": "", + "checking-completed-setup-steps": "", + "remove-this-panel": "" + }, + "tutorial-card": { + "complete": "완료" + } + }, "gops": { "config-card": { "text-loading-configuration": "구성 로딩 중...." @@ -5375,6 +6768,74 @@ }, "progress-status": { "your-progress": "진행 상태" + }, + "use-get-configuration-for-ui": { + "get-connect-data-source-configuration": { + "title": { + "connect-data-source": "" + } + }, + "title": { + "essentials": "필수 사항" + } + }, + "use-get-essentials-configuration": { + "essential-content": { + "description": { + "configure-grafana-alerting": "", + "create-integration-alerting-contact-point": "", + "initialize-incident-plugin-declare-manage-incidents": "", + "practice-solving-an-incident": "", + "receive-alerts-oncall-notifications-within-environment": "", + "select-chat-ops-channels-to-route-notifications": "" + }, + "label": { + "add": "추가", + "connect": "연결", + "initialize": "", + "select-integration": "", + "start-drill": "" + }, + "title": { + "add-slack-notifications-to-irm-integrations": "", + "connect-alerting-to-irm": "", + "connect-irm-to-your-slack-workspace": "", + "connect-your-messaging-workspace-to-incident": "", + "connect-your-messaging-workspace-to-on-call": "", + "create-incident-drill": "", + "detect": "탐지", + "initialize-incident-plugin": "", + "messaging-workspace-channel-on-call-integration": "", + "respond": "", + "test-your-configuration": "" + } + }, + "get-grafana-alerting-config-steps": { + "description": { + "create-alert-monitor-system": "", + "create-on-call-integration-alerting-contact-point": "", + "create-slos-to-monitor-your-service": "" + }, + "label": { + "connect": "연결", + "create": "생성", + "enable": "활성화" + }, + "steps": { + "label": { + "edit": "편집" + }, + "title": { + "update-default-contact-point": "" + } + }, + "title": { + "connect-alerting-to-on-call": "", + "create-alert-rule": "", + "create-slo": "", + "enable-slo-alerting": "" + } + } } }, "grafana": { @@ -5741,14 +7202,18 @@ "duplicate-panel": "패널 복제", "exit-edit/setting-views": "편집/설정 보기 종료", "expand-all-rows": "모든 행 펼치기", + "explore-panel": "", "go-to-dashboards": "대시보드로 이동", "go-to-explore": "탐색으로 이동", "go-to-home-dashboard": "홈 대시보드로 이동", "go-to-profile": "프로필로 이동", + "inspect-panel": "", "make-time-range-permanent": "시간 범위를 절대적/영구적으로 설정", "move-time-range-back": "과거 시간 범위로 변경", "move-time-range-forward": "미래 시간 범위로 변경", "open-search": "검색 열기", + "open-share-embed-drawer": "", + "open-share-link-drawer": "", "open-shared-modal": "패널 스냅샷 공유", "paste-time-range": "시간 범위 붙여넣기", "refresh-all-panels": "모든 패널 새로 고침", @@ -5774,6 +7239,11 @@ "support-bundle": "<1>지원 번들 섹션</1>에서 Grafana 인스턴스 및 구성된 데이터 소스에 대한 정보가 포함된 지원 번들을 검색할 수도 있습니다.", "troubleshooting-help": "문제 해결 지원을 요청하려면 이 패널의 스냅샷을 Grafana Labs 기술 지원팀에 보내세요. 스냅샷에는 쿼리 응답 데이터와 패널 설정이 포함되어야 합니다." }, + "histogram": { + "histogram-panel": { + "no-histogram-found-in-response": "" + } + }, "inspector": { "inspect-data-tab": { "loading": "로딩 중", @@ -5821,6 +7291,9 @@ "label-name": "이름", "label-password": "비밀번호", "label-username": "사용자 이름", + "message": { + "email-is-invalid": "" + }, "placeholder-name-optional": "이름(선택 사항)", "placeholder-password": "비밀번호", "placeholder-username": "사용자 이름", @@ -6077,8 +7550,26 @@ "discard-local-changes": "로컬 변경 사항 삭제", "title-dashboard-changed": "대시보드 변경됨" }, + "live-channel-editor": { + "description-grafana-live": "", + "namespace": "네임스페이스", + "path": "경로", + "placeholder-select-watchable-resource": "", + "scope": "", + "title-grafana-live": "" + }, "live-connection-warning": { "title-connection-to-server-is-lost": "서버 연결이 끊어졌습니다..." + }, + "live-panel": { + "error": "오류", + "grafana-requires-feature": "", + "panel-editor-channel": "", + "title-grafana-live": "", + "waiting-for-data": "" + }, + "live-publish": { + "publish": "" } }, "lock-icon": "잠금 아이콘", @@ -6125,6 +7616,13 @@ } }, "logs": { + "get-dataframe-fields": { + "vars": { + "text": { + "labels": "라벨" + } + } + }, "infinite-scroll": { "end-of-range": "선택한 시간 범위의 끝입니다.", "load-more": "스크롤하여 더 불러오기", @@ -6205,6 +7703,11 @@ "shortcut": "다시 활성화하려면 Alt+선택을 누르세요." } }, + "log-series-to-logs-model": { + "label": { + "total-bytes-processed": "" + } + }, "logs-controls": { "deduplication": "중복 제거", "disable-highlighting": "강조 표시 비활성화", @@ -6239,6 +7742,11 @@ "scroll-top": "맨 위로 스크롤", "start-of-range": "범위의 시작" }, + "logs-panel": { + "render-common-labels": { + "common-labels": "" + } + }, "out-of-range-message": { "end-of-the-selected-time-range": "선택한 시간 범위의 끝입니다." }, @@ -6295,6 +7803,14 @@ }, "snapshot-list-table": { "title-delete": "삭제" + }, + "unthemed-dashboard-import": { + "subTitle": { + "import-dashboard-from-file-or-grafanacom": "" + }, + "text": { + "import-dashboard": "대시보드 가져오기" + } } }, "migrate-to-cloud": { @@ -6952,8 +8468,54 @@ "close": "드로어 닫기" }, "link-title": "Grafana Labs 블로그로 이동", + "news-panel": { + "body-error-loading-rss-feed": "", + "loading": "로딩 중...", + "title-error-loading-rss-feed": "" + }, "title": "블로그 최근 글" }, + "nodeGraph": { + "arc-options-editor": { + "add-arc": "", + "title-remove-arc": "" + }, + "edge": { + "aria-label-from-to": "" + }, + "edge-header": { + "label-source-target": "" + }, + "marker": { + "100-node-count": "", + "aria-label-hidden-marker": "", + "node-count_other": "" + }, + "node": { + "aria-label-node-title": "" + }, + "node-graph": { + "aria-label-layered-layout-performance-warning": "", + "aria-label-nodes-hidden-warning": "", + "computing-layout": "", + "no-data": "데이터 없음", + "hidden-nodes_other": "", + "processed-nodes_other": "" + }, + "node-graph-panel": { + "no-data-found-in-response": "" + }, + "node-header": { + "label-subtitle": "", + "label-title": "제목" + }, + "view-controls": { + "hide-config": "", + "show-config": "", + "title-zoom-in": "", + "title-zoom-out": "" + } + }, "notifications": { "empty-state": { "description": "받은 알림이 여기에 표시됩니다.", @@ -6995,6 +8557,11 @@ "label-organization-name": "조직 이름", "placeholder-org-name": "조직 이름" }, + "org-details-page": { + "title": { + "confirm-preferences-update": "" + } + }, "org-profile": { "label-organization-name": "조직 이름", "label-organization-profile": "조직 프로필", @@ -7014,7 +8581,10 @@ "tooltip": "이제 '기본 역할 없음' 옵션을 선택하고 사용자의 필요에 맞게 권한을 추가할 수 있습니다. 자세한 내용은 <1>문서</1>를 참조하세요." }, "user-invite-page": { - "sub-title": "초대장을 보내거나 기존 Grafana 사용자를<1> {{orgName}}</1> 조직에 추가하세요." + "sub-title": "초대장을 보내거나 기존 Grafana 사용자를<1> {{orgName}}</1> 조직에 추가하세요.", + "text": { + "invite-user": "" + } } }, "org-picker": { @@ -7026,6 +8596,38 @@ } }, "panel": { + "get-calculation-value-data-links-variable-suggestions": { + "value-calc-var": { + "label": { + "calculation-name": "" + } + } + }, + "get-data-links-variable-suggestions": { + "value-time-var": { + "label": { + "time": "시간" + } + } + }, + "get-field-links-supplier": { + "text": { + "data": "데이터", + "field": "필드", + "series": "", + "value": "값" + } + }, + "get-field-vars": { + "label": { + "name": "이름" + } + }, + "get-panel-links-variable-suggestions": { + "label": { + "all-variables": "" + } + }, "header-menu": { "copy": "복사", "create-library-panel": "라이브러리 패널 생성", @@ -7086,6 +8688,13 @@ "select-placeholder": "유형을 기준으로 필터링" }, "playlist": { + "playlist-new-page": { + "page-nav": { + "text": { + "new-playlist": "새 플레이리스트" + } + } + }, "playlist-table-rows": { "aria-label-playlist-item": "플레이리스트 항목, {{itemType}}, {{itemValue}}", "multiple-dashboards-found": "여러 항목 찾음: {{items}}", @@ -7102,6 +8711,12 @@ "label-mode": "모드", "label-time-and-refresh": "시간 및 새로 고침", "label-variables": "변수", + "modes": { + "label": { + "kiosk": "키오스크", + "normal": "정상" + } + }, "title-start-playlist": "플레이리스트 시작" } }, @@ -7168,6 +8783,19 @@ }, "browse": { "aria-label-plugin-type-filter": "플러그인 유형 필터", + "filter-by-options": { + "label": { + "all": "전체", + "installed": "설치됨", + "new-updates": "" + } + }, + "label": { + "all": "전체", + "applications": "", + "data-sources": "데이터 소스", + "panels": "패널" + }, "label-search": "검색", "label-state": "상태", "label-type": "유형", @@ -7249,12 +8877,24 @@ "empty-state": { "message": "찾은 플러그인 없음" }, + "extensions-log-data-source": { + "message": { + "ok": "확인" + } + }, "filter": { "disabled": "Grafana 서버가 grafana.com에 액세스할 수 없으므로 이 필터가 비활성화되었습니다.", "sort": "정렬", "sort-list": "플러그인 목록 정렬", "state": "상태" }, + "get-feature-state-info": { + "text": { + "alpha": "", + "beta": "베타", + "deprecated": "사용 중단됨" + } + }, "get-started-with-app": { "disable": "비활성화", "enable": "활성화" @@ -7311,6 +8951,16 @@ "plugin-details-header-dependencies": { "grafana-dependency": "Grafana {{grafanaDependency}}" }, + "plugin-details-page": { + "not-found-model": { + "subTitle": { + "requested-belong-plugin": "" + }, + "text": { + "unknown-plugin": "" + } + } + }, "plugin-details-signature": { "body-invalid-plugin-signature": "Grafana Labs는 각각의 플러그인에 유효한 디지털 서명이 있는지 확인합니다. 플러그인 서명 인증은 플러그인이 안전하고 신뢰할 수 있는지 확인하기 위한 보안 조치의 일부입니다. Grafana Labs는 서명되지 않은 이 플러그인의 무결성을 보장할 수 없습니다. 플러그인 작성자에게 서명을 요청해 달라고 하세요.", "read-more-about-plugins-signing": "플러그인 서명에 대해 자세히 알아보세요.", @@ -7356,6 +9006,13 @@ "search-field": { "placeholder-search-grafana-plugins": "Grafana 플러그인 검색" }, + "use-plugin-details-tabs": { + "nav-model-children": { + "text": { + "dashboards": "대시보드" + } + } + }, "version-install-button": { "text-installed": "설치됨" }, @@ -7472,6 +9129,11 @@ "label-git-hub-features": "GitHub 기능", "label-realtime-feedback": "실시간 피드백" }, + "connect-page": { + "subTitle": { + "connect-external-storage-manage-resources": "" + } + }, "connect-repository-button": { "configure": "구성", "configure-file": "파일 프로비저닝 구성", @@ -7505,7 +9167,13 @@ }, "edit-repository-page": { "back-to-repositories": "리포지토리로 돌아가기", - "repository-config-exists-configuration": "리포지토리 구성이 구성 파일에 있는지 확인하세요." + "repository-config-exists-configuration": "리포지토리 구성이 구성 파일에 있는지 확인하세요.", + "subTitle": { + "configure-repository-storing-resources": "" + }, + "text": { + "configure-repository": "" + } }, "empty-state": { "no-jobs": "작업 없음..." @@ -7568,6 +9236,11 @@ "no-results-matching-your-query": "쿼리와 일치하는 결과가 없습니다", "placeholder-search": "검색" }, + "get-default-values": { + "title": { + "repository": "리포지토리" + } + }, "getting-started": { "alert-temporary-outage": "전체 인스턴스를 연결하면 마이그레이션를 실행하는 동안 대시보드를 사용할 수 없습니다. 프로세스를 시작하기 전에 사용자에게 경고하는 것이 좋습니다.", "modal-description-public-access": "Grafana 인스턴스에 대한 공개 액세스를 설정하여 GitHub 통합을 활성화합니다", @@ -7712,7 +9385,18 @@ "dashboard-preview": "대시보드 미리 보기", "existing-dashboard": "기존 대시보드", "history": "이력", + "message": { + "removed-from-repo-test-ui": "", + "updated-from-repo-test-ui": "" + }, "repository": "리포지토리", + "tab-info": { + "label": { + "dry-run-result-after-apply": "", + "existing-from-grafana": "", + "file-from-repository": "" + } + }, "title-error-saving-file": "파일 저장 중 오류 발생" }, "setup-modal": { @@ -8121,14 +9805,6 @@ "reload-button": "다시 로딩", "title": "애플리케이션 파일을 찾을 수 없음" }, - "sandbox": { - "test-stuff-page": { - "application-notifications-toasts-testing": "애플리케이션 알림(토스트) 테스트 중", - "error": "오류", - "success": "성공", - "warning": "경고" - } - }, "save-dashboards": { "message-length": { "info": "메시지의 글자 수({{messageLength}}자)가 최대 제한(500자)를 초과합니다. 글자 수를 줄인 후에 저장하세요.", @@ -8188,6 +9864,14 @@ "view-as-folders": "폴더별로 보기", "view-as-list": "리스트로 보기" }, + "bluge-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } + }, "dashboard-actions": { "import": "가져오기", "new": "신규", @@ -8215,6 +9899,14 @@ "search-results-table": { "aria-label-search-results-table": "검색 결과 표", "no-data": "값 없음" + }, + "unified-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } } }, "select": { @@ -8286,6 +9978,11 @@ "delete-service-account": "서비스 계정 삭제", "disable-service-account": "서비스 계정 비활성화", "enable-service-account": "서비스 계정 활성화", + "page-nav": { + "subTitle": { + "manage-settings-individual-service-account": "" + } + }, "title-delete-service-account": "서비스 계정 삭제", "title-disable-service-account": "서비스 계정 비활성화", "tokens": "토큰", @@ -8602,6 +10299,11 @@ "sort-picker": { "select-aria-label": "정렬" }, + "status-history": { + "status-history-panel": { + "too-many-points_other": "" + } + }, "support-bundles": { "new-bundle-button": { "new-support-bundle": "새 지원 번들" @@ -8609,7 +10311,10 @@ "support-bundles-create-unconnected": { "cancel": "취소", "create": "생성", - "sub-title": "지원 번들의 구성 요소를 선택하세요. 지원 번들은 생성 후 3일 동안 사용할 수 있습니다." + "sub-title": "지원 번들의 구성 요소를 선택하세요. 지원 번들은 생성 후 3일 동안 사용할 수 있습니다.", + "text": { + "create-support-bundle": "" + } }, "support-bundles-unconnected": { "created-on": "생성일", @@ -8624,10 +10329,35 @@ "login": "로그인" }, "table": { + "auto-cell-options-editor": { + "description-wrap-text": "", + "label-wrap-text": "" + }, + "bar-gauge-cell-options-editor": { + "label-gauge-display-mode": "", + "label-value-display": "" + }, + "color-background-cell-options-editor": { + "description-apply-to-entire-row": "", + "description-wrap-text": "", + "label": { + "text-alpha": "" + }, + "label-apply-to-entire-row": "", + "label-background-display-mode": "", + "label-wrap-text": "", + "wrap-text": "" + }, "container": { "content": "하나의 표에 열을 너무 많이 표시하면 성능에 영향을 주고 데이터를 읽기 힘들어질 수 있습니다. 쿼리를 좁혀 보세요.", "show-all-series": "모든 열 표시", "show-only-series": "{{MAX_NUMBER_OF_COLUMNS}}개 열만 표시 중" + }, + "image-cell-options-editor": { + "description-alt-text": "", + "description-title-text": "", + "label-alt-text": "", + "label-title-text": "" } }, "tag-filter": { @@ -8643,6 +10373,24 @@ "select-placeholder": "팀 선택" }, "teams": { + "build-nav-model": { + "nav-model": { + "subTitle": { + "manage-members-and-settings": "" + }, + "text": { + "settings": "설정" + } + }, + "team-group-sync": { + "text": { + "external-group-sync": "외부 그룹 동기화" + } + }, + "text": { + "members": "멤버" + } + }, "create-team": { "create": "생성", "description-email": "이 항목은 선택 사항이며 주로 사용자 지정 팀 아바타를 허용하는 데 사용됩니다", @@ -8664,6 +10412,9 @@ "external-group-sync": "외부 그룹 동기화", "label-add-external-group": "외부 그룹 추가", "team-sync-upgrade": "그룹을 추가하여 Grafana Pro 체험 기간 동안 무료로 팀 동기화를 사용하세요.", + "text": { + "add-group": "그룹 추가" + }, "title-there-external-groups": "동기화할 외부 그룹이 없습니다", "tooltip-add-external-group": "LDAP 그룹 예: {{example}}" }, @@ -8765,6 +10516,42 @@ "select-search-input": "입력하여 검색(국가, 도시, 약어)" } }, + "timeseries": { + "annotation-editor2": { + "add-annotation": "주석 추가", + "cancel": "취소", + "edit-annotation": "", + "label-description": "설명", + "label-tags": "태그", + "placeholder-add-tags": "", + "save": "저장", + "saving": "저장 중" + }, + "annotation-tooltip2": { + "tooltip-delete": "삭제", + "tooltip-edit": "편집" + }, + "line-style-editor": { + "title-the-input-expects-a-segment-list": "", + "tooltip-help": "도움말" + }, + "nulls-threshold-input": { + "placeholder-never": "무기한" + }, + "outside-range-plugin": { + "data-outside-time-range": "", + "zoom-to-data": "" + }, + "timezones-editor": { + "tooltip-add-timezone": "", + "tooltip-remove-timezone": "" + } + }, + "traces": { + "traces-panel": { + "no-data-found-in-response": "" + } + }, "transformations": { "empty": { "add-transformation-body": "변환을 사용하면 시각화가 표시되기 전에 다양한 방법으로 데이터를 변경할 수 있습니다.<1></1>여기에는 데이터 병합, 필드 이름 변경, 계산, 표시용 데이터 형식 지정 등이 포함됩니다.", @@ -8801,6 +10588,10 @@ "convert-field-type-transformer-editor": { "aria-label-add-a-convert-field-type-transformer": "변환 필드 유형 변환기 추가", "aria-label-remove-convert-field-type-transformer": "변환 필드 유형 변환기 제거", + "label": { + "browser": "브라우저", + "utc": "" + }, "label-as": "다음으로", "label-date-format": "날짜 형식", "label-field": "필드", @@ -8887,11 +10678,32 @@ "tooltip-format": "<2>Moment.js 형식 문자열</2>로 지정된 필드의 출력 형식입니다.", "tooltip-timezone-manually": "날짜의 시간대를 수동으로 설정합니다" }, + "get-timezone-options": { + "label": { + "browser": "브라우저", + "utc": "" + } + }, "get-tooltips": { "description": "JSON 개체의 유효한 경로입니다.", "json-value": "JSON 값:", + "map-valid-paths": { + "description": { + "extract-fields-from-object": "", + "extract-value": "", + "extract-value-first-element": "", + "extract-value-second-element": "" + } + }, "valid-paths": "유효한 경로:" }, + "get-transformer-option-pane": { + "root": { + "title": { + "root": "" + } + } + }, "group-by-field-configuration": { "placeholder-ignored": "무시됨", "placeholder-select-stats": "통계 선택" @@ -8908,7 +10720,23 @@ "label-cell-value": "셀 값", "label-column": "열", "label-empty-value": "빈 값", - "label-row": "행" + "label-row": "행", + "special-value-options": { + "description": { + "boolean-false-value": "", + "boolean-true-value": "", + "empty-string": "", + "null-value": "", + "number-value": "" + }, + "label": { + "empty": "비어 있음", + "false": "", + "null": "", + "true": "", + "zero": "" + } + } }, "histogram-transformer-editor": { "placeholder-auto": "자동", @@ -8971,10 +10799,22 @@ "tooltip-naming": "선택한 필드의 이름을 표시하는 방법을 설정합니다. 표 형식 데이터에는 프레임 이름을 사용하는 것이 일반적으로 더 좋습니다" }, "partition-by-values-editor": { + "keep-fields-options": { + "label": { + "no": "아니요", + "yes": "네" + } + }, "label-field": "필드", "label-keep-fields": "필드 유지", "label-naming": "이름 지정", "label-select-field": "필드 선택", + "naming-modes-options": { + "label": { + "as-frame-name": "", + "as-label": "" + } + }, "partition-values-works-single-frame": "값을 기준으로 분할하는 것은 단일 프레임에서만 가능합니다.", "tooltip-keeps-partition-fields-frames": "프레임의 분할 필드 유지" }, @@ -8996,6 +10836,16 @@ "label-include-time": "시간 포함", "label-labels-to-fields": "라벨을 필드로", "label-mode": "모드", + "modes": { + "description": { + "collapse-field-single-value": "", + "create-table-series-value": "" + }, + "label": { + "reduce-fields": "", + "series-to-rows": "" + } + }, "placeholder-choose-stat": "통계 선택" }, "regex-matcher-editor": { @@ -9003,11 +10853,23 @@ "variable-regex-documentation": "" }, "regression-transformer-editor": { + "label": { + "cubic": "", + "quadratic": "", + "quartic": "", + "quintic": "" + }, "label-degree": "차수", "label-model-type": "모델 유형", "label-predicted-points": "예측 포인트", "label-x-field": "X 필드", "label-y-field": "Y 필드", + "model-type-options": { + "label": { + "linear": "", + "polynomial": "" + } + }, "tooltip-number-of-xy-points-to-predict": "예측할 X, Y 포인트 수" }, "rename-by-regex-transformer-editor": { @@ -9025,6 +10887,23 @@ "label-reverse": "되돌리기", "placeholder-select-field": "필드 선택" }, + "supplier": { + "description": { + "apply-spatial-operations-to-the-geometry": "", + "create-a-line-between-two-points": "", + "geometry-define-field-headingdistancearea": "" + }, + "label": { + "area": "", + "as-line": "", + "calculate-value": "", + "distance": "", + "heading": "", + "line-builder": "", + "prepare-spatial-field": "", + "transform": "" + } + }, "time-series-table-transform-editor": { "label-stat": "통계", "label-time-field": "시간 필드", @@ -9058,7 +10937,19 @@ "placeholder-auto": "자동", "placeholder-field": "필드", "tooltip-window-size": "창 크기", - "tooltip-window-size-percent": "전체 데이터의 백분율로 창 크기 설정" + "tooltip-window-size-percent": "전체 데이터의 백분율로 창 크기 설정", + "type-options": { + "label": { + "centered": "", + "trailing": "" + } + }, + "window-size-mode-options": { + "label": { + "fixed": "", + "percentage": "" + } + } } }, "upgrade-box": { @@ -9115,6 +11006,11 @@ }, "users-action-bar-unconnected": { "invite": "초대", + "options": { + "label": { + "users": "사용자" + } + }, "placeholder-search-login-email": "로그인, 이메일 또는 이름으로 사용자를 검색합니다" } }, @@ -9158,6 +11054,32 @@ "confirm-delete-modal": { "title-delete-variable": "변수 삭제" }, + "create-ad-hoc-variable-adapter": { + "description": { + "add-keyvalue-filters-on-the-fly": "" + } + }, + "create-custom-variable-adapter": { + "description": { + "define-variable-values-manually": "" + } + }, + "create-interval-variable-adapter": { + "description": { + "define-timespan-interval": "" + } + }, + "create-query-variable-adapter": { + "description": { + "variable-values-fetched-datasource-query": "" + } + }, + "data-source-variable-slice": { + "text": { + "default": "", + "no-data-sources-found": "데이터 소스를 찾을 수 없습니다." + } + }, "empty-state": { "button-title": "변수 추가", "info-box-content": "변수를 사용하면 보다 인터랙티브하고 다이내믹한 대시보드를 사용할 수 있습니다. 메트릭 쿼리에서 서버 또는 센서 이름과 같은 항목을 하드 코딩하지 않고 대신 변수를 사용할 수 있습니다. 변수는 대시보드 상단의 목록 상자로 표시됩니다. 이 드롭다운 목록을 사용하면 대시보드에 표시되는 데이터를 쉽게 변경할 수 있습니다.", @@ -9184,6 +11106,13 @@ "placeholder-default-value-if-any": "기본값(있는 경우)", "text-options": "텍스트 옵션" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "unknown-table": { "loading": "로딩 중...", "no-unknowns": "이름이 변경되었거나 누락된 변수가 없습니다.", @@ -9240,5 +11169,25 @@ "data-hover-view": { "link": "링크" } + }, + "welcome": { + "welcome-banner": { + "need-help": "도움이 필요하세요?", + "welcome-to-grafana": "" + } + }, + "xychart": { + "series-editor": { + "add-series": "", + "aria-label-select-series": "", + "label-color-field": "", + "label-frame": "프레임", + "label-size-field": "", + "label-x-field": "X 필드", + "label-y-field": "Y 필드", + "placeholder-all-frames": "", + "placeholder-select-frame": "", + "tooltip-delete-series": "" + } } } \ No newline at end of file diff --git a/public/locales/nl-NL/grafana.json b/public/locales/nl-NL/grafana.json index 94fe64e885e..580d518a25b 100644 --- a/public/locales/nl-NL/grafana.json +++ b/public/locales/nl-NL/grafana.json @@ -72,6 +72,11 @@ }, "admin-edit-org-page": { "label-name": "Naam", + "page-nav": { + "subTitle": { + "manage-settings-roles-organization": "" + } + }, "render-missing-permission-message": { "title-access-denied": "Toegang geweigerd" } @@ -233,6 +238,13 @@ "upgrade-info": { "title": "Enterprise-licentie" }, + "user-admin-page": { + "page-nav": { + "subTitle": { + "manage-settings-for-an-individual-user": "" + } + } + }, "user-create-page": { "label-email": "E-mailadres", "label-name": "Naam", @@ -243,9 +255,16 @@ "label-ldap": "LDAP" }, "user-list-admin-page-un-connected": { + "label": { + "active-last-days": "", + "all-users": "Alle gebruikers" + }, "placeholder-search-login-email": "Gebruiker zoeken op login, e-mailadres of naam." }, "user-list-anonymous-devices-page-un-connected": { + "label": { + "active-last-days": "" + }, "placeholder-search-devices-by-ip-address": "Apparaten zoeken op IP-adres." }, "user-list-page": { @@ -364,6 +383,12 @@ "no-grouping": "Niet gegroepeerd" }, "alert-group-alerts-table": { + "columns": { + "label": { + "instance-labels": "", + "notification-state": "Meldingsstatus" + } + }, "duration": "gedurende {{time}}" }, "alert-group-filter": { @@ -443,6 +468,11 @@ "description-section": "Vul een naam in om je {{entityName}} te identificeren.", "label-metric": "Metrisch", "label-name": "Naam", + "message": { + "must-enter-a-metric-name": "", + "must-enter-a-name": "", + "please-select-a-data-source": "Selecteer een gegevensbron" + }, "metric-aria-label-metric": "metrisch", "metric-placeholder-recorded-metric": "Geef de naam van de nieuw opgenomen statistiek", "placeholder-name": "Geef je {{namePlaceholder}} een naam", @@ -495,6 +525,9 @@ "alertmanager-config": { "gma-manual-configuration-description": "De interne Grafana Alertmanager-configuratie kan niet handmatig worden gewijzigd. Bewerk de individuele bronnen via de gebruikersinterface om deze configuratie te wijzigen.", "gma-manual-configuration-is-not-supported": "Handmatige configuratiewijzigingen worden niet ondersteund", + "message": { + "configuration-cannot-be-empty": "" + }, "reset": "Resetten", "reset-confirmation": "Weet je zeker dat je de configuratie voor '{{alertmanagerName}}' wilt resetten? Contactpunten en meldingsbeleid worden teruggezet naar hun standaardwaarden.", "resetting-configuration-might-while": "Configuratie wordt opnieuw ingesteld, dit kan even duren.", @@ -584,6 +617,9 @@ "create-a-contact-point": "Een contactpunt aanmaken", "label-default-contact-point": "Standaard contactpunt", "label-timing-options": "Opties voor timing", + "message": { + "required": "" + }, "or": "of" }, "am-routes-expanded-form": { @@ -605,11 +641,19 @@ "label-override-grouping": "Groepering overschrijven", "label-value": "Waarde", "matching-labels": "Overeenkomende labels", + "message": { + "required": "" + }, "placeholder-label": "label", "placeholder-value": "waarde", "remove": "Verwijderen", "tooltip-remove-matcher": "Matcher verwijderen" }, + "annotation-header-field": { + "message": { + "required": "" + } + }, "annotations": { "dashboard-annotation-field": { "dashboard": "Dashboard {{dashboardUid}}", @@ -681,6 +725,25 @@ "title": "Kan niet alle gebeurtenissen weergeven" } }, + "central-alert-history-scene": { + "scene": { + "labels-filter-variable": { + "label": { + "labels": "" + } + }, + "transitions-from-filter-variable": { + "label": { + "start-state": "" + } + }, + "transitions-to-filter-variable": { + "label": { + "end-state": "" + } + } + } + }, "channel-sub-form": { "delete": "Verwijderen", "duplicate": "Dupliceren", @@ -717,11 +780,17 @@ }, "cloud-data-source-selector": { "label": "Gegevensbron selecteren", - "label-disabled": "Gegevensbron" + "label-disabled": "Gegevensbron", + "message": { + "please-select-a-data-source": "Selecteer een gegevensbron" + } }, "cloud-evaluation-behavior": { "description-pending-period": "De periode waarin aan de drempelvoorwaarde moet worden voldaan om een waarschuwing te activeren. Als je 'Geen' selecteert, wordt de waarschuwing onmiddellijk geactiveerd zodra aan de voorwaarde is voldaan.", "label-pending-period": "Wachttijd", + "message": { + "must-be-a-positive-integer": "" + }, "title-set-evaluation-behavior": "Evaluatiegedrag instellen" }, "cloud-receiver-form": { @@ -762,6 +831,9 @@ "contact-point-selector": { "aria-label-refresh-contact-points": "Contactpunten vernieuwen", "contact-point-picker-label-contact-point": "Contactpunt", + "message": { + "contact-point-is-required": "" + }, "title-failed-to-fetch-contact-points": "Kan contactpunten niet ophalen", "tooltip-refresh-contact-points-list": "Lijst met contactpunten vernieuwen" }, @@ -828,6 +900,14 @@ }, "copy-to-clipboard": "Label '{{label}}' kopiëren naar klembord", "create-metadata": { + "label": { + "dashboard": "Dashboard", + "dashboard-and-panel": "", + "evaluation-interval": "Evaluatie-interval", + "labels": "Labels", + "metric-name": "", + "runbook-url": "" + }, "view-dashboard": "Dashboard bekijken", "view-panel": "Paneel bekijken" }, @@ -868,9 +948,6 @@ "title-search-panel": "Paneel zoeken", "title-select-dashboard-and-panel": "Dashboard en paneel selecteren" }, - "data-source-section": { - "import-to-grafana": "Importeren naar Grafana-regels" - }, "datasource-not-found": { "card-description": "De gegevensbron voor deze query is niet gevonden, deze is verwijderd of is niet correct geïnstalleerd.", "remove-query": "Query verwijderen", @@ -952,6 +1029,11 @@ "text-loading-template": "Sjabloon laden...", "title-failed-to-fetch-notification-template": "Kan meldingssjabloon niet ophalen" }, + "edit-mute-timing-page": { + "text": { + "edit-time-interval": "" + } + }, "editor": { "edit-alert-rule": "", "edit-recording-rule": "", @@ -965,6 +1047,11 @@ "error-summary-button": { "content-show-all-errors": "" }, + "evaluate-every-validation-options": { + "message": { + "required": "" + } + }, "evaluation-behavior-summary": { "evaluate": "", "label-evaluate": "Evalueren", @@ -982,6 +1069,9 @@ "evaluation-group-creation-modal": { "description-group-name": "Een groep evalueert al zijn regels over hetzelfde evaluatie-interval.", "description-often-rules-group-evaluated": "Hoe vaak alle regels in de groep worden geëvalueerd.", + "message": { + "required": "" + }, "placeholder-enter-a-name": "Voer een naam in", "title-new-evaluation-group": "Nieuwe evaluatiegroep" }, @@ -1004,12 +1094,24 @@ "title-permission-editrecreate-silence": "Je hebt geen toestemming om deze stilte te bewerken/opnieuw te creëren", "title-silence-not-found": "Bestaande stilte '{{silenceId}}' niet gevonden" }, + "existing-silence-editor-page": { + "page-nav": { + "text": { + "edit-silence": "" + } + } + }, "export": { "subtitle": { "formats": "Selecteer het formaat en download het bestand of kopieer de inhoud naar het klembord", "one-format": "Download het bestand of kopieer de inhoud naar het klembord" } }, + "export-new-grafana-rule-page": { + "text": { + "export-new-grafana-rule": "" + } + }, "export-new-rule-button": { "tooltip-export-new-grafana-rule": "Nieuwe Grafana-regel exporteren" }, @@ -1035,6 +1137,16 @@ "no-data": "Geen gegevens", "page-counter": "" }, + "feature-toggle-page": { + "nav-model": { + "subTitle": { + "enable-alerting-grafana-config": "" + }, + "text": { + "alerting-is-not-enabled": "" + } + } + }, "federated-rule-warning": { "experimental": "Federatieve regelgroepen zijn momenteel een experimentele functie.", "read-documentation": "Lees documentatie", @@ -1042,6 +1154,13 @@ }, "file-export-inline-documentation": { "api-provisioning": "De indeling voor {{name}} is alleen geldig voor API-provisioning. <3>Lees meer in de documenten.</3>", + "export-inline-doc": { + "title": { + "apiprovisioning-format": "", + "fileprovisioning-format": "", + "terraformprovisioning-format": "" + } + }, "file-provisioning": "De indeling voor {{name}} is alleen geldig voor bestandsprovisioning. <3>Lees meer in de documenten.</3>", "terraform-provisioning": "De indeling voor {{name}} is alleen geldig voor Terraform Provisioning. <3>Lees meer in de documenten.</3>" }, @@ -1049,6 +1168,20 @@ "copy-code": "Kopieer code", "download": "Downloaden" }, + "filter-options": { + "label": { + "alert-rule": "Waarschuwingsregel", + "all": "Alle", + "error": "Fout", + "firing": "", + "no-data": "Geen gegevens", + "normal": "Normaal", + "ok": "OK", + "pending": "In afwachting", + "recording-rule": "Opnameregel", + "recovering": "Herstellen" + } + }, "filter-view-results": { "aria-label-filteredrulelist": "gefilterde-regels-lijst" }, @@ -1083,7 +1216,10 @@ } }, "folder-selector": { - "description-select-folder": "Selecteer een map om je regel in op te slaan." + "description-select-folder": "Selecteer een map om je regel in op te slaan.", + "message": { + "select-a-folder": "" + } }, "folderAndGroup": { "evaluation": { @@ -1098,15 +1234,88 @@ "for-input": { "description-pending": "De periode waarin aan de drempelvoorwaarde moet worden voldaan om een waarschuwing te activeren. Als je 'Geen' selecteert, wordt de waarschuwing onmiddellijk geactiveerd zodra aan de voorwaarde is voldaan." }, + "for-validation-options": { + "message": { + "required": "" + } + }, "generate-alert-data-modal": { "add-alert-data": "Waarschuwingsgegevens toevoegen", "add-alert-data-to-payload": "Waarschuwingsgegevens toevoegen aan lading", + "alert-options": { + "label": { + "firing": "", + "resolved": "" + } + }, "review-alert-payload": "Waarschuwingsgegevens beoordelen om toe te voegen aan de payload:", "title-add-custom-alerts": "Aangepaste waarschuwingen toevoegen" }, + "get-alert-suggestions": { + "documentation": { + "annotations-attached-alert": "", + "fingerprint-identify-alert": "", + "grafana-external-alertmanager": "", + "organization-alert": "", + "time-the-alert-started-firing": "" + }, + "value": { + "labels-attached-alert": "", + "status-alert-firing-resolved": "" + } + }, + "get-cloud-scenes": { + "title": { + "mimir-alertmanager": "" + } + }, + "get-global-suggestions": { + "value": { + "an-array-containing-all-alerts": "" + } + }, + "get-grafana-alertmanager-scenes": { + "title": { + "grafana-alertmanager": "" + } + }, + "get-grafana-managed-scenes": { + "title": { + "grafanamanaged-alert-rules": "Door Grafana beheerde waarschuwingsregels" + } + }, + "get-mimir-managed-rules-per-group-scenes": { + "rule-group-handler": { + "label": { + "rule-group": "" + } + }, + "title": { + "mimirmanaged-alert-rules-per-rule-group": "" + } + }, + "get-mimir-managed-rules-scenes": { + "title": { + "mimirmanaged-alert-rules": "" + } + }, "get-preview-results": { "title-error": "Fout" }, + "get-state-display-model": { + "text": { + "alerting": "", + "error": "", + "firing": "", + "inactive": "", + "no-data": "", + "ok": "OK", + "paused": "", + "pending": "", + "recovering": "", + "unknown": "" + } + }, "getting-stared": { "learn-more": "Raadpleeg onze <2>tutorial om aan de slag te gaan met Grafana Alerting</2> voor een praktische introductie" }, @@ -1148,6 +1357,10 @@ "label-disable-resolved-message": "Opgelost bericht uitschakelen" }, "grafana-evaluation-behavior-step": { + "message": { + "must-be-a-positive-integer": "", + "must-enter-a-group-name": "" + }, "missing-series-resolve-placeholder": "Standaard: 2", "or": "of", "placeholder-select-an-evaluation-group": "Selecteer een evaluatiegroep...", @@ -1164,6 +1377,11 @@ "body-invalid-rule-id": "De regel-UID in de pagina-URL is ongeldig. Controleer de URL en probeer het opnieuw.", "title-invalid-rule-id": "Ongeldige regel-id" }, + "grafana-modify-export-page": { + "text": { + "modify-export": "" + } + }, "grafana-mute-timing-exporter-preview": { "text-loading": "Laden...." }, @@ -1216,6 +1434,9 @@ }, "group-and-namespace-fields": { "group-picker-label-group": "Groep", + "message": { + "required": "" + }, "namespace-picker-label-namespace": "Namespace" }, "group-by": { @@ -1272,14 +1493,19 @@ "header": { "tooltip-remove": "Expressie '{{refId}}' verwijderen" }, + "history-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "Succes" + } + }, "home": { "label-get-started": "Aan de slag", "label-insights": "Inzichten", "title-alerting": "Alerting" }, - "import-from-dsrules": { - "description-folder-import-rules": "De map waarnaar de regels geïmporteerd worden" - }, "import-to-gma": { "action-button": "Importeren", "additional-settings": "Aanvullende instellingen", @@ -1287,8 +1513,9 @@ "confirm-modal": { "confirm": "Importeren", "loading": "Bezig met laden ...", - "loading-body": "De gegevens worden voorbereid voor import. Dit kan even duren...", + "loading-body": "", "no-rules-body": "Er zijn geen regels om te importeren. Selecteer een andere namespace of regelgroep.", + "no-rules-body-yaml": "", "no-rules-title": "Geen regels om te importeren", "plugin-rules-warning": { "text": "We hebben gedetecteerd dat sommige regels worden beheerd door plug-ins. Deze regels worden niet geïmporteerd.", @@ -1307,11 +1534,12 @@ "label": "Groep" }, "import-location-and-filters": "Locatie en filters importeren", + "import-source": "", "namespace": { "description": "Typ om naar een bestaande namespace te zoeken", "label": "Namespace" }, - "pageTitle": "Waarschuwingsregels importeren vanuit een gegevensbron naar door Grafana beheerde regels", + "pageTitle": "", "pause": { "label": "Geïmporteerde waarschuwingsregels pauzeren" }, @@ -1319,10 +1547,26 @@ "label": "Geïmporteerde opnameregels pauzeren" }, "recording-rules": "Opnameregels", + "source": { + "datasource": "", + "datasource-description": "", + "yaml": "", + "yaml-description": "" + }, "success": "Waarschuwingsregels zijn geïmporteerd naar door Grafana beheerde regels.", "target-folder": { + "description": "De map waarnaar de regels geïmporteerd worden", "label": "Doelmap" - } + }, + "yaml": { + "description": "", + "label": "", + "required-message": "", + "target-datasource": "Doelgegevensbron", + "target-datasource-description": "", + "target-datasource-required": "" + }, + "yaml-error": "" }, "insights": { "monitor-status-of-system": "De status van je systeem controleren", @@ -1398,6 +1642,9 @@ "text-loading-existing-labels": "Bestaande labels laden" }, "labels-without-suggestions": { + "message": { + "required": "" + }, "placeholder-key": "sleutel", "placeholder-value": "waarde" }, @@ -1437,6 +1684,24 @@ "log-record-viewer-by-timestamp": { "aria-label-state-history-by-timestamp": "Statusgeschiedenis per tijdstempel" }, + "log-timeline-viewer": { + "label": { + "firing": "", + "mixed": "", + "no-data": "", + "normal": "Normaal", + "pending": "In afwachting", + "recovering": "Herstellen" + } + }, + "loki-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "Succes" + } + }, "loki-state-history": { "clear-filters": "Filters wissen", "common-labels": "Gemeenschappelijke labels", @@ -1449,6 +1714,14 @@ "button": "Toestemmingen beheren", "title": "Toestemmingen beheren" }, + "manual-and-automatic-routing": { + "routing-options": { + "label": { + "select-contact-point": "", + "use-notification-policy": "" + } + } + }, "matcher-filter": { "filter-alerts-using-label-querying-without-braces": "Filter waarschuwingen met behulp van labelquery's zonder accolades, bijv.:", "filter-alerts-using-label-querying-without-spaces": "Filter waarschuwingen met behulp van labelquery's zonder spaties, bijv.:", @@ -1466,6 +1739,9 @@ "label-operator": "Operator", "label-refine-affected-alerts": "Betrokken waarschuwingen verfijnen", "label-value": "Waarde", + "message": { + "required": "" + }, "placeholder-label": "label", "placeholder-value": "waarde", "remove": "Verwijderen", @@ -1497,6 +1773,16 @@ "aria-label": "Meer", "button-text": "Meer" }, + "multiple-data-source-picker": { + "get-data-source-options": { + "grouped-options": { + "label": { + "data-sources-with-configured-alert-rules": "", + "other-data-sources": "" + } + } + } + }, "mute-timing-actions-buttons": { "text-disabled": "Uitgeschakeld", "title-delete-mute-timing": "Demptiming verwijderen" @@ -1560,11 +1846,26 @@ "read-more": "Lees meer over het meldingsbeleid.", "title-notification-routing": "Meldingsroutering" }, + "new-mute-timing-page": { + "text": { + "add-time-interval": "" + } + }, "new-rule-from-panel-button": { "body-no-alerting-capable-query-found": "Kan geen waarschuwingen maken vanuit dit paneel omdat er geen query is gevonden naar een gegevensbron die waarschuwingen mogelijk maakt.", "new-alert-rule": "Nieuwe waarschuwingsregel", "title-no-alerting-capable-query-found": "Geen query gevonden die waarschuwingen mogelijk maakt" }, + "new-silence-page": { + "page-nav": { + "subTitle": { + "configure-silences-notifications-particular-alert": "" + }, + "text": { + "silence-alert-rule": "Waarschuwingsregel dempen" + } + } + }, "no-alert-managers-available": { "body-no-alertmanager-found": "We konden geen externe waarschuwingsmanagers vinden en je hebt mogelijk geen toegang tot de ingebouwde Grafana Alertmanager.", "title-no-alertmanager-found": "Geen Alertmanager gevonden" @@ -1791,6 +2092,9 @@ "expressions": "Expressie", "loading-data-sources": "Gegevensbronnen laden...", "manipulate-returned-queries-other-operations": "Manipuleer gegevens die worden geretourneerd uit query's met wiskundige en andere bewerkingen.", + "message": { + "a-valid-expression-is-required": "" + }, "no-compatible-sources": "Je lijkt geen compatibele gegevensbronnen te hebben", "title-deactivate-advanced-options": "Geavanceerde opties deactiveren", "title-queries-expressions-configured": "Er zijn geen query's of expressies geconfigureerd" @@ -1842,7 +2146,8 @@ }, "recording-rules": { "description-target-data-source": "De Prometheus-gegevensbron om opnameregels in op te slaan", - "label-target-data-source": "Doelgegevensbron" + "label-target-data-source": "Doelgegevensbron", + "target-data-source-required": "" }, "recording-rules-name-space-and-group-step": { "description-select-namespace-group-recording": "Selecteer de namespace en groep voor je opnameregel.", @@ -2103,6 +2408,9 @@ "collapse-all": "Alles samenvouwen", "expand-all": "Alles uitvouwen" }, + "rule-list-v2": { + "import-to-gma": "" + }, "rule-modify-export": { "text-loading-the-rule": "De regel wordt geladen...", "title-cannot-exist": "Kan de regel niet laden. De regel bestaat niet", @@ -2180,6 +2488,10 @@ "label-saved-searches": "Opgeslagen zoekopdrachten" }, "health": "Gezondheid", + "label": { + "hide": "Verbergen", + "show": "Tonen" + }, "manage-alerts": "In deze gegevensbronnen kun je waarschuwingen beheren via de waarschuwingsinterface om deze waarschuwingsregels te kunnen beheren in de Grafana-gebruikersinterface en in de gegevensbron waar ze zijn geconfigureerd.", "placeholder-all-data-sources": "Alle gegevensbronnen", "plugin-rules": "Plug-inregels", @@ -2276,6 +2588,9 @@ "label-comment": "Opmerking", "label-created-by": "Aangemaakt door", "label-duration": "Duur", + "message": { + "required": "" + }, "placeholder-whos-creating-the-silence": "Wie creëert de stilte", "save-silence": "Stilte opslaan", "saving": "Aan het opslaan ..." @@ -2314,6 +2629,12 @@ "title-alert-rule-types": "Soorten waarschuwingsregels" }, "state-history": { + "columns": { + "label": { + "state": "Status", + "time": "Tijd" + } + }, "filter-group": "Groep filteren", "filter-group-tooltip": "Filter elke statusgeschiedenisgroep op exacte overeenkomst of een reguliere expressie, bijvoorbeeld:", "placeholder-search": "Zoeken", @@ -2353,6 +2674,9 @@ "label-examples-documentation": "Voorbeelden documentatie", "label-template-group": "Sjabloongroep", "label-template-group-name": "Sjabloongroepnaam", + "message": { + "required": "" + }, "new-template-name-placeholder-give-your-template-group-a-name": "Geef je sjabloongroep een naam", "title-error-saving-template": "Er is een fout opgetreden bij het opslaan van het sjabloon", "title-templating-cheat-sheet": "Cheatsheet maken met sjabloon" @@ -2375,6 +2699,11 @@ "existing-templates-selector-aria-label-choose-notification-template": "Kies een meldingssjabloon", "existing-templates-selector-placeholder-choose-notification-template": "Kies een meldingssjabloon", "loading": "Bezig met laden ...", + "template-options": { + "label": { + "select-notification-template": "" + } + }, "tooltip-copy": "Kopieer het geselecteerde meldingssjabloon naar het klembord. Je kunt het gebruiken op het aangepaste tabblad." }, "templates": { @@ -2477,10 +2806,39 @@ } }, "use-columns": { + "columns": { + "label": { + "alert-rule-targeted": "", + "alerts-silenced": "", + "health": "Gezondheid", + "matching-labels": "Overeenkomende labels", + "name": "Naam", + "schedule": "Plannen", + "state": "Status", + "time-range": "Tijdsbereik" + } + }, + "label": { + "actions": "Acties", + "created": "Gemaakt", + "group": "Groep", + "labels": "Labels", + "next-evaluation": "Volgende evaluatie", + "state": "Status", + "summary": "Samenvatting" + }, "title-edit": "Bewerken", "title-recreate": "Opnieuw aanmaken", "title-unsilence": "Dempen ongedaan maken" }, + "use-combined-labels": { + "grouped-options": { + "label": { + "from-alerts": "", + "from-system": "" + } + } + }, "use-create-dropdown-menu-actions": { "label-delete": "Verwijderen", "label-edit": "Bewerken", @@ -2514,6 +2872,17 @@ "title-edit-notification-policy": "Meldingsbeleid bewerken" } }, + "use-page-nav": { + "page-nav": { + "text": { + "details": "Details", + "history": "Geschiedenis", + "instances": "Instanties", + "query-and-conditions": "", + "versions": "Versies" + } + } + }, "use-state-history-modal": { "state-history-modal": { "title-state-history": "Statusgeschiedenis" @@ -2534,6 +2903,36 @@ "body": "De YAML-inhoud in de bewerker bevat alleen configuratie van waarschuwingsregels <1></1>Om Prometheus te configureren, moet je de rest van de <4>inhoud van het configuratiebestand opgeven.</4>" } }, + "alertlist": { + "group-by": { + "aria-label-group-by-label-keys": "", + "placeholder-group-by": "Groeperen op" + }, + "ungrouped-mode-view": { + "active-for": "", + "aria-label-view-alert-rule": "", + "view-alert-rule": "" + }, + "unified-alert-list": { + "clear": "Wissen", + "text-loading": "Laden..." + }, + "unified-alert-list-panel": { + "body-permission-required": "", + "title-permission-required": "" + } + }, + "annolist": { + "anno-list-panel": { + "aria-label-remove-filter": "", + "filter": "", + "loading": "Laden...", + "no-annotations-found": "" + }, + "annotation-list-item": { + "tooltip-created-by": "" + } + }, "annotations": { "annotation-field-mapper": { "annotation": "Opmerking", @@ -2630,6 +3029,11 @@ "configuration-required": "Configuratie is vereist", "refer-documentation-configure-authentication": "Raadpleeg de documentatie over het configureren van authenticatie" }, + "field-map": { + "label": { + "none": "Geen" + } + }, "fields": { "allow-assign-grafana-admin-description": "", "allow-assign-grafana-admin-label": "", @@ -2733,7 +3137,18 @@ "use-refresh-token-description": "", "use-refresh-token-label": "", "validate-hosted-domain-description": "", - "validate-hosted-domain-label": "" + "validate-hosted-domain-label": "", + "workload-identity-token-file-description": "", + "workload-identity-token-file-label": "", + "workload-identity-token-file-required": "" + }, + "get-page-nav": { + "subTitle": { + "configure-authentication-providers": "" + }, + "text": { + "authentication": "Autorisate" + } }, "provider-card": { "text-badge-enabled": "Ingeschakeld", @@ -2769,6 +3184,12 @@ "auth-config-auth-config-page-unconnected": { "subtitle": "Je auth-instellingen beheren en single sign-on configureren. Lees meer in onze <2>documentatie</2>." }, + "barchart": { + "tick-spacing-editor": { + "content-require-space-from-the-right-side": "", + "label-rtl": "" + } + }, "bookmarks-page": { "empty": { "message": "Het lijkt erop dat je nog geen bladwijzers hebt gemaakt", @@ -2897,11 +3318,199 @@ "text-this-repository-is-read-only": "Als je directe toegang hebt tot het doel, kopieer je de JSON en plak je deze daar." }, "canvas": { + "apieditor": { + "label-endpoint": "", + "label-header-parameters": "", + "label-method": "Methode", + "label-payload": "Laadvermogen", + "label-query-parameters": "Query-parameters", + "render-test-apibutton": { + "test-api": "", + "title-test-api": "" + } + }, + "button-item": { + "label": { + "center": "", + "left": "", + "right": "" + }, + "placeholder": { + "auto": "Automatisch" + } + }, + "button-style-editor": { + "label-variant": "Variant" + }, + "canvas-context-menu": { + "close-editor": "", + "open-editor": "", + "render-menu-items": { + "add-item-menu-item": { + "label-add-item": "" + }, + "edit-element-menu-item": { + "label-edit": "Bewerken" + }, + "label-bring-to-front": "", + "label-delete": "Verwijderen", + "label-duplicate": "Dupliceren", + "label-send-to-back": "", + "set-background-menu-item": { + "label-set-background": "" + } + } + }, + "cloud-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automatisch" + } + }, + "ellipse-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automatisch" + } + }, + "inline-edit": { + "canvas-inline-editor": "", + "tooltip-close-inline-editor": "" + }, + "inline-edit-body": { + "label-add-item": "", + "please-select-an-element": "" + }, + "line-style-editor": { + "label-animate": "" + }, + "metric-value-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automatisch" + } + }, "not-found-display": { "not-found": "<0>Niet gevonden: </0><config />" }, + "pan-zoom-help": { + "ctrl-right-mouse": "", + "middle-mouse": "", + "pan-title": "", + "reset-double-click": "", + "title-pan-and-zoom-controls": "", + "zoom-scroll-wheel": "" + }, + "parallelogram-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automatisch" + } + }, + "params-editor": { + "aria-label-add": "Toevoegen", + "aria-label-delete": "Verwijderen", + "placeholder-key": "Sleutel", + "placeholder-value": "Waarde" + }, + "placement-editor": { + "label-constraints": "", + "label-position": "", + "loading": "Laden..." + }, + "quick-positioning": { + "tooltip-align-bottom": "", + "tooltip-align-horizontal-centers": "", + "tooltip-align-left": "", + "tooltip-align-right": "", + "tooltip-align-top": "", + "tooltip-align-vertical-centers": "" + }, + "rectangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automatisch" + } + }, "text-display": { "double-click-to-set": "Dubbelklik om tekst in te stellen" + }, + "text-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automatisch" + } + }, + "tree-navigation-editor": { + "clear-selection": "Selectie wissen", + "frame-selection": "", + "label-add-item": "", + "missing-layer": "", + "no-settings": "", + "switcher-icon": { + "title-node-icon": "" + } + }, + "tree-node-title": { + "title-duplicate": "Dupliceren", + "title-remove": "Verwijderen", + "tooltip-duplicate": "Dupliceren", + "tooltip-remove": "Verwijderen" + }, + "triangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automatisch" + } } }, "carousel": { @@ -2981,6 +3590,22 @@ } }, "connections": { + "add-new-connection": { + "filter-by-options": { + "label": { + "all": "Alle", + "installed": "Geïnstalleerd", + "new-updates": "" + } + }, + "label": { + "by-downloads": "", + "by-name-az": "", + "by-name-za": "", + "by-published-date": "", + "by-updated-date": "" + } + }, "advisor-redirect-notice": { "aria-label-link-to-advisor": "Koppelen aan Advisor", "body": "Probeer de nieuwe Advisor om potentiële problemen met je gegevensbronnen en plug-ins te ontdekken.", @@ -2997,6 +3622,22 @@ "body": "De gegevensbronnen zijn verplaatst. Je kunt nieuwe gegevensbronnen ontdekken of bestaande beheren op de pagina Verbindingen, toegankelijk vanuit het hoofdmenu.", "go-to-connections": "Ga naar verbindingen" }, + "data-source-details-page": { + "subTitle": { + "datasource-could-found": "" + }, + "text": { + "unknown-datasource": "" + } + }, + "new-data-source-page": { + "subTitle": { + "choose-a-data-source-type": "" + }, + "text": { + "add-data-source": "Gegevensbron toevoegen" + } + }, "no-access-modal": { "connection-contact-grafana-admin": "Neem contact op met je Grafana-beheerder om een nieuwe verbinding toe te voegen.", "editor-warning": "Bewerkers kunnen geen nieuwe verbindingen toevoegen. Je kunt controleren of het al is geconfigureerd in <2>Gegevensbronnen</2>.", @@ -3009,6 +3650,18 @@ "search": { "aria-label-search-all": "Alles doorzoeken", "placeholder": "Alles doorzoeken" + }, + "use-data-source-settings-nav": { + "node": { + "subTitle": { + "data-source-error": "" + } + }, + "page-nav": { + "text": { + "data-source-nav-node": "" + } + } } }, "core": { @@ -3304,6 +3957,11 @@ "title-plugin-dashboard": "Plug-indashboard" }, "dash-nav": { + "on-open-snapshot-original": { + "title": { + "proceed-to-external-site": "" + } + }, "render-left-actions": { "text-public": "Openbaar", "tooltip-view-as-scene": "Weergeven als scène" @@ -3315,11 +3973,26 @@ "dashboard-loading": { "cancel-loading-dashboard": "Laden van het dashboard annuleren" }, + "dashboard-page-error": { + "text": { + "not-found": "Niet gevonden" + } + }, "dashboard-settings": { "actions": { "close": "Sluiten" } }, + "dashboard-slice": { + "title": { + "dashboard-init-failed": "" + } + }, + "dashboard-srv": { + "message": { + "edit-dashboard-json": "" + } + }, "dashboard-validation": { "body-dashboard-failed-schema-validation": "Validatie is bedoeld voor ontwikkelingsdoeleinden en moet veilig kunnen worden genegeerd. Als je een Grafana-ontwikkelaar bent, overweeg dan om het dashboardschema te controleren en bij te werken", "title-checking-dashboard-validity": "Geldigheid van het dashboard controleren", @@ -3415,6 +4088,13 @@ "values": "Waarden gescheiden door komma", "values-placeholder": "1, 10, mijnsleutel : mijnwaarde, mijnwaarde, escaped,waarde" }, + "datasource-options": { + "name-filter": "", + "name-filter-description": "", + "name-filter-placeholder": "", + "type": "Type", + "type-placeholder": "" + }, "description": "Beschrijving", "description-placeholder": "Omschrijving", "label": "Label", @@ -3433,8 +4113,8 @@ "category": "Selectiemogelijkheden", "custom-all-value": "Alle aangepaste waarde", "custom-all-value-description": "Een wildcard regex of een andere waarde om Alles weer te geven", - "include-all": "Optie Alles opnemen", - "include-all-description": "Schakelt een optie in om alle waarden op te nemen", + "include-all": "", + "include-all-description": "", "multi-value": "Meerdere waarden" }, "type-category": "Opties voor {{type}}" @@ -3460,14 +4140,97 @@ "errors": { "failed-to-load": "Kan dashboard niet laden" }, + "fetch-dashboard": { + "message": { + "failed-to-fetch-dashboard": "" + } + }, "gen-aihistory": { "aria-label-send-custom-feedback": "Aangepaste feedback verzenden", "footer-text": "Deze inhoud is AI-gegenereerd met behulp van de <2>Grafana LLM-plug-in</2>", "placeholder-tell-ai-what-to-do-next": "Vertel AI wat het nu moet doen..." }, + "general-settings-unconnected": { + "editable-options": { + "label": { + "editable": "Bewerkbaar", + "readonly": "" + } + } + }, + "get-debug-dashboard": { + "title": { + "annotations": "Annotaties" + } + }, + "get-errors": { + "message": { + "error-loading-data": "" + } + }, "get-field-override-categories": { "label-add-field-override": "Veldoverschrijving toevoegen", - "label-add-override-property": "Overschrijvingseigenschap toevoegen" + "label-add-override-property": "Overschrijvingseigenschap toevoegen", + "title": { + "add-button": "" + } + }, + "get-library-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "Informatie", + "name": "Naam" + } + }, + "get-library-viz-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "Informatie", + "name": "Naam" + } + }, + "get-panel-editor-tabs": { + "text": { + "alert": "", + "query": "Query", + "transform-data": "" + } + }, + "get-panel-frame-category": { + "descriptor": { + "title": { + "panel-options": "Paneelopties" + } + }, + "direction-options": { + "label": { + "horizontal": "Horizontaal", + "vertical": "Verticaal" + } + }, + "title": { + "description": "Beschrijving", + "max-per-row": "Max per rij", + "panel-links": "Paneellinks", + "repeat-by-variable": "Herhalen per variabele", + "repeat-direction": "Herhaalrichting", + "repeat-options": "Opties voor herhalen", + "title": "Titel", + "transparent-background": "Transparante achtergrond" + } + }, + "get-panel-menu": { + "text": { + "extensions": "" + } }, "help-wizard": { "copy-to-clipboard": "Kopiëren naar klembord", @@ -3480,10 +4243,21 @@ "randomize-field-names-label-field-names": "Veldnamen", "randomize-labels-label-labels": "Labels", "randomize-string-values-label-string-values": "Tekenreekswaarden", + "tabs": { + "label": { + "data": "Gegevens", + "snapshot": "Snapshot" + } + }, "title-complete-git-hub-comment-clipboard": "Een volledige GitHub-opmerking naar het klembord kopiëren", "title-get-help-with-this-panel": "Hulp inschakelen bij dit paneel", "troubleshooting-docs": "Problemen met documenten oplossen" }, + "init-dashboard": { + "message": { + "failed-create-dashboard-model": "" + } + }, "inspect": { "data-tab": "Gegevens", "error-tab": "Fout", @@ -3536,6 +4310,16 @@ "rows": "Totale aantal rijen", "table-title": "Statistieken" }, + "k8s-dashboard-api": { + "title": { + "deleted": "" + } + }, + "k8s-dashboard-v2api": { + "title": { + "deleted": "" + } + }, "layout": { "common": { "copy": "Kopiëren", @@ -3548,6 +4332,13 @@ "panel-layout-disabled": "Selecteer een rij of tabblad om de indelingsopties van het paneel te wijzigen" } }, + "legacy-dashboard-api": { + "fetch-error": { + "message": { + "dashboard-not-found": "" + } + } + }, "make-editable": { "dashboard-not-editable": "Dashboard kan niet worden bewerkt", "make-editable": "Bewerkbaar maken" @@ -3567,6 +4358,20 @@ "menu-use-library-panel": "Bibliotheekpaneel gebruiken" }, "new-panel-title": "Nieuw paneel", + "on-create-new-row": { + "new-row": { + "title": { + "row-title": "" + } + } + }, + "on-create-new-widget-panel": { + "new-panel": { + "title": { + "widget-title": "" + } + } + }, "options": { "description": "Beschrijving", "title-option": "Titel" @@ -3626,6 +4431,30 @@ "paused": "Dit dashboard is gepauzeerd door de beheerder", "try-again-later": "Probeer het later opnieuw" }, + "remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, + "repeat-row-select": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, + "repeat-row-select2": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, "revert-dashboard-modal": { "body-restore-version": "Weet je zeker dat je het dashboard naar versie {{version}} wilt herstellen? Alle niet opgeslagen wijzigingen zullen verloren gaan.", "title-restore-version": "Versie herstellen" @@ -3739,6 +4568,18 @@ "sub-menu-un-connected": { "aria-label-template-variables": "Sjabloonvariabelen" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "tabs-layout": { "delete-tab-text": "Als je dit tabblad verwijdert, worden ook alle panelen verwijderd. Weet je zeker dat je wilt doorgaan?", "delete-tab-title": "Tabblad verwijderen?", @@ -3944,7 +4785,10 @@ }, "unthemed-dashboard-row": { "aria-label-delete-row": "Rij verwijderen", - "learn-more": "Meer informatie" + "learn-more": "Meer informatie", + "title": { + "delete-row": "Rij verwijderen" + } }, "validation": { "invalid-dashboard-id": "Kon geen geldige Grafana.com-ID vinden", @@ -3979,6 +4823,16 @@ }, "visualization-select-pane": { "placeholder-search-for": "Zoeken naar...", + "radio-options": { + "description": { + "reusable-panels-share-between-multiple-dashboards": "" + }, + "label": { + "library-panels": "Bibliotheekpanelen", + "suggestions": "", + "visualizations": "" + } + }, "title-close": "Sluiten" }, "viz-panel": { @@ -4029,12 +4883,25 @@ "label-data-source": "Gegevensbron", "label-use-static-key-dimensions": "Gebruik statische sleutelafmetingen" }, + "add-to-dashboard": { + "message": { + "could-navigate-selected-dashboard-please-again": "", + "could-panel-dashboard-please-again": "" + } + }, "add-to-dashboard-form": { "cancel": "Annuleren", "description-choose-where-to-add-the-panel": "Kies waar je het paneel wilt toevoegen.", "description-select-which-dashboard-panel-created": "Selecteer in welk dashboard het paneel wordt gemaakt.", + "label": { + "existing-dashboard": "Bestaand dashboard", + "new-dashboard": "Nieuw dashboard" + }, "label-dashboard": "Dashboard", "label-target-dashboard": "Doeldashboard", + "message": { + "this-field-is-required": "Dit veld is verplicht." + }, "open-dashboard": "Dashboard openen", "open-in-new-tab": "In een nieuw tabblad openen", "title-error-adding-the-panel": "Er is een fout opgetreden bij het toevoegen van het paneel" @@ -4072,6 +4939,25 @@ "it-cannot-contain-or": "Het kan geen '//' of '..' bevatten.", "least-valid-character": "Het moet ten minste één geldig teken bevatten." }, + "build-new-dashboard-save-model": { + "data": { + "title": { + "new-dashboard": "Nieuw dashboard" + } + } + }, + "build-new-dashboard-save-model-v2": { + "data": { + "title": { + "new-dashboard": "Nieuw dashboard" + } + } + }, + "config-public-dashboard": { + "title": { + "revoke-public-url": "Openbare URL intrekken" + } + }, "constant-variable-form": { "constant-options": "Constante opties", "label-value": "Waarde", @@ -4119,22 +5005,89 @@ "value-not-saved": "De waarde is nog niet opgeslagen in de Grafana-database", "view-pull-request-in-git-hub": "Pull-verzoek bekijken in GitHub" }, + "dashboard-scene": { + "text": { + "edit-panel": "", + "view-panel": "Paneel bekijken" + }, + "title": { + "dashboard": "Dashboard", + "discard-changes-to-dashboard": "" + } + }, + "dashboard-scene-page-state-manager": { + "message": { + "dashboard-not-found": "" + } + }, + "dashboard-scene-page-state-manager-v2": { + "message": { + "dashboard-not-found": "" + } + }, "data-source-variable-form": { "data-source-options": "Opties voor gegevensbronnen", "description-instance-name-filter": "Regex-filter voor welke gegevensbroninstanties uit de lijst met variabele waarden moet worden gekozen. Laat leeg voor alles.", "example-instance-name-filter": "Voorbeeld: <codeExample />", "selection-options": "Selectiemogelijkheden" }, + "default-grid-layout-manager": { + "row": { + "title": { + "row-title": "" + } + } + }, "description-label": { "description": "Beschrijving" }, + "edit-link-view": { + "edit-link-page-nav": { + "text": { + "edit-link": "Link bewerken" + } + } + }, "email-list": { "aria-label-emailmenu": "E-mailmenu in-/uitschakelen" }, + "embedded-dashboard-test-page": { + "subTitle": { + "showing-dashboard-panel-tests-pie-chart": "" + }, + "text": { + "embedding-dashboard": "" + } + }, "empty-transformations-message": { "add-transformation": "Transformatie toevoegen" }, + "get-edit-options": { + "title": { + "column-options": "", + "row-height-options": "" + } + }, + "get-panel-frame-options": { + "descriptor": { + "title": { + "panel-options": "Paneelopties" + } + }, + "title": { + "description": "Beschrijving", + "panel-links": "Paneellinks", + "title": "Titel", + "transparent-background": "Transparante achtergrond" + } + }, + "get-workflow-options": { + "label": { + "push-to-a-new-branch": "" + } + }, "group-by-variable-form": { + "alert-not-supported": "", "description-enables-users-custom-values": "Stelt gebruikers in staat om aangepaste waarden aan de lijst toe te voegen", "description-provide-dimensions-as-csv-dimension-name-dimension-id": "Geef afmetingen op als csv: {{name}}, {{value}}", "group-by-options": "Groeperen op opties", @@ -4153,6 +5106,12 @@ "randomize-field-names-label-field-names": "Veldnamen", "randomize-labels-label-labels": "Labels", "randomize-string-values-label-string-values": "Tekenreekswaarden", + "tabs": { + "label": { + "data": "Gegevens", + "snapshot": "Snapshot" + } + }, "title-complete-git-hub-comment-clipboard": "Een volledige GitHub-opmerking naar het klembord kopiëren", "title-get-help-with-this-panel": "Hulp inschakelen bij dit paneel", "troubleshooting-docs": "Problemen met documenten oplossen", @@ -4195,6 +5154,14 @@ "body-name-already-exists": "Er bestaat al een dashboard met dezelfde naam in de geselecteerde map. Wil je dit dashboard nog steeds opslaan?", "title-name-already-exists": "Naam bestaat al" }, + "on-remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, "panel-data-alerting-tab-rendered": { "alert": { "title-errors-loading-rules": "Er is een fout opgetreden bij het laden van regels" @@ -4216,6 +5183,11 @@ "table-view-aria-label-toggletableview": "Tabelweergave in-/uitschakelen", "table-view-label-table-view": "Tabelweergave" }, + "panel-editor": { + "text": { + "edit-panel": "" + } + }, "panel-editor-renderer": { "aria-label-open-options-pane": "Deelvenster Opties openen", "tooltip-open-options-pane": "Deelvenster Opties openen" @@ -4224,8 +5196,22 @@ "body-panel-plugin-not-loaded": "Zorg ervoor dat het paneel dat je wilt inspecteren zichtbaar is en is weergegeven voordat je de inspectie start.", "title-panel-plugin-not-loaded": "Paneelplug-in niet geladen" }, + "panel-menu-behavior": { + "async-func": { + "text": { + "extensions": "", + "metrics-drilldown": "" + } + } + }, "panel-viz-type-picker": { "placeholder-search-for": "Zoeken naar...", + "radio-options": { + "label": { + "suggestions": "", + "visualizations": "" + } + }, "title-close": "Sluiten" }, "provisioned-delete-modal": { @@ -4252,6 +5238,15 @@ "query-options": "Opties voor query's", "selection-options": "Selectiemogelijkheden" }, + "resource-export": { + "label": { + "classic": "", + "json": "JSON", + "v1-resource": "", + "v2-resource": "", + "yaml": "" + } + }, "revert-dashboard-modal": { "body-restore-version": "Weet je zeker dat je het dashboard naar versie {{version}} wilt herstellen? Alle niet opgeslagen wijzigingen zullen verloren gaan.", "title-restore-version": "Versie herstellen" @@ -4360,6 +5355,18 @@ "solo-panel-page": { "loading": "Bezig met laden" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "text-box-variable-form": { "placeholder-default-value-if-any": "(optioneel)", "text-options": "Tekstopties" @@ -4370,6 +5377,13 @@ "title-field-label": { "title": "Titel" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "transformations-drawer": { "search-box-suffix": { "tooltip-clear-search": "Zoekopdracht wissen" @@ -4385,6 +5399,13 @@ "save-dashboard": "Dashboard opslaan", "title-unsaved-changes": "Onopgeslagen wijzigingen" }, + "use-dashboard-edit-page-nav": { + "page-nav": { + "text": { + "settings": "Instellingen" + } + } + }, "variable-check-indicator": { "aria-label-variable-referenced-dashboard": "Er wordt door geen enkele variabele of dashboard naar deze variabele verwezen.", "aria-label-variable-referenced-other-variables-dashboard": "Deze variabele wordt gebruikt door andere variabelen of dashboard.", @@ -4401,7 +5422,10 @@ "placeholder-descriptive-text": "Omschrijving", "placeholder-label-name": "Labelnaam", "placeholder-variable-name": "Naam variabele", - "text-running-query": "Query wordt uitgevoerd..." + "text-running-query": "Query wordt uitgevoerd...", + "title": { + "delete-variable": "Variabele verwijderen" + } }, "variable-editor-list": { "definition": "Definitie", @@ -4583,6 +5607,25 @@ "message": "Geen gegevensbronnen gevonden" } }, + "datagrid": { + "add-column": { + "placeholder-column-name": "" + }, + "datagrid-context-menu": { + "render-context-menu-items": { + "label-clear-column": "", + "label-clear-row": "", + "label-remove-all-data": "", + "label-search": "Zoeken..." + }, + "render-header-menu-items": { + "label-clear-column": "", + "label-delete-column": "", + "label-rename-column": "", + "label-set-field-type": "" + } + } + }, "datasources": { "add-new-data-source-button": { "tooltip-no-permission": "Je hebt geen toestemming om nieuwe gegevensbronnen te configureren" @@ -4604,6 +5647,46 @@ "label-default": "Standaard", "label-name": "Naam" }, + "build-categories": { + "categories": { + "title": { + "cloud": "", + "distributed-tracing": "", + "enterprise-plugins": "Plug-ins voor ondernemingen", + "industrial-io-t": "", + "logging-document-databases": "", + "others": "", + "profiling": "", + "sql": "", + "time-series-databases": "" + } + } + }, + "build-nav-model": { + "analytics": { + "text": { + "insights": "Inzichten" + } + }, + "caching": { + "text": { + "cache": "" + } + }, + "ds-permissions": { + "text": { + "permissions": "Toestemmingen" + } + }, + "nav-model": { + "text": { + "settings": "Instellingen" + } + }, + "text": { + "dashboards": "Dashboards" + } + }, "button-row": { "delete": "Verwijderen", "save-and-test": "Opslaan en testen", @@ -4639,6 +5722,11 @@ "data-source-read-only-message": { "title-provisioned-data-source": "Voorziene gegevensbron" }, + "data-source-settings-reducer": { + "message": { + "testing-could-couple-minutes": "" + } + }, "data-source-type-card": { "aria-label-learn-more": "{{dataSourcePluginName}}, meer informatie." }, @@ -4656,13 +5744,88 @@ "footer": { "add-csv-or-spreadsheet": "Csv of spreadsheet toevoegen" }, + "get-enterprise-phantom-plugins": { + "description": { + "adobe-analytics-datasource": "", + "app-dynamics-integration-and-data-source": "", + "atlassian-statuspage-datasource": "", + "aurora-data-source": "", + "azure-cosmos-db-datasource": "", + "azure-devops-datasource": "", + "catchpoint-datasource": "", + "cloudflare-datasource": "", + "cockroach-db-datasource": "", + "data-dog-integration-and-data-source": "", + "drone-datasource": "", + "git-lab-integration-and-datasource": "", + "honeycomb-integration-and-datasource": "", + "jira-integration-and-datasource": "", + "logic-monitor-devices-datasource": "", + "mongo-db-integration-and-data-source": "", + "netlify-datasource": "", + "new-relic-integration-and-data-source": "", + "pager-duty-datasource": "", + "salesforce-integration-and-datasource": "", + "sap-hana-integration-and-data-source": "", + "service-now-integration-and-data-source": "", + "signal-fx-integration-and-datasource": "", + "snowflake-integration-and-data-source": "", + "sumo-logic-integration-and-datasource": "", + "visualize-and-explore-dynatrace-data": "", + "visualize-and-explore-oracle-sql": "", + "visualize-and-explore-splunk-logs": "", + "wavefront-integration-and-data-source": "", + "zendesk-datasource": "" + } + }, + "get-grafana-cloud-phantom-plugin": { + "description": { + "hosted-graphite-prometheus-and-loki": "" + } + }, "new-data-source-view": { "cancel": "Annuleren", "placeholder-filter-by-name-or-type": "Filteren op naam of type" }, + "update-data-source": { + "error-info": { + "message": { + "an-unexpected-error-occurred": "" + } + } + }, "use-data-source-info": { "badge-text-not-supported": "Niet ondersteund", - "badge-text-supported": "Ondersteund" + "badge-text-supported": "Ondersteund", + "label": { + "alerting": "Alerting", + "type": "Type" + } + }, + "use-delete-loaded-data-source": { + "title": { + "delete": "Verwijderen" + } + } + }, + "debug": { + "cursor-view": { + "no-events-yet": "" + }, + "render-info-viewer": { + "data-counter": "", + "elapsed-time": "", + "field": "Veld", + "last": "", + "render-counter": "", + "schema-counter": "", + "title-reset-counters": "", + "tooltip-step-back": "", + "type": "Type" + }, + "state-view": { + "current-value": "", + "label-state-name": "" } }, "dimensions": { @@ -4731,6 +5894,19 @@ "remove-value-mapping-aria-label-delete-value-mapping": "Waardemapping verwijderen", "remove-value-mapping-tooltip-delete": "Verwijderen", "set-color": "Kleur instellen", + "special-match-options": { + "description": { + "boolean-false-values": "", + "boolean-true-values": "", + "empty-string": "", + "matches-against-number-na-n-not-a-number": "", + "matches-null-and-undefined-values": "", + "matches-null-undefined-and-na-n": "" + }, + "label": { + "empty": "Leeg" + } + }, "tooltip-remove-color": "Kleur verwijderen", "tooltip-remove-icon": "Pictogram verwijderen" }, @@ -4746,6 +5922,20 @@ "display-text": "Weergavetekst", "icon": "Pictogram", "label-add-a-new-mapping": "Een nieuwe mapping toevoegen", + "mapping-types": { + "description": { + "match-a-numerical-range-of-values": "", + "match-a-regular-expression-with-replacement": "", + "match-a-specific-text-value": "", + "match-boolean-empty-values": "" + }, + "label": { + "range": "", + "regex": "", + "special": "", + "value": "Waarde" + } + }, "update": "Bijwerken" } }, @@ -4770,6 +5960,7 @@ }, "explore": { "accordian-logs": { + "events": "", "footer": "Tijdstempels van gebeurtenissen zijn relatief aan de starttijd van het volledige spoor." }, "accordian-references": { @@ -4780,6 +5971,11 @@ "basic-extensions": { "aria-label-add": "Toevoegen" }, + "build-dashboard-panel-from-explore-state": { + "title": { + "new-panel": "" + } + }, "clear": "Wissen", "confirm-navigation-modal": { "cancel": "Annuleren", @@ -4866,6 +6062,33 @@ "title-table": "Tabel", "title-traces": "Sporen" }, + "explore-query-inspector": { + "data-tab": { + "label": { + "data": "Gegevens" + } + }, + "error-tab": { + "label": { + "error": "Fout" + } + }, + "json-tab": { + "label": { + "json": "JSON" + } + }, + "query-tab": { + "label": { + "query": "Query" + } + }, + "stats-tab": { + "label": { + "stats": "Statistieken" + } + } + }, "explore-run-query-button": { "run-button": { "aria-label-run-query-options": "Opties voor query uitvoeren" @@ -4879,10 +6102,23 @@ "description-explore-disabled": "Om Verkennen in te schakelen, schakel je het in de Grafana-configuratie in:", "title-explore-disabled": "Verkennen is uitgeschakeld" }, + "get-field-links-for-explore": { + "text": { + "data": "Gegevens", + "raw-value": "" + } + }, "get-matches-metadata": { "matches": "0 overeenkomsten" }, "legacy-create-span-link-factory": { + "text": { + "tags": "Labels" + }, + "title": { + "related-logs": "", + "session-for-this-span": "Sessie voor deze span" + }, "title-explore-metrics-for-this-span": "Statistieken voor deze periode verkennen", "title-explore-split": "Verken de bijbehorende logs in gesplitste weergave", "title-session-for-this-span": "Sessie voor deze span" @@ -4923,6 +6159,10 @@ }, "logs-meta-row": { "download": "Downloaden", + "label": { + "deduplication-count": "", + "showing-only-selected-fields": "" + }, "show-original-line": "Oorspronkelijke regel weergeven" }, "logs-sample-panel": { @@ -5104,6 +6344,21 @@ "run-query-button": "Query uitvoeren", "switch-datasource-button": "Wisselen van gegevensbron en query uitvoeren" }, + "scoped-vars-from-span": { + "text": { + "span": "" + } + }, + "scoped-vars-from-tags": { + "text": { + "tags": "Labels" + } + }, + "scoped-vars-from-trace": { + "text": { + "trace": "Spoor" + } + }, "search-bar-input": { "placeholder-find": "Zoeken...", "suffix": { @@ -5138,9 +6393,25 @@ "tooltip-tag-key": "Labelsleutel die zal worden gebruikt om de labelwaarde op te halen. De attributen en bronnen van een span worden doorzocht op de labelsleutel" }, "span-detail": { + "label": { + "kind": "", + "library-name": "", + "library-version": "", + "status": "Status:", + "status-message": "", + "trace-state": "" + }, "label-resource-attributes": "Broneigenschappen", "label-span-attributes": "Spaneigenschappen", "label-stack-trace": "Stackspoor", + "overview-items": { + "label": { + "child-count": "", + "duration": "", + "service": "", + "start-time": "" + } + }, "warnings": "Waarschuwingen" }, "span-filters": { @@ -5247,6 +6518,18 @@ "title-node-graph": "Knooppuntgrafiek" }, "unthemed-logs": { + "description": { + "show-results-in-logs-visualisation": "", + "show-results-in-table-visualisation": "", + "show-results-newest-to-oldest": "", + "show-results-oldest-to-newest": "" + }, + "label": { + "logs": "Logs", + "newest-first": "Nieuwste eerst", + "oldest-first": "Oudste eerst", + "table": "Tabel" + }, "label-deduplication": "Dedupliceren", "label-display-results": "Resultaten weergeven", "label-prettify-json": "JSON verfraaien", @@ -5262,6 +6545,15 @@ }, "unthemed-virtualized-trace-view": { "title-scroll-to-top": "Naar boven scrollen" + }, + "use-focus-span-link": { + "create-focus-span-link": { + "link": { + "title": { + "deep-link-to-this-span": "" + } + } + } } }, "export": { @@ -5347,6 +6639,15 @@ "folder-repo": { "badge-text": "Provisioned" }, + "folders": { + "get-loading-nav": { + "main": { + "title": { + "loading": "Bezig met laden" + } + } + } + }, "forgot-password": { "back-button": "Terug naar inloggen", "change-password": { @@ -5376,10 +6677,102 @@ "incomplete-request-error": "Sorry, ik kon je verzoek niet voltooien. Probeer het opnieuw.", "send-custom-feedback": "Verzenden" }, + "geomap": { + "coordinates-map-view-editor": { + "label-latitude": "", + "label-longitude": "" + }, + "debug-overlay": { + "center": "", + "zoom": "" + }, + "fit-map-view-editor": { + "all-layers-editor-fragment": { + "label-layer": "" + }, + "label-data": "Gegevens", + "last-only-editor-fragment": { + "label-padding": "", + "tooltip-padding-relative-percent-beyond-extent": "" + } + }, + "frame-multi-selection-editor": { + "placeholder-change-filter": "" + }, + "frame-selection-editor": { + "placeholder-change-filter": "" + }, + "geomap-panel": { + "aria-label-map": "" + }, + "geomap-style-rules-editor": { + "aria-label-add-geomap-style-rule": "" + }, + "layers-editor": { + "label-add-layer": "", + "no-layers": "" + }, + "map-view-editor": { + "label-max-zoom": "", + "label-view": "Weergave", + "label-zoom": "Inzoomen", + "use-current-map-settings": "" + }, + "markers-legend": { + "title-symbol": "Symbool" + }, + "measure-overlay": { + "tooltip-show-measure-tools": "" + }, + "plugin": { + "basemap-layer-configured-server-admin": "" + }, + "style-editor": { + "label-align": "", + "label-baseline": "", + "label-color": "Kleur", + "label-fill-opacity": "", + "label-font-size": "", + "label-opacity": "", + "label-rotation-angle": "", + "label-size": "", + "label-symbol": "Symbool", + "label-symbol-horizontal-align": "", + "label-symbol-vertical-align": "", + "label-text-label": "", + "label-x-offset": "", + "label-y-offset": "" + }, + "style-rule-editor": { + "aria-label-comparison-operator": "Vergelijkingsoperator", + "aria-label-comparison-value": "", + "aria-label-delete-style-rule": "", + "aria-label-feature-property": "", + "label-rule": "Regel", + "placeholder-feature-property": "", + "placeholder-numeric-value": "", + "placeholder-value": "waarde" + } + }, "get-enterprise": { "requires-license": "Vereist een Grafana Enterprise-licentie", "title": "Enterprise" }, + "gettingstarted": { + "docs-card": { + "complete": "voltooid", + "learn-how": "" + }, + "getting-started": { + "aria-label-to-advanced-tutorials": "", + "aria-label-to-basic-tutorials": "", + "checking-completed-setup-steps": "", + "remove-this-panel": "" + }, + "tutorial-card": { + "complete": "voltooid" + } + }, "gops": { "config-card": { "text-loading-configuration": "Configuratie laden...." @@ -5396,6 +6789,74 @@ }, "progress-status": { "your-progress": "Je voortgang" + }, + "use-get-configuration-for-ui": { + "get-connect-data-source-configuration": { + "title": { + "connect-data-source": "" + } + }, + "title": { + "essentials": "Essentials" + } + }, + "use-get-essentials-configuration": { + "essential-content": { + "description": { + "configure-grafana-alerting": "", + "create-integration-alerting-contact-point": "", + "initialize-incident-plugin-declare-manage-incidents": "", + "practice-solving-an-incident": "", + "receive-alerts-oncall-notifications-within-environment": "", + "select-chat-ops-channels-to-route-notifications": "" + }, + "label": { + "add": "Toevoegen", + "connect": "Verbinden", + "initialize": "", + "select-integration": "", + "start-drill": "" + }, + "title": { + "add-slack-notifications-to-irm-integrations": "", + "connect-alerting-to-irm": "", + "connect-irm-to-your-slack-workspace": "", + "connect-your-messaging-workspace-to-incident": "", + "connect-your-messaging-workspace-to-on-call": "", + "create-incident-drill": "", + "detect": "Detecteren", + "initialize-incident-plugin": "", + "messaging-workspace-channel-on-call-integration": "", + "respond": "", + "test-your-configuration": "" + } + }, + "get-grafana-alerting-config-steps": { + "description": { + "create-alert-monitor-system": "", + "create-on-call-integration-alerting-contact-point": "", + "create-slos-to-monitor-your-service": "" + }, + "label": { + "connect": "Verbinden", + "create": "Aanmaken", + "enable": "Inschakelen" + }, + "steps": { + "label": { + "edit": "Bewerken" + }, + "title": { + "update-default-contact-point": "" + } + }, + "title": { + "connect-alerting-to-on-call": "", + "create-alert-rule": "", + "create-slo": "", + "enable-slo-alerting": "" + } + } } }, "grafana": { @@ -5762,14 +7223,18 @@ "duplicate-panel": "Paneel dupliceren", "exit-edit/setting-views": "Weergaven bewerken/instellen afsluiten", "expand-all-rows": "Alle rijen uitvouwen", + "explore-panel": "", "go-to-dashboards": "Naar dashboards", "go-to-explore": "Naar Verkennen", "go-to-home-dashboard": "Naar het dashboard Startpagina", "go-to-profile": "Naar Profiel", + "inspect-panel": "", "make-time-range-permanent": "Tijdsbereik absoluut/permanent maken", "move-time-range-back": "Tijdsbereik terugzetten", "move-time-range-forward": "Tijdsbereik vooruitzetten", "open-search": "Zoekopdracht openen", + "open-share-embed-drawer": "", + "open-share-link-drawer": "", "open-shared-modal": "Paneelafbeelding delen", "paste-time-range": "Tijdsbereik plakken", "refresh-all-panels": "Alle panelen vernieuwen", @@ -5795,6 +7260,11 @@ "support-bundle": "Je kunt ook een ondersteuningsbundel ophalen met informatie over je Grafana-instantie en geconfigureerde gegevensbronnen in de sectie <1> ondersteuningsbundels </1>.", "troubleshooting-help": "Stuur een snapshot van dit paneel naar de technische ondersteuning van Grafana Labs om hulp bij het oplossen van problemen aan te vragen. De snapshot bevat queryantwoordgegevens en paneelinstellingen." }, + "histogram": { + "histogram-panel": { + "no-histogram-found-in-response": "" + } + }, "inspector": { "inspect-data-tab": { "loading": "Bezig met laden", @@ -5844,6 +7314,9 @@ "label-name": "Naam", "label-password": "Wachtwoord", "label-username": "Gebruikersnaam", + "message": { + "email-is-invalid": "" + }, "placeholder-name-optional": "Naam (optioneel)", "placeholder-password": "Wachtwoord", "placeholder-username": "Gebruikersnaam", @@ -6103,8 +7576,26 @@ "discard-local-changes": "Lokale wijzigingen verwijderen", "title-dashboard-changed": "Dashboard is gewijzigd" }, + "live-channel-editor": { + "description-grafana-live": "", + "namespace": "Namespace", + "path": "Path", + "placeholder-select-watchable-resource": "", + "scope": "", + "title-grafana-live": "" + }, "live-connection-warning": { "title-connection-to-server-is-lost": "Verbinding met server is verbroken..." + }, + "live-panel": { + "error": "Fout", + "grafana-requires-feature": "", + "panel-editor-channel": "", + "title-grafana-live": "", + "waiting-for-data": "" + }, + "live-publish": { + "publish": "" } }, "lock-icon": "Vergrendelpictogram", @@ -6151,6 +7642,13 @@ } }, "logs": { + "get-dataframe-fields": { + "vars": { + "text": { + "labels": "Labels" + } + } + }, "infinite-scroll": { "end-of-range": "Einde van het geselecteerde tijdsbereik.", "load-more": "Scrollen om meer te laden", @@ -6231,6 +7729,11 @@ "shortcut": "alt+selecteren om opnieuw in te schakelen" } }, + "log-series-to-logs-model": { + "label": { + "total-bytes-processed": "" + } + }, "logs-controls": { "deduplication": "Dedupliceren", "disable-highlighting": "Markeren uitschakelen", @@ -6265,6 +7768,11 @@ "scroll-top": "Naar boven scrollen", "start-of-range": "Begin van het bereik" }, + "logs-panel": { + "render-common-labels": { + "common-labels": "" + } + }, "out-of-range-message": { "end-of-the-selected-time-range": "Einde van het geselecteerde tijdsbereik." }, @@ -6321,6 +7829,14 @@ }, "snapshot-list-table": { "title-delete": "Verwijderen" + }, + "unthemed-dashboard-import": { + "subTitle": { + "import-dashboard-from-file-or-grafanacom": "" + }, + "text": { + "import-dashboard": "Dashboard importeren" + } } }, "migrate-to-cloud": { @@ -6978,8 +8494,57 @@ "close": "Lade sluiten" }, "link-title": "Ga naar Grafana Labs-blog", + "news-panel": { + "body-error-loading-rss-feed": "", + "loading": "Laden...", + "title-error-loading-rss-feed": "" + }, "title": "Laatste blogberichten" }, + "nodeGraph": { + "arc-options-editor": { + "add-arc": "", + "title-remove-arc": "" + }, + "edge": { + "aria-label-from-to": "" + }, + "edge-header": { + "label-source-target": "" + }, + "marker": { + "100-node-count": "", + "aria-label-hidden-marker": "", + "node-count_one": "", + "node-count_other": "" + }, + "node": { + "aria-label-node-title": "" + }, + "node-graph": { + "aria-label-layered-layout-performance-warning": "", + "aria-label-nodes-hidden-warning": "", + "computing-layout": "", + "no-data": "Geen gegevens", + "hidden-nodes_one": "", + "hidden-nodes_other": "", + "processed-nodes_one": "", + "processed-nodes_other": "" + }, + "node-graph-panel": { + "no-data-found-in-response": "" + }, + "node-header": { + "label-subtitle": "", + "label-title": "Titel" + }, + "view-controls": { + "hide-config": "", + "show-config": "", + "title-zoom-in": "", + "title-zoom-out": "" + } + }, "notifications": { "empty-state": { "description": "Meldingen die je hebt ontvangen, worden hier weergegeven", @@ -7021,6 +8586,11 @@ "label-organization-name": "Naam van organisatie", "placeholder-org-name": "Organisatienaam" }, + "org-details-page": { + "title": { + "confirm-preferences-update": "" + } + }, "org-profile": { "label-organization-name": "Naam van organisatie", "label-organization-profile": "Profiel van de organisatie", @@ -7040,7 +8610,10 @@ "tooltip": "Je kunt nu de optie 'Geen basisrol' selecteren en toestemmingen toevoegen aan je aangepaste behoeften. Meer informatie vind je in <1>onze documentatie</1>." }, "user-invite-page": { - "sub-title": "Stuur uitnodiging of voeg een bestaande Grafana-gebruiker toe aan de organisatie.<1> {{orgName}}</1>" + "sub-title": "Stuur uitnodiging of voeg een bestaande Grafana-gebruiker toe aan de organisatie.<1> {{orgName}}</1>", + "text": { + "invite-user": "" + } } }, "org-picker": { @@ -7052,6 +8625,38 @@ } }, "panel": { + "get-calculation-value-data-links-variable-suggestions": { + "value-calc-var": { + "label": { + "calculation-name": "" + } + } + }, + "get-data-links-variable-suggestions": { + "value-time-var": { + "label": { + "time": "Tijd" + } + } + }, + "get-field-links-supplier": { + "text": { + "data": "Gegevens", + "field": "Veld", + "series": "", + "value": "Waarde" + } + }, + "get-field-vars": { + "label": { + "name": "Naam" + } + }, + "get-panel-links-variable-suggestions": { + "label": { + "all-variables": "" + } + }, "header-menu": { "copy": "Kopiëren", "create-library-panel": "Bibliotheekpaneel aanmaken", @@ -7112,6 +8717,13 @@ "select-placeholder": "Filteren op type" }, "playlist": { + "playlist-new-page": { + "page-nav": { + "text": { + "new-playlist": "Nieuwe afspeellijst" + } + } + }, "playlist-table-rows": { "aria-label-playlist-item": "Afspeellijstitem, {{itemType}}, {{itemValue}}", "multiple-dashboards-found": "Meerdere items gevonden: {{items}}", @@ -7128,6 +8740,12 @@ "label-mode": "Modus", "label-time-and-refresh": "Tijd en vernieuwen", "label-variables": "Variabelen", + "modes": { + "label": { + "kiosk": "Kiosk", + "normal": "Normaal" + } + }, "title-start-playlist": "Afspeellijst starten" } }, @@ -7194,6 +8812,19 @@ }, "browse": { "aria-label-plugin-type-filter": "Plug-in typefilter", + "filter-by-options": { + "label": { + "all": "Alle", + "installed": "Geïnstalleerd", + "new-updates": "" + } + }, + "label": { + "all": "Alle", + "applications": "", + "data-sources": "Gegevensbronnen", + "panels": "Panelen" + }, "label-search": "Zoeken", "label-state": "Status", "label-type": "Type", @@ -7275,12 +8906,24 @@ "empty-state": { "message": "Geen plug-ins gevonden" }, + "extensions-log-data-source": { + "message": { + "ok": "OK" + } + }, "filter": { "disabled": "Deze filter is uitgeschakeld omdat de Grafana-server geen toegang heeft tot grafana.com", "sort": "Sorteren", "sort-list": "Lijst met plug-ins sorteren", "state": "Status" }, + "get-feature-state-info": { + "text": { + "alpha": "", + "beta": "Bèta", + "deprecated": "Verouderd" + } + }, "get-started-with-app": { "disable": "Uitschakelen", "enable": "Inschakelen" @@ -7337,6 +8980,16 @@ "plugin-details-header-dependencies": { "grafana-dependency": "Grafana {{grafanaDependency}}" }, + "plugin-details-page": { + "not-found-model": { + "subTitle": { + "requested-belong-plugin": "" + }, + "text": { + "unknown-plugin": "" + } + } + }, "plugin-details-signature": { "body-invalid-plugin-signature": "Grafana Labs controleert elke plug-in om te controleren of deze een geldige digitale handtekening heeft. Handtekeningverificatie van plug-ins maakt deel uit van onze beveiligingsmaatregelen om ervoor te zorgen dat plug-ins veilig en betrouwbaar zijn. Grafana Labs kan de integriteit van deze niet-ondertekende plug-in niet garanderen. Vraag de auteur van de plug-in om deze te ondertekenen.", "read-more-about-plugins-signing": "Lees meer over plug-in-handtekeningen.", @@ -7382,6 +9035,13 @@ "search-field": { "placeholder-search-grafana-plugins": "Grafana-plug-ins doorzoeken" }, + "use-plugin-details-tabs": { + "nav-model-children": { + "text": { + "dashboards": "Dashboards" + } + } + }, "version-install-button": { "text-installed": "Geïnstalleerd" }, @@ -7499,6 +9159,11 @@ "label-git-hub-features": "GitHub-functies", "label-realtime-feedback": "Realtime feedback" }, + "connect-page": { + "subTitle": { + "connect-external-storage-manage-resources": "" + } + }, "connect-repository-button": { "configure": "Configureren", "configure-file": "Bestandsprovisioning configureren", @@ -7532,7 +9197,13 @@ }, "edit-repository-page": { "back-to-repositories": "Terug naar repositories", - "repository-config-exists-configuration": "Zorg ervoor dat de repository-configuratie in het configuratiebestand bestaat." + "repository-config-exists-configuration": "Zorg ervoor dat de repository-configuratie in het configuratiebestand bestaat.", + "subTitle": { + "configure-repository-storing-resources": "" + }, + "text": { + "configure-repository": "" + } }, "empty-state": { "no-jobs": "Geen taken..." @@ -7595,6 +9266,11 @@ "no-results-matching-your-query": "Geen resultaten die overeenkomen met je query", "placeholder-search": "Zoeken" }, + "get-default-values": { + "title": { + "repository": "Repository" + } + }, "getting-started": { "alert-temporary-outage": "Wanneer je je hele instantie koppelt, zijn er geen dashboards beschikbaar tijdens het uitvoeren van de migratie. We raden je aan je gebruikers te waarschuwen voordat je het proces start.", "modal-description-public-access": "Stel openbare toeging tot je Grafana-instantie in om GitHub-integratie in te schakelen", @@ -7739,7 +9415,18 @@ "dashboard-preview": "Dashboardvoorbeeld", "existing-dashboard": "Bestaand dashboard", "history": "Geschiedenis", + "message": { + "removed-from-repo-test-ui": "", + "updated-from-repo-test-ui": "" + }, "repository": "Repository", + "tab-info": { + "label": { + "dry-run-result-after-apply": "", + "existing-from-grafana": "", + "file-from-repository": "" + } + }, "title-error-saving-file": "Er is een fout opgetreden bij het opslaan van het bestand" }, "setup-modal": { @@ -8152,14 +9839,6 @@ "reload-button": "Herladen", "title": "Kan toepassingsbestand niet vinden" }, - "sandbox": { - "test-stuff-page": { - "application-notifications-toasts-testing": "Applicatiemeldingen (toasts) testen", - "error": "Fout", - "success": "Succes", - "warning": "Waarschuwing" - } - }, "save-dashboards": { "message-length": { "info": "Het bericht bestaat uit {{messageLength}} tekens. Dit overschrijdt de maximale lengte van 500 tekens. Verkort het voordat je het opslaat.", @@ -8219,6 +9898,14 @@ "view-as-folders": "Weergeven als mappen", "view-as-list": "Weergeven als lijst" }, + "bluge-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } + }, "dashboard-actions": { "import": "Importeren", "new": "Nieuw", @@ -8246,6 +9933,14 @@ "search-results-table": { "aria-label-search-results-table": "Tabel met zoekresultaten", "no-data": "Geen waarden" + }, + "unified-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } } }, "select": { @@ -8317,6 +10012,11 @@ "delete-service-account": "Serviceaccount verwijderen", "disable-service-account": "Serviceaccount uitschakelen", "enable-service-account": "Serviceaccount inschakelen", + "page-nav": { + "subTitle": { + "manage-settings-individual-service-account": "" + } + }, "title-delete-service-account": "Serviceaccount verwijderen", "title-disable-service-account": "Serviceaccount uitschakelen", "tokens": "Tokens", @@ -8633,6 +10333,12 @@ "sort-picker": { "select-aria-label": "Sorteren" }, + "status-history": { + "status-history-panel": { + "too-many-points_one": "", + "too-many-points_other": "" + } + }, "support-bundles": { "new-bundle-button": { "new-support-bundle": "Nieuwe ondersteuningsbundel" @@ -8640,7 +10346,10 @@ "support-bundles-create-unconnected": { "cancel": "Annuleren", "create": "Aanmaken", - "sub-title": "Kies de componenten voor de ondersteuningsbundel. De ondersteuningsbundel is 3 dagen na creatie beschikbaar." + "sub-title": "Kies de componenten voor de ondersteuningsbundel. De ondersteuningsbundel is 3 dagen na creatie beschikbaar.", + "text": { + "create-support-bundle": "" + } }, "support-bundles-unconnected": { "created-on": "Aangemaakt op ", @@ -8655,10 +10364,35 @@ "login": "Inloggen" }, "table": { + "auto-cell-options-editor": { + "description-wrap-text": "", + "label-wrap-text": "" + }, + "bar-gauge-cell-options-editor": { + "label-gauge-display-mode": "", + "label-value-display": "" + }, + "color-background-cell-options-editor": { + "description-apply-to-entire-row": "", + "description-wrap-text": "", + "label": { + "text-alpha": "" + }, + "label-apply-to-entire-row": "", + "label-background-display-mode": "", + "label-wrap-text": "", + "wrap-text": "" + }, "container": { "content": "Het weergeven van te veel kolommen in een enkele tabel kan de prestaties beïnvloeden en gegevens moeilijker leesbaar maken. Overweeg om je query's te verfijnen.", "show-all-series": "Alle kolommen weergeven", "show-only-series": "Maar {{MAX_NUMBER_OF_COLUMNS}} kolommen weergeven" + }, + "image-cell-options-editor": { + "description-alt-text": "", + "description-title-text": "", + "label-alt-text": "", + "label-title-text": "" } }, "tag-filter": { @@ -8674,6 +10408,24 @@ "select-placeholder": "Selecteer een team" }, "teams": { + "build-nav-model": { + "nav-model": { + "subTitle": { + "manage-members-and-settings": "" + }, + "text": { + "settings": "Instellingen" + } + }, + "team-group-sync": { + "text": { + "external-group-sync": "Externe groepssynchronisatie" + } + }, + "text": { + "members": "Leden" + } + }, "create-team": { "create": "Aanmaken", "description-email": "Dit is optioneel en wordt voornamelijk gebruikt voor het toestaan van aangepaste teamavatars", @@ -8695,6 +10447,9 @@ "external-group-sync": "Externe groepssynchronisatie", "label-add-external-group": "Externe groep toevoegen", "team-sync-upgrade": "Voeg een groep toe om teamsynchronisatie gratis in te schakelen tijdens je proefperiode van Grafana Pro", + "text": { + "add-group": "Groep toevoegen" + }, "title-there-external-groups": "Er zijn geen externe groepen om mee te synchroniseren", "tooltip-add-external-group": "Voorbeeld LDAP-groep: {{example}}" }, @@ -8796,6 +10551,42 @@ "select-search-input": "Typ om te zoeken (land, stad, afkorting)" } }, + "timeseries": { + "annotation-editor2": { + "add-annotation": "Annotatie toevoegen", + "cancel": "Annuleren", + "edit-annotation": "", + "label-description": "Beschrijving", + "label-tags": "Labels", + "placeholder-add-tags": "", + "save": "Opslaan", + "saving": "Opslaan" + }, + "annotation-tooltip2": { + "tooltip-delete": "Verwijderen", + "tooltip-edit": "Bewerken" + }, + "line-style-editor": { + "title-the-input-expects-a-segment-list": "", + "tooltip-help": "Help" + }, + "nulls-threshold-input": { + "placeholder-never": "Nooit" + }, + "outside-range-plugin": { + "data-outside-time-range": "", + "zoom-to-data": "" + }, + "timezones-editor": { + "tooltip-add-timezone": "", + "tooltip-remove-timezone": "" + } + }, + "traces": { + "traces-panel": { + "no-data-found-in-response": "" + } + }, "transformations": { "empty": { "add-transformation-body": "Met transformaties kunnen gegevens op verschillende manieren worden gewijzigd voordat je visualisatie wordt weergegeven.<1></1>Dit omvat het samenvoegen van gegevens, het hernoemen van velden, het maken van berekeningen, het opmaken van gegevens voor weergave en meer.", @@ -8832,6 +10623,10 @@ "convert-field-type-transformer-editor": { "aria-label-add-a-convert-field-type-transformer": "Transformator omgezet veldtype toevoegen", "aria-label-remove-convert-field-type-transformer": "Transformator omgezet veldtype verwijderen", + "label": { + "browser": "Browser", + "utc": "" + }, "label-as": "als", "label-date-format": "Datumindeling", "label-field": "Veld", @@ -8918,11 +10713,32 @@ "tooltip-format": "De uitvoerindeling voor het veld dat is opgegeven als een <2>Moment.js-indelingsreeks</2>.", "tooltip-timezone-manually": "Stel de tijdzone van de datum handmatig in" }, + "get-timezone-options": { + "label": { + "browser": "Browser", + "utc": "" + } + }, "get-tooltips": { "description": "Een geldig pad van een json-object.", "json-value": "JSON-waarde:", + "map-valid-paths": { + "description": { + "extract-fields-from-object": "", + "extract-value": "", + "extract-value-first-element": "", + "extract-value-second-element": "" + } + }, "valid-paths": "Geldige paden:" }, + "get-transformer-option-pane": { + "root": { + "title": { + "root": "" + } + } + }, "group-by-field-configuration": { "placeholder-ignored": "Genegeerd", "placeholder-select-stats": "Selecteer statistieken" @@ -8939,7 +10755,23 @@ "label-cell-value": "Celwaarde", "label-column": "Kolom", "label-empty-value": "Lege waarde", - "label-row": "Rij" + "label-row": "Rij", + "special-value-options": { + "description": { + "boolean-false-value": "", + "boolean-true-value": "", + "empty-string": "", + "null-value": "", + "number-value": "" + }, + "label": { + "empty": "Leeg", + "false": "", + "null": "", + "true": "", + "zero": "" + } + } }, "histogram-transformer-editor": { "placeholder-auto": "Automatisch", @@ -9002,10 +10834,22 @@ "tooltip-naming": "Stelt in hoe de namen van de geselecteerde velden worden weergegeven. Omdat framenaam meestal beter is voor tabelgegevens" }, "partition-by-values-editor": { + "keep-fields-options": { + "label": { + "no": "Nee", + "yes": "Ja" + } + }, "label-field": "Veld", "label-keep-fields": "Velden behouden", "label-naming": "Benoemen", "label-select-field": "Veld selecteren", + "naming-modes-options": { + "label": { + "as-frame-name": "", + "as-label": "" + } + }, "partition-values-works-single-frame": "Scheiding op waarden werkt alleen met een enkel frame.", "tooltip-keeps-partition-fields-frames": "Houdt de scheidingsvelden in de frames" }, @@ -9027,6 +10871,16 @@ "label-include-time": "Inclusief tijd", "label-labels-to-fields": "Labels naar velden", "label-mode": "Modus", + "modes": { + "description": { + "collapse-field-single-value": "", + "create-table-series-value": "" + }, + "label": { + "reduce-fields": "", + "series-to-rows": "" + } + }, "placeholder-choose-stat": "Statistieken kiezen" }, "regex-matcher-editor": { @@ -9034,11 +10888,23 @@ "variable-regex-documentation": "" }, "regression-transformer-editor": { + "label": { + "cubic": "", + "quadratic": "", + "quartic": "", + "quintic": "" + }, "label-degree": "Graad", "label-model-type": "Modeltype", "label-predicted-points": "Voorspelde punten", "label-x-field": "X-veld", "label-y-field": "Y-veld", + "model-type-options": { + "label": { + "linear": "", + "polynomial": "" + } + }, "tooltip-number-of-xy-points-to-predict": "Aantal X-,Y-punten om te voorspellen" }, "rename-by-regex-transformer-editor": { @@ -9056,6 +10922,23 @@ "label-reverse": "Omkeren", "placeholder-select-field": "Veld selecteren" }, + "supplier": { + "description": { + "apply-spatial-operations-to-the-geometry": "", + "create-a-line-between-two-points": "", + "geometry-define-field-headingdistancearea": "" + }, + "label": { + "area": "", + "as-line": "", + "calculate-value": "", + "distance": "", + "heading": "", + "line-builder": "", + "prepare-spatial-field": "", + "transform": "" + } + }, "time-series-table-transform-editor": { "label-stat": "Stat", "label-time-field": "Tijdveld", @@ -9089,7 +10972,19 @@ "placeholder-auto": "Automatisch", "placeholder-field": "Veld", "tooltip-window-size": "Venstergrootte", - "tooltip-window-size-percent": "Stel de venstergrootte in als een percentage van de totale gegevens" + "tooltip-window-size-percent": "Stel de venstergrootte in als een percentage van de totale gegevens", + "type-options": { + "label": { + "centered": "", + "trailing": "" + } + }, + "window-size-mode-options": { + "label": { + "fixed": "", + "percentage": "" + } + } } }, "upgrade-box": { @@ -9146,6 +11041,11 @@ }, "users-action-bar-unconnected": { "invite": "Uitnodigen", + "options": { + "label": { + "users": "Gebruikers" + } + }, "placeholder-search-login-email": "Gebruiker zoeken op login, e-mailadres of naam" } }, @@ -9189,6 +11089,32 @@ "confirm-delete-modal": { "title-delete-variable": "Variabele verwijderen" }, + "create-ad-hoc-variable-adapter": { + "description": { + "add-keyvalue-filters-on-the-fly": "" + } + }, + "create-custom-variable-adapter": { + "description": { + "define-variable-values-manually": "" + } + }, + "create-interval-variable-adapter": { + "description": { + "define-timespan-interval": "" + } + }, + "create-query-variable-adapter": { + "description": { + "variable-values-fetched-datasource-query": "" + } + }, + "data-source-variable-slice": { + "text": { + "default": "", + "no-data-sources-found": "Geen gegevensbronnen gevonden" + } + }, "empty-state": { "button-title": "Variabele toevoegen", "info-box-content": "Variabelen maken meer interactieve en dynamische dashboards mogelijk. In plaats van dingen zoals servernamen of sensornamen hard te coderen in je metrische query's, kun je in plaats daarvan variabelen gebruiken. Variabelen worden weergegeven als keuzelijsten bovenaan het dashboard. Met deze vervolgkeuzelijsten kun je eenvoudig de gegevens wijzigen die in je dashboard worden weergegeven.", @@ -9215,6 +11141,13 @@ "placeholder-default-value-if-any": "standaardwaarde, indien aanwezig", "text-options": "Tekstopties" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "unknown-table": { "loading": "Bezig met laden ...", "no-unknowns": "Geen hernoemde of ontbrekende variabelen gevonden.", @@ -9271,5 +11204,25 @@ "data-hover-view": { "link": "Koppelen" } + }, + "welcome": { + "welcome-banner": { + "need-help": "Hulp nodig?", + "welcome-to-grafana": "" + } + }, + "xychart": { + "series-editor": { + "add-series": "", + "aria-label-select-series": "", + "label-color-field": "", + "label-frame": "Frame", + "label-size-field": "", + "label-x-field": "X-veld", + "label-y-field": "Y-veld", + "placeholder-all-frames": "", + "placeholder-select-frame": "", + "tooltip-delete-series": "" + } } } \ No newline at end of file diff --git a/public/locales/pl-PL/grafana.json b/public/locales/pl-PL/grafana.json index 7cf9b850e86..7b1f0d1ce8e 100644 --- a/public/locales/pl-PL/grafana.json +++ b/public/locales/pl-PL/grafana.json @@ -72,6 +72,11 @@ }, "admin-edit-org-page": { "label-name": "Nazwa", + "page-nav": { + "subTitle": { + "manage-settings-roles-organization": "" + } + }, "render-missing-permission-message": { "title-access-denied": "Odmowa dostępu" } @@ -233,6 +238,13 @@ "upgrade-info": { "title": "Licencja Enterprise" }, + "user-admin-page": { + "page-nav": { + "subTitle": { + "manage-settings-for-an-individual-user": "" + } + } + }, "user-create-page": { "label-email": "E-mail", "label-name": "Nazwa", @@ -243,9 +255,16 @@ "label-ldap": "LDAP" }, "user-list-admin-page-un-connected": { + "label": { + "active-last-days": "", + "all-users": "Wszyscy użytkownicy" + }, "placeholder-search-login-email": "Wyszukaj użytkownika według loginu, adresu e-mail lub imienia i nazwiska." }, "user-list-anonymous-devices-page-un-connected": { + "label": { + "active-last-days": "" + }, "placeholder-search-devices-by-ip-address": "Wyszukaj urządzenia według adresu IP." }, "user-list-page": { @@ -364,6 +383,12 @@ "no-grouping": "Brak grupowania" }, "alert-group-alerts-table": { + "columns": { + "label": { + "instance-labels": "", + "notification-state": "Stan powiadomienia" + } + }, "duration": "przez {{time}}" }, "alert-group-filter": { @@ -451,6 +476,11 @@ "description-section": "Podaj nazwę, aby zidentyfikować: {{entityName}}.", "label-metric": "Metryka", "label-name": "Imię", + "message": { + "must-enter-a-metric-name": "", + "must-enter-a-name": "", + "please-select-a-data-source": "Wybierz źródło danych" + }, "metric-aria-label-metric": "metryka", "metric-placeholder-recorded-metric": "Podaj nazwę nowo zarejestrowanej metryki", "placeholder-name": "Nadaj nazwę metryce {{namePlaceholder}}", @@ -503,6 +533,9 @@ "alertmanager-config": { "gma-manual-configuration-description": "Nie można ręcznie zmienić wewnętrznej konfiguracji menedżera alertów Grafany. Aby zmienić tę konfigurację, edytuj poszczególne zasoby z poziomu interfejsu użytkownika.", "gma-manual-configuration-is-not-supported": "Ręczne zmiany konfiguracji nie są obsługiwane", + "message": { + "configuration-cannot-be-empty": "" + }, "reset": "Zresetuj", "reset-confirmation": "Na pewno chcesz zresetować konfigurację menedżera alertów „{{alertmanagerName}}”? Punkty kontaktu i zasady dotyczące powiadomień zostaną zresetowane do wartości domyślnych.", "resetting-configuration-might-while": "Resetowanie konfiguracji, może to chwilę potrwać.", @@ -592,6 +625,9 @@ "create-a-contact-point": "Utwórz punkt kontaktu", "label-default-contact-point": "Domyślny punkt kontaktu", "label-timing-options": "Opcje harmonogramu", + "message": { + "required": "" + }, "or": "lub" }, "am-routes-expanded-form": { @@ -613,11 +649,19 @@ "label-override-grouping": "Zastąp grupowanie", "label-value": "Wartość", "matching-labels": "Pasujące etykiety", + "message": { + "required": "" + }, "placeholder-label": "etykieta", "placeholder-value": "wartość", "remove": "Usuń", "tooltip-remove-matcher": "Usuń kryterium dopasowania" }, + "annotation-header-field": { + "message": { + "required": "" + } + }, "annotations": { "dashboard-annotation-field": { "dashboard": "Pulpit {{dashboardUid}}", @@ -689,6 +733,25 @@ "title": "Nie można wyświetlić wszystkich zdarzeń" } }, + "central-alert-history-scene": { + "scene": { + "labels-filter-variable": { + "label": { + "labels": "" + } + }, + "transitions-from-filter-variable": { + "label": { + "start-state": "" + } + }, + "transitions-to-filter-variable": { + "label": { + "end-state": "" + } + } + } + }, "channel-sub-form": { "delete": "Usuń", "duplicate": "Duplikuj", @@ -725,11 +788,17 @@ }, "cloud-data-source-selector": { "label": "Wybierz źródło danych", - "label-disabled": "Źródło danych" + "label-disabled": "Źródło danych", + "message": { + "please-select-a-data-source": "Wybierz źródło danych" + } }, "cloud-evaluation-behavior": { "description-pending-period": "Okres, w którym musi zostać spełniony warunek progowy, aby uruchomić alert. Wybranie opcji „Brak” uruchamia alert natychmiast po spełnieniu warunku.", "label-pending-period": "Okres oczekiwania", + "message": { + "must-be-a-positive-integer": "" + }, "title-set-evaluation-behavior": "Ustaw postępowanie dotyczące oceny" }, "cloud-receiver-form": { @@ -770,6 +839,9 @@ "contact-point-selector": { "aria-label-refresh-contact-points": "Odśwież punkty kontaktu", "contact-point-picker-label-contact-point": "Punkt kontaktowy", + "message": { + "contact-point-is-required": "" + }, "title-failed-to-fetch-contact-points": "Nie udało się pobrać punktów kontaktu", "tooltip-refresh-contact-points-list": "Odśwież listę punktów kontaktu" }, @@ -840,6 +912,14 @@ }, "copy-to-clipboard": "Kopiuj „{{label}}” do schowka", "create-metadata": { + "label": { + "dashboard": "Pulpit", + "dashboard-and-panel": "", + "evaluation-interval": "Interwał oceny", + "labels": "Etykiety", + "metric-name": "", + "runbook-url": "" + }, "view-dashboard": "Wyświetl pulpit", "view-panel": "Wyświetl panel" }, @@ -880,9 +960,6 @@ "title-search-panel": "Szukaj panelu", "title-select-dashboard-and-panel": "Wybierz pulpit i panel" }, - "data-source-section": { - "import-to-grafana": "Importuj do reguł Grafany" - }, "datasource-not-found": { "card-description": "Nie znaleziono źródła danych dla tego zapytania. Zostało ono usunięte lub jest nieprawidłowo zainstalowane.", "remove-query": "Usuń zapytanie", @@ -964,6 +1041,11 @@ "text-loading-template": "Wczytywanie szablonu…", "title-failed-to-fetch-notification-template": "Nie udało się pobrać szablonu powiadomienia" }, + "edit-mute-timing-page": { + "text": { + "edit-time-interval": "" + } + }, "editor": { "edit-alert-rule": "", "edit-recording-rule": "", @@ -977,6 +1059,11 @@ "error-summary-button": { "content-show-all-errors": "" }, + "evaluate-every-validation-options": { + "message": { + "required": "" + } + }, "evaluation-behavior-summary": { "evaluate": "", "label-evaluate": "Oceń", @@ -994,6 +1081,9 @@ "evaluation-group-creation-modal": { "description-group-name": "Grupa ocenia wszystkie reguły w tym samym odstępie czasu oceny.", "description-often-rules-group-evaluated": "Jak często oceniane są wszystkie reguły w grupie.", + "message": { + "required": "" + }, "placeholder-enter-a-name": "Podaj nazwę", "title-new-evaluation-group": "Nowa grupa oceny" }, @@ -1016,12 +1106,24 @@ "title-permission-editrecreate-silence": "Nie masz uprawnień do edycji/odtworzenia tego okresu wyciszenia", "title-silence-not-found": "Nie znaleziono istniejącego okresu wyciszenia „{{silenceId}}”" }, + "existing-silence-editor-page": { + "page-nav": { + "text": { + "edit-silence": "" + } + } + }, "export": { "subtitle": { "formats": "Wybierz format i pobierz plik lub skopiuj zawartość do schowka", "one-format": "Pobierz plik lub skopiuj zawartość do schowka" } }, + "export-new-grafana-rule-page": { + "text": { + "export-new-grafana-rule": "" + } + }, "export-new-rule-button": { "tooltip-export-new-grafana-rule": "Eksportuj nową regułę Grafany" }, @@ -1047,6 +1149,16 @@ "no-data": "Brak danych", "page-counter": "" }, + "feature-toggle-page": { + "nav-model": { + "subTitle": { + "enable-alerting-grafana-config": "" + }, + "text": { + "alerting-is-not-enabled": "" + } + } + }, "federated-rule-warning": { "experimental": "Sfederowane grupy reguł to obecnie funkcja eksperymentalna.", "read-documentation": "Zapoznaj się z dokumentacją", @@ -1054,6 +1166,13 @@ }, "file-export-inline-documentation": { "api-provisioning": "Format {{name}} jest prawidłowy tylko w przypadku aprowizacji za pomocą interfejsu API. <3>Więcej informacji znajdziesz w dokumentach.</3>", + "export-inline-doc": { + "title": { + "apiprovisioning-format": "", + "fileprovisioning-format": "", + "terraformprovisioning-format": "" + } + }, "file-provisioning": "Format {{name}} jest prawidłowy tylko w przypadku aprowizacji za pomocą pliku. <3>Więcej informacji znajdziesz w dokumentach.</3>", "terraform-provisioning": "Format {{name}} jest prawidłowy tylko w przypadku aprowizacji za pomocą Terraform. <3>Więcej informacji znajdziesz w dokumentach.</3>" }, @@ -1061,6 +1180,20 @@ "copy-code": "Kopiuj kod", "download": "Pobierz" }, + "filter-options": { + "label": { + "alert-rule": "Reguła alertu", + "all": "Wszystkie", + "error": "Błąd", + "firing": "", + "no-data": "Brak danych", + "normal": "Normalny", + "ok": "OK", + "pending": "Oczekujący", + "recording-rule": "Reguła rejestracji", + "recovering": "Przywracanie" + } + }, "filter-view-results": { "aria-label-filteredrulelist": "filtrowana lista reguł" }, @@ -1095,7 +1228,10 @@ } }, "folder-selector": { - "description-select-folder": "Wybierz folder, w którym będzie przechowywana reguła." + "description-select-folder": "Wybierz folder, w którym będzie przechowywana reguła.", + "message": { + "select-a-folder": "" + } }, "folderAndGroup": { "evaluation": { @@ -1110,15 +1246,88 @@ "for-input": { "description-pending": "Okres, w którym musi zostać spełniony warunek progowy, aby uruchomić alert. Wybranie opcji „Brak” uruchamia alert natychmiast po spełnieniu warunku." }, + "for-validation-options": { + "message": { + "required": "" + } + }, "generate-alert-data-modal": { "add-alert-data": "Dodaj dane alertu", "add-alert-data-to-payload": "Dodaj dane alertu do ładunku", + "alert-options": { + "label": { + "firing": "", + "resolved": "" + } + }, "review-alert-payload": " Przejrzyj dane alertu, które chcesz dodać do ładunku:", "title-add-custom-alerts": "Dodaj alerty niestandardowe" }, + "get-alert-suggestions": { + "documentation": { + "annotations-attached-alert": "", + "fingerprint-identify-alert": "", + "grafana-external-alertmanager": "", + "organization-alert": "", + "time-the-alert-started-firing": "" + }, + "value": { + "labels-attached-alert": "", + "status-alert-firing-resolved": "" + } + }, + "get-cloud-scenes": { + "title": { + "mimir-alertmanager": "" + } + }, + "get-global-suggestions": { + "value": { + "an-array-containing-all-alerts": "" + } + }, + "get-grafana-alertmanager-scenes": { + "title": { + "grafana-alertmanager": "" + } + }, + "get-grafana-managed-scenes": { + "title": { + "grafanamanaged-alert-rules": "Reguły alertów zarządzane przez usługę Grafana" + } + }, + "get-mimir-managed-rules-per-group-scenes": { + "rule-group-handler": { + "label": { + "rule-group": "" + } + }, + "title": { + "mimirmanaged-alert-rules-per-rule-group": "" + } + }, + "get-mimir-managed-rules-scenes": { + "title": { + "mimirmanaged-alert-rules": "" + } + }, "get-preview-results": { "title-error": "Błąd" }, + "get-state-display-model": { + "text": { + "alerting": "", + "error": "", + "firing": "", + "inactive": "", + "no-data": "", + "ok": "OK", + "paused": "", + "pending": "", + "recovering": "", + "unknown": "" + } + }, "getting-stared": { "learn-more": "Praktyczne wprowadzenie znajdziesz w naszym <2>samouczku dotyczącym rozpoczynania pracy z usługą Grafana Alerting</2>" }, @@ -1160,6 +1369,10 @@ "label-disable-resolved-message": "Wyłącz rozwiązaną wiadomość" }, "grafana-evaluation-behavior-step": { + "message": { + "must-be-a-positive-integer": "", + "must-enter-a-group-name": "" + }, "missing-series-resolve-placeholder": "Domyślnie: 2", "or": "lub", "placeholder-select-an-evaluation-group": "Wybierz grupę oceny…", @@ -1176,6 +1389,11 @@ "body-invalid-rule-id": "Identyfikator UID reguły w adresie URL strony jest nieprawidłowy. Sprawdź adres URL i spróbuj ponownie.", "title-invalid-rule-id": "Nieprawidłowy identyfikator reguły" }, + "grafana-modify-export-page": { + "text": { + "modify-export": "" + } + }, "grafana-mute-timing-exporter-preview": { "text-loading": "Ładowanie…" }, @@ -1228,6 +1446,9 @@ }, "group-and-namespace-fields": { "group-picker-label-group": "Grupa", + "message": { + "required": "" + }, "namespace-picker-label-namespace": "Przestrzeń nazw" }, "group-by": { @@ -1284,14 +1505,19 @@ "header": { "tooltip-remove": "Usuń wyrażenie „{{refId}}”" }, + "history-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "Powodzenie" + } + }, "home": { "label-get-started": "Rozpocznij", "label-insights": "Analizy", "title-alerting": "Alerty" }, - "import-from-dsrules": { - "description-folder-import-rules": "Folder, do którego zostaną zaimportowane reguły" - }, "import-to-gma": { "action-button": "Importuj", "additional-settings": "Ustawienia dodatkowe", @@ -1299,8 +1525,9 @@ "confirm-modal": { "confirm": "Importuj", "loading": "Ładowanie…", - "loading-body": "Trwa przygotowywanie danych do zaimportowania. Może to chwilę potrwać…", + "loading-body": "", "no-rules-body": "Brak reguł do zaimportowania. Wybierz inną przestrzeń nazw lub grupę reguł.", + "no-rules-body-yaml": "", "no-rules-title": "Brak reguł do zaimportowania", "plugin-rules-warning": { "text": "Wykryliśmy, że niektóre reguły są zarządzane przez wtyczki. Reguły te nie zostaną zaimportowane.", @@ -1319,11 +1546,12 @@ "label": "Grupa" }, "import-location-and-filters": "Importuj lokalizację i filtry", + "import-source": "", "namespace": { "description": "Wpisz, aby wyszukać istniejącą przestrzeń nazw", "label": "Przestrzeń nazw" }, - "pageTitle": "Importowanie reguł alertów ze źródła danych do reguł zarządzanych przez Grafanę", + "pageTitle": "", "pause": { "label": "Wstrzymaj zaimportowane reguły alertów" }, @@ -1331,10 +1559,26 @@ "label": "Wstrzymaj zaimportowane reguły rejestracji" }, "recording-rules": "Reguły rejestracji", + "source": { + "datasource": "", + "datasource-description": "", + "yaml": "", + "yaml-description": "" + }, "success": "Reguły alertów zostały zaimportowane do reguł zarządzanych przez Grafanę.", "target-folder": { + "description": "Folder, do którego zostaną zaimportowane reguły", "label": "Katalog docelowy" - } + }, + "yaml": { + "description": "", + "label": "", + "required-message": "", + "target-datasource": "Docelowe źródło danych", + "target-datasource-description": "", + "target-datasource-required": "" + }, + "yaml-error": "" }, "insights": { "monitor-status-of-system": "Monitoruj stan systemu", @@ -1410,6 +1654,9 @@ "text-loading-existing-labels": "Wczytywanie istniejących etykiet" }, "labels-without-suggestions": { + "message": { + "required": "" + }, "placeholder-key": "klucz", "placeholder-value": "wartość" }, @@ -1451,6 +1698,24 @@ "log-record-viewer-by-timestamp": { "aria-label-state-history-by-timestamp": "Historia stanu według sygnatury czasowej" }, + "log-timeline-viewer": { + "label": { + "firing": "", + "mixed": "", + "no-data": "", + "normal": "Normalny", + "pending": "Oczekujący", + "recovering": "Przywracanie" + } + }, + "loki-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "Powodzenie" + } + }, "loki-state-history": { "clear-filters": "Wyczyść filtry", "common-labels": "Częste etykiety", @@ -1463,6 +1728,14 @@ "button": "Zarządzaj uprawnieniami", "title": "Zarządzaj uprawnieniami" }, + "manual-and-automatic-routing": { + "routing-options": { + "label": { + "select-contact-point": "", + "use-notification-policy": "" + } + } + }, "matcher-filter": { "filter-alerts-using-label-querying-without-braces": "Filtruj alerty za pomocą zapytania o etykiety bez nawiasów klamrowych, np.:", "filter-alerts-using-label-querying-without-spaces": "Filtruj alerty za pomocą zapytania o etykiety bez spacji, na przykład:", @@ -1480,6 +1753,9 @@ "label-operator": "Operator", "label-refine-affected-alerts": "Doprecyzuj alerty", "label-value": "Wartość", + "message": { + "required": "" + }, "placeholder-label": "etykieta", "placeholder-value": "wartość", "remove": "Usuń", @@ -1511,6 +1787,16 @@ "aria-label": "Więcej", "button-text": "Więcej" }, + "multiple-data-source-picker": { + "get-data-source-options": { + "grouped-options": { + "label": { + "data-sources-with-configured-alert-rules": "", + "other-data-sources": "" + } + } + } + }, "mute-timing-actions-buttons": { "text-disabled": "Wyłączone", "title-delete-mute-timing": "Usuń harmonogram wyciszenia" @@ -1574,11 +1860,26 @@ "read-more": "Zapoznaj się z zasadami dotyczącymi powiadomień.", "title-notification-routing": "Przekierowanie powiadomień" }, + "new-mute-timing-page": { + "text": { + "add-time-interval": "" + } + }, "new-rule-from-panel-button": { "body-no-alerting-capable-query-found": "Nie można utworzyć alertów z tego panelu, ponieważ nie znaleziono zapytania do źródła danych obsługującego alerty.", "new-alert-rule": "Nowa reguła alertu", "title-no-alerting-capable-query-found": "Nie znaleziono zapytania obsługującego alerty" }, + "new-silence-page": { + "page-nav": { + "subTitle": { + "configure-silences-notifications-particular-alert": "" + }, + "text": { + "silence-alert-rule": "Wycisz regułę alertu" + } + } + }, "no-alert-managers-available": { "body-no-alertmanager-found": "Nie udało się znaleźć zewnętrznych menedżerów alertów i możesz nie mieć dostępu do wbudowanego menedżera alertów Grafany.", "title-no-alertmanager-found": "Nie znaleziono menedżera alertów" @@ -1809,6 +2110,9 @@ "expressions": "Wyrażenia", "loading-data-sources": "Wczytywanie źródeł danych…", "manipulate-returned-queries-other-operations": "Manipulowanie danymi zwracanymi z zapytań za pomocą działań matematycznych i innych operacji.", + "message": { + "a-valid-expression-is-required": "" + }, "no-compatible-sources": "Wygląda na to, że nie masz zgodnych źródeł danych", "title-deactivate-advanced-options": "Wyłącz opcje zaawansowane", "title-queries-expressions-configured": "Nie skonfigurowano żadnych zapytań ani wyrażeń" @@ -1860,7 +2164,8 @@ }, "recording-rules": { "description-target-data-source": "Źródło danych Prometheus, w którym mają być przechowywane reguły rejestrowania", - "label-target-data-source": "Docelowe źródło danych" + "label-target-data-source": "Docelowe źródło danych", + "target-data-source-required": "" }, "recording-rules-name-space-and-group-step": { "description-select-namespace-group-recording": "Wybierz przestrzeń nazw i grupę dla reguły rejestrowania.", @@ -2127,6 +2432,9 @@ "collapse-all": "Zwiń wszystko", "expand-all": "Rozwiń wszystko" }, + "rule-list-v2": { + "import-to-gma": "" + }, "rule-modify-export": { "text-loading-the-rule": "Wczytywanie reguły…", "title-cannot-exist": "Nie można wczytać reguły. Reguła nie istnieje", @@ -2206,6 +2514,10 @@ "label-saved-searches": "Zapisane wyszukiwania" }, "health": "Zdrowie", + "label": { + "hide": "Ukryj", + "show": "Pokaż" + }, "manage-alerts": "W tych źródłach danych możesz wybrać „Zarządzaj alertami za pośrednictwem interfejsu alertów”, aby móc zarządzać tymi regułami alertów w interfejsie Grafany, a także w źródle danych, w którym zostały skonfigurowane.", "placeholder-all-data-sources": "Wszystkie źródła danych", "plugin-rules": "Reguły dotyczące wtyczek", @@ -2302,6 +2614,9 @@ "label-comment": "Uwagi", "label-created-by": "Utworzone przez", "label-duration": "Czas trwania", + "message": { + "required": "" + }, "placeholder-whos-creating-the-silence": "Kto tworzy wyciszenie", "save-silence": "Zapisz okres wyciszenia", "saving": "Zapisywanie…" @@ -2340,6 +2655,12 @@ "title-alert-rule-types": "Typy reguł alertów" }, "state-history": { + "columns": { + "label": { + "state": "Stan", + "time": "Czas" + } + }, "filter-group": "Filtruj grupę", "filter-group-tooltip": "Filtruj każdą grupę historii stanu według dopasowania dokładnego lub wyrażenia regularnego, na przykład:", "placeholder-search": "Szukaj", @@ -2379,6 +2700,9 @@ "label-examples-documentation": "Dokumentacja przykładów", "label-template-group": "Grupa szablonów", "label-template-group-name": "Nazwa grupy szablonów", + "message": { + "required": "" + }, "new-template-name-placeholder-give-your-template-group-a-name": "Nadaj nazwę grupie szablonów", "title-error-saving-template": "Błąd podczas zapisywania szablonu", "title-templating-cheat-sheet": "Wskazówki dotyczące szablonów" @@ -2401,6 +2725,11 @@ "existing-templates-selector-aria-label-choose-notification-template": "Wybierz szablon powiadomienia", "existing-templates-selector-placeholder-choose-notification-template": "Wybierz szablon powiadomienia", "loading": "Ładowanie…", + "template-options": { + "label": { + "select-notification-template": "" + } + }, "tooltip-copy": "Skopiuj wybrany szablon powiadomienia do schowka. Możesz go użyć na karcie niestandardowej." }, "templates": { @@ -2503,10 +2832,39 @@ } }, "use-columns": { + "columns": { + "label": { + "alert-rule-targeted": "", + "alerts-silenced": "", + "health": "Zdrowie", + "matching-labels": "Pasujące etykiety", + "name": "Imię", + "schedule": "Harmonogram", + "state": "Stan", + "time-range": "Zakres czasu" + } + }, + "label": { + "actions": "Działania", + "created": "Utworzono", + "group": "Grupa", + "labels": "Etykiety", + "next-evaluation": "Następna ocena", + "state": "Stan", + "summary": "Podsumowanie" + }, "title-edit": "Edytuj", "title-recreate": "Utwórz ponownie", "title-unsilence": "Usuń wyciszenie" }, + "use-combined-labels": { + "grouped-options": { + "label": { + "from-alerts": "", + "from-system": "" + } + } + }, "use-create-dropdown-menu-actions": { "label-delete": "Usuń", "label-edit": "Edytuj", @@ -2540,6 +2898,17 @@ "title-edit-notification-policy": "Edytuj zasady dotyczące powiadomień" } }, + "use-page-nav": { + "page-nav": { + "text": { + "details": "Szczegóły", + "history": "Historia", + "instances": "Instancje", + "query-and-conditions": "", + "versions": "Wersje" + } + } + }, "use-state-history-modal": { "state-history-modal": { "title-state-history": "Pokaż historię stanu" @@ -2560,6 +2929,36 @@ "body": "Treść YAML w edytorze zawiera tylko konfigurację reguły alertu. <1></1>Aby skonfigurować usługę Prometheus, musisz podać resztę <4>zawartości pliku konfiguracyjnego.</4>" } }, + "alertlist": { + "group-by": { + "aria-label-group-by-label-keys": "", + "placeholder-group-by": "Grupuj według" + }, + "ungrouped-mode-view": { + "active-for": "", + "aria-label-view-alert-rule": "", + "view-alert-rule": "" + }, + "unified-alert-list": { + "clear": "Wyczyść", + "text-loading": "Ładowanie…" + }, + "unified-alert-list-panel": { + "body-permission-required": "", + "title-permission-required": "" + } + }, + "annolist": { + "anno-list-panel": { + "aria-label-remove-filter": "", + "filter": "", + "loading": "Ładowanie…", + "no-annotations-found": "" + }, + "annotation-list-item": { + "tooltip-created-by": "" + } + }, "annotations": { "annotation-field-mapper": { "annotation": "Adnotacja", @@ -2656,6 +3055,11 @@ "configuration-required": "Wymagana konfiguracja", "refer-documentation-configure-authentication": "Zapoznaj się z dokumentacją, aby skonfigurować uwierzytelnianie" }, + "field-map": { + "label": { + "none": "Brak" + } + }, "fields": { "allow-assign-grafana-admin-description": "", "allow-assign-grafana-admin-label": "", @@ -2759,7 +3163,18 @@ "use-refresh-token-description": "", "use-refresh-token-label": "", "validate-hosted-domain-description": "", - "validate-hosted-domain-label": "" + "validate-hosted-domain-label": "", + "workload-identity-token-file-description": "", + "workload-identity-token-file-label": "", + "workload-identity-token-file-required": "" + }, + "get-page-nav": { + "subTitle": { + "configure-authentication-providers": "" + }, + "text": { + "authentication": "Uwierzytelnienie" + } }, "provider-card": { "text-badge-enabled": "Włączone", @@ -2795,6 +3210,12 @@ "auth-config-auth-config-page-unconnected": { "subtitle": "Zarządzaj ustawieniami uwierzytelniania i skonfiguruj logowanie jednokrotne. Więcej informacji znajdziesz w <2>dokumentacji</2>." }, + "barchart": { + "tick-spacing-editor": { + "content-require-space-from-the-right-side": "", + "label-rtl": "" + } + }, "bookmarks-page": { "empty": { "message": "Wygląda na to, że nie utworzono jeszcze żadnych zakładek", @@ -2933,11 +3354,199 @@ "text-this-repository-is-read-only": "Jeśli masz bezpośredni dostęp do celu, skopiuj kod JSON i wklej go tam." }, "canvas": { + "apieditor": { + "label-endpoint": "", + "label-header-parameters": "", + "label-method": "Metoda", + "label-payload": "Ładunek", + "label-query-parameters": "Parametry zapytania", + "render-test-apibutton": { + "test-api": "", + "title-test-api": "" + } + }, + "button-item": { + "label": { + "center": "", + "left": "", + "right": "" + }, + "placeholder": { + "auto": "Automatycznie" + } + }, + "button-style-editor": { + "label-variant": "Wariant" + }, + "canvas-context-menu": { + "close-editor": "", + "open-editor": "", + "render-menu-items": { + "add-item-menu-item": { + "label-add-item": "" + }, + "edit-element-menu-item": { + "label-edit": "Edytuj" + }, + "label-bring-to-front": "", + "label-delete": "Usuń", + "label-duplicate": "Duplikuj", + "label-send-to-back": "", + "set-background-menu-item": { + "label-set-background": "" + } + } + }, + "cloud-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automatycznie" + } + }, + "ellipse-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automatycznie" + } + }, + "inline-edit": { + "canvas-inline-editor": "", + "tooltip-close-inline-editor": "" + }, + "inline-edit-body": { + "label-add-item": "", + "please-select-an-element": "" + }, + "line-style-editor": { + "label-animate": "" + }, + "metric-value-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automatycznie" + } + }, "not-found-display": { "not-found": "<0>Nie znaleziono: </0><config />" }, + "pan-zoom-help": { + "ctrl-right-mouse": "", + "middle-mouse": "", + "pan-title": "", + "reset-double-click": "", + "title-pan-and-zoom-controls": "", + "zoom-scroll-wheel": "" + }, + "parallelogram-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automatycznie" + } + }, + "params-editor": { + "aria-label-add": "Dodaj", + "aria-label-delete": "Usuń", + "placeholder-key": "Klucz", + "placeholder-value": "Wartość" + }, + "placement-editor": { + "label-constraints": "", + "label-position": "", + "loading": "Ładowanie…" + }, + "quick-positioning": { + "tooltip-align-bottom": "", + "tooltip-align-horizontal-centers": "", + "tooltip-align-left": "", + "tooltip-align-right": "", + "tooltip-align-top": "", + "tooltip-align-vertical-centers": "" + }, + "rectangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automatycznie" + } + }, "text-display": { "double-click-to-set": "Kliknij dwukrotnie, aby ustawić tekst" + }, + "text-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automatycznie" + } + }, + "tree-navigation-editor": { + "clear-selection": "Usuń zaznaczone", + "frame-selection": "", + "label-add-item": "", + "missing-layer": "", + "no-settings": "", + "switcher-icon": { + "title-node-icon": "" + } + }, + "tree-node-title": { + "title-duplicate": "Duplikuj", + "title-remove": "Usuń", + "tooltip-duplicate": "Duplikuj", + "tooltip-remove": "Usuń" + }, + "triangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automatycznie" + } } }, "carousel": { @@ -3017,6 +3626,22 @@ } }, "connections": { + "add-new-connection": { + "filter-by-options": { + "label": { + "all": "Wszystkie", + "installed": "Zainstalowane", + "new-updates": "" + } + }, + "label": { + "by-downloads": "", + "by-name-az": "", + "by-name-za": "", + "by-published-date": "", + "by-updated-date": "" + } + }, "advisor-redirect-notice": { "aria-label-link-to-advisor": "Link do modułu doradcy", "body": "Wypróbuj nową funkcję doradcy, aby odkryć potencjalne problemy ze źródłami danych i wtyczkami.", @@ -3033,6 +3658,22 @@ "body": "Źródła danych są dostępne w nowym miejscu! Możesz odkrywać nowe źródła danych i zarządzać istniejącymi na stronie Połączenia dostępnej z menu głównego.", "go-to-connections": "Przejdź do strony Połączenia" }, + "data-source-details-page": { + "subTitle": { + "datasource-could-found": "" + }, + "text": { + "unknown-datasource": "" + } + }, + "new-data-source-page": { + "subTitle": { + "choose-a-data-source-type": "" + }, + "text": { + "add-data-source": "Dodaj źródło danych" + } + }, "no-access-modal": { "connection-contact-grafana-admin": "Aby dodać nowe połączenie, skontaktuj się z administratorem usługi Grafana.", "editor-warning": "Osoby z uprawnieniami do edycji nie mogą dodawać nowych połączeń. Możesz sprawdzić, czy zostało to już skonfigurowane w sekcji <2>Źródła danych</2>.", @@ -3045,6 +3686,18 @@ "search": { "aria-label-search-all": "Wyszukaj wszystkie", "placeholder": "Wyszukaj wszystkie" + }, + "use-data-source-settings-nav": { + "node": { + "subTitle": { + "data-source-error": "" + } + }, + "page-nav": { + "text": { + "data-source-nav-node": "" + } + } } }, "core": { @@ -3340,6 +3993,11 @@ "title-plugin-dashboard": "Pulpit wtyczek" }, "dash-nav": { + "on-open-snapshot-original": { + "title": { + "proceed-to-external-site": "" + } + }, "render-left-actions": { "text-public": "Publiczny", "tooltip-view-as-scene": "Wyświetl jako scenę" @@ -3351,11 +4009,26 @@ "dashboard-loading": { "cancel-loading-dashboard": "Anuluj wczytywanie pulpitu" }, + "dashboard-page-error": { + "text": { + "not-found": "Nie znaleziono" + } + }, "dashboard-settings": { "actions": { "close": "Zamknij" } }, + "dashboard-slice": { + "title": { + "dashboard-init-failed": "" + } + }, + "dashboard-srv": { + "message": { + "edit-dashboard-json": "" + } + }, "dashboard-validation": { "body-dashboard-failed-schema-validation": "Walidacja jest przeznaczona do celów związanych z tworzeniem oprogramowania i można ją bezpiecznie zignorować. Jeśli jesteś programistą Grafany, rozważ sprawdzenie i aktualizację schematu pulpitu", "title-checking-dashboard-validity": "Sprawdzanie prawidłowości pulpitu", @@ -3451,6 +4124,13 @@ "values": "Wartości rozdzielone przecinkami", "values-placeholder": "1, 10, mykey : myvalue, myvalue, escaped,value" }, + "datasource-options": { + "name-filter": "", + "name-filter-description": "", + "name-filter-placeholder": "", + "type": "Typ", + "type-placeholder": "" + }, "description": "Opis", "description-placeholder": "Tekst opisowy", "label": "Etykieta", @@ -3469,8 +4149,8 @@ "category": "Opcje wyboru", "custom-all-value": "Niestandardowe – wszystkie wartości", "custom-all-value-description": "Symbol wieloznaczny wyrażenia regularnego lub inna wartość reprezentująca „wszystkie”", - "include-all": "Opcja Uwzględnij wszystkie", - "include-all-description": "Włącza opcję uwzględniania wszystkich wartości", + "include-all": "", + "include-all-description": "", "multi-value": "Wiele wartości" }, "type-category": "Opcje typu {{type}}" @@ -3496,14 +4176,97 @@ "errors": { "failed-to-load": "Nie udało się załadować pulpitu" }, + "fetch-dashboard": { + "message": { + "failed-to-fetch-dashboard": "" + } + }, "gen-aihistory": { "aria-label-send-custom-feedback": "Prześlij niestandardową opinię", "footer-text": "Ta treść została wygenerowana przez sztuczną inteligencję za pomocą <2>wtyczki Grafana LLM</2>", "placeholder-tell-ai-what-to-do-next": "Powiedz AI, co ma teraz zrobić…" }, + "general-settings-unconnected": { + "editable-options": { + "label": { + "editable": "Możliwość edycji", + "readonly": "" + } + } + }, + "get-debug-dashboard": { + "title": { + "annotations": "Komentarze" + } + }, + "get-errors": { + "message": { + "error-loading-data": "" + } + }, "get-field-override-categories": { "label-add-field-override": "Dodaj zastąpienie pola", - "label-add-override-property": "Dodaj zastąpienie właściwości" + "label-add-override-property": "Dodaj zastąpienie właściwości", + "title": { + "add-button": "" + } + }, + "get-library-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "Informacje", + "name": "Imię" + } + }, + "get-library-viz-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "Informacje", + "name": "Imię" + } + }, + "get-panel-editor-tabs": { + "text": { + "alert": "", + "query": "Zapytanie", + "transform-data": "" + } + }, + "get-panel-frame-category": { + "descriptor": { + "title": { + "panel-options": "Opcje panelu" + } + }, + "direction-options": { + "label": { + "horizontal": "Poziomo", + "vertical": "Pionowo" + } + }, + "title": { + "description": "Opis", + "max-per-row": "Maks. na wiersz", + "panel-links": "Linki panelu", + "repeat-by-variable": "Powtórz według zmiennej", + "repeat-direction": "Powtórz kierunek", + "repeat-options": "Opcje powtarzania", + "title": "Tytuł", + "transparent-background": "Przezroczyste tło" + } + }, + "get-panel-menu": { + "text": { + "extensions": "" + } }, "help-wizard": { "copy-to-clipboard": "Kopiuj do schowka", @@ -3516,10 +4279,21 @@ "randomize-field-names-label-field-names": "Nazwy pól", "randomize-labels-label-labels": "Etykiety", "randomize-string-values-label-string-values": "Wartości ciągu znaków", + "tabs": { + "label": { + "data": "Dane", + "snapshot": "Migawka" + } + }, "title-complete-git-hub-comment-clipboard": "Kopiuj cały komentarz z GitHub do schowka", "title-get-help-with-this-panel": "Uzyskaj pomoc dotyczącą tego panelu", "troubleshooting-docs": "Dokumenty dotyczące rozwiązywania problemów" }, + "init-dashboard": { + "message": { + "failed-create-dashboard-model": "" + } + }, "inspect": { "data-tab": "Dane", "error-tab": "Błąd", @@ -3572,6 +4346,16 @@ "rows": "Łączna liczba wierszy", "table-title": "Statystyki" }, + "k8s-dashboard-api": { + "title": { + "deleted": "" + } + }, + "k8s-dashboard-v2api": { + "title": { + "deleted": "" + } + }, "layout": { "common": { "copy": "Kopiuj", @@ -3584,6 +4368,13 @@ "panel-layout-disabled": "Wybierz wiersz lub kartę, aby zmienić opcje układu panelu" } }, + "legacy-dashboard-api": { + "fetch-error": { + "message": { + "dashboard-not-found": "" + } + } + }, "make-editable": { "dashboard-not-editable": "Nie można edytować pulpitu", "make-editable": "Udostępnij do edycji" @@ -3603,6 +4394,20 @@ "menu-use-library-panel": "Użyj panelu biblioteki" }, "new-panel-title": "Nowy panel", + "on-create-new-row": { + "new-row": { + "title": { + "row-title": "" + } + } + }, + "on-create-new-widget-panel": { + "new-panel": { + "title": { + "widget-title": "" + } + } + }, "options": { "description": "Opis", "title-option": "Tytuł" @@ -3664,6 +4469,30 @@ "paused": "Ten pulpit został wstrzymany przez administratora", "try-again-later": "Spróbuj ponownie później" }, + "remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, + "repeat-row-select": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, + "repeat-row-select2": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, "revert-dashboard-modal": { "body-restore-version": "Czy na pewno chcesz przywrócić pulpit w wersji {{version}}? Wszystkie niezapisane zmiany zostaną utracone.", "title-restore-version": "Przywróć wersję" @@ -3777,6 +4606,18 @@ "sub-menu-un-connected": { "aria-label-template-variables": "Zmienne szablonu" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "tabs-layout": { "delete-tab-text": "Usunięcie tej karty spowoduje również usunięcie wszystkich paneli. Na pewno chcesz kontynuować?", "delete-tab-title": "Usunąć kartę?", @@ -3982,7 +4823,10 @@ }, "unthemed-dashboard-row": { "aria-label-delete-row": "Usuń wiersz", - "learn-more": "Dowiedz się więcej" + "learn-more": "Dowiedz się więcej", + "title": { + "delete-row": "Usuń wiersz" + } }, "validation": { "invalid-dashboard-id": "Nie można znaleźć prawidłowego identyfikatora Grafana.com", @@ -4017,6 +4861,16 @@ }, "visualization-select-pane": { "placeholder-search-for": "Szukaj…", + "radio-options": { + "description": { + "reusable-panels-share-between-multiple-dashboards": "" + }, + "label": { + "library-panels": "Panele biblioteki", + "suggestions": "", + "visualizations": "" + } + }, "title-close": "Zamknij" }, "viz-panel": { @@ -4067,12 +4921,25 @@ "label-data-source": "Źródło danych", "label-use-static-key-dimensions": "Użyj statycznych wymiarów klucza" }, + "add-to-dashboard": { + "message": { + "could-navigate-selected-dashboard-please-again": "", + "could-panel-dashboard-please-again": "" + } + }, "add-to-dashboard-form": { "cancel": "Anuluj", "description-choose-where-to-add-the-panel": "Wybierz, gdzie chcesz dodać panel.", "description-select-which-dashboard-panel-created": "Wybierz, na którym pulpicie zostanie utworzony panel.", + "label": { + "existing-dashboard": "Istniejący pulpit", + "new-dashboard": "Nowy pulpit" + }, "label-dashboard": "Pulpit", "label-target-dashboard": "Docelowy pulpit", + "message": { + "this-field-is-required": "To pole jest wymagane." + }, "open-dashboard": "Otwórz pulpit", "open-in-new-tab": "Otwórz w nowej karcie", "title-error-adding-the-panel": "Błąd dodawania panelu" @@ -4110,6 +4977,25 @@ "it-cannot-contain-or": "Nie może zawierać „//” ani „..”.", "least-valid-character": "Musi zawierać co najmniej jeden prawidłowy znak." }, + "build-new-dashboard-save-model": { + "data": { + "title": { + "new-dashboard": "Nowy pulpit" + } + } + }, + "build-new-dashboard-save-model-v2": { + "data": { + "title": { + "new-dashboard": "Nowy pulpit" + } + } + }, + "config-public-dashboard": { + "title": { + "revoke-public-url": "Cofnij upublicznienie URL" + } + }, "constant-variable-form": { "constant-options": "Opcje stałe", "label-value": "Wartość", @@ -4157,22 +5043,89 @@ "value-not-saved": "Wartość nie została jeszcze zapisana w bazie danych Grafana", "view-pull-request-in-git-hub": "Wyświetl pull request w GitHub" }, + "dashboard-scene": { + "text": { + "edit-panel": "", + "view-panel": "Wyświetl panel" + }, + "title": { + "dashboard": "Pulpit", + "discard-changes-to-dashboard": "" + } + }, + "dashboard-scene-page-state-manager": { + "message": { + "dashboard-not-found": "" + } + }, + "dashboard-scene-page-state-manager-v2": { + "message": { + "dashboard-not-found": "" + } + }, "data-source-variable-form": { "data-source-options": "Opcje źródła danych", "description-instance-name-filter": "Filtr wyrażeń regularnych, w przypadku których instancje źródeł danych należy wybrać z listy wartości zmiennych. Pozostaw puste dla wszystkich.", "example-instance-name-filter": "Przykład: <codeExample />", "selection-options": "Opcje wyboru" }, + "default-grid-layout-manager": { + "row": { + "title": { + "row-title": "" + } + } + }, "description-label": { "description": "Opis" }, + "edit-link-view": { + "edit-link-page-nav": { + "text": { + "edit-link": "Edytuj link" + } + } + }, "email-list": { "aria-label-emailmenu": "Menu przełączania konta e-mail" }, + "embedded-dashboard-test-page": { + "subTitle": { + "showing-dashboard-panel-tests-pie-chart": "" + }, + "text": { + "embedding-dashboard": "" + } + }, "empty-transformations-message": { "add-transformation": "Dodaj transformację" }, + "get-edit-options": { + "title": { + "column-options": "", + "row-height-options": "" + } + }, + "get-panel-frame-options": { + "descriptor": { + "title": { + "panel-options": "Opcje panelu" + } + }, + "title": { + "description": "Opis", + "panel-links": "Linki panelu", + "title": "Tytuł", + "transparent-background": "Przezroczyste tło" + } + }, + "get-workflow-options": { + "label": { + "push-to-a-new-branch": "" + } + }, "group-by-variable-form": { + "alert-not-supported": "", "description-enables-users-custom-values": "Umożliwia użytkownikom dodawanie niestandardowych wartości do listy", "description-provide-dimensions-as-csv-dimension-name-dimension-id": "Podaj wymiary jako wartości rozdzielone przecinkami: {{name}}, {{value}}", "group-by-options": "Grupuj według opcji", @@ -4191,6 +5144,12 @@ "randomize-field-names-label-field-names": "Nazwy pól", "randomize-labels-label-labels": "Etykiety", "randomize-string-values-label-string-values": "Wartości ciągu znaków", + "tabs": { + "label": { + "data": "Dane", + "snapshot": "Migawka" + } + }, "title-complete-git-hub-comment-clipboard": "Kopiuj cały komentarz z GitHub do schowka", "title-get-help-with-this-panel": "Uzyskaj pomoc dotyczącą tego panelu", "troubleshooting-docs": "Dokumenty dotyczące rozwiązywania problemów", @@ -4235,6 +5194,14 @@ "body-name-already-exists": "W wybranym folderze istnieje już pulpit o tej samej nazwie. Czy nadal chcesz zapisać ten pulpit?", "title-name-already-exists": "Nazwa już istnieje" }, + "on-remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, "panel-data-alerting-tab-rendered": { "alert": { "title-errors-loading-rules": "Błędy wczytywania reguł" @@ -4256,6 +5223,11 @@ "table-view-aria-label-toggletableview": "Przełącz widok tabeli", "table-view-label-table-view": "Widok tabeli" }, + "panel-editor": { + "text": { + "edit-panel": "" + } + }, "panel-editor-renderer": { "aria-label-open-options-pane": "Otwórz okno opcji", "tooltip-open-options-pane": "Otwórz okno opcji" @@ -4264,8 +5236,22 @@ "body-panel-plugin-not-loaded": "Upewnij się, że panel, który chcesz sprawdzić, jest widoczny i został wyświetlony przed otwarciem inspekcji.", "title-panel-plugin-not-loaded": "Nie załadowano wtyczki panelu" }, + "panel-menu-behavior": { + "async-func": { + "text": { + "extensions": "", + "metrics-drilldown": "" + } + } + }, "panel-viz-type-picker": { "placeholder-search-for": "Szukaj…", + "radio-options": { + "label": { + "suggestions": "", + "visualizations": "" + } + }, "title-close": "Zamknij" }, "provisioned-delete-modal": { @@ -4292,6 +5278,15 @@ "query-options": "Opcje zapytania", "selection-options": "Opcje wyboru" }, + "resource-export": { + "label": { + "classic": "", + "json": "JSON", + "v1-resource": "", + "v2-resource": "", + "yaml": "" + } + }, "revert-dashboard-modal": { "body-restore-version": "Czy na pewno chcesz przywrócić pulpit w wersji {{version}}? Wszystkie niezapisane zmiany zostaną utracone.", "title-restore-version": "Przywróć wersję" @@ -4402,6 +5397,18 @@ "solo-panel-page": { "loading": "Ładowanie" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "text-box-variable-form": { "placeholder-default-value-if-any": "(opcjonalnie)", "text-options": "Opcje tekstu" @@ -4412,6 +5419,13 @@ "title-field-label": { "title": "Tytuł" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "transformations-drawer": { "search-box-suffix": { "tooltip-clear-search": "Wyczyść wyszukiwanie" @@ -4427,6 +5441,13 @@ "save-dashboard": "Zapisz pulpit", "title-unsaved-changes": "Niezapisane zmiany" }, + "use-dashboard-edit-page-nav": { + "page-nav": { + "text": { + "settings": "Ustawienia" + } + } + }, "variable-check-indicator": { "aria-label-variable-referenced-dashboard": "Do tej zmiennej nie odwołuje się żadna zmienna ani pulpit.", "aria-label-variable-referenced-other-variables-dashboard": "Do tej zmiennej odwołują się inne zmienne lub pulpit.", @@ -4443,7 +5464,10 @@ "placeholder-descriptive-text": "Tekst opisowy", "placeholder-label-name": "Nazwa etykiety", "placeholder-variable-name": "Nazwa zmiennej", - "text-running-query": "Uruchamianie zapytania…" + "text-running-query": "Uruchamianie zapytania…", + "title": { + "delete-variable": "Usuń zmienną" + } }, "variable-editor-list": { "definition": "Definicja", @@ -4625,6 +5649,25 @@ "message": "Nie znaleziono źródeł danych" } }, + "datagrid": { + "add-column": { + "placeholder-column-name": "" + }, + "datagrid-context-menu": { + "render-context-menu-items": { + "label-clear-column": "", + "label-clear-row": "", + "label-remove-all-data": "", + "label-search": "Szukaj…" + }, + "render-header-menu-items": { + "label-clear-column": "", + "label-delete-column": "", + "label-rename-column": "", + "label-set-field-type": "" + } + } + }, "datasources": { "add-new-data-source-button": { "tooltip-no-permission": "Nie masz uprawnień do konfigurowania nowych źródeł danych" @@ -4646,6 +5689,46 @@ "label-default": "Domyślny", "label-name": "Imię" }, + "build-categories": { + "categories": { + "title": { + "cloud": "", + "distributed-tracing": "", + "enterprise-plugins": "Wtyczki Enterprise", + "industrial-io-t": "", + "logging-document-databases": "", + "others": "", + "profiling": "", + "sql": "", + "time-series-databases": "" + } + } + }, + "build-nav-model": { + "analytics": { + "text": { + "insights": "Analizy" + } + }, + "caching": { + "text": { + "cache": "" + } + }, + "ds-permissions": { + "text": { + "permissions": "Uprawnienia" + } + }, + "nav-model": { + "text": { + "settings": "Ustawienia" + } + }, + "text": { + "dashboards": "Pulpity" + } + }, "button-row": { "delete": "Usuń", "save-and-test": "Zapisz i przetestuj", @@ -4681,6 +5764,11 @@ "data-source-read-only-message": { "title-provisioned-data-source": "Udostępnione źródło danych" }, + "data-source-settings-reducer": { + "message": { + "testing-could-couple-minutes": "" + } + }, "data-source-type-card": { "aria-label-learn-more": "{{dataSourcePluginName}}, dowiedz się więcej." }, @@ -4698,13 +5786,88 @@ "footer": { "add-csv-or-spreadsheet": "Dodaj plik CSV lub arkusz kalkulacyjny" }, + "get-enterprise-phantom-plugins": { + "description": { + "adobe-analytics-datasource": "", + "app-dynamics-integration-and-data-source": "", + "atlassian-statuspage-datasource": "", + "aurora-data-source": "", + "azure-cosmos-db-datasource": "", + "azure-devops-datasource": "", + "catchpoint-datasource": "", + "cloudflare-datasource": "", + "cockroach-db-datasource": "", + "data-dog-integration-and-data-source": "", + "drone-datasource": "", + "git-lab-integration-and-datasource": "", + "honeycomb-integration-and-datasource": "", + "jira-integration-and-datasource": "", + "logic-monitor-devices-datasource": "", + "mongo-db-integration-and-data-source": "", + "netlify-datasource": "", + "new-relic-integration-and-data-source": "", + "pager-duty-datasource": "", + "salesforce-integration-and-datasource": "", + "sap-hana-integration-and-data-source": "", + "service-now-integration-and-data-source": "", + "signal-fx-integration-and-datasource": "", + "snowflake-integration-and-data-source": "", + "sumo-logic-integration-and-datasource": "", + "visualize-and-explore-dynatrace-data": "", + "visualize-and-explore-oracle-sql": "", + "visualize-and-explore-splunk-logs": "", + "wavefront-integration-and-data-source": "", + "zendesk-datasource": "" + } + }, + "get-grafana-cloud-phantom-plugin": { + "description": { + "hosted-graphite-prometheus-and-loki": "" + } + }, "new-data-source-view": { "cancel": "Anuluj", "placeholder-filter-by-name-or-type": "Filtruj według nazwy lub typu" }, + "update-data-source": { + "error-info": { + "message": { + "an-unexpected-error-occurred": "" + } + } + }, "use-data-source-info": { "badge-text-not-supported": "Nieobsługiwane", - "badge-text-supported": "Obsługiwane" + "badge-text-supported": "Obsługiwane", + "label": { + "alerting": "Alerty", + "type": "Typ" + } + }, + "use-delete-loaded-data-source": { + "title": { + "delete": "Usuń" + } + } + }, + "debug": { + "cursor-view": { + "no-events-yet": "" + }, + "render-info-viewer": { + "data-counter": "", + "elapsed-time": "", + "field": "Pole", + "last": "", + "render-counter": "", + "schema-counter": "", + "title-reset-counters": "", + "tooltip-step-back": "", + "type": "Typ" + }, + "state-view": { + "current-value": "", + "label-state-name": "" } }, "dimensions": { @@ -4773,6 +5936,19 @@ "remove-value-mapping-aria-label-delete-value-mapping": "Usuń mapowanie wartości", "remove-value-mapping-tooltip-delete": "Usuń", "set-color": "Ustaw kolor", + "special-match-options": { + "description": { + "boolean-false-values": "", + "boolean-true-values": "", + "empty-string": "", + "matches-against-number-na-n-not-a-number": "", + "matches-null-and-undefined-values": "", + "matches-null-undefined-and-na-n": "" + }, + "label": { + "empty": "Pusty" + } + }, "tooltip-remove-color": "Usuń kolor", "tooltip-remove-icon": "Ikona Usuń" }, @@ -4788,6 +5964,20 @@ "display-text": "Wyświetlanie tekstu", "icon": "Ikona", "label-add-a-new-mapping": "Dodaj nowe mapowanie", + "mapping-types": { + "description": { + "match-a-numerical-range-of-values": "", + "match-a-regular-expression-with-replacement": "", + "match-a-specific-text-value": "", + "match-boolean-empty-values": "" + }, + "label": { + "range": "", + "regex": "", + "special": "", + "value": "Wartość" + } + }, "update": "Aktualizuj" } }, @@ -4812,6 +6002,7 @@ }, "explore": { "accordian-logs": { + "events": "", "footer": "Znaczniki czasu zdarzenia są względne wobec czasu rozpoczęcia pełnego śledzenia." }, "accordian-references": { @@ -4822,6 +6013,11 @@ "basic-extensions": { "aria-label-add": "Dodaj" }, + "build-dashboard-panel-from-explore-state": { + "title": { + "new-panel": "" + } + }, "clear": "Wyczyść", "confirm-navigation-modal": { "cancel": "Anuluj", @@ -4908,6 +6104,33 @@ "title-table": "Tabela", "title-traces": "Ślady" }, + "explore-query-inspector": { + "data-tab": { + "label": { + "data": "Dane" + } + }, + "error-tab": { + "label": { + "error": "Błąd" + } + }, + "json-tab": { + "label": { + "json": "JSON" + } + }, + "query-tab": { + "label": { + "query": "Zapytanie" + } + }, + "stats-tab": { + "label": { + "stats": "Statystyki" + } + } + }, "explore-run-query-button": { "run-button": { "aria-label-run-query-options": "Opcje uruchamiania zapytania" @@ -4921,10 +6144,23 @@ "description-explore-disabled": "Sekcję Eksploruj możesz włączyć w konfiguracji Grafany:", "title-explore-disabled": "Sekcja Eksploruj jest wyłączona" }, + "get-field-links-for-explore": { + "text": { + "data": "Dane", + "raw-value": "" + } + }, "get-matches-metadata": { "matches": "0 dopasowań" }, "legacy-create-span-link-factory": { + "text": { + "tags": "Znaczniki" + }, + "title": { + "related-logs": "", + "session-for-this-span": "Sesja dla tego zakresu" + }, "title-explore-metrics-for-this-span": "Przejrzyj metryki z tego zakresu", "title-explore-split": "Przeglądaj logi w widoku podzielonym", "title-session-for-this-span": "Sesja dla tego zakresu" @@ -4965,6 +6201,10 @@ }, "logs-meta-row": { "download": "Pobierz", + "label": { + "deduplication-count": "", + "showing-only-selected-fields": "" + }, "show-original-line": "Pokaż oryginalny wiersz" }, "logs-sample-panel": { @@ -5146,6 +6386,21 @@ "run-query-button": "Uruchom zapytanie", "switch-datasource-button": "Przełącz źródło danych i uruchom zapytanie" }, + "scoped-vars-from-span": { + "text": { + "span": "" + } + }, + "scoped-vars-from-tags": { + "text": { + "tags": "Znaczniki" + } + }, + "scoped-vars-from-trace": { + "text": { + "trace": "Śledzenie" + } + }, "search-bar-input": { "placeholder-find": "Znajdź…", "suffix": { @@ -5180,9 +6435,25 @@ "tooltip-tag-key": "Klucz tagu, który zostanie użyty do uzyskania wartości tagu. Atrybuty i zasoby zakresu zostaną przeszukane w celu znalezienia klucza tagu" }, "span-detail": { + "label": { + "kind": "", + "library-name": "", + "library-version": "", + "status": "Status:", + "status-message": "", + "trace-state": "" + }, "label-resource-attributes": "Atrybuty zasobów", "label-span-attributes": "Atrybuty zakresu", "label-stack-trace": "Śledzenie stosu", + "overview-items": { + "label": { + "child-count": "", + "duration": "", + "service": "", + "start-time": "" + } + }, "warnings": "Ostrzeżenia" }, "span-filters": { @@ -5289,6 +6560,18 @@ "title-node-graph": "Wykres węzłowy" }, "unthemed-logs": { + "description": { + "show-results-in-logs-visualisation": "", + "show-results-in-table-visualisation": "", + "show-results-newest-to-oldest": "", + "show-results-oldest-to-newest": "" + }, + "label": { + "logs": "Logi", + "newest-first": "Od najnowszych", + "oldest-first": "Od najstarszych", + "table": "Tabela" + }, "label-deduplication": "Deduplikacja", "label-display-results": "Wyświetl wyniki", "label-prettify-json": "Formatowanie JSON", @@ -5304,6 +6587,15 @@ }, "unthemed-virtualized-trace-view": { "title-scroll-to-top": "Przewiń do początku" + }, + "use-focus-span-link": { + "create-focus-span-link": { + "link": { + "title": { + "deep-link-to-this-span": "" + } + } + } } }, "export": { @@ -5389,6 +6681,15 @@ "folder-repo": { "badge-text": "Po aprowizacji" }, + "folders": { + "get-loading-nav": { + "main": { + "title": { + "loading": "Ładowanie" + } + } + } + }, "forgot-password": { "back-button": "Powrót do logowania", "change-password": { @@ -5418,10 +6719,102 @@ "incomplete-request-error": "Nie udało nam się zrealizować Twojego żądania. Spróbuj ponownie.", "send-custom-feedback": "Wyślij" }, + "geomap": { + "coordinates-map-view-editor": { + "label-latitude": "", + "label-longitude": "" + }, + "debug-overlay": { + "center": "", + "zoom": "" + }, + "fit-map-view-editor": { + "all-layers-editor-fragment": { + "label-layer": "" + }, + "label-data": "Dane", + "last-only-editor-fragment": { + "label-padding": "", + "tooltip-padding-relative-percent-beyond-extent": "" + } + }, + "frame-multi-selection-editor": { + "placeholder-change-filter": "" + }, + "frame-selection-editor": { + "placeholder-change-filter": "" + }, + "geomap-panel": { + "aria-label-map": "" + }, + "geomap-style-rules-editor": { + "aria-label-add-geomap-style-rule": "" + }, + "layers-editor": { + "label-add-layer": "", + "no-layers": "" + }, + "map-view-editor": { + "label-max-zoom": "", + "label-view": "Wyświetl", + "label-zoom": "Powiększenie", + "use-current-map-settings": "" + }, + "markers-legend": { + "title-symbol": "Symbol" + }, + "measure-overlay": { + "tooltip-show-measure-tools": "" + }, + "plugin": { + "basemap-layer-configured-server-admin": "" + }, + "style-editor": { + "label-align": "", + "label-baseline": "", + "label-color": "Kolor", + "label-fill-opacity": "", + "label-font-size": "", + "label-opacity": "", + "label-rotation-angle": "", + "label-size": "", + "label-symbol": "Symbol", + "label-symbol-horizontal-align": "", + "label-symbol-vertical-align": "", + "label-text-label": "", + "label-x-offset": "", + "label-y-offset": "" + }, + "style-rule-editor": { + "aria-label-comparison-operator": "Operator porównania", + "aria-label-comparison-value": "", + "aria-label-delete-style-rule": "", + "aria-label-feature-property": "", + "label-rule": "Reguła", + "placeholder-feature-property": "", + "placeholder-numeric-value": "", + "placeholder-value": "wartość" + } + }, "get-enterprise": { "requires-license": "Wymaga licencji Grafana Enterprise", "title": "Enterprise" }, + "gettingstarted": { + "docs-card": { + "complete": "ukończono", + "learn-how": "" + }, + "getting-started": { + "aria-label-to-advanced-tutorials": "", + "aria-label-to-basic-tutorials": "", + "checking-completed-setup-steps": "", + "remove-this-panel": "" + }, + "tutorial-card": { + "complete": "ukończono" + } + }, "gops": { "config-card": { "text-loading-configuration": "Wczytywanie konfiguracji…" @@ -5438,6 +6831,74 @@ }, "progress-status": { "your-progress": "Twoje postępy" + }, + "use-get-configuration-for-ui": { + "get-connect-data-source-configuration": { + "title": { + "connect-data-source": "" + } + }, + "title": { + "essentials": "Podstawy" + } + }, + "use-get-essentials-configuration": { + "essential-content": { + "description": { + "configure-grafana-alerting": "", + "create-integration-alerting-contact-point": "", + "initialize-incident-plugin-declare-manage-incidents": "", + "practice-solving-an-incident": "", + "receive-alerts-oncall-notifications-within-environment": "", + "select-chat-ops-channels-to-route-notifications": "" + }, + "label": { + "add": "Dodaj", + "connect": "Połącz", + "initialize": "", + "select-integration": "", + "start-drill": "" + }, + "title": { + "add-slack-notifications-to-irm-integrations": "", + "connect-alerting-to-irm": "", + "connect-irm-to-your-slack-workspace": "", + "connect-your-messaging-workspace-to-incident": "", + "connect-your-messaging-workspace-to-on-call": "", + "create-incident-drill": "", + "detect": "Wykryj", + "initialize-incident-plugin": "", + "messaging-workspace-channel-on-call-integration": "", + "respond": "", + "test-your-configuration": "" + } + }, + "get-grafana-alerting-config-steps": { + "description": { + "create-alert-monitor-system": "", + "create-on-call-integration-alerting-contact-point": "", + "create-slos-to-monitor-your-service": "" + }, + "label": { + "connect": "Połącz", + "create": "Utwórz", + "enable": "Włącz" + }, + "steps": { + "label": { + "edit": "Edytuj" + }, + "title": { + "update-default-contact-point": "" + } + }, + "title": { + "connect-alerting-to-on-call": "", + "create-alert-rule": "", + "create-slo": "", + "enable-slo-alerting": "" + } + } } }, "grafana": { @@ -5804,14 +7265,18 @@ "duplicate-panel": "Duplikuj panel", "exit-edit/setting-views": "Wyjdź z widoków edycji/ustawień", "expand-all-rows": "Rozwiń wszystkie wiersze", + "explore-panel": "", "go-to-dashboards": "Idź do pulpitów", "go-to-explore": "Przejdź do widoku eksploracji", "go-to-home-dashboard": "Idź do panelu głównego", "go-to-profile": "Przejdź do profilu", + "inspect-panel": "", "make-time-range-permanent": "Ustaw bezwzględny/stały zakres czasu", "move-time-range-back": "Przesuń zakres czasu wstecz", "move-time-range-forward": "Przesuń zakres czasu do przodu", "open-search": "Otwórz wyszukiwanie", + "open-share-embed-drawer": "", + "open-share-link-drawer": "", "open-shared-modal": "Udostępnij migawkę panelu", "paste-time-range": "Wklej zakres czasu", "refresh-all-panels": "Odśwież wszystkie panele", @@ -5837,6 +7302,11 @@ "support-bundle": "Pakiet wsparcia zawierający informacje dotyczące instancji Grafana i skonfigurowanych źródeł danych można również pobrać w <1>sekcji pakietów wsparcia </1>.", "troubleshooting-help": "Aby poprosić o pomoc w rozwiązywaniu problemów, wyślij migawkę tego panelu do działu pomocy technicznej Grafana Labs. Migawka zawiera dane odpowiedzi na zapytanie i ustawienia panelu." }, + "histogram": { + "histogram-panel": { + "no-histogram-found-in-response": "" + } + }, "inspector": { "inspect-data-tab": { "loading": "Ładowanie", @@ -5890,6 +7360,9 @@ "label-name": "Imię", "label-password": "Hasło", "label-username": "Nazwa użytkownika", + "message": { + "email-is-invalid": "" + }, "placeholder-name-optional": "Imię i nazwisko (opcjonalnie)", "placeholder-password": "Hasło", "placeholder-username": "Nazwa użytkownika", @@ -6155,8 +7628,26 @@ "discard-local-changes": "Odrzuć zmiany lokalne", "title-dashboard-changed": "Pulpit został zmieniony" }, + "live-channel-editor": { + "description-grafana-live": "", + "namespace": "Przestrzeń nazw", + "path": "Ścieżka", + "placeholder-select-watchable-resource": "", + "scope": "", + "title-grafana-live": "" + }, "live-connection-warning": { "title-connection-to-server-is-lost": "Utracono połączenie z serwerem…" + }, + "live-panel": { + "error": "Błąd", + "grafana-requires-feature": "", + "panel-editor-channel": "", + "title-grafana-live": "", + "waiting-for-data": "" + }, + "live-publish": { + "publish": "" } }, "lock-icon": "ikona kłódki", @@ -6203,6 +7694,13 @@ } }, "logs": { + "get-dataframe-fields": { + "vars": { + "text": { + "labels": "Etykiety" + } + } + }, "infinite-scroll": { "end-of-range": "Koniec wybranego zakresu czasu.", "load-more": "Przewiń, aby załadować więcej", @@ -6283,6 +7781,11 @@ "shortcut": "alt+wybierz, aby włączyć ponownie" } }, + "log-series-to-logs-model": { + "label": { + "total-bytes-processed": "" + } + }, "logs-controls": { "deduplication": "Deduplikacja", "disable-highlighting": "Wyłącz wyróżnianie", @@ -6317,6 +7820,11 @@ "scroll-top": "Przewiń w górę", "start-of-range": "Początek zakresu" }, + "logs-panel": { + "render-common-labels": { + "common-labels": "" + } + }, "out-of-range-message": { "end-of-the-selected-time-range": "Koniec wybranego zakresu czasu." }, @@ -6373,6 +7881,14 @@ }, "snapshot-list-table": { "title-delete": "Usuń" + }, + "unthemed-dashboard-import": { + "subTitle": { + "import-dashboard-from-file-or-grafanacom": "" + }, + "text": { + "import-dashboard": "Importuj pulpit" + } } }, "migrate-to-cloud": { @@ -7030,8 +8546,63 @@ "close": "Zamknij panel" }, "link-title": "Przejdź na bloga Grafana Labs", + "news-panel": { + "body-error-loading-rss-feed": "", + "loading": "Ładowanie…", + "title-error-loading-rss-feed": "" + }, "title": "Najnowsze na blogu" }, + "nodeGraph": { + "arc-options-editor": { + "add-arc": "", + "title-remove-arc": "" + }, + "edge": { + "aria-label-from-to": "" + }, + "edge-header": { + "label-source-target": "" + }, + "marker": { + "100-node-count": "", + "aria-label-hidden-marker": "", + "node-count_one": "", + "node-count_few": "", + "node-count_many": "", + "node-count_other": "" + }, + "node": { + "aria-label-node-title": "" + }, + "node-graph": { + "aria-label-layered-layout-performance-warning": "", + "aria-label-nodes-hidden-warning": "", + "computing-layout": "", + "no-data": "Brak danych", + "hidden-nodes_one": "", + "hidden-nodes_few": "", + "hidden-nodes_many": "", + "hidden-nodes_other": "", + "processed-nodes_one": "", + "processed-nodes_few": "", + "processed-nodes_many": "", + "processed-nodes_other": "" + }, + "node-graph-panel": { + "no-data-found-in-response": "" + }, + "node-header": { + "label-subtitle": "", + "label-title": "Tytuł" + }, + "view-controls": { + "hide-config": "", + "show-config": "", + "title-zoom-in": "", + "title-zoom-out": "" + } + }, "notifications": { "empty-state": { "description": "Tutaj pojawią się otrzymane powiadomienia", @@ -7073,6 +8644,11 @@ "label-organization-name": "Nazwa organizacji", "placeholder-org-name": "Nazwa organizacji" }, + "org-details-page": { + "title": { + "confirm-preferences-update": "" + } + }, "org-profile": { "label-organization-name": "Nazwa organizacji", "label-organization-profile": "Profil organizacji", @@ -7092,7 +8668,10 @@ "tooltip": "Możesz teraz wybrać opcję „Brak podstawowej roli” i dodać uprawnienia zgodnie z własnymi potrzebami. Więcej informacji znajdziesz w <1>dokumentacji</1>." }, "user-invite-page": { - "sub-title": "Wyślij zaproszenie lub dodaj istniejącego użytkownika Grafany do organizacji.<1> {{orgName}}</1>" + "sub-title": "Wyślij zaproszenie lub dodaj istniejącego użytkownika Grafany do organizacji.<1> {{orgName}}</1>", + "text": { + "invite-user": "" + } } }, "org-picker": { @@ -7104,6 +8683,38 @@ } }, "panel": { + "get-calculation-value-data-links-variable-suggestions": { + "value-calc-var": { + "label": { + "calculation-name": "" + } + } + }, + "get-data-links-variable-suggestions": { + "value-time-var": { + "label": { + "time": "Czas" + } + } + }, + "get-field-links-supplier": { + "text": { + "data": "Dane", + "field": "Pole", + "series": "", + "value": "Wartość" + } + }, + "get-field-vars": { + "label": { + "name": "Imię" + } + }, + "get-panel-links-variable-suggestions": { + "label": { + "all-variables": "" + } + }, "header-menu": { "copy": "Kopiuj", "create-library-panel": "Utwórz panel biblioteki", @@ -7164,6 +8775,13 @@ "select-placeholder": "Filtruj wg typu" }, "playlist": { + "playlist-new-page": { + "page-nav": { + "text": { + "new-playlist": "Nowe autoodtwarzanie" + } + } + }, "playlist-table-rows": { "aria-label-playlist-item": "Element listy odtwarzania, {{itemType}}, {{itemValue}}", "multiple-dashboards-found": "Znaleziono wiele elementów: {{items}}", @@ -7180,6 +8798,12 @@ "label-mode": "Tryb", "label-time-and-refresh": "Czas i odświeżanie", "label-variables": "Zmienne", + "modes": { + "label": { + "kiosk": "Kiosk", + "normal": "Normalny" + } + }, "title-start-playlist": "Rozpocznij autoodtwarzanie" } }, @@ -7246,6 +8870,19 @@ }, "browse": { "aria-label-plugin-type-filter": "Filtr typu wtyczki", + "filter-by-options": { + "label": { + "all": "Wszystkie", + "installed": "Zainstalowane", + "new-updates": "" + } + }, + "label": { + "all": "Wszystkie", + "applications": "", + "data-sources": "Źródła danych", + "panels": "Panele" + }, "label-search": "Szukaj", "label-state": "Stan", "label-type": "Typ", @@ -7327,12 +8964,24 @@ "empty-state": { "message": "Nie znaleziono wtyczek" }, + "extensions-log-data-source": { + "message": { + "ok": "OK" + } + }, "filter": { "disabled": "Ten filtr został wyłączony, ponieważ serwer Grafana nie może uzyskać dostępu do grafana.com", "sort": "Sortuj", "sort-list": "Sortuj listę wtyczek", "state": "Stan" }, + "get-feature-state-info": { + "text": { + "alpha": "", + "beta": "Beta", + "deprecated": "Wycofane" + } + }, "get-started-with-app": { "disable": "Wyłącz", "enable": "Włącz" @@ -7389,6 +9038,16 @@ "plugin-details-header-dependencies": { "grafana-dependency": "Grafana {{grafanaDependency}}" }, + "plugin-details-page": { + "not-found-model": { + "subTitle": { + "requested-belong-plugin": "" + }, + "text": { + "unknown-plugin": "" + } + } + }, "plugin-details-signature": { "body-invalid-plugin-signature": "Grafana Labs sprawdza każdą wtyczkę pod kątem prawidłowego podpisu cyfrowego. Weryfikacja podpisu wtyczki jest częścią naszych środków bezpieczeństwa, które podejmujemy, aby mieć pewność, że wtyczki są bezpieczne i godne zaufania. Grafana Labs nie może zagwarantować integralności tej niepodpisanej wtyczki. Poproś autora wtyczki o jej podpisanie.", "read-more-about-plugins-signing": "Dowiedz się więcej o podpisywaniu wtyczek.", @@ -7434,6 +9093,13 @@ "search-field": { "placeholder-search-grafana-plugins": "Szukaj wtyczek Grafany" }, + "use-plugin-details-tabs": { + "nav-model-children": { + "text": { + "dashboards": "Pulpity" + } + } + }, "version-install-button": { "text-installed": "Zainstalowane" }, @@ -7553,6 +9219,11 @@ "label-git-hub-features": "Funkcje GitHub", "label-realtime-feedback": "Informacje zwrotne w czasie rzeczywistym" }, + "connect-page": { + "subTitle": { + "connect-external-storage-manage-resources": "" + } + }, "connect-repository-button": { "configure": "Konfiguruj", "configure-file": "Skonfiguruj aprowizację plików", @@ -7586,7 +9257,13 @@ }, "edit-repository-page": { "back-to-repositories": "Wróć do repozytoriów", - "repository-config-exists-configuration": "Upewnij się, że konfiguracja repozytorium istnieje w pliku konfiguracyjnym." + "repository-config-exists-configuration": "Upewnij się, że konfiguracja repozytorium istnieje w pliku konfiguracyjnym.", + "subTitle": { + "configure-repository-storing-resources": "" + }, + "text": { + "configure-repository": "" + } }, "empty-state": { "no-jobs": "Brak zadań…" @@ -7649,6 +9326,11 @@ "no-results-matching-your-query": "Brak wyników pasujących do zapytania", "placeholder-search": "Szukaj" }, + "get-default-values": { + "title": { + "repository": "Repozytorium" + } + }, "getting-started": { "alert-temporary-outage": "Po połączeniu całej instancji pulpity będą niedostępne podczas uruchamiania migracji. Zalecamy ostrzeżenie użytkowników przed rozpoczęciem tego procesu.", "modal-description-public-access": "Skonfiguruj publiczny dostęp do instancji Grafany, aby włączyć integrację z GitHubem", @@ -7793,7 +9475,18 @@ "dashboard-preview": "Podgląd pulpitu", "existing-dashboard": "Istniejący pulpit", "history": "Historia", + "message": { + "removed-from-repo-test-ui": "", + "updated-from-repo-test-ui": "" + }, "repository": "Repozytorium", + "tab-info": { + "label": { + "dry-run-result-after-apply": "", + "existing-from-grafana": "", + "file-from-repository": "" + } + }, "title-error-saving-file": "Błąd zapisywania pliku" }, "setup-modal": { @@ -8214,14 +9907,6 @@ "reload-button": "Odśwież", "title": "Nie można znaleźć pliku aplikacji" }, - "sandbox": { - "test-stuff-page": { - "application-notifications-toasts-testing": "Testowanie powiadomień aplikacji (toastów)", - "error": "Błąd", - "success": "Powodzenie", - "warning": "Ostrzeżenie" - } - }, "save-dashboards": { "message-length": { "info": "Wiadomość składa się z {{messageLength}} znaków i przekracza maksymalną długość 500 znaków. Skróć ją przed zapisaniem.", @@ -8281,6 +9966,14 @@ "view-as-folders": "Wyświetl według folderów", "view-as-list": "Wyświetl jako listę" }, + "bluge-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } + }, "dashboard-actions": { "import": "Importuj", "new": "Nowy", @@ -8308,6 +10001,14 @@ "search-results-table": { "aria-label-search-results-table": "Szukaj w tabeli wyników", "no-data": "Brak wartości" + }, + "unified-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } } }, "select": { @@ -8379,6 +10080,11 @@ "delete-service-account": "Usuń konto usługi", "disable-service-account": "Wyłącz konto usługi", "enable-service-account": "Włącz konto usługi", + "page-nav": { + "subTitle": { + "manage-settings-individual-service-account": "" + } + }, "title-delete-service-account": "Usuń konto usługi", "title-disable-service-account": "Wyłącz konto usługi", "tokens": "Tokeny", @@ -8695,6 +10401,14 @@ "sort-picker": { "select-aria-label": "Sortuj" }, + "status-history": { + "status-history-panel": { + "too-many-points_one": "", + "too-many-points_few": "", + "too-many-points_many": "", + "too-many-points_other": "" + } + }, "support-bundles": { "new-bundle-button": { "new-support-bundle": "Nowy pakiet wsparcia" @@ -8702,7 +10416,10 @@ "support-bundles-create-unconnected": { "cancel": "Anuluj", "create": "Utwórz", - "sub-title": "Wybierz elementy pakietu wsparcia. Pakiet wsparcia będzie dostępny przez 3 dni po utworzeniu." + "sub-title": "Wybierz elementy pakietu wsparcia. Pakiet wsparcia będzie dostępny przez 3 dni po utworzeniu.", + "text": { + "create-support-bundle": "" + } }, "support-bundles-unconnected": { "created-on": "Data utworzenia", @@ -8717,10 +10434,35 @@ "login": "Logowanie" }, "table": { + "auto-cell-options-editor": { + "description-wrap-text": "", + "label-wrap-text": "" + }, + "bar-gauge-cell-options-editor": { + "label-gauge-display-mode": "", + "label-value-display": "" + }, + "color-background-cell-options-editor": { + "description-apply-to-entire-row": "", + "description-wrap-text": "", + "label": { + "text-alpha": "" + }, + "label-apply-to-entire-row": "", + "label-background-display-mode": "", + "label-wrap-text": "", + "wrap-text": "" + }, "container": { "content": "Pokazanie zbyt wielu kolumn w jednej tabeli może wpłynąć na wydajność i utrudnić odczyt danych. Rozważ doprecyzowanie zapytań.", "show-all-series": "Pokaż wszystkie kolumny", "show-only-series": "Pokazuje liczbę kolumn: {{MAX_NUMBER_OF_COLUMNS}}" + }, + "image-cell-options-editor": { + "description-alt-text": "", + "description-title-text": "", + "label-alt-text": "", + "label-title-text": "" } }, "tag-filter": { @@ -8736,6 +10478,24 @@ "select-placeholder": "Wybierz zespół" }, "teams": { + "build-nav-model": { + "nav-model": { + "subTitle": { + "manage-members-and-settings": "" + }, + "text": { + "settings": "Ustawienia" + } + }, + "team-group-sync": { + "text": { + "external-group-sync": "Synchronizacja grupy zewnętrznej" + } + }, + "text": { + "members": "Członkowie" + } + }, "create-team": { "create": "Utwórz", "description-email": "Jest to ustawienie opcjonalne i służy przede wszystkim do zezwalania na niestandardowe awatary zespołu", @@ -8757,6 +10517,9 @@ "external-group-sync": "Synchronizacja grupy zewnętrznej", "label-add-external-group": "Dodaj grupę zewnętrzną", "team-sync-upgrade": "Dodaj grupę, aby włączyć synchronizację zespołów za darmo podczas okresu próbnego Grafana Pro", + "text": { + "add-group": "Dodaj grupę" + }, "title-there-external-groups": "Brak grup zewnętrznych do zsynchronizowania", "tooltip-add-external-group": "Przykład grupy LDAP: {{example}}" }, @@ -8858,6 +10621,42 @@ "select-search-input": "Wpisz, aby wyszukać (kraj, miasto, skrót)" } }, + "timeseries": { + "annotation-editor2": { + "add-annotation": "Dodaj komentarz", + "cancel": "Anuluj", + "edit-annotation": "", + "label-description": "Opis", + "label-tags": "Znaczniki", + "placeholder-add-tags": "", + "save": "Zapisz", + "saving": "Zapisywanie" + }, + "annotation-tooltip2": { + "tooltip-delete": "Usuń", + "tooltip-edit": "Edytuj" + }, + "line-style-editor": { + "title-the-input-expects-a-segment-list": "", + "tooltip-help": "Pomoc" + }, + "nulls-threshold-input": { + "placeholder-never": "Nigdy" + }, + "outside-range-plugin": { + "data-outside-time-range": "", + "zoom-to-data": "" + }, + "timezones-editor": { + "tooltip-add-timezone": "", + "tooltip-remove-timezone": "" + } + }, + "traces": { + "traces-panel": { + "no-data-found-in-response": "" + } + }, "transformations": { "empty": { "add-transformation-body": "Transformacje umożliwiają zmianę danych na różne sposoby przed wyświetleniem wizualizacji.<1></1>Obejmuje to łączenie danych, zmianę nazw pól, wykonywanie obliczeń, formatowanie danych do wyświetlania i inne czynności.", @@ -8894,6 +10693,10 @@ "convert-field-type-transformer-editor": { "aria-label-add-a-convert-field-type-transformer": "Dodaj transformator typu Konwersja pól", "aria-label-remove-convert-field-type-transformer": "Usuń transformator typu Konwersja pól", + "label": { + "browser": "Przeglądarka", + "utc": "" + }, "label-as": "jako", "label-date-format": "Format daty", "label-field": "Pole", @@ -8980,11 +10783,32 @@ "tooltip-format": "Format wyjściowy pola określonego jako <2>Ciąg formatowania Moment.js</2>.", "tooltip-timezone-manually": "Ręcznie ustaw strefę czasową daty" }, + "get-timezone-options": { + "label": { + "browser": "Przeglądarka", + "utc": "" + } + }, "get-tooltips": { "description": "Prawidłowa ścieżka do obiektu JSON.", "json-value": "Wartość JSON:", + "map-valid-paths": { + "description": { + "extract-fields-from-object": "", + "extract-value": "", + "extract-value-first-element": "", + "extract-value-second-element": "" + } + }, "valid-paths": "Prawidłowe ścieżki:" }, + "get-transformer-option-pane": { + "root": { + "title": { + "root": "" + } + } + }, "group-by-field-configuration": { "placeholder-ignored": "Ignorowane", "placeholder-select-stats": "Wybierz statystyki" @@ -9001,7 +10825,23 @@ "label-cell-value": "Wartość komórki", "label-column": "Kolumna", "label-empty-value": "Pusta wartość", - "label-row": "Wiersz" + "label-row": "Wiersz", + "special-value-options": { + "description": { + "boolean-false-value": "", + "boolean-true-value": "", + "empty-string": "", + "null-value": "", + "number-value": "" + }, + "label": { + "empty": "Pusty", + "false": "", + "null": "", + "true": "", + "zero": "" + } + } }, "histogram-transformer-editor": { "placeholder-auto": "Automatycznie", @@ -9064,10 +10904,22 @@ "tooltip-naming": "Ustawia sposób wyświetlania nazw wybranych pól. Nazwa ramki jest zwykle lepsza w przypadku danych tabelarycznych" }, "partition-by-values-editor": { + "keep-fields-options": { + "label": { + "no": "Nie", + "yes": "Tak" + } + }, "label-field": "Pole", "label-keep-fields": "Zachowaj pola", "label-naming": "Nazewnictwo", "label-select-field": "Wybierz pole", + "naming-modes-options": { + "label": { + "as-frame-name": "", + "as-label": "" + } + }, "partition-values-works-single-frame": "Podział według wartości działa tylko w przypadku pojedynczej ramki.", "tooltip-keeps-partition-fields-frames": "Zachowuje pola podziału w ramkach" }, @@ -9089,6 +10941,16 @@ "label-include-time": "Uwzględnij czas", "label-labels-to-fields": "Etykiety do pól", "label-mode": "Tryb", + "modes": { + "description": { + "collapse-field-single-value": "", + "create-table-series-value": "" + }, + "label": { + "reduce-fields": "", + "series-to-rows": "" + } + }, "placeholder-choose-stat": "Wybierz statystyki" }, "regex-matcher-editor": { @@ -9096,11 +10958,23 @@ "variable-regex-documentation": "" }, "regression-transformer-editor": { + "label": { + "cubic": "", + "quadratic": "", + "quartic": "", + "quintic": "" + }, "label-degree": "Stopień", "label-model-type": "Typ modelu", "label-predicted-points": "Przewidywane punkty", "label-x-field": "Pole X", "label-y-field": "Pole Y", + "model-type-options": { + "label": { + "linear": "", + "polynomial": "" + } + }, "tooltip-number-of-xy-points-to-predict": "Liczba punktów X,Y do prognozowania" }, "rename-by-regex-transformer-editor": { @@ -9118,6 +10992,23 @@ "label-reverse": "Odwróć", "placeholder-select-field": "Wybierz pole" }, + "supplier": { + "description": { + "apply-spatial-operations-to-the-geometry": "", + "create-a-line-between-two-points": "", + "geometry-define-field-headingdistancearea": "" + }, + "label": { + "area": "", + "as-line": "", + "calculate-value": "", + "distance": "", + "heading": "", + "line-builder": "", + "prepare-spatial-field": "", + "transform": "" + } + }, "time-series-table-transform-editor": { "label-stat": "Statystyka", "label-time-field": "Pole czasu", @@ -9151,7 +11042,19 @@ "placeholder-auto": "Automatycznie", "placeholder-field": "Pole", "tooltip-window-size": "Rozmiar okna", - "tooltip-window-size-percent": "Ustaw rozmiar okna jako odsetek całkowitej ilości danych" + "tooltip-window-size-percent": "Ustaw rozmiar okna jako odsetek całkowitej ilości danych", + "type-options": { + "label": { + "centered": "", + "trailing": "" + } + }, + "window-size-mode-options": { + "label": { + "fixed": "", + "percentage": "" + } + } } }, "upgrade-box": { @@ -9208,6 +11111,11 @@ }, "users-action-bar-unconnected": { "invite": "Zaproś", + "options": { + "label": { + "users": "Użytkownicy" + } + }, "placeholder-search-login-email": "Wyszukaj użytkownika według loginu, adresu e-mail lub imienia i nazwiska" } }, @@ -9251,6 +11159,32 @@ "confirm-delete-modal": { "title-delete-variable": "Usuń zmienną" }, + "create-ad-hoc-variable-adapter": { + "description": { + "add-keyvalue-filters-on-the-fly": "" + } + }, + "create-custom-variable-adapter": { + "description": { + "define-variable-values-manually": "" + } + }, + "create-interval-variable-adapter": { + "description": { + "define-timespan-interval": "" + } + }, + "create-query-variable-adapter": { + "description": { + "variable-values-fetched-datasource-query": "" + } + }, + "data-source-variable-slice": { + "text": { + "default": "", + "no-data-sources-found": "Nie znaleziono źródeł danych" + } + }, "empty-state": { "button-title": "Dodaj zmienną", "info-box-content": "Zmienne umożliwiają tworzenie bardziej interaktywnych i dynamicznych pulpitów. Elementy takie jak nazwy serwerów czy czujników w zapytaniach dotyczących metryk nie muszą być już wkodowane na sztywno. Teraz możesz przechowywać je w zmiennych. Zmienne są wyświetlane jako rozwijane pola u góry pulpitu. Te listy ułatwiają zmianę danych wyświetlanych na pulpicie.", @@ -9277,6 +11211,13 @@ "placeholder-default-value-if-any": "wartość domyślna, jeśli istnieje", "text-options": "Opcje tekstu" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "unknown-table": { "loading": "Ładowanie…", "no-unknowns": "Nie znaleziono przemianowanych ani brakujących zmiennych.", @@ -9333,5 +11274,25 @@ "data-hover-view": { "link": "Link" } + }, + "welcome": { + "welcome-banner": { + "need-help": "Potrzebujesz pomocy?", + "welcome-to-grafana": "" + } + }, + "xychart": { + "series-editor": { + "add-series": "", + "aria-label-select-series": "", + "label-color-field": "", + "label-frame": "Ramka", + "label-size-field": "", + "label-x-field": "Pole X", + "label-y-field": "Pole Y", + "placeholder-all-frames": "", + "placeholder-select-frame": "", + "tooltip-delete-series": "" + } } } \ No newline at end of file diff --git a/public/locales/pt-BR/grafana.json b/public/locales/pt-BR/grafana.json index 332808faddc..74ccbb99c6a 100644 --- a/public/locales/pt-BR/grafana.json +++ b/public/locales/pt-BR/grafana.json @@ -72,6 +72,11 @@ }, "admin-edit-org-page": { "label-name": "Nome", + "page-nav": { + "subTitle": { + "manage-settings-roles-organization": "" + } + }, "render-missing-permission-message": { "title-access-denied": "Acesso negado" } @@ -233,6 +238,13 @@ "upgrade-info": { "title": "Licença Enterprise" }, + "user-admin-page": { + "page-nav": { + "subTitle": { + "manage-settings-for-an-individual-user": "" + } + } + }, "user-create-page": { "label-email": "E-mail", "label-name": "Nome", @@ -243,9 +255,16 @@ "label-ldap": "LDAP" }, "user-list-admin-page-un-connected": { + "label": { + "active-last-days": "", + "all-users": "Todos os usuários" + }, "placeholder-search-login-email": "Pesquise usuários por login, e-mail ou nome." }, "user-list-anonymous-devices-page-un-connected": { + "label": { + "active-last-days": "" + }, "placeholder-search-devices-by-ip-address": "Pesquise dispositivos por endereço IP." }, "user-list-page": { @@ -364,6 +383,12 @@ "no-grouping": "Sem agrupamento" }, "alert-group-alerts-table": { + "columns": { + "label": { + "instance-labels": "", + "notification-state": "Estado da notificação" + } + }, "duration": "por {{time}}" }, "alert-group-filter": { @@ -443,6 +468,11 @@ "description-section": "Digite um nome para identificar seu {{entityName}}.", "label-metric": "Métrica", "label-name": "Nome", + "message": { + "must-enter-a-metric-name": "", + "must-enter-a-name": "", + "please-select-a-data-source": "Selecione uma fonte de dados" + }, "metric-aria-label-metric": "métrica", "metric-placeholder-recorded-metric": "Forneça o nome da nova métrica registrada", "placeholder-name": "Defina um nome para seu {{namePlaceholder}}", @@ -495,6 +525,9 @@ "alertmanager-config": { "gma-manual-configuration-description": "A configuração interna do Grafana Alertmanager não pode ser alterada manualmente. Para alterar essa configuração, edite os recursos individuais por meio da interface do usuário.", "gma-manual-configuration-is-not-supported": "Não se permite fazer alterações de configuração manual", + "message": { + "configuration-cannot-be-empty": "" + }, "reset": "Redefinir", "reset-confirmation": "Tem certeza de que deseja redefinir a configuração para \"{{alertmanagerName}}\"? Os pontos de contato e as políticas de notificação serão redefinidos para seus padrões.", "resetting-configuration-might-while": "As configurações estão sendo redefinidas. Isso pode demorar um pouco.", @@ -584,6 +617,9 @@ "create-a-contact-point": "Criar ponto de contato", "label-default-contact-point": "Ponto de contato padrão", "label-timing-options": "Opções de cronograma", + "message": { + "required": "" + }, "or": "ou" }, "am-routes-expanded-form": { @@ -605,11 +641,19 @@ "label-override-grouping": "Substituir agrupamento", "label-value": "Valor", "matching-labels": "Rótulos correspondentes", + "message": { + "required": "" + }, "placeholder-label": "rótulo", "placeholder-value": "valor", "remove": "Remover", "tooltip-remove-matcher": "Remover operador de correspondência" }, + "annotation-header-field": { + "message": { + "required": "" + } + }, "annotations": { "dashboard-annotation-field": { "dashboard": "Painel {{dashboardUid}}", @@ -681,6 +725,25 @@ "title": "Não é possível exibir todos os eventos" } }, + "central-alert-history-scene": { + "scene": { + "labels-filter-variable": { + "label": { + "labels": "" + } + }, + "transitions-from-filter-variable": { + "label": { + "start-state": "" + } + }, + "transitions-to-filter-variable": { + "label": { + "end-state": "" + } + } + } + }, "channel-sub-form": { "delete": "Excluir", "duplicate": "Duplicar", @@ -717,11 +780,17 @@ }, "cloud-data-source-selector": { "label": "Selecionar fonte de dados", - "label-disabled": "Fonte de dados" + "label-disabled": "Fonte de dados", + "message": { + "please-select-a-data-source": "Selecione uma fonte de dados" + } }, "cloud-evaluation-behavior": { "description-pending-period": "Período durante o qual a condição limite deve ser atendida para disparar um alerta. Ao selecionar \"Nenhum\", o alerta será disparado imediatamente assim que a condição for atendida.", "label-pending-period": "Período pendente", + "message": { + "must-be-a-positive-integer": "" + }, "title-set-evaluation-behavior": "Definir comportamento de avaliação" }, "cloud-receiver-form": { @@ -762,6 +831,9 @@ "contact-point-selector": { "aria-label-refresh-contact-points": "Atualizar pontos de contato", "contact-point-picker-label-contact-point": "Ponto de contato", + "message": { + "contact-point-is-required": "" + }, "title-failed-to-fetch-contact-points": "Falha ao buscar pontos de contato", "tooltip-refresh-contact-points-list": "Atualizar lista de pontos de contato" }, @@ -828,6 +900,14 @@ }, "copy-to-clipboard": "Copiar \"{{label}}\" para a área de transferência", "create-metadata": { + "label": { + "dashboard": "Painel de controle", + "dashboard-and-panel": "", + "evaluation-interval": "Intervalo de avaliação", + "labels": "Etiquetas", + "metric-name": "", + "runbook-url": "" + }, "view-dashboard": "Visualizar painel", "view-panel": "Visualizar painel" }, @@ -868,9 +948,6 @@ "title-search-panel": "Painel de pesquisa", "title-select-dashboard-and-panel": "Selecione o painel de controle e o painel" }, - "data-source-section": { - "import-to-grafana": "Importar para as regras da Grafana" - }, "datasource-not-found": { "card-description": "A fonte de dados para esta consulta não foi encontrada, foi removida ou não está instalada corretamente.", "remove-query": "Remover consulta", @@ -952,6 +1029,11 @@ "text-loading-template": "Carregando modelo…", "title-failed-to-fetch-notification-template": "Falha ao buscar modelo de notificação" }, + "edit-mute-timing-page": { + "text": { + "edit-time-interval": "" + } + }, "editor": { "edit-alert-rule": "", "edit-recording-rule": "", @@ -965,6 +1047,11 @@ "error-summary-button": { "content-show-all-errors": "" }, + "evaluate-every-validation-options": { + "message": { + "required": "" + } + }, "evaluation-behavior-summary": { "evaluate": "", "label-evaluate": "Avaliar", @@ -982,6 +1069,9 @@ "evaluation-group-creation-modal": { "description-group-name": "Um grupo avalia todas as suas regras com o mesmo intervalo de avaliação.", "description-often-rules-group-evaluated": "Com que frequência todas as regras do grupo são avaliadas.", + "message": { + "required": "" + }, "placeholder-enter-a-name": "Insira um nome", "title-new-evaluation-group": "Novo grupo de avaliação" }, @@ -1004,12 +1094,24 @@ "title-permission-editrecreate-silence": "Você não tem permissão para editar/recriar este silenciamento", "title-silence-not-found": "O silenciamento \"{{silenceId}}\" existente não foi encontrado" }, + "existing-silence-editor-page": { + "page-nav": { + "text": { + "edit-silence": "" + } + } + }, "export": { "subtitle": { "formats": "Selecione o formato e baixe o arquivo ou copie o conteúdo para a área de transferência", "one-format": "Baixe o arquivo ou copie o conteúdo para a área de transferência" } }, + "export-new-grafana-rule-page": { + "text": { + "export-new-grafana-rule": "" + } + }, "export-new-rule-button": { "tooltip-export-new-grafana-rule": "Exportar nova regra da Grafana" }, @@ -1035,6 +1137,16 @@ "no-data": "Sem dados", "page-counter": "" }, + "feature-toggle-page": { + "nav-model": { + "subTitle": { + "enable-alerting-grafana-config": "" + }, + "text": { + "alerting-is-not-enabled": "" + } + } + }, "federated-rule-warning": { "experimental": "O recurso de grupos de regras federadas está em teste no momento.", "read-documentation": "Leia a documentação", @@ -1042,6 +1154,13 @@ }, "file-export-inline-documentation": { "api-provisioning": "O formato {{name}} só é válido para o provisionamento de API. <3>Leia mais na documentação.</3>", + "export-inline-doc": { + "title": { + "apiprovisioning-format": "", + "fileprovisioning-format": "", + "terraformprovisioning-format": "" + } + }, "file-provisioning": "O formato {{name}} só é válido para o provisionamento de arquivos. <3>Leia mais na documentação.</3>", "terraform-provisioning": "O formato {{name}} só é válido para o provisionamento do Terraform. <3>Leia mais na documentação.</3>" }, @@ -1049,6 +1168,20 @@ "copy-code": "Copiar código", "download": "Baixar" }, + "filter-options": { + "label": { + "alert-rule": "Regra de alerta", + "all": "Tudo", + "error": "Erro", + "firing": "", + "no-data": "Sem dados", + "normal": "Normal", + "ok": "OK", + "pending": "Pendente", + "recording-rule": "Regra de registro", + "recovering": "Recuperando" + } + }, "filter-view-results": { "aria-label-filteredrulelist": "filtered-rule-list" }, @@ -1083,7 +1216,10 @@ } }, "folder-selector": { - "description-select-folder": "Selecione uma pasta para armazenar sua regra." + "description-select-folder": "Selecione uma pasta para armazenar sua regra.", + "message": { + "select-a-folder": "" + } }, "folderAndGroup": { "evaluation": { @@ -1098,15 +1234,88 @@ "for-input": { "description-pending": "Período durante o qual a condição limite deve ser atendida para disparar um alerta. Ao selecionar \"Nenhum\", o alerta será disparado imediatamente assim que a condição for atendida." }, + "for-validation-options": { + "message": { + "required": "" + } + }, "generate-alert-data-modal": { "add-alert-data": "Adicionar dados de alerta", "add-alert-data-to-payload": "Adicionar dados de alerta à carga útil", + "alert-options": { + "label": { + "firing": "", + "resolved": "" + } + }, "review-alert-payload": " Revise os dados de alerta para adicionar à carga útil:", "title-add-custom-alerts": "Adicionar alertas personalizados" }, + "get-alert-suggestions": { + "documentation": { + "annotations-attached-alert": "", + "fingerprint-identify-alert": "", + "grafana-external-alertmanager": "", + "organization-alert": "", + "time-the-alert-started-firing": "" + }, + "value": { + "labels-attached-alert": "", + "status-alert-firing-resolved": "" + } + }, + "get-cloud-scenes": { + "title": { + "mimir-alertmanager": "" + } + }, + "get-global-suggestions": { + "value": { + "an-array-containing-all-alerts": "" + } + }, + "get-grafana-alertmanager-scenes": { + "title": { + "grafana-alertmanager": "" + } + }, + "get-grafana-managed-scenes": { + "title": { + "grafanamanaged-alert-rules": "Regras de alerta gerenciadas pela Grafana" + } + }, + "get-mimir-managed-rules-per-group-scenes": { + "rule-group-handler": { + "label": { + "rule-group": "" + } + }, + "title": { + "mimirmanaged-alert-rules-per-rule-group": "" + } + }, + "get-mimir-managed-rules-scenes": { + "title": { + "mimirmanaged-alert-rules": "" + } + }, "get-preview-results": { "title-error": "Erro" }, + "get-state-display-model": { + "text": { + "alerting": "", + "error": "", + "firing": "", + "inactive": "", + "no-data": "", + "ok": "OK", + "paused": "", + "pending": "", + "recovering": "", + "unknown": "" + } + }, "getting-stared": { "learn-more": "Para uma introdução prática, consulte nosso <2>tutorial para começar a usar os Alertas da Grafana</2>" }, @@ -1148,6 +1357,10 @@ "label-disable-resolved-message": "Desativar mensagem resolvida" }, "grafana-evaluation-behavior-step": { + "message": { + "must-be-a-positive-integer": "", + "must-enter-a-group-name": "" + }, "missing-series-resolve-placeholder": "Padrão: 2", "or": "ou", "placeholder-select-an-evaluation-group": "Selecione um grupo de avaliação…", @@ -1164,6 +1377,11 @@ "body-invalid-rule-id": "O UID da regra na URL da página é inválido. Verifique a URL e tente novamente.", "title-invalid-rule-id": "ID de regra inválido" }, + "grafana-modify-export-page": { + "text": { + "modify-export": "" + } + }, "grafana-mute-timing-exporter-preview": { "text-loading": "Carregando…." }, @@ -1216,6 +1434,9 @@ }, "group-and-namespace-fields": { "group-picker-label-group": "Grupo", + "message": { + "required": "" + }, "namespace-picker-label-namespace": "Nomenclatura" }, "group-by": { @@ -1272,14 +1493,19 @@ "header": { "tooltip-remove": "Remover expressão \"{{refId}}\"" }, + "history-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "Sucesso" + } + }, "home": { "label-get-started": "Primeiros passos", "label-insights": "Insights", "title-alerting": "Alertas" }, - "import-from-dsrules": { - "description-folder-import-rules": "A pasta para importar as regras para" - }, "import-to-gma": { "action-button": "Importar", "additional-settings": "Configurações adicionais", @@ -1287,8 +1513,9 @@ "confirm-modal": { "confirm": "Importar", "loading": "Carregando...", - "loading-body": "Preparando dados que serão importados. Isso pode demorar um pouco…", + "loading-body": "", "no-rules-body": "Não há regras para importar. Selecione outra nomenclatura ou grupo de regras.", + "no-rules-body-yaml": "", "no-rules-title": "Nenhuma regra para importar", "plugin-rules-warning": { "text": "Detectamos que algumas regras são gerenciadas por plug-ins. Essas regras não serão importadas.", @@ -1307,11 +1534,12 @@ "label": "Grupo" }, "import-location-and-filters": "Importar localização e filtros", + "import-source": "", "namespace": { "description": "Digite para pesquisar uma nomenclatura existente", "label": "Nomenclatura" }, - "pageTitle": "Importar regras de alerta de uma fonte de dados para as regras gerenciadas pela Grafana", + "pageTitle": "", "pause": { "label": "Pausar regras de alerta importadas" }, @@ -1319,10 +1547,26 @@ "label": "Pausar regras de registro importadas" }, "recording-rules": "Regras de registro", + "source": { + "datasource": "", + "datasource-description": "", + "yaml": "", + "yaml-description": "" + }, "success": "Regras de alerta importadas com sucesso para as regras gerenciadas pela Grafana.", "target-folder": { + "description": "A pasta para importar as regras para", "label": "Pasta de destino" - } + }, + "yaml": { + "description": "", + "label": "", + "required-message": "", + "target-datasource": "Fonte de dados de destino", + "target-datasource-description": "", + "target-datasource-required": "" + }, + "yaml-error": "" }, "insights": { "monitor-status-of-system": "Monitore o status do seu sistema", @@ -1398,6 +1642,9 @@ "text-loading-existing-labels": "Carregando rótulos existentes" }, "labels-without-suggestions": { + "message": { + "required": "" + }, "placeholder-key": "chave", "placeholder-value": "valor" }, @@ -1437,6 +1684,24 @@ "log-record-viewer-by-timestamp": { "aria-label-state-history-by-timestamp": "Histórico de estado por registro de data/hora" }, + "log-timeline-viewer": { + "label": { + "firing": "", + "mixed": "", + "no-data": "", + "normal": "Normal", + "pending": "Pendente", + "recovering": "Recuperando" + } + }, + "loki-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "Sucesso" + } + }, "loki-state-history": { "clear-filters": "Limpar filtros", "common-labels": "Rótulos comuns", @@ -1449,6 +1714,14 @@ "button": "Gerenciar permissões", "title": "Gerenciar permissões" }, + "manual-and-automatic-routing": { + "routing-options": { + "label": { + "select-contact-point": "", + "use-notification-policy": "" + } + } + }, "matcher-filter": { "filter-alerts-using-label-querying-without-braces": "Filtre os alertas usando a consulta por etiquetas sem colchetes, ex:", "filter-alerts-using-label-querying-without-spaces": "Filtre os alertas usando a consulta por rótulos sem espaços. Por exemplo:", @@ -1466,6 +1739,9 @@ "label-operator": "Operador", "label-refine-affected-alerts": "Refinar alertas afetados", "label-value": "Valor", + "message": { + "required": "" + }, "placeholder-label": "rótulo", "placeholder-value": "valor", "remove": "Remover", @@ -1497,6 +1773,16 @@ "aria-label": "Mais", "button-text": "Mais" }, + "multiple-data-source-picker": { + "get-data-source-options": { + "grouped-options": { + "label": { + "data-sources-with-configured-alert-rules": "", + "other-data-sources": "" + } + } + } + }, "mute-timing-actions-buttons": { "text-disabled": "Desativado", "title-delete-mute-timing": "Excluir cronograma de silenciamento" @@ -1560,11 +1846,26 @@ "read-more": "Leia sobre as políticas de notificação.", "title-notification-routing": "Roteamento de notificação" }, + "new-mute-timing-page": { + "text": { + "add-time-interval": "" + } + }, "new-rule-from-panel-button": { "body-no-alerting-capable-query-found": "Não é possível criar alertas a partir deste painel porque nenhuma consulta a uma fonte de dados com capacidade de alerta foi encontrada.", "new-alert-rule": "Nova regra de alerta", "title-no-alerting-capable-query-found": "Nenhuma consulta que possa enviar alertas foi encontrada" }, + "new-silence-page": { + "page-nav": { + "subTitle": { + "configure-silences-notifications-particular-alert": "" + }, + "text": { + "silence-alert-rule": "Silenciar regra de alerta" + } + } + }, "no-alert-managers-available": { "body-no-alertmanager-found": "Não foi possível encontrar nenhum Alertmanager externo e talvez você não tenha acesso ao Alertmanager integrado da Grafana.", "title-no-alertmanager-found": "Nenhum Alertmanager encontrado" @@ -1791,6 +2092,9 @@ "expressions": "Expressões", "loading-data-sources": "Carregando fontes de dados…", "manipulate-returned-queries-other-operations": "Manipule os dados que retornaram das consultas usando operações matemáticas e outras operações.", + "message": { + "a-valid-expression-is-required": "" + }, "no-compatible-sources": "Parece que você não tem fontes de dados compatíveis", "title-deactivate-advanced-options": "Desativar opções avançadas", "title-queries-expressions-configured": "Nenhuma consulta ou expressão foi configurada" @@ -1842,7 +2146,8 @@ }, "recording-rules": { "description-target-data-source": "A fonte de dados do Prometheus em que as regras de gravação serão registradas", - "label-target-data-source": "Fonte de dados de destino" + "label-target-data-source": "Fonte de dados de destino", + "target-data-source-required": "" }, "recording-rules-name-space-and-group-step": { "description-select-namespace-group-recording": "Selecione a Nomenclatura e o Grupo para sua regra de registro.", @@ -2103,6 +2408,9 @@ "collapse-all": "Recolher tudo", "expand-all": "Expandir tudo" }, + "rule-list-v2": { + "import-to-gma": "" + }, "rule-modify-export": { "text-loading-the-rule": "Carregando a regra…", "title-cannot-exist": "Não é possível carregar a regra. A regra não existe", @@ -2180,6 +2488,10 @@ "label-saved-searches": "Pesquisas salvas" }, "health": "Integridade", + "label": { + "hide": "Ocultar", + "show": "Exibir" + }, "manage-alerts": "Nessas fontes de dados, você pode selecionar Gerenciar alertas via Interface de Envio de Alertas para gerenciar essas regras de alerta na interface da Grafana, bem como na fonte de dados onde foram configuradas.", "placeholder-all-data-sources": "Todas as fontes de dados", "plugin-rules": "Regras de plug-in", @@ -2276,6 +2588,9 @@ "label-comment": "Comentário", "label-created-by": "Criado por", "label-duration": "Duração", + "message": { + "required": "" + }, "placeholder-whos-creating-the-silence": "Quem está criando o silenciamento", "save-silence": "Salvar silenciamento", "saving": "Salvando..." @@ -2314,6 +2629,12 @@ "title-alert-rule-types": "Tipos de regra de alerta" }, "state-history": { + "columns": { + "label": { + "state": "Estado", + "time": "Tempo" + } + }, "filter-group": "Grupo de filtros", "filter-group-tooltip": "Filtre cada grupo de histórico de estado por correspondência exata ou expressão regular, por exemplo:", "placeholder-search": "Pesquisar", @@ -2353,6 +2674,9 @@ "label-examples-documentation": "Documentação de exemplos", "label-template-group": "Grupo de modelos", "label-template-group-name": "Nome do grupo de modelos", + "message": { + "required": "" + }, "new-template-name-placeholder-give-your-template-group-a-name": "Defina um nome para seu grupo de modelos", "title-error-saving-template": "Erro ao salvar o modelo", "title-templating-cheat-sheet": "Resumo rápido de modelagem" @@ -2375,6 +2699,11 @@ "existing-templates-selector-aria-label-choose-notification-template": "Escolha o modelo de notificação", "existing-templates-selector-placeholder-choose-notification-template": "Escolha o modelo de notificação", "loading": "Carregando...", + "template-options": { + "label": { + "select-notification-template": "" + } + }, "tooltip-copy": "Copiar o modelo de notificação selecionado para a área de transferência. Você pode usá-lo na aba personalizada." }, "templates": { @@ -2477,10 +2806,39 @@ } }, "use-columns": { + "columns": { + "label": { + "alert-rule-targeted": "", + "alerts-silenced": "", + "health": "Integridade", + "matching-labels": "Rótulos correspondentes", + "name": "Nome", + "schedule": "Agendar", + "state": "Estado", + "time-range": "Intervalo de tempo" + } + }, + "label": { + "actions": "Ações", + "created": "Criado", + "group": "Grupo", + "labels": "Etiquetas", + "next-evaluation": "Próxima avaliação", + "state": "Estado", + "summary": "Resumo" + }, "title-edit": "Editar", "title-recreate": "Recriar", "title-unsilence": "Cancelar silenciamento" }, + "use-combined-labels": { + "grouped-options": { + "label": { + "from-alerts": "", + "from-system": "" + } + } + }, "use-create-dropdown-menu-actions": { "label-delete": "Excluir", "label-edit": "Editar", @@ -2514,6 +2872,17 @@ "title-edit-notification-policy": "Editar política de notificação" } }, + "use-page-nav": { + "page-nav": { + "text": { + "details": "Detalhes", + "history": "Histórico", + "instances": "Instâncias", + "query-and-conditions": "", + "versions": "Versões" + } + } + }, "use-state-history-modal": { "state-history-modal": { "title-state-history": "Histórico de estado" @@ -2534,6 +2903,36 @@ "body": "O conteúdo YAML no editor contém apenas a configuração da regra de alerta <1></1>Para configurar o Prometheus, você precisa fornecer o restante do <4>conteúdo do arquivo de configuração.</4>" } }, + "alertlist": { + "group-by": { + "aria-label-group-by-label-keys": "", + "placeholder-group-by": "Agrupar por" + }, + "ungrouped-mode-view": { + "active-for": "", + "aria-label-view-alert-rule": "", + "view-alert-rule": "" + }, + "unified-alert-list": { + "clear": "Limpar", + "text-loading": "Carregando..." + }, + "unified-alert-list-panel": { + "body-permission-required": "", + "title-permission-required": "" + } + }, + "annolist": { + "anno-list-panel": { + "aria-label-remove-filter": "", + "filter": "", + "loading": "Carregando...", + "no-annotations-found": "" + }, + "annotation-list-item": { + "tooltip-created-by": "" + } + }, "annotations": { "annotation-field-mapper": { "annotation": "Anotação", @@ -2630,6 +3029,11 @@ "configuration-required": "Configuração obrigatória", "refer-documentation-configure-authentication": "Consulte a documentação sobre como configurar a autenticação" }, + "field-map": { + "label": { + "none": "Nenhum" + } + }, "fields": { "allow-assign-grafana-admin-description": "", "allow-assign-grafana-admin-label": "", @@ -2733,7 +3137,18 @@ "use-refresh-token-description": "", "use-refresh-token-label": "", "validate-hosted-domain-description": "", - "validate-hosted-domain-label": "" + "validate-hosted-domain-label": "", + "workload-identity-token-file-description": "", + "workload-identity-token-file-label": "", + "workload-identity-token-file-required": "" + }, + "get-page-nav": { + "subTitle": { + "configure-authentication-providers": "" + }, + "text": { + "authentication": "Autenticação" + } }, "provider-card": { "text-badge-enabled": "Ativado", @@ -2769,6 +3184,12 @@ "auth-config-auth-config-page-unconnected": { "subtitle": "Gerencie suas configurações de autenticação e configure a autenticação única. Saiba mais na nossa <2>documentação</2>." }, + "barchart": { + "tick-spacing-editor": { + "content-require-space-from-the-right-side": "", + "label-rtl": "" + } + }, "bookmarks-page": { "empty": { "message": "Parece que você ainda não adicionou nenhum marcador", @@ -2897,11 +3318,199 @@ "text-this-repository-is-read-only": "Se você tiver acesso direto ao destino, copie o JSON e cole-o lá." }, "canvas": { + "apieditor": { + "label-endpoint": "", + "label-header-parameters": "", + "label-method": "Método", + "label-payload": "Carga útil", + "label-query-parameters": "Parâmetros de consulta", + "render-test-apibutton": { + "test-api": "", + "title-test-api": "" + } + }, + "button-item": { + "label": { + "center": "", + "left": "", + "right": "" + }, + "placeholder": { + "auto": "Automático" + } + }, + "button-style-editor": { + "label-variant": "Variante" + }, + "canvas-context-menu": { + "close-editor": "", + "open-editor": "", + "render-menu-items": { + "add-item-menu-item": { + "label-add-item": "" + }, + "edit-element-menu-item": { + "label-edit": "Editar" + }, + "label-bring-to-front": "", + "label-delete": "Excluir", + "label-duplicate": "Duplicar", + "label-send-to-back": "", + "set-background-menu-item": { + "label-set-background": "" + } + } + }, + "cloud-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automático" + } + }, + "ellipse-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automático" + } + }, + "inline-edit": { + "canvas-inline-editor": "", + "tooltip-close-inline-editor": "" + }, + "inline-edit-body": { + "label-add-item": "", + "please-select-an-element": "" + }, + "line-style-editor": { + "label-animate": "" + }, + "metric-value-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automático" + } + }, "not-found-display": { "not-found": "<0>Não encontrado: </0><config />" }, + "pan-zoom-help": { + "ctrl-right-mouse": "", + "middle-mouse": "", + "pan-title": "", + "reset-double-click": "", + "title-pan-and-zoom-controls": "", + "zoom-scroll-wheel": "" + }, + "parallelogram-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automático" + } + }, + "params-editor": { + "aria-label-add": "Adicionar", + "aria-label-delete": "Excluir", + "placeholder-key": "Chave", + "placeholder-value": "Valor" + }, + "placement-editor": { + "label-constraints": "", + "label-position": "", + "loading": "Carregando..." + }, + "quick-positioning": { + "tooltip-align-bottom": "", + "tooltip-align-horizontal-centers": "", + "tooltip-align-left": "", + "tooltip-align-right": "", + "tooltip-align-top": "", + "tooltip-align-vertical-centers": "" + }, + "rectangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automático" + } + }, "text-display": { "double-click-to-set": "Clique duas vezes para definir o texto" + }, + "text-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automático" + } + }, + "tree-navigation-editor": { + "clear-selection": "Limpar seleção", + "frame-selection": "", + "label-add-item": "", + "missing-layer": "", + "no-settings": "", + "switcher-icon": { + "title-node-icon": "" + } + }, + "tree-node-title": { + "title-duplicate": "Duplicar", + "title-remove": "Remover", + "tooltip-duplicate": "Duplicar", + "tooltip-remove": "Remover" + }, + "triangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automático" + } } }, "carousel": { @@ -2981,6 +3590,22 @@ } }, "connections": { + "add-new-connection": { + "filter-by-options": { + "label": { + "all": "Tudo", + "installed": "Instalado", + "new-updates": "" + } + }, + "label": { + "by-downloads": "", + "by-name-az": "", + "by-name-za": "", + "by-published-date": "", + "by-updated-date": "" + } + }, "advisor-redirect-notice": { "aria-label-link-to-advisor": "Link para o Assistente", "body": "Experimente o novo Assistente para encontrar possíveis problemas com suas fontes de dados e plug-ins.", @@ -2997,6 +3622,22 @@ "body": "As fontes de dados têm um novo lar! Você pode descobrir novas fontes de dados ou gerenciar as atuais na página Conexões, disponível no menu principal.", "go-to-connections": "Ir para conexões" }, + "data-source-details-page": { + "subTitle": { + "datasource-could-found": "" + }, + "text": { + "unknown-datasource": "" + } + }, + "new-data-source-page": { + "subTitle": { + "choose-a-data-source-type": "" + }, + "text": { + "add-data-source": "Adicionar fonte de dados" + } + }, "no-access-modal": { "connection-contact-grafana-admin": "Para adicionar uma nova conexão, entre em contato com o administrador da Grafana.", "editor-warning": "Os editores não podem adicionar novas conexões. Você pode verificar se já está configurado em <2>Fontes de dados</2>.", @@ -3009,6 +3650,18 @@ "search": { "aria-label-search-all": "Buscar tudo", "placeholder": "Buscar tudo" + }, + "use-data-source-settings-nav": { + "node": { + "subTitle": { + "data-source-error": "" + } + }, + "page-nav": { + "text": { + "data-source-nav-node": "" + } + } } }, "core": { @@ -3304,6 +3957,11 @@ "title-plugin-dashboard": "Painel de plug-ins" }, "dash-nav": { + "on-open-snapshot-original": { + "title": { + "proceed-to-external-site": "" + } + }, "render-left-actions": { "text-public": "Pública", "tooltip-view-as-scene": "Visualizar como cena" @@ -3315,11 +3973,26 @@ "dashboard-loading": { "cancel-loading-dashboard": "Cancelar carregamento do painel" }, + "dashboard-page-error": { + "text": { + "not-found": "Não encontrado" + } + }, "dashboard-settings": { "actions": { "close": "Fechar" } }, + "dashboard-slice": { + "title": { + "dashboard-init-failed": "" + } + }, + "dashboard-srv": { + "message": { + "edit-dashboard-json": "" + } + }, "dashboard-validation": { "body-dashboard-failed-schema-validation": "A validação é fornecida para fins de desenvolvimento e é seguro ignorá-la. Se você é um desenvolvedor da Grafana, considere verificar e atualizar o esquema do painel", "title-checking-dashboard-validity": "Verificando a validade do painel", @@ -3415,6 +4088,13 @@ "values": "Valores separados por vírgula", "values-placeholder": "1, 10, mykey : myvalue, myvalue, escaped,value" }, + "datasource-options": { + "name-filter": "", + "name-filter-description": "", + "name-filter-placeholder": "", + "type": "Tipo", + "type-placeholder": "" + }, "description": "Descrição", "description-placeholder": "Texto descritivo", "label": "Etiqueta", @@ -3433,8 +4113,8 @@ "category": "Opções de seleção", "custom-all-value": "Personalizar todos os valores", "custom-all-value-description": "Uma expressão regular genérica ou outro valor para representar Tudo", - "include-all": "Opção Incluir tudo", - "include-all-description": "Ativa uma opção para incluir todos os valores", + "include-all": "", + "include-all-description": "", "multi-value": "Multivalor" }, "type-category": "Opções de {{type}}" @@ -3460,14 +4140,97 @@ "errors": { "failed-to-load": "Falha ao carregar o painel de controle" }, + "fetch-dashboard": { + "message": { + "failed-to-fetch-dashboard": "" + } + }, "gen-aihistory": { "aria-label-send-custom-feedback": "Enviar feedback personalizado", "footer-text": "Este conteúdo é gerado por IA usando o <2>plug-in Grafana LLM</2>", "placeholder-tell-ai-what-to-do-next": "Diga à IA o que fazer a seguir…" }, + "general-settings-unconnected": { + "editable-options": { + "label": { + "editable": "Editável", + "readonly": "" + } + } + }, + "get-debug-dashboard": { + "title": { + "annotations": "Anotações" + } + }, + "get-errors": { + "message": { + "error-loading-data": "" + } + }, "get-field-override-categories": { "label-add-field-override": "Adicionar substituição de campo", - "label-add-override-property": "Adicionar propriedade de substituição" + "label-add-override-property": "Adicionar propriedade de substituição", + "title": { + "add-button": "" + } + }, + "get-library-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "Informações", + "name": "Nome" + } + }, + "get-library-viz-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "Informações", + "name": "Nome" + } + }, + "get-panel-editor-tabs": { + "text": { + "alert": "", + "query": "Consulta", + "transform-data": "" + } + }, + "get-panel-frame-category": { + "descriptor": { + "title": { + "panel-options": "Opções do painel" + } + }, + "direction-options": { + "label": { + "horizontal": "Horizontal", + "vertical": "Vertical" + } + }, + "title": { + "description": "Descrição", + "max-per-row": "Máximo por linha", + "panel-links": "Links do painel", + "repeat-by-variable": "Repetir por variável", + "repeat-direction": "Repetir direção", + "repeat-options": "Opções de repetição", + "title": "Título", + "transparent-background": "Fundo transparente" + } + }, + "get-panel-menu": { + "text": { + "extensions": "" + } }, "help-wizard": { "copy-to-clipboard": "Copiar para a área de transferência", @@ -3480,10 +4243,21 @@ "randomize-field-names-label-field-names": "Nomes dos campos", "randomize-labels-label-labels": "Etiquetas", "randomize-string-values-label-string-values": "Valores da string", + "tabs": { + "label": { + "data": "Dados", + "snapshot": "Captura" + } + }, "title-complete-git-hub-comment-clipboard": "Copiar um comentário completo do GitHub para a área de transferência", "title-get-help-with-this-panel": "Obtenha ajuda com este painel", "troubleshooting-docs": "Documentação de solução de problemas" }, + "init-dashboard": { + "message": { + "failed-create-dashboard-model": "" + } + }, "inspect": { "data-tab": "Dados", "error-tab": "Erro", @@ -3536,6 +4310,16 @@ "rows": "Número total de linhas", "table-title": "Estatísticas" }, + "k8s-dashboard-api": { + "title": { + "deleted": "" + } + }, + "k8s-dashboard-v2api": { + "title": { + "deleted": "" + } + }, "layout": { "common": { "copy": "Copiar", @@ -3548,6 +4332,13 @@ "panel-layout-disabled": "Selecione uma linha ou aba para alterar as opções de layout do painel" } }, + "legacy-dashboard-api": { + "fetch-error": { + "message": { + "dashboard-not-found": "" + } + } + }, "make-editable": { "dashboard-not-editable": "Painel não editável", "make-editable": "Tornar editável" @@ -3567,6 +4358,20 @@ "menu-use-library-panel": "Usar painel da biblioteca" }, "new-panel-title": "Novo painel", + "on-create-new-row": { + "new-row": { + "title": { + "row-title": "" + } + } + }, + "on-create-new-widget-panel": { + "new-panel": { + "title": { + "widget-title": "" + } + } + }, "options": { "description": "Descrição", "title-option": "Título" @@ -3626,6 +4431,30 @@ "paused": "Este painel foi pausado pelo administrador", "try-again-later": "Tente novamente mais tarde" }, + "remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, + "repeat-row-select": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, + "repeat-row-select2": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, "revert-dashboard-modal": { "body-restore-version": "Tem certeza de que deseja restaurar o painel para a versão {{version}}? Todas as alterações não salvas serão perdidas.", "title-restore-version": "Restaurar versão" @@ -3739,6 +4568,18 @@ "sub-menu-un-connected": { "aria-label-template-variables": "Variáveis do modelo" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "tabs-layout": { "delete-tab-text": "A exclusão desta aba também removerá todos os painéis. Tem certeza de que deseja continuar?", "delete-tab-title": "Deseja excluir a aba?", @@ -3944,7 +4785,10 @@ }, "unthemed-dashboard-row": { "aria-label-delete-row": "Excluir linha", - "learn-more": "Saiba mais" + "learn-more": "Saiba mais", + "title": { + "delete-row": "Excluir linha" + } }, "validation": { "invalid-dashboard-id": "Não foi possível encontrar um ID do Grafana.com válido", @@ -3979,6 +4823,16 @@ }, "visualization-select-pane": { "placeholder-search-for": "Pesquisar por…", + "radio-options": { + "description": { + "reusable-panels-share-between-multiple-dashboards": "" + }, + "label": { + "library-panels": "Painéis de biblioteca", + "suggestions": "", + "visualizations": "" + } + }, "title-close": "Fechar" }, "viz-panel": { @@ -4029,12 +4883,25 @@ "label-data-source": "Fonte de dados", "label-use-static-key-dimensions": "Usar dimensões de chave estática" }, + "add-to-dashboard": { + "message": { + "could-navigate-selected-dashboard-please-again": "", + "could-panel-dashboard-please-again": "" + } + }, "add-to-dashboard-form": { "cancel": "Cancelar", "description-choose-where-to-add-the-panel": "Escolha onde adicionar o painel.", "description-select-which-dashboard-panel-created": "Selecione em qual painel de controle o painel será criado.", + "label": { + "existing-dashboard": "Painel existente", + "new-dashboard": "Novo painel de controle" + }, "label-dashboard": "Painel de controle", "label-target-dashboard": "Painel de destino", + "message": { + "this-field-is-required": "Este campo é obrigatório." + }, "open-dashboard": "Abrir o painel", "open-in-new-tab": "Abrir em nova aba", "title-error-adding-the-panel": "Erro ao adicionar o painel" @@ -4072,6 +4939,25 @@ "it-cannot-contain-or": "Não pode conter \"//\" ou \"..\".", "least-valid-character": "Precisa ter pelo menos um caractere válido." }, + "build-new-dashboard-save-model": { + "data": { + "title": { + "new-dashboard": "Novo painel de controle" + } + } + }, + "build-new-dashboard-save-model-v2": { + "data": { + "title": { + "new-dashboard": "Novo painel de controle" + } + } + }, + "config-public-dashboard": { + "title": { + "revoke-public-url": "Revogar URL público" + } + }, "constant-variable-form": { "constant-options": "Opções constantes", "label-value": "Valor", @@ -4119,22 +5005,89 @@ "value-not-saved": "O valor ainda não está salvo no banco de dados da Grafana", "view-pull-request-in-git-hub": "Ver solicitação de pull no GitHub" }, + "dashboard-scene": { + "text": { + "edit-panel": "", + "view-panel": "Visualizar painel" + }, + "title": { + "dashboard": "Painel de controle", + "discard-changes-to-dashboard": "" + } + }, + "dashboard-scene-page-state-manager": { + "message": { + "dashboard-not-found": "" + } + }, + "dashboard-scene-page-state-manager-v2": { + "message": { + "dashboard-not-found": "" + } + }, "data-source-variable-form": { "data-source-options": "Opções de fonte de dados", "description-instance-name-filter": "Filtro Regex para as instâncias de fonte de dados a serem escolhidas na lista de valores de variáveis. Deixe em branco para todos.", "example-instance-name-filter": "Exemplo: <codeExample />", "selection-options": "Opções de seleção" }, + "default-grid-layout-manager": { + "row": { + "title": { + "row-title": "" + } + } + }, "description-label": { "description": "Descrição" }, + "edit-link-view": { + "edit-link-page-nav": { + "text": { + "edit-link": "Editar link" + } + } + }, "email-list": { "aria-label-emailmenu": "Alternar menu de e-mail" }, + "embedded-dashboard-test-page": { + "subTitle": { + "showing-dashboard-panel-tests-pie-chart": "" + }, + "text": { + "embedding-dashboard": "" + } + }, "empty-transformations-message": { "add-transformation": "Adicionar transformação" }, + "get-edit-options": { + "title": { + "column-options": "", + "row-height-options": "" + } + }, + "get-panel-frame-options": { + "descriptor": { + "title": { + "panel-options": "Opções do painel" + } + }, + "title": { + "description": "Descrição", + "panel-links": "Links do painel", + "title": "Título", + "transparent-background": "Fundo transparente" + } + }, + "get-workflow-options": { + "label": { + "push-to-a-new-branch": "" + } + }, "group-by-variable-form": { + "alert-not-supported": "", "description-enables-users-custom-values": "Permite que os usuários adicionem valores personalizados à lista", "description-provide-dimensions-as-csv-dimension-name-dimension-id": "Forneça dimensões como CSV: {{name}}, {{value}}", "group-by-options": "Agrupar por opções", @@ -4153,6 +5106,12 @@ "randomize-field-names-label-field-names": "Nomes dos campos", "randomize-labels-label-labels": "Etiquetas", "randomize-string-values-label-string-values": "Valores da string", + "tabs": { + "label": { + "data": "Dados", + "snapshot": "Captura" + } + }, "title-complete-git-hub-comment-clipboard": "Copiar um comentário completo do GitHub para a área de transferência", "title-get-help-with-this-panel": "Obtenha ajuda com este painel", "troubleshooting-docs": "Documentação de solução de problemas", @@ -4195,6 +5154,14 @@ "body-name-already-exists": "Já existe um painel com o mesmo nome na pasta selecionada. Deseja salvar este painel mesmo assim?", "title-name-already-exists": "O nome já existe" }, + "on-remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, "panel-data-alerting-tab-rendered": { "alert": { "title-errors-loading-rules": "Erros ao carregar regras" @@ -4216,6 +5183,11 @@ "table-view-aria-label-toggletableview": "Alternar visualização de tabela", "table-view-label-table-view": "Visualização de tabela" }, + "panel-editor": { + "text": { + "edit-panel": "" + } + }, "panel-editor-renderer": { "aria-label-open-options-pane": "Abrir painel de opções", "tooltip-open-options-pane": "Abrir painel de opções" @@ -4224,8 +5196,22 @@ "body-panel-plugin-not-loaded": "Verifique se o painel que você deseja inspecionar pode ser visualizado e foi exibido antes de abrir a inspeção.", "title-panel-plugin-not-loaded": "O plug-in do painel não foi carregado" }, + "panel-menu-behavior": { + "async-func": { + "text": { + "extensions": "", + "metrics-drilldown": "" + } + } + }, "panel-viz-type-picker": { "placeholder-search-for": "Pesquisar por…", + "radio-options": { + "label": { + "suggestions": "", + "visualizations": "" + } + }, "title-close": "Fechar" }, "provisioned-delete-modal": { @@ -4252,6 +5238,15 @@ "query-options": "Opções de consulta", "selection-options": "Opções de seleção" }, + "resource-export": { + "label": { + "classic": "", + "json": "JSON", + "v1-resource": "", + "v2-resource": "", + "yaml": "" + } + }, "revert-dashboard-modal": { "body-restore-version": "Tem certeza de que deseja restaurar o painel para a versão {{version}}? Todas as alterações não salvas serão perdidas.", "title-restore-version": "Restaurar versão" @@ -4360,6 +5355,18 @@ "solo-panel-page": { "loading": "Carregando" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "text-box-variable-form": { "placeholder-default-value-if-any": "(opcional)", "text-options": "Opções de texto" @@ -4370,6 +5377,13 @@ "title-field-label": { "title": "Título" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "transformations-drawer": { "search-box-suffix": { "tooltip-clear-search": "Limpar pesquisa" @@ -4385,6 +5399,13 @@ "save-dashboard": "Salvar painel de controle", "title-unsaved-changes": "Alterações não salvas" }, + "use-dashboard-edit-page-nav": { + "page-nav": { + "text": { + "settings": "Configurações" + } + } + }, "variable-check-indicator": { "aria-label-variable-referenced-dashboard": "Esta variável não é referenciada por nenhuma variável ou painel.", "aria-label-variable-referenced-other-variables-dashboard": "Esta variável é referenciada por outras variáveis ou painel.", @@ -4401,7 +5422,10 @@ "placeholder-descriptive-text": "Texto descritivo", "placeholder-label-name": "Nome do rótulo", "placeholder-variable-name": "Nome da variável", - "text-running-query": "Executando consulta…" + "text-running-query": "Executando consulta…", + "title": { + "delete-variable": "Excluir variável" + } }, "variable-editor-list": { "definition": "Definição", @@ -4583,6 +5607,25 @@ "message": "Nenhuma fonte de dados encontrada" } }, + "datagrid": { + "add-column": { + "placeholder-column-name": "" + }, + "datagrid-context-menu": { + "render-context-menu-items": { + "label-clear-column": "", + "label-clear-row": "", + "label-remove-all-data": "", + "label-search": "Procurar…" + }, + "render-header-menu-items": { + "label-clear-column": "", + "label-delete-column": "", + "label-rename-column": "", + "label-set-field-type": "" + } + } + }, "datasources": { "add-new-data-source-button": { "tooltip-no-permission": "Você não tem permissão para configurar novas fontes de dados" @@ -4604,6 +5647,46 @@ "label-default": "Padrão", "label-name": "Nome" }, + "build-categories": { + "categories": { + "title": { + "cloud": "", + "distributed-tracing": "", + "enterprise-plugins": "Plug-ins empresariais", + "industrial-io-t": "", + "logging-document-databases": "", + "others": "", + "profiling": "", + "sql": "", + "time-series-databases": "" + } + } + }, + "build-nav-model": { + "analytics": { + "text": { + "insights": "Insights" + } + }, + "caching": { + "text": { + "cache": "" + } + }, + "ds-permissions": { + "text": { + "permissions": "Permissões" + } + }, + "nav-model": { + "text": { + "settings": "Configurações" + } + }, + "text": { + "dashboards": "Painéis de controle" + } + }, "button-row": { "delete": "Excluir", "save-and-test": "Salvar e testar", @@ -4639,6 +5722,11 @@ "data-source-read-only-message": { "title-provisioned-data-source": "Fonte de dados provisionada" }, + "data-source-settings-reducer": { + "message": { + "testing-could-couple-minutes": "" + } + }, "data-source-type-card": { "aria-label-learn-more": "{{dataSourcePluginName}}, saiba mais." }, @@ -4656,13 +5744,88 @@ "footer": { "add-csv-or-spreadsheet": "Adicionar csv ou planilha" }, + "get-enterprise-phantom-plugins": { + "description": { + "adobe-analytics-datasource": "", + "app-dynamics-integration-and-data-source": "", + "atlassian-statuspage-datasource": "", + "aurora-data-source": "", + "azure-cosmos-db-datasource": "", + "azure-devops-datasource": "", + "catchpoint-datasource": "", + "cloudflare-datasource": "", + "cockroach-db-datasource": "", + "data-dog-integration-and-data-source": "", + "drone-datasource": "", + "git-lab-integration-and-datasource": "", + "honeycomb-integration-and-datasource": "", + "jira-integration-and-datasource": "", + "logic-monitor-devices-datasource": "", + "mongo-db-integration-and-data-source": "", + "netlify-datasource": "", + "new-relic-integration-and-data-source": "", + "pager-duty-datasource": "", + "salesforce-integration-and-datasource": "", + "sap-hana-integration-and-data-source": "", + "service-now-integration-and-data-source": "", + "signal-fx-integration-and-datasource": "", + "snowflake-integration-and-data-source": "", + "sumo-logic-integration-and-datasource": "", + "visualize-and-explore-dynatrace-data": "", + "visualize-and-explore-oracle-sql": "", + "visualize-and-explore-splunk-logs": "", + "wavefront-integration-and-data-source": "", + "zendesk-datasource": "" + } + }, + "get-grafana-cloud-phantom-plugin": { + "description": { + "hosted-graphite-prometheus-and-loki": "" + } + }, "new-data-source-view": { "cancel": "Cancelar", "placeholder-filter-by-name-or-type": "Filtrar por nome ou tipo" }, + "update-data-source": { + "error-info": { + "message": { + "an-unexpected-error-occurred": "" + } + } + }, "use-data-source-info": { "badge-text-not-supported": "Não suportado", - "badge-text-supported": "Compatível" + "badge-text-supported": "Compatível", + "label": { + "alerting": "Alertas", + "type": "Tipo" + } + }, + "use-delete-loaded-data-source": { + "title": { + "delete": "Excluir" + } + } + }, + "debug": { + "cursor-view": { + "no-events-yet": "" + }, + "render-info-viewer": { + "data-counter": "", + "elapsed-time": "", + "field": "Campo", + "last": "", + "render-counter": "", + "schema-counter": "", + "title-reset-counters": "", + "tooltip-step-back": "", + "type": "Tipo" + }, + "state-view": { + "current-value": "", + "label-state-name": "" } }, "dimensions": { @@ -4731,6 +5894,19 @@ "remove-value-mapping-aria-label-delete-value-mapping": "Excluir mapeamento de valor", "remove-value-mapping-tooltip-delete": "Excluir", "set-color": "Definir cor", + "special-match-options": { + "description": { + "boolean-false-values": "", + "boolean-true-values": "", + "empty-string": "", + "matches-against-number-na-n-not-a-number": "", + "matches-null-and-undefined-values": "", + "matches-null-undefined-and-na-n": "" + }, + "label": { + "empty": "Vazio" + } + }, "tooltip-remove-color": "Remover cor", "tooltip-remove-icon": "Remover ícone" }, @@ -4746,6 +5922,20 @@ "display-text": "Texto da exibição", "icon": "Ícone", "label-add-a-new-mapping": "Adicionar um novo mapeamento", + "mapping-types": { + "description": { + "match-a-numerical-range-of-values": "", + "match-a-regular-expression-with-replacement": "", + "match-a-specific-text-value": "", + "match-boolean-empty-values": "" + }, + "label": { + "range": "", + "regex": "", + "special": "", + "value": "Valor" + } + }, "update": "Atualizar" } }, @@ -4770,6 +5960,7 @@ }, "explore": { "accordian-logs": { + "events": "", "footer": "Os registros de data/hora do evento se referem ao horário de início do rastro completo." }, "accordian-references": { @@ -4780,6 +5971,11 @@ "basic-extensions": { "aria-label-add": "Adicionar" }, + "build-dashboard-panel-from-explore-state": { + "title": { + "new-panel": "" + } + }, "clear": "Limpar", "confirm-navigation-modal": { "cancel": "Cancelar", @@ -4866,6 +6062,33 @@ "title-table": "Tabela", "title-traces": "Rastros" }, + "explore-query-inspector": { + "data-tab": { + "label": { + "data": "Dados" + } + }, + "error-tab": { + "label": { + "error": "Erro" + } + }, + "json-tab": { + "label": { + "json": "JSON" + } + }, + "query-tab": { + "label": { + "query": "Consulta" + } + }, + "stats-tab": { + "label": { + "stats": "Estatísticas" + } + } + }, "explore-run-query-button": { "run-button": { "aria-label-run-query-options": "Executar opções de consulta" @@ -4879,10 +6102,23 @@ "description-explore-disabled": "Para ativar o Explore, ative-o na configuração da Grafana:", "title-explore-disabled": "O Explore está desativado" }, + "get-field-links-for-explore": { + "text": { + "data": "Dados", + "raw-value": "" + } + }, "get-matches-metadata": { "matches": "0 correspondências" }, "legacy-create-span-link-factory": { + "text": { + "tags": "Tags" + }, + "title": { + "related-logs": "", + "session-for-this-span": "Sessão para este intervalo" + }, "title-explore-metrics-for-this-span": "Explorar métricas para este intervalo", "title-explore-split": "Explore os logs sobre isso com a visualização dividida", "title-session-for-this-span": "Sessão para este intervalo" @@ -4923,6 +6159,10 @@ }, "logs-meta-row": { "download": "Baixar", + "label": { + "deduplication-count": "", + "showing-only-selected-fields": "" + }, "show-original-line": "Exibir linha original" }, "logs-sample-panel": { @@ -5104,6 +6344,21 @@ "run-query-button": "Executar consulta", "switch-datasource-button": "Alternar fonte de dados e executar consulta" }, + "scoped-vars-from-span": { + "text": { + "span": "" + } + }, + "scoped-vars-from-tags": { + "text": { + "tags": "Tags" + } + }, + "scoped-vars-from-trace": { + "text": { + "trace": "Rastro" + } + }, "search-bar-input": { "placeholder-find": "Localizar…", "suffix": { @@ -5138,9 +6393,25 @@ "tooltip-tag-key": "Chave de tag que será usada para obter o valor da tag. Os atributos e recursos de um intervalo serão pesquisados para a chave de tag" }, "span-detail": { + "label": { + "kind": "", + "library-name": "", + "library-version": "", + "status": "Status:", + "status-message": "", + "trace-state": "" + }, "label-resource-attributes": "Atributos do recurso", "label-span-attributes": "Atributos de intervalo", "label-stack-trace": "Rastro de pilha", + "overview-items": { + "label": { + "child-count": "", + "duration": "", + "service": "", + "start-time": "" + } + }, "warnings": "Avisos" }, "span-filters": { @@ -5247,6 +6518,18 @@ "title-node-graph": "Gráfico de nós" }, "unthemed-logs": { + "description": { + "show-results-in-logs-visualisation": "", + "show-results-in-table-visualisation": "", + "show-results-newest-to-oldest": "", + "show-results-oldest-to-newest": "" + }, + "label": { + "logs": "Logs", + "newest-first": "Mais recentes primeiro", + "oldest-first": "Mais antigos primeiro", + "table": "Tabela" + }, "label-deduplication": "Desduplicação", "label-display-results": "Exibir resultados", "label-prettify-json": "Embelezar JSON", @@ -5262,6 +6545,15 @@ }, "unthemed-virtualized-trace-view": { "title-scroll-to-top": "Rolar para cima" + }, + "use-focus-span-link": { + "create-focus-span-link": { + "link": { + "title": { + "deep-link-to-this-span": "" + } + } + } } }, "export": { @@ -5347,6 +6639,15 @@ "folder-repo": { "badge-text": "Provisionado" }, + "folders": { + "get-loading-nav": { + "main": { + "title": { + "loading": "Carregando" + } + } + } + }, "forgot-password": { "back-button": "Voltar para o login", "change-password": { @@ -5376,10 +6677,102 @@ "incomplete-request-error": "Não foi possível concluir sua solicitação. Tente novamente.", "send-custom-feedback": "Enviar" }, + "geomap": { + "coordinates-map-view-editor": { + "label-latitude": "", + "label-longitude": "" + }, + "debug-overlay": { + "center": "", + "zoom": "" + }, + "fit-map-view-editor": { + "all-layers-editor-fragment": { + "label-layer": "" + }, + "label-data": "Dados", + "last-only-editor-fragment": { + "label-padding": "", + "tooltip-padding-relative-percent-beyond-extent": "" + } + }, + "frame-multi-selection-editor": { + "placeholder-change-filter": "" + }, + "frame-selection-editor": { + "placeholder-change-filter": "" + }, + "geomap-panel": { + "aria-label-map": "" + }, + "geomap-style-rules-editor": { + "aria-label-add-geomap-style-rule": "" + }, + "layers-editor": { + "label-add-layer": "", + "no-layers": "" + }, + "map-view-editor": { + "label-max-zoom": "", + "label-view": "Visualizar", + "label-zoom": "Zoom", + "use-current-map-settings": "" + }, + "markers-legend": { + "title-symbol": "Símbolo" + }, + "measure-overlay": { + "tooltip-show-measure-tools": "" + }, + "plugin": { + "basemap-layer-configured-server-admin": "" + }, + "style-editor": { + "label-align": "", + "label-baseline": "", + "label-color": "Cor", + "label-fill-opacity": "", + "label-font-size": "", + "label-opacity": "", + "label-rotation-angle": "", + "label-size": "", + "label-symbol": "Símbolo", + "label-symbol-horizontal-align": "", + "label-symbol-vertical-align": "", + "label-text-label": "", + "label-x-offset": "", + "label-y-offset": "" + }, + "style-rule-editor": { + "aria-label-comparison-operator": "Operador de comparação", + "aria-label-comparison-value": "", + "aria-label-delete-style-rule": "", + "aria-label-feature-property": "", + "label-rule": "Regra", + "placeholder-feature-property": "", + "placeholder-numeric-value": "", + "placeholder-value": "valor" + } + }, "get-enterprise": { "requires-license": "É necessário ter uma licença da Grafana Enterprise", "title": "Enterprise" }, + "gettingstarted": { + "docs-card": { + "complete": "completo", + "learn-how": "" + }, + "getting-started": { + "aria-label-to-advanced-tutorials": "", + "aria-label-to-basic-tutorials": "", + "checking-completed-setup-steps": "", + "remove-this-panel": "" + }, + "tutorial-card": { + "complete": "completo" + } + }, "gops": { "config-card": { "text-loading-configuration": "Carregando configuração…" @@ -5396,6 +6789,74 @@ }, "progress-status": { "your-progress": "Seu progresso" + }, + "use-get-configuration-for-ui": { + "get-connect-data-source-configuration": { + "title": { + "connect-data-source": "" + } + }, + "title": { + "essentials": "Fundamentos" + } + }, + "use-get-essentials-configuration": { + "essential-content": { + "description": { + "configure-grafana-alerting": "", + "create-integration-alerting-contact-point": "", + "initialize-incident-plugin-declare-manage-incidents": "", + "practice-solving-an-incident": "", + "receive-alerts-oncall-notifications-within-environment": "", + "select-chat-ops-channels-to-route-notifications": "" + }, + "label": { + "add": "Adicionar", + "connect": "Conectar", + "initialize": "", + "select-integration": "", + "start-drill": "" + }, + "title": { + "add-slack-notifications-to-irm-integrations": "", + "connect-alerting-to-irm": "", + "connect-irm-to-your-slack-workspace": "", + "connect-your-messaging-workspace-to-incident": "", + "connect-your-messaging-workspace-to-on-call": "", + "create-incident-drill": "", + "detect": "Detectar", + "initialize-incident-plugin": "", + "messaging-workspace-channel-on-call-integration": "", + "respond": "", + "test-your-configuration": "" + } + }, + "get-grafana-alerting-config-steps": { + "description": { + "create-alert-monitor-system": "", + "create-on-call-integration-alerting-contact-point": "", + "create-slos-to-monitor-your-service": "" + }, + "label": { + "connect": "Conectar", + "create": "Criar", + "enable": "Ativar" + }, + "steps": { + "label": { + "edit": "Editar" + }, + "title": { + "update-default-contact-point": "" + } + }, + "title": { + "connect-alerting-to-on-call": "", + "create-alert-rule": "Criar regra de alerta", + "create-slo": "", + "enable-slo-alerting": "" + } + } } }, "grafana": { @@ -5762,14 +7223,18 @@ "duplicate-panel": "Duplicar painel", "exit-edit/setting-views": "Sair/editar visualizações", "expand-all-rows": "Expandir todas as linhas", + "explore-panel": "", "go-to-dashboards": "Ir para Painéis de controle", "go-to-explore": "Ir para Explorar", "go-to-home-dashboard": "Ir para Painel de controle inicial", "go-to-profile": "Ir para Perfil", + "inspect-panel": "", "make-time-range-permanent": "Tornar o intervalo de tempo absoluto/permanente", "move-time-range-back": "Mover intervalo de tempo para trás", "move-time-range-forward": "Avançar intervalo de tempo", "open-search": "Abrir busca", + "open-share-embed-drawer": "", + "open-share-link-drawer": "", "open-shared-modal": "Compartilhar captura do painel", "paste-time-range": "Colar intervalo de tempo", "refresh-all-panels": "Atualizar todos os painéis", @@ -5795,6 +7260,11 @@ "support-bundle": "Você também pode obter um pacote de ajuda com as informações da sua instância da Grafana e fontes de dados configuradas na <1>seção de pacotes de ajuda</1>.", "troubleshooting-help": "Para solicitar ajuda para resolver problemas, envie uma captura deste painel para o suporte técnico da Grafana Labs. A captura contém dados de respostas à consulta e configurações do painel." }, + "histogram": { + "histogram-panel": { + "no-histogram-found-in-response": "" + } + }, "inspector": { "inspect-data-tab": { "loading": "Carregando", @@ -5844,6 +7314,9 @@ "label-name": "Nome", "label-password": "Senha", "label-username": "Nome de usuário", + "message": { + "email-is-invalid": "" + }, "placeholder-name-optional": "Nome (opcional)", "placeholder-password": "Senha", "placeholder-username": "Nome de usuário", @@ -6103,8 +7576,26 @@ "discard-local-changes": "Descartar alterações locais", "title-dashboard-changed": "Painel alterado" }, + "live-channel-editor": { + "description-grafana-live": "", + "namespace": "Nomenclatura", + "path": "Caminho", + "placeholder-select-watchable-resource": "", + "scope": "", + "title-grafana-live": "" + }, "live-connection-warning": { "title-connection-to-server-is-lost": "Você perdeu a conexão com o servidor…" + }, + "live-panel": { + "error": "Erro", + "grafana-requires-feature": "", + "panel-editor-channel": "", + "title-grafana-live": "", + "waiting-for-data": "" + }, + "live-publish": { + "publish": "" } }, "lock-icon": "ícone de bloqueio", @@ -6151,6 +7642,13 @@ } }, "logs": { + "get-dataframe-fields": { + "vars": { + "text": { + "labels": "Etiquetas" + } + } + }, "infinite-scroll": { "end-of-range": "Fim do intervalo de tempo selecionado.", "load-more": "Role para carregar mais", @@ -6231,6 +7729,11 @@ "shortcut": "alt+selecionar para ativar novamente" } }, + "log-series-to-logs-model": { + "label": { + "total-bytes-processed": "" + } + }, "logs-controls": { "deduplication": "Desduplicação", "disable-highlighting": "Desativar destaque", @@ -6265,6 +7768,11 @@ "scroll-top": "Rolar para cima", "start-of-range": "Início do intervalo" }, + "logs-panel": { + "render-common-labels": { + "common-labels": "" + } + }, "out-of-range-message": { "end-of-the-selected-time-range": "Fim do intervalo de tempo selecionado." }, @@ -6321,6 +7829,14 @@ }, "snapshot-list-table": { "title-delete": "Excluir" + }, + "unthemed-dashboard-import": { + "subTitle": { + "import-dashboard-from-file-or-grafanacom": "" + }, + "text": { + "import-dashboard": "Importar painel de controle" + } } }, "migrate-to-cloud": { @@ -6978,8 +8494,57 @@ "close": "Fechar menu" }, "link-title": "Acessar o blog da Grafana Labs", + "news-panel": { + "body-error-loading-rss-feed": "", + "loading": "Carregando...", + "title-error-loading-rss-feed": "" + }, "title": "Mais recentes do blog" }, + "nodeGraph": { + "arc-options-editor": { + "add-arc": "", + "title-remove-arc": "" + }, + "edge": { + "aria-label-from-to": "" + }, + "edge-header": { + "label-source-target": "" + }, + "marker": { + "100-node-count": "", + "aria-label-hidden-marker": "", + "node-count_one": "", + "node-count_other": "" + }, + "node": { + "aria-label-node-title": "" + }, + "node-graph": { + "aria-label-layered-layout-performance-warning": "", + "aria-label-nodes-hidden-warning": "", + "computing-layout": "", + "no-data": "Sem dados", + "hidden-nodes_one": "", + "hidden-nodes_other": "", + "processed-nodes_one": "", + "processed-nodes_other": "" + }, + "node-graph-panel": { + "no-data-found-in-response": "" + }, + "node-header": { + "label-subtitle": "", + "label-title": "Título" + }, + "view-controls": { + "hide-config": "", + "show-config": "", + "title-zoom-in": "", + "title-zoom-out": "" + } + }, "notifications": { "empty-state": { "description": "As suas notificações aparecerão aqui", @@ -7021,6 +8586,11 @@ "label-organization-name": "Nome da organização", "placeholder-org-name": "Nome da org." }, + "org-details-page": { + "title": { + "confirm-preferences-update": "" + } + }, "org-profile": { "label-organization-name": "Nome da organização", "label-organization-profile": "Perfil da organização", @@ -7040,7 +8610,10 @@ "tooltip": "Agora você pode selecionar a opção \"Sem função básica\" e adicionar permissões personalizadas com base nas suas necessidades. Você pode encontrar mais informações em <1>nossa documentação</1>." }, "user-invite-page": { - "sub-title": "Envie um convite ou adicione um usuário que já possui conta na Grafana à organização.<1> {{orgName}}</1>" + "sub-title": "Envie um convite ou adicione um usuário que já possui conta na Grafana à organização.<1> {{orgName}}</1>", + "text": { + "invite-user": "" + } } }, "org-picker": { @@ -7052,6 +8625,38 @@ } }, "panel": { + "get-calculation-value-data-links-variable-suggestions": { + "value-calc-var": { + "label": { + "calculation-name": "" + } + } + }, + "get-data-links-variable-suggestions": { + "value-time-var": { + "label": { + "time": "Tempo" + } + } + }, + "get-field-links-supplier": { + "text": { + "data": "Dados", + "field": "Campo", + "series": "", + "value": "Valor" + } + }, + "get-field-vars": { + "label": { + "name": "Nome" + } + }, + "get-panel-links-variable-suggestions": { + "label": { + "all-variables": "" + } + }, "header-menu": { "copy": "Copiar", "create-library-panel": "Criar painel de biblioteca", @@ -7112,6 +8717,13 @@ "select-placeholder": "Filtrar por tipo" }, "playlist": { + "playlist-new-page": { + "page-nav": { + "text": { + "new-playlist": "Nova lista de reprodução" + } + } + }, "playlist-table-rows": { "aria-label-playlist-item": "Item da lista de reprodução, {{itemType}}, {{itemValue}}", "multiple-dashboards-found": "Vários itens encontrados: {{items}}", @@ -7128,6 +8740,12 @@ "label-mode": "Modo", "label-time-and-refresh": "Tempo e atualização", "label-variables": "Variáveis", + "modes": { + "label": { + "kiosk": "Quiosque", + "normal": "Normal" + } + }, "title-start-playlist": "Começar lista de reprodução" } }, @@ -7194,6 +8812,19 @@ }, "browse": { "aria-label-plugin-type-filter": "Filtro de tipo de plug-in", + "filter-by-options": { + "label": { + "all": "Tudo", + "installed": "Instalado", + "new-updates": "" + } + }, + "label": { + "all": "Tudo", + "applications": "", + "data-sources": "Fontes de dados", + "panels": "Painéis" + }, "label-search": "Pesquisar", "label-state": "Estado", "label-type": "Tipo", @@ -7275,12 +8906,24 @@ "empty-state": { "message": "Nenhum plug-in encontrado" }, + "extensions-log-data-source": { + "message": { + "ok": "OK" + } + }, "filter": { "disabled": "Este filtro foi desativado porque o servidor da Grafana não consegue acessar o endereço grafana.com", "sort": "Ordenar", "sort-list": "Ordenar lista de plug-ins", "state": "Estado" }, + "get-feature-state-info": { + "text": { + "alpha": "", + "beta": "Beta", + "deprecated": "Descontinuado" + } + }, "get-started-with-app": { "disable": "Desativar", "enable": "Ativar" @@ -7337,6 +8980,16 @@ "plugin-details-header-dependencies": { "grafana-dependency": "{{grafanaDependency}} da Grafana" }, + "plugin-details-page": { + "not-found-model": { + "subTitle": { + "requested-belong-plugin": "" + }, + "text": { + "unknown-plugin": "" + } + } + }, "plugin-details-signature": { "body-invalid-plugin-signature": "A Grafana Labs verifica cada plug-in para confirmar se há uma assinatura digital válida. A verificação da assinatura do plug-in faz parte das nossas medidas de segurança para garantir que os plug-ins sejam seguros e confiáveis. A Grafana Labs não pode garantir a integridade deste plug-in sem assinatura. Peça ao autor do plug-in para solicitar que ele seja assinado.", "read-more-about-plugins-signing": "Leia mais sobre a assinatura de plug-ins.", @@ -7382,6 +9035,13 @@ "search-field": { "placeholder-search-grafana-plugins": "Pesquisar plug-ins da Grafana" }, + "use-plugin-details-tabs": { + "nav-model-children": { + "text": { + "dashboards": "Painéis de controle" + } + } + }, "version-install-button": { "text-installed": "Instalado" }, @@ -7499,6 +9159,11 @@ "label-git-hub-features": "Recursos do GitHub", "label-realtime-feedback": "Feedback em tempo real" }, + "connect-page": { + "subTitle": { + "connect-external-storage-manage-resources": "" + } + }, "connect-repository-button": { "configure": "Configuração", "configure-file": "Configurar o provisionamento de arquivos", @@ -7532,7 +9197,13 @@ }, "edit-repository-page": { "back-to-repositories": "Voltar para os repositórios", - "repository-config-exists-configuration": "Verifique se a configuração do repositório existe no arquivo de configuração." + "repository-config-exists-configuration": "Verifique se a configuração do repositório existe no arquivo de configuração.", + "subTitle": { + "configure-repository-storing-resources": "" + }, + "text": { + "configure-repository": "" + } }, "empty-state": { "no-jobs": "Sem tarefas…" @@ -7595,6 +9266,11 @@ "no-results-matching-your-query": "Nenhum resultado corresponde à sua consulta", "placeholder-search": "Pesquisar" }, + "get-default-values": { + "title": { + "repository": "Repositório" + } + }, "getting-started": { "alert-temporary-outage": "Quando você conectar toda a sua instância, os painéis ficarão indisponíveis durante a execução da migração. Recomendamos que você avise a seus usuários antes de iniciar o processo.", "modal-description-public-access": "Configure o acesso público à sua instância da Grafana para ativar a integração do GitHub", @@ -7739,7 +9415,18 @@ "dashboard-preview": "Pré-visualização do painel", "existing-dashboard": "Painel existente", "history": "Histórico", + "message": { + "removed-from-repo-test-ui": "", + "updated-from-repo-test-ui": "" + }, "repository": "Repositório", + "tab-info": { + "label": { + "dry-run-result-after-apply": "", + "existing-from-grafana": "", + "file-from-repository": "" + } + }, "title-error-saving-file": "Erro ao salvar o arquivo" }, "setup-modal": { @@ -8152,14 +9839,6 @@ "reload-button": "Recarregar", "title": "Não foi possível encontrar o arquivo do aplicativo" }, - "sandbox": { - "test-stuff-page": { - "application-notifications-toasts-testing": "Teste de notificações de aplicativo (notificações pop-up)", - "error": "Erro", - "success": "Sucesso", - "warning": "Aviso" - } - }, "save-dashboards": { "message-length": { "info": "A mensagem tem {{messageLength}} caracteres e excede o tamanho máximo de 500 caracteres. Reduza o tamanho da mensagem antes de salvar.", @@ -8219,6 +9898,14 @@ "view-as-folders": "Visualizar por pastas", "view-as-list": "Visualizar como lista" }, + "bluge-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } + }, "dashboard-actions": { "import": "Importar", "new": "Novo", @@ -8246,6 +9933,14 @@ "search-results-table": { "aria-label-search-results-table": "Tabela de resultados da pesquisa", "no-data": "Sem valores" + }, + "unified-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } } }, "select": { @@ -8317,6 +10012,11 @@ "delete-service-account": "Excluir conta de serviço", "disable-service-account": "Desativar conta de serviço", "enable-service-account": "Ativar conta de serviço", + "page-nav": { + "subTitle": { + "manage-settings-individual-service-account": "" + } + }, "title-delete-service-account": "Excluir conta de serviço", "title-disable-service-account": "Desativar conta de serviço", "tokens": "Tokens", @@ -8633,6 +10333,12 @@ "sort-picker": { "select-aria-label": "Ordenar" }, + "status-history": { + "status-history-panel": { + "too-many-points_one": "", + "too-many-points_other": "" + } + }, "support-bundles": { "new-bundle-button": { "new-support-bundle": "Novo pacote de suporte" @@ -8640,7 +10346,10 @@ "support-bundles-create-unconnected": { "cancel": "Cancelar", "create": "Criar", - "sub-title": "Escolha os componentes para o pacote de ajuda. O pacote de suporte estará disponível por 3 dias após a criação." + "sub-title": "Escolha os componentes para o pacote de ajuda. O pacote de suporte estará disponível por 3 dias após a criação.", + "text": { + "create-support-bundle": "" + } }, "support-bundles-unconnected": { "created-on": "Criado em", @@ -8655,10 +10364,35 @@ "login": "Entrar" }, "table": { + "auto-cell-options-editor": { + "description-wrap-text": "", + "label-wrap-text": "" + }, + "bar-gauge-cell-options-editor": { + "label-gauge-display-mode": "", + "label-value-display": "" + }, + "color-background-cell-options-editor": { + "description-apply-to-entire-row": "", + "description-wrap-text": "", + "label": { + "text-alpha": "" + }, + "label-apply-to-entire-row": "", + "label-background-display-mode": "", + "label-wrap-text": "", + "wrap-text": "" + }, "container": { "content": "Mostrar muitas colunas em uma única tabela pode afetar o desempenho e dificultar a leitura dos dados. Considere refinar suas consultas.", "show-all-series": "Mostrar todas as colunas", "show-only-series": "Mostrando apenas {{MAX_NUMBER_OF_COLUMNS}} colunas" + }, + "image-cell-options-editor": { + "description-alt-text": "", + "description-title-text": "", + "label-alt-text": "", + "label-title-text": "" } }, "tag-filter": { @@ -8674,6 +10408,24 @@ "select-placeholder": "Selecione uma equipe" }, "teams": { + "build-nav-model": { + "nav-model": { + "subTitle": { + "manage-members-and-settings": "" + }, + "text": { + "settings": "Configurações" + } + }, + "team-group-sync": { + "text": { + "external-group-sync": "Sincronização de grupo externo" + } + }, + "text": { + "members": "Membros" + } + }, "create-team": { "create": "Criar", "description-email": "Isso é opcional e é usado principalmente para permitir avatares de equipe personalizados", @@ -8695,6 +10447,9 @@ "external-group-sync": "Sincronização de grupo externo", "label-add-external-group": "Adicionar grupo externo", "team-sync-upgrade": "Adicione um grupo para ativar a sincronização de equipe gratuitamente durante seu teste da Grafana Pro", + "text": { + "add-group": "Adicionar grupo" + }, "title-there-external-groups": "Não há grupos externos para sincronizar", "tooltip-add-external-group": "Exemplo de grupo LDAP: {{example}}" }, @@ -8796,6 +10551,42 @@ "select-search-input": "Tipo de busca (país, cidade, abreviação)" } }, + "timeseries": { + "annotation-editor2": { + "add-annotation": "Adicionar anotação", + "cancel": "Cancelar", + "edit-annotation": "", + "label-description": "Descrição", + "label-tags": "Tags", + "placeholder-add-tags": "", + "save": "Salvar", + "saving": "Salvando" + }, + "annotation-tooltip2": { + "tooltip-delete": "Excluir", + "tooltip-edit": "Editar" + }, + "line-style-editor": { + "title-the-input-expects-a-segment-list": "", + "tooltip-help": "Ajuda" + }, + "nulls-threshold-input": { + "placeholder-never": "Nunca" + }, + "outside-range-plugin": { + "data-outside-time-range": "", + "zoom-to-data": "" + }, + "timezones-editor": { + "tooltip-add-timezone": "", + "tooltip-remove-timezone": "" + } + }, + "traces": { + "traces-panel": { + "no-data-found-in-response": "" + } + }, "transformations": { "empty": { "add-transformation-body": "As transformações permitem que os dados sejam alterados de várias maneiras antes de sua visualização ser mostrada. <1></1>Isso inclui juntar dados, renomear campos, fazer cálculos, formatar dados para exibição e muito mais.", @@ -8832,6 +10623,10 @@ "convert-field-type-transformer-editor": { "aria-label-add-a-convert-field-type-transformer": "Adicionar um transformador de tipo de campo de conversor", "aria-label-remove-convert-field-type-transformer": "Remover transformador de tipo de campo de conversor", + "label": { + "browser": "Navegador", + "utc": "" + }, "label-as": "como", "label-date-format": "Formato de data", "label-field": "Campo", @@ -8918,11 +10713,32 @@ "tooltip-format": "O formato de saída para o campo especificado como uma <2>sequência de caracteres de formato Moment.js</2>.", "tooltip-timezone-manually": "Defina o fuso horário da data manualmente" }, + "get-timezone-options": { + "label": { + "browser": "Navegador", + "utc": "" + } + }, "get-tooltips": { "description": "Um caminho válido de um objeto json.", "json-value": "Valor JSON:", + "map-valid-paths": { + "description": { + "extract-fields-from-object": "", + "extract-value": "", + "extract-value-first-element": "", + "extract-value-second-element": "" + } + }, "valid-paths": "Caminhos válidos:" }, + "get-transformer-option-pane": { + "root": { + "title": { + "root": "" + } + } + }, "group-by-field-configuration": { "placeholder-ignored": "Ignorado", "placeholder-select-stats": "Selecionar estatísticas" @@ -8939,7 +10755,23 @@ "label-cell-value": "Valor da célula", "label-column": "Coluna", "label-empty-value": "Campo vazio", - "label-row": "Linha" + "label-row": "Linha", + "special-value-options": { + "description": { + "boolean-false-value": "", + "boolean-true-value": "", + "empty-string": "", + "null-value": "", + "number-value": "" + }, + "label": { + "empty": "Vazio", + "false": "", + "null": "", + "true": "", + "zero": "" + } + } }, "histogram-transformer-editor": { "placeholder-auto": "Automático", @@ -9002,10 +10834,22 @@ "tooltip-naming": "Define como os nomes dos campos selecionados são exibidos. O nome do quadro geralmente é melhor para dados tabulares" }, "partition-by-values-editor": { + "keep-fields-options": { + "label": { + "no": "Não", + "yes": "Sim" + } + }, "label-field": "Campo", "label-keep-fields": "Manter campos", "label-naming": "Uso de nomes", "label-select-field": "Selecionar campo", + "naming-modes-options": { + "label": { + "as-frame-name": "", + "as-label": "" + } + }, "partition-values-works-single-frame": "A partição por valores só funciona com um quadro único.", "tooltip-keeps-partition-fields-frames": "Mantém os campos de partição nos quadros" }, @@ -9027,6 +10871,16 @@ "label-include-time": "Incluir horário", "label-labels-to-fields": "Rótulos para campos", "label-mode": "Modo", + "modes": { + "description": { + "collapse-field-single-value": "", + "create-table-series-value": "" + }, + "label": { + "reduce-fields": "", + "series-to-rows": "" + } + }, "placeholder-choose-stat": "Escolha a estatística" }, "regex-matcher-editor": { @@ -9034,11 +10888,23 @@ "variable-regex-documentation": "" }, "regression-transformer-editor": { + "label": { + "cubic": "", + "quadratic": "", + "quartic": "", + "quintic": "" + }, "label-degree": "Grau", "label-model-type": "Tipo de modelo", "label-predicted-points": "Pontos previstos", "label-x-field": "Campo X", "label-y-field": "Campo Y", + "model-type-options": { + "label": { + "linear": "", + "polynomial": "" + } + }, "tooltip-number-of-xy-points-to-predict": "Número de pontos X,Y a serem previstos" }, "rename-by-regex-transformer-editor": { @@ -9056,6 +10922,23 @@ "label-reverse": "Reverso", "placeholder-select-field": "Selecionar campo" }, + "supplier": { + "description": { + "apply-spatial-operations-to-the-geometry": "", + "create-a-line-between-two-points": "", + "geometry-define-field-headingdistancearea": "" + }, + "label": { + "area": "", + "as-line": "", + "calculate-value": "", + "distance": "", + "heading": "", + "line-builder": "", + "prepare-spatial-field": "", + "transform": "" + } + }, "time-series-table-transform-editor": { "label-stat": "Estatística", "label-time-field": "Campo de hora", @@ -9089,7 +10972,19 @@ "placeholder-auto": "Automático", "placeholder-field": "Campo", "tooltip-window-size": "Tamanho da janela", - "tooltip-window-size-percent": "Defina o tamanho da janela como uma porcentagem do total de dados" + "tooltip-window-size-percent": "Defina o tamanho da janela como uma porcentagem do total de dados", + "type-options": { + "label": { + "centered": "", + "trailing": "" + } + }, + "window-size-mode-options": { + "label": { + "fixed": "", + "percentage": "" + } + } } }, "upgrade-box": { @@ -9146,6 +11041,11 @@ }, "users-action-bar-unconnected": { "invite": "Convidar", + "options": { + "label": { + "users": "Usuários" + } + }, "placeholder-search-login-email": "Pesquise usuários por login, e-mail ou nome" } }, @@ -9189,6 +11089,32 @@ "confirm-delete-modal": { "title-delete-variable": "Excluir variável" }, + "create-ad-hoc-variable-adapter": { + "description": { + "add-keyvalue-filters-on-the-fly": "" + } + }, + "create-custom-variable-adapter": { + "description": { + "define-variable-values-manually": "" + } + }, + "create-interval-variable-adapter": { + "description": { + "define-timespan-interval": "" + } + }, + "create-query-variable-adapter": { + "description": { + "variable-values-fetched-datasource-query": "" + } + }, + "data-source-variable-slice": { + "text": { + "default": "", + "no-data-sources-found": "Nenhuma fonte de dados encontrada" + } + }, "empty-state": { "button-title": "Adicionar variável", "info-box-content": "As variáveis possibilitam painéis de controle mais interativos e dinâmicos. Em vez de incluir no código coisas como nomes de servidores ou sensores em suas consultas de métricas, você pode usar variáveis. As variáveis são exibidas como caixas de listagem na parte superior do painel de controle. Essas listas suspensas facilitam a alteração dos dados exibidos no painel de controle.", @@ -9215,6 +11141,13 @@ "placeholder-default-value-if-any": "valor padrão, se houver", "text-options": "Opções de texto" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "unknown-table": { "loading": "Carregando...", "no-unknowns": "Nenhuma variável renomeada ou ausente foi encontrada.", @@ -9271,5 +11204,25 @@ "data-hover-view": { "link": "Link" } + }, + "welcome": { + "welcome-banner": { + "need-help": "Precisa de ajuda?", + "welcome-to-grafana": "" + } + }, + "xychart": { + "series-editor": { + "add-series": "", + "aria-label-select-series": "", + "label-color-field": "", + "label-frame": "Quadro", + "label-size-field": "", + "label-x-field": "Campo X", + "label-y-field": "Campo Y", + "placeholder-all-frames": "", + "placeholder-select-frame": "", + "tooltip-delete-series": "" + } } } \ No newline at end of file diff --git a/public/locales/pt-PT/grafana.json b/public/locales/pt-PT/grafana.json index fd970ec2ce6..85bfe23638e 100644 --- a/public/locales/pt-PT/grafana.json +++ b/public/locales/pt-PT/grafana.json @@ -72,6 +72,11 @@ }, "admin-edit-org-page": { "label-name": "Nome", + "page-nav": { + "subTitle": { + "manage-settings-roles-organization": "" + } + }, "render-missing-permission-message": { "title-access-denied": "Acesso negado" } @@ -233,6 +238,13 @@ "upgrade-info": { "title": "Licença Enterprise" }, + "user-admin-page": { + "page-nav": { + "subTitle": { + "manage-settings-for-an-individual-user": "" + } + } + }, "user-create-page": { "label-email": "E-mail", "label-name": "Nome", @@ -243,9 +255,16 @@ "label-ldap": "LDAP" }, "user-list-admin-page-un-connected": { + "label": { + "active-last-days": "", + "all-users": "Todos os utilizadores" + }, "placeholder-search-login-email": "Pesquisar utilizador por início de sessão, e-mail ou nome." }, "user-list-anonymous-devices-page-un-connected": { + "label": { + "active-last-days": "" + }, "placeholder-search-devices-by-ip-address": "Pesquisar dispositivos por endereço de IP." }, "user-list-page": { @@ -364,6 +383,12 @@ "no-grouping": "Sem agrupamento" }, "alert-group-alerts-table": { + "columns": { + "label": { + "instance-labels": "", + "notification-state": "Estado da notificação" + } + }, "duration": "para {{time}}" }, "alert-group-filter": { @@ -443,6 +468,11 @@ "description-section": "Introduza um nome para identificar o seu {{entityName}}.", "label-metric": "Métrica", "label-name": "Nome", + "message": { + "must-enter-a-metric-name": "", + "must-enter-a-name": "", + "please-select-a-data-source": "Selecione uma origem de dados" + }, "metric-aria-label-metric": "métrica", "metric-placeholder-recorded-metric": "Dar o nome da nova métrica gravada", "placeholder-name": "Dar um nome a {{namePlaceholder}}", @@ -495,6 +525,9 @@ "alertmanager-config": { "gma-manual-configuration-description": "A configuração interna do Grafana Alertmanager não pode ser alterada manualmente. Para alterar esta configuração, edite os recursos individuais através da interface do utilizador.", "gma-manual-configuration-is-not-supported": "Alterações da configuração manual não suportadas", + "message": { + "configuration-cannot-be-empty": "" + }, "reset": "Reiniciar", "reset-confirmation": "Tem a certeza de que pretende redefinir a configuração para \"{{alertmanagerName}}\"? Os pontos de contacto e as políticas de notificação serão redefinidos para as suas predefinições.", "resetting-configuration-might-while": "A redefinir a configuração. Isto que pode demorar algum tempo.", @@ -584,6 +617,9 @@ "create-a-contact-point": "Criar um ponto de contacto", "label-default-contact-point": "Ponto de contacto predefinido", "label-timing-options": "Opções de tempo", + "message": { + "required": "" + }, "or": "ou" }, "am-routes-expanded-form": { @@ -605,11 +641,19 @@ "label-override-grouping": "Substituir agrupamento", "label-value": "Valor", "matching-labels": "Etiquetas correspondentes", + "message": { + "required": "" + }, "placeholder-label": "etiqueta", "placeholder-value": "valor", "remove": "Remover", "tooltip-remove-matcher": "Remover elemento de correspondência" }, + "annotation-header-field": { + "message": { + "required": "" + } + }, "annotations": { "dashboard-annotation-field": { "dashboard": "Painel de controlo {{dashboardUid}}", @@ -681,6 +725,25 @@ "title": "Não é possível exibir todos os eventos" } }, + "central-alert-history-scene": { + "scene": { + "labels-filter-variable": { + "label": { + "labels": "" + } + }, + "transitions-from-filter-variable": { + "label": { + "start-state": "" + } + }, + "transitions-to-filter-variable": { + "label": { + "end-state": "" + } + } + } + }, "channel-sub-form": { "delete": "Eliminar", "duplicate": "Duplicar", @@ -717,11 +780,17 @@ }, "cloud-data-source-selector": { "label": "Selecionar origem de dados", - "label-disabled": "Origem dos dados" + "label-disabled": "Origem dos dados", + "message": { + "please-select-a-data-source": "Selecione uma origem de dados" + } }, "cloud-evaluation-behavior": { "description-pending-period": "Período durante o qual a condição de limite deve ser cumprida para acionar um alerta. Selecionar \"Nenhum\" aciona o alerta imediatamente assim que a condição esteja cumprida.", "label-pending-period": "Período pendente", + "message": { + "must-be-a-positive-integer": "" + }, "title-set-evaluation-behavior": "Definir comportamento de avaliação" }, "cloud-receiver-form": { @@ -762,6 +831,9 @@ "contact-point-selector": { "aria-label-refresh-contact-points": "Recarregar pontos de contacto", "contact-point-picker-label-contact-point": "Ponto de contacto", + "message": { + "contact-point-is-required": "" + }, "title-failed-to-fetch-contact-points": "Falha ao obter pontos de contacto", "tooltip-refresh-contact-points-list": "Atualizar lista de pontos de contacto" }, @@ -828,6 +900,14 @@ }, "copy-to-clipboard": "Copiar a \"{{label}}\" para a área de transferência", "create-metadata": { + "label": { + "dashboard": "Painel de controlo", + "dashboard-and-panel": "", + "evaluation-interval": "Intervalo de avaliação", + "labels": "Etiquetas", + "metric-name": "", + "runbook-url": "" + }, "view-dashboard": "Visualizar painel de controlo", "view-panel": "Visualizar painel" }, @@ -868,9 +948,6 @@ "title-search-panel": "Painel de pesquisa", "title-select-dashboard-and-panel": "Selecionar painel de controlo e painel" }, - "data-source-section": { - "import-to-grafana": "Importar as regras da Grafana" - }, "datasource-not-found": { "card-description": "A origem de dados para esta consulta não foi encontrada, foi removida ou não está instalada corretamente.", "remove-query": "Remover consulta", @@ -952,6 +1029,11 @@ "text-loading-template": "A carregar modelo...", "title-failed-to-fetch-notification-template": "Falha ao obter o modelo de notificação" }, + "edit-mute-timing-page": { + "text": { + "edit-time-interval": "" + } + }, "editor": { "edit-alert-rule": "", "edit-recording-rule": "", @@ -965,6 +1047,11 @@ "error-summary-button": { "content-show-all-errors": "" }, + "evaluate-every-validation-options": { + "message": { + "required": "" + } + }, "evaluation-behavior-summary": { "evaluate": "", "label-evaluate": "Avaliar", @@ -982,6 +1069,9 @@ "evaluation-group-creation-modal": { "description-group-name": "Um grupo avalia todas as suas regras ao longo do mesmo intervalo de avaliação.", "description-often-rules-group-evaluated": "Com que frequência todas as regras do grupo são avaliadas.", + "message": { + "required": "" + }, "placeholder-enter-a-name": "Insira um nome", "title-new-evaluation-group": "Novo grupo de avaliação" }, @@ -1004,12 +1094,24 @@ "title-permission-editrecreate-silence": "Não tem permissão para editar/recriar este silêncio", "title-silence-not-found": "O silêncio existente \"{{silenceId}}\" não foi encontrado" }, + "existing-silence-editor-page": { + "page-nav": { + "text": { + "edit-silence": "" + } + } + }, "export": { "subtitle": { "formats": "Selecione o formato e descarregue o ficheiro ou copie o conteúdo para a área de transferência", "one-format": "Descarregue o ficheiro ou copie o conteúdo para a área de transferência" } }, + "export-new-grafana-rule-page": { + "text": { + "export-new-grafana-rule": "" + } + }, "export-new-rule-button": { "tooltip-export-new-grafana-rule": "Exportar nova regra da Grafana" }, @@ -1035,6 +1137,16 @@ "no-data": "Sem dados", "page-counter": "" }, + "feature-toggle-page": { + "nav-model": { + "subTitle": { + "enable-alerting-grafana-config": "" + }, + "text": { + "alerting-is-not-enabled": "" + } + } + }, "federated-rule-warning": { "experimental": "Os grupos de regras federadas são atualmente uma funcionalidade experimental.", "read-documentation": "Leia a documentação", @@ -1042,6 +1154,13 @@ }, "file-export-inline-documentation": { "api-provisioning": "O formato {{name}} só é válido para o aprovisionamento de API. <3>Leia mais nos documentos.</3>", + "export-inline-doc": { + "title": { + "apiprovisioning-format": "", + "fileprovisioning-format": "", + "terraformprovisioning-format": "" + } + }, "file-provisioning": "O formato {{name}} só é válido para o provisionamento de ficheiros. <3>Leia mais nos documentos.</3>", "terraform-provisioning": "O formato {{name}} só é válido para o provisionamento Terraform. <3>Leia mais nos documentos.</3>" }, @@ -1049,6 +1168,20 @@ "copy-code": "Copiar código", "download": "Transferir" }, + "filter-options": { + "label": { + "alert-rule": "Regra de alerta", + "all": "Todos", + "error": "Erro", + "firing": "", + "no-data": "Sem dados", + "normal": "Normal", + "ok": "OK", + "pending": "Pendente", + "recording-rule": "Regra de gravação", + "recovering": "A recuperar" + } + }, "filter-view-results": { "aria-label-filteredrulelist": "lista de regras filtradas" }, @@ -1083,7 +1216,10 @@ } }, "folder-selector": { - "description-select-folder": "Selecione uma pasta para armazenar a sua regra." + "description-select-folder": "Selecione uma pasta para armazenar a sua regra.", + "message": { + "select-a-folder": "" + } }, "folderAndGroup": { "evaluation": { @@ -1098,15 +1234,88 @@ "for-input": { "description-pending": "Período durante o qual a condição de limite deve ser cumprida para acionar um alerta. Selecionar \"Nenhum\" aciona o alerta imediatamente assim que a condição esteja cumprida." }, + "for-validation-options": { + "message": { + "required": "" + } + }, "generate-alert-data-modal": { "add-alert-data": "Adicionar dados de alerta", "add-alert-data-to-payload": "Adicionar dados de alerta à carga útil", + "alert-options": { + "label": { + "firing": "", + "resolved": "" + } + }, "review-alert-payload": "Reveja os dados de alerta para adicionar à carga útil:", "title-add-custom-alerts": "Adicionar alertas personalizados" }, + "get-alert-suggestions": { + "documentation": { + "annotations-attached-alert": "", + "fingerprint-identify-alert": "", + "grafana-external-alertmanager": "", + "organization-alert": "", + "time-the-alert-started-firing": "" + }, + "value": { + "labels-attached-alert": "", + "status-alert-firing-resolved": "" + } + }, + "get-cloud-scenes": { + "title": { + "mimir-alertmanager": "" + } + }, + "get-global-suggestions": { + "value": { + "an-array-containing-all-alerts": "" + } + }, + "get-grafana-alertmanager-scenes": { + "title": { + "grafana-alertmanager": "" + } + }, + "get-grafana-managed-scenes": { + "title": { + "grafanamanaged-alert-rules": "Regras de alerta geridas pela Grafana" + } + }, + "get-mimir-managed-rules-per-group-scenes": { + "rule-group-handler": { + "label": { + "rule-group": "" + } + }, + "title": { + "mimirmanaged-alert-rules-per-rule-group": "" + } + }, + "get-mimir-managed-rules-scenes": { + "title": { + "mimirmanaged-alert-rules": "" + } + }, "get-preview-results": { "title-error": "Erro" }, + "get-state-display-model": { + "text": { + "alerting": "", + "error": "", + "firing": "", + "inactive": "", + "no-data": "", + "ok": "OK", + "paused": "", + "pending": "", + "recovering": "", + "unknown": "" + } + }, "getting-stared": { "learn-more": "Para uma introdução prática, consulte o nosso <2>tutorial para começar a utilizar o Grafana Alerting</2>" }, @@ -1148,6 +1357,10 @@ "label-disable-resolved-message": "Desativar mensagem resolvida" }, "grafana-evaluation-behavior-step": { + "message": { + "must-be-a-positive-integer": "", + "must-enter-a-group-name": "" + }, "missing-series-resolve-placeholder": "Predefinição: 2", "or": "ou", "placeholder-select-an-evaluation-group": "Selecione um grupo de avaliação...", @@ -1164,6 +1377,11 @@ "body-invalid-rule-id": "O UID da regra no URL da página é inválido. Verifique o URL e tente novamente.", "title-invalid-rule-id": "ID de regra inválida" }, + "grafana-modify-export-page": { + "text": { + "modify-export": "" + } + }, "grafana-mute-timing-exporter-preview": { "text-loading": "A carregar..." }, @@ -1216,6 +1434,9 @@ }, "group-and-namespace-fields": { "group-picker-label-group": "Grupo", + "message": { + "required": "" + }, "namespace-picker-label-namespace": "Espaço de nome" }, "group-by": { @@ -1272,14 +1493,19 @@ "header": { "tooltip-remove": "Remover a expressão \"{{refId}}\"" }, + "history-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "Sucesso" + } + }, "home": { "label-get-started": "Começar", "label-insights": "Conhecimentos", "title-alerting": "Alerta" }, - "import-from-dsrules": { - "description-folder-import-rules": "A pasta para a qual importar as regras" - }, "import-to-gma": { "action-button": "Importar", "additional-settings": "Definições adicionais", @@ -1287,8 +1513,9 @@ "confirm-modal": { "confirm": "Importar", "loading": "A carregar...", - "loading-body": "A preparar os dados a serem importados. Isto pode demorar algum tempo...", + "loading-body": "", "no-rules-body": "Não existem regras para importar. Selecione um espaço de nome ou grupo de regras diferente.", + "no-rules-body-yaml": "", "no-rules-title": "Sem regras para importar", "plugin-rules-warning": { "text": "Detetámos que algumas regras são geridas por plugins. Estas regras não serão importadas.", @@ -1307,11 +1534,12 @@ "label": "Grupo" }, "import-location-and-filters": "Importar localização e filtros", + "import-source": "", "namespace": { "description": "Escreva para pesquisar um espaço de nomes existente", "label": "Espaço de nome" }, - "pageTitle": "Importar regras de alerta de uma origem de dados para as regras geridas pela Grafana", + "pageTitle": "", "pause": { "label": "Pausar regras de alerta importadas" }, @@ -1319,10 +1547,26 @@ "label": "Pausar regras de gravação importadas" }, "recording-rules": "Regras de gravação", + "source": { + "datasource": "", + "datasource-description": "", + "yaml": "", + "yaml-description": "" + }, "success": "Regras de alerta importadas com sucesso para as regras geridas pela Grafana.", "target-folder": { + "description": "A pasta para a qual importar as regras", "label": "Pasta de destino" - } + }, + "yaml": { + "description": "", + "label": "", + "required-message": "", + "target-datasource": "Origem de dados de destino", + "target-datasource-description": "", + "target-datasource-required": "" + }, + "yaml-error": "" }, "insights": { "monitor-status-of-system": "Monitorizar o estado do seu sistema", @@ -1398,6 +1642,9 @@ "text-loading-existing-labels": "A carregar etiquetas existentes" }, "labels-without-suggestions": { + "message": { + "required": "" + }, "placeholder-key": "chave", "placeholder-value": "valor" }, @@ -1437,6 +1684,24 @@ "log-record-viewer-by-timestamp": { "aria-label-state-history-by-timestamp": "Histórico do estado por registo de data e hora" }, + "log-timeline-viewer": { + "label": { + "firing": "", + "mixed": "", + "no-data": "", + "normal": "Normal", + "pending": "Pendente", + "recovering": "A recuperar" + } + }, + "loki-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "Sucesso" + } + }, "loki-state-history": { "clear-filters": "Limpar filtros", "common-labels": "Etiquetas comuns", @@ -1449,6 +1714,14 @@ "button": "Gerir permissões", "title": "Gerir permissões" }, + "manual-and-automatic-routing": { + "routing-options": { + "label": { + "select-contact-point": "", + "use-notification-policy": "" + } + } + }, "matcher-filter": { "filter-alerts-using-label-querying-without-braces": "Filtrar alertas através da utilização de consultas de etiqueta sem parênteses, ex.:", "filter-alerts-using-label-querying-without-spaces": "Filtrar alertas através da utilização de consultas de etiqueta sem espaços, ex.:", @@ -1466,6 +1739,9 @@ "label-operator": "Operador", "label-refine-affected-alerts": "Refinar alertas afetados", "label-value": "Valor", + "message": { + "required": "" + }, "placeholder-label": "etiqueta", "placeholder-value": "valor", "remove": "Remover", @@ -1497,6 +1773,16 @@ "aria-label": "Mais", "button-text": "Mais" }, + "multiple-data-source-picker": { + "get-data-source-options": { + "grouped-options": { + "label": { + "data-sources-with-configured-alert-rules": "", + "other-data-sources": "" + } + } + } + }, "mute-timing-actions-buttons": { "text-disabled": "Desativado", "title-delete-mute-timing": "Eliminar tempo de silêncio" @@ -1560,11 +1846,26 @@ "read-more": "Leia sobre as políticas de notificação.", "title-notification-routing": "Encaminhamento das notificações" }, + "new-mute-timing-page": { + "text": { + "add-time-interval": "" + } + }, "new-rule-from-panel-button": { "body-no-alerting-capable-query-found": "Não é possível criar alertas a partir deste painel, porque não foi encontrada qualquer consulta para uma origem de dados com capacidade de alerta.", "new-alert-rule": "Nova regra de alerta", "title-no-alerting-capable-query-found": "Não foi encontrada qualquer consulta com capacidade de alerta" }, + "new-silence-page": { + "page-nav": { + "subTitle": { + "configure-silences-notifications-particular-alert": "" + }, + "text": { + "silence-alert-rule": "Silenciar regra de alerta" + } + } + }, "no-alert-managers-available": { "body-no-alertmanager-found": "Não foi possível encontrar nenhum Alertmanager externo e poderá não ter acesso ao Grafana Alertmanager integrado.", "title-no-alertmanager-found": "Nenhum Alertmanager encontrado" @@ -1791,6 +2092,9 @@ "expressions": "Expressões", "loading-data-sources": "A carregar origens de dados...", "manipulate-returned-queries-other-operations": "Manipule os dados devolvidos das consultas com operações matemáticas e outras.", + "message": { + "a-valid-expression-is-required": "" + }, "no-compatible-sources": "Parece não ter origens de dados compatíveis", "title-deactivate-advanced-options": "Desativar opções avançadas", "title-queries-expressions-configured": "Não foram configuradas consultas ou expressões" @@ -1842,7 +2146,8 @@ }, "recording-rules": { "description-target-data-source": "A origem de dados do Prometheus para armazenar regras de gravação em", - "label-target-data-source": "Origem de dados de destino" + "label-target-data-source": "Origem de dados de destino", + "target-data-source-required": "" }, "recording-rules-name-space-and-group-step": { "description-select-namespace-group-recording": "Selecione o espaço de nome e o grupo para a sua regra de gravação.", @@ -2103,6 +2408,9 @@ "collapse-all": "Recolher tudo", "expand-all": "Expandir tudo" }, + "rule-list-v2": { + "import-to-gma": "" + }, "rule-modify-export": { "text-loading-the-rule": "A carregar a regra...", "title-cannot-exist": "Não é possível carregar a regra. A regra não existe", @@ -2180,6 +2488,10 @@ "label-saved-searches": "Pesquisas guardadas" }, "health": "Saúde", + "label": { + "hide": "Ocultar", + "show": "Mostrar" + }, "manage-alerts": "Nestas origens de dados, pode selecionar Gerir alertas através da interface do utilizador Alerting para poder gerir estas regras de alerta na interface do utilizador Grafana, bem como na origem de dados onde foram configuradas.", "placeholder-all-data-sources": "Todas as origens de dados", "plugin-rules": "Regras de plugin", @@ -2276,6 +2588,9 @@ "label-comment": "Comentário", "label-created-by": "Criado por", "label-duration": "Duração", + "message": { + "required": "" + }, "placeholder-whos-creating-the-silence": "Quem está a criar o silêncio", "save-silence": "Guardar silêncio", "saving": "A guardar..." @@ -2314,6 +2629,12 @@ "title-alert-rule-types": "Tipos de regras de alerta" }, "state-history": { + "columns": { + "label": { + "state": "Estado", + "time": "Hora" + } + }, "filter-group": "Filtrar grupo", "filter-group-tooltip": "Filtre cada grupo de histórico de estado por correspondência exata ou uma expressão regular, por exemplo:", "placeholder-search": "Pesquisar", @@ -2353,6 +2674,9 @@ "label-examples-documentation": "Documentação de exemplo", "label-template-group": "Grupo de modelos", "label-template-group-name": "Nome do grupo de modelos", + "message": { + "required": "" + }, "new-template-name-placeholder-give-your-template-group-a-name": "Dê um nome ao seu grupo de modelos", "title-error-saving-template": "Erro ao guardar o modelo", "title-templating-cheat-sheet": "Folha de consulta de criação de modelos" @@ -2375,6 +2699,11 @@ "existing-templates-selector-aria-label-choose-notification-template": "Escolher modelo de notificação", "existing-templates-selector-placeholder-choose-notification-template": "Escolher modelo de notificação", "loading": "A carregar...", + "template-options": { + "label": { + "select-notification-template": "" + } + }, "tooltip-copy": "Copiar o modelo de notificação selecionado para a área de transferência. Pode utilizá-lo no separador personalizado." }, "templates": { @@ -2477,10 +2806,39 @@ } }, "use-columns": { + "columns": { + "label": { + "alert-rule-targeted": "", + "alerts-silenced": "", + "health": "Saúde", + "matching-labels": "Etiquetas correspondentes", + "name": "Nome", + "schedule": "Agendar ", + "state": "Estado", + "time-range": "Intervalo de tempo" + } + }, + "label": { + "actions": "Ações", + "created": "Criado", + "group": "Grupo", + "labels": "Etiquetas", + "next-evaluation": "Próxima avaliação", + "state": "Estado", + "summary": "Resumo" + }, "title-edit": "Editar", "title-recreate": "Criar de novo", "title-unsilence": "Cancelar silêncio" }, + "use-combined-labels": { + "grouped-options": { + "label": { + "from-alerts": "", + "from-system": "" + } + } + }, "use-create-dropdown-menu-actions": { "label-delete": "Eliminar", "label-edit": "Editar", @@ -2514,6 +2872,17 @@ "title-edit-notification-policy": "Editar a política de notificação" } }, + "use-page-nav": { + "page-nav": { + "text": { + "details": "Detalhes", + "history": "Histórico", + "instances": "Instâncias", + "query-and-conditions": "", + "versions": "Versões" + } + } + }, "use-state-history-modal": { "state-history-modal": { "title-state-history": "Histórico do estado" @@ -2534,6 +2903,36 @@ "body": "O conteúdo de YAML no editor contém apenas a configuração da regra de alerta <1></1>Para configurar o Prometheus, tem de fornecer o restante do <4>conteúdo do ficheiro de configuração.</4>" } }, + "alertlist": { + "group-by": { + "aria-label-group-by-label-keys": "", + "placeholder-group-by": "Agrupar por" + }, + "ungrouped-mode-view": { + "active-for": "", + "aria-label-view-alert-rule": "", + "view-alert-rule": "" + }, + "unified-alert-list": { + "clear": "Limpar", + "text-loading": "A carregar..." + }, + "unified-alert-list-panel": { + "body-permission-required": "", + "title-permission-required": "" + } + }, + "annolist": { + "anno-list-panel": { + "aria-label-remove-filter": "", + "filter": "", + "loading": "A carregar...", + "no-annotations-found": "" + }, + "annotation-list-item": { + "tooltip-created-by": "" + } + }, "annotations": { "annotation-field-mapper": { "annotation": "Anotação", @@ -2630,6 +3029,11 @@ "configuration-required": "Configuração necessária", "refer-documentation-configure-authentication": "Consulte a documentação sobre como configurar a autenticação" }, + "field-map": { + "label": { + "none": "Nenhum" + } + }, "fields": { "allow-assign-grafana-admin-description": "", "allow-assign-grafana-admin-label": "", @@ -2733,7 +3137,18 @@ "use-refresh-token-description": "", "use-refresh-token-label": "", "validate-hosted-domain-description": "", - "validate-hosted-domain-label": "" + "validate-hosted-domain-label": "", + "workload-identity-token-file-description": "", + "workload-identity-token-file-label": "", + "workload-identity-token-file-required": "" + }, + "get-page-nav": { + "subTitle": { + "configure-authentication-providers": "" + }, + "text": { + "authentication": "Autenticação" + } }, "provider-card": { "text-badge-enabled": "Ativado", @@ -2769,6 +3184,12 @@ "auth-config-auth-config-page-unconnected": { "subtitle": "Faça a gestão das suas definições de autenticação e configure o início de sessão único. Saiba mais na nossa <2>documentação</2>." }, + "barchart": { + "tick-spacing-editor": { + "content-require-space-from-the-right-side": "", + "label-rtl": "" + } + }, "bookmarks-page": { "empty": { "message": "Parece que ainda não criou nenhum marcador", @@ -2897,11 +3318,199 @@ "text-this-repository-is-read-only": "Se tiver acesso direto ao destino, copie o JSON e cole-o lá." }, "canvas": { + "apieditor": { + "label-endpoint": "", + "label-header-parameters": "", + "label-method": "Método", + "label-payload": "Carga útil", + "label-query-parameters": "Parâmetros da consulta", + "render-test-apibutton": { + "test-api": "", + "title-test-api": "" + } + }, + "button-item": { + "label": { + "center": "", + "left": "", + "right": "" + }, + "placeholder": { + "auto": "Automóvel" + } + }, + "button-style-editor": { + "label-variant": "Variante" + }, + "canvas-context-menu": { + "close-editor": "", + "open-editor": "", + "render-menu-items": { + "add-item-menu-item": { + "label-add-item": "" + }, + "edit-element-menu-item": { + "label-edit": "Editar" + }, + "label-bring-to-front": "", + "label-delete": "Eliminar", + "label-duplicate": "Duplicar", + "label-send-to-back": "", + "set-background-menu-item": { + "label-set-background": "" + } + } + }, + "cloud-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automóvel" + } + }, + "ellipse-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automóvel" + } + }, + "inline-edit": { + "canvas-inline-editor": "", + "tooltip-close-inline-editor": "" + }, + "inline-edit-body": { + "label-add-item": "", + "please-select-an-element": "" + }, + "line-style-editor": { + "label-animate": "" + }, + "metric-value-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automóvel" + } + }, "not-found-display": { "not-found": "<0>Não encontrado: </0><config />" }, + "pan-zoom-help": { + "ctrl-right-mouse": "", + "middle-mouse": "", + "pan-title": "", + "reset-double-click": "", + "title-pan-and-zoom-controls": "", + "zoom-scroll-wheel": "" + }, + "parallelogram-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automóvel" + } + }, + "params-editor": { + "aria-label-add": "Adicionar", + "aria-label-delete": "Eliminar", + "placeholder-key": "Chave", + "placeholder-value": "Valor" + }, + "placement-editor": { + "label-constraints": "", + "label-position": "", + "loading": "A carregar..." + }, + "quick-positioning": { + "tooltip-align-bottom": "", + "tooltip-align-horizontal-centers": "", + "tooltip-align-left": "", + "tooltip-align-right": "", + "tooltip-align-top": "", + "tooltip-align-vertical-centers": "" + }, + "rectangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automóvel" + } + }, "text-display": { "double-click-to-set": "Clique duas vezes para definir o texto" + }, + "text-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automóvel" + } + }, + "tree-navigation-editor": { + "clear-selection": "Limpar a seleção", + "frame-selection": "", + "label-add-item": "", + "missing-layer": "", + "no-settings": "", + "switcher-icon": { + "title-node-icon": "" + } + }, + "tree-node-title": { + "title-duplicate": "Duplicar", + "title-remove": "Remover", + "tooltip-duplicate": "Duplicar", + "tooltip-remove": "Remover" + }, + "triangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Automóvel" + } } }, "carousel": { @@ -2981,6 +3590,22 @@ } }, "connections": { + "add-new-connection": { + "filter-by-options": { + "label": { + "all": "Todos", + "installed": "Instalado", + "new-updates": "" + } + }, + "label": { + "by-downloads": "", + "by-name-az": "", + "by-name-za": "", + "by-published-date": "", + "by-updated-date": "" + } + }, "advisor-redirect-notice": { "aria-label-link-to-advisor": "Link para o Consultor", "body": "Experimente o novo Consultor para descobrir possíveis problemas com as suas origens de dados e plugins.", @@ -2997,6 +3622,22 @@ "body": "As origens de dados mudaram de sítio! Pode descobrir novas origens de dados ou gerir as existentes na página Ligações, acessível a partir do menu principal.", "go-to-connections": "Aceda às ligações" }, + "data-source-details-page": { + "subTitle": { + "datasource-could-found": "" + }, + "text": { + "unknown-datasource": "" + } + }, + "new-data-source-page": { + "subTitle": { + "choose-a-data-source-type": "" + }, + "text": { + "add-data-source": "Adicionar origem de dados" + } + }, "no-access-modal": { "connection-contact-grafana-admin": "Para adicionar uma nova ligação, contacte o seu administrador da Grafana.", "editor-warning": "Os editores não podem adicionar novas ligações. Pode verificar se já a configuração está concluída em <2>Origens de dados</2>.", @@ -3009,6 +3650,18 @@ "search": { "aria-label-search-all": "Pesquisar tudo", "placeholder": "Pesquisar tudo" + }, + "use-data-source-settings-nav": { + "node": { + "subTitle": { + "data-source-error": "" + } + }, + "page-nav": { + "text": { + "data-source-nav-node": "" + } + } } }, "core": { @@ -3304,6 +3957,11 @@ "title-plugin-dashboard": "Painel de controlo do plugin" }, "dash-nav": { + "on-open-snapshot-original": { + "title": { + "proceed-to-external-site": "" + } + }, "render-left-actions": { "text-public": "Público", "tooltip-view-as-scene": "Ver como cena" @@ -3315,11 +3973,26 @@ "dashboard-loading": { "cancel-loading-dashboard": "Cancelar carregamento do painel de controlo" }, + "dashboard-page-error": { + "text": { + "not-found": "Não encontrado" + } + }, "dashboard-settings": { "actions": { "close": "Fechar" } }, + "dashboard-slice": { + "title": { + "dashboard-init-failed": "" + } + }, + "dashboard-srv": { + "message": { + "edit-dashboard-json": "" + } + }, "dashboard-validation": { "body-dashboard-failed-schema-validation": "A validação é fornecida para fins de desenvolvimento e deve ser ignorada com segurança. Se é um programador da Grafana, considere verificar e atualizar o esquema do painel de controlo", "title-checking-dashboard-validity": "A verificar a validade do painel de controlo", @@ -3415,6 +4088,13 @@ "values": "Valores separados por vírgulas", "values-placeholder": "1, 10, minhachave : meuvalor, meu;valor, ignorado\\,valor" }, + "datasource-options": { + "name-filter": "", + "name-filter-description": "", + "name-filter-placeholder": "", + "type": "Tipo", + "type-placeholder": "" + }, "description": "Descrição", "description-placeholder": "Texto descritivo", "label": "Etiqueta", @@ -3433,8 +4113,8 @@ "category": "Opções de seleção", "custom-all-value": "Personalizar todos os valores", "custom-all-value-description": "Um regex de carácter universal ou outro valor para representar Tudo", - "include-all": "Incluir a opção Tudo", - "include-all-description": "Ativa uma opção para incluir todos os valores", + "include-all": "", + "include-all-description": "", "multi-value": "Valor múltiplo" }, "type-category": "Opções de {{type}}" @@ -3460,14 +4140,97 @@ "errors": { "failed-to-load": "Não foi possível carregar o painel de controlo" }, + "fetch-dashboard": { + "message": { + "failed-to-fetch-dashboard": "" + } + }, "gen-aihistory": { "aria-label-send-custom-feedback": "Enviar comentários personalizados", "footer-text": "Este conteúdo é gerado por IA com o <2>plugin Grafana LLM</2>", "placeholder-tell-ai-what-to-do-next": "Indique à IA o que fazer de seguida..." }, + "general-settings-unconnected": { + "editable-options": { + "label": { + "editable": "Editável", + "readonly": "" + } + } + }, + "get-debug-dashboard": { + "title": { + "annotations": "Anotações" + } + }, + "get-errors": { + "message": { + "error-loading-data": "" + } + }, "get-field-override-categories": { "label-add-field-override": "Adicionar substituição de campo", - "label-add-override-property": "Adicionar propriedade de substituição" + "label-add-override-property": "Adicionar propriedade de substituição", + "title": { + "add-button": "" + } + }, + "get-library-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "Informação", + "name": "Nome" + } + }, + "get-library-viz-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "Informação", + "name": "Nome" + } + }, + "get-panel-editor-tabs": { + "text": { + "alert": "", + "query": "Consulta", + "transform-data": "" + } + }, + "get-panel-frame-category": { + "descriptor": { + "title": { + "panel-options": "Opções do painel" + } + }, + "direction-options": { + "label": { + "horizontal": "Horizontal", + "vertical": "Vertical" + } + }, + "title": { + "description": "Descrição", + "max-per-row": "Máximo por linha", + "panel-links": "Links do painel", + "repeat-by-variable": "Repetir por variável", + "repeat-direction": "Repetir direção", + "repeat-options": "Repetir opções", + "title": "Título", + "transparent-background": "Fundo transparente" + } + }, + "get-panel-menu": { + "text": { + "extensions": "" + } }, "help-wizard": { "copy-to-clipboard": "Copiar para a área de transferência", @@ -3480,10 +4243,21 @@ "randomize-field-names-label-field-names": "Nomes dos campos", "randomize-labels-label-labels": "Etiquetas", "randomize-string-values-label-string-values": "Valores de cadeia", + "tabs": { + "label": { + "data": "Dados", + "snapshot": "Imagem instantânea" + } + }, "title-complete-git-hub-comment-clipboard": "Copiar um comentário completo do GitHub para a área de transferência", "title-get-help-with-this-panel": "Obter ajuda com este painel", "troubleshooting-docs": "Documentos de resolução de problemas" }, + "init-dashboard": { + "message": { + "failed-create-dashboard-model": "" + } + }, "inspect": { "data-tab": "Dados", "error-tab": "Erro", @@ -3536,6 +4310,16 @@ "rows": "Quantidade total de linhas", "table-title": "Estatísticas" }, + "k8s-dashboard-api": { + "title": { + "deleted": "" + } + }, + "k8s-dashboard-v2api": { + "title": { + "deleted": "" + } + }, "layout": { "common": { "copy": "Copiar", @@ -3548,6 +4332,13 @@ "panel-layout-disabled": "Selecione uma linha ou um separador para alterar as opções de disposição do painel" } }, + "legacy-dashboard-api": { + "fetch-error": { + "message": { + "dashboard-not-found": "" + } + } + }, "make-editable": { "dashboard-not-editable": "Painel de controlo não editável", "make-editable": "Tornar editável" @@ -3567,6 +4358,20 @@ "menu-use-library-panel": "Utilizar o painel de biblioteca" }, "new-panel-title": "Novo painel", + "on-create-new-row": { + "new-row": { + "title": { + "row-title": "" + } + } + }, + "on-create-new-widget-panel": { + "new-panel": { + "title": { + "widget-title": "" + } + } + }, "options": { "description": "Descrição", "title-option": "Título" @@ -3626,6 +4431,30 @@ "paused": "Este painel de controlo foi pausado pelo administrador", "try-again-later": "Tente novamente mais tarde" }, + "remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, + "repeat-row-select": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, + "repeat-row-select2": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, "revert-dashboard-modal": { "body-restore-version": "Tem a certeza de que pretende restaurar o painel de controlo para a versão {{version}}? Todas as alterações não guardadas serão perdidas.", "title-restore-version": "Restaurar versão" @@ -3739,6 +4568,18 @@ "sub-menu-un-connected": { "aria-label-template-variables": "Variáveis do modelo" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "tabs-layout": { "delete-tab-text": "A eliminação deste separador também removerá todos os painéis. Tem a certeza de que deseja continuar?", "delete-tab-title": "Eliminar separador?", @@ -3944,7 +4785,10 @@ }, "unthemed-dashboard-row": { "aria-label-delete-row": "Eliminar linha", - "learn-more": "Saiba mais" + "learn-more": "Saiba mais", + "title": { + "delete-row": "Eliminar linha" + } }, "validation": { "invalid-dashboard-id": "Não foi possível encontrar uma ID válida de Grafana.com", @@ -3979,6 +4823,16 @@ }, "visualization-select-pane": { "placeholder-search-for": "Pesquisar por...", + "radio-options": { + "description": { + "reusable-panels-share-between-multiple-dashboards": "" + }, + "label": { + "library-panels": "Painéis de biblioteca", + "suggestions": "", + "visualizations": "" + } + }, "title-close": "Fechar" }, "viz-panel": { @@ -4029,12 +4883,25 @@ "label-data-source": "Origem dos dados", "label-use-static-key-dimensions": "Utilizar dimensões de chave estática" }, + "add-to-dashboard": { + "message": { + "could-navigate-selected-dashboard-please-again": "", + "could-panel-dashboard-please-again": "" + } + }, "add-to-dashboard-form": { "cancel": "Cancelar", "description-choose-where-to-add-the-panel": "Escolha onde adicionar o painel.", "description-select-which-dashboard-panel-created": "Selecione em que painel de controlo o painel será criado.", + "label": { + "existing-dashboard": "Painel de controlo existente", + "new-dashboard": "Novo painel de controlo" + }, "label-dashboard": "Painel de controlo", "label-target-dashboard": "Painel de controlo de destino", + "message": { + "this-field-is-required": "Este campo é obrigatório." + }, "open-dashboard": "Abrir painel de controlo", "open-in-new-tab": "Abrir num novo separador", "title-error-adding-the-panel": "Erro ao adicionar o painel" @@ -4072,6 +4939,25 @@ "it-cannot-contain-or": "Não pode conter \"//\" ou \"..\".", "least-valid-character": "Deve ter pelo menos um carater válido." }, + "build-new-dashboard-save-model": { + "data": { + "title": { + "new-dashboard": "Novo painel de controlo" + } + } + }, + "build-new-dashboard-save-model-v2": { + "data": { + "title": { + "new-dashboard": "Novo painel de controlo" + } + } + }, + "config-public-dashboard": { + "title": { + "revoke-public-url": "Revogar URL público" + } + }, "constant-variable-form": { "constant-options": "Opções constantes", "label-value": "Valor", @@ -4119,22 +5005,89 @@ "value-not-saved": "O valor ainda não está guardado na base de dados da Grafana", "view-pull-request-in-git-hub": "Visualizar pedido pull no GitHub" }, + "dashboard-scene": { + "text": { + "edit-panel": "", + "view-panel": "Visualizar painel" + }, + "title": { + "dashboard": "Painel de controlo", + "discard-changes-to-dashboard": "" + } + }, + "dashboard-scene-page-state-manager": { + "message": { + "dashboard-not-found": "" + } + }, + "dashboard-scene-page-state-manager-v2": { + "message": { + "dashboard-not-found": "" + } + }, "data-source-variable-form": { "data-source-options": "Opções de origem de dados", "description-instance-name-filter": "Filtro regex para as instâncias de origem de dados a escolher na lista de valores de variáveis. Deixe em branco para todos.", "example-instance-name-filter": "Exemplo: <codeExample />", "selection-options": "Opções de seleção" }, + "default-grid-layout-manager": { + "row": { + "title": { + "row-title": "" + } + } + }, "description-label": { "description": "Descrição" }, + "edit-link-view": { + "edit-link-page-nav": { + "text": { + "edit-link": "Editar link" + } + } + }, "email-list": { "aria-label-emailmenu": "Alternar menu de e-mail" }, + "embedded-dashboard-test-page": { + "subTitle": { + "showing-dashboard-panel-tests-pie-chart": "" + }, + "text": { + "embedding-dashboard": "" + } + }, "empty-transformations-message": { "add-transformation": "Adicionar transformação" }, + "get-edit-options": { + "title": { + "column-options": "", + "row-height-options": "" + } + }, + "get-panel-frame-options": { + "descriptor": { + "title": { + "panel-options": "Opções do painel" + } + }, + "title": { + "description": "Descrição", + "panel-links": "Links do painel", + "title": "Título", + "transparent-background": "Fundo transparente" + } + }, + "get-workflow-options": { + "label": { + "push-to-a-new-branch": "" + } + }, "group-by-variable-form": { + "alert-not-supported": "", "description-enables-users-custom-values": "Permite que os utilizadores adicionem valores personalizados à lista", "description-provide-dimensions-as-csv-dimension-name-dimension-id": "Forneça dimensões como CSV: {{name}}, {{value}}", "group-by-options": "Agrupar por opções", @@ -4153,6 +5106,12 @@ "randomize-field-names-label-field-names": "Nomes dos campos", "randomize-labels-label-labels": "Etiquetas", "randomize-string-values-label-string-values": "Valores de cadeia", + "tabs": { + "label": { + "data": "Dados", + "snapshot": "Imagem instantânea" + } + }, "title-complete-git-hub-comment-clipboard": "Copiar um comentário completo do GitHub para a área de transferência", "title-get-help-with-this-panel": "Obter ajuda com este painel", "troubleshooting-docs": "Documentos de resolução de problemas", @@ -4195,6 +5154,14 @@ "body-name-already-exists": "Já existe um painel de controlo com o mesmo nome na pasta selecionada. Ainda pretende guardar este painel de controlo?", "title-name-already-exists": "Nome já existente" }, + "on-remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, "panel-data-alerting-tab-rendered": { "alert": { "title-errors-loading-rules": "Erros ao carregar regras" @@ -4216,6 +5183,11 @@ "table-view-aria-label-toggletableview": "Alternar vista de tabela", "table-view-label-table-view": "Vista de tabela" }, + "panel-editor": { + "text": { + "edit-panel": "" + } + }, "panel-editor-renderer": { "aria-label-open-options-pane": "Abrir painel de opções", "tooltip-open-options-pane": "Abrir painel de opções" @@ -4224,8 +5196,22 @@ "body-panel-plugin-not-loaded": "Certifique-se de que o painel que pretende inspecionar está visível e foi exibido antes de abrir a inspeção.", "title-panel-plugin-not-loaded": "Plugin do painel não carregado" }, + "panel-menu-behavior": { + "async-func": { + "text": { + "extensions": "", + "metrics-drilldown": "" + } + } + }, "panel-viz-type-picker": { "placeholder-search-for": "Pesquisar por...", + "radio-options": { + "label": { + "suggestions": "", + "visualizations": "" + } + }, "title-close": "Fechar" }, "provisioned-delete-modal": { @@ -4252,6 +5238,15 @@ "query-options": "Opções de consulta", "selection-options": "Opções de seleção" }, + "resource-export": { + "label": { + "classic": "", + "json": "JSON", + "v1-resource": "", + "v2-resource": "", + "yaml": "" + } + }, "revert-dashboard-modal": { "body-restore-version": "Tem a certeza de que pretende restaurar o painel de controlo para a versão {{version}}? Todas as alterações não guardadas serão perdidas.", "title-restore-version": "Restaurar versão" @@ -4360,6 +5355,18 @@ "solo-panel-page": { "loading": "A carregar" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "text-box-variable-form": { "placeholder-default-value-if-any": "(opcional)", "text-options": "Opções de texto" @@ -4370,6 +5377,13 @@ "title-field-label": { "title": "Título" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "transformations-drawer": { "search-box-suffix": { "tooltip-clear-search": "Limpar a pesquisa" @@ -4385,6 +5399,13 @@ "save-dashboard": "Guardar o painel de controlo", "title-unsaved-changes": "Alterações não gravadas" }, + "use-dashboard-edit-page-nav": { + "page-nav": { + "text": { + "settings": "Definições" + } + } + }, "variable-check-indicator": { "aria-label-variable-referenced-dashboard": "Esta variável não é referenciada por nenhuma variável ou por nenhum painel de controlo.", "aria-label-variable-referenced-other-variables-dashboard": "Esta variável é referenciada por outras variáveis ou outros painel de controlo.", @@ -4401,7 +5422,10 @@ "placeholder-descriptive-text": "Texto descritivo", "placeholder-label-name": "Nome da etiqueta", "placeholder-variable-name": "Nome da variável", - "text-running-query": "A executar consulta..." + "text-running-query": "A executar consulta...", + "title": { + "delete-variable": "Eliminar variável" + } }, "variable-editor-list": { "definition": "Definição", @@ -4583,6 +5607,25 @@ "message": "Nenhuma origem de dados encontrada" } }, + "datagrid": { + "add-column": { + "placeholder-column-name": "" + }, + "datagrid-context-menu": { + "render-context-menu-items": { + "label-clear-column": "", + "label-clear-row": "", + "label-remove-all-data": "", + "label-search": "Pesquisar..." + }, + "render-header-menu-items": { + "label-clear-column": "", + "label-delete-column": "", + "label-rename-column": "", + "label-set-field-type": "" + } + } + }, "datasources": { "add-new-data-source-button": { "tooltip-no-permission": "Não tem permissão para configurar novas origens de dados" @@ -4604,6 +5647,46 @@ "label-default": "Predefinição", "label-name": "Nome" }, + "build-categories": { + "categories": { + "title": { + "cloud": "", + "distributed-tracing": "", + "enterprise-plugins": "Plugins empresariais", + "industrial-io-t": "", + "logging-document-databases": "", + "others": "", + "profiling": "", + "sql": "", + "time-series-databases": "" + } + } + }, + "build-nav-model": { + "analytics": { + "text": { + "insights": "Conhecimentos" + } + }, + "caching": { + "text": { + "cache": "" + } + }, + "ds-permissions": { + "text": { + "permissions": "Permissões" + } + }, + "nav-model": { + "text": { + "settings": "Definições" + } + }, + "text": { + "dashboards": "Painéis de controlo" + } + }, "button-row": { "delete": "Eliminar", "save-and-test": "Guardar e testar", @@ -4639,6 +5722,11 @@ "data-source-read-only-message": { "title-provisioned-data-source": "Origem de dados provisionada" }, + "data-source-settings-reducer": { + "message": { + "testing-could-couple-minutes": "" + } + }, "data-source-type-card": { "aria-label-learn-more": "{{dataSourcePluginName}}, saiba mais." }, @@ -4656,13 +5744,88 @@ "footer": { "add-csv-or-spreadsheet": "Adicionar csv ou folha de cálculo" }, + "get-enterprise-phantom-plugins": { + "description": { + "adobe-analytics-datasource": "", + "app-dynamics-integration-and-data-source": "", + "atlassian-statuspage-datasource": "", + "aurora-data-source": "", + "azure-cosmos-db-datasource": "", + "azure-devops-datasource": "", + "catchpoint-datasource": "", + "cloudflare-datasource": "", + "cockroach-db-datasource": "", + "data-dog-integration-and-data-source": "", + "drone-datasource": "", + "git-lab-integration-and-datasource": "", + "honeycomb-integration-and-datasource": "", + "jira-integration-and-datasource": "", + "logic-monitor-devices-datasource": "", + "mongo-db-integration-and-data-source": "", + "netlify-datasource": "", + "new-relic-integration-and-data-source": "", + "pager-duty-datasource": "", + "salesforce-integration-and-datasource": "", + "sap-hana-integration-and-data-source": "", + "service-now-integration-and-data-source": "", + "signal-fx-integration-and-datasource": "", + "snowflake-integration-and-data-source": "", + "sumo-logic-integration-and-datasource": "", + "visualize-and-explore-dynatrace-data": "", + "visualize-and-explore-oracle-sql": "", + "visualize-and-explore-splunk-logs": "", + "wavefront-integration-and-data-source": "", + "zendesk-datasource": "" + } + }, + "get-grafana-cloud-phantom-plugin": { + "description": { + "hosted-graphite-prometheus-and-loki": "" + } + }, "new-data-source-view": { "cancel": "Cancelar", "placeholder-filter-by-name-or-type": "Filtrar por nome ou tipo" }, + "update-data-source": { + "error-info": { + "message": { + "an-unexpected-error-occurred": "" + } + } + }, "use-data-source-info": { "badge-text-not-supported": "Não suportado", - "badge-text-supported": "Suportado" + "badge-text-supported": "Suportado", + "label": { + "alerting": "Alerta", + "type": "Tipo" + } + }, + "use-delete-loaded-data-source": { + "title": { + "delete": "Eliminar" + } + } + }, + "debug": { + "cursor-view": { + "no-events-yet": "" + }, + "render-info-viewer": { + "data-counter": "", + "elapsed-time": "", + "field": "Campo", + "last": "", + "render-counter": "", + "schema-counter": "", + "title-reset-counters": "", + "tooltip-step-back": "", + "type": "Tipo" + }, + "state-view": { + "current-value": "", + "label-state-name": "" } }, "dimensions": { @@ -4731,6 +5894,19 @@ "remove-value-mapping-aria-label-delete-value-mapping": "Eliminar mapeamento de valor", "remove-value-mapping-tooltip-delete": "Eliminar", "set-color": "Definir cor", + "special-match-options": { + "description": { + "boolean-false-values": "", + "boolean-true-values": "", + "empty-string": "", + "matches-against-number-na-n-not-a-number": "", + "matches-null-and-undefined-values": "", + "matches-null-undefined-and-na-n": "" + }, + "label": { + "empty": "Esvaziar" + } + }, "tooltip-remove-color": "Remover cor", "tooltip-remove-icon": "Remover ícone" }, @@ -4746,6 +5922,20 @@ "display-text": "Mostrar texto", "icon": "Ícone", "label-add-a-new-mapping": "Adicionar um novo mapeamento", + "mapping-types": { + "description": { + "match-a-numerical-range-of-values": "", + "match-a-regular-expression-with-replacement": "", + "match-a-specific-text-value": "", + "match-boolean-empty-values": "" + }, + "label": { + "range": "", + "regex": "", + "special": "", + "value": "Valor" + } + }, "update": "Atualizar" } }, @@ -4770,6 +5960,7 @@ }, "explore": { "accordian-logs": { + "events": "", "footer": "Os carimbos de data/hora do evento são relativos à hora de início do trace completo." }, "accordian-references": { @@ -4780,6 +5971,11 @@ "basic-extensions": { "aria-label-add": "Adicionar" }, + "build-dashboard-panel-from-explore-state": { + "title": { + "new-panel": "" + } + }, "clear": "Limpar", "confirm-navigation-modal": { "cancel": "Cancelar", @@ -4866,6 +6062,33 @@ "title-table": "Tabela", "title-traces": "Traces" }, + "explore-query-inspector": { + "data-tab": { + "label": { + "data": "Dados" + } + }, + "error-tab": { + "label": { + "error": "Erro" + } + }, + "json-tab": { + "label": { + "json": "JSON" + } + }, + "query-tab": { + "label": { + "query": "Consulta" + } + }, + "stats-tab": { + "label": { + "stats": "Estatísticas" + } + } + }, "explore-run-query-button": { "run-button": { "aria-label-run-query-options": "Executar opções de consulta" @@ -4879,10 +6102,23 @@ "description-explore-disabled": "Para ativar Explorar, ative-o na configuração da Grafana:", "title-explore-disabled": "Explorar está desativado" }, + "get-field-links-for-explore": { + "text": { + "data": "Dados", + "raw-value": "" + } + }, "get-matches-metadata": { "matches": "0 correspondências" }, "legacy-create-span-link-factory": { + "text": { + "tags": "Etiquetas" + }, + "title": { + "related-logs": "", + "session-for-this-span": "Sessão para este intervalo" + }, "title-explore-metrics-for-this-span": "Explorar métricas para este intervalo", "title-explore-split": "Explorar os registos correspondentes na vista dividida", "title-session-for-this-span": "Sessão para este intervalo" @@ -4923,6 +6159,10 @@ }, "logs-meta-row": { "download": "Transferir", + "label": { + "deduplication-count": "", + "showing-only-selected-fields": "" + }, "show-original-line": "Mostrar linha original" }, "logs-sample-panel": { @@ -5104,6 +6344,21 @@ "run-query-button": "Executar consulta", "switch-datasource-button": "Mudar a origem de dados e executar a consulta" }, + "scoped-vars-from-span": { + "text": { + "span": "" + } + }, + "scoped-vars-from-tags": { + "text": { + "tags": "Etiquetas" + } + }, + "scoped-vars-from-trace": { + "text": { + "trace": "Trace" + } + }, "search-bar-input": { "placeholder-find": "Localizar...", "suffix": { @@ -5138,9 +6393,25 @@ "tooltip-tag-key": "Chave de etiqueta que será utilizada para obter o valor da etiqueta. Os atributos e recursos de um intervalo serão pesquisados para a chave de etiqueta" }, "span-detail": { + "label": { + "kind": "", + "library-name": "", + "library-version": "", + "status": "Estado:", + "status-message": "", + "trace-state": "" + }, "label-resource-attributes": "Atributos dos recursos", "label-span-attributes": "Atributos do intervalo", "label-stack-trace": "Trace de pilha", + "overview-items": { + "label": { + "child-count": "", + "duration": "", + "service": "", + "start-time": "" + } + }, "warnings": "Avisos" }, "span-filters": { @@ -5247,6 +6518,18 @@ "title-node-graph": "Gráfico de nós" }, "unthemed-logs": { + "description": { + "show-results-in-logs-visualisation": "", + "show-results-in-table-visualisation": "", + "show-results-newest-to-oldest": "", + "show-results-oldest-to-newest": "" + }, + "label": { + "logs": "Registos", + "newest-first": "Mais recentes primeiro", + "oldest-first": "Mais antigos primeiro", + "table": "Tabela" + }, "label-deduplication": "Desduplicação", "label-display-results": "Mostrar resultados", "label-prettify-json": "Embelezar JSON", @@ -5262,6 +6545,15 @@ }, "unthemed-virtualized-trace-view": { "title-scroll-to-top": "Navegar para o topo" + }, + "use-focus-span-link": { + "create-focus-span-link": { + "link": { + "title": { + "deep-link-to-this-span": "" + } + } + } } }, "export": { @@ -5347,6 +6639,15 @@ "folder-repo": { "badge-text": "Aprovisionado" }, + "folders": { + "get-loading-nav": { + "main": { + "title": { + "loading": "A carregar" + } + } + } + }, "forgot-password": { "back-button": "Voltar para início de sessão", "change-password": { @@ -5376,10 +6677,102 @@ "incomplete-request-error": "Lamentamos, mas não foi possível concluir o seu pedido. Tente novamente.", "send-custom-feedback": "Enviar" }, + "geomap": { + "coordinates-map-view-editor": { + "label-latitude": "", + "label-longitude": "" + }, + "debug-overlay": { + "center": "", + "zoom": "" + }, + "fit-map-view-editor": { + "all-layers-editor-fragment": { + "label-layer": "" + }, + "label-data": "Dados", + "last-only-editor-fragment": { + "label-padding": "", + "tooltip-padding-relative-percent-beyond-extent": "" + } + }, + "frame-multi-selection-editor": { + "placeholder-change-filter": "" + }, + "frame-selection-editor": { + "placeholder-change-filter": "" + }, + "geomap-panel": { + "aria-label-map": "" + }, + "geomap-style-rules-editor": { + "aria-label-add-geomap-style-rule": "" + }, + "layers-editor": { + "label-add-layer": "", + "no-layers": "" + }, + "map-view-editor": { + "label-max-zoom": "", + "label-view": "Ver", + "label-zoom": "Zoom", + "use-current-map-settings": "" + }, + "markers-legend": { + "title-symbol": "Símbolo" + }, + "measure-overlay": { + "tooltip-show-measure-tools": "" + }, + "plugin": { + "basemap-layer-configured-server-admin": "" + }, + "style-editor": { + "label-align": "", + "label-baseline": "", + "label-color": "Cor", + "label-fill-opacity": "", + "label-font-size": "", + "label-opacity": "", + "label-rotation-angle": "", + "label-size": "", + "label-symbol": "Símbolo", + "label-symbol-horizontal-align": "", + "label-symbol-vertical-align": "", + "label-text-label": "", + "label-x-offset": "", + "label-y-offset": "" + }, + "style-rule-editor": { + "aria-label-comparison-operator": "Operador de comparação", + "aria-label-comparison-value": "", + "aria-label-delete-style-rule": "", + "aria-label-feature-property": "", + "label-rule": "Regra", + "placeholder-feature-property": "", + "placeholder-numeric-value": "", + "placeholder-value": "valor" + } + }, "get-enterprise": { "requires-license": "Requer uma licença do Grafana Enterprise", "title": "Enterprise" }, + "gettingstarted": { + "docs-card": { + "complete": "Completar", + "learn-how": "" + }, + "getting-started": { + "aria-label-to-advanced-tutorials": "", + "aria-label-to-basic-tutorials": "", + "checking-completed-setup-steps": "", + "remove-this-panel": "" + }, + "tutorial-card": { + "complete": "Completar" + } + }, "gops": { "config-card": { "text-loading-configuration": "A carregar a configuração..." @@ -5396,6 +6789,74 @@ }, "progress-status": { "your-progress": "O seu progresso" + }, + "use-get-configuration-for-ui": { + "get-connect-data-source-configuration": { + "title": { + "connect-data-source": "" + } + }, + "title": { + "essentials": "Princípios básicos" + } + }, + "use-get-essentials-configuration": { + "essential-content": { + "description": { + "configure-grafana-alerting": "", + "create-integration-alerting-contact-point": "", + "initialize-incident-plugin-declare-manage-incidents": "", + "practice-solving-an-incident": "", + "receive-alerts-oncall-notifications-within-environment": "", + "select-chat-ops-channels-to-route-notifications": "" + }, + "label": { + "add": "Adicionar", + "connect": "Conectar ", + "initialize": "", + "select-integration": "", + "start-drill": "" + }, + "title": { + "add-slack-notifications-to-irm-integrations": "", + "connect-alerting-to-irm": "", + "connect-irm-to-your-slack-workspace": "", + "connect-your-messaging-workspace-to-incident": "", + "connect-your-messaging-workspace-to-on-call": "", + "create-incident-drill": "", + "detect": "Detetar", + "initialize-incident-plugin": "", + "messaging-workspace-channel-on-call-integration": "", + "respond": "", + "test-your-configuration": "" + } + }, + "get-grafana-alerting-config-steps": { + "description": { + "create-alert-monitor-system": "", + "create-on-call-integration-alerting-contact-point": "", + "create-slos-to-monitor-your-service": "" + }, + "label": { + "connect": "Conectar ", + "create": "Criar", + "enable": "Ativar" + }, + "steps": { + "label": { + "edit": "Editar" + }, + "title": { + "update-default-contact-point": "" + } + }, + "title": { + "connect-alerting-to-on-call": "", + "create-alert-rule": "", + "create-slo": "", + "enable-slo-alerting": "" + } + } } }, "grafana": { @@ -5762,14 +7223,18 @@ "duplicate-panel": "Duplicar painel", "exit-edit/setting-views": "Sair das vistas de edição/definição", "expand-all-rows": "Expandir todas as linhas", + "explore-panel": "", "go-to-dashboards": "Ir para Painéis de controlo", "go-to-explore": "Ir para Explore", "go-to-home-dashboard": "Ir para o Painel de controlo inicial", "go-to-profile": "Ir para o Perfil", + "inspect-panel": "", "make-time-range-permanent": "Tornar o intervalo de tempo absoluto/permanente", "move-time-range-back": "Mover o intervalo de tempo para trás", "move-time-range-forward": "Mover o intervalo de tempo para a frente", "open-search": "Abrir pesquisa", + "open-share-embed-drawer": "", + "open-share-link-drawer": "", "open-shared-modal": "Partilhar instantâneo do painel", "paste-time-range": "Colar intervalo de tempo", "refresh-all-panels": "Atualizar todos os painéis", @@ -5795,6 +7260,11 @@ "support-bundle": "Também pode recuperar um pacote de suporte que contém informações sobre a sua instância da Grafana e origens de dados configuradas na <1>secção de pacotes de suporte</1>.", "troubleshooting-help": "Para solicitar ajuda na resolução de problemas, envie um instantâneo deste painel para o Apoio Técnico da Grafana Labs. O instantâneo contém dados de resposta à consulta e definições do painel." }, + "histogram": { + "histogram-panel": { + "no-histogram-found-in-response": "" + } + }, "inspector": { "inspect-data-tab": { "loading": "A carregar", @@ -5844,6 +7314,9 @@ "label-name": "Nome", "label-password": "Palavra-passe", "label-username": "Nome de utilizador", + "message": { + "email-is-invalid": "" + }, "placeholder-name-optional": "Nome (opcional)", "placeholder-password": "Palavra-passe", "placeholder-username": "Nome de utilizador", @@ -6103,8 +7576,26 @@ "discard-local-changes": "Descartar alterações locais", "title-dashboard-changed": "Painel de controlo alterado" }, + "live-channel-editor": { + "description-grafana-live": "", + "namespace": "Espaço de nome", + "path": "Caminho", + "placeholder-select-watchable-resource": "", + "scope": "", + "title-grafana-live": "" + }, "live-connection-warning": { "title-connection-to-server-is-lost": "Perdeu-se a ligação ao servidor..." + }, + "live-panel": { + "error": "Erro", + "grafana-requires-feature": "", + "panel-editor-channel": "", + "title-grafana-live": "", + "waiting-for-data": "" + }, + "live-publish": { + "publish": "" } }, "lock-icon": "ícone de cadeado", @@ -6151,6 +7642,13 @@ } }, "logs": { + "get-dataframe-fields": { + "vars": { + "text": { + "labels": "Etiquetas" + } + } + }, "infinite-scroll": { "end-of-range": "Fim do intervalo de tempo selecionado.", "load-more": "Deslize para carregar mais", @@ -6231,6 +7729,11 @@ "shortcut": "alt+selecionar para ativar novamente" } }, + "log-series-to-logs-model": { + "label": { + "total-bytes-processed": "" + } + }, "logs-controls": { "deduplication": "Desduplicação", "disable-highlighting": "Desativar destaque", @@ -6265,6 +7768,11 @@ "scroll-top": "Rolar para o topo", "start-of-range": "Início do intervalo" }, + "logs-panel": { + "render-common-labels": { + "common-labels": "" + } + }, "out-of-range-message": { "end-of-the-selected-time-range": "Fim do intervalo de tempo selecionado." }, @@ -6321,6 +7829,14 @@ }, "snapshot-list-table": { "title-delete": "Eliminar" + }, + "unthemed-dashboard-import": { + "subTitle": { + "import-dashboard-from-file-or-grafanacom": "" + }, + "text": { + "import-dashboard": "Importar painel de controlo" + } } }, "migrate-to-cloud": { @@ -6978,8 +8494,57 @@ "close": "Fechar gaveta" }, "link-title": "Ir para o blogue da Grafana Labs", + "news-panel": { + "body-error-loading-rss-feed": "", + "loading": "A carregar...", + "title-error-loading-rss-feed": "" + }, "title": "Novidades do blog" }, + "nodeGraph": { + "arc-options-editor": { + "add-arc": "", + "title-remove-arc": "" + }, + "edge": { + "aria-label-from-to": "" + }, + "edge-header": { + "label-source-target": "" + }, + "marker": { + "100-node-count": "", + "aria-label-hidden-marker": "", + "node-count_one": "", + "node-count_other": "" + }, + "node": { + "aria-label-node-title": "" + }, + "node-graph": { + "aria-label-layered-layout-performance-warning": "", + "aria-label-nodes-hidden-warning": "", + "computing-layout": "", + "no-data": "Sem dados", + "hidden-nodes_one": "", + "hidden-nodes_other": "", + "processed-nodes_one": "", + "processed-nodes_other": "" + }, + "node-graph-panel": { + "no-data-found-in-response": "" + }, + "node-header": { + "label-subtitle": "", + "label-title": "Título" + }, + "view-controls": { + "hide-config": "", + "show-config": "", + "title-zoom-in": "", + "title-zoom-out": "" + } + }, "notifications": { "empty-state": { "description": "As notificações que recebeu aparecerão aqui", @@ -7021,6 +8586,11 @@ "label-organization-name": "Nome da organização", "placeholder-org-name": "Nome da organização" }, + "org-details-page": { + "title": { + "confirm-preferences-update": "" + } + }, "org-profile": { "label-organization-name": "Nome da organização", "label-organization-profile": "Perfil da organização", @@ -7040,7 +8610,10 @@ "tooltip": "Agora pode selecionar a opção \"Sem função básica\" e adicionar permissões às suas necessidades personalizadas. Pode encontrar mais informações na <1>nossa documentação</1>." }, "user-invite-page": { - "sub-title": "Envie um convite ou adicione um utilizador Grafana existente à organização.<1> {{orgName}}</1>" + "sub-title": "Envie um convite ou adicione um utilizador Grafana existente à organização.<1> {{orgName}}</1>", + "text": { + "invite-user": "" + } } }, "org-picker": { @@ -7052,6 +8625,38 @@ } }, "panel": { + "get-calculation-value-data-links-variable-suggestions": { + "value-calc-var": { + "label": { + "calculation-name": "" + } + } + }, + "get-data-links-variable-suggestions": { + "value-time-var": { + "label": { + "time": "Hora" + } + } + }, + "get-field-links-supplier": { + "text": { + "data": "Dados", + "field": "Campo", + "series": "", + "value": "Valor" + } + }, + "get-field-vars": { + "label": { + "name": "Nome" + } + }, + "get-panel-links-variable-suggestions": { + "label": { + "all-variables": "" + } + }, "header-menu": { "copy": "Copiar", "create-library-panel": "Criar painel de biblioteca", @@ -7112,6 +8717,13 @@ "select-placeholder": "Filtrar por tipo" }, "playlist": { + "playlist-new-page": { + "page-nav": { + "text": { + "new-playlist": "Nova lista de reprodução" + } + } + }, "playlist-table-rows": { "aria-label-playlist-item": "Item da lista de reprodução, {{itemType}}, {{itemValue}}", "multiple-dashboards-found": "Vários itens encontrados: {{items}}", @@ -7128,6 +8740,12 @@ "label-mode": "Modo", "label-time-and-refresh": "Tempo e atualização", "label-variables": "Variáveis", + "modes": { + "label": { + "kiosk": "Quiosque", + "normal": "Normal" + } + }, "title-start-playlist": "Iniciar lista de reprodução" } }, @@ -7194,6 +8812,19 @@ }, "browse": { "aria-label-plugin-type-filter": "Filtro do tipo de plugin", + "filter-by-options": { + "label": { + "all": "Todos", + "installed": "Instalado", + "new-updates": "" + } + }, + "label": { + "all": "Todos", + "applications": "", + "data-sources": "Origens de dados", + "panels": "Painéis" + }, "label-search": "Pesquisar", "label-state": "Estado", "label-type": "Tipo", @@ -7275,12 +8906,24 @@ "empty-state": { "message": "Nenhum plugin encontrado" }, + "extensions-log-data-source": { + "message": { + "ok": "OK" + } + }, "filter": { "disabled": "Este filtro foi desativado porque o servidor da Grafana não consegue aceder a grafana.com", "sort": "Ordenar", "sort-list": "Ordenar lista de plugins", "state": "Estado" }, + "get-feature-state-info": { + "text": { + "alpha": "", + "beta": "Beta", + "deprecated": "Obsoleto" + } + }, "get-started-with-app": { "disable": "Desativar", "enable": "Ativar" @@ -7337,6 +8980,16 @@ "plugin-details-header-dependencies": { "grafana-dependency": "Grafana {{grafanaDependency}}" }, + "plugin-details-page": { + "not-found-model": { + "subTitle": { + "requested-belong-plugin": "" + }, + "text": { + "unknown-plugin": "" + } + } + }, "plugin-details-signature": { "body-invalid-plugin-signature": "A Grafana Labs verifica cada plugin para assegurar que tem uma assinatura digital válida. A verificação da assinatura do plugin faz parte das nossas medidas de segurança para garantir que os plugins são seguros e fiáveis. A Grafana Labs não pode garantir a integridade deste plugin não assinado. Pedir ao autor do plugin para solicitar a sua assinatura.", "read-more-about-plugins-signing": "Leia mais sobre a assinatura de plugins.", @@ -7382,6 +9035,13 @@ "search-field": { "placeholder-search-grafana-plugins": "Pesquisar plugins Grafana" }, + "use-plugin-details-tabs": { + "nav-model-children": { + "text": { + "dashboards": "Painéis de controlo" + } + } + }, "version-install-button": { "text-installed": "Instalado" }, @@ -7499,6 +9159,11 @@ "label-git-hub-features": "Funcionalidades do GitHub", "label-realtime-feedback": "Feedback em tempo real" }, + "connect-page": { + "subTitle": { + "connect-external-storage-manage-resources": "" + } + }, "connect-repository-button": { "configure": "Configurar", "configure-file": "Configurar o provisionamento de ficheiros", @@ -7532,7 +9197,13 @@ }, "edit-repository-page": { "back-to-repositories": "Voltar aos repositórios", - "repository-config-exists-configuration": "Certifique-se de que a configuração do repositório existe no ficheiro de configuração." + "repository-config-exists-configuration": "Certifique-se de que a configuração do repositório existe no ficheiro de configuração.", + "subTitle": { + "configure-repository-storing-resources": "" + }, + "text": { + "configure-repository": "" + } }, "empty-state": { "no-jobs": "Sem serviços..." @@ -7595,6 +9266,11 @@ "no-results-matching-your-query": "Não foram encontrados resultados que correspondam à sua consulta", "placeholder-search": "Pesquisar" }, + "get-default-values": { + "title": { + "repository": "Repositório" + } + }, "getting-started": { "alert-temporary-outage": "Quando liga toda a sua instância, os painéis de controlo ficarão indisponíveis durante a execução da migração. Recomendamos que avise os seus utilizadores antes de iniciar o processo.", "modal-description-public-access": "Configure o acesso público à sua instância Grafana para ativar a integração do GitHub", @@ -7739,7 +9415,18 @@ "dashboard-preview": "Pré-visualização do painel de controlo", "existing-dashboard": "Painel de controlo existente", "history": "Histórico", + "message": { + "removed-from-repo-test-ui": "", + "updated-from-repo-test-ui": "" + }, "repository": "Repositório", + "tab-info": { + "label": { + "dry-run-result-after-apply": "", + "existing-from-grafana": "", + "file-from-repository": "" + } + }, "title-error-saving-file": "Erro ao guardar o ficheiro" }, "setup-modal": { @@ -8152,14 +9839,6 @@ "reload-button": "Recarregar", "title": "Não foi possível encontrar o ficheiro da aplicação" }, - "sandbox": { - "test-stuff-page": { - "application-notifications-toasts-testing": "Teste de notificações da aplicação (alertas)", - "error": "Erro", - "success": "Sucesso", - "warning": "Aviso" - } - }, "save-dashboards": { "message-length": { "info": "A mensagem tem {{messageLength}} carateres, o que excede o comprimento máximo de 500 carateres. Encurte-a antes de guardar.", @@ -8219,6 +9898,14 @@ "view-as-folders": "Ver por pastas", "view-as-list": "Ver como lista" }, + "bluge-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } + }, "dashboard-actions": { "import": "Importar", "new": "Novo", @@ -8246,6 +9933,14 @@ "search-results-table": { "aria-label-search-results-table": "Tabela de resultados de pesquisa", "no-data": "Nenhum valor" + }, + "unified-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } } }, "select": { @@ -8317,6 +10012,11 @@ "delete-service-account": "Eliminar a conta de serviço", "disable-service-account": "Desativar a conta de serviço", "enable-service-account": "Ativar a conta de serviço", + "page-nav": { + "subTitle": { + "manage-settings-individual-service-account": "" + } + }, "title-delete-service-account": "Eliminar a conta de serviço", "title-disable-service-account": "Desativar a conta de serviço", "tokens": "Tokens", @@ -8633,6 +10333,12 @@ "sort-picker": { "select-aria-label": "Ordenar" }, + "status-history": { + "status-history-panel": { + "too-many-points_one": "", + "too-many-points_other": "" + } + }, "support-bundles": { "new-bundle-button": { "new-support-bundle": "Novo pacote de suporte" @@ -8640,7 +10346,10 @@ "support-bundles-create-unconnected": { "cancel": "Cancelar", "create": "Criar", - "sub-title": "Escolha os componentes para o pacote de suporte. O pacote de suporte estará disponível por 3 dias após a criação." + "sub-title": "Escolha os componentes para o pacote de suporte. O pacote de suporte estará disponível por 3 dias após a criação.", + "text": { + "create-support-bundle": "" + } }, "support-bundles-unconnected": { "created-on": "Criado em", @@ -8655,10 +10364,35 @@ "login": "Entrar" }, "table": { + "auto-cell-options-editor": { + "description-wrap-text": "", + "label-wrap-text": "" + }, + "bar-gauge-cell-options-editor": { + "label-gauge-display-mode": "", + "label-value-display": "" + }, + "color-background-cell-options-editor": { + "description-apply-to-entire-row": "", + "description-wrap-text": "", + "label": { + "text-alpha": "" + }, + "label-apply-to-entire-row": "", + "label-background-display-mode": "", + "label-wrap-text": "", + "wrap-text": "" + }, "container": { "content": "Mostrar demasiadas colunas numa única tabela pode afetar o desempenho e dificultar a leitura dos dados. Considere refinar as suas consultas.", "show-all-series": "Mostrar todas as colunas", "show-only-series": "A mostrar apenas {{MAX_NUMBER_OF_COLUMNS}} colunas" + }, + "image-cell-options-editor": { + "description-alt-text": "", + "description-title-text": "", + "label-alt-text": "", + "label-title-text": "" } }, "tag-filter": { @@ -8674,6 +10408,24 @@ "select-placeholder": "Selecione uma equipa" }, "teams": { + "build-nav-model": { + "nav-model": { + "subTitle": { + "manage-members-and-settings": "" + }, + "text": { + "settings": "Definições" + } + }, + "team-group-sync": { + "text": { + "external-group-sync": "Sincronização do grupo externo" + } + }, + "text": { + "members": "Membros" + } + }, "create-team": { "create": "Criar", "description-email": "Isto é opcional e é utilizado principalmente para permitir avatares de equipa personalizados", @@ -8695,6 +10447,9 @@ "external-group-sync": "Sincronização do grupo externo", "label-add-external-group": "Adicionar grupo externo", "team-sync-upgrade": "Adicionar um grupo para ativar a sincronização de equipas gratuitamente durante o seu período de avaliação da Grafana Pro", + "text": { + "add-group": "Adicionar grupo" + }, "title-there-external-groups": "Não existem grupos externos para sincronizar", "tooltip-add-external-group": "Exemplo de grupo LDAP: {{example}}" }, @@ -8796,6 +10551,42 @@ "select-search-input": "Digite para pesquisar (país, cidade, abreviatura)" } }, + "timeseries": { + "annotation-editor2": { + "add-annotation": "Adicionar anotação", + "cancel": "Cancelar", + "edit-annotation": "", + "label-description": "Descrição", + "label-tags": "Etiquetas", + "placeholder-add-tags": "", + "save": "Guardar", + "saving": "A guardar" + }, + "annotation-tooltip2": { + "tooltip-delete": "Eliminar", + "tooltip-edit": "Editar" + }, + "line-style-editor": { + "title-the-input-expects-a-segment-list": "", + "tooltip-help": "Ajuda" + }, + "nulls-threshold-input": { + "placeholder-never": "Nunca" + }, + "outside-range-plugin": { + "data-outside-time-range": "", + "zoom-to-data": "" + }, + "timezones-editor": { + "tooltip-add-timezone": "", + "tooltip-remove-timezone": "" + } + }, + "traces": { + "traces-panel": { + "no-data-found-in-response": "" + } + }, "transformations": { "empty": { "add-transformation-body": "As transformações permitem que os dados sejam alterados de várias maneiras antes da sua visualização ser mostrada.<1></1>Isto inclui unir dados, renomear campos, fazer cálculos, formatar dados para exibição e muito mais.", @@ -8832,6 +10623,10 @@ "convert-field-type-transformer-editor": { "aria-label-add-a-convert-field-type-transformer": "Adicionar um transformador de tipo de campo convert", "aria-label-remove-convert-field-type-transformer": "Remover transformador de tipo de campo convert", + "label": { + "browser": "Navegador", + "utc": "" + }, "label-as": "como", "label-date-format": "Formato da data", "label-field": "Campo", @@ -8918,11 +10713,32 @@ "tooltip-format": "O formato de saída para o campo especificado como uma <2>sequência de caracteres de formato Moment.js</2>.", "tooltip-timezone-manually": "Defina o fuso horário da data manualmente" }, + "get-timezone-options": { + "label": { + "browser": "Navegador", + "utc": "" + } + }, "get-tooltips": { "description": "Um caminho válido de um objeto json.", "json-value": "Valor JSON:", + "map-valid-paths": { + "description": { + "extract-fields-from-object": "", + "extract-value": "", + "extract-value-first-element": "", + "extract-value-second-element": "" + } + }, "valid-paths": "Caminhos válidos:" }, + "get-transformer-option-pane": { + "root": { + "title": { + "root": "" + } + } + }, "group-by-field-configuration": { "placeholder-ignored": "Ignorado", "placeholder-select-stats": "Selecionar estatísticas" @@ -8939,7 +10755,23 @@ "label-cell-value": "Valor da célula", "label-column": "Coluna", "label-empty-value": "Valor vazio", - "label-row": "Linha" + "label-row": "Linha", + "special-value-options": { + "description": { + "boolean-false-value": "", + "boolean-true-value": "", + "empty-string": "", + "null-value": "", + "number-value": "" + }, + "label": { + "empty": "Esvaziar", + "false": "", + "null": "", + "true": "", + "zero": "" + } + } }, "histogram-transformer-editor": { "placeholder-auto": "Automóvel", @@ -9002,10 +10834,22 @@ "tooltip-naming": "Define como os nomes dos campos selecionados são exibidos. Como o nome do frame é geralmente melhor para dados tabulares" }, "partition-by-values-editor": { + "keep-fields-options": { + "label": { + "no": "Não", + "yes": "Sim" + } + }, "label-field": "Campo", "label-keep-fields": "Manter campos", "label-naming": "Nomear", "label-select-field": "Selecionar campo", + "naming-modes-options": { + "label": { + "as-frame-name": "", + "as-label": "" + } + }, "partition-values-works-single-frame": "A partição por valores só funciona com um único frame.", "tooltip-keeps-partition-fields-frames": "Mantém os campos de partição nos frames" }, @@ -9027,6 +10871,16 @@ "label-include-time": "Incluir hora", "label-labels-to-fields": "Etiquetas para campos", "label-mode": "Modo", + "modes": { + "description": { + "collapse-field-single-value": "", + "create-table-series-value": "" + }, + "label": { + "reduce-fields": "", + "series-to-rows": "" + } + }, "placeholder-choose-stat": "Escolher estatística" }, "regex-matcher-editor": { @@ -9034,11 +10888,23 @@ "variable-regex-documentation": "" }, "regression-transformer-editor": { + "label": { + "cubic": "", + "quadratic": "", + "quartic": "", + "quintic": "" + }, "label-degree": "Degree", "label-model-type": "Tipo de modelo", "label-predicted-points": "Pontos previstos", "label-x-field": "Campo X", "label-y-field": "Campo Y", + "model-type-options": { + "label": { + "linear": "", + "polynomial": "" + } + }, "tooltip-number-of-xy-points-to-predict": "Número de pontos X, Y para prever" }, "rename-by-regex-transformer-editor": { @@ -9056,6 +10922,23 @@ "label-reverse": "Inverter", "placeholder-select-field": "Selecionar campo" }, + "supplier": { + "description": { + "apply-spatial-operations-to-the-geometry": "", + "create-a-line-between-two-points": "", + "geometry-define-field-headingdistancearea": "" + }, + "label": { + "area": "", + "as-line": "", + "calculate-value": "", + "distance": "", + "heading": "", + "line-builder": "", + "prepare-spatial-field": "", + "transform": "" + } + }, "time-series-table-transform-editor": { "label-stat": "Estatística", "label-time-field": "Campo de hora", @@ -9089,7 +10972,19 @@ "placeholder-auto": "Automóvel", "placeholder-field": "Campo", "tooltip-window-size": "Tamanho da janela", - "tooltip-window-size-percent": "Definir o tamanho da janela como uma percentagem do total de dados" + "tooltip-window-size-percent": "Definir o tamanho da janela como uma percentagem do total de dados", + "type-options": { + "label": { + "centered": "", + "trailing": "" + } + }, + "window-size-mode-options": { + "label": { + "fixed": "", + "percentage": "" + } + } } }, "upgrade-box": { @@ -9146,6 +11041,11 @@ }, "users-action-bar-unconnected": { "invite": "Convidar", + "options": { + "label": { + "users": "Utilizadores" + } + }, "placeholder-search-login-email": "Pesquisar utilizador por início de sessão, e-mail ou nome" } }, @@ -9189,6 +11089,32 @@ "confirm-delete-modal": { "title-delete-variable": "Eliminar variável" }, + "create-ad-hoc-variable-adapter": { + "description": { + "add-keyvalue-filters-on-the-fly": "" + } + }, + "create-custom-variable-adapter": { + "description": { + "define-variable-values-manually": "" + } + }, + "create-interval-variable-adapter": { + "description": { + "define-timespan-interval": "" + } + }, + "create-query-variable-adapter": { + "description": { + "variable-values-fetched-datasource-query": "" + } + }, + "data-source-variable-slice": { + "text": { + "default": "", + "no-data-sources-found": "Nenhuma origem de dados encontrada" + } + }, "empty-state": { "button-title": "Adicionar variável", "info-box-content": "As variáveis permitem painéis de controlo mais interativos e dinâmicos. Em vez de codificar coisas como nomes de servidores ou sensores nas suas consultas de métricas, pode utilizar variáveis no seu lugar. As variáveis são mostradas como caixas de listagem na parte superior do painel de controlo. Estas listas suspensas facilitam a alteração dos dados exibidos no seu painel de controlo.", @@ -9215,6 +11141,13 @@ "placeholder-default-value-if-any": "valor predefinido, se houver", "text-options": "Opções de texto" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "unknown-table": { "loading": "A carregar...", "no-unknowns": "Não foram encontradas variáveis renomeadas ou em falta.", @@ -9271,5 +11204,25 @@ "data-hover-view": { "link": "Link" } + }, + "welcome": { + "welcome-banner": { + "need-help": "Precisa de ajuda? ", + "welcome-to-grafana": "" + } + }, + "xychart": { + "series-editor": { + "add-series": "", + "aria-label-select-series": "", + "label-color-field": "", + "label-frame": "Frame", + "label-size-field": "", + "label-x-field": "Campo X", + "label-y-field": "Campo Y", + "placeholder-all-frames": "", + "placeholder-select-frame": "", + "tooltip-delete-series": "" + } } } \ No newline at end of file diff --git a/public/locales/ru-RU/grafana.json b/public/locales/ru-RU/grafana.json index ed36a9bf7db..48924f1c710 100644 --- a/public/locales/ru-RU/grafana.json +++ b/public/locales/ru-RU/grafana.json @@ -72,6 +72,11 @@ }, "admin-edit-org-page": { "label-name": "Имя", + "page-nav": { + "subTitle": { + "manage-settings-roles-organization": "" + } + }, "render-missing-permission-message": { "title-access-denied": "Доступ запрещен" } @@ -233,6 +238,13 @@ "upgrade-info": { "title": "Лицензия Enterprise" }, + "user-admin-page": { + "page-nav": { + "subTitle": { + "manage-settings-for-an-individual-user": "" + } + } + }, "user-create-page": { "label-email": "Адрес электронной почты", "label-name": "Имя", @@ -243,9 +255,16 @@ "label-ldap": "LDAP" }, "user-list-admin-page-un-connected": { + "label": { + "active-last-days": "", + "all-users": "Все пользователи" + }, "placeholder-search-login-email": "Поиск пользователя по логину, адресу электронной почты или имени" }, "user-list-anonymous-devices-page-un-connected": { + "label": { + "active-last-days": "" + }, "placeholder-search-devices-by-ip-address": "Поиск устройств по IP-адресу" }, "user-list-page": { @@ -364,6 +383,12 @@ "no-grouping": "Без группировки" }, "alert-group-alerts-table": { + "columns": { + "label": { + "instance-labels": "", + "notification-state": "Состояние уведомления" + } + }, "duration": "в течение {{time}}" }, "alert-group-filter": { @@ -451,6 +476,11 @@ "description-section": "Введите имя для идентификации {{entityName}}.", "label-metric": "Метрика", "label-name": "Имя", + "message": { + "must-enter-a-metric-name": "", + "must-enter-a-name": "", + "please-select-a-data-source": "Выберите источник данных" + }, "metric-aria-label-metric": "метрика", "metric-placeholder-recorded-metric": "Укажите название новой записываемой метрики", "placeholder-name": "Присвоить {{namePlaceholder}} название", @@ -503,6 +533,9 @@ "alertmanager-config": { "gma-manual-configuration-description": "Внутреннюю конфигурацию обработчика оповещений Grafana Alertmanager невозможно изменить вручную. Чтобы изменить конфигурацию, измените отдельные ресурсы через пользовательский интерфейс.", "gma-manual-configuration-is-not-supported": "Изменения конфигурации вручную не поддерживаются", + "message": { + "configuration-cannot-be-empty": "" + }, "reset": "Сброс", "reset-confirmation": "Действительно сбросить конфигурацию для обработчика оповещений{{alertmanagerName}}? Точки контакта и политики уведомления будут сброшены до значений по умолчанию.", "resetting-configuration-might-while": "Выполняется сброс конфигурации. Это может занять некоторое время.", @@ -592,6 +625,9 @@ "create-a-contact-point": "Создать точку контакта", "label-default-contact-point": "Точка контакта по умолчанию", "label-timing-options": "Параметры времени", + "message": { + "required": "" + }, "or": "или" }, "am-routes-expanded-form": { @@ -613,11 +649,19 @@ "label-override-grouping": "Переопределить группировку", "label-value": "Значение", "matching-labels": "Совпадающие метки", + "message": { + "required": "" + }, "placeholder-label": "метка", "placeholder-value": "значение", "remove": "Удалить", "tooltip-remove-matcher": "Удалить средство сопоставления" }, + "annotation-header-field": { + "message": { + "required": "" + } + }, "annotations": { "dashboard-annotation-field": { "dashboard": "Дашборд {{dashboardUid}}", @@ -689,6 +733,25 @@ "title": "Невозможно отобразить все события" } }, + "central-alert-history-scene": { + "scene": { + "labels-filter-variable": { + "label": { + "labels": "" + } + }, + "transitions-from-filter-variable": { + "label": { + "start-state": "" + } + }, + "transitions-to-filter-variable": { + "label": { + "end-state": "" + } + } + } + }, "channel-sub-form": { "delete": "Удалить", "duplicate": "Дублировать", @@ -725,11 +788,17 @@ }, "cloud-data-source-selector": { "label": "Выбрать источник данных", - "label-disabled": "Источник данных" + "label-disabled": "Источник данных", + "message": { + "please-select-a-data-source": "Выберите источник данных" + } }, "cloud-evaluation-behavior": { "description-pending-period": "Период, в течение которого должно быть выполнено пороговое условие для активации оповещения. Если выбрать «Нет», оповещение активируется сразу после выполнения условия.", "label-pending-period": "Период ожидания", + "message": { + "must-be-a-positive-integer": "" + }, "title-set-evaluation-behavior": "Установка режима оценки" }, "cloud-receiver-form": { @@ -770,6 +839,9 @@ "contact-point-selector": { "aria-label-refresh-contact-points": "Обновить точки контакта", "contact-point-picker-label-contact-point": "Точка контакта", + "message": { + "contact-point-is-required": "" + }, "title-failed-to-fetch-contact-points": "Не удалось получить точки контакта", "tooltip-refresh-contact-points-list": "Обновить список точек контакта" }, @@ -840,6 +912,14 @@ }, "copy-to-clipboard": "Копировать метку «{{label}}» в буфер обмена", "create-metadata": { + "label": { + "dashboard": "Дашборд", + "dashboard-and-panel": "", + "evaluation-interval": "Интервал оценки", + "labels": "Метки", + "metric-name": "", + "runbook-url": "" + }, "view-dashboard": "Просмотр дашборда", "view-panel": "Просмотр панели" }, @@ -880,9 +960,6 @@ "title-search-panel": "Панель поиска", "title-select-dashboard-and-panel": "Выбор дашборда и панели" }, - "data-source-section": { - "import-to-grafana": "Импорт в правила Grafana" - }, "datasource-not-found": { "card-description": "Источник данных для этого запроса не найден. Он был удален или неправильно установлен.", "remove-query": "Удалить запрос", @@ -964,6 +1041,11 @@ "text-loading-template": "Загрузка шаблона...", "title-failed-to-fetch-notification-template": "Не удалось получить шаблон уведомления" }, + "edit-mute-timing-page": { + "text": { + "edit-time-interval": "" + } + }, "editor": { "edit-alert-rule": "", "edit-recording-rule": "", @@ -977,6 +1059,11 @@ "error-summary-button": { "content-show-all-errors": "" }, + "evaluate-every-validation-options": { + "message": { + "required": "" + } + }, "evaluation-behavior-summary": { "evaluate": "", "label-evaluate": "Оценка", @@ -994,6 +1081,9 @@ "evaluation-group-creation-modal": { "description-group-name": "Оценка всех правил группы осуществляется в одном и том же интервале оценки.", "description-often-rules-group-evaluated": "Частота оценки всех правил в группе.", + "message": { + "required": "" + }, "placeholder-enter-a-name": "Введите название", "title-new-evaluation-group": "Новая группа оценки" }, @@ -1016,12 +1106,24 @@ "title-permission-editrecreate-silence": "У вас нет разрешения на редактирование или повторное создание этого временного отключения", "title-silence-not-found": "Существующее временное отключение «{{silenceId}}» не найдено" }, + "existing-silence-editor-page": { + "page-nav": { + "text": { + "edit-silence": "" + } + } + }, "export": { "subtitle": { "formats": "Выбор формата и загрузка файла или копирование содержимого в буфер обмена", "one-format": "Загрузка файла или копирование содержимого в буфер обмена" } }, + "export-new-grafana-rule-page": { + "text": { + "export-new-grafana-rule": "" + } + }, "export-new-rule-button": { "tooltip-export-new-grafana-rule": "Экспортировать новое правило Grafana" }, @@ -1047,6 +1149,16 @@ "no-data": "Нет данных", "page-counter": "" }, + "feature-toggle-page": { + "nav-model": { + "subTitle": { + "enable-alerting-grafana-config": "" + }, + "text": { + "alerting-is-not-enabled": "" + } + } + }, "federated-rule-warning": { "experimental": "В настоящее время федеративные группы правил являются экспериментальной функцией.", "read-documentation": "Прочитать документацию", @@ -1054,6 +1166,13 @@ }, "file-export-inline-documentation": { "api-provisioning": "Формат {{name}} действителен только для подготовки API. <3>Подробнее см. в документации.</3>", + "export-inline-doc": { + "title": { + "apiprovisioning-format": "", + "fileprovisioning-format": "", + "terraformprovisioning-format": "" + } + }, "file-provisioning": "Формат {{name}} действителен только для подготовки файлов. <3>Подробнее см. в документации.</3>", "terraform-provisioning": "Формат {{name}} действителен только для подготовки Terraform. <3>Подробнее см. в документации.</3>" }, @@ -1061,6 +1180,20 @@ "copy-code": "Копировать код", "download": "Загрузить" }, + "filter-options": { + "label": { + "alert-rule": "Правило оповещения", + "all": "Все", + "error": "Ошибка", + "firing": "", + "no-data": "Нет данных", + "normal": "Нормальное", + "ok": "OK", + "pending": "Ожидание", + "recording-rule": "Правило записи", + "recovering": "Восстановление" + } + }, "filter-view-results": { "aria-label-filteredrulelist": "список-отфильтрованных-правил" }, @@ -1095,7 +1228,10 @@ } }, "folder-selector": { - "description-select-folder": "Выберите папку для хранения правила." + "description-select-folder": "Выберите папку для хранения правила.", + "message": { + "select-a-folder": "" + } }, "folderAndGroup": { "evaluation": { @@ -1110,15 +1246,88 @@ "for-input": { "description-pending": "Период, в течение которого должно быть выполнено пороговое условие для активации оповещения. Если выбрать «Нет», оповещение активируется сразу после выполнения условия." }, + "for-validation-options": { + "message": { + "required": "" + } + }, "generate-alert-data-modal": { "add-alert-data": "Добавить данные оповещения", "add-alert-data-to-payload": "Добавить данные оповещения в полезные данные", + "alert-options": { + "label": { + "firing": "", + "resolved": "" + } + }, "review-alert-payload": " Просмотр данных оповещения для добавления в полезные данные:", "title-add-custom-alerts": "Добавление пользовательских оповещений" }, + "get-alert-suggestions": { + "documentation": { + "annotations-attached-alert": "", + "fingerprint-identify-alert": "", + "grafana-external-alertmanager": "", + "organization-alert": "", + "time-the-alert-started-firing": "" + }, + "value": { + "labels-attached-alert": "", + "status-alert-firing-resolved": "" + } + }, + "get-cloud-scenes": { + "title": { + "mimir-alertmanager": "" + } + }, + "get-global-suggestions": { + "value": { + "an-array-containing-all-alerts": "" + } + }, + "get-grafana-alertmanager-scenes": { + "title": { + "grafana-alertmanager": "" + } + }, + "get-grafana-managed-scenes": { + "title": { + "grafanamanaged-alert-rules": "Правила оповещения, управляемые Grafana" + } + }, + "get-mimir-managed-rules-per-group-scenes": { + "rule-group-handler": { + "label": { + "rule-group": "" + } + }, + "title": { + "mimirmanaged-alert-rules-per-rule-group": "" + } + }, + "get-mimir-managed-rules-scenes": { + "title": { + "mimirmanaged-alert-rules": "" + } + }, "get-preview-results": { "title-error": "Ошибка" }, + "get-state-display-model": { + "text": { + "alerting": "", + "error": "", + "firing": "", + "inactive": "", + "no-data": "", + "ok": "OK", + "paused": "", + "pending": "", + "recovering": "", + "unknown": "" + } + }, "getting-stared": { "learn-more": "Практическое введение см. в нашем <2>руководстве по началу работы с Grafana Alerting</2>" }, @@ -1160,6 +1369,10 @@ "label-disable-resolved-message": "Отключить сообщение об устранении" }, "grafana-evaluation-behavior-step": { + "message": { + "must-be-a-positive-integer": "", + "must-enter-a-group-name": "" + }, "missing-series-resolve-placeholder": "По умолчанию: 2", "or": "или", "placeholder-select-an-evaluation-group": "Выберите группу оценки...", @@ -1176,6 +1389,11 @@ "body-invalid-rule-id": "Недопустимый уникальный идентификатор правила в URL-адресе страницы. Проверьте URL-адрес и повторите попытку.", "title-invalid-rule-id": "Недопустимый идентификатор правила" }, + "grafana-modify-export-page": { + "text": { + "modify-export": "" + } + }, "grafana-mute-timing-exporter-preview": { "text-loading": "Загрузка...." }, @@ -1228,6 +1446,9 @@ }, "group-and-namespace-fields": { "group-picker-label-group": "Группа", + "message": { + "required": "" + }, "namespace-picker-label-namespace": "Пространство имен" }, "group-by": { @@ -1284,14 +1505,19 @@ "header": { "tooltip-remove": "Удалить выражение «{{refId}}»" }, + "history-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "Выполнено" + } + }, "home": { "label-get-started": "Начало работы", "label-insights": "Аналитика", "title-alerting": "Оповещение" }, - "import-from-dsrules": { - "description-folder-import-rules": "Папка для импорта правил." - }, "import-to-gma": { "action-button": "Импорт", "additional-settings": "Дополнительные параметры", @@ -1299,8 +1525,9 @@ "confirm-modal": { "confirm": "Импорт", "loading": "Загрузка…", - "loading-body": "Подготовка данных к импорту. Это может занять некоторое время...", + "loading-body": "", "no-rules-body": "Нет правил для импорта. Выберите другое пространство имен или группу правил.", + "no-rules-body-yaml": "", "no-rules-title": "Нет правил для импорта", "plugin-rules-warning": { "text": "Мы обнаружили, что некоторые правила управляются плагинами. Эти правила не будут импортированы.", @@ -1319,11 +1546,12 @@ "label": "Группа" }, "import-location-and-filters": "Импортировать местоположение и фильтры", + "import-source": "", "namespace": { "description": "Введите текст для поиска существующего пространства имен.", "label": "Пространство имен" }, - "pageTitle": "Импорт правил оповещения из источника данных в правила, управляемые Grafana", + "pageTitle": "", "pause": { "label": "Приостановить импортированные правила оповещения" }, @@ -1331,10 +1559,26 @@ "label": "Приостановить импортированные правила записи" }, "recording-rules": "Правила записи", + "source": { + "datasource": "", + "datasource-description": "", + "yaml": "", + "yaml-description": "" + }, "success": "Правила оповещения импортированы в правила, управляемые Grafana.", "target-folder": { + "description": "Папка для импорта правил.", "label": "Целевая папка" - } + }, + "yaml": { + "description": "", + "label": "", + "required-message": "", + "target-datasource": "Целевой источник данных", + "target-datasource-description": "", + "target-datasource-required": "" + }, + "yaml-error": "" }, "insights": { "monitor-status-of-system": "Следите за состоянием своей системы", @@ -1410,6 +1654,9 @@ "text-loading-existing-labels": "Загрузка существующих меток" }, "labels-without-suggestions": { + "message": { + "required": "" + }, "placeholder-key": "ключ", "placeholder-value": "значение" }, @@ -1451,6 +1698,24 @@ "log-record-viewer-by-timestamp": { "aria-label-state-history-by-timestamp": "Журнал состояний по меткам времени" }, + "log-timeline-viewer": { + "label": { + "firing": "", + "mixed": "", + "no-data": "", + "normal": "Нормальное", + "pending": "Ожидание", + "recovering": "Восстановление" + } + }, + "loki-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "Выполнено" + } + }, "loki-state-history": { "clear-filters": "Очистить фильтры", "common-labels": "Общие метки", @@ -1463,6 +1728,14 @@ "button": "Управление разрешениями", "title": "Управление разрешениями" }, + "manual-and-automatic-routing": { + "routing-options": { + "label": { + "select-contact-point": "", + "use-notification-policy": "" + } + } + }, "matcher-filter": { "filter-alerts-using-label-querying-without-braces": "Фильтр оповещений с использованием запросов меток без скобок, например,", "filter-alerts-using-label-querying-without-spaces": "Фильтруйте оповещения с использованием запросов меток без пробелов, например,", @@ -1480,6 +1753,9 @@ "label-operator": "Оператор", "label-refine-affected-alerts": "Уточнить затронутые оповещения", "label-value": "Значение", + "message": { + "required": "" + }, "placeholder-label": "метка", "placeholder-value": "значение", "remove": "Удалить", @@ -1511,6 +1787,16 @@ "aria-label": "Еще", "button-text": "Еще" }, + "multiple-data-source-picker": { + "get-data-source-options": { + "grouped-options": { + "label": { + "data-sources-with-configured-alert-rules": "", + "other-data-sources": "" + } + } + } + }, "mute-timing-actions-buttons": { "text-disabled": "Отключено", "title-delete-mute-timing": "Удаление времени отключения звука" @@ -1574,11 +1860,26 @@ "read-more": "Подробнее о политиках уведомления.", "title-notification-routing": "Маршрутизация уведомлений" }, + "new-mute-timing-page": { + "text": { + "add-time-interval": "" + } + }, "new-rule-from-panel-button": { "body-no-alerting-capable-query-found": "Невозможно создать оповещения с этой панели, поскольку не найден запрос к источнику данных, способному генерировать оповещения.", "new-alert-rule": "Новое правило оповещения", "title-no-alerting-capable-query-found": "Не найдены запросы, способные генерировать оповещения" }, + "new-silence-page": { + "page-nav": { + "subTitle": { + "configure-silences-notifications-particular-alert": "" + }, + "text": { + "silence-alert-rule": "Временное отключение правила оповещения" + } + } + }, "no-alert-managers-available": { "body-no-alertmanager-found": "Внешние обработчики оповещений не были найдены, поэтому у вас может не быть доступа к встроенному обработчику Grafana Alertmanager.", "title-no-alertmanager-found": "Не найден обработчик оповещений Alertmanager" @@ -1809,6 +2110,9 @@ "expressions": "Выражения", "loading-data-sources": "Загрузка источников данных...", "manipulate-returned-queries-other-operations": "Управляйте данными, возвращаемыми в результате запросов, с помощью математических и других операций.", + "message": { + "a-valid-expression-is-required": "" + }, "no-compatible-sources": "Похоже, у вас нет совместимых источников данных", "title-deactivate-advanced-options": "Отключение расширенных параметров", "title-queries-expressions-configured": "Запросы или выражения не настроены" @@ -1860,7 +2164,8 @@ }, "recording-rules": { "description-target-data-source": "Источник данных Prometheus для хранения правил записи.", - "label-target-data-source": "Целевой источник данных" + "label-target-data-source": "Целевой источник данных", + "target-data-source-required": "" }, "recording-rules-name-space-and-group-step": { "description-select-namespace-group-recording": "Выберите пространство имен и группу для правила записи.", @@ -2127,6 +2432,9 @@ "collapse-all": "Свернуть всё", "expand-all": "Развернуть всё" }, + "rule-list-v2": { + "import-to-gma": "" + }, "rule-modify-export": { "text-loading-the-rule": "Загрузка правила...", "title-cannot-exist": "Не удалось загрузить правило Правило не существует", @@ -2206,6 +2514,10 @@ "label-saved-searches": "Сохраненные поиски" }, "health": "Работоспособность", + "label": { + "hide": "Скрыть", + "show": "Показать" + }, "manage-alerts": "В этих источниках данных можно выбрать параметр «Управление оповещениями через пользовательский интерфейс Alerting», чтобы иметь возможность управлять этими правилами оповещения в пользовательском интерфейсе Grafana, а также в источнике данных, где они были установлены.", "placeholder-all-data-sources": "Все источники данных", "plugin-rules": "Правила плагинов", @@ -2302,6 +2614,9 @@ "label-comment": "Комментарий", "label-created-by": "Кем создано", "label-duration": "Длительность", + "message": { + "required": "" + }, "placeholder-whos-creating-the-silence": "Кто создает временное отключение", "save-silence": "Сохранить временное отключение", "saving": "Сохранение..." @@ -2340,6 +2655,12 @@ "title-alert-rule-types": "Типы правил оповещения" }, "state-history": { + "columns": { + "label": { + "state": "Состояние", + "time": "Время" + } + }, "filter-group": "Фильтровать группу", "filter-group-tooltip": "Фильтруйте каждую группу истории состояний по точному совпадению или регулярному выражению, например:", "placeholder-search": "Поиск", @@ -2379,6 +2700,9 @@ "label-examples-documentation": "Документация по примерам", "label-template-group": "Группа шаблонов", "label-template-group-name": "Название группы шаблонов", + "message": { + "required": "" + }, "new-template-name-placeholder-give-your-template-group-a-name": "Наименуйте свою группу шаблонов", "title-error-saving-template": "Ошибка при сохранении шаблона", "title-templating-cheat-sheet": "Памятка по созданию шаблонов" @@ -2401,6 +2725,11 @@ "existing-templates-selector-aria-label-choose-notification-template": "Выбрать шаблон уведомления", "existing-templates-selector-placeholder-choose-notification-template": "Выбрать шаблон уведомления", "loading": "Загрузка…", + "template-options": { + "label": { + "select-notification-template": "" + } + }, "tooltip-copy": "Копировать выбранный шаблон уведомления в буфер обмена. Вы можете использовать его на пользовательской вкладке." }, "templates": { @@ -2503,10 +2832,39 @@ } }, "use-columns": { + "columns": { + "label": { + "alert-rule-targeted": "", + "alerts-silenced": "", + "health": "Работоспособность", + "matching-labels": "Совпадающие метки", + "name": "Имя", + "schedule": "График", + "state": "Состояние", + "time-range": "Временной диапазон" + } + }, + "label": { + "actions": "Действия", + "created": "Создан", + "group": "Группа", + "labels": "Метки", + "next-evaluation": "Следующая оценка", + "state": "Состояние", + "summary": "Сводка" + }, "title-edit": "Редактировать", "title-recreate": "Повторно создать", "title-unsilence": "Отменить временное отключение" }, + "use-combined-labels": { + "grouped-options": { + "label": { + "from-alerts": "", + "from-system": "" + } + } + }, "use-create-dropdown-menu-actions": { "label-delete": "Удалить", "label-edit": "Редактировать", @@ -2540,6 +2898,17 @@ "title-edit-notification-policy": "Редактирование политики уведомления" } }, + "use-page-nav": { + "page-nav": { + "text": { + "details": "Подробности", + "history": "История", + "instances": "Экземпляры", + "query-and-conditions": "", + "versions": "Версии" + } + } + }, "use-state-history-modal": { "state-history-modal": { "title-state-history": "Журнал состояний" @@ -2560,6 +2929,36 @@ "body": "Содержимое YAML в редакторе содержит только конфигурацию правил оповещения. <1></1>Чтобы настроить Prometheus, необходимо предоставить остальную часть <4>содержимого файла конфигурации.</4>" } }, + "alertlist": { + "group-by": { + "aria-label-group-by-label-keys": "", + "placeholder-group-by": "Группировать по" + }, + "ungrouped-mode-view": { + "active-for": "", + "aria-label-view-alert-rule": "", + "view-alert-rule": "" + }, + "unified-alert-list": { + "clear": "Очистить", + "text-loading": "Загрузка…" + }, + "unified-alert-list-panel": { + "body-permission-required": "", + "title-permission-required": "" + } + }, + "annolist": { + "anno-list-panel": { + "aria-label-remove-filter": "", + "filter": "", + "loading": "Загрузка…", + "no-annotations-found": "" + }, + "annotation-list-item": { + "tooltip-created-by": "" + } + }, "annotations": { "annotation-field-mapper": { "annotation": "Аннотация", @@ -2656,6 +3055,11 @@ "configuration-required": "Требуется настройка", "refer-documentation-configure-authentication": "Подробнее о настройке аутентификации см. в документации" }, + "field-map": { + "label": { + "none": "Нет" + } + }, "fields": { "allow-assign-grafana-admin-description": "", "allow-assign-grafana-admin-label": "", @@ -2759,7 +3163,18 @@ "use-refresh-token-description": "", "use-refresh-token-label": "", "validate-hosted-domain-description": "", - "validate-hosted-domain-label": "" + "validate-hosted-domain-label": "", + "workload-identity-token-file-description": "", + "workload-identity-token-file-label": "", + "workload-identity-token-file-required": "" + }, + "get-page-nav": { + "subTitle": { + "configure-authentication-providers": "" + }, + "text": { + "authentication": "Аутентификация" + } }, "provider-card": { "text-badge-enabled": "Включено", @@ -2795,6 +3210,12 @@ "auth-config-auth-config-page-unconnected": { "subtitle": "Управление параметрами аутентификации и настройка единого входа Подробнее см. в нашей <2>документации</2>." }, + "barchart": { + "tick-spacing-editor": { + "content-require-space-from-the-right-side": "", + "label-rtl": "" + } + }, "bookmarks-page": { "empty": { "message": "Похоже, вы еще не создали ни одной закладки.", @@ -2933,11 +3354,199 @@ "text-this-repository-is-read-only": "Если у вас есть прямой доступ к целевому объекту, скопируйте JSON-файл и вставьте его туда." }, "canvas": { + "apieditor": { + "label-endpoint": "", + "label-header-parameters": "", + "label-method": "Метод", + "label-payload": "Полезные данные", + "label-query-parameters": "Параметры запроса", + "render-test-apibutton": { + "test-api": "", + "title-test-api": "" + } + }, + "button-item": { + "label": { + "center": "", + "left": "", + "right": "" + }, + "placeholder": { + "auto": "Авто" + } + }, + "button-style-editor": { + "label-variant": "Вариант" + }, + "canvas-context-menu": { + "close-editor": "", + "open-editor": "", + "render-menu-items": { + "add-item-menu-item": { + "label-add-item": "" + }, + "edit-element-menu-item": { + "label-edit": "Редактировать" + }, + "label-bring-to-front": "", + "label-delete": "Удалить", + "label-duplicate": "Дублировать", + "label-send-to-back": "", + "set-background-menu-item": { + "label-set-background": "" + } + } + }, + "cloud-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Авто" + } + }, + "ellipse-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Авто" + } + }, + "inline-edit": { + "canvas-inline-editor": "", + "tooltip-close-inline-editor": "" + }, + "inline-edit-body": { + "label-add-item": "", + "please-select-an-element": "" + }, + "line-style-editor": { + "label-animate": "" + }, + "metric-value-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Авто" + } + }, "not-found-display": { "not-found": "<0>Не найдено: </0><config />" }, + "pan-zoom-help": { + "ctrl-right-mouse": "", + "middle-mouse": "", + "pan-title": "", + "reset-double-click": "", + "title-pan-and-zoom-controls": "", + "zoom-scroll-wheel": "" + }, + "parallelogram-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Авто" + } + }, + "params-editor": { + "aria-label-add": "Добавить", + "aria-label-delete": "Удалить", + "placeholder-key": "Ключ", + "placeholder-value": "Значение" + }, + "placement-editor": { + "label-constraints": "", + "label-position": "", + "loading": "Загрузка…" + }, + "quick-positioning": { + "tooltip-align-bottom": "", + "tooltip-align-horizontal-centers": "", + "tooltip-align-left": "", + "tooltip-align-right": "", + "tooltip-align-top": "", + "tooltip-align-vertical-centers": "" + }, + "rectangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Авто" + } + }, "text-display": { "double-click-to-set": "Дважды нажмите, чтобы установить текст" + }, + "text-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Авто" + } + }, + "tree-navigation-editor": { + "clear-selection": "Очистить выбор", + "frame-selection": "", + "label-add-item": "", + "missing-layer": "", + "no-settings": "", + "switcher-icon": { + "title-node-icon": "" + } + }, + "tree-node-title": { + "title-duplicate": "Дублировать", + "title-remove": "Удалить", + "tooltip-duplicate": "Дублировать", + "tooltip-remove": "Удалить" + }, + "triangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Авто" + } } }, "carousel": { @@ -3017,6 +3626,22 @@ } }, "connections": { + "add-new-connection": { + "filter-by-options": { + "label": { + "all": "Все", + "installed": "Установлено", + "new-updates": "" + } + }, + "label": { + "by-downloads": "", + "by-name-az": "", + "by-name-za": "", + "by-published-date": "", + "by-updated-date": "" + } + }, "advisor-redirect-notice": { "aria-label-link-to-advisor": "Ссылка на Advisor", "body": "Попробуйте новый плагин Advisor, чтобы выявить потенциальные проблемы с вашими источниками данных и плагинами.", @@ -3033,6 +3658,22 @@ "body": "У источников данных появился новый дом. Можно находить новые источники данных или управлять существующими на странице «Подключения», доступной в главном меню.", "go-to-connections": "Перейти к подключениям" }, + "data-source-details-page": { + "subTitle": { + "datasource-could-found": "" + }, + "text": { + "unknown-datasource": "" + } + }, + "new-data-source-page": { + "subTitle": { + "choose-a-data-source-type": "" + }, + "text": { + "add-data-source": "Добавить источник данных" + } + }, "no-access-modal": { "connection-contact-grafana-admin": "Чтобы добавить новое подключение, обратитесь к администратору Grafana.", "editor-warning": "Редакторы не могут добавлять новые подключения. Настроен ли доступ, можно проверить в разделе <2>Источники данных</2>.", @@ -3045,6 +3686,18 @@ "search": { "aria-label-search-all": "Искать везде", "placeholder": "Искать везде" + }, + "use-data-source-settings-nav": { + "node": { + "subTitle": { + "data-source-error": "" + } + }, + "page-nav": { + "text": { + "data-source-nav-node": "" + } + } } }, "core": { @@ -3340,6 +3993,11 @@ "title-plugin-dashboard": "Дашборд плагинов" }, "dash-nav": { + "on-open-snapshot-original": { + "title": { + "proceed-to-external-site": "" + } + }, "render-left-actions": { "text-public": "Общедоступный", "tooltip-view-as-scene": "Просмотр в виде сцены" @@ -3351,11 +4009,26 @@ "dashboard-loading": { "cancel-loading-dashboard": "Отменить загрузку дашборда" }, + "dashboard-page-error": { + "text": { + "not-found": "Не найдено" + } + }, "dashboard-settings": { "actions": { "close": "Закрыть" } }, + "dashboard-slice": { + "title": { + "dashboard-init-failed": "" + } + }, + "dashboard-srv": { + "message": { + "edit-dashboard-json": "" + } + }, "dashboard-validation": { "body-dashboard-failed-schema-validation": "Проверка выполняется для целей разработки и может быть пропущена. Если вы разработчик Grafana, попробуйте проверить и обновить схему дашборда", "title-checking-dashboard-validity": "Проверка надежности дашборда", @@ -3451,6 +4124,13 @@ "values": "Значения, разделенные запятыми", "values-placeholder": "1, 10, mykey : myvalue, myvalue, escaped, value" }, + "datasource-options": { + "name-filter": "", + "name-filter-description": "", + "name-filter-placeholder": "", + "type": "Тип", + "type-placeholder": "" + }, "description": "Описание", "description-placeholder": "Поясняющий текст", "label": "Метка", @@ -3469,8 +4149,8 @@ "category": "Параметры выбора", "custom-all-value": "Пользовательское значение «все»", "custom-all-value-description": "Регулярное выражение с подстановочным знаком или другое значение для представления параметра «Все».", - "include-all": "Включить параметр «Все»", - "include-all-description": "Включает параметр для добавления всех значений", + "include-all": "", + "include-all-description": "", "multi-value": "Многозначное значение" }, "type-category": "Тип параметров: {{type}}" @@ -3496,14 +4176,97 @@ "errors": { "failed-to-load": "Не удалось загрузить дашборд" }, + "fetch-dashboard": { + "message": { + "failed-to-fetch-dashboard": "" + } + }, "gen-aihistory": { "aria-label-send-custom-feedback": "Отправить пользовательский отзыв", "footer-text": "Этот контент создан с помощью ИИ с использованием <2>плагина Grafana LLM</2>", "placeholder-tell-ai-what-to-do-next": "Сказать ИИ, что делать дальше..." }, + "general-settings-unconnected": { + "editable-options": { + "label": { + "editable": "Редактируемый", + "readonly": "" + } + } + }, + "get-debug-dashboard": { + "title": { + "annotations": "Аннотации" + } + }, + "get-errors": { + "message": { + "error-loading-data": "" + } + }, "get-field-override-categories": { "label-add-field-override": "Добавить переопределение полей", - "label-add-override-property": "Добавить свойство переопределения" + "label-add-override-property": "Добавить свойство переопределения", + "title": { + "add-button": "" + } + }, + "get-library-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "Информация", + "name": "Имя" + } + }, + "get-library-viz-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "Информация", + "name": "Имя" + } + }, + "get-panel-editor-tabs": { + "text": { + "alert": "", + "query": "Запрос", + "transform-data": "" + } + }, + "get-panel-frame-category": { + "descriptor": { + "title": { + "panel-options": "Параметры панели" + } + }, + "direction-options": { + "label": { + "horizontal": "По горизонтали", + "vertical": "По вертикали" + } + }, + "title": { + "description": "Описание", + "max-per-row": "Макс. на строку", + "panel-links": "Ссылки на панели", + "repeat-by-variable": "Повторение по переменной", + "repeat-direction": "Повторение направления", + "repeat-options": "Повторение параметров", + "title": "Заголовок", + "transparent-background": "Прозрачный фон" + } + }, + "get-panel-menu": { + "text": { + "extensions": "" + } }, "help-wizard": { "copy-to-clipboard": "Копировать в буфер обмена", @@ -3516,10 +4279,21 @@ "randomize-field-names-label-field-names": "Названия полей", "randomize-labels-label-labels": "Метки", "randomize-string-values-label-string-values": "Строковые значения", + "tabs": { + "label": { + "data": "Данные", + "snapshot": "Снимок" + } + }, "title-complete-git-hub-comment-clipboard": "Копирование полного комментария GitHub в буфер обмена", "title-get-help-with-this-panel": "Получение помощи с панелью", "troubleshooting-docs": "Документация по устранению неполадок" }, + "init-dashboard": { + "message": { + "failed-create-dashboard-model": "" + } + }, "inspect": { "data-tab": "Данные", "error-tab": "Ошибка", @@ -3572,6 +4346,16 @@ "rows": "Общее количество строк", "table-title": "Статистика" }, + "k8s-dashboard-api": { + "title": { + "deleted": "" + } + }, + "k8s-dashboard-v2api": { + "title": { + "deleted": "" + } + }, "layout": { "common": { "copy": "Копировать", @@ -3584,6 +4368,13 @@ "panel-layout-disabled": "Выбрать строку или вкладку для изменения макета панели" } }, + "legacy-dashboard-api": { + "fetch-error": { + "message": { + "dashboard-not-found": "" + } + } + }, "make-editable": { "dashboard-not-editable": "Нередактируемый дашборд", "make-editable": "Сделать доступным для редактирования" @@ -3603,6 +4394,20 @@ "menu-use-library-panel": "Использовать панель библиотеки" }, "new-panel-title": "Новая панель", + "on-create-new-row": { + "new-row": { + "title": { + "row-title": "" + } + } + }, + "on-create-new-widget-panel": { + "new-panel": { + "title": { + "widget-title": "" + } + } + }, "options": { "description": "Описание", "title-option": "Название" @@ -3664,6 +4469,30 @@ "paused": "Дашборд приостановлен администратором", "try-again-later": "Повторите попытку позже" }, + "remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, + "repeat-row-select": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, + "repeat-row-select2": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, "revert-dashboard-modal": { "body-restore-version": "Действительно восстановить дашборд до версии {{version}}? Все несохраненные изменения будут потеряны.", "title-restore-version": "Восстановление версии" @@ -3777,6 +4606,18 @@ "sub-menu-un-connected": { "aria-label-template-variables": "Переменные шаблона" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "tabs-layout": { "delete-tab-text": "Удаление этой вкладки также приведет к удалению всех панелей. Действительно продолжить?", "delete-tab-title": "Удалить вкладку?", @@ -3982,7 +4823,10 @@ }, "unthemed-dashboard-row": { "aria-label-delete-row": "Удалить строку", - "learn-more": "Подробнее" + "learn-more": "Подробнее", + "title": { + "delete-row": "Удалить строку" + } }, "validation": { "invalid-dashboard-id": "Не удалось найти действительный идентификатор Grafana.com", @@ -4017,6 +4861,16 @@ }, "visualization-select-pane": { "placeholder-search-for": "Поиск...", + "radio-options": { + "description": { + "reusable-panels-share-between-multiple-dashboards": "" + }, + "label": { + "library-panels": "Панели библиотеки", + "suggestions": "", + "visualizations": "" + } + }, "title-close": "Закрыть" }, "viz-panel": { @@ -4067,12 +4921,25 @@ "label-data-source": "Источник данных", "label-use-static-key-dimensions": "Использовать измерения статического ключа" }, + "add-to-dashboard": { + "message": { + "could-navigate-selected-dashboard-please-again": "", + "could-panel-dashboard-please-again": "" + } + }, "add-to-dashboard-form": { "cancel": "Отмена", "description-choose-where-to-add-the-panel": "Выберите место для добавления панели.", "description-select-which-dashboard-panel-created": "Выберите дашборд для создания панели.", + "label": { + "existing-dashboard": "Существующий дашборд", + "new-dashboard": "Новый дашборд" + }, "label-dashboard": "Дашборд", "label-target-dashboard": "Целевой дашборд", + "message": { + "this-field-is-required": "Поле является обязательным." + }, "open-dashboard": "Открыть дашборд", "open-in-new-tab": "Открыть в новой вкладке", "title-error-adding-the-panel": "Ошибка при добавлении панели" @@ -4110,6 +4977,25 @@ "it-cannot-contain-or": "Не может содержать «//» или «..».", "least-valid-character": "Должен содержаться хотя бы один допустимый символ." }, + "build-new-dashboard-save-model": { + "data": { + "title": { + "new-dashboard": "Новый дашборд" + } + } + }, + "build-new-dashboard-save-model-v2": { + "data": { + "title": { + "new-dashboard": "Новый дашборд" + } + } + }, + "config-public-dashboard": { + "title": { + "revoke-public-url": "Отозвать общедоступный URL-адрес" + } + }, "constant-variable-form": { "constant-options": "Параметры констант", "label-value": "Значение", @@ -4157,22 +5043,89 @@ "value-not-saved": "Значение еще не сохранено в базе данных Grafana", "view-pull-request-in-git-hub": "Просмотр запроса на включение изменений в GitHub" }, + "dashboard-scene": { + "text": { + "edit-panel": "", + "view-panel": "Просмотр панели" + }, + "title": { + "dashboard": "Дашборд", + "discard-changes-to-dashboard": "" + } + }, + "dashboard-scene-page-state-manager": { + "message": { + "dashboard-not-found": "" + } + }, + "dashboard-scene-page-state-manager-v2": { + "message": { + "dashboard-not-found": "" + } + }, "data-source-variable-form": { "data-source-options": "Параметры источника данных", "description-instance-name-filter": "Фильтр регулярных выражений для выбора экземпляров источников данных в списке значений переменных. Оставьте пустым для всех.", "example-instance-name-filter": "Пример: <codeExample />", "selection-options": "Параметры выбора" }, + "default-grid-layout-manager": { + "row": { + "title": { + "row-title": "" + } + } + }, "description-label": { "description": "Описание" }, + "edit-link-view": { + "edit-link-page-nav": { + "text": { + "edit-link": "Редактировать ссылку" + } + } + }, "email-list": { "aria-label-emailmenu": "Переключить меню электронной почты" }, + "embedded-dashboard-test-page": { + "subTitle": { + "showing-dashboard-panel-tests-pie-chart": "" + }, + "text": { + "embedding-dashboard": "" + } + }, "empty-transformations-message": { "add-transformation": "Добавить преобразование" }, + "get-edit-options": { + "title": { + "column-options": "", + "row-height-options": "" + } + }, + "get-panel-frame-options": { + "descriptor": { + "title": { + "panel-options": "Параметры панели" + } + }, + "title": { + "description": "Описание", + "panel-links": "Ссылки на панели", + "title": "Заголовок", + "transparent-background": "Прозрачный фон" + } + }, + "get-workflow-options": { + "label": { + "push-to-a-new-branch": "" + } + }, "group-by-variable-form": { + "alert-not-supported": "", "description-enables-users-custom-values": "Позволяет пользователям добавлять пользовательские значения в список.", "description-provide-dimensions-as-csv-dimension-name-dimension-id": "Укажите измерения в формате CSV: {{name}}, {{value}}.", "group-by-options": "Группировать по параметрам", @@ -4191,6 +5144,12 @@ "randomize-field-names-label-field-names": "Названия полей", "randomize-labels-label-labels": "Метки", "randomize-string-values-label-string-values": "Строковые значения", + "tabs": { + "label": { + "data": "Данные", + "snapshot": "Снимок" + } + }, "title-complete-git-hub-comment-clipboard": "Копирование полного комментария GitHub в буфер обмена", "title-get-help-with-this-panel": "Получение помощи с панелью", "troubleshooting-docs": "Документация по устранению неполадок", @@ -4235,6 +5194,14 @@ "body-name-already-exists": "Дашборд с таким названием уже существует в выбранной папке. Все равно сохранить дашборд?", "title-name-already-exists": "Название уже существует" }, + "on-remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, "panel-data-alerting-tab-rendered": { "alert": { "title-errors-loading-rules": "Ошибки при загрузке правил" @@ -4256,6 +5223,11 @@ "table-view-aria-label-toggletableview": "Переключить табличное представление", "table-view-label-table-view": "Табличное представление" }, + "panel-editor": { + "text": { + "edit-panel": "" + } + }, "panel-editor-renderer": { "aria-label-open-options-pane": "Открыть область параметров", "tooltip-open-options-pane": "Открыть область параметров" @@ -4264,8 +5236,22 @@ "body-panel-plugin-not-loaded": "Перед началом проверки убедитесь, что отображается панель, которую нужно проверить.", "title-panel-plugin-not-loaded": "Плагин панели не загружен" }, + "panel-menu-behavior": { + "async-func": { + "text": { + "extensions": "", + "metrics-drilldown": "" + } + } + }, "panel-viz-type-picker": { "placeholder-search-for": "Поиск...", + "radio-options": { + "label": { + "suggestions": "", + "visualizations": "" + } + }, "title-close": "Закрыть" }, "provisioned-delete-modal": { @@ -4292,6 +5278,15 @@ "query-options": "Параметры запросов", "selection-options": "Параметры выбора" }, + "resource-export": { + "label": { + "classic": "", + "json": "JSON", + "v1-resource": "", + "v2-resource": "", + "yaml": "" + } + }, "revert-dashboard-modal": { "body-restore-version": "Действительно восстановить дашборд до версии {{version}}? Все несохраненные изменения будут потеряны.", "title-restore-version": "Восстановление версии" @@ -4402,6 +5397,18 @@ "solo-panel-page": { "loading": "Загрузка" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "text-box-variable-form": { "placeholder-default-value-if-any": "(необязательно)", "text-options": "Параметры текста" @@ -4412,6 +5419,13 @@ "title-field-label": { "title": "Название" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "transformations-drawer": { "search-box-suffix": { "tooltip-clear-search": "Очистить поиск" @@ -4427,6 +5441,13 @@ "save-dashboard": "Сохранить дашборд", "title-unsaved-changes": "Несохраненные изменения" }, + "use-dashboard-edit-page-nav": { + "page-nav": { + "text": { + "settings": "Параметры" + } + } + }, "variable-check-indicator": { "aria-label-variable-referenced-dashboard": "На эту переменную не ссылается ни одна переменная или дашборд", "aria-label-variable-referenced-other-variables-dashboard": "На эту переменную ссылаются другие переменные или дашборд", @@ -4443,7 +5464,10 @@ "placeholder-descriptive-text": "Поясняющий текст", "placeholder-label-name": "Название метки", "placeholder-variable-name": "Название переменной", - "text-running-query": "Выполняется запрос..." + "text-running-query": "Выполняется запрос...", + "title": { + "delete-variable": "Удаление переменной" + } }, "variable-editor-list": { "definition": "Определение", @@ -4625,6 +5649,25 @@ "message": "Источники данных не найдены" } }, + "datagrid": { + "add-column": { + "placeholder-column-name": "" + }, + "datagrid-context-menu": { + "render-context-menu-items": { + "label-clear-column": "", + "label-clear-row": "", + "label-remove-all-data": "", + "label-search": "Поиск…" + }, + "render-header-menu-items": { + "label-clear-column": "", + "label-delete-column": "", + "label-rename-column": "", + "label-set-field-type": "" + } + } + }, "datasources": { "add-new-data-source-button": { "tooltip-no-permission": "У вас нет разрешения на настройку новых источников данных" @@ -4646,6 +5689,46 @@ "label-default": "По умолчанию", "label-name": "Имя" }, + "build-categories": { + "categories": { + "title": { + "cloud": "", + "distributed-tracing": "", + "enterprise-plugins": "Плагины Enterprise", + "industrial-io-t": "", + "logging-document-databases": "", + "others": "", + "profiling": "", + "sql": "", + "time-series-databases": "" + } + } + }, + "build-nav-model": { + "analytics": { + "text": { + "insights": "Аналитика" + } + }, + "caching": { + "text": { + "cache": "" + } + }, + "ds-permissions": { + "text": { + "permissions": "Разрешения" + } + }, + "nav-model": { + "text": { + "settings": "Параметры" + } + }, + "text": { + "dashboards": "Дашборды" + } + }, "button-row": { "delete": "Удалить", "save-and-test": "Сохранить и протестировать", @@ -4681,6 +5764,11 @@ "data-source-read-only-message": { "title-provisioned-data-source": "Подготовленный источник данных" }, + "data-source-settings-reducer": { + "message": { + "testing-could-couple-minutes": "" + } + }, "data-source-type-card": { "aria-label-learn-more": "Подробнее о {{dataSourcePluginName}}." }, @@ -4698,13 +5786,88 @@ "footer": { "add-csv-or-spreadsheet": "Добавить CSV-файл или электронную таблицу" }, + "get-enterprise-phantom-plugins": { + "description": { + "adobe-analytics-datasource": "", + "app-dynamics-integration-and-data-source": "", + "atlassian-statuspage-datasource": "", + "aurora-data-source": "", + "azure-cosmos-db-datasource": "", + "azure-devops-datasource": "", + "catchpoint-datasource": "", + "cloudflare-datasource": "", + "cockroach-db-datasource": "", + "data-dog-integration-and-data-source": "", + "drone-datasource": "", + "git-lab-integration-and-datasource": "", + "honeycomb-integration-and-datasource": "", + "jira-integration-and-datasource": "", + "logic-monitor-devices-datasource": "", + "mongo-db-integration-and-data-source": "", + "netlify-datasource": "", + "new-relic-integration-and-data-source": "", + "pager-duty-datasource": "", + "salesforce-integration-and-datasource": "", + "sap-hana-integration-and-data-source": "", + "service-now-integration-and-data-source": "", + "signal-fx-integration-and-datasource": "", + "snowflake-integration-and-data-source": "", + "sumo-logic-integration-and-datasource": "", + "visualize-and-explore-dynatrace-data": "", + "visualize-and-explore-oracle-sql": "", + "visualize-and-explore-splunk-logs": "", + "wavefront-integration-and-data-source": "", + "zendesk-datasource": "" + } + }, + "get-grafana-cloud-phantom-plugin": { + "description": { + "hosted-graphite-prometheus-and-loki": "" + } + }, "new-data-source-view": { "cancel": "Отмена", "placeholder-filter-by-name-or-type": "Фильтр по названию или типу" }, - "use-data-source-info": { - "badge-text-not-supported": "Не поддерживается", - "badge-text-supported": "Поддерживается" + "update-data-source": { + "error-info": { + "message": { + "an-unexpected-error-occurred": "" + } + } + }, + "use-data-source-info": { + "badge-text-not-supported": "Не поддерживается", + "badge-text-supported": "Поддерживается", + "label": { + "alerting": "Оповещение", + "type": "Тип" + } + }, + "use-delete-loaded-data-source": { + "title": { + "delete": "Удалить" + } + } + }, + "debug": { + "cursor-view": { + "no-events-yet": "" + }, + "render-info-viewer": { + "data-counter": "", + "elapsed-time": "", + "field": "Поле", + "last": "", + "render-counter": "", + "schema-counter": "", + "title-reset-counters": "", + "tooltip-step-back": "", + "type": "Тип" + }, + "state-view": { + "current-value": "", + "label-state-name": "" } }, "dimensions": { @@ -4773,6 +5936,19 @@ "remove-value-mapping-aria-label-delete-value-mapping": "Удалить сопоставление значений", "remove-value-mapping-tooltip-delete": "Удалить", "set-color": "Установить цвет", + "special-match-options": { + "description": { + "boolean-false-values": "", + "boolean-true-values": "", + "empty-string": "", + "matches-against-number-na-n-not-a-number": "", + "matches-null-and-undefined-values": "", + "matches-null-undefined-and-na-n": "" + }, + "label": { + "empty": "Пусто" + } + }, "tooltip-remove-color": "Удалить цвет", "tooltip-remove-icon": "Удалить значок" }, @@ -4788,6 +5964,20 @@ "display-text": "Показать текст", "icon": "Значок", "label-add-a-new-mapping": "Добавить новое сопоставление", + "mapping-types": { + "description": { + "match-a-numerical-range-of-values": "", + "match-a-regular-expression-with-replacement": "", + "match-a-specific-text-value": "", + "match-boolean-empty-values": "" + }, + "label": { + "range": "", + "regex": "", + "special": "", + "value": "Значение" + } + }, "update": "Обновить" } }, @@ -4812,6 +6002,7 @@ }, "explore": { "accordian-logs": { + "events": "", "footer": "Метки времени событий относятся к времени начала полной трассировки." }, "accordian-references": { @@ -4822,6 +6013,11 @@ "basic-extensions": { "aria-label-add": "Добавить" }, + "build-dashboard-panel-from-explore-state": { + "title": { + "new-panel": "" + } + }, "clear": "Очистить", "confirm-navigation-modal": { "cancel": "Отмена", @@ -4908,6 +6104,33 @@ "title-table": "Таблица", "title-traces": "Трассировки" }, + "explore-query-inspector": { + "data-tab": { + "label": { + "data": "Данные" + } + }, + "error-tab": { + "label": { + "error": "Ошибка" + } + }, + "json-tab": { + "label": { + "json": "JSON" + } + }, + "query-tab": { + "label": { + "query": "Запрос" + } + }, + "stats-tab": { + "label": { + "stats": "Статистика" + } + } + }, "explore-run-query-button": { "run-button": { "aria-label-run-query-options": "Параметры выполнения запроса" @@ -4921,10 +6144,23 @@ "description-explore-disabled": "Чтобы включить раздел Explore, включите его в конфигурации Grafana:", "title-explore-disabled": "Explore отключен" }, + "get-field-links-for-explore": { + "text": { + "data": "Данные", + "raw-value": "" + } + }, "get-matches-metadata": { "matches": "0 совпадений" }, "legacy-create-span-link-factory": { + "text": { + "tags": "Теги" + }, + "title": { + "related-logs": "", + "session-for-this-span": "Сеанс для этого диапазона" + }, "title-explore-metrics-for-this-span": "Просмотр метрик для этого интервала", "title-explore-split": "Просмотр журналов в комбинированном режиме", "title-session-for-this-span": "Сеанс для этого диапазона" @@ -4965,6 +6201,10 @@ }, "logs-meta-row": { "download": "Загрузить", + "label": { + "deduplication-count": "", + "showing-only-selected-fields": "" + }, "show-original-line": "Показать исходную строку" }, "logs-sample-panel": { @@ -5146,6 +6386,21 @@ "run-query-button": "Выполнить запрос", "switch-datasource-button": "Переключить источник данных и выполнить запрос" }, + "scoped-vars-from-span": { + "text": { + "span": "" + } + }, + "scoped-vars-from-tags": { + "text": { + "tags": "Теги" + } + }, + "scoped-vars-from-trace": { + "text": { + "trace": "Трассировка" + } + }, "search-bar-input": { "placeholder-find": "Найти...", "suffix": { @@ -5180,9 +6435,25 @@ "tooltip-tag-key": "Ключ тега, который будет использоваться для получения значения тега. Поиск атрибутов и ресурсов диапазона будет производиться по ключу тега" }, "span-detail": { + "label": { + "kind": "", + "library-name": "", + "library-version": "", + "status": "Состояние:", + "status-message": "", + "trace-state": "" + }, "label-resource-attributes": "Атрибуты ресурса", "label-span-attributes": "Атрибуты диапазона", "label-stack-trace": "Трассировка стека", + "overview-items": { + "label": { + "child-count": "", + "duration": "", + "service": "", + "start-time": "" + } + }, "warnings": "Предупреждения" }, "span-filters": { @@ -5289,6 +6560,18 @@ "title-node-graph": "Граф узлов" }, "unthemed-logs": { + "description": { + "show-results-in-logs-visualisation": "", + "show-results-in-table-visualisation": "", + "show-results-newest-to-oldest": "", + "show-results-oldest-to-newest": "" + }, + "label": { + "logs": "Журналы", + "newest-first": "Сначала новые", + "oldest-first": "Сначала старые", + "table": "Таблица" + }, "label-deduplication": "Дедупликация", "label-display-results": "Показать результаты", "label-prettify-json": "Форматировать JSON", @@ -5304,6 +6587,15 @@ }, "unthemed-virtualized-trace-view": { "title-scroll-to-top": "Прокрутка вверх" + }, + "use-focus-span-link": { + "create-focus-span-link": { + "link": { + "title": { + "deep-link-to-this-span": "" + } + } + } } }, "export": { @@ -5389,6 +6681,15 @@ "folder-repo": { "badge-text": "Подготовлено" }, + "folders": { + "get-loading-nav": { + "main": { + "title": { + "loading": "Загрузка" + } + } + } + }, "forgot-password": { "back-button": "Назад на страницу входа", "change-password": { @@ -5418,10 +6719,102 @@ "incomplete-request-error": "К сожалению, не удалось выполнить запрос. Повторите попытку.", "send-custom-feedback": "Отправить" }, + "geomap": { + "coordinates-map-view-editor": { + "label-latitude": "", + "label-longitude": "" + }, + "debug-overlay": { + "center": "", + "zoom": "" + }, + "fit-map-view-editor": { + "all-layers-editor-fragment": { + "label-layer": "" + }, + "label-data": "Данные", + "last-only-editor-fragment": { + "label-padding": "", + "tooltip-padding-relative-percent-beyond-extent": "" + } + }, + "frame-multi-selection-editor": { + "placeholder-change-filter": "" + }, + "frame-selection-editor": { + "placeholder-change-filter": "" + }, + "geomap-panel": { + "aria-label-map": "" + }, + "geomap-style-rules-editor": { + "aria-label-add-geomap-style-rule": "" + }, + "layers-editor": { + "label-add-layer": "", + "no-layers": "" + }, + "map-view-editor": { + "label-max-zoom": "", + "label-view": "Просмотр", + "label-zoom": "Масштаб", + "use-current-map-settings": "" + }, + "markers-legend": { + "title-symbol": "Символ" + }, + "measure-overlay": { + "tooltip-show-measure-tools": "" + }, + "plugin": { + "basemap-layer-configured-server-admin": "" + }, + "style-editor": { + "label-align": "", + "label-baseline": "", + "label-color": "Цвет", + "label-fill-opacity": "", + "label-font-size": "", + "label-opacity": "", + "label-rotation-angle": "", + "label-size": "", + "label-symbol": "Символ", + "label-symbol-horizontal-align": "", + "label-symbol-vertical-align": "", + "label-text-label": "", + "label-x-offset": "", + "label-y-offset": "" + }, + "style-rule-editor": { + "aria-label-comparison-operator": "Оператор сравнения", + "aria-label-comparison-value": "", + "aria-label-delete-style-rule": "", + "aria-label-feature-property": "", + "label-rule": "Правило", + "placeholder-feature-property": "", + "placeholder-numeric-value": "", + "placeholder-value": "значение" + } + }, "get-enterprise": { "requires-license": "Требуется лицензия Grafana Enterprise", "title": "Enterprise" }, + "gettingstarted": { + "docs-card": { + "complete": "завершить", + "learn-how": "" + }, + "getting-started": { + "aria-label-to-advanced-tutorials": "", + "aria-label-to-basic-tutorials": "", + "checking-completed-setup-steps": "", + "remove-this-panel": "" + }, + "tutorial-card": { + "complete": "завершить" + } + }, "gops": { "config-card": { "text-loading-configuration": "Загрузка конфигурации...." @@ -5438,6 +6831,74 @@ }, "progress-status": { "your-progress": "Ваш прогресс" + }, + "use-get-configuration-for-ui": { + "get-connect-data-source-configuration": { + "title": { + "connect-data-source": "" + } + }, + "title": { + "essentials": "Основы" + } + }, + "use-get-essentials-configuration": { + "essential-content": { + "description": { + "configure-grafana-alerting": "", + "create-integration-alerting-contact-point": "", + "initialize-incident-plugin-declare-manage-incidents": "", + "practice-solving-an-incident": "", + "receive-alerts-oncall-notifications-within-environment": "", + "select-chat-ops-channels-to-route-notifications": "" + }, + "label": { + "add": "Добавить", + "connect": "Подключить", + "initialize": "", + "select-integration": "", + "start-drill": "" + }, + "title": { + "add-slack-notifications-to-irm-integrations": "", + "connect-alerting-to-irm": "", + "connect-irm-to-your-slack-workspace": "", + "connect-your-messaging-workspace-to-incident": "", + "connect-your-messaging-workspace-to-on-call": "", + "create-incident-drill": "", + "detect": "Обнаружение", + "initialize-incident-plugin": "", + "messaging-workspace-channel-on-call-integration": "", + "respond": "", + "test-your-configuration": "" + } + }, + "get-grafana-alerting-config-steps": { + "description": { + "create-alert-monitor-system": "", + "create-on-call-integration-alerting-contact-point": "", + "create-slos-to-monitor-your-service": "" + }, + "label": { + "connect": "Подключить", + "create": "Создание", + "enable": "Включить" + }, + "steps": { + "label": { + "edit": "Редактировать" + }, + "title": { + "update-default-contact-point": "" + } + }, + "title": { + "connect-alerting-to-on-call": "", + "create-alert-rule": "", + "create-slo": "", + "enable-slo-alerting": "" + } + } } }, "grafana": { @@ -5804,14 +7265,18 @@ "duplicate-panel": "Дублировать панель", "exit-edit/setting-views": "Выйти из представления редактирования/параметров", "expand-all-rows": "Развернуть все строки", + "explore-panel": "", "go-to-dashboards": "Перейти к дашбордам", "go-to-explore": "Перейти к Explore", "go-to-home-dashboard": "Перейти на главный дашборд", "go-to-profile": "Перейти к профилю", + "inspect-panel": "", "make-time-range-permanent": "Сделать временной диапазон абсолютным/постоянным", "move-time-range-back": "Переместить временной диапазон назад", "move-time-range-forward": "Переместить временной диапазон вперед", "open-search": "Открыть поиск", + "open-share-embed-drawer": "", + "open-share-link-drawer": "", "open-shared-modal": "Поделиться снимком панели", "paste-time-range": "Вставить временной диапазон", "refresh-all-panels": "Обновить все панели", @@ -5837,6 +7302,11 @@ "support-bundle": "Вы также можете получить пакет поддержки, содержащий информацию о вашем экземпляре Grafana и настроенных источниках данных в <1>разделе о пакетах поддержки</1>.", "troubleshooting-help": "Чтобы запросить помощь в устранении неполадок, отправьте снимок этой панели в службу технической поддержки Grafana Labs. Снимок содержит данные ответа на запрос и параметры панели." }, + "histogram": { + "histogram-panel": { + "no-histogram-found-in-response": "" + } + }, "inspector": { "inspect-data-tab": { "loading": "Загрузка", @@ -5890,6 +7360,9 @@ "label-name": "Имя", "label-password": "Пароль", "label-username": "Имя пользователя", + "message": { + "email-is-invalid": "" + }, "placeholder-name-optional": "Имя (необязательно)", "placeholder-password": "Пароль", "placeholder-username": "Имя пользователя", @@ -6155,8 +7628,26 @@ "discard-local-changes": "Отменить локальные изменения", "title-dashboard-changed": "Дашборд изменен" }, + "live-channel-editor": { + "description-grafana-live": "", + "namespace": "Пространство имен", + "path": "Путь", + "placeholder-select-watchable-resource": "", + "scope": "", + "title-grafana-live": "" + }, "live-connection-warning": { "title-connection-to-server-is-lost": "Соединение с сервером прервано..." + }, + "live-panel": { + "error": "Ошибка", + "grafana-requires-feature": "", + "panel-editor-channel": "", + "title-grafana-live": "", + "waiting-for-data": "" + }, + "live-publish": { + "publish": "" } }, "lock-icon": "значок замка", @@ -6203,6 +7694,13 @@ } }, "logs": { + "get-dataframe-fields": { + "vars": { + "text": { + "labels": "Метки" + } + } + }, "infinite-scroll": { "end-of-range": "Конец выбранного временного диапазона.", "load-more": "Прокрутить, чтобы загрузить больше", @@ -6283,6 +7781,11 @@ "shortcut": "alt+выделение, чтобы снова включить" } }, + "log-series-to-logs-model": { + "label": { + "total-bytes-processed": "" + } + }, "logs-controls": { "deduplication": "Дедупликация", "disable-highlighting": "Отключить выделение", @@ -6317,6 +7820,11 @@ "scroll-top": "Прокрутить вверх", "start-of-range": "Начало диапазона" }, + "logs-panel": { + "render-common-labels": { + "common-labels": "" + } + }, "out-of-range-message": { "end-of-the-selected-time-range": "Конец выбранного временного диапазона." }, @@ -6373,6 +7881,14 @@ }, "snapshot-list-table": { "title-delete": "Удалить" + }, + "unthemed-dashboard-import": { + "subTitle": { + "import-dashboard-from-file-or-grafanacom": "" + }, + "text": { + "import-dashboard": "Импорт дашборда" + } } }, "migrate-to-cloud": { @@ -7030,8 +8546,63 @@ "close": "Закрыть выдвижную панель" }, "link-title": "Перейти в блог Grafana Labs", + "news-panel": { + "body-error-loading-rss-feed": "", + "loading": "Загрузка…", + "title-error-loading-rss-feed": "" + }, "title": "Последние записи в блоге" }, + "nodeGraph": { + "arc-options-editor": { + "add-arc": "", + "title-remove-arc": "" + }, + "edge": { + "aria-label-from-to": "" + }, + "edge-header": { + "label-source-target": "" + }, + "marker": { + "100-node-count": "", + "aria-label-hidden-marker": "", + "node-count_one": "", + "node-count_few": "", + "node-count_many": "", + "node-count_other": "" + }, + "node": { + "aria-label-node-title": "" + }, + "node-graph": { + "aria-label-layered-layout-performance-warning": "", + "aria-label-nodes-hidden-warning": "", + "computing-layout": "", + "no-data": "Нет данных", + "hidden-nodes_one": "", + "hidden-nodes_few": "", + "hidden-nodes_many": "", + "hidden-nodes_other": "", + "processed-nodes_one": "", + "processed-nodes_few": "", + "processed-nodes_many": "", + "processed-nodes_other": "" + }, + "node-graph-panel": { + "no-data-found-in-response": "" + }, + "node-header": { + "label-subtitle": "", + "label-title": "Заголовок" + }, + "view-controls": { + "hide-config": "", + "show-config": "", + "title-zoom-in": "", + "title-zoom-out": "" + } + }, "notifications": { "empty-state": { "description": "Полученные вами уведомления будут отображаться здесь.", @@ -7073,6 +8644,11 @@ "label-organization-name": "Название организации", "placeholder-org-name": "Название организации" }, + "org-details-page": { + "title": { + "confirm-preferences-update": "" + } + }, "org-profile": { "label-organization-name": "Название организации", "label-organization-profile": "Профиль организации", @@ -7092,7 +8668,10 @@ "tooltip": "Теперь вы можете выбрать параметр «Нет основных ролей» и добавить разрешения в соответствии со своими потребностями. Дополнительную информацию можно найти в <1>нашей документации</1>." }, "user-invite-page": { - "sub-title": "Отправьте приглашение или добавьте существующего пользователя Grafana в организацию <1>{{orgName}}</1>" + "sub-title": "Отправьте приглашение или добавьте существующего пользователя Grafana в организацию <1>{{orgName}}</1>", + "text": { + "invite-user": "" + } } }, "org-picker": { @@ -7104,6 +8683,38 @@ } }, "panel": { + "get-calculation-value-data-links-variable-suggestions": { + "value-calc-var": { + "label": { + "calculation-name": "" + } + } + }, + "get-data-links-variable-suggestions": { + "value-time-var": { + "label": { + "time": "Время" + } + } + }, + "get-field-links-supplier": { + "text": { + "data": "Данные", + "field": "Поле", + "series": "", + "value": "Значение" + } + }, + "get-field-vars": { + "label": { + "name": "Имя" + } + }, + "get-panel-links-variable-suggestions": { + "label": { + "all-variables": "" + } + }, "header-menu": { "copy": "Копировать", "create-library-panel": "Создать панель библиотеки", @@ -7164,6 +8775,13 @@ "select-placeholder": "Фильтр по типу" }, "playlist": { + "playlist-new-page": { + "page-nav": { + "text": { + "new-playlist": "Новый плейлист" + } + } + }, "playlist-table-rows": { "aria-label-playlist-item": "Элемент плейлиста, {{itemType}}, {{itemValue}}", "multiple-dashboards-found": "Найдено несколько элементов: {{items}}", @@ -7180,6 +8798,12 @@ "label-mode": "Режим", "label-time-and-refresh": "Время и обновление", "label-variables": "Переменные", + "modes": { + "label": { + "kiosk": "Киоск", + "normal": "Нормальное" + } + }, "title-start-playlist": "Запустить плейлист" } }, @@ -7246,6 +8870,19 @@ }, "browse": { "aria-label-plugin-type-filter": "Фильтр типа плагина", + "filter-by-options": { + "label": { + "all": "Все", + "installed": "Установлено", + "new-updates": "" + } + }, + "label": { + "all": "Все", + "applications": "", + "data-sources": "Источники данных", + "panels": "Панели" + }, "label-search": "Поиск", "label-state": "Состояние", "label-type": "Тип", @@ -7327,12 +8964,24 @@ "empty-state": { "message": "Плагины не найдены" }, + "extensions-log-data-source": { + "message": { + "ok": "OK" + } + }, "filter": { "disabled": "Этот фильтр отключен, поскольку сервер Grafana не может получить доступ к grafana.com", "sort": "Сортировать", "sort-list": "Сортировать список плагинов", "state": "Состояние" }, + "get-feature-state-info": { + "text": { + "alpha": "", + "beta": "Бета", + "deprecated": "Устаревший" + } + }, "get-started-with-app": { "disable": "Отключить", "enable": "Включить" @@ -7389,6 +9038,16 @@ "plugin-details-header-dependencies": { "grafana-dependency": "{{grafanaDependency}} Grafana" }, + "plugin-details-page": { + "not-found-model": { + "subTitle": { + "requested-belong-plugin": "" + }, + "text": { + "unknown-plugin": "" + } + } + }, "plugin-details-signature": { "body-invalid-plugin-signature": "Grafana Labs проверяет каждый плагин на наличие действительной цифровой подписи. Проверка подписи плагина проводится в рамках наших мер защиты, которые обеспечивают безопасность и надежность плагинов. Grafana Labs не гарантирует исправность этого неподписанного плагина. Попросите автора плагина подать запрос на его подписание.", "read-more-about-plugins-signing": "Подробнее о подписании плагинов.", @@ -7434,6 +9093,13 @@ "search-field": { "placeholder-search-grafana-plugins": "Поиск плагинов Grafana" }, + "use-plugin-details-tabs": { + "nav-model-children": { + "text": { + "dashboards": "Дашборды" + } + } + }, "version-install-button": { "text-installed": "Установлено" }, @@ -7553,6 +9219,11 @@ "label-git-hub-features": "Возможности GitHub", "label-realtime-feedback": "Отзывы в реальном времени" }, + "connect-page": { + "subTitle": { + "connect-external-storage-manage-resources": "" + } + }, "connect-repository-button": { "configure": "Настроить", "configure-file": "Настроить подготовку файлов", @@ -7586,7 +9257,13 @@ }, "edit-repository-page": { "back-to-repositories": "Назад к репозиториям", - "repository-config-exists-configuration": "Убедитесь, что конфигурация репозитория существует в файле конфигурации." + "repository-config-exists-configuration": "Убедитесь, что конфигурация репозитория существует в файле конфигурации.", + "subTitle": { + "configure-repository-storing-resources": "" + }, + "text": { + "configure-repository": "" + } }, "empty-state": { "no-jobs": "Нет заданий..." @@ -7649,6 +9326,11 @@ "no-results-matching-your-query": "По вашему запросу ничего не найдено", "placeholder-search": "Поиск" }, + "get-default-values": { + "title": { + "repository": "Репозиторий" + } + }, "getting-started": { "alert-temporary-outage": "Если подключается весь экземпляр, дашборды будут недоступны во время выполнения переноса. Рекомендуем предупредить пользователей перед запуском процесса.", "modal-description-public-access": "Настройте общий доступ к своему экземпляру Grafana, чтобы включить интеграцию с GitHub.", @@ -7793,7 +9475,18 @@ "dashboard-preview": "Просмотр дашборда", "existing-dashboard": "Существующий дашборд", "history": "История", + "message": { + "removed-from-repo-test-ui": "", + "updated-from-repo-test-ui": "" + }, "repository": "Репозиторий", + "tab-info": { + "label": { + "dry-run-result-after-apply": "", + "existing-from-grafana": "", + "file-from-repository": "" + } + }, "title-error-saving-file": "Ошибка при сохранении файла" }, "setup-modal": { @@ -8214,14 +9907,6 @@ "reload-button": "Перезагрузить", "title": "Не удалось найти файл приложения" }, - "sandbox": { - "test-stuff-page": { - "application-notifications-toasts-testing": "Тестирование уведомлений (всплывающих уведомлений) приложений", - "error": "Ошибка", - "success": "Выполнено", - "warning": "Предупреждение" - } - }, "save-dashboards": { "message-length": { "info": "Количество символов в сообщении: {{messageLength}}. Это значение превышает максимальную длину в 500 символов. Сократите сообщение, прежде чем сохранить.", @@ -8281,6 +9966,14 @@ "view-as-folders": "Просмотр по папкам", "view-as-list": "Просмотр в виде списка" }, + "bluge-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } + }, "dashboard-actions": { "import": "Импорт", "new": "Новые элементы", @@ -8308,6 +10001,14 @@ "search-results-table": { "aria-label-search-results-table": "Таблица результатов поиска", "no-data": "Нет значений" + }, + "unified-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } } }, "select": { @@ -8379,6 +10080,11 @@ "delete-service-account": "Удалить служебную учетную запись", "disable-service-account": "Отключить служебную учетную запись", "enable-service-account": "Включить служебную учетную запись", + "page-nav": { + "subTitle": { + "manage-settings-individual-service-account": "" + } + }, "title-delete-service-account": "Удалить служебную учетную запись", "title-disable-service-account": "Отключение служебной учетной записи", "tokens": "Токены", @@ -8695,6 +10401,14 @@ "sort-picker": { "select-aria-label": "Сортировать" }, + "status-history": { + "status-history-panel": { + "too-many-points_one": "", + "too-many-points_few": "", + "too-many-points_many": "", + "too-many-points_other": "" + } + }, "support-bundles": { "new-bundle-button": { "new-support-bundle": "Новый пакет поддержки" @@ -8702,7 +10416,10 @@ "support-bundles-create-unconnected": { "cancel": "Отмена", "create": "Создание", - "sub-title": "Выбор компонентов для пакета поддержки Пакет поддержки будет доступен в течение 3 дней после создания" + "sub-title": "Выбор компонентов для пакета поддержки Пакет поддержки будет доступен в течение 3 дней после создания", + "text": { + "create-support-bundle": "" + } }, "support-bundles-unconnected": { "created-on": "Дата создания", @@ -8717,10 +10434,35 @@ "login": "Вход" }, "table": { + "auto-cell-options-editor": { + "description-wrap-text": "", + "label-wrap-text": "" + }, + "bar-gauge-cell-options-editor": { + "label-gauge-display-mode": "", + "label-value-display": "" + }, + "color-background-cell-options-editor": { + "description-apply-to-entire-row": "", + "description-wrap-text": "", + "label": { + "text-alpha": "" + }, + "label-apply-to-entire-row": "", + "label-background-display-mode": "", + "label-wrap-text": "", + "wrap-text": "" + }, "container": { "content": "Отображение слишком большого количества столбцов в одной таблице может повлиять на производительность и затруднить чтение данных. Попробуйте уточнить запросы.", "show-all-series": "Показать все столбцы", "show-only-series": "Максимальное количество отображаемых столбцов: {{MAX_NUMBER_OF_COLUMNS}}" + }, + "image-cell-options-editor": { + "description-alt-text": "", + "description-title-text": "", + "label-alt-text": "", + "label-title-text": "" } }, "tag-filter": { @@ -8736,6 +10478,24 @@ "select-placeholder": "Выбрать команду" }, "teams": { + "build-nav-model": { + "nav-model": { + "subTitle": { + "manage-members-and-settings": "" + }, + "text": { + "settings": "Параметры" + } + }, + "team-group-sync": { + "text": { + "external-group-sync": "Синхронизация внешней группы" + } + }, + "text": { + "members": "Участники" + } + }, "create-team": { "create": "Создать", "description-email": "Это необязательное действие, которое используется в основном для создания пользовательских аватаров команд.", @@ -8757,6 +10517,9 @@ "external-group-sync": "Синхронизация внешней группы", "label-add-external-group": "Добавить внешнюю группу", "team-sync-upgrade": "Добавьте группу, чтобы включить бесплатную синхронизацию команд во время пробного использования Grafana Pro", + "text": { + "add-group": "Добавить группу" + }, "title-there-external-groups": "Нет внешних групп для синхронизации", "tooltip-add-external-group": "Пример группы LDAP: {{example}}" }, @@ -8858,6 +10621,42 @@ "select-search-input": "Введите объект для поиска (страну, город, аббревиатуру)" } }, + "timeseries": { + "annotation-editor2": { + "add-annotation": "Добавить аннотацию", + "cancel": "Отмена", + "edit-annotation": "", + "label-description": "Описание", + "label-tags": "Теги", + "placeholder-add-tags": "", + "save": "Сохранить", + "saving": "Сохранение" + }, + "annotation-tooltip2": { + "tooltip-delete": "Удалить", + "tooltip-edit": "Редактировать" + }, + "line-style-editor": { + "title-the-input-expects-a-segment-list": "", + "tooltip-help": "Справка" + }, + "nulls-threshold-input": { + "placeholder-never": "Бессрочно" + }, + "outside-range-plugin": { + "data-outside-time-range": "", + "zoom-to-data": "" + }, + "timezones-editor": { + "tooltip-add-timezone": "", + "tooltip-remove-timezone": "" + } + }, + "traces": { + "traces-panel": { + "no-data-found-in-response": "" + } + }, "transformations": { "empty": { "add-transformation-body": "Преобразования позволяют изменять данные разными способами перед отображением визуализации.<1></1>Сюда входит объединение данных, переименование полей, выполнение расчетов, форматирование данных для отображения и многое другое.", @@ -8894,6 +10693,10 @@ "convert-field-type-transformer-editor": { "aria-label-add-a-convert-field-type-transformer": "Добавить преобразователь типа поля", "aria-label-remove-convert-field-type-transformer": "Удалить преобразователь типа поля", + "label": { + "browser": "Браузер", + "utc": "" + }, "label-as": "как", "label-date-format": "Формат даты", "label-field": "Поле", @@ -8980,11 +10783,32 @@ "tooltip-format": "Формат вывода для поля, указанного в виде <2>строки в формате Moment.js</2>.", "tooltip-timezone-manually": "Установите часовой пояс вручную" }, + "get-timezone-options": { + "label": { + "browser": "Браузер", + "utc": "" + } + }, "get-tooltips": { "description": "Допустимый путь объекта JSON.", "json-value": "Значение JSON:", + "map-valid-paths": { + "description": { + "extract-fields-from-object": "", + "extract-value": "", + "extract-value-first-element": "", + "extract-value-second-element": "" + } + }, "valid-paths": "Допустимые пути:" }, + "get-transformer-option-pane": { + "root": { + "title": { + "root": "" + } + } + }, "group-by-field-configuration": { "placeholder-ignored": "Пропущено", "placeholder-select-stats": "Выбрать статистику" @@ -9001,7 +10825,23 @@ "label-cell-value": "Значение ячейки", "label-column": "Столбец", "label-empty-value": "Пустое значение", - "label-row": "Строка" + "label-row": "Строка", + "special-value-options": { + "description": { + "boolean-false-value": "", + "boolean-true-value": "", + "empty-string": "", + "null-value": "", + "number-value": "" + }, + "label": { + "empty": "Пусто", + "false": "", + "null": "", + "true": "", + "zero": "" + } + } }, "histogram-transformer-editor": { "placeholder-auto": "Авто", @@ -9064,10 +10904,22 @@ "tooltip-naming": "Устанавливает способ отображения названий выбранных полей. Поскольку название фрейма обычно лучше подходит для табличных данных" }, "partition-by-values-editor": { + "keep-fields-options": { + "label": { + "no": "Нет", + "yes": "Да" + } + }, "label-field": "Поле", "label-keep-fields": "Сохранить поля", "label-naming": "Именование", "label-select-field": "Выбрать поле", + "naming-modes-options": { + "label": { + "as-frame-name": "", + "as-label": "" + } + }, "partition-values-works-single-frame": "Разделение по значениям работает только с одиночным фреймом.", "tooltip-keeps-partition-fields-frames": "Сохраняет поля разделов в фреймах" }, @@ -9089,6 +10941,16 @@ "label-include-time": "Включить время", "label-labels-to-fields": "Метки к полям", "label-mode": "Режим", + "modes": { + "description": { + "collapse-field-single-value": "", + "create-table-series-value": "" + }, + "label": { + "reduce-fields": "", + "series-to-rows": "" + } + }, "placeholder-choose-stat": "Выбрать статистику" }, "regex-matcher-editor": { @@ -9096,11 +10958,23 @@ "variable-regex-documentation": "" }, "regression-transformer-editor": { + "label": { + "cubic": "", + "quadratic": "", + "quartic": "", + "quintic": "" + }, "label-degree": "Степень", "label-model-type": "Тип модели", "label-predicted-points": "Прогнозируемые точки", "label-x-field": "Поле X", "label-y-field": "Поле Y", + "model-type-options": { + "label": { + "linear": "", + "polynomial": "" + } + }, "tooltip-number-of-xy-points-to-predict": "Количество точек X, Y для прогнозирования" }, "rename-by-regex-transformer-editor": { @@ -9118,6 +10992,23 @@ "label-reverse": "Изменить на обратное", "placeholder-select-field": "Выбрать поле" }, + "supplier": { + "description": { + "apply-spatial-operations-to-the-geometry": "", + "create-a-line-between-two-points": "", + "geometry-define-field-headingdistancearea": "" + }, + "label": { + "area": "", + "as-line": "", + "calculate-value": "", + "distance": "", + "heading": "", + "line-builder": "", + "prepare-spatial-field": "", + "transform": "" + } + }, "time-series-table-transform-editor": { "label-stat": "Статистика", "label-time-field": "Поле времени", @@ -9151,7 +11042,19 @@ "placeholder-auto": "Авто", "placeholder-field": "Поле", "tooltip-window-size": "Размер окна", - "tooltip-window-size-percent": "Установите размер окна в процентах от общего количества данных" + "tooltip-window-size-percent": "Установите размер окна в процентах от общего количества данных", + "type-options": { + "label": { + "centered": "", + "trailing": "" + } + }, + "window-size-mode-options": { + "label": { + "fixed": "", + "percentage": "" + } + } } }, "upgrade-box": { @@ -9208,6 +11111,11 @@ }, "users-action-bar-unconnected": { "invite": "Пригласить", + "options": { + "label": { + "users": "Пользователи" + } + }, "placeholder-search-login-email": "Поиск пользователя по логину, адресу электронной почты или имени" } }, @@ -9251,6 +11159,32 @@ "confirm-delete-modal": { "title-delete-variable": "Удаление переменной" }, + "create-ad-hoc-variable-adapter": { + "description": { + "add-keyvalue-filters-on-the-fly": "" + } + }, + "create-custom-variable-adapter": { + "description": { + "define-variable-values-manually": "" + } + }, + "create-interval-variable-adapter": { + "description": { + "define-timespan-interval": "" + } + }, + "create-query-variable-adapter": { + "description": { + "variable-values-fetched-datasource-query": "" + } + }, + "data-source-variable-slice": { + "text": { + "default": "", + "no-data-sources-found": "Источники данных не найдены" + } + }, "empty-state": { "button-title": "Добавление переменной", "info-box-content": "Переменные делают дашборды более интерактивными и динамичными. Вместо того чтобы жестко кодировать, например, имена серверов или датчиков в ваших запросах метрик, вы можете использовать переменные. Переменные отображаются в виде списков в верхней части дашборда. Эти раскрывающиеся списки позволяют легко изменять данные, отображаемые на дашборде.", @@ -9277,6 +11211,13 @@ "placeholder-default-value-if-any": "значение по умолчанию, если имеется", "text-options": "Параметры текста" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "unknown-table": { "loading": "Загрузка…", "no-unknowns": "Переименованных или отсутствующих переменных не найдено.", @@ -9333,5 +11274,25 @@ "data-hover-view": { "link": "Ссылка" } + }, + "welcome": { + "welcome-banner": { + "need-help": "Нужна помощь?", + "welcome-to-grafana": "" + } + }, + "xychart": { + "series-editor": { + "add-series": "", + "aria-label-select-series": "", + "label-color-field": "", + "label-frame": "Фрейм", + "label-size-field": "", + "label-x-field": "Поле X", + "label-y-field": "Поле Y", + "placeholder-all-frames": "", + "placeholder-select-frame": "", + "tooltip-delete-series": "" + } } } \ No newline at end of file diff --git a/public/locales/sv-SE/grafana.json b/public/locales/sv-SE/grafana.json index 50619343eb7..86921cd1055 100644 --- a/public/locales/sv-SE/grafana.json +++ b/public/locales/sv-SE/grafana.json @@ -72,6 +72,11 @@ }, "admin-edit-org-page": { "label-name": "Namn", + "page-nav": { + "subTitle": { + "manage-settings-roles-organization": "" + } + }, "render-missing-permission-message": { "title-access-denied": "Åtkomst nekad" } @@ -233,6 +238,13 @@ "upgrade-info": { "title": "Företagslicens" }, + "user-admin-page": { + "page-nav": { + "subTitle": { + "manage-settings-for-an-individual-user": "" + } + } + }, "user-create-page": { "label-email": "E-post", "label-name": "Namn", @@ -243,9 +255,16 @@ "label-ldap": "LDAP" }, "user-list-admin-page-un-connected": { + "label": { + "active-last-days": "", + "all-users": "Alla användare" + }, "placeholder-search-login-email": "Sök användare efter inloggning, e-postadress eller namn." }, "user-list-anonymous-devices-page-un-connected": { + "label": { + "active-last-days": "" + }, "placeholder-search-devices-by-ip-address": "Sök efter enheter via IP-adress." }, "user-list-page": { @@ -364,6 +383,12 @@ "no-grouping": "Ingen gruppering" }, "alert-group-alerts-table": { + "columns": { + "label": { + "instance-labels": "", + "notification-state": "Aviseringstillstånd" + } + }, "duration": "för {{time}}" }, "alert-group-filter": { @@ -443,6 +468,11 @@ "description-section": "Ange ett namn för att identifiera {{entityName}}.", "label-metric": "Mått", "label-name": "Namn", + "message": { + "must-enter-a-metric-name": "", + "must-enter-a-name": "", + "please-select-a-data-source": "Välj en datakälla" + }, "metric-aria-label-metric": "mått", "metric-placeholder-recorded-metric": "Ange namnet på det nya registrerade mätvärdet", "placeholder-name": "Ge ditt {{namePlaceholder}} ett namn", @@ -495,6 +525,9 @@ "alertmanager-config": { "gma-manual-configuration-description": "Den interna konfigurationen för Grafana Alertmanager kan inte ändras manuellt. Ändra den här konfigurationen genom att redigera de enskilda resurserna via användargränssnittet.", "gma-manual-configuration-is-not-supported": "Manuella konfigurationsändringar stöds inte", + "message": { + "configuration-cannot-be-empty": "" + }, "reset": "Återställ", "reset-confirmation": "Är du säker på att du vill återställa konfigurationen för ”{{alertmanagerName}}”? Kontaktpunkter och aviseringspolicyer kommer att återställas till deras standardvärden.", "resetting-configuration-might-while": "Återställer konfigurationen. Det kan ta en stund.", @@ -584,6 +617,9 @@ "create-a-contact-point": "Skapa en kontaktpunkt", "label-default-contact-point": "Standardkontaktpunkt", "label-timing-options": "Tidsalternativ", + "message": { + "required": "" + }, "or": "eller" }, "am-routes-expanded-form": { @@ -605,11 +641,19 @@ "label-override-grouping": "Åsidosätt gruppering", "label-value": "Värde", "matching-labels": "Matchande etiketter", + "message": { + "required": "" + }, "placeholder-label": "etikett", "placeholder-value": "värde", "remove": "Ta bort", "tooltip-remove-matcher": "Ta bort matcharen" }, + "annotation-header-field": { + "message": { + "required": "" + } + }, "annotations": { "dashboard-annotation-field": { "dashboard": "Instrumentpanel {{dashboardUid}}", @@ -681,6 +725,25 @@ "title": "Det gick inte att visa alla händelser" } }, + "central-alert-history-scene": { + "scene": { + "labels-filter-variable": { + "label": { + "labels": "" + } + }, + "transitions-from-filter-variable": { + "label": { + "start-state": "" + } + }, + "transitions-to-filter-variable": { + "label": { + "end-state": "" + } + } + } + }, "channel-sub-form": { "delete": "Ta bort", "duplicate": "Dubblett", @@ -717,11 +780,17 @@ }, "cloud-data-source-selector": { "label": "Välj datakälla", - "label-disabled": "Datakälla" + "label-disabled": "Datakälla", + "message": { + "please-select-a-data-source": "Välj en datakälla" + } }, "cloud-evaluation-behavior": { "description-pending-period": "Period under vilken tröskelvillkoret måste uppfyllas för att utlösa ett larm. Om du väljer ”Inget” utlöses larmet omedelbart när villkoret har uppfyllts.", "label-pending-period": "Väntande period", + "message": { + "must-be-a-positive-integer": "" + }, "title-set-evaluation-behavior": "Ange utvärderingsbeteende" }, "cloud-receiver-form": { @@ -762,6 +831,9 @@ "contact-point-selector": { "aria-label-refresh-contact-points": "Uppdatera kontaktpunkter", "contact-point-picker-label-contact-point": "Kontaktpunkt", + "message": { + "contact-point-is-required": "" + }, "title-failed-to-fetch-contact-points": "Misslyckades med att hämta kontaktpunkter", "tooltip-refresh-contact-points-list": "Uppdatera kontaktpunktslista" }, @@ -828,6 +900,14 @@ }, "copy-to-clipboard": "Kopiera ”{{label}}” till klippbordet", "create-metadata": { + "label": { + "dashboard": "Instrumentpanel", + "dashboard-and-panel": "", + "evaluation-interval": "Utvärderingsintervall", + "labels": "Etiketter", + "metric-name": "", + "runbook-url": "" + }, "view-dashboard": "Visa instrumentpanel", "view-panel": "Visa panel" }, @@ -868,9 +948,6 @@ "title-search-panel": "Sökpanel", "title-select-dashboard-and-panel": "Välj instrumentpanel och panel" }, - "data-source-section": { - "import-to-grafana": "Importera till Grafanas regler" - }, "datasource-not-found": { "card-description": "Datakällan för den här frågan hittades inte, den har antingen tagits bort eller är inte korrekt installerad.", "remove-query": "Ta bort fråga", @@ -952,6 +1029,11 @@ "text-loading-template": "Laddar mall …", "title-failed-to-fetch-notification-template": "Misslyckades med att hämta aviseringsmall" }, + "edit-mute-timing-page": { + "text": { + "edit-time-interval": "" + } + }, "editor": { "edit-alert-rule": "", "edit-recording-rule": "", @@ -965,6 +1047,11 @@ "error-summary-button": { "content-show-all-errors": "" }, + "evaluate-every-validation-options": { + "message": { + "required": "" + } + }, "evaluation-behavior-summary": { "evaluate": "", "label-evaluate": "Beräkna", @@ -982,6 +1069,9 @@ "evaluation-group-creation-modal": { "description-group-name": "En grupp utvärderar alla dess regler under samma utvärderingsintervall.", "description-often-rules-group-evaluated": "Hur ofta alla regler i gruppen utvärderas.", + "message": { + "required": "" + }, "placeholder-enter-a-name": "Ange ett namn", "title-new-evaluation-group": "Ny utvärderingsgrupp" }, @@ -1004,12 +1094,24 @@ "title-permission-editrecreate-silence": "Du saknar behörighet att redigera/återskapa denna tystnad", "title-silence-not-found": "Befintlig tystnad ”{{silenceId}}” hittades inte" }, + "existing-silence-editor-page": { + "page-nav": { + "text": { + "edit-silence": "" + } + } + }, "export": { "subtitle": { "formats": "Välj formatet och ladda ner filen eller kopiera innehållet till urklippet", "one-format": "Ladda ner filen eller kopiera innehållet till urklippet" } }, + "export-new-grafana-rule-page": { + "text": { + "export-new-grafana-rule": "" + } + }, "export-new-rule-button": { "tooltip-export-new-grafana-rule": "Exportera ny Grafana-regel" }, @@ -1035,6 +1137,16 @@ "no-data": "Inga data", "page-counter": "" }, + "feature-toggle-page": { + "nav-model": { + "subTitle": { + "enable-alerting-grafana-config": "" + }, + "text": { + "alerting-is-not-enabled": "" + } + } + }, "federated-rule-warning": { "experimental": "Federerade regelgrupper är för närvarande en experimentell funktion.", "read-documentation": "Läs dokumentationen", @@ -1042,6 +1154,13 @@ }, "file-export-inline-documentation": { "api-provisioning": "{{name}} formatet är endast giltigt för API-provisionering. <3>Läs mer i dokumenten.</3>", + "export-inline-doc": { + "title": { + "apiprovisioning-format": "", + "fileprovisioning-format": "", + "terraformprovisioning-format": "" + } + }, "file-provisioning": "{{name}} formatet är endast giltigt för filprovisionering. <3>Läs mer i dokumenten.</3>", "terraform-provisioning": "{{name}} formatet är endast giltigt för Terraform-provisionering. <3>Läs mer i dokumenten.</3>" }, @@ -1049,6 +1168,20 @@ "copy-code": "Kopiera kod", "download": "Ladda ner" }, + "filter-options": { + "label": { + "alert-rule": "Varningsregel", + "all": "Alla", + "error": "Fel", + "firing": "", + "no-data": "Inga data", + "normal": "Normal ", + "ok": "OK", + "pending": "Väntande", + "recording-rule": "Inspelningsregel", + "recovering": "Återställer" + } + }, "filter-view-results": { "aria-label-filteredrulelist": "filtrerad regellista" }, @@ -1083,7 +1216,10 @@ } }, "folder-selector": { - "description-select-folder": "Välj en mapp där du vill spara regeln." + "description-select-folder": "Välj en mapp där du vill spara regeln.", + "message": { + "select-a-folder": "" + } }, "folderAndGroup": { "evaluation": { @@ -1098,15 +1234,88 @@ "for-input": { "description-pending": "Period under vilken tröskelvillkoret måste uppfyllas för att utlösa ett larm. Om du väljer ”Inget” utlöses larmet omedelbart när villkoret har uppfyllts." }, + "for-validation-options": { + "message": { + "required": "" + } + }, "generate-alert-data-modal": { "add-alert-data": "Lägg till larmdata", "add-alert-data-to-payload": "Lägg till larmdata till nyttolasten", + "alert-options": { + "label": { + "firing": "", + "resolved": "" + } + }, "review-alert-payload": " Granska larmdata för att lägga till nyttolasten:", "title-add-custom-alerts": "Lägg till anpassade larm" }, + "get-alert-suggestions": { + "documentation": { + "annotations-attached-alert": "", + "fingerprint-identify-alert": "", + "grafana-external-alertmanager": "", + "organization-alert": "", + "time-the-alert-started-firing": "" + }, + "value": { + "labels-attached-alert": "", + "status-alert-firing-resolved": "" + } + }, + "get-cloud-scenes": { + "title": { + "mimir-alertmanager": "" + } + }, + "get-global-suggestions": { + "value": { + "an-array-containing-all-alerts": "" + } + }, + "get-grafana-alertmanager-scenes": { + "title": { + "grafana-alertmanager": "" + } + }, + "get-grafana-managed-scenes": { + "title": { + "grafanamanaged-alert-rules": "Larmregler hanteras av Grafana" + } + }, + "get-mimir-managed-rules-per-group-scenes": { + "rule-group-handler": { + "label": { + "rule-group": "" + } + }, + "title": { + "mimirmanaged-alert-rules-per-rule-group": "" + } + }, + "get-mimir-managed-rules-scenes": { + "title": { + "mimirmanaged-alert-rules": "" + } + }, "get-preview-results": { "title-error": "Fel" }, + "get-state-display-model": { + "text": { + "alerting": "", + "error": "", + "firing": "", + "inactive": "", + "no-data": "", + "ok": "OK", + "paused": "", + "pending": "", + "recovering": "", + "unknown": "" + } + }, "getting-stared": { "learn-more": "För en praktisk introduktion, se vår <2>handledning för att komma igång med Grafana Alerting</2>" }, @@ -1148,6 +1357,10 @@ "label-disable-resolved-message": "Inaktivera löst meddelande" }, "grafana-evaluation-behavior-step": { + "message": { + "must-be-a-positive-integer": "", + "must-enter-a-group-name": "" + }, "missing-series-resolve-placeholder": "Standard: 2", "or": "eller", "placeholder-select-an-evaluation-group": "Välj en utvärderingsgrupp …", @@ -1164,6 +1377,11 @@ "body-invalid-rule-id": "Regelns UID för sidans webbadress är ogiltig. Kontrollera webbadressen och försök igen.", "title-invalid-rule-id": "Ogiltigt regel-ID" }, + "grafana-modify-export-page": { + "text": { + "modify-export": "" + } + }, "grafana-mute-timing-exporter-preview": { "text-loading": "Laddar …" }, @@ -1216,6 +1434,9 @@ }, "group-and-namespace-fields": { "group-picker-label-group": "Grupp", + "message": { + "required": "" + }, "namespace-picker-label-namespace": "Namnområde" }, "group-by": { @@ -1272,14 +1493,19 @@ "header": { "tooltip-remove": "Ta bort uttryck ”{{refId}}”" }, + "history-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "Lyckades" + } + }, "home": { "label-get-started": "Kom igång nu", "label-insights": "Insikter", "title-alerting": "Varnar" }, - "import-from-dsrules": { - "description-folder-import-rules": "Mappen som reglerna ska importeras till" - }, "import-to-gma": { "action-button": "Importera", "additional-settings": "Ytterligare inställningar", @@ -1287,8 +1513,9 @@ "confirm-modal": { "confirm": "Importera", "loading": "Laddar …", - "loading-body": "Förbereder data som ska importeras. Det kan ta en stund …", + "loading-body": "", "no-rules-body": "Det finns inga regler att importera. Välj ett annat namnområde eller en annan regelgrupp.", + "no-rules-body-yaml": "", "no-rules-title": "Inga regler att importera", "plugin-rules-warning": { "text": "Vi har upptäckt att vissa regler hanteras av plugin-program. Dessa regler kommer inte att importeras.", @@ -1307,11 +1534,12 @@ "label": "Grupp" }, "import-location-and-filters": "Importeringsplats och filter", + "import-source": "", "namespace": { "description": "Skriv för att söka efter ett befintligt namnområde", "label": "Namnområde" }, - "pageTitle": "Importera larmregler från en datakälla till Grafana-hanterade regler", + "pageTitle": "", "pause": { "label": "Pausa importerade larmregler" }, @@ -1319,10 +1547,26 @@ "label": "Pausa importerade inspelningsregler" }, "recording-rules": "Inspelningsregler", + "source": { + "datasource": "", + "datasource-description": "", + "yaml": "", + "yaml-description": "" + }, "success": "Larmregler har importerats till Grafana-hanterade regler.", "target-folder": { + "description": "Mappen som reglerna ska importeras till", "label": "Målmapp" - } + }, + "yaml": { + "description": "", + "label": "", + "required-message": "", + "target-datasource": "Måldatakälla", + "target-datasource-description": "", + "target-datasource-required": "" + }, + "yaml-error": "" }, "insights": { "monitor-status-of-system": "Övervaka statusen för ditt system", @@ -1398,6 +1642,9 @@ "text-loading-existing-labels": "Läser in befintliga etiketter" }, "labels-without-suggestions": { + "message": { + "required": "" + }, "placeholder-key": "nyckel", "placeholder-value": "värde" }, @@ -1437,6 +1684,24 @@ "log-record-viewer-by-timestamp": { "aria-label-state-history-by-timestamp": "Tillståndshistorik efter tidsstämpel" }, + "log-timeline-viewer": { + "label": { + "firing": "", + "mixed": "", + "no-data": "", + "normal": "Normal ", + "pending": "Väntande", + "recovering": "Återställer" + } + }, + "loki-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "Lyckades" + } + }, "loki-state-history": { "clear-filters": "Rensa filter", "common-labels": "Vanliga etiketter", @@ -1449,6 +1714,14 @@ "button": "Hantera behörigheter", "title": "Hantera behörigheter" }, + "manual-and-automatic-routing": { + "routing-options": { + "label": { + "select-contact-point": "", + "use-notification-policy": "" + } + } + }, "matcher-filter": { "filter-alerts-using-label-querying-without-braces": "Filtrera varningar med etikettförfrågan utan klamrar, t.ex.:", "filter-alerts-using-label-querying-without-spaces": "Filtrera larm med etikettförfrågan utan mellanslag, t.ex.:", @@ -1466,6 +1739,9 @@ "label-operator": "Operatör", "label-refine-affected-alerts": "Förfina berörda larm", "label-value": "Värde", + "message": { + "required": "" + }, "placeholder-label": "etikett", "placeholder-value": "värde", "remove": "Ta bort", @@ -1497,6 +1773,16 @@ "aria-label": "Mer", "button-text": "Mer" }, + "multiple-data-source-picker": { + "get-data-source-options": { + "grouped-options": { + "label": { + "data-sources-with-configured-alert-rules": "", + "other-data-sources": "" + } + } + } + }, "mute-timing-actions-buttons": { "text-disabled": "Inaktiverad", "title-delete-mute-timing": "Radera tyst tidsinställning" @@ -1560,11 +1846,26 @@ "read-more": "Läs om aviseringspolicyer.", "title-notification-routing": "Dirigering av aviseringar" }, + "new-mute-timing-page": { + "text": { + "add-time-interval": "" + } + }, "new-rule-from-panel-button": { "body-no-alerting-capable-query-found": "Kan inte skapa larm från denna panel eftersom ingen fråga till en larmkapabel datakälla hittades.", "new-alert-rule": "Ny varningsregel", "title-no-alerting-capable-query-found": "Ingen larmkapabel fråga hittades" }, + "new-silence-page": { + "page-nav": { + "subTitle": { + "configure-silences-notifications-particular-alert": "" + }, + "text": { + "silence-alert-rule": "Tyst larmregel" + } + } + }, "no-alert-managers-available": { "body-no-alertmanager-found": "Vi kunde inte hitta några externa Alertmanager och du kanske inte har åtkomst till den inbyggda Grafana Alertmanager.", "title-no-alertmanager-found": "Ingen Alertmanager hittades" @@ -1791,6 +2092,9 @@ "expressions": "Uttryck", "loading-data-sources": "Laddar datakällor …", "manipulate-returned-queries-other-operations": "Manipulera data som returneras från frågor med matematikfunktioner och andra operationer.", + "message": { + "a-valid-expression-is-required": "" + }, "no-compatible-sources": "Du verkar inte ha några kompatibla datakällor", "title-deactivate-advanced-options": "Inaktivera avancerade alternativ", "title-queries-expressions-configured": "Inga frågor eller uttryck har konfigurerats" @@ -1842,7 +2146,8 @@ }, "recording-rules": { "description-target-data-source": "Prometheus-datakällan där inspelningsregler ska sparas", - "label-target-data-source": "Måldatakälla" + "label-target-data-source": "Måldatakälla", + "target-data-source-required": "" }, "recording-rules-name-space-and-group-step": { "description-select-namespace-group-recording": "Välj namnområde och grupp för inspelningsregeln.", @@ -2103,6 +2408,9 @@ "collapse-all": "Stäng alla", "expand-all": "Visa alla" }, + "rule-list-v2": { + "import-to-gma": "" + }, "rule-modify-export": { "text-loading-the-rule": "Laddar regeln …", "title-cannot-exist": "Kan inte ladda regeln. Regeln existerar inte", @@ -2180,6 +2488,10 @@ "label-saved-searches": "Sparade sökningar" }, "health": "Hälsa", + "label": { + "hide": "Dölj", + "show": "Visa" + }, "manage-alerts": "I dessa datakällor kan du välja Hantera larm via larmgränssnittet för att kunna hantera dessa larmregler i Grafana-gränssnittet samt i datakällan där de konfigurerades.", "placeholder-all-data-sources": "Alla datakällor", "plugin-rules": "Tilläggsregler", @@ -2276,6 +2588,9 @@ "label-comment": "Kommentar", "label-created-by": "Skapat av", "label-duration": "Varaktighet", + "message": { + "required": "" + }, "placeholder-whos-creating-the-silence": "Vem skapar tystnaden", "save-silence": "Spara tystnad", "saving": "Sparar ..." @@ -2314,6 +2629,12 @@ "title-alert-rule-types": "Typer av larmregler" }, "state-history": { + "columns": { + "label": { + "state": "Tillstånd", + "time": "Tid" + } + }, "filter-group": "Filtergrupp", "filter-group-tooltip": "Filtrera varje tillståndshistorikgrupp antingen efter exakt matchning eller ett reguljärt uttryck, till exempel:", "placeholder-search": "Sök", @@ -2353,6 +2674,9 @@ "label-examples-documentation": "Exempeldokumentation", "label-template-group": "Mallgrupp", "label-template-group-name": "Namn för mallgrupp", + "message": { + "required": "" + }, "new-template-name-placeholder-give-your-template-group-a-name": "Ge din mallgrupp ett namn", "title-error-saving-template": "Fel vid sparande av mall", "title-templating-cheat-sheet": "Mall för fusklapp" @@ -2375,6 +2699,11 @@ "existing-templates-selector-aria-label-choose-notification-template": "Välj aviseringsmall", "existing-templates-selector-placeholder-choose-notification-template": "Välj aviseringsmall", "loading": "Laddar …", + "template-options": { + "label": { + "select-notification-template": "" + } + }, "tooltip-copy": "Kopiera vald aviseringsmall till urklippet. Du kan använda den i den anpassade fliken." }, "templates": { @@ -2477,10 +2806,39 @@ } }, "use-columns": { + "columns": { + "label": { + "alert-rule-targeted": "", + "alerts-silenced": "", + "health": "Hälsa", + "matching-labels": "Matchande etiketter", + "name": "Namn", + "schedule": "Schema", + "state": "Tillstånd", + "time-range": "Tidsintervall" + } + }, + "label": { + "actions": "Åtgärder", + "created": "Skapad", + "group": "Grupp", + "labels": "Etiketter", + "next-evaluation": "Nästa utvärdering", + "state": "Tillstånd", + "summary": "Sammanfattning" + }, "title-edit": "Redigera", "title-recreate": "Skapa om", "title-unsilence": "Häv tystnaden" }, + "use-combined-labels": { + "grouped-options": { + "label": { + "from-alerts": "", + "from-system": "" + } + } + }, "use-create-dropdown-menu-actions": { "label-delete": "Ta bort", "label-edit": "Redigera", @@ -2514,6 +2872,17 @@ "title-edit-notification-policy": "Redigera aviseringspolicy" } }, + "use-page-nav": { + "page-nav": { + "text": { + "details": "Detaljer", + "history": "Historik", + "instances": "Instanser", + "query-and-conditions": "", + "versions": "Versioner" + } + } + }, "use-state-history-modal": { "state-history-modal": { "title-state-history": "Tillståndshistorik" @@ -2534,6 +2903,36 @@ "body": "YAML-innehållet i redigeraren innehåller endast larmregelkonfiguration <1></1>För att konfigurera Prometheus måste du ange resten av <4>konfigurationsfilens innehåll.</4>" } }, + "alertlist": { + "group-by": { + "aria-label-group-by-label-keys": "", + "placeholder-group-by": "Gruppera efter" + }, + "ungrouped-mode-view": { + "active-for": "", + "aria-label-view-alert-rule": "", + "view-alert-rule": "" + }, + "unified-alert-list": { + "clear": "Rensa", + "text-loading": "Laddar …" + }, + "unified-alert-list-panel": { + "body-permission-required": "", + "title-permission-required": "" + } + }, + "annolist": { + "anno-list-panel": { + "aria-label-remove-filter": "", + "filter": "", + "loading": "Laddar …", + "no-annotations-found": "" + }, + "annotation-list-item": { + "tooltip-created-by": "" + } + }, "annotations": { "annotation-field-mapper": { "annotation": "Kommentar", @@ -2630,6 +3029,11 @@ "configuration-required": "Konfiguration krävs", "refer-documentation-configure-authentication": "Se dokumentationen om hur autentisering konfigureras" }, + "field-map": { + "label": { + "none": "Inget" + } + }, "fields": { "allow-assign-grafana-admin-description": "", "allow-assign-grafana-admin-label": "", @@ -2733,7 +3137,18 @@ "use-refresh-token-description": "", "use-refresh-token-label": "", "validate-hosted-domain-description": "", - "validate-hosted-domain-label": "" + "validate-hosted-domain-label": "", + "workload-identity-token-file-description": "", + "workload-identity-token-file-label": "", + "workload-identity-token-file-required": "" + }, + "get-page-nav": { + "subTitle": { + "configure-authentication-providers": "" + }, + "text": { + "authentication": "Autentisering" + } }, "provider-card": { "text-badge-enabled": "Aktiverad", @@ -2769,6 +3184,12 @@ "auth-config-auth-config-page-unconnected": { "subtitle": "Hantera dina autentiseringsinställningar och konfigurera enkel inloggning. Läs mer i vår <2>dokumentation</2>." }, + "barchart": { + "tick-spacing-editor": { + "content-require-space-from-the-right-side": "", + "label-rtl": "" + } + }, "bookmarks-page": { "empty": { "message": "Det verkar som om du inte har skapat några bokmärken ännu", @@ -2897,11 +3318,199 @@ "text-this-repository-is-read-only": "Om du har direkt åtkomst till målet kopierar du JSON och klistrar in den där." }, "canvas": { + "apieditor": { + "label-endpoint": "", + "label-header-parameters": "", + "label-method": "Metod", + "label-payload": "Nyttolast", + "label-query-parameters": "Frågeparametrar", + "render-test-apibutton": { + "test-api": "", + "title-test-api": "" + } + }, + "button-item": { + "label": { + "center": "", + "left": "", + "right": "" + }, + "placeholder": { + "auto": "Auto" + } + }, + "button-style-editor": { + "label-variant": "Variant" + }, + "canvas-context-menu": { + "close-editor": "", + "open-editor": "", + "render-menu-items": { + "add-item-menu-item": { + "label-add-item": "" + }, + "edit-element-menu-item": { + "label-edit": "Redigera" + }, + "label-bring-to-front": "", + "label-delete": "Radera", + "label-duplicate": "Dubblett", + "label-send-to-back": "", + "set-background-menu-item": { + "label-set-background": "" + } + } + }, + "cloud-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } + }, + "ellipse-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } + }, + "inline-edit": { + "canvas-inline-editor": "", + "tooltip-close-inline-editor": "" + }, + "inline-edit-body": { + "label-add-item": "", + "please-select-an-element": "" + }, + "line-style-editor": { + "label-animate": "" + }, + "metric-value-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } + }, "not-found-display": { "not-found": "<0>Hittades inte: </0><config />" }, + "pan-zoom-help": { + "ctrl-right-mouse": "", + "middle-mouse": "", + "pan-title": "", + "reset-double-click": "", + "title-pan-and-zoom-controls": "", + "zoom-scroll-wheel": "" + }, + "parallelogram-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } + }, + "params-editor": { + "aria-label-add": "Lägg till", + "aria-label-delete": "Radera", + "placeholder-key": "Nyckel", + "placeholder-value": "Värde" + }, + "placement-editor": { + "label-constraints": "", + "label-position": "", + "loading": "Laddar …" + }, + "quick-positioning": { + "tooltip-align-bottom": "", + "tooltip-align-horizontal-centers": "", + "tooltip-align-left": "", + "tooltip-align-right": "", + "tooltip-align-top": "", + "tooltip-align-vertical-centers": "" + }, + "rectangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } + }, "text-display": { "double-click-to-set": "Dubbelklicka för att ställa in text" + }, + "text-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } + }, + "tree-navigation-editor": { + "clear-selection": "Rensa val", + "frame-selection": "", + "label-add-item": "", + "missing-layer": "", + "no-settings": "", + "switcher-icon": { + "title-node-icon": "" + } + }, + "tree-node-title": { + "title-duplicate": "Dubblett", + "title-remove": "Ta bort", + "tooltip-duplicate": "Dubblett", + "tooltip-remove": "Ta bort" + }, + "triangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Auto" + } } }, "carousel": { @@ -2981,6 +3590,22 @@ } }, "connections": { + "add-new-connection": { + "filter-by-options": { + "label": { + "all": "Alla", + "installed": "Installerad", + "new-updates": "" + } + }, + "label": { + "by-downloads": "", + "by-name-az": "", + "by-name-za": "", + "by-published-date": "", + "by-updated-date": "" + } + }, "advisor-redirect-notice": { "aria-label-link-to-advisor": "Länk till rådgivare", "body": "Prova den nya rådgivaren för att upptäcka potentiella problem med dina datakällor och plugin-program.", @@ -2997,6 +3622,22 @@ "body": "Datakällor har fått ett nytt hem! Du kan upptäcka nya datakällor eller hantera befintliga på sidan Anslutningar, som är tillgänglig från huvudmenyn.", "go-to-connections": "Gå till anslutningar" }, + "data-source-details-page": { + "subTitle": { + "datasource-could-found": "" + }, + "text": { + "unknown-datasource": "" + } + }, + "new-data-source-page": { + "subTitle": { + "choose-a-data-source-type": "" + }, + "text": { + "add-data-source": "Lägg till datakälla" + } + }, "no-access-modal": { "connection-contact-grafana-admin": "Kontakta din Grafana-administratör om du behöver lägga till en ny anslutning.", "editor-warning": "Redigerare kan inte lägga till nya anslutningar. Du kan kontrollera om det redan har konfigurerats i <2>Datakällor</2>.", @@ -3009,6 +3650,18 @@ "search": { "aria-label-search-all": "Sök alla", "placeholder": "Sök alla" + }, + "use-data-source-settings-nav": { + "node": { + "subTitle": { + "data-source-error": "" + } + }, + "page-nav": { + "text": { + "data-source-nav-node": "" + } + } } }, "core": { @@ -3304,6 +3957,11 @@ "title-plugin-dashboard": "Tilläggsinstrumentpanel" }, "dash-nav": { + "on-open-snapshot-original": { + "title": { + "proceed-to-external-site": "" + } + }, "render-left-actions": { "text-public": "Offentlig", "tooltip-view-as-scene": "Visa som scen" @@ -3315,11 +3973,26 @@ "dashboard-loading": { "cancel-loading-dashboard": "Avbryt laddning av instrumentpanel" }, + "dashboard-page-error": { + "text": { + "not-found": "Hittades inte" + } + }, "dashboard-settings": { "actions": { "close": "Stäng" } }, + "dashboard-slice": { + "title": { + "dashboard-init-failed": "" + } + }, + "dashboard-srv": { + "message": { + "edit-dashboard-json": "" + } + }, "dashboard-validation": { "body-dashboard-failed-schema-validation": "Validering tillhandahålls för utvecklingsändamål och bör vara säkert att ignorera. Om du är en Grafana-utvecklare kan du överväga att kontrollera och uppdatera instrumentpanelschemat", "title-checking-dashboard-validity": "Kontrollerar instrumentpanelens giltighet", @@ -3415,6 +4088,13 @@ "values": "Värden åtskilda med kommatecken", "values-placeholder": "1, 10, mykey : myvalue, myvalue, escaped,value" }, + "datasource-options": { + "name-filter": "", + "name-filter-description": "", + "name-filter-placeholder": "", + "type": "Typ", + "type-placeholder": "" + }, "description": "Beskrivning", "description-placeholder": "Beskrivande text", "label": "Etikett", @@ -3433,8 +4113,8 @@ "category": "Urvalsalternativ", "custom-all-value": "Anpassa allt värde", "custom-all-value-description": "Ett reguljärt jokertecken eller annat värde som representerar alla", - "include-all": "Alternativet Inkludera alla", - "include-all-description": "Aktiverar ett alternativ för att inkludera alla värden", + "include-all": "", + "include-all-description": "", "multi-value": "Multivärde" }, "type-category": "{{type}}-alternativ" @@ -3460,14 +4140,97 @@ "errors": { "failed-to-load": "Det gick inte att ladda instrumentpanelen" }, + "fetch-dashboard": { + "message": { + "failed-to-fetch-dashboard": "" + } + }, "gen-aihistory": { "aria-label-send-custom-feedback": "Skicka anpassad feedback", "footer-text": "Detta innehåll är AI-genererat med <2>Grafanas LLM-tillägg </2>", "placeholder-tell-ai-what-to-do-next": "Berätta för AI vad du ska göra härnäst …" }, + "general-settings-unconnected": { + "editable-options": { + "label": { + "editable": "Redigerbar", + "readonly": "" + } + } + }, + "get-debug-dashboard": { + "title": { + "annotations": "Kommentarer" + } + }, + "get-errors": { + "message": { + "error-loading-data": "" + } + }, "get-field-override-categories": { "label-add-field-override": "Lägg till åsidosättning av fält", - "label-add-override-property": "Lägg till egenskap för åsidosättning" + "label-add-override-property": "Lägg till egenskap för åsidosättning", + "title": { + "add-button": "" + } + }, + "get-library-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "Information", + "name": "Namn" + } + }, + "get-library-viz-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "Information", + "name": "Namn" + } + }, + "get-panel-editor-tabs": { + "text": { + "alert": "", + "query": "Fråga", + "transform-data": "" + } + }, + "get-panel-frame-category": { + "descriptor": { + "title": { + "panel-options": "Panelalternativ" + } + }, + "direction-options": { + "label": { + "horizontal": "Horisontellt", + "vertical": "Vertikalt" + } + }, + "title": { + "description": "Beskrivning", + "max-per-row": "Max per rad", + "panel-links": "Panellänkar", + "repeat-by-variable": "Upprepa per variabel", + "repeat-direction": "Upprepa riktning", + "repeat-options": "Upprepningsalternativ", + "title": "Titel", + "transparent-background": "Genomskinlig bakgrund" + } + }, + "get-panel-menu": { + "text": { + "extensions": "" + } }, "help-wizard": { "copy-to-clipboard": "Kopiera till urklippet", @@ -3480,10 +4243,21 @@ "randomize-field-names-label-field-names": "Fältnamn", "randomize-labels-label-labels": "Etiketter", "randomize-string-values-label-string-values": "Strängvärden", + "tabs": { + "label": { + "data": "Data", + "snapshot": "Ögonblicksbild" + } + }, "title-complete-git-hub-comment-clipboard": "Kopiera en fullständig GitHub-kommentar till urklippet", "title-get-help-with-this-panel": "Få hjälp med denna panel", "troubleshooting-docs": "Felsökningsdokument" }, + "init-dashboard": { + "message": { + "failed-create-dashboard-model": "" + } + }, "inspect": { "data-tab": "Data", "error-tab": "Fel", @@ -3536,6 +4310,16 @@ "rows": "Totalt antal rader", "table-title": "Statistik" }, + "k8s-dashboard-api": { + "title": { + "deleted": "" + } + }, + "k8s-dashboard-v2api": { + "title": { + "deleted": "" + } + }, "layout": { "common": { "copy": "Kopiera", @@ -3548,6 +4332,13 @@ "panel-layout-disabled": "Välj en rad eller flik för att ändra alternativ för panellayout" } }, + "legacy-dashboard-api": { + "fetch-error": { + "message": { + "dashboard-not-found": "" + } + } + }, "make-editable": { "dashboard-not-editable": "Instrumentpanelen kan inte redigeras", "make-editable": "Gör redigerbar" @@ -3567,6 +4358,20 @@ "menu-use-library-panel": "Använd bibliotekspanel" }, "new-panel-title": "Ny panel", + "on-create-new-row": { + "new-row": { + "title": { + "row-title": "" + } + } + }, + "on-create-new-widget-panel": { + "new-panel": { + "title": { + "widget-title": "" + } + } + }, "options": { "description": "Beskrivning", "title-option": "Titel" @@ -3626,6 +4431,30 @@ "paused": "Denna instrumentpanel har pausats av administratören", "try-again-later": "Försök igen senare" }, + "remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, + "repeat-row-select": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, + "repeat-row-select2": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, "revert-dashboard-modal": { "body-restore-version": "Är du säker på att du vill återställa instrumentpanelen till version {{version}}? Alla ändringar som inte sparats kommer att gå förlorade.", "title-restore-version": "Återställ versionen" @@ -3739,6 +4568,18 @@ "sub-menu-un-connected": { "aria-label-template-variables": "Mallvariabler" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "tabs-layout": { "delete-tab-text": "Om du tar bort denna flik tas också alla paneler bort. Är du säker på att du vill fortsätta?", "delete-tab-title": "Radera flik?", @@ -3944,7 +4785,10 @@ }, "unthemed-dashboard-row": { "aria-label-delete-row": "Radera rad", - "learn-more": "Läs mer" + "learn-more": "Läs mer", + "title": { + "delete-row": "Radera rad" + } }, "validation": { "invalid-dashboard-id": "Kunde inte hitta ett giltigt Grafana.com-ID\n", @@ -3979,6 +4823,16 @@ }, "visualization-select-pane": { "placeholder-search-for": "Sök efter …", + "radio-options": { + "description": { + "reusable-panels-share-between-multiple-dashboards": "" + }, + "label": { + "library-panels": "Bibliotekspaneler", + "suggestions": "", + "visualizations": "" + } + }, "title-close": "Stäng" }, "viz-panel": { @@ -4029,12 +4883,25 @@ "label-data-source": "Datakälla", "label-use-static-key-dimensions": "Använd dimensioner för statiska nycklar" }, + "add-to-dashboard": { + "message": { + "could-navigate-selected-dashboard-please-again": "", + "could-panel-dashboard-please-again": "" + } + }, "add-to-dashboard-form": { "cancel": "Avbryt", "description-choose-where-to-add-the-panel": "Välj var du vill lägga till panelen.", "description-select-which-dashboard-panel-created": "Välj i vilken instrumentpanel som panelen ska skapas.", + "label": { + "existing-dashboard": "Befintlig instrumentpanel", + "new-dashboard": "Ny instrumentpanel" + }, "label-dashboard": "Instrumentpanel", "label-target-dashboard": "Målinstrumentpanel", + "message": { + "this-field-is-required": "Detta fält är obligatoriskt." + }, "open-dashboard": "Öppna instrumentpanel", "open-in-new-tab": "Öppna i ny flik", "title-error-adding-the-panel": "Fel vid tillägg av panelen" @@ -4072,6 +4939,25 @@ "it-cannot-contain-or": "Det kan inte innehålla ”//” eller ”..”.", "least-valid-character": "Det måste innehålla minst ett giltigt tecken." }, + "build-new-dashboard-save-model": { + "data": { + "title": { + "new-dashboard": "Ny instrumentpanel" + } + } + }, + "build-new-dashboard-save-model-v2": { + "data": { + "title": { + "new-dashboard": "Ny instrumentpanel" + } + } + }, + "config-public-dashboard": { + "title": { + "revoke-public-url": "Återkalla offentlig webbadress" + } + }, "constant-variable-form": { "constant-options": "Konstanta alternativ", "label-value": "Värde", @@ -4119,22 +5005,89 @@ "value-not-saved": "Värdet har ännu inte sparats i Grafana-databasen", "view-pull-request-in-git-hub": "Visa pull-begäran i GitHub" }, + "dashboard-scene": { + "text": { + "edit-panel": "", + "view-panel": "Visa panel" + }, + "title": { + "dashboard": "Instrumentpanel", + "discard-changes-to-dashboard": "" + } + }, + "dashboard-scene-page-state-manager": { + "message": { + "dashboard-not-found": "" + } + }, + "dashboard-scene-page-state-manager-v2": { + "message": { + "dashboard-not-found": "" + } + }, "data-source-variable-form": { "data-source-options": "Alternativ för datakälla", "description-instance-name-filter": "Regex-filter för vilka datakällsinstanser att välja mellan i variabelvärdelistan. Lämna tomt för alla.", "example-instance-name-filter": "Exempel: <codeExample />", "selection-options": "Urvalsalternativ" }, + "default-grid-layout-manager": { + "row": { + "title": { + "row-title": "" + } + } + }, "description-label": { "description": "Beskrivning" }, + "edit-link-view": { + "edit-link-page-nav": { + "text": { + "edit-link": "Redigera länk" + } + } + }, "email-list": { "aria-label-emailmenu": "Växla e-postmeny" }, + "embedded-dashboard-test-page": { + "subTitle": { + "showing-dashboard-panel-tests-pie-chart": "" + }, + "text": { + "embedding-dashboard": "" + } + }, "empty-transformations-message": { "add-transformation": "Lägg till omvandling" }, + "get-edit-options": { + "title": { + "column-options": "", + "row-height-options": "" + } + }, + "get-panel-frame-options": { + "descriptor": { + "title": { + "panel-options": "Panelalternativ" + } + }, + "title": { + "description": "Beskrivning", + "panel-links": "Panellänkar", + "title": "Titel", + "transparent-background": "Genomskinlig bakgrund" + } + }, + "get-workflow-options": { + "label": { + "push-to-a-new-branch": "" + } + }, "group-by-variable-form": { + "alert-not-supported": "", "description-enables-users-custom-values": "Gör det möjligt för användare att lägga till anpassade värden i listan", "description-provide-dimensions-as-csv-dimension-name-dimension-id": "Tillhandahåll dimensioner som CSV: {{name}}, {{value}}", "group-by-options": "Gruppera efter alternativ", @@ -4153,6 +5106,12 @@ "randomize-field-names-label-field-names": "Fältnamn", "randomize-labels-label-labels": "Etiketter", "randomize-string-values-label-string-values": "Strängvärden", + "tabs": { + "label": { + "data": "Data", + "snapshot": "Ögonblicksbild" + } + }, "title-complete-git-hub-comment-clipboard": "Kopiera en fullständig GitHub-kommentar till urklippet", "title-get-help-with-this-panel": "Få hjälp med denna panel", "troubleshooting-docs": "Felsökningsdokument", @@ -4195,6 +5154,14 @@ "body-name-already-exists": "En instrumentpanel med samma namn finns redan i den valda mappen. Vill du fortfarande spara denna instrumentpanel?", "title-name-already-exists": "Namnet finns redan" }, + "on-remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, "panel-data-alerting-tab-rendered": { "alert": { "title-errors-loading-rules": "Fel vid laddning av regler" @@ -4216,6 +5183,11 @@ "table-view-aria-label-toggletableview": "Växla tabellvy", "table-view-label-table-view": "Tabellvy" }, + "panel-editor": { + "text": { + "edit-panel": "" + } + }, "panel-editor-renderer": { "aria-label-open-options-pane": "Öppna alternativfönstret", "tooltip-open-options-pane": "Öppna alternativfönstret" @@ -4224,8 +5196,22 @@ "body-panel-plugin-not-loaded": "Se till att panelen du vill inspektera är synlig och har visats innan du öppnar inspektionen.", "title-panel-plugin-not-loaded": "Paneltillägg inte laddat" }, + "panel-menu-behavior": { + "async-func": { + "text": { + "extensions": "", + "metrics-drilldown": "" + } + } + }, "panel-viz-type-picker": { "placeholder-search-for": "Sök efter …", + "radio-options": { + "label": { + "suggestions": "", + "visualizations": "" + } + }, "title-close": "Stäng" }, "provisioned-delete-modal": { @@ -4252,6 +5238,15 @@ "query-options": "Frågealternativ", "selection-options": "Urvalsalternativ" }, + "resource-export": { + "label": { + "classic": "", + "json": "JSON", + "v1-resource": "", + "v2-resource": "", + "yaml": "" + } + }, "revert-dashboard-modal": { "body-restore-version": "Är du säker på att du vill återställa instrumentpanelen till version {{version}}? Alla ändringar som inte sparats kommer att gå förlorade.", "title-restore-version": "Återställ versionen" @@ -4360,6 +5355,18 @@ "solo-panel-page": { "loading": "Laddar" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "text-box-variable-form": { "placeholder-default-value-if-any": "(valfritt)", "text-options": "Textalternativ" @@ -4370,6 +5377,13 @@ "title-field-label": { "title": "Titel" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "transformations-drawer": { "search-box-suffix": { "tooltip-clear-search": "Rensa sökningen" @@ -4385,6 +5399,13 @@ "save-dashboard": "Spara instrumentpanel", "title-unsaved-changes": "Ändringar som inte sparats" }, + "use-dashboard-edit-page-nav": { + "page-nav": { + "text": { + "settings": "Inställningar" + } + } + }, "variable-check-indicator": { "aria-label-variable-referenced-dashboard": "Den här variabeln refereras inte av någon variabel eller instrumentpanel.", "aria-label-variable-referenced-other-variables-dashboard": "Den här variabeln hänvisas till av andra variabler eller instrumentpanelen.", @@ -4401,7 +5422,10 @@ "placeholder-descriptive-text": "Beskrivande text", "placeholder-label-name": "Etikettnamn", "placeholder-variable-name": "Variabelnamn", - "text-running-query": "Kör fråga …" + "text-running-query": "Kör fråga …", + "title": { + "delete-variable": "Radera variabel" + } }, "variable-editor-list": { "definition": "Definition", @@ -4583,6 +5607,25 @@ "message": "Inga datakällor hittades" } }, + "datagrid": { + "add-column": { + "placeholder-column-name": "" + }, + "datagrid-context-menu": { + "render-context-menu-items": { + "label-clear-column": "", + "label-clear-row": "", + "label-remove-all-data": "", + "label-search": "Sök …" + }, + "render-header-menu-items": { + "label-clear-column": "", + "label-delete-column": "", + "label-rename-column": "", + "label-set-field-type": "" + } + } + }, "datasources": { "add-new-data-source-button": { "tooltip-no-permission": "Du saknar behörighet att konfigurera nya datakällor" @@ -4604,6 +5647,46 @@ "label-default": "Standard", "label-name": "Namn" }, + "build-categories": { + "categories": { + "title": { + "cloud": "", + "distributed-tracing": "", + "enterprise-plugins": "Enterprise-tilläggsprogram", + "industrial-io-t": "", + "logging-document-databases": "", + "others": "", + "profiling": "", + "sql": "", + "time-series-databases": "" + } + } + }, + "build-nav-model": { + "analytics": { + "text": { + "insights": "Insikter" + } + }, + "caching": { + "text": { + "cache": "" + } + }, + "ds-permissions": { + "text": { + "permissions": "Behörigheter" + } + }, + "nav-model": { + "text": { + "settings": "Inställningar" + } + }, + "text": { + "dashboards": "Instrumentpaneler" + } + }, "button-row": { "delete": "Ta bort", "save-and-test": "Spara och testa", @@ -4639,6 +5722,11 @@ "data-source-read-only-message": { "title-provisioned-data-source": "Tillhandahållen datakälla" }, + "data-source-settings-reducer": { + "message": { + "testing-could-couple-minutes": "" + } + }, "data-source-type-card": { "aria-label-learn-more": "{{dataSourcePluginName}}, läs mer." }, @@ -4656,13 +5744,88 @@ "footer": { "add-csv-or-spreadsheet": "Lägg till csv eller kalkylblad" }, + "get-enterprise-phantom-plugins": { + "description": { + "adobe-analytics-datasource": "", + "app-dynamics-integration-and-data-source": "", + "atlassian-statuspage-datasource": "", + "aurora-data-source": "", + "azure-cosmos-db-datasource": "", + "azure-devops-datasource": "", + "catchpoint-datasource": "", + "cloudflare-datasource": "", + "cockroach-db-datasource": "", + "data-dog-integration-and-data-source": "", + "drone-datasource": "", + "git-lab-integration-and-datasource": "", + "honeycomb-integration-and-datasource": "", + "jira-integration-and-datasource": "", + "logic-monitor-devices-datasource": "", + "mongo-db-integration-and-data-source": "", + "netlify-datasource": "", + "new-relic-integration-and-data-source": "", + "pager-duty-datasource": "", + "salesforce-integration-and-datasource": "", + "sap-hana-integration-and-data-source": "", + "service-now-integration-and-data-source": "", + "signal-fx-integration-and-datasource": "", + "snowflake-integration-and-data-source": "", + "sumo-logic-integration-and-datasource": "", + "visualize-and-explore-dynatrace-data": "", + "visualize-and-explore-oracle-sql": "", + "visualize-and-explore-splunk-logs": "", + "wavefront-integration-and-data-source": "", + "zendesk-datasource": "" + } + }, + "get-grafana-cloud-phantom-plugin": { + "description": { + "hosted-graphite-prometheus-and-loki": "" + } + }, "new-data-source-view": { "cancel": "Avbryt", "placeholder-filter-by-name-or-type": "Filtrera efter namn eller typ" }, + "update-data-source": { + "error-info": { + "message": { + "an-unexpected-error-occurred": "" + } + } + }, "use-data-source-info": { "badge-text-not-supported": "Stöds inte", - "badge-text-supported": "Stöds" + "badge-text-supported": "Stöds", + "label": { + "alerting": "Varnar", + "type": "Typ" + } + }, + "use-delete-loaded-data-source": { + "title": { + "delete": "Radera" + } + } + }, + "debug": { + "cursor-view": { + "no-events-yet": "" + }, + "render-info-viewer": { + "data-counter": "", + "elapsed-time": "", + "field": "Fält", + "last": "", + "render-counter": "", + "schema-counter": "", + "title-reset-counters": "", + "tooltip-step-back": "", + "type": "Typ" + }, + "state-view": { + "current-value": "", + "label-state-name": "" } }, "dimensions": { @@ -4731,6 +5894,19 @@ "remove-value-mapping-aria-label-delete-value-mapping": "Radera värdemappning", "remove-value-mapping-tooltip-delete": "Ta bort", "set-color": "Ange färg", + "special-match-options": { + "description": { + "boolean-false-values": "", + "boolean-true-values": "", + "empty-string": "", + "matches-against-number-na-n-not-a-number": "", + "matches-null-and-undefined-values": "", + "matches-null-undefined-and-na-n": "" + }, + "label": { + "empty": "Tom" + } + }, "tooltip-remove-color": "Ta bort färg", "tooltip-remove-icon": "Ta bort ikon" }, @@ -4746,6 +5922,20 @@ "display-text": "Visa text", "icon": "Ikon", "label-add-a-new-mapping": "Lägg till ny mappning", + "mapping-types": { + "description": { + "match-a-numerical-range-of-values": "", + "match-a-regular-expression-with-replacement": "", + "match-a-specific-text-value": "", + "match-boolean-empty-values": "" + }, + "label": { + "range": "", + "regex": "", + "special": "", + "value": "Värde" + } + }, "update": "Uppdatera" } }, @@ -4770,6 +5960,7 @@ }, "explore": { "accordian-logs": { + "events": "", "footer": "Händelsetidsstämplar är i förhållande till starttiden för den fullständiga spårningen." }, "accordian-references": { @@ -4780,6 +5971,11 @@ "basic-extensions": { "aria-label-add": "Lägg till" }, + "build-dashboard-panel-from-explore-state": { + "title": { + "new-panel": "" + } + }, "clear": "Rensa", "confirm-navigation-modal": { "cancel": "Avbryt", @@ -4866,6 +6062,33 @@ "title-table": "Tabell", "title-traces": "Spår" }, + "explore-query-inspector": { + "data-tab": { + "label": { + "data": "Data" + } + }, + "error-tab": { + "label": { + "error": "Fel" + } + }, + "json-tab": { + "label": { + "json": "JSON" + } + }, + "query-tab": { + "label": { + "query": "Fråga" + } + }, + "stats-tab": { + "label": { + "stats": "Statistik" + } + } + }, "explore-run-query-button": { "run-button": { "aria-label-run-query-options": "Kör frågealternativ" @@ -4879,10 +6102,23 @@ "description-explore-disabled": "För att aktivera Utforska, aktivera det i Grafanas konfiguration:", "title-explore-disabled": "Utforska är inaktiverat" }, + "get-field-links-for-explore": { + "text": { + "data": "Data", + "raw-value": "" + } + }, "get-matches-metadata": { "matches": "0 matchningar" }, "legacy-create-span-link-factory": { + "text": { + "tags": "Taggar" + }, + "title": { + "related-logs": "", + "session-for-this-span": "Session för det här intervallet" + }, "title-explore-metrics-for-this-span": "Utforska mätvärden för det här intervallet", "title-explore-split": "Utforska loggarna för detta i delad vy", "title-session-for-this-span": "Session för det här intervallet" @@ -4923,6 +6159,10 @@ }, "logs-meta-row": { "download": "Ladda ner", + "label": { + "deduplication-count": "", + "showing-only-selected-fields": "" + }, "show-original-line": "Visa ursprunglig rad" }, "logs-sample-panel": { @@ -5104,6 +6344,21 @@ "run-query-button": "Kör fråga", "switch-datasource-button": "Byt datakälla och kör fråga" }, + "scoped-vars-from-span": { + "text": { + "span": "" + } + }, + "scoped-vars-from-tags": { + "text": { + "tags": "Taggar" + } + }, + "scoped-vars-from-trace": { + "text": { + "trace": "Spåra" + } + }, "search-bar-input": { "placeholder-find": "Sök …", "suffix": { @@ -5138,9 +6393,25 @@ "tooltip-tag-key": "Taggnyckel som kommer att användas för att få taggvärdet. Ett spårs attribut och resurser kommer att genomsökas efter taggnyckeln" }, "span-detail": { + "label": { + "kind": "", + "library-name": "", + "library-version": "", + "status": "Status:", + "status-message": "", + "trace-state": "" + }, "label-resource-attributes": "Resursattribut", "label-span-attributes": "Intervallattribut", "label-stack-trace": "Stackspårning", + "overview-items": { + "label": { + "child-count": "", + "duration": "", + "service": "", + "start-time": "" + } + }, "warnings": "Varningar" }, "span-filters": { @@ -5247,6 +6518,18 @@ "title-node-graph": "Nodgraf" }, "unthemed-logs": { + "description": { + "show-results-in-logs-visualisation": "", + "show-results-in-table-visualisation": "", + "show-results-newest-to-oldest": "", + "show-results-oldest-to-newest": "" + }, + "label": { + "logs": "Loggar", + "newest-first": "Nyaste först", + "oldest-first": "Äldsta först", + "table": "Tabell" + }, "label-deduplication": "Avduplicering", "label-display-results": "Visa resultat", "label-prettify-json": "Gör JSON snyggare", @@ -5262,6 +6545,15 @@ }, "unthemed-virtualized-trace-view": { "title-scroll-to-top": "Skrolla till toppen" + }, + "use-focus-span-link": { + "create-focus-span-link": { + "link": { + "title": { + "deep-link-to-this-span": "" + } + } + } } }, "export": { @@ -5347,6 +6639,15 @@ "folder-repo": { "badge-text": "Provisionerad" }, + "folders": { + "get-loading-nav": { + "main": { + "title": { + "loading": "Laddar" + } + } + } + }, "forgot-password": { "back-button": "Tillbaka till inloggningen", "change-password": { @@ -5376,10 +6677,102 @@ "incomplete-request-error": "Tyvärr kunde jag inte slutföra din begäran. Försök igen.", "send-custom-feedback": "Skicka" }, + "geomap": { + "coordinates-map-view-editor": { + "label-latitude": "", + "label-longitude": "" + }, + "debug-overlay": { + "center": "", + "zoom": "" + }, + "fit-map-view-editor": { + "all-layers-editor-fragment": { + "label-layer": "" + }, + "label-data": "Data", + "last-only-editor-fragment": { + "label-padding": "", + "tooltip-padding-relative-percent-beyond-extent": "" + } + }, + "frame-multi-selection-editor": { + "placeholder-change-filter": "" + }, + "frame-selection-editor": { + "placeholder-change-filter": "" + }, + "geomap-panel": { + "aria-label-map": "" + }, + "geomap-style-rules-editor": { + "aria-label-add-geomap-style-rule": "" + }, + "layers-editor": { + "label-add-layer": "", + "no-layers": "" + }, + "map-view-editor": { + "label-max-zoom": "", + "label-view": "Visa", + "label-zoom": "Zooma", + "use-current-map-settings": "" + }, + "markers-legend": { + "title-symbol": "Symbol" + }, + "measure-overlay": { + "tooltip-show-measure-tools": "" + }, + "plugin": { + "basemap-layer-configured-server-admin": "" + }, + "style-editor": { + "label-align": "", + "label-baseline": "", + "label-color": "Färg", + "label-fill-opacity": "", + "label-font-size": "", + "label-opacity": "", + "label-rotation-angle": "", + "label-size": "", + "label-symbol": "Symbol", + "label-symbol-horizontal-align": "", + "label-symbol-vertical-align": "", + "label-text-label": "", + "label-x-offset": "", + "label-y-offset": "" + }, + "style-rule-editor": { + "aria-label-comparison-operator": "Jämförelseoperator", + "aria-label-comparison-value": "", + "aria-label-delete-style-rule": "", + "aria-label-feature-property": "", + "label-rule": "Regel", + "placeholder-feature-property": "", + "placeholder-numeric-value": "", + "placeholder-value": "värde" + } + }, "get-enterprise": { "requires-license": "Kräver en Grafana Enterprise-licens", "title": "Enterprise" }, + "gettingstarted": { + "docs-card": { + "complete": "klar", + "learn-how": "" + }, + "getting-started": { + "aria-label-to-advanced-tutorials": "", + "aria-label-to-basic-tutorials": "", + "checking-completed-setup-steps": "", + "remove-this-panel": "" + }, + "tutorial-card": { + "complete": "klar" + } + }, "gops": { "config-card": { "text-loading-configuration": "Läser in konfiguration …" @@ -5396,6 +6789,74 @@ }, "progress-status": { "your-progress": "Dina framsteg" + }, + "use-get-configuration-for-ui": { + "get-connect-data-source-configuration": { + "title": { + "connect-data-source": "" + } + }, + "title": { + "essentials": "Grundläggande uppgifter" + } + }, + "use-get-essentials-configuration": { + "essential-content": { + "description": { + "configure-grafana-alerting": "", + "create-integration-alerting-contact-point": "", + "initialize-incident-plugin-declare-manage-incidents": "", + "practice-solving-an-incident": "", + "receive-alerts-oncall-notifications-within-environment": "", + "select-chat-ops-channels-to-route-notifications": "" + }, + "label": { + "add": "Lägg till", + "connect": "Anslut", + "initialize": "", + "select-integration": "", + "start-drill": "" + }, + "title": { + "add-slack-notifications-to-irm-integrations": "", + "connect-alerting-to-irm": "", + "connect-irm-to-your-slack-workspace": "", + "connect-your-messaging-workspace-to-incident": "", + "connect-your-messaging-workspace-to-on-call": "", + "create-incident-drill": "", + "detect": "Detektera", + "initialize-incident-plugin": "", + "messaging-workspace-channel-on-call-integration": "", + "respond": "", + "test-your-configuration": "" + } + }, + "get-grafana-alerting-config-steps": { + "description": { + "create-alert-monitor-system": "", + "create-on-call-integration-alerting-contact-point": "", + "create-slos-to-monitor-your-service": "" + }, + "label": { + "connect": "Anslut", + "create": "Skapa", + "enable": "Aktivera" + }, + "steps": { + "label": { + "edit": "Redigera" + }, + "title": { + "update-default-contact-point": "" + } + }, + "title": { + "connect-alerting-to-on-call": "", + "create-alert-rule": "", + "create-slo": "", + "enable-slo-alerting": "" + } + } } }, "grafana": { @@ -5762,14 +7223,18 @@ "duplicate-panel": "Duplicera panel", "exit-edit/setting-views": "Avsluta redigerings-/inställningsvyer", "expand-all-rows": "Expandera alla rader", + "explore-panel": "", "go-to-dashboards": "Gå till instrumentpaneler", "go-to-explore": "Gå till Utforska", "go-to-home-dashboard": "Gå till startinstrumentpanelen", "go-to-profile": "Gå till profil", + "inspect-panel": "", "make-time-range-permanent": "Gör tidsintervallet absolut/permanent", "move-time-range-back": "Flytta tidsintervall tillbaka", "move-time-range-forward": "Flytta tidsintervall framåt", "open-search": "Öppna sökning", + "open-share-embed-drawer": "", + "open-share-link-drawer": "", "open-shared-modal": "Ögonblicksbild för Dela panel", "paste-time-range": "Klistra in tidsintervall", "refresh-all-panels": "Uppdatera alla paneler", @@ -5795,6 +7260,11 @@ "support-bundle": "Du kan även hämta ett supportpaket som innehåller information om din Grafana-instans och konfigurerade datakällor i avsnittet om <1>supportpaket</1>.", "troubleshooting-help": "Om du vill begära felsökningshjälp skickar du en ögonblicksbild av denna panel till Grafana Labs tekniska support. Ögonblicksbilden innehåller frågesvarsdata och panelinställningar." }, + "histogram": { + "histogram-panel": { + "no-histogram-found-in-response": "" + } + }, "inspector": { "inspect-data-tab": { "loading": "Laddar", @@ -5844,6 +7314,9 @@ "label-name": "Namn", "label-password": "Lösenord", "label-username": "Användarnamn", + "message": { + "email-is-invalid": "" + }, "placeholder-name-optional": "Namn (valfritt)", "placeholder-password": "Lösenord", "placeholder-username": "Användarnamn", @@ -6103,8 +7576,26 @@ "discard-local-changes": "Ignorera lokala ändringar", "title-dashboard-changed": "Instrumentpanelen har ändrats" }, + "live-channel-editor": { + "description-grafana-live": "", + "namespace": "Namnområde", + "path": "Sökväg", + "placeholder-select-watchable-resource": "", + "scope": "", + "title-grafana-live": "" + }, "live-connection-warning": { "title-connection-to-server-is-lost": "Anslutningen till servern har förlorats …" + }, + "live-panel": { + "error": "Fel", + "grafana-requires-feature": "", + "panel-editor-channel": "", + "title-grafana-live": "", + "waiting-for-data": "" + }, + "live-publish": { + "publish": "" } }, "lock-icon": "låsikon", @@ -6151,6 +7642,13 @@ } }, "logs": { + "get-dataframe-fields": { + "vars": { + "text": { + "labels": "Etiketter" + } + } + }, "infinite-scroll": { "end-of-range": "Slut på det valda tidsintervallet.", "load-more": "Skrolla för att ladda mer", @@ -6231,6 +7729,11 @@ "shortcut": "alt+välj om du vill aktivera igen" } }, + "log-series-to-logs-model": { + "label": { + "total-bytes-processed": "" + } + }, "logs-controls": { "deduplication": "Avduplicering", "disable-highlighting": "Inaktivera markering", @@ -6265,6 +7768,11 @@ "scroll-top": "Skrolla till toppen", "start-of-range": "Start av intervall" }, + "logs-panel": { + "render-common-labels": { + "common-labels": "" + } + }, "out-of-range-message": { "end-of-the-selected-time-range": "Slut på det valda tidsintervallet." }, @@ -6321,6 +7829,14 @@ }, "snapshot-list-table": { "title-delete": "Ta bort" + }, + "unthemed-dashboard-import": { + "subTitle": { + "import-dashboard-from-file-or-grafanacom": "" + }, + "text": { + "import-dashboard": "Importera instrumentpanel" + } } }, "migrate-to-cloud": { @@ -6978,8 +8494,57 @@ "close": "Stäng låda" }, "link-title": "Gå till Grafana Labs blogg", + "news-panel": { + "body-error-loading-rss-feed": "", + "loading": "Laddar …", + "title-error-loading-rss-feed": "" + }, "title": "Senaste från bloggen" }, + "nodeGraph": { + "arc-options-editor": { + "add-arc": "", + "title-remove-arc": "" + }, + "edge": { + "aria-label-from-to": "" + }, + "edge-header": { + "label-source-target": "" + }, + "marker": { + "100-node-count": "", + "aria-label-hidden-marker": "", + "node-count_one": "", + "node-count_other": "" + }, + "node": { + "aria-label-node-title": "" + }, + "node-graph": { + "aria-label-layered-layout-performance-warning": "", + "aria-label-nodes-hidden-warning": "", + "computing-layout": "", + "no-data": "Inga data", + "hidden-nodes_one": "", + "hidden-nodes_other": "", + "processed-nodes_one": "", + "processed-nodes_other": "" + }, + "node-graph-panel": { + "no-data-found-in-response": "" + }, + "node-header": { + "label-subtitle": "", + "label-title": "Titel" + }, + "view-controls": { + "hide-config": "", + "show-config": "", + "title-zoom-in": "", + "title-zoom-out": "" + } + }, "notifications": { "empty-state": { "description": "Aviseringar som du har fått visas här", @@ -7021,6 +8586,11 @@ "label-organization-name": "Organisationsnamn", "placeholder-org-name": "Orgnamn" }, + "org-details-page": { + "title": { + "confirm-preferences-update": "" + } + }, "org-profile": { "label-organization-name": "Organisationsnamn", "label-organization-profile": "Organisationsprofil", @@ -7040,7 +8610,10 @@ "tooltip": "Du kan nu välja alternativet ”Ingen grundläggande roll” och lägga till behörigheter för dina anpassade behov. Du hittar mer information i <1>vår dokumentation</1>." }, "user-invite-page": { - "sub-title": "Skicka inbjudan eller lägg till en befintlig Grafana-användare i organisationen.<1> {{orgName}}</1>" + "sub-title": "Skicka inbjudan eller lägg till en befintlig Grafana-användare i organisationen.<1> {{orgName}}</1>", + "text": { + "invite-user": "" + } } }, "org-picker": { @@ -7052,6 +8625,38 @@ } }, "panel": { + "get-calculation-value-data-links-variable-suggestions": { + "value-calc-var": { + "label": { + "calculation-name": "" + } + } + }, + "get-data-links-variable-suggestions": { + "value-time-var": { + "label": { + "time": "Tid" + } + } + }, + "get-field-links-supplier": { + "text": { + "data": "Data", + "field": "Fält", + "series": "", + "value": "Värde" + } + }, + "get-field-vars": { + "label": { + "name": "Namn" + } + }, + "get-panel-links-variable-suggestions": { + "label": { + "all-variables": "" + } + }, "header-menu": { "copy": "Kopiera", "create-library-panel": "Skapa bibliotekspanel", @@ -7112,6 +8717,13 @@ "select-placeholder": "Filtrera efter typ" }, "playlist": { + "playlist-new-page": { + "page-nav": { + "text": { + "new-playlist": "Ny spellista" + } + } + }, "playlist-table-rows": { "aria-label-playlist-item": "Objekt i spellista, {{itemType}}, {{itemValue}}", "multiple-dashboards-found": "Flera objekt hittades: {{items}}", @@ -7128,6 +8740,12 @@ "label-mode": "Läge", "label-time-and-refresh": "Tid och uppdatering", "label-variables": "Variabler", + "modes": { + "label": { + "kiosk": "Kiosk", + "normal": "Normal " + } + }, "title-start-playlist": "Starta spellista" } }, @@ -7194,6 +8812,19 @@ }, "browse": { "aria-label-plugin-type-filter": "Filter för tilläggstyp", + "filter-by-options": { + "label": { + "all": "Alla", + "installed": "Installerad", + "new-updates": "" + } + }, + "label": { + "all": "Alla", + "applications": "", + "data-sources": "Datakällor", + "panels": "Paneler" + }, "label-search": "Sök", "label-state": "Tillstånd", "label-type": "Typ", @@ -7275,12 +8906,24 @@ "empty-state": { "message": "Inga tilläggsprogram hittades" }, + "extensions-log-data-source": { + "message": { + "ok": "OK" + } + }, "filter": { "disabled": "Detta filter har inaktiverats eftersom Grafanas server inte kan komma åt grafana.com", "sort": "Sortera", "sort-list": "Sortera listan över tilläggsprogram", "state": "Tillstånd" }, + "get-feature-state-info": { + "text": { + "alpha": "", + "beta": "Beta", + "deprecated": "Föråldrat" + } + }, "get-started-with-app": { "disable": "Inaktivera", "enable": "Aktivera" @@ -7337,6 +8980,16 @@ "plugin-details-header-dependencies": { "grafana-dependency": "Grafana {{grafanaDependency}}" }, + "plugin-details-page": { + "not-found-model": { + "subTitle": { + "requested-belong-plugin": "" + }, + "text": { + "unknown-plugin": "" + } + } + }, "plugin-details-signature": { "body-invalid-plugin-signature": "Grafana Labs kontrollerar varje tilläggsprogram för att verifiera att det har en giltig digital signatur. Verifiering av plugin-signatur är en del av våra säkerhetsåtgärder för att säkerställa att plugin är säkra och pålitliga att använda. Grafana Labs kan inte garantera integriteten hos detta osignerade plugin-program. Kontakta tilläggets författare för att begära att det ska signeras.", "read-more-about-plugins-signing": "Läs mer om signering av tillägg.", @@ -7382,6 +9035,13 @@ "search-field": { "placeholder-search-grafana-plugins": "Sök Grafana-tilläggsprogram" }, + "use-plugin-details-tabs": { + "nav-model-children": { + "text": { + "dashboards": "Instrumentpaneler" + } + } + }, "version-install-button": { "text-installed": "Installerad" }, @@ -7499,6 +9159,11 @@ "label-git-hub-features": "GitHub-funktioner", "label-realtime-feedback": "Feedback i realtid" }, + "connect-page": { + "subTitle": { + "connect-external-storage-manage-resources": "" + } + }, "connect-repository-button": { "configure": "Konfigurera", "configure-file": "Konfigurera provisionering med filer", @@ -7532,7 +9197,13 @@ }, "edit-repository-page": { "back-to-repositories": "Tillbaka till lagringsplatserna", - "repository-config-exists-configuration": "Verifiera att lagringsplatskonfigurationen finns i konfigurationsfilen." + "repository-config-exists-configuration": "Verifiera att lagringsplatskonfigurationen finns i konfigurationsfilen.", + "subTitle": { + "configure-repository-storing-resources": "" + }, + "text": { + "configure-repository": "" + } }, "empty-state": { "no-jobs": "Inga jobb …" @@ -7595,6 +9266,11 @@ "no-results-matching-your-query": "Inga resultat som matchar din fråga", "placeholder-search": "Sök" }, + "get-default-values": { + "title": { + "repository": "Databas" + } + }, "getting-started": { "alert-temporary-outage": "När du ansluter hela din instans kommer instrumentpaneler inte att vara tillgängliga när du kör migreringen. Vi rekommenderar att du varnar dina användare innan du påbörjar processen.", "modal-description-public-access": "Konfigurera offentlig åtkomst till din Grafana-instans för att aktivera GitHub-integrering", @@ -7739,7 +9415,18 @@ "dashboard-preview": "Förhandsgranskning av instrumentpanel", "existing-dashboard": "Befintlig instrumentpanel", "history": "Historik", + "message": { + "removed-from-repo-test-ui": "", + "updated-from-repo-test-ui": "" + }, "repository": "Databas", + "tab-info": { + "label": { + "dry-run-result-after-apply": "", + "existing-from-grafana": "", + "file-from-repository": "" + } + }, "title-error-saving-file": "Fel när fil skulle sparas" }, "setup-modal": { @@ -8152,14 +9839,6 @@ "reload-button": "Ladda om", "title": "Det gick inte att hitta applikationsfilen" }, - "sandbox": { - "test-stuff-page": { - "application-notifications-toasts-testing": "Testning av applikationsnotiser (popup-meddelanden)", - "error": "Fel", - "success": "Lyckades", - "warning": "Varning" - } - }, "save-dashboards": { "message-length": { "info": "Meddelandet är {{messageLength}} tecken, vilket överstiger den maximala längden på 500 tecken. Förkorta det innan du sparar.", @@ -8219,6 +9898,14 @@ "view-as-folders": "Visa efter mappar", "view-as-list": "Visa som lista" }, + "bluge-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } + }, "dashboard-actions": { "import": "Importera", "new": "Nyhet", @@ -8246,6 +9933,14 @@ "search-results-table": { "aria-label-search-results-table": "Sök resultattabell", "no-data": "Inga värden" + }, + "unified-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } } }, "select": { @@ -8317,6 +10012,11 @@ "delete-service-account": "Radera servicekonto", "disable-service-account": "Inaktivera servicekonto", "enable-service-account": "Aktivera servicekonto", + "page-nav": { + "subTitle": { + "manage-settings-individual-service-account": "" + } + }, "title-delete-service-account": "Radera servicekonto", "title-disable-service-account": "Inaktivera servicekonto", "tokens": "Polletter", @@ -8633,6 +10333,12 @@ "sort-picker": { "select-aria-label": "Sortera" }, + "status-history": { + "status-history-panel": { + "too-many-points_one": "", + "too-many-points_other": "" + } + }, "support-bundles": { "new-bundle-button": { "new-support-bundle": "Nytt supportpaket" @@ -8640,7 +10346,10 @@ "support-bundles-create-unconnected": { "cancel": "Avbryt", "create": "Skapa", - "sub-title": "Välj komponenter för supportpaketet. Supportpaketet kommer att vara tillgängligt i 3 dagar efter skapandet." + "sub-title": "Välj komponenter för supportpaketet. Supportpaketet kommer att vara tillgängligt i 3 dagar efter skapandet.", + "text": { + "create-support-bundle": "" + } }, "support-bundles-unconnected": { "created-on": "Skapad den", @@ -8655,10 +10364,35 @@ "login": "Logga in" }, "table": { + "auto-cell-options-editor": { + "description-wrap-text": "", + "label-wrap-text": "" + }, + "bar-gauge-cell-options-editor": { + "label-gauge-display-mode": "", + "label-value-display": "" + }, + "color-background-cell-options-editor": { + "description-apply-to-entire-row": "", + "description-wrap-text": "", + "label": { + "text-alpha": "" + }, + "label-apply-to-entire-row": "", + "label-background-display-mode": "", + "label-wrap-text": "", + "wrap-text": "" + }, "container": { "content": "Om för många kolumner visas i en enda tabell kan prestandan påverkas och data kan bli svårare att läsa. Överväg att förfina dina frågor.", "show-all-series": "Visa alla kolumner", "show-only-series": "Visar endast {{MAX_NUMBER_OF_COLUMNS}} kolumner" + }, + "image-cell-options-editor": { + "description-alt-text": "", + "description-title-text": "", + "label-alt-text": "", + "label-title-text": "" } }, "tag-filter": { @@ -8674,6 +10408,24 @@ "select-placeholder": "Välj ett team" }, "teams": { + "build-nav-model": { + "nav-model": { + "subTitle": { + "manage-members-and-settings": "" + }, + "text": { + "settings": "Inställningar" + } + }, + "team-group-sync": { + "text": { + "external-group-sync": "Extern gruppsynkronisering" + } + }, + "text": { + "members": "Medlemmar" + } + }, "create-team": { "create": "Skapa", "description-email": "Detta är valfritt och används främst för att tillåta anpassade teamavatarer", @@ -8695,6 +10447,9 @@ "external-group-sync": "Extern gruppsynkronisering", "label-add-external-group": "Lägg till extern grupp", "team-sync-upgrade": "Lägg till en grupp för att aktivera teamsynkronisering gratis under din provperiod av Grafana Pro", + "text": { + "add-group": "Skapa grupp" + }, "title-there-external-groups": "Det finns inga externa grupper att synkronisera med", "tooltip-add-external-group": "LDAP-gruppsexempel: {{example}}" }, @@ -8796,6 +10551,42 @@ "select-search-input": "Skriv för att söka (land, stad, förkortning)" } }, + "timeseries": { + "annotation-editor2": { + "add-annotation": "Lägg till kommentar", + "cancel": "Avbryt", + "edit-annotation": "", + "label-description": "Beskrivning", + "label-tags": "Taggar", + "placeholder-add-tags": "", + "save": "Spara", + "saving": "Sparar" + }, + "annotation-tooltip2": { + "tooltip-delete": "Radera", + "tooltip-edit": "Redigera" + }, + "line-style-editor": { + "title-the-input-expects-a-segment-list": "", + "tooltip-help": "Hjälp" + }, + "nulls-threshold-input": { + "placeholder-never": "Aldrig" + }, + "outside-range-plugin": { + "data-outside-time-range": "", + "zoom-to-data": "" + }, + "timezones-editor": { + "tooltip-add-timezone": "", + "tooltip-remove-timezone": "" + } + }, + "traces": { + "traces-panel": { + "no-data-found-in-response": "" + } + }, "transformations": { "empty": { "add-transformation-body": "Transformationer gör att data kan ändras på olika sätt innan din visualisering visas.<1></1>Det inkluderar att sammanfoga data, byta namn på fält, göra beräkningar, formatera data för visning med mera.", @@ -8832,6 +10623,10 @@ "convert-field-type-transformer-editor": { "aria-label-add-a-convert-field-type-transformer": "Lägg till en transformering för att konvertera fälttyp", "aria-label-remove-convert-field-type-transformer": "Ta bort transformering för att konvertera fälttyp", + "label": { + "browser": "Webbläsare", + "utc": "" + }, "label-as": "som", "label-date-format": "Datumformat", "label-field": "Fält", @@ -8918,11 +10713,32 @@ "tooltip-format": "Utdataformatet för fältet anges som en <2>Moment.js-formatsträng</2>.", "tooltip-timezone-manually": "Ställ in tidszonen för datumet manuellt" }, + "get-timezone-options": { + "label": { + "browser": "Webbläsare", + "utc": "" + } + }, "get-tooltips": { "description": "En giltig sökväg för ett json-objekt.", "json-value": "JSON-värde:", + "map-valid-paths": { + "description": { + "extract-fields-from-object": "", + "extract-value": "", + "extract-value-first-element": "", + "extract-value-second-element": "" + } + }, "valid-paths": "Giltiga sökvägar:" }, + "get-transformer-option-pane": { + "root": { + "title": { + "root": "" + } + } + }, "group-by-field-configuration": { "placeholder-ignored": "Ignorerad", "placeholder-select-stats": "Välj statistik" @@ -8939,7 +10755,23 @@ "label-cell-value": "Cellvärde", "label-column": "Kolumn", "label-empty-value": "Tomt värde", - "label-row": "Rad" + "label-row": "Rad", + "special-value-options": { + "description": { + "boolean-false-value": "", + "boolean-true-value": "", + "empty-string": "", + "null-value": "", + "number-value": "" + }, + "label": { + "empty": "Tom", + "false": "", + "null": "", + "true": "", + "zero": "" + } + } }, "histogram-transformer-editor": { "placeholder-auto": "Auto", @@ -9002,10 +10834,22 @@ "tooltip-naming": "Anger hur namnen på de valda fälten ska visas. Eftersom ramnamn vanligtvis är bättre för tabelldata" }, "partition-by-values-editor": { + "keep-fields-options": { + "label": { + "no": "Nej", + "yes": "Ja" + } + }, "label-field": "Fält", "label-keep-fields": "Behåll fält", "label-naming": "Namngivning", "label-select-field": "Välj fält", + "naming-modes-options": { + "label": { + "as-frame-name": "", + "as-label": "" + } + }, "partition-values-works-single-frame": "Partitionering med värden fungerar endast med en enda ram.", "tooltip-keeps-partition-fields-frames": "Håller partitionsfälten inom ramarna" }, @@ -9027,6 +10871,16 @@ "label-include-time": "Inkludera tid", "label-labels-to-fields": "Etiketter till fält", "label-mode": "Läge", + "modes": { + "description": { + "collapse-field-single-value": "", + "create-table-series-value": "" + }, + "label": { + "reduce-fields": "", + "series-to-rows": "" + } + }, "placeholder-choose-stat": "Välj statistik" }, "regex-matcher-editor": { @@ -9034,11 +10888,23 @@ "variable-regex-documentation": "" }, "regression-transformer-editor": { + "label": { + "cubic": "", + "quadratic": "", + "quartic": "", + "quintic": "" + }, "label-degree": "Grad", "label-model-type": "Modelltyp", "label-predicted-points": "Prognostiserade poäng", "label-x-field": "X-fält", "label-y-field": "Y-fält", + "model-type-options": { + "label": { + "linear": "", + "polynomial": "" + } + }, "tooltip-number-of-xy-points-to-predict": "Antal X,Y-poäng att förutsäga" }, "rename-by-regex-transformer-editor": { @@ -9056,6 +10922,23 @@ "label-reverse": "Omvänt", "placeholder-select-field": "Välj fält" }, + "supplier": { + "description": { + "apply-spatial-operations-to-the-geometry": "", + "create-a-line-between-two-points": "", + "geometry-define-field-headingdistancearea": "" + }, + "label": { + "area": "", + "as-line": "", + "calculate-value": "", + "distance": "", + "heading": "", + "line-builder": "", + "prepare-spatial-field": "", + "transform": "" + } + }, "time-series-table-transform-editor": { "label-stat": "Stat", "label-time-field": "Tidsfält", @@ -9089,7 +10972,19 @@ "placeholder-auto": "Auto", "placeholder-field": "Fält", "tooltip-window-size": "Fönsterstorlek", - "tooltip-window-size-percent": "Ställ in fönsterstorleken som procentandel av totala data" + "tooltip-window-size-percent": "Ställ in fönsterstorleken som procentandel av totala data", + "type-options": { + "label": { + "centered": "", + "trailing": "" + } + }, + "window-size-mode-options": { + "label": { + "fixed": "", + "percentage": "" + } + } } }, "upgrade-box": { @@ -9146,6 +11041,11 @@ }, "users-action-bar-unconnected": { "invite": "Bjud in", + "options": { + "label": { + "users": "Användare" + } + }, "placeholder-search-login-email": "Sök användare efter inloggning, e-postadress eller namn" } }, @@ -9189,6 +11089,32 @@ "confirm-delete-modal": { "title-delete-variable": "Radera variabel" }, + "create-ad-hoc-variable-adapter": { + "description": { + "add-keyvalue-filters-on-the-fly": "" + } + }, + "create-custom-variable-adapter": { + "description": { + "define-variable-values-manually": "" + } + }, + "create-interval-variable-adapter": { + "description": { + "define-timespan-interval": "" + } + }, + "create-query-variable-adapter": { + "description": { + "variable-values-fetched-datasource-query": "" + } + }, + "data-source-variable-slice": { + "text": { + "default": "", + "no-data-sources-found": "Inga datakällor hittades" + } + }, "empty-state": { "button-title": "Lägg till variabel", "info-box-content": "Variabler möjliggör mer interaktiva och dynamiska instrumentpaneler. Istället för att hårdkoda saker som till exempel server- eller sensornamn i statistikfrågor kan du i stället använda variabler. Variabler visas som listrutor högst upp på kontrollpanelen. Dessa rullgardinsmenyer gör det enkelt att ändra vilka data som visas i instrumentpanelen.", @@ -9215,6 +11141,13 @@ "placeholder-default-value-if-any": "standardvärde, om något", "text-options": "Textalternativ" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "unknown-table": { "loading": "Laddar …", "no-unknowns": "Inga omdöpta eller saknade variabler hittades.", @@ -9271,5 +11204,25 @@ "data-hover-view": { "link": "Länk" } + }, + "welcome": { + "welcome-banner": { + "need-help": "Behöver du hjälp?", + "welcome-to-grafana": "" + } + }, + "xychart": { + "series-editor": { + "add-series": "", + "aria-label-select-series": "", + "label-color-field": "", + "label-frame": "Ram", + "label-size-field": "", + "label-x-field": "X-fält", + "label-y-field": "Y-fält", + "placeholder-all-frames": "", + "placeholder-select-frame": "", + "tooltip-delete-series": "" + } } } \ No newline at end of file diff --git a/public/locales/tr-TR/grafana.json b/public/locales/tr-TR/grafana.json index 91dda42d0bf..c45ba761419 100644 --- a/public/locales/tr-TR/grafana.json +++ b/public/locales/tr-TR/grafana.json @@ -72,6 +72,11 @@ }, "admin-edit-org-page": { "label-name": "Ad", + "page-nav": { + "subTitle": { + "manage-settings-roles-organization": "" + } + }, "render-missing-permission-message": { "title-access-denied": "Erişim reddedildi" } @@ -233,6 +238,13 @@ "upgrade-info": { "title": "Enterprise lisansı" }, + "user-admin-page": { + "page-nav": { + "subTitle": { + "manage-settings-for-an-individual-user": "" + } + } + }, "user-create-page": { "label-email": "E-posta", "label-name": "Ad", @@ -243,9 +255,16 @@ "label-ldap": "LDAP" }, "user-list-admin-page-un-connected": { + "label": { + "active-last-days": "", + "all-users": "Tüm kullanıcılar" + }, "placeholder-search-login-email": "Giriş bilgisi, e-posta veya ada göre kullanıcı arayın." }, "user-list-anonymous-devices-page-un-connected": { + "label": { + "active-last-days": "" + }, "placeholder-search-devices-by-ip-address": "IP adresine göre cihaz arayın." }, "user-list-page": { @@ -364,6 +383,12 @@ "no-grouping": "Gruplama yok" }, "alert-group-alerts-table": { + "columns": { + "label": { + "instance-labels": "", + "notification-state": "Bildirim durumu" + } + }, "duration": "{{time}} boyunca" }, "alert-group-filter": { @@ -443,6 +468,11 @@ "description-section": "{{entityName}} ögenizi tanımlayacak için bir ad girin.", "label-metric": "Metrik", "label-name": "Ad", + "message": { + "must-enter-a-metric-name": "", + "must-enter-a-name": "", + "please-select-a-data-source": "Lütfen bir veri kaynağı seçin" + }, "metric-aria-label-metric": "metrik", "metric-placeholder-recorded-metric": "Yeni kaydedilen metriğin adını verin", "placeholder-name": "{{namePlaceholder}} için bir ad verin", @@ -495,6 +525,9 @@ "alertmanager-config": { "gma-manual-configuration-description": "Grafana'nın dahili Alertmanager yapılandırması manuel olarak değiştirilemez. Bu yapılandırmayı değiştirmek için bireysel kaynakları kullanıcı arayüzü üzerinden düzenleyin.", "gma-manual-configuration-is-not-supported": "Manuel yapılandırma değişiklikleri desteklenmiyor", + "message": { + "configuration-cannot-be-empty": "" + }, "reset": "Sıfırla", "reset-confirmation": "\"{{alertmanagerName}}\" için yapılandırmayı sıfırlamak istediğinizden emin misiniz? İletişim noktaları ve bildirim politikaları varsayılan değerlerine sıfırlanır.", "resetting-configuration-might-while": "Yapılandırma sıfırlanıyor, bu işlem biraz zaman alabilir.", @@ -584,6 +617,9 @@ "create-a-contact-point": "İletişim noktası oluştur", "label-default-contact-point": "Varsayılan iletişim noktası", "label-timing-options": "Zamanlama seçenekleri", + "message": { + "required": "" + }, "or": "veya" }, "am-routes-expanded-form": { @@ -605,11 +641,19 @@ "label-override-grouping": "Gruplandırmayı geçersiz kıl", "label-value": "Değer", "matching-labels": "Eşleşen etiketler", + "message": { + "required": "" + }, "placeholder-label": "etiket", "placeholder-value": "değer", "remove": "Kaldır", "tooltip-remove-matcher": "Eşleştiriciyi kaldır" }, + "annotation-header-field": { + "message": { + "required": "" + } + }, "annotations": { "dashboard-annotation-field": { "dashboard": "{{dashboardUid}} panosu", @@ -681,6 +725,25 @@ "title": "Tüm etkinlikler görüntülenemiyor" } }, + "central-alert-history-scene": { + "scene": { + "labels-filter-variable": { + "label": { + "labels": "" + } + }, + "transitions-from-filter-variable": { + "label": { + "start-state": "" + } + }, + "transitions-to-filter-variable": { + "label": { + "end-state": "" + } + } + } + }, "channel-sub-form": { "delete": "Sil", "duplicate": "Çoğalt", @@ -717,11 +780,17 @@ }, "cloud-data-source-selector": { "label": "Veri kaynağı seçin", - "label-disabled": "Veri kaynağı" + "label-disabled": "Veri kaynağı", + "message": { + "please-select-a-data-source": "Lütfen bir veri kaynağı seçin" + } }, "cloud-evaluation-behavior": { "description-pending-period": "Bir uyarının tetiklenebilmesi için eşik koşulunun karşılanması gereken süre. \"Hiçbiri\" seçilirse koşul sağlanır sağlanmaz uyarı hemen tetiklenir.", "label-pending-period": "Bekleme süresi", + "message": { + "must-be-a-positive-integer": "" + }, "title-set-evaluation-behavior": "Değerlendirme davranışını ayarla" }, "cloud-receiver-form": { @@ -762,6 +831,9 @@ "contact-point-selector": { "aria-label-refresh-contact-points": "İletişim noktaları alınamadı", "contact-point-picker-label-contact-point": "İletişim noktası", + "message": { + "contact-point-is-required": "" + }, "title-failed-to-fetch-contact-points": "İletişim noktaları getirilemedi", "tooltip-refresh-contact-points-list": "İletişim noktaları listesini yenile" }, @@ -828,6 +900,14 @@ }, "copy-to-clipboard": "\"{{label}}\" metnini panoya kopyala", "create-metadata": { + "label": { + "dashboard": "Pano", + "dashboard-and-panel": "", + "evaluation-interval": "Değerlendirme aralığı", + "labels": "Etiketler", + "metric-name": "", + "runbook-url": "" + }, "view-dashboard": "Panoyu görüntüle", "view-panel": "Paneli görüntüle" }, @@ -868,9 +948,6 @@ "title-search-panel": "Panel ara", "title-select-dashboard-and-panel": "Pano ve panel seçin" }, - "data-source-section": { - "import-to-grafana": "Grafana kurallarına içe aktar" - }, "datasource-not-found": { "card-description": "Bu sorgunun veri kaynağı bulunamadı; ya kaldırılmış ya da doğru şekilde kurulmamış.", "remove-query": "Sorguyu kaldır", @@ -952,6 +1029,11 @@ "text-loading-template": "Şablon yükleniyor...", "title-failed-to-fetch-notification-template": "Bildirim şablonu getirilemedi" }, + "edit-mute-timing-page": { + "text": { + "edit-time-interval": "" + } + }, "editor": { "edit-alert-rule": "", "edit-recording-rule": "", @@ -965,6 +1047,11 @@ "error-summary-button": { "content-show-all-errors": "" }, + "evaluate-every-validation-options": { + "message": { + "required": "" + } + }, "evaluation-behavior-summary": { "evaluate": "", "label-evaluate": "Değerlendirme", @@ -982,6 +1069,9 @@ "evaluation-group-creation-modal": { "description-group-name": "Bir grup, tüm kurallarını aynı değerlendirme aralığında değerlendirir.", "description-often-rules-group-evaluated": "Gruptaki tüm kuralların ne sıklıkla değerlendirileceği.", + "message": { + "required": "" + }, "placeholder-enter-a-name": "Bir ad girin", "title-new-evaluation-group": "Yeni değerlendirme grubu" }, @@ -1004,12 +1094,24 @@ "title-permission-editrecreate-silence": "Bu sessize almayı düzenleme/yeniden oluşturma izniniz yok", "title-silence-not-found": "\"{{silenceId}}\" adlı mevcut sessize alma bulunamadı" }, + "existing-silence-editor-page": { + "page-nav": { + "text": { + "edit-silence": "" + } + } + }, "export": { "subtitle": { "formats": "Biçimi seçin ve dosyayı indirin veya içeriği panoya kopyalayın", "one-format": "Dosyayı indirin veya içeriği panoya kopyalayın" } }, + "export-new-grafana-rule-page": { + "text": { + "export-new-grafana-rule": "" + } + }, "export-new-rule-button": { "tooltip-export-new-grafana-rule": "Yeni Grafana kuralını dışa aktar" }, @@ -1035,6 +1137,16 @@ "no-data": "Veri yok", "page-counter": "" }, + "feature-toggle-page": { + "nav-model": { + "subTitle": { + "enable-alerting-grafana-config": "" + }, + "text": { + "alerting-is-not-enabled": "" + } + } + }, "federated-rule-warning": { "experimental": "Şirket dışı kural grupları şu anda deneysel bir özelliktir.", "read-documentation": "Belgeleri okuyun", @@ -1042,6 +1154,13 @@ }, "file-export-inline-documentation": { "api-provisioning": "{{name}} biçimi yalnızca API Sağlaması için geçerlidir. <3>Daha fazla bilgi için belgelere bakın.</3>", + "export-inline-doc": { + "title": { + "apiprovisioning-format": "", + "fileprovisioning-format": "", + "terraformprovisioning-format": "" + } + }, "file-provisioning": " {{name}} biçimi yalnızca Dosya Sağlaması için geçerlidir. <3>Daha fazla bilgi için belgelere bakın.</3>", "terraform-provisioning": "{{name}} biçimi yalnızca Terraform Sağlaması için geçerlidir. <3>Daha fazla bilgi için belgelere bakın.</3>" }, @@ -1049,6 +1168,20 @@ "copy-code": "Kodu kopyala", "download": "İndir" }, + "filter-options": { + "label": { + "alert-rule": "Uyarı kuralı", + "all": "Tümü", + "error": "Hata", + "firing": "", + "no-data": "Veri yok", + "normal": "Normal", + "ok": "Tamam", + "pending": "Bekliyor", + "recording-rule": "Kayıt kuralı", + "recovering": "Geri yükleniyor" + } + }, "filter-view-results": { "aria-label-filteredrulelist": "filtrelenmiş-kural-listesi" }, @@ -1083,7 +1216,10 @@ } }, "folder-selector": { - "description-select-folder": "Kuralı kaydedeceğiniz klasörü seçin." + "description-select-folder": "Kuralı kaydedeceğiniz klasörü seçin.", + "message": { + "select-a-folder": "" + } }, "folderAndGroup": { "evaluation": { @@ -1098,15 +1234,88 @@ "for-input": { "description-pending": "Bir uyarının tetiklenebilmesi için eşik koşulunun karşılanması gereken süre. \"Hiçbiri\" seçilirse koşul sağlanır sağlanmaz uyarı hemen tetiklenir." }, + "for-validation-options": { + "message": { + "required": "" + } + }, "generate-alert-data-modal": { "add-alert-data": "Uyarı verisi ekle", "add-alert-data-to-payload": "Uyarı verilerini veri yüküne ekle", + "alert-options": { + "label": { + "firing": "", + "resolved": "" + } + }, "review-alert-payload": "Yüke eklenecek uyarı verilerini gözden geçirin:", "title-add-custom-alerts": "Özel uyarılar ekle" }, + "get-alert-suggestions": { + "documentation": { + "annotations-attached-alert": "", + "fingerprint-identify-alert": "", + "grafana-external-alertmanager": "", + "organization-alert": "", + "time-the-alert-started-firing": "" + }, + "value": { + "labels-attached-alert": "", + "status-alert-firing-resolved": "" + } + }, + "get-cloud-scenes": { + "title": { + "mimir-alertmanager": "" + } + }, + "get-global-suggestions": { + "value": { + "an-array-containing-all-alerts": "" + } + }, + "get-grafana-alertmanager-scenes": { + "title": { + "grafana-alertmanager": "" + } + }, + "get-grafana-managed-scenes": { + "title": { + "grafanamanaged-alert-rules": "Grafana tarafından yönetilen uyarı kuralları" + } + }, + "get-mimir-managed-rules-per-group-scenes": { + "rule-group-handler": { + "label": { + "rule-group": "" + } + }, + "title": { + "mimirmanaged-alert-rules-per-rule-group": "" + } + }, + "get-mimir-managed-rules-scenes": { + "title": { + "mimirmanaged-alert-rules": "" + } + }, "get-preview-results": { "title-error": "Hata" }, + "get-state-display-model": { + "text": { + "alerting": "", + "error": "", + "firing": "", + "inactive": "", + "no-data": "", + "ok": "Tamam", + "paused": "", + "pending": "", + "recovering": "", + "unknown": "" + } + }, "getting-stared": { "learn-more": "<2>Grafana Uyarı Sistemine başlamak için uygulamalı eğitimimize</2> göz atın" }, @@ -1148,6 +1357,10 @@ "label-disable-resolved-message": "Çözümlenmiş mesajı devre dışı bırak" }, "grafana-evaluation-behavior-step": { + "message": { + "must-be-a-positive-integer": "", + "must-enter-a-group-name": "" + }, "missing-series-resolve-placeholder": "Varsayılan: 2", "or": "veya", "placeholder-select-an-evaluation-group": "Değerlendirme grubu seçin...", @@ -1164,6 +1377,11 @@ "body-invalid-rule-id": "Sayfa URL'sindeki kural UID'si geçersiz. Lütfen URL'yi kontrol edin ve tekrar deneyin.", "title-invalid-rule-id": "Geçersiz kural kimliği" }, + "grafana-modify-export-page": { + "text": { + "modify-export": "" + } + }, "grafana-mute-timing-exporter-preview": { "text-loading": "Yükleniyor..." }, @@ -1216,6 +1434,9 @@ }, "group-and-namespace-fields": { "group-picker-label-group": "Grup", + "message": { + "required": "" + }, "namespace-picker-label-namespace": "Ad alanı" }, "group-by": { @@ -1272,14 +1493,19 @@ "header": { "tooltip-remove": "\"{{refId}}\" ifadesini kaldır" }, + "history-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "Başarılı" + } + }, "home": { "label-get-started": "Başlayalım", "label-insights": "İçgörüler", "title-alerting": "Uyarı sistemi" }, - "import-from-dsrules": { - "description-folder-import-rules": "Kuralların içe aktarılacağı klasör" - }, "import-to-gma": { "action-button": "İçe aktar", "additional-settings": "Ek ayarlar", @@ -1287,8 +1513,9 @@ "confirm-modal": { "confirm": "İçe aktar", "loading": "Yükleniyor...", - "loading-body": "İçe aktarılacak veriler hazırlanıyor. Bu işlem biraz zaman alabilir...", + "loading-body": "", "no-rules-body": "İçe aktarılacak kural yok. Lütfen farklı bir ad alanı veya kural grubu seçin.", + "no-rules-body-yaml": "", "no-rules-title": "İçe aktarılacak kural yok", "plugin-rules-warning": { "text": "Bazı kuralların eklentiler tarafından yönetildiği tespit edildi. Bu kurallar içe aktarılmayacak.", @@ -1307,11 +1534,12 @@ "label": "Grup" }, "import-location-and-filters": "İçe aktarma konumu ve filtreler", + "import-source": "", "namespace": { "description": "Mevcut bir ad alanı aramak için yazın", "label": "Ad alanı" }, - "pageTitle": "Uyarı kurallarını bir veri kaynağından içe aktararak Grafana tarafından yönetilen kurallara ekleyin", + "pageTitle": "", "pause": { "label": "İçe aktarılan uyarı kurallarını duraklat" }, @@ -1319,10 +1547,26 @@ "label": "İçe aktarılan kayıt kurallarını duraklat" }, "recording-rules": "Kayıt kuralları", + "source": { + "datasource": "", + "datasource-description": "", + "yaml": "", + "yaml-description": "" + }, "success": "Uyarı kuralları başarıyla Grafana yönetimli kurallara içe aktarıldı.", "target-folder": { + "description": "Kuralların içe aktarılacağı klasör", "label": "Hedef klasör" - } + }, + "yaml": { + "description": "", + "label": "", + "required-message": "", + "target-datasource": "Hedef veri kaynağı", + "target-datasource-description": "", + "target-datasource-required": "" + }, + "yaml-error": "" }, "insights": { "monitor-status-of-system": "Sistem durumunu izleyin", @@ -1398,6 +1642,9 @@ "text-loading-existing-labels": "Mevcut etiketler yükleniyor" }, "labels-without-suggestions": { + "message": { + "required": "" + }, "placeholder-key": "anahtar", "placeholder-value": "değer" }, @@ -1437,6 +1684,24 @@ "log-record-viewer-by-timestamp": { "aria-label-state-history-by-timestamp": "Zaman damgasına göre durum geçmişi" }, + "log-timeline-viewer": { + "label": { + "firing": "", + "mixed": "", + "no-data": "", + "normal": "Normal", + "pending": "Bekliyor", + "recovering": "Geri yükleniyor" + } + }, + "loki-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "Başarılı" + } + }, "loki-state-history": { "clear-filters": "Filtreleri temizle", "common-labels": "Ortak etiketleri gizle", @@ -1449,6 +1714,14 @@ "button": "İzinleri yönet", "title": "İzinleri yönet" }, + "manual-and-automatic-routing": { + "routing-options": { + "label": { + "select-contact-point": "", + "use-notification-policy": "" + } + } + }, "matcher-filter": { "filter-alerts-using-label-querying-without-braces": "Uyarıları parantezler olmadan etiket sorgulama ile filtreleyin, örneğin:", "filter-alerts-using-label-querying-without-spaces": "Etiket sorgulaması kullanarak boşluksuz uyarı filtresi oluşturun, örn.:", @@ -1466,6 +1739,9 @@ "label-operator": "İşleç", "label-refine-affected-alerts": "Etkilenen uyarıları daralt", "label-value": "Değer", + "message": { + "required": "" + }, "placeholder-label": "etiket", "placeholder-value": "değer", "remove": "Kaldır", @@ -1497,6 +1773,16 @@ "aria-label": "Daha Fazla", "button-text": "Daha Fazla" }, + "multiple-data-source-picker": { + "get-data-source-options": { + "grouped-options": { + "label": { + "data-sources-with-configured-alert-rules": "", + "other-data-sources": "" + } + } + } + }, "mute-timing-actions-buttons": { "text-disabled": "Devre dışı", "title-delete-mute-timing": "Sessize alma zamanlamasını sil" @@ -1560,11 +1846,26 @@ "read-more": "Bildirim politikaları hakkında bilgi edinin.", "title-notification-routing": "Bildirim yönlendirme" }, + "new-mute-timing-page": { + "text": { + "add-time-interval": "" + } + }, "new-rule-from-panel-button": { "body-no-alerting-capable-query-found": "Uyarı destekleyen bir veri kaynağına yönelik sorgu bulunamadığından bu panelden uyarı oluşturulamıyor.", "new-alert-rule": "Yeni uyarı kuralı", "title-no-alerting-capable-query-found": "Uyarı oluşturabilecek sorgu bulunamadı" }, + "new-silence-page": { + "page-nav": { + "subTitle": { + "configure-silences-notifications-particular-alert": "" + }, + "text": { + "silence-alert-rule": "Uyarı kuralını sessize al" + } + } + }, "no-alert-managers-available": { "body-no-alertmanager-found": "Harici bir Alertmanager bulunamadı ve yerleşik Grafana Alertmanager'a erişiminiz olmayabilir.", "title-no-alertmanager-found": "Alertmanager bulunamadı" @@ -1791,6 +2092,9 @@ "expressions": "İfadeler", "loading-data-sources": "Veri kaynakları yükleniyor...", "manipulate-returned-queries-other-operations": "Sorgulardan dönen verileri matematik ve diğer işlemlerle düzenleyin.", + "message": { + "a-valid-expression-is-required": "" + }, "no-compatible-sources": "Uyumlu veri kaynağınız yok gibi görünüyor", "title-deactivate-advanced-options": "Gelişmiş seçenekleri devre dışı bırak", "title-queries-expressions-configured": "Yapılandırılmamış sorgu veya ifade yok" @@ -1842,7 +2146,8 @@ }, "recording-rules": { "description-target-data-source": "Kayıt kurallarının saklanacağı Prometheus veri kaynağı", - "label-target-data-source": "Hedef veri kaynağı" + "label-target-data-source": "Hedef veri kaynağı", + "target-data-source-required": "" }, "recording-rules-name-space-and-group-step": { "description-select-namespace-group-recording": "Kayıt kuralınız için Ad Alanı ve Grup seçin.", @@ -2103,6 +2408,9 @@ "collapse-all": "Tümünü daralt", "expand-all": "Tümünü genişlet" }, + "rule-list-v2": { + "import-to-gma": "" + }, "rule-modify-export": { "text-loading-the-rule": "Kural yükleniyor...", "title-cannot-exist": "Kural yüklenemiyor. Kural mevcut değil", @@ -2180,6 +2488,10 @@ "label-saved-searches": "Kayıtlı aramalar" }, "health": "Sağlık", + "label": { + "hide": "Gizle", + "show": "Göster" + }, "manage-alerts": "Bu veri kaynaklarında hem Grafana arayüzünde hem de yapılandırıldıkları veri kaynağında bu uyarı kurallarını yönetebilmek için \"Uyarı Yönetimi\" arayüzü üzerinden yönetimi seçebilirsiniz.", "placeholder-all-data-sources": "Tüm veri kaynakları", "plugin-rules": "Eklenti kuralları", @@ -2276,6 +2588,9 @@ "label-comment": "Yorum", "label-created-by": "Oluşturan", "label-duration": "Süre", + "message": { + "required": "" + }, "placeholder-whos-creating-the-silence": "Susturma kaydını kim oluşturuyor?", "save-silence": "Sessize almayı kaydet", "saving": "Kaydediliyor…" @@ -2314,6 +2629,12 @@ "title-alert-rule-types": "Uyarı kuralı türleri" }, "state-history": { + "columns": { + "label": { + "state": "Durum", + "time": "Zaman" + } + }, "filter-group": "Filtre grubu", "filter-group-tooltip": "Her durum geçmişi grubunu tam eşleşmeyle veya düzenli ifadeyle filtreleyin, örn.", "placeholder-search": "Ara", @@ -2353,6 +2674,9 @@ "label-examples-documentation": "Örnek belgeler", "label-template-group": "Şablon grubu", "label-template-group-name": "Şablon grubu adı", + "message": { + "required": "" + }, "new-template-name-placeholder-give-your-template-group-a-name": "Şablon grubunuza bir ad verin", "title-error-saving-template": "Şablon kaydedilirken hata oluştu", "title-templating-cheat-sheet": "Şablon hızlı başvuru kılavuzu" @@ -2375,6 +2699,11 @@ "existing-templates-selector-aria-label-choose-notification-template": "Bildirim şablonu seçin", "existing-templates-selector-placeholder-choose-notification-template": "Bildirim şablonu seçin", "loading": "Yükleniyor...", + "template-options": { + "label": { + "select-notification-template": "" + } + }, "tooltip-copy": "Seçilen bildirim şablonunu panoya kopyalayın. Özel sekmede kullanabilirsiniz." }, "templates": { @@ -2477,10 +2806,39 @@ } }, "use-columns": { + "columns": { + "label": { + "alert-rule-targeted": "", + "alerts-silenced": "", + "health": "Sağlık", + "matching-labels": "Eşleşen etiketler", + "name": "Ad", + "schedule": "Zamanlama", + "state": "Durum", + "time-range": "Zaman aralığı" + } + }, + "label": { + "actions": "İşlemler", + "created": "Oluşturuldu", + "group": "Grup", + "labels": "Etiketler", + "next-evaluation": "Sonraki değerlendirme", + "state": "Durum", + "summary": "Özet" + }, "title-edit": "Düzenle", "title-recreate": "Yeniden oluştur", "title-unsilence": "Sessize almayı kaldır" }, + "use-combined-labels": { + "grouped-options": { + "label": { + "from-alerts": "", + "from-system": "" + } + } + }, "use-create-dropdown-menu-actions": { "label-delete": "Sil", "label-edit": "Düzenle", @@ -2514,6 +2872,17 @@ "title-edit-notification-policy": "Bildirim politikasını düzenle" } }, + "use-page-nav": { + "page-nav": { + "text": { + "details": "Ayrıntılar", + "history": "Geçmiş", + "instances": "Örnekler", + "query-and-conditions": "", + "versions": "Sürümler" + } + } + }, "use-state-history-modal": { "state-history-modal": { "title-state-history": "Durum geçmişi" @@ -2534,6 +2903,36 @@ "body": "Düzenleyicideki YAML içeriği yalnızca uyarı kuralı yapılandırmasını içerir <1></1>Prometheus yapılandırması yapmak için <4>yapılandırma dosyasının kalan içeriğini</4> sağlamanız gerekir.</4>" } }, + "alertlist": { + "group-by": { + "aria-label-group-by-label-keys": "", + "placeholder-group-by": "Gruplama ölçütü" + }, + "ungrouped-mode-view": { + "active-for": "", + "aria-label-view-alert-rule": "", + "view-alert-rule": "" + }, + "unified-alert-list": { + "clear": "Temizle", + "text-loading": "Yükleniyor..." + }, + "unified-alert-list-panel": { + "body-permission-required": "", + "title-permission-required": "" + } + }, + "annolist": { + "anno-list-panel": { + "aria-label-remove-filter": "", + "filter": "", + "loading": "Yükleniyor...", + "no-annotations-found": "" + }, + "annotation-list-item": { + "tooltip-created-by": "" + } + }, "annotations": { "annotation-field-mapper": { "annotation": "Ek açıklama", @@ -2630,6 +3029,11 @@ "configuration-required": "Yapılandırma gereklidir", "refer-documentation-configure-authentication": "Kimlik doğrulamanın nasıl yapılandırılacağı ile ilgili belgelere bakın" }, + "field-map": { + "label": { + "none": "Yok" + } + }, "fields": { "allow-assign-grafana-admin-description": "", "allow-assign-grafana-admin-label": "", @@ -2733,7 +3137,18 @@ "use-refresh-token-description": "", "use-refresh-token-label": "", "validate-hosted-domain-description": "", - "validate-hosted-domain-label": "" + "validate-hosted-domain-label": "", + "workload-identity-token-file-description": "", + "workload-identity-token-file-label": "", + "workload-identity-token-file-required": "" + }, + "get-page-nav": { + "subTitle": { + "configure-authentication-providers": "" + }, + "text": { + "authentication": "Kimlik doğrulama" + } }, "provider-card": { "text-badge-enabled": "Etkin", @@ -2769,6 +3184,12 @@ "auth-config-auth-config-page-unconnected": { "subtitle": "Kimlik doğrulama ayarlarınızı yönetin ve çoklu oturum açmayı yapılandırın. Daha fazla bilgi için <2>belgelerimize</2> bakın." }, + "barchart": { + "tick-spacing-editor": { + "content-require-space-from-the-right-side": "", + "label-rtl": "" + } + }, "bookmarks-page": { "empty": { "message": "Henüz bir yer imi oluşturmadığınız görülüyor", @@ -2897,11 +3318,199 @@ "text-this-repository-is-read-only": "Hedefe doğrudan erişiminiz varsa JSON'u kopyalayıp oraya yapıştırın." }, "canvas": { + "apieditor": { + "label-endpoint": "", + "label-header-parameters": "", + "label-method": "Yöntem", + "label-payload": "Yük", + "label-query-parameters": "Sorgu parametreleri", + "render-test-apibutton": { + "test-api": "", + "title-test-api": "" + } + }, + "button-item": { + "label": { + "center": "", + "left": "", + "right": "" + }, + "placeholder": { + "auto": "Otomatik" + } + }, + "button-style-editor": { + "label-variant": "Değişken" + }, + "canvas-context-menu": { + "close-editor": "", + "open-editor": "", + "render-menu-items": { + "add-item-menu-item": { + "label-add-item": "" + }, + "edit-element-menu-item": { + "label-edit": "Düzenle" + }, + "label-bring-to-front": "", + "label-delete": "Sil", + "label-duplicate": "Çoğalt", + "label-send-to-back": "", + "set-background-menu-item": { + "label-set-background": "" + } + } + }, + "cloud-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Otomatik" + } + }, + "ellipse-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Otomatik" + } + }, + "inline-edit": { + "canvas-inline-editor": "", + "tooltip-close-inline-editor": "" + }, + "inline-edit-body": { + "label-add-item": "", + "please-select-an-element": "" + }, + "line-style-editor": { + "label-animate": "" + }, + "metric-value-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Otomatik" + } + }, "not-found-display": { "not-found": "<0>Bulunamadı: </0><config />" }, + "pan-zoom-help": { + "ctrl-right-mouse": "", + "middle-mouse": "", + "pan-title": "", + "reset-double-click": "", + "title-pan-and-zoom-controls": "", + "zoom-scroll-wheel": "" + }, + "parallelogram-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Otomatik" + } + }, + "params-editor": { + "aria-label-add": "Ekle", + "aria-label-delete": "Sil", + "placeholder-key": "Anahtar", + "placeholder-value": "Değer" + }, + "placement-editor": { + "label-constraints": "", + "label-position": "", + "loading": "Yükleniyor..." + }, + "quick-positioning": { + "tooltip-align-bottom": "", + "tooltip-align-horizontal-centers": "", + "tooltip-align-left": "", + "tooltip-align-right": "", + "tooltip-align-top": "", + "tooltip-align-vertical-centers": "" + }, + "rectangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Otomatik" + } + }, "text-display": { "double-click-to-set": "Metni ayarlamak için çift tıklayın" + }, + "text-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Otomatik" + } + }, + "tree-navigation-editor": { + "clear-selection": "Seçimi temizle", + "frame-selection": "", + "label-add-item": "", + "missing-layer": "", + "no-settings": "", + "switcher-icon": { + "title-node-icon": "" + } + }, + "tree-node-title": { + "title-duplicate": "Çoğalt", + "title-remove": "Kaldır", + "tooltip-duplicate": "Çoğalt", + "tooltip-remove": "Kaldır" + }, + "triangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "Otomatik" + } } }, "carousel": { @@ -2981,6 +3590,22 @@ } }, "connections": { + "add-new-connection": { + "filter-by-options": { + "label": { + "all": "Tümü", + "installed": "Yüklü", + "new-updates": "" + } + }, + "label": { + "by-downloads": "", + "by-name-az": "", + "by-name-za": "", + "by-published-date": "", + "by-updated-date": "" + } + }, "advisor-redirect-notice": { "aria-label-link-to-advisor": "Advisor bağlantısı", "body": "Veri kaynaklarınız ve eklentilerinizle ilgili olası sorunları keşfetmek için yeni Advisor'ı deneyin.", @@ -2997,6 +3622,22 @@ "body": "Veri kaynakları taşındı! Ana menüden erişilebilen Bağlantılar sayfasında yeni veri kaynaklarını keşfedebilir veya mevcutları yönetebilirsiniz.", "go-to-connections": "Bağlantılara git" }, + "data-source-details-page": { + "subTitle": { + "datasource-could-found": "" + }, + "text": { + "unknown-datasource": "" + } + }, + "new-data-source-page": { + "subTitle": { + "choose-a-data-source-type": "" + }, + "text": { + "add-data-source": "Veri kaynağı ekle" + } + }, "no-access-modal": { "connection-contact-grafana-admin": "Yeni bağlantı eklemek için Grafana yöneticinizle iletişime geçin.", "editor-warning": "Editörler yeni bağlantılar ekleyemez. Bağlantının zaten <2>Veri Kaynakları</2>'nda yapılandırılmış olup olmadığını kontrol edebilirsiniz.", @@ -3009,6 +3650,18 @@ "search": { "aria-label-search-all": "Tümünü ara", "placeholder": "Tümünü ara" + }, + "use-data-source-settings-nav": { + "node": { + "subTitle": { + "data-source-error": "" + } + }, + "page-nav": { + "text": { + "data-source-nav-node": "" + } + } } }, "core": { @@ -3304,6 +3957,11 @@ "title-plugin-dashboard": "Eklenti panosu" }, "dash-nav": { + "on-open-snapshot-original": { + "title": { + "proceed-to-external-site": "" + } + }, "render-left-actions": { "text-public": "Herkese açık", "tooltip-view-as-scene": "Sahne olarak görüntüle" @@ -3315,11 +3973,26 @@ "dashboard-loading": { "cancel-loading-dashboard": "Pano yüklemesini iptal et" }, + "dashboard-page-error": { + "text": { + "not-found": "Bulunamadı" + } + }, "dashboard-settings": { "actions": { "close": "Kapat" } }, + "dashboard-slice": { + "title": { + "dashboard-init-failed": "" + } + }, + "dashboard-srv": { + "message": { + "edit-dashboard-json": "" + } + }, "dashboard-validation": { "body-dashboard-failed-schema-validation": "Doğrulama geliştirme amaçlı sağlanmıştır ve göz ardı edilmesi güvenlidir. Grafana geliştiricisiyseniz pano şemasını kontrol edip güncellemeyi düşünün", "title-checking-dashboard-validity": "Pano geçerliliği kontrol ediliyor", @@ -3415,6 +4088,13 @@ "values": "Virgülle ayrılmış değerler", "values-placeholder": "1, 10, anahtarım : değerim, değerim, kaçırılmış, değer" }, + "datasource-options": { + "name-filter": "", + "name-filter-description": "", + "name-filter-placeholder": "", + "type": "Tür", + "type-placeholder": "" + }, "description": "Açıklama", "description-placeholder": "Açıklayıcı metin", "label": "Etiket", @@ -3433,8 +4113,8 @@ "category": "Seçim ayarları", "custom-all-value": "Özel tüm değer", "custom-all-value-description": "Tümünü temsil etmek için bir joker karakterli regex (düzenli ifade) veya başka bir değer", - "include-all": "Tümünü Dahil Et seçeneği", - "include-all-description": "Tüm değerleri dahil etme seçeneğini etkinleştirir", + "include-all": "", + "include-all-description": "", "multi-value": "Çoklu değer" }, "type-category": "{{type}} seçenekleri" @@ -3460,14 +4140,97 @@ "errors": { "failed-to-load": "Pano yüklenemedi" }, + "fetch-dashboard": { + "message": { + "failed-to-fetch-dashboard": "" + } + }, "gen-aihistory": { "aria-label-send-custom-feedback": "Özel geri bildirim gönder", "footer-text": "Bu içerik <2>Grafana LLM eklentisi</2> kullanılarak yapay zekâ ile oluşturulmuştur", "placeholder-tell-ai-what-to-do-next": "Yapay zekaya bir sonraki adımı söyleyin..." }, + "general-settings-unconnected": { + "editable-options": { + "label": { + "editable": "Düzenlenebilir", + "readonly": "" + } + } + }, + "get-debug-dashboard": { + "title": { + "annotations": "Ek açıklamalar" + } + }, + "get-errors": { + "message": { + "error-loading-data": "" + } + }, "get-field-override-categories": { "label-add-field-override": "Alan geçersiz kılma ekle", - "label-add-override-property": "Geçersiz kılma özelliği ekle" + "label-add-override-property": "Geçersiz kılma özelliği ekle", + "title": { + "add-button": "" + } + }, + "get-library-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "Bilgi", + "name": "Ad" + } + }, + "get-library-viz-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "Bilgi", + "name": "Ad" + } + }, + "get-panel-editor-tabs": { + "text": { + "alert": "", + "query": "Sorgu", + "transform-data": "" + } + }, + "get-panel-frame-category": { + "descriptor": { + "title": { + "panel-options": "Panel seçenekleri" + } + }, + "direction-options": { + "label": { + "horizontal": "Yatay", + "vertical": "Dikey" + } + }, + "title": { + "description": "Açıklama", + "max-per-row": "Satır başına maksimum", + "panel-links": "Panel bağlantıları", + "repeat-by-variable": "Değişkene göre tekrar et", + "repeat-direction": "Tekrar yönü", + "repeat-options": "Tekrarlama seçenekleri", + "title": "Başlık", + "transparent-background": "Şeffaf arka plan" + } + }, + "get-panel-menu": { + "text": { + "extensions": "" + } }, "help-wizard": { "copy-to-clipboard": "Panoya kopyala", @@ -3480,10 +4243,21 @@ "randomize-field-names-label-field-names": "Alan adları", "randomize-labels-label-labels": "Etiketler", "randomize-string-values-label-string-values": "Dize değerleri", + "tabs": { + "label": { + "data": "Veri", + "snapshot": "Anlık görüntü" + } + }, "title-complete-git-hub-comment-clipboard": "Tam bir GitHub yorumunu panoya kopyala", "title-get-help-with-this-panel": "Bu panel için yardım al", "troubleshooting-docs": "Sorun giderme belgeleri" }, + "init-dashboard": { + "message": { + "failed-create-dashboard-model": "" + } + }, "inspect": { "data-tab": "Veri", "error-tab": "Hata", @@ -3536,6 +4310,16 @@ "rows": "Toplam satır sayısı", "table-title": "İstatistikler" }, + "k8s-dashboard-api": { + "title": { + "deleted": "" + } + }, + "k8s-dashboard-v2api": { + "title": { + "deleted": "" + } + }, "layout": { "common": { "copy": "Kopyala", @@ -3548,6 +4332,13 @@ "panel-layout-disabled": "Panel düzeni seçeneklerini değiştirmek için bir satır veya sekme seçin" } }, + "legacy-dashboard-api": { + "fetch-error": { + "message": { + "dashboard-not-found": "" + } + } + }, "make-editable": { "dashboard-not-editable": "Pano düzenlenemiyor", "make-editable": "Düzenlenebilir hâle getir" @@ -3567,6 +4358,20 @@ "menu-use-library-panel": "Kütüphane panelini kullan" }, "new-panel-title": "Yeni panel", + "on-create-new-row": { + "new-row": { + "title": { + "row-title": "" + } + } + }, + "on-create-new-widget-panel": { + "new-panel": { + "title": { + "widget-title": "" + } + } + }, "options": { "description": "Açıklama", "title-option": "Başlık" @@ -3626,6 +4431,30 @@ "paused": "Bu pano yönetici tarafından duraklatıldı", "try-again-later": "Daha sonra tekrar deneyin" }, + "remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, + "repeat-row-select": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, + "repeat-row-select2": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, "revert-dashboard-modal": { "body-restore-version": "Panoyu {{version}} sürümüne geri yüklemek istediğinize emin misiniz? Kaydedilmemiş tüm değişiklikler kaybolacaktır.", "title-restore-version": "Sürümü geri yükle" @@ -3739,6 +4568,18 @@ "sub-menu-un-connected": { "aria-label-template-variables": "Şablon değişkenleri" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "tabs-layout": { "delete-tab-text": "Bu sekme silindiğinde tüm paneller de kaldırılacak. Devam etmek istediğinizden emin misiniz?", "delete-tab-title": "Sekme silinsin mi?", @@ -3944,7 +4785,10 @@ }, "unthemed-dashboard-row": { "aria-label-delete-row": "Satırı sil", - "learn-more": "Daha fazla bilgi edinin" + "learn-more": "Daha fazla bilgi edinin", + "title": { + "delete-row": "Satırı sil" + } }, "validation": { "invalid-dashboard-id": "Geçerli bir Grafana.com kimliği bulunamadı", @@ -3979,6 +4823,16 @@ }, "visualization-select-pane": { "placeholder-search-for": "Ara...", + "radio-options": { + "description": { + "reusable-panels-share-between-multiple-dashboards": "" + }, + "label": { + "library-panels": "Kütüphane panelleri", + "suggestions": "", + "visualizations": "" + } + }, "title-close": "Kapat" }, "viz-panel": { @@ -4029,12 +4883,25 @@ "label-data-source": "Veri kaynağı", "label-use-static-key-dimensions": "Statik anahtar boyutları kullan" }, + "add-to-dashboard": { + "message": { + "could-navigate-selected-dashboard-please-again": "", + "could-panel-dashboard-please-again": "" + } + }, "add-to-dashboard-form": { "cancel": "İptal", "description-choose-where-to-add-the-panel": "Panelin nereye ekleneceğini seçin.", "description-select-which-dashboard-panel-created": "Panelin hangi panoda oluşturulacağını seçin.", + "label": { + "existing-dashboard": "Mevcut pano", + "new-dashboard": "Yeni pano" + }, "label-dashboard": "Pano", "label-target-dashboard": "Hedef panosu", + "message": { + "this-field-is-required": "Bu alan gereklidir." + }, "open-dashboard": "Panoyu aç", "open-in-new-tab": "Yeni sekmede aç", "title-error-adding-the-panel": "Panel eklenirken hata oluştu" @@ -4072,6 +4939,25 @@ "it-cannot-contain-or": "\"//\" ya da \"..\" içeremez.", "least-valid-character": "En az bir geçerli karakter içermelidir." }, + "build-new-dashboard-save-model": { + "data": { + "title": { + "new-dashboard": "Yeni pano" + } + } + }, + "build-new-dashboard-save-model-v2": { + "data": { + "title": { + "new-dashboard": "Yeni pano" + } + } + }, + "config-public-dashboard": { + "title": { + "revoke-public-url": "Herkese açık URL'yi iptal et" + } + }, "constant-variable-form": { "constant-options": "Sabit seçenekler", "label-value": "Değer", @@ -4119,22 +5005,89 @@ "value-not-saved": "Değer henüz Grafana veri tabanına kaydedilmedi", "view-pull-request-in-git-hub": "GitHub'da çekme isteğini görüntüle" }, + "dashboard-scene": { + "text": { + "edit-panel": "", + "view-panel": "Paneli görüntüle" + }, + "title": { + "dashboard": "Pano", + "discard-changes-to-dashboard": "" + } + }, + "dashboard-scene-page-state-manager": { + "message": { + "dashboard-not-found": "" + } + }, + "dashboard-scene-page-state-manager-v2": { + "message": { + "dashboard-not-found": "" + } + }, "data-source-variable-form": { "data-source-options": "Veri kaynağı seçenekleri", "description-instance-name-filter": "Değişken değer listesinde hangi veri kaynağı örneklerinin seçileceğini belirlemek için regex (düzenli ifade) filtresi. Tümü için boş bırakın.", "example-instance-name-filter": "Örnek: <codeExample />", "selection-options": "Seçim ayarları" }, + "default-grid-layout-manager": { + "row": { + "title": { + "row-title": "" + } + } + }, "description-label": { "description": "Açıklama" }, + "edit-link-view": { + "edit-link-page-nav": { + "text": { + "edit-link": "Bağlantıyı düzenle" + } + } + }, "email-list": { "aria-label-emailmenu": "E-posta menüsünü aç/kapat" }, + "embedded-dashboard-test-page": { + "subTitle": { + "showing-dashboard-panel-tests-pie-chart": "" + }, + "text": { + "embedding-dashboard": "" + } + }, "empty-transformations-message": { "add-transformation": "Dönüşüm ekle" }, + "get-edit-options": { + "title": { + "column-options": "", + "row-height-options": "" + } + }, + "get-panel-frame-options": { + "descriptor": { + "title": { + "panel-options": "Panel seçenekleri" + } + }, + "title": { + "description": "Açıklama", + "panel-links": "Panel bağlantıları", + "title": "Başlık", + "transparent-background": "Şeffaf arka plan" + } + }, + "get-workflow-options": { + "label": { + "push-to-a-new-branch": "" + } + }, "group-by-variable-form": { + "alert-not-supported": "", "description-enables-users-custom-values": "Kullanıcıların listeye özel değerler eklemesine olanak tanır", "description-provide-dimensions-as-csv-dimension-name-dimension-id": "Boyutları CSV biçiminde girin: {{name}}, {{value}}", "group-by-options": "Seçeneklere göre grupla", @@ -4153,6 +5106,12 @@ "randomize-field-names-label-field-names": "Alan adları", "randomize-labels-label-labels": "Etiketler", "randomize-string-values-label-string-values": "Dize değerleri", + "tabs": { + "label": { + "data": "Veri", + "snapshot": "Anlık görüntü" + } + }, "title-complete-git-hub-comment-clipboard": "Tam bir GitHub yorumunu panoya kopyala", "title-get-help-with-this-panel": "Bu panel için yardım al", "troubleshooting-docs": "Sorun giderme belgeleri", @@ -4195,6 +5154,14 @@ "body-name-already-exists": "Seçilen klasörde aynı isimde bir pano zaten mevcut. Yine de bu panoyu kaydetmek istiyor musunuz?", "title-name-already-exists": "Bu ad zaten mevcut" }, + "on-remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, "panel-data-alerting-tab-rendered": { "alert": { "title-errors-loading-rules": "Kurallar yüklenirken hata oluştu" @@ -4216,6 +5183,11 @@ "table-view-aria-label-toggletableview": "Tablo görünümünü aç/kapat", "table-view-label-table-view": "Tablo görünümü" }, + "panel-editor": { + "text": { + "edit-panel": "" + } + }, "panel-editor-renderer": { "aria-label-open-options-pane": "Seçenekler bölmesini aç", "tooltip-open-options-pane": "Seçenekler bölmesini aç" @@ -4224,8 +5196,22 @@ "body-panel-plugin-not-loaded": "İncelemek istediğiniz panelin görünür ve görüntülenmiş olduğundan emin olun.", "title-panel-plugin-not-loaded": "Panel eklentisi yüklenmedi" }, + "panel-menu-behavior": { + "async-func": { + "text": { + "extensions": "", + "metrics-drilldown": "" + } + } + }, "panel-viz-type-picker": { "placeholder-search-for": "Ara...", + "radio-options": { + "label": { + "suggestions": "", + "visualizations": "" + } + }, "title-close": "Kapat" }, "provisioned-delete-modal": { @@ -4252,6 +5238,15 @@ "query-options": "Sorgu seçenekleri", "selection-options": "Seçim ayarları" }, + "resource-export": { + "label": { + "classic": "", + "json": "JSON", + "v1-resource": "", + "v2-resource": "", + "yaml": "" + } + }, "revert-dashboard-modal": { "body-restore-version": "Panoyu {{version}} sürümüne geri yüklemek istediğinize emin misiniz? Kaydedilmemiş tüm değişiklikler kaybolacaktır.", "title-restore-version": "Sürümü geri yükle" @@ -4360,6 +5355,18 @@ "solo-panel-page": { "loading": "Yükleniyor" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "text-box-variable-form": { "placeholder-default-value-if-any": "(isteğe bağlı)", "text-options": "Metin seçenekleri" @@ -4370,6 +5377,13 @@ "title-field-label": { "title": "Başlık" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "transformations-drawer": { "search-box-suffix": { "tooltip-clear-search": "Aramayı temizle" @@ -4385,6 +5399,13 @@ "save-dashboard": "Panoyu kaydet", "title-unsaved-changes": "Kaydedilmemiş değişiklikler" }, + "use-dashboard-edit-page-nav": { + "page-nav": { + "text": { + "settings": "Ayarlar" + } + } + }, "variable-check-indicator": { "aria-label-variable-referenced-dashboard": "Bu değişken başka bir değişken veya pano tarafından referans alınmıyor.", "aria-label-variable-referenced-other-variables-dashboard": "Bu değişkene diğer değişkenler veya panolar tarafından başvuruluyor.", @@ -4401,7 +5422,10 @@ "placeholder-descriptive-text": "Açıklayıcı metin", "placeholder-label-name": "Etiket adı", "placeholder-variable-name": "Değişken adı", - "text-running-query": "Sorgu çalıştırılıyor..." + "text-running-query": "Sorgu çalıştırılıyor...", + "title": { + "delete-variable": "Değişkeni sil" + } }, "variable-editor-list": { "definition": "Tanım", @@ -4583,6 +5607,25 @@ "message": "Veri kaynağı bulunamadı" } }, + "datagrid": { + "add-column": { + "placeholder-column-name": "" + }, + "datagrid-context-menu": { + "render-context-menu-items": { + "label-clear-column": "", + "label-clear-row": "", + "label-remove-all-data": "", + "label-search": "Ara..." + }, + "render-header-menu-items": { + "label-clear-column": "", + "label-delete-column": "", + "label-rename-column": "", + "label-set-field-type": "" + } + } + }, "datasources": { "add-new-data-source-button": { "tooltip-no-permission": "Yeni veri kaynaklarını yapılandırma izniniz yok" @@ -4604,6 +5647,46 @@ "label-default": "Varsayılan", "label-name": "Ad" }, + "build-categories": { + "categories": { + "title": { + "cloud": "", + "distributed-tracing": "", + "enterprise-plugins": "Kurumsal eklentiler", + "industrial-io-t": "", + "logging-document-databases": "", + "others": "", + "profiling": "", + "sql": "", + "time-series-databases": "" + } + } + }, + "build-nav-model": { + "analytics": { + "text": { + "insights": "İçgörüler" + } + }, + "caching": { + "text": { + "cache": "" + } + }, + "ds-permissions": { + "text": { + "permissions": "İzinler" + } + }, + "nav-model": { + "text": { + "settings": "Ayarlar" + } + }, + "text": { + "dashboards": "Panolar" + } + }, "button-row": { "delete": "Sil", "save-and-test": "Kaydet ve test et", @@ -4639,6 +5722,11 @@ "data-source-read-only-message": { "title-provisioned-data-source": "Sağlanan veri kaynağı" }, + "data-source-settings-reducer": { + "message": { + "testing-could-couple-minutes": "" + } + }, "data-source-type-card": { "aria-label-learn-more": "{{dataSourcePluginName}}, daha fazla bilgi edinin." }, @@ -4656,13 +5744,88 @@ "footer": { "add-csv-or-spreadsheet": "CSV veya elektronik tablo ekle" }, + "get-enterprise-phantom-plugins": { + "description": { + "adobe-analytics-datasource": "", + "app-dynamics-integration-and-data-source": "", + "atlassian-statuspage-datasource": "", + "aurora-data-source": "", + "azure-cosmos-db-datasource": "", + "azure-devops-datasource": "", + "catchpoint-datasource": "", + "cloudflare-datasource": "", + "cockroach-db-datasource": "", + "data-dog-integration-and-data-source": "", + "drone-datasource": "", + "git-lab-integration-and-datasource": "", + "honeycomb-integration-and-datasource": "", + "jira-integration-and-datasource": "", + "logic-monitor-devices-datasource": "", + "mongo-db-integration-and-data-source": "", + "netlify-datasource": "", + "new-relic-integration-and-data-source": "", + "pager-duty-datasource": "", + "salesforce-integration-and-datasource": "", + "sap-hana-integration-and-data-source": "", + "service-now-integration-and-data-source": "", + "signal-fx-integration-and-datasource": "", + "snowflake-integration-and-data-source": "", + "sumo-logic-integration-and-datasource": "", + "visualize-and-explore-dynatrace-data": "", + "visualize-and-explore-oracle-sql": "", + "visualize-and-explore-splunk-logs": "", + "wavefront-integration-and-data-source": "", + "zendesk-datasource": "" + } + }, + "get-grafana-cloud-phantom-plugin": { + "description": { + "hosted-graphite-prometheus-and-loki": "" + } + }, "new-data-source-view": { "cancel": "İptal", "placeholder-filter-by-name-or-type": "Ada veya türe göre filtrele" }, + "update-data-source": { + "error-info": { + "message": { + "an-unexpected-error-occurred": "" + } + } + }, "use-data-source-info": { "badge-text-not-supported": "Desteklemiyor", - "badge-text-supported": "Destekli" + "badge-text-supported": "Destekli", + "label": { + "alerting": "Uyarı sistemi", + "type": "Tür" + } + }, + "use-delete-loaded-data-source": { + "title": { + "delete": "Sil" + } + } + }, + "debug": { + "cursor-view": { + "no-events-yet": "" + }, + "render-info-viewer": { + "data-counter": "", + "elapsed-time": "", + "field": "Alan", + "last": "", + "render-counter": "", + "schema-counter": "", + "title-reset-counters": "", + "tooltip-step-back": "", + "type": "Tür" + }, + "state-view": { + "current-value": "", + "label-state-name": "" } }, "dimensions": { @@ -4731,6 +5894,19 @@ "remove-value-mapping-aria-label-delete-value-mapping": "Değer eşlemesini sil", "remove-value-mapping-tooltip-delete": "Sil", "set-color": "Renk seçin", + "special-match-options": { + "description": { + "boolean-false-values": "", + "boolean-true-values": "", + "empty-string": "", + "matches-against-number-na-n-not-a-number": "", + "matches-null-and-undefined-values": "", + "matches-null-undefined-and-na-n": "" + }, + "label": { + "empty": "Boş" + } + }, "tooltip-remove-color": "Rengi kaldır", "tooltip-remove-icon": "Simgeyi kaldır" }, @@ -4746,6 +5922,20 @@ "display-text": "Gösterilecek metin", "icon": "Simge", "label-add-a-new-mapping": "Yeni eşleme ekle", + "mapping-types": { + "description": { + "match-a-numerical-range-of-values": "", + "match-a-regular-expression-with-replacement": "", + "match-a-specific-text-value": "", + "match-boolean-empty-values": "" + }, + "label": { + "range": "", + "regex": "", + "special": "", + "value": "Değer" + } + }, "update": "Güncelle" } }, @@ -4770,6 +5960,7 @@ }, "explore": { "accordian-logs": { + "events": "", "footer": "Olay zaman damgaları, tam izlemenin başlangıç zamanına göredir." }, "accordian-references": { @@ -4780,6 +5971,11 @@ "basic-extensions": { "aria-label-add": "Ekle" }, + "build-dashboard-panel-from-explore-state": { + "title": { + "new-panel": "" + } + }, "clear": "Temizle", "confirm-navigation-modal": { "cancel": "İptal et", @@ -4866,6 +6062,33 @@ "title-table": "Tablo", "title-traces": "İzler" }, + "explore-query-inspector": { + "data-tab": { + "label": { + "data": "Veri" + } + }, + "error-tab": { + "label": { + "error": "Hata" + } + }, + "json-tab": { + "label": { + "json": "JSON" + } + }, + "query-tab": { + "label": { + "query": "Sorgu" + } + }, + "stats-tab": { + "label": { + "stats": "İstatistikler" + } + } + }, "explore-run-query-button": { "run-button": { "aria-label-run-query-options": "Sorgu çalıştırma seçenekleri" @@ -4879,10 +6102,23 @@ "description-explore-disabled": "Keşfet özelliğini etkinleştirmek için Grafana yapılandırmasında etkinleştirin:", "title-explore-disabled": "Keşfet özelliği devre dışı" }, + "get-field-links-for-explore": { + "text": { + "data": "Veri", + "raw-value": "" + } + }, "get-matches-metadata": { "matches": "0 eşleşme" }, "legacy-create-span-link-factory": { + "text": { + "tags": "Etiketler" + }, + "title": { + "related-logs": "", + "session-for-this-span": "Bu zaman aralığı için oturum" + }, "title-explore-metrics-for-this-span": "Bu zaman aralığı için metrikleri keşfedin", "title-explore-split": "Bunun için günlük kayıtlarını bölünmüş görünümde keşfedin", "title-session-for-this-span": "Bu zaman aralığı için oturum" @@ -4923,6 +6159,10 @@ }, "logs-meta-row": { "download": "İndir", + "label": { + "deduplication-count": "", + "showing-only-selected-fields": "" + }, "show-original-line": "Orijinal satırı göster" }, "logs-sample-panel": { @@ -5104,6 +6344,21 @@ "run-query-button": "Sorgu çalıştır", "switch-datasource-button": "Veri kaynağını değiştir ve sorgu çalıştır" }, + "scoped-vars-from-span": { + "text": { + "span": "" + } + }, + "scoped-vars-from-tags": { + "text": { + "tags": "Etiketler" + } + }, + "scoped-vars-from-trace": { + "text": { + "trace": "İz" + } + }, "search-bar-input": { "placeholder-find": "Bul...", "suffix": { @@ -5138,9 +6393,25 @@ "tooltip-tag-key": "Etiket değerini almak için kullanılacak etiket anahtarı. Bir zamanın öznitelikleri ve kaynakları etiket anahtarı için taranacaktır." }, "span-detail": { + "label": { + "kind": "", + "library-name": "", + "library-version": "", + "status": "Durum:", + "status-message": "", + "trace-state": "" + }, "label-resource-attributes": "Kaynak öznitelikleri", "label-span-attributes": "Zaman aralığı öznitelikleri", "label-stack-trace": "Yığın izleme", + "overview-items": { + "label": { + "child-count": "", + "duration": "", + "service": "", + "start-time": "" + } + }, "warnings": "Uyarılar" }, "span-filters": { @@ -5247,6 +6518,18 @@ "title-node-graph": "Düğüm grafiği" }, "unthemed-logs": { + "description": { + "show-results-in-logs-visualisation": "", + "show-results-in-table-visualisation": "", + "show-results-newest-to-oldest": "", + "show-results-oldest-to-newest": "" + }, + "label": { + "logs": "Günlük kayıtları", + "newest-first": "Yeniden eskiye", + "oldest-first": "Eskiden yeniye", + "table": "Tablo" + }, "label-deduplication": "Yinelenenleri kaldırma", "label-display-results": "Sonuçları görüntüle", "label-prettify-json": "JSON'u düzenle", @@ -5262,6 +6545,15 @@ }, "unthemed-virtualized-trace-view": { "title-scroll-to-top": "Başa dön" + }, + "use-focus-span-link": { + "create-focus-span-link": { + "link": { + "title": { + "deep-link-to-this-span": "" + } + } + } } }, "export": { @@ -5347,6 +6639,15 @@ "folder-repo": { "badge-text": "Sağlanan" }, + "folders": { + "get-loading-nav": { + "main": { + "title": { + "loading": "Yükleniyor" + } + } + } + }, "forgot-password": { "back-button": "Giriş yapmaya geri dön", "change-password": { @@ -5376,10 +6677,102 @@ "incomplete-request-error": "Ne yazık ki isteğiniz gerçekleştirilemedi. Lütfen tekrar deneyin.", "send-custom-feedback": "Gönder" }, + "geomap": { + "coordinates-map-view-editor": { + "label-latitude": "", + "label-longitude": "" + }, + "debug-overlay": { + "center": "", + "zoom": "" + }, + "fit-map-view-editor": { + "all-layers-editor-fragment": { + "label-layer": "" + }, + "label-data": "Veri", + "last-only-editor-fragment": { + "label-padding": "", + "tooltip-padding-relative-percent-beyond-extent": "" + } + }, + "frame-multi-selection-editor": { + "placeholder-change-filter": "" + }, + "frame-selection-editor": { + "placeholder-change-filter": "" + }, + "geomap-panel": { + "aria-label-map": "" + }, + "geomap-style-rules-editor": { + "aria-label-add-geomap-style-rule": "" + }, + "layers-editor": { + "label-add-layer": "", + "no-layers": "" + }, + "map-view-editor": { + "label-max-zoom": "", + "label-view": "Görüntüle", + "label-zoom": "Yakınlaştır", + "use-current-map-settings": "" + }, + "markers-legend": { + "title-symbol": "Sembol" + }, + "measure-overlay": { + "tooltip-show-measure-tools": "" + }, + "plugin": { + "basemap-layer-configured-server-admin": "" + }, + "style-editor": { + "label-align": "", + "label-baseline": "", + "label-color": "Renk", + "label-fill-opacity": "", + "label-font-size": "", + "label-opacity": "", + "label-rotation-angle": "", + "label-size": "", + "label-symbol": "Sembol", + "label-symbol-horizontal-align": "", + "label-symbol-vertical-align": "", + "label-text-label": "", + "label-x-offset": "", + "label-y-offset": "" + }, + "style-rule-editor": { + "aria-label-comparison-operator": "Karşılaştırma işleci", + "aria-label-comparison-value": "", + "aria-label-delete-style-rule": "", + "aria-label-feature-property": "", + "label-rule": "Kural", + "placeholder-feature-property": "", + "placeholder-numeric-value": "", + "placeholder-value": "değer" + } + }, "get-enterprise": { "requires-license": "Grafana Enterprise lisansı gerektirir", "title": "Enterprise" }, + "gettingstarted": { + "docs-card": { + "complete": "tamamlandı", + "learn-how": "" + }, + "getting-started": { + "aria-label-to-advanced-tutorials": "", + "aria-label-to-basic-tutorials": "", + "checking-completed-setup-steps": "", + "remove-this-panel": "" + }, + "tutorial-card": { + "complete": "tamamlandı" + } + }, "gops": { "config-card": { "text-loading-configuration": "Yapılandırma yükleniyor..." @@ -5396,6 +6789,74 @@ }, "progress-status": { "your-progress": "İlerleme durumunuz" + }, + "use-get-configuration-for-ui": { + "get-connect-data-source-configuration": { + "title": { + "connect-data-source": "" + } + }, + "title": { + "essentials": "Temel özellikler" + } + }, + "use-get-essentials-configuration": { + "essential-content": { + "description": { + "configure-grafana-alerting": "", + "create-integration-alerting-contact-point": "", + "initialize-incident-plugin-declare-manage-incidents": "", + "practice-solving-an-incident": "", + "receive-alerts-oncall-notifications-within-environment": "", + "select-chat-ops-channels-to-route-notifications": "" + }, + "label": { + "add": "Ekle", + "connect": "Bağlan", + "initialize": "", + "select-integration": "", + "start-drill": "" + }, + "title": { + "add-slack-notifications-to-irm-integrations": "", + "connect-alerting-to-irm": "", + "connect-irm-to-your-slack-workspace": "", + "connect-your-messaging-workspace-to-incident": "", + "connect-your-messaging-workspace-to-on-call": "", + "create-incident-drill": "", + "detect": "Algılama", + "initialize-incident-plugin": "", + "messaging-workspace-channel-on-call-integration": "", + "respond": "", + "test-your-configuration": "" + } + }, + "get-grafana-alerting-config-steps": { + "description": { + "create-alert-monitor-system": "", + "create-on-call-integration-alerting-contact-point": "", + "create-slos-to-monitor-your-service": "" + }, + "label": { + "connect": "Bağlan", + "create": "Oluştur", + "enable": "Etkinleştir" + }, + "steps": { + "label": { + "edit": "Düzenle" + }, + "title": { + "update-default-contact-point": "" + } + }, + "title": { + "connect-alerting-to-on-call": "", + "create-alert-rule": "", + "create-slo": "", + "enable-slo-alerting": "" + } + } } }, "grafana": { @@ -5762,14 +7223,18 @@ "duplicate-panel": "Paneli çoğalt", "exit-edit/setting-views": "Düzenleme/ayar görünümlerinden çık", "expand-all-rows": "Tüm satırları genişlet", + "explore-panel": "", "go-to-dashboards": "Panolara git", "go-to-explore": "Keşfet'e git", "go-to-home-dashboard": "Ana Sayfa Panosuna git", "go-to-profile": "Profile git", + "inspect-panel": "", "make-time-range-permanent": "Zaman aralığını mutlak/kalıcı yap", "move-time-range-back": "Zaman aralığını geri al", "move-time-range-forward": "Zaman aralığını ileri al", "open-search": "Aramayı aç", + "open-share-embed-drawer": "", + "open-share-link-drawer": "", "open-shared-modal": "Panel anlık görüntüsünü paylaş", "paste-time-range": "Zaman aralığını yapıştır", "refresh-all-panels": "Tüm panelleri yenile", @@ -5795,6 +7260,11 @@ "support-bundle": "<1>Destek paketleri bölümünden</1>, Grafana örneğiniz ve yapılandırılmış veri kaynakları hakkında bilgi içeren bir destek paketi de alabilirsiniz.", "troubleshooting-help": "Sorun giderme yardımı istemek için bu panelin anlık görüntüsünü Grafana Labs Teknik Destek ekibine gönderin. Anlık görüntü, sorgu yanıt verilerini ve panel ayarlarını içerir." }, + "histogram": { + "histogram-panel": { + "no-histogram-found-in-response": "" + } + }, "inspector": { "inspect-data-tab": { "loading": "Yükleniyor", @@ -5844,6 +7314,9 @@ "label-name": "Ad", "label-password": "Parola", "label-username": "Kullanıcı adı", + "message": { + "email-is-invalid": "" + }, "placeholder-name-optional": "Ad (isteğe bağlı)", "placeholder-password": "Parola", "placeholder-username": "Kullanıcı adı", @@ -6103,8 +7576,26 @@ "discard-local-changes": "Yerel değişiklikleri sil", "title-dashboard-changed": "Pano değiştirildi" }, + "live-channel-editor": { + "description-grafana-live": "", + "namespace": "Ad alanı", + "path": "Yol", + "placeholder-select-watchable-resource": "", + "scope": "", + "title-grafana-live": "" + }, "live-connection-warning": { "title-connection-to-server-is-lost": "Sunucu bağlantısı kesildi..." + }, + "live-panel": { + "error": "Hata", + "grafana-requires-feature": "", + "panel-editor-channel": "", + "title-grafana-live": "", + "waiting-for-data": "" + }, + "live-publish": { + "publish": "" } }, "lock-icon": "kilit simgesi", @@ -6151,6 +7642,13 @@ } }, "logs": { + "get-dataframe-fields": { + "vars": { + "text": { + "labels": "Etiketler" + } + } + }, "infinite-scroll": { "end-of-range": "Seçilen zaman aralığının sonu.", "load-more": "Daha fazla yüklemek için kaydırın", @@ -6231,6 +7729,11 @@ "shortcut": "Yeniden etkinleştirmek için alt+select" } }, + "log-series-to-logs-model": { + "label": { + "total-bytes-processed": "" + } + }, "logs-controls": { "deduplication": "Yinelenenleri kaldırma", "disable-highlighting": "Vurgulamayı devre dışı bırak", @@ -6265,6 +7768,11 @@ "scroll-top": "En üste kaydır", "start-of-range": "Aralık başlangıcı" }, + "logs-panel": { + "render-common-labels": { + "common-labels": "" + } + }, "out-of-range-message": { "end-of-the-selected-time-range": "Seçilen zaman aralığının sonu." }, @@ -6321,6 +7829,14 @@ }, "snapshot-list-table": { "title-delete": "Sil" + }, + "unthemed-dashboard-import": { + "subTitle": { + "import-dashboard-from-file-or-grafanacom": "" + }, + "text": { + "import-dashboard": "Panoyu içe aktarın" + } } }, "migrate-to-cloud": { @@ -6978,8 +8494,57 @@ "close": "Çekmeceyi kapat" }, "link-title": "Grafana Labs bloguna git", + "news-panel": { + "body-error-loading-rss-feed": "", + "loading": "Yükleniyor...", + "title-error-loading-rss-feed": "" + }, "title": "Blog'tan son gönderiler" }, + "nodeGraph": { + "arc-options-editor": { + "add-arc": "", + "title-remove-arc": "" + }, + "edge": { + "aria-label-from-to": "" + }, + "edge-header": { + "label-source-target": "" + }, + "marker": { + "100-node-count": "", + "aria-label-hidden-marker": "", + "node-count_one": "", + "node-count_other": "" + }, + "node": { + "aria-label-node-title": "" + }, + "node-graph": { + "aria-label-layered-layout-performance-warning": "", + "aria-label-nodes-hidden-warning": "", + "computing-layout": "", + "no-data": "Veri yok", + "hidden-nodes_one": "", + "hidden-nodes_other": "", + "processed-nodes_one": "", + "processed-nodes_other": "" + }, + "node-graph-panel": { + "no-data-found-in-response": "" + }, + "node-header": { + "label-subtitle": "", + "label-title": "Başlık" + }, + "view-controls": { + "hide-config": "", + "show-config": "", + "title-zoom-in": "", + "title-zoom-out": "" + } + }, "notifications": { "empty-state": { "description": "Aldığınız bildirimler burada görünecek", @@ -7021,6 +8586,11 @@ "label-organization-name": "Kuruluş adı", "placeholder-org-name": "Kuruluş adı" }, + "org-details-page": { + "title": { + "confirm-preferences-update": "" + } + }, "org-profile": { "label-organization-name": "Kuruluş adı", "label-organization-profile": "Kuruluş profili", @@ -7040,7 +8610,10 @@ "tooltip": "Artık \"Temel rol yok\" seçeneğini seçebilir ve izinleri özel ihtiyaçlarınıza göre ekleyebilirsiniz. Daha fazla bilgi için <1>belgelerimize</1> göz atabilirsiniz." }, "user-invite-page": { - "sub-title": "Davet gönderin veya mevcut bir Grafana kullanıcısını <1> {{orgName}}</1> kuruluşuna ekleyin." + "sub-title": "Davet gönderin veya mevcut bir Grafana kullanıcısını <1> {{orgName}}</1> kuruluşuna ekleyin.", + "text": { + "invite-user": "" + } } }, "org-picker": { @@ -7052,6 +8625,38 @@ } }, "panel": { + "get-calculation-value-data-links-variable-suggestions": { + "value-calc-var": { + "label": { + "calculation-name": "" + } + } + }, + "get-data-links-variable-suggestions": { + "value-time-var": { + "label": { + "time": "Zaman" + } + } + }, + "get-field-links-supplier": { + "text": { + "data": "Veri", + "field": "Alan", + "series": "", + "value": "Değer" + } + }, + "get-field-vars": { + "label": { + "name": "Ad" + } + }, + "get-panel-links-variable-suggestions": { + "label": { + "all-variables": "" + } + }, "header-menu": { "copy": "Kopyala", "create-library-panel": "Kütüphane paneli oluştur", @@ -7112,6 +8717,13 @@ "select-placeholder": "Türe göre filtrele" }, "playlist": { + "playlist-new-page": { + "page-nav": { + "text": { + "new-playlist": "Yeni oynatma listesi" + } + } + }, "playlist-table-rows": { "aria-label-playlist-item": "Oynatma listesi ögesi, {{itemType}}, {{itemValue}}", "multiple-dashboards-found": "Birden fazla öge bulundu: {{items}}", @@ -7128,6 +8740,12 @@ "label-mode": "Mod", "label-time-and-refresh": "Zaman ve yenileme", "label-variables": "Değişkenler", + "modes": { + "label": { + "kiosk": "Kiosk", + "normal": "Normal" + } + }, "title-start-playlist": "Oynatma listesini başlat" } }, @@ -7194,6 +8812,19 @@ }, "browse": { "aria-label-plugin-type-filter": "Eklenti türü filtresi", + "filter-by-options": { + "label": { + "all": "Tümü", + "installed": "Yüklü", + "new-updates": "" + } + }, + "label": { + "all": "Tümü", + "applications": "", + "data-sources": "Veri kaynakları", + "panels": "Paneller" + }, "label-search": "Ara", "label-state": "Durum", "label-type": "Tür", @@ -7275,12 +8906,24 @@ "empty-state": { "message": "Eklenti bulunamadı" }, + "extensions-log-data-source": { + "message": { + "ok": "Tamam" + } + }, "filter": { "disabled": "Grafana sunucusu grafana.com'a erişilemediğinden bu filtre devre dışı bırakıldı.", "sort": "Sırala", "sort-list": "Eklenti Listesini Sırala", "state": "Durum" }, + "get-feature-state-info": { + "text": { + "alpha": "", + "beta": "Beta", + "deprecated": "Kullanımdan kaldırıldı" + } + }, "get-started-with-app": { "disable": "Devre dışı bırak", "enable": "Etkinleştir" @@ -7337,6 +8980,16 @@ "plugin-details-header-dependencies": { "grafana-dependency": "Grafana {{grafanaDependency}}" }, + "plugin-details-page": { + "not-found-model": { + "subTitle": { + "requested-belong-plugin": "" + }, + "text": { + "unknown-plugin": "" + } + } + }, "plugin-details-signature": { "body-invalid-plugin-signature": "Grafana Labs her eklentiyi geçerli bir dijital imzaya sahip olup olmadığını doğrulamak için kontrol eder. Eklenti imza doğrulaması, eklentilerin güvenli ve güvenilir olduğundan emin olmak için uyguladığımız güvenlik önlemlerinin bir parçasıdır. Grafana Labs, bu imzasız eklentinin bütünlüğünü garanti edemez. Eklenti geliştiricisinden imzalanması için başvurmasını isteyin.", "read-more-about-plugins-signing": "Eklenti imzalama hakkında daha fazla bilgi edinin.", @@ -7382,6 +9035,13 @@ "search-field": { "placeholder-search-grafana-plugins": "Grafana eklentilerini ara" }, + "use-plugin-details-tabs": { + "nav-model-children": { + "text": { + "dashboards": "Panolar" + } + } + }, "version-install-button": { "text-installed": "Yüklü" }, @@ -7499,6 +9159,11 @@ "label-git-hub-features": "GitHub özellikleri", "label-realtime-feedback": "Gerçek zamanlı geri bildirim" }, + "connect-page": { + "subTitle": { + "connect-external-storage-manage-resources": "" + } + }, "connect-repository-button": { "configure": "Yapılandır", "configure-file": "Dosya sağlamayı yapılandır", @@ -7532,7 +9197,13 @@ }, "edit-repository-page": { "back-to-repositories": "Depolara geri dön", - "repository-config-exists-configuration": "Depo yapılandırmasının yapılandırma dosyasında mevcut olduğundan emin olun." + "repository-config-exists-configuration": "Depo yapılandırmasının yapılandırma dosyasında mevcut olduğundan emin olun.", + "subTitle": { + "configure-repository-storing-resources": "" + }, + "text": { + "configure-repository": "" + } }, "empty-state": { "no-jobs": "İş yok..." @@ -7595,6 +9266,11 @@ "no-results-matching-your-query": "Sorgunuzla eşleşen sonuç yok", "placeholder-search": "Ara" }, + "get-default-values": { + "title": { + "repository": "Depo" + } + }, "getting-started": { "alert-temporary-outage": "Tüm örneğinizi bağladığınızda geçiş işlemi sırasında panolar kullanılamaz hale gelir. İşleme başlamadan önce kullanıcılarınızı bilgilendirmenizi öneririz.", "modal-description-public-access": "GitHub entegrasyonu için Grafana örneğinizde genel erişimi ayarlayın", @@ -7739,7 +9415,18 @@ "dashboard-preview": "Pano Ön İzlemesi", "existing-dashboard": "Mevcut pano", "history": "Geçmiş", + "message": { + "removed-from-repo-test-ui": "", + "updated-from-repo-test-ui": "" + }, "repository": "Depo", + "tab-info": { + "label": { + "dry-run-result-after-apply": "", + "existing-from-grafana": "", + "file-from-repository": "" + } + }, "title-error-saving-file": "Dosya kaydedilirken hata oluştu" }, "setup-modal": { @@ -8152,14 +9839,6 @@ "reload-button": "Yeniden yükle", "title": "Uygulama dosyası bulunamıyor" }, - "sandbox": { - "test-stuff-page": { - "application-notifications-toasts-testing": "Uygulama bildirimleri (toasts) testi", - "error": "Hata", - "success": "Başarılı", - "warning": "Uyarı" - } - }, "save-dashboards": { "message-length": { "info": "Mesaj {{messageLength}} karakter içerdiğinden maksimum 500 karakter sınırını aşıyor. Lütfen kaydetmeden önce kısaltın.", @@ -8219,6 +9898,14 @@ "view-as-folders": "Klasörlere göre görüntüle", "view-as-list": "Liste olarak görüntüle" }, + "bluge-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } + }, "dashboard-actions": { "import": "İçe aktar", "new": "Yeni", @@ -8246,6 +9933,14 @@ "search-results-table": { "aria-label-search-results-table": "Arama sonuçları tablosu", "no-data": "Değer yok" + }, + "unified-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } } }, "select": { @@ -8317,6 +10012,11 @@ "delete-service-account": "Hizmet hesabını sil", "disable-service-account": "Hizmet hesabını devre dışı bırak", "enable-service-account": "Hizmet hesabını etkinleştir", + "page-nav": { + "subTitle": { + "manage-settings-individual-service-account": "" + } + }, "title-delete-service-account": "Hizmet hesabını sil", "title-disable-service-account": "Hizmet hesabını devre dışı bırak", "tokens": "Belirteçler", @@ -8633,6 +10333,12 @@ "sort-picker": { "select-aria-label": "Sırala" }, + "status-history": { + "status-history-panel": { + "too-many-points_one": "", + "too-many-points_other": "" + } + }, "support-bundles": { "new-bundle-button": { "new-support-bundle": "Yeni destek paketi" @@ -8640,7 +10346,10 @@ "support-bundles-create-unconnected": { "cancel": "İptal", "create": "Oluştur", - "sub-title": "Destek paketinin bileşenlerini seçin. Destek paketi oluşturulduktan sonra 3 gün boyunca erişilebilir olacaktır." + "sub-title": "Destek paketinin bileşenlerini seçin. Destek paketi oluşturulduktan sonra 3 gün boyunca erişilebilir olacaktır.", + "text": { + "create-support-bundle": "" + } }, "support-bundles-unconnected": { "created-on": "Oluşturulma tarihi", @@ -8655,10 +10364,35 @@ "login": "Oturum Aç" }, "table": { + "auto-cell-options-editor": { + "description-wrap-text": "", + "label-wrap-text": "" + }, + "bar-gauge-cell-options-editor": { + "label-gauge-display-mode": "", + "label-value-display": "" + }, + "color-background-cell-options-editor": { + "description-apply-to-entire-row": "", + "description-wrap-text": "", + "label": { + "text-alpha": "" + }, + "label-apply-to-entire-row": "", + "label-background-display-mode": "", + "label-wrap-text": "", + "wrap-text": "" + }, "container": { "content": "Tek bir tabloda çok fazla sütun göstermek performansı etkileyebilir ve verilerin okunmasını zorlaştırabilir. Sorgularınızı daraltmayı düşünün.", "show-all-series": "Tüm sütunları göster", "show-only-series": "Sadece {{MAX_NUMBER_OF_COLUMNS}} sütun gösteriliyor" + }, + "image-cell-options-editor": { + "description-alt-text": "", + "description-title-text": "", + "label-alt-text": "", + "label-title-text": "" } }, "tag-filter": { @@ -8674,6 +10408,24 @@ "select-placeholder": "Bir ekip seçin" }, "teams": { + "build-nav-model": { + "nav-model": { + "subTitle": { + "manage-members-and-settings": "" + }, + "text": { + "settings": "Ayarlar" + } + }, + "team-group-sync": { + "text": { + "external-group-sync": "Harici grup senkronizasyonu" + } + }, + "text": { + "members": "Üyeler" + } + }, "create-team": { "create": "Oluştur", "description-email": "Bu isteğe bağlıdır ve esas olarak özel takım avatarlarına izin vermek için kullanılır", @@ -8695,6 +10447,9 @@ "external-group-sync": "Harici grup senkronizasyonu", "label-add-external-group": "Harici grup ekle", "team-sync-upgrade": "Grafana Pro deneme süreniz boyunca ücretsiz ekip senkronizasyonu sağlamak için bir grup ekleyin", + "text": { + "add-group": "Grup ekle" + }, "title-there-external-groups": "Senkronize edilecek harici grup yok", "tooltip-add-external-group": "LDAP grubu örneği: {{example}}" }, @@ -8796,6 +10551,42 @@ "select-search-input": "Aramak için yazmaya başlayın (ülke, şehir, kısaltma)" } }, + "timeseries": { + "annotation-editor2": { + "add-annotation": "Ek açıklama ekle", + "cancel": "İptal et", + "edit-annotation": "", + "label-description": "Açıklama", + "label-tags": "Etiketler", + "placeholder-add-tags": "", + "save": "Kaydet", + "saving": "Kaydediliyor" + }, + "annotation-tooltip2": { + "tooltip-delete": "Sil", + "tooltip-edit": "Düzenle" + }, + "line-style-editor": { + "title-the-input-expects-a-segment-list": "", + "tooltip-help": "Yardım" + }, + "nulls-threshold-input": { + "placeholder-never": "Hiçbir zaman" + }, + "outside-range-plugin": { + "data-outside-time-range": "", + "zoom-to-data": "" + }, + "timezones-editor": { + "tooltip-add-timezone": "", + "tooltip-remove-timezone": "" + } + }, + "traces": { + "traces-panel": { + "no-data-found-in-response": "" + } + }, "transformations": { "empty": { "add-transformation-body": "Dönüşümler, görselleştirme gösterilmeden önce verilerin çeşitli şekillerde değiştirilmesine olanak tanır.<1></1> Bu işlemler arasında verileri birleştirme, alanları yeniden adlandırma, hesaplamalar yapma, verileri görüntüleme için biçimlendirme gibi seçenekler bulunur.", @@ -8832,6 +10623,10 @@ "convert-field-type-transformer-editor": { "aria-label-add-a-convert-field-type-transformer": "Alan türü dönüştürücü ekle", "aria-label-remove-convert-field-type-transformer": "Alan türü dönüştürücüyü kaldır", + "label": { + "browser": "Tarayıcı", + "utc": "" + }, "label-as": "olarak", "label-date-format": "Tarih biçimi", "label-field": "Alan", @@ -8918,11 +10713,32 @@ "tooltip-format": "Alan için çıktı biçimi, <2>Moment.js biçimlendirme dizesi</2> olarak belirtilir.", "tooltip-timezone-manually": "Tarih için saat dilimini manuel olarak ayarlayın" }, + "get-timezone-options": { + "label": { + "browser": "Tarayıcı", + "utc": "" + } + }, "get-tooltips": { "description": "Geçerli bir JSON nesne yolu.", "json-value": "JSON Değeri:", + "map-valid-paths": { + "description": { + "extract-fields-from-object": "", + "extract-value": "", + "extract-value-first-element": "", + "extract-value-second-element": "" + } + }, "valid-paths": "Geçerli Yollar:" }, + "get-transformer-option-pane": { + "root": { + "title": { + "root": "" + } + } + }, "group-by-field-configuration": { "placeholder-ignored": "Yok sayıldı", "placeholder-select-stats": "İstatistikleri seç" @@ -8939,7 +10755,23 @@ "label-cell-value": "Hücre değeri", "label-column": "Sütun", "label-empty-value": "Boş değer", - "label-row": "Satır" + "label-row": "Satır", + "special-value-options": { + "description": { + "boolean-false-value": "", + "boolean-true-value": "", + "empty-string": "", + "null-value": "", + "number-value": "" + }, + "label": { + "empty": "Boş", + "false": "", + "null": "", + "true": "", + "zero": "" + } + } }, "histogram-transformer-editor": { "placeholder-auto": "Otomatik", @@ -9002,10 +10834,22 @@ "tooltip-naming": "Seçilen alan adlarının nasıl gösterileceğini ayarlar. Tablo verileri için çerçeve adı genellikle daha iyidir" }, "partition-by-values-editor": { + "keep-fields-options": { + "label": { + "no": "Hayır", + "yes": "Evet" + } + }, "label-field": "Alan", "label-keep-fields": "Alanları koru", "label-naming": "Adlandırma", "label-select-field": "Gönderi seçim alanı", + "naming-modes-options": { + "label": { + "as-frame-name": "", + "as-label": "" + } + }, "partition-values-works-single-frame": "Değerlere göre bölme yalnızca tek bir çerçevede çalışır.", "tooltip-keeps-partition-fields-frames": "Bölme alanlarını çerçevede tutar" }, @@ -9027,6 +10871,16 @@ "label-include-time": "Zamanı dahil et", "label-labels-to-fields": "Alan etiketleri", "label-mode": "Mod", + "modes": { + "description": { + "collapse-field-single-value": "", + "create-table-series-value": "" + }, + "label": { + "reduce-fields": "", + "series-to-rows": "" + } + }, "placeholder-choose-stat": "İstatistik seç" }, "regex-matcher-editor": { @@ -9034,11 +10888,23 @@ "variable-regex-documentation": "" }, "regression-transformer-editor": { + "label": { + "cubic": "", + "quadratic": "", + "quartic": "", + "quintic": "" + }, "label-degree": "Seviye", "label-model-type": "Model tipi", "label-predicted-points": "Öngörülen noktalar", "label-x-field": "X alanı", "label-y-field": "Y alanı", + "model-type-options": { + "label": { + "linear": "", + "polynomial": "" + } + }, "tooltip-number-of-xy-points-to-predict": "Tahmin edilecek X,Y noktalarının sayısı" }, "rename-by-regex-transformer-editor": { @@ -9056,6 +10922,23 @@ "label-reverse": "Geri döndür", "placeholder-select-field": "Gönderi seçim alanı" }, + "supplier": { + "description": { + "apply-spatial-operations-to-the-geometry": "", + "create-a-line-between-two-points": "", + "geometry-define-field-headingdistancearea": "" + }, + "label": { + "area": "", + "as-line": "", + "calculate-value": "", + "distance": "", + "heading": "", + "line-builder": "", + "prepare-spatial-field": "", + "transform": "" + } + }, "time-series-table-transform-editor": { "label-stat": "İstatistik", "label-time-field": "Zaman alanı", @@ -9089,7 +10972,19 @@ "placeholder-auto": "Otomatik", "placeholder-field": "Alan", "tooltip-window-size": "Pencere boyutu", - "tooltip-window-size-percent": "Pencere boyutunu toplam verinin yüzdesi olarak ayarlayın" + "tooltip-window-size-percent": "Pencere boyutunu toplam verinin yüzdesi olarak ayarlayın", + "type-options": { + "label": { + "centered": "", + "trailing": "" + } + }, + "window-size-mode-options": { + "label": { + "fixed": "", + "percentage": "" + } + } } }, "upgrade-box": { @@ -9146,6 +11041,11 @@ }, "users-action-bar-unconnected": { "invite": "Davet et", + "options": { + "label": { + "users": "Kullanıcılar" + } + }, "placeholder-search-login-email": "Giriş bilgisi, e-posta veya ada göre kullanıcı ara" } }, @@ -9189,6 +11089,32 @@ "confirm-delete-modal": { "title-delete-variable": "Değişkeni sil" }, + "create-ad-hoc-variable-adapter": { + "description": { + "add-keyvalue-filters-on-the-fly": "" + } + }, + "create-custom-variable-adapter": { + "description": { + "define-variable-values-manually": "" + } + }, + "create-interval-variable-adapter": { + "description": { + "define-timespan-interval": "" + } + }, + "create-query-variable-adapter": { + "description": { + "variable-values-fetched-datasource-query": "" + } + }, + "data-source-variable-slice": { + "text": { + "default": "", + "no-data-sources-found": "Veri kaynağı bulunamadı" + } + }, "empty-state": { "button-title": "Değişken ekle", "info-box-content": "Değişkenler, daha etkileşimli ve dinamik panolar oluşturmanıza olanak tanır. Metrik sorgularınızda sunucu veya sensör adları gibi sabit değerleri kodlamak yerine değişkenleri kullanabilirsiniz. Değişkenler, panonun üst kısmında liste kutuları olarak görüntülenir. Bu açılır listeler, panonuzda görüntülenen verileri kolayca değiştirmenizi sağlar.", @@ -9215,6 +11141,13 @@ "placeholder-default-value-if-any": "Varsayılan değer (varsa)", "text-options": "Metin seçenekleri" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "unknown-table": { "loading": "Yükleniyor...", "no-unknowns": "Yeniden adlandırılmış veya eksik değişken bulunamadı.", @@ -9271,5 +11204,25 @@ "data-hover-view": { "link": "Bağlantı" } + }, + "welcome": { + "welcome-banner": { + "need-help": "Yardıma mı ihtiyacınız var?", + "welcome-to-grafana": "" + } + }, + "xychart": { + "series-editor": { + "add-series": "", + "aria-label-select-series": "", + "label-color-field": "", + "label-frame": "Çerçeve", + "label-size-field": "", + "label-x-field": "X alanı", + "label-y-field": "Y alanı", + "placeholder-all-frames": "", + "placeholder-select-frame": "", + "tooltip-delete-series": "" + } } } \ No newline at end of file diff --git a/public/locales/zh-Hans/grafana.json b/public/locales/zh-Hans/grafana.json index 29fb0734057..0bfe9cbe8d0 100644 --- a/public/locales/zh-Hans/grafana.json +++ b/public/locales/zh-Hans/grafana.json @@ -72,6 +72,11 @@ }, "admin-edit-org-page": { "label-name": "名称", + "page-nav": { + "subTitle": { + "manage-settings-roles-organization": "" + } + }, "render-missing-permission-message": { "title-access-denied": "访问被拒绝" } @@ -233,6 +238,13 @@ "upgrade-info": { "title": "企业许可" }, + "user-admin-page": { + "page-nav": { + "subTitle": { + "manage-settings-for-an-individual-user": "" + } + } + }, "user-create-page": { "label-email": "电子邮箱", "label-name": "名称", @@ -243,9 +255,16 @@ "label-ldap": "LDAP" }, "user-list-admin-page-un-connected": { + "label": { + "active-last-days": "", + "all-users": "所有用户" + }, "placeholder-search-login-email": "按登录名、电子邮件或姓名搜索用户。" }, "user-list-anonymous-devices-page-un-connected": { + "label": { + "active-last-days": "" + }, "placeholder-search-devices-by-ip-address": "按 IP 地址搜索设备。" }, "user-list-page": { @@ -364,6 +383,12 @@ "no-grouping": "无分组" }, "alert-group-alerts-table": { + "columns": { + "label": { + "instance-labels": "", + "notification-state": "通知状态" + } + }, "duration": "时长为 {{time}}" }, "alert-group-filter": { @@ -439,6 +464,11 @@ "description-section": "输入名称以标识您的{{entityName}}。", "label-metric": "指标", "label-name": "名称", + "message": { + "must-enter-a-metric-name": "", + "must-enter-a-name": "", + "please-select-a-data-source": "请选择数据源" + }, "metric-aria-label-metric": "指标", "metric-placeholder-recorded-metric": "为新记录的指标命名", "placeholder-name": "为{{namePlaceholder}}命名", @@ -491,6 +521,9 @@ "alertmanager-config": { "gma-manual-configuration-description": "无法手动更改内部 Grafana Alertmanager 配置。要更改此配置,请通过用户界面编辑单个资源。", "gma-manual-configuration-is-not-supported": "不支持手动进行配置更改", + "message": { + "configuration-cannot-be-empty": "" + }, "reset": "重置", "reset-confirmation": "您确定要重置“{{alertmanagerName}}”的配置吗?联络点和通知策略将重置为默认值。", "resetting-configuration-might-while": "重置配置,这可能需要一段时间。", @@ -580,6 +613,9 @@ "create-a-contact-point": "创建联络点", "label-default-contact-point": "默认联络点", "label-timing-options": "时间设定选项", + "message": { + "required": "" + }, "or": "或" }, "am-routes-expanded-form": { @@ -601,11 +637,19 @@ "label-override-grouping": "覆盖分组", "label-value": "值", "matching-labels": "匹配标签", + "message": { + "required": "" + }, "placeholder-label": "标签", "placeholder-value": "值", "remove": "删除", "tooltip-remove-matcher": "移除匹配器" }, + "annotation-header-field": { + "message": { + "required": "" + } + }, "annotations": { "dashboard-annotation-field": { "dashboard": "数据面板 {{dashboardUid}}", @@ -677,6 +721,25 @@ "title": "无法显示所有事件" } }, + "central-alert-history-scene": { + "scene": { + "labels-filter-variable": { + "label": { + "labels": "" + } + }, + "transitions-from-filter-variable": { + "label": { + "start-state": "" + } + }, + "transitions-to-filter-variable": { + "label": { + "end-state": "" + } + } + } + }, "channel-sub-form": { "delete": "删除", "duplicate": "复制", @@ -713,11 +776,17 @@ }, "cloud-data-source-selector": { "label": "选择数据源", - "label-disabled": "数据源" + "label-disabled": "数据源", + "message": { + "please-select-a-data-source": "请选择数据源" + } }, "cloud-evaluation-behavior": { "description-pending-period": "必须满足阈值条件才能触发警报的时间段。选择“无”将在条件满足后立即触发警报。", "label-pending-period": "待处理时段", + "message": { + "must-be-a-positive-integer": "" + }, "title-set-evaluation-behavior": "设置评估行为" }, "cloud-receiver-form": { @@ -758,6 +827,9 @@ "contact-point-selector": { "aria-label-refresh-contact-points": "刷新联络点", "contact-point-picker-label-contact-point": "联络点", + "message": { + "contact-point-is-required": "" + }, "title-failed-to-fetch-contact-points": "获取联络点失败", "tooltip-refresh-contact-points-list": "刷新联络点列表" }, @@ -822,6 +894,14 @@ }, "copy-to-clipboard": "将“{{label}}”复制到剪贴板", "create-metadata": { + "label": { + "dashboard": "仪表板", + "dashboard-and-panel": "", + "evaluation-interval": "评估间隔", + "labels": "标签", + "metric-name": "", + "runbook-url": "" + }, "view-dashboard": "查看数据面板", "view-panel": "查看面板" }, @@ -862,9 +942,6 @@ "title-search-panel": "搜索面板", "title-select-dashboard-and-panel": "选择数据面板和面板" }, - "data-source-section": { - "import-to-grafana": "导入到 Grafana 规则" - }, "datasource-not-found": { "card-description": "找不到此查询的数据源,它可能已被移除或未正确安装。", "remove-query": "删除查询", @@ -946,6 +1023,11 @@ "text-loading-template": "正在加载模板...", "title-failed-to-fetch-notification-template": "获取通知模板失败" }, + "edit-mute-timing-page": { + "text": { + "edit-time-interval": "" + } + }, "editor": { "edit-alert-rule": "", "edit-recording-rule": "", @@ -959,6 +1041,11 @@ "error-summary-button": { "content-show-all-errors": "" }, + "evaluate-every-validation-options": { + "message": { + "required": "" + } + }, "evaluation-behavior-summary": { "evaluate": "", "label-evaluate": "评估", @@ -976,6 +1063,9 @@ "evaluation-group-creation-modal": { "description-group-name": "组将在相同的评估间隔内评估其所有规则。", "description-often-rules-group-evaluated": "对组中的所有规则进行评估的频率。", + "message": { + "required": "" + }, "placeholder-enter-a-name": "输入名称", "title-new-evaluation-group": "新的评估组" }, @@ -998,12 +1088,24 @@ "title-permission-editrecreate-silence": "您没有编辑/重新创建此沉默的权限", "title-silence-not-found": "未找到现有静默“{{silenceId}}”" }, + "existing-silence-editor-page": { + "page-nav": { + "text": { + "edit-silence": "" + } + } + }, "export": { "subtitle": { "formats": "选择格式并下载文件或将内容复制到剪贴板", "one-format": "下载文件或将内容复制到剪贴板" } }, + "export-new-grafana-rule-page": { + "text": { + "export-new-grafana-rule": "" + } + }, "export-new-rule-button": { "tooltip-export-new-grafana-rule": "导出新的 Grafana 规则" }, @@ -1029,6 +1131,16 @@ "no-data": "没有数据", "page-counter": "" }, + "feature-toggle-page": { + "nav-model": { + "subTitle": { + "enable-alerting-grafana-config": "" + }, + "text": { + "alerting-is-not-enabled": "" + } + } + }, "federated-rule-warning": { "experimental": "联合规则组目前是一项实验性功能。", "read-documentation": "阅读文档", @@ -1036,6 +1148,13 @@ }, "file-export-inline-documentation": { "api-provisioning": "{{name}} 格式仅对 API 预配有效。<3>在文档中阅读更多信息</3>。", + "export-inline-doc": { + "title": { + "apiprovisioning-format": "", + "fileprovisioning-format": "", + "terraformprovisioning-format": "" + } + }, "file-provisioning": "{{name}} 格式仅对文件预配有效。<3>在文档中阅读更多信息</3>。", "terraform-provisioning": "{{name}} 格式仅对 Terraform 预配有效。<3>在文档中阅读更多信息</3>。" }, @@ -1043,6 +1162,20 @@ "copy-code": "复制代码", "download": "下载" }, + "filter-options": { + "label": { + "alert-rule": "提醒规则", + "all": "全部", + "error": "错误", + "firing": "", + "no-data": "没有数据", + "normal": "正常", + "ok": "好", + "pending": "待处理", + "recording-rule": "录制规则", + "recovering": "正在恢复" + } + }, "filter-view-results": { "aria-label-filteredrulelist": "筛选规则列表" }, @@ -1077,7 +1210,10 @@ } }, "folder-selector": { - "description-select-folder": "选择一个文件夹来存储规则。" + "description-select-folder": "选择一个文件夹来存储规则。", + "message": { + "select-a-folder": "" + } }, "folderAndGroup": { "evaluation": { @@ -1092,15 +1228,88 @@ "for-input": { "description-pending": "必须满足阈值条件才能触发警报的时间段。选择“无”将在条件满足后立即触发警报。" }, + "for-validation-options": { + "message": { + "required": "" + } + }, "generate-alert-data-modal": { "add-alert-data": "添加警报数据", "add-alert-data-to-payload": "将警报数据添加到负载中", + "alert-options": { + "label": { + "firing": "", + "resolved": "" + } + }, "review-alert-payload": "查看要添加到负载的警报数据:", "title-add-custom-alerts": "添加自定义警报" }, + "get-alert-suggestions": { + "documentation": { + "annotations-attached-alert": "", + "fingerprint-identify-alert": "", + "grafana-external-alertmanager": "", + "organization-alert": "", + "time-the-alert-started-firing": "" + }, + "value": { + "labels-attached-alert": "", + "status-alert-firing-resolved": "" + } + }, + "get-cloud-scenes": { + "title": { + "mimir-alertmanager": "" + } + }, + "get-global-suggestions": { + "value": { + "an-array-containing-all-alerts": "" + } + }, + "get-grafana-alertmanager-scenes": { + "title": { + "grafana-alertmanager": "" + } + }, + "get-grafana-managed-scenes": { + "title": { + "grafanamanaged-alert-rules": "Grafana 管理的警报规则" + } + }, + "get-mimir-managed-rules-per-group-scenes": { + "rule-group-handler": { + "label": { + "rule-group": "" + } + }, + "title": { + "mimirmanaged-alert-rules-per-rule-group": "" + } + }, + "get-mimir-managed-rules-scenes": { + "title": { + "mimirmanaged-alert-rules": "" + } + }, "get-preview-results": { "title-error": "错误" }, + "get-state-display-model": { + "text": { + "alerting": "", + "error": "", + "firing": "", + "inactive": "", + "no-data": "", + "ok": "好", + "paused": "", + "pending": "", + "recovering": "", + "unknown": "" + } + }, "getting-stared": { "learn-more": "如需实际操作方面的介绍,请参阅我们的<2>开始使用 Grafana Alerting 的教程</2>" }, @@ -1142,6 +1351,10 @@ "label-disable-resolved-message": "禁用已解除消息" }, "grafana-evaluation-behavior-step": { + "message": { + "must-be-a-positive-integer": "", + "must-enter-a-group-name": "" + }, "missing-series-resolve-placeholder": "默认值:2", "or": "或", "placeholder-select-an-evaluation-group": "选择一个评估组...", @@ -1158,6 +1371,11 @@ "body-invalid-rule-id": "页面 URL 中的规则 UID 无效。请检查 URL,然后重试。", "title-invalid-rule-id": "规则 ID 无效" }, + "grafana-modify-export-page": { + "text": { + "modify-export": "" + } + }, "grafana-mute-timing-exporter-preview": { "text-loading": "正在加载..." }, @@ -1210,6 +1428,9 @@ }, "group-and-namespace-fields": { "group-picker-label-group": "组", + "message": { + "required": "" + }, "namespace-picker-label-namespace": "命名空间" }, "group-by": { @@ -1266,14 +1487,19 @@ "header": { "tooltip-remove": "移除表达式“{{refId}}”" }, + "history-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "成功" + } + }, "home": { "label-get-started": "开始操作", "label-insights": "洞察", "title-alerting": "警报" }, - "import-from-dsrules": { - "description-folder-import-rules": "要导入规则的文件夹" - }, "import-to-gma": { "action-button": "导入", "additional-settings": "附加设置", @@ -1281,8 +1507,9 @@ "confirm-modal": { "confirm": "导入", "loading": "加载中...", - "loading-body": "正在准备要导入的数据。这可能需要一段时间...", + "loading-body": "", "no-rules-body": "没有要导入的规则。请选择其他命名空间或规则组。", + "no-rules-body-yaml": "", "no-rules-title": "没有要导入的规则", "plugin-rules-warning": { "text": "我们检测到某些规则由插件管理。这些规则将不会被导入。", @@ -1301,11 +1528,12 @@ "label": "组" }, "import-location-and-filters": "导入位置和筛选器", + "import-source": "", "namespace": { "description": "键入以搜索现有命名空间", "label": "命名空间" }, - "pageTitle": "将警报规则从数据源导入到 Grafana 管理的规则", + "pageTitle": "", "pause": { "label": "暂停导入的警报规则" }, @@ -1313,10 +1541,26 @@ "label": "暂停导入的录制规则" }, "recording-rules": "录制规则", + "source": { + "datasource": "", + "datasource-description": "", + "yaml": "", + "yaml-description": "" + }, "success": "已成功将警报规则导入到 Grafana 管理的规则。", "target-folder": { + "description": "要导入规则的文件夹", "label": "目标文件夹" - } + }, + "yaml": { + "description": "", + "label": "", + "required-message": "", + "target-datasource": "目标数据源", + "target-datasource-description": "", + "target-datasource-required": "" + }, + "yaml-error": "" }, "insights": { "monitor-status-of-system": "监控系统状态", @@ -1392,6 +1636,9 @@ "text-loading-existing-labels": "加载现有标签" }, "labels-without-suggestions": { + "message": { + "required": "" + }, "placeholder-key": "密钥", "placeholder-value": "值" }, @@ -1430,6 +1677,24 @@ "log-record-viewer-by-timestamp": { "aria-label-state-history-by-timestamp": "按时间戳排列的状态历史记录" }, + "log-timeline-viewer": { + "label": { + "firing": "", + "mixed": "", + "no-data": "", + "normal": "正常", + "pending": "待处理", + "recovering": "正在恢复" + } + }, + "loki-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "成功" + } + }, "loki-state-history": { "clear-filters": "清除筛选器", "common-labels": "常用标签", @@ -1442,6 +1707,14 @@ "button": "管理权限", "title": "管理权限" }, + "manual-and-automatic-routing": { + "routing-options": { + "label": { + "select-contact-point": "", + "use-notification-policy": "" + } + } + }, "matcher-filter": { "filter-alerts-using-label-querying-without-braces": "使用不带大括号的标签查询来筛选提醒,例如:", "filter-alerts-using-label-querying-without-spaces": "使用不带空格的标签查询来筛选警报,例如:", @@ -1459,6 +1732,9 @@ "label-operator": "运算符", "label-refine-affected-alerts": "优化受影响的警报", "label-value": "值", + "message": { + "required": "" + }, "placeholder-label": "标签", "placeholder-value": "值", "remove": "删除", @@ -1490,6 +1766,16 @@ "aria-label": "更多", "button-text": "更多" }, + "multiple-data-source-picker": { + "get-data-source-options": { + "grouped-options": { + "label": { + "data-sources-with-configured-alert-rules": "", + "other-data-sources": "" + } + } + } + }, "mute-timing-actions-buttons": { "text-disabled": "已禁用", "title-delete-mute-timing": "删除静音时间设定" @@ -1553,11 +1839,26 @@ "read-more": "阅读通知策略。", "title-notification-routing": "通知路由" }, + "new-mute-timing-page": { + "text": { + "add-time-interval": "" + } + }, "new-rule-from-panel-button": { "body-no-alerting-capable-query-found": "无法从此面板创建警报,因为未找到对支持警报的数据源的查询。", "new-alert-rule": "新建警报规则", "title-no-alerting-capable-query-found": "未找到支持警报的查询" }, + "new-silence-page": { + "page-nav": { + "subTitle": { + "configure-silences-notifications-particular-alert": "" + }, + "text": { + "silence-alert-rule": "静默警报规则" + } + } + }, "no-alert-managers-available": { "body-no-alertmanager-found": "我们找不到任何外部的 Alertmanager,您可能无权访问内置的 Grafana Alertmanager。", "title-no-alertmanager-found": "未找到 Alertmanager" @@ -1782,6 +2083,9 @@ "expressions": "表达式", "loading-data-sources": "正在加载数据源...", "manipulate-returned-queries-other-operations": "使用数学和其他操作处理查询返回的数据。", + "message": { + "a-valid-expression-is-required": "" + }, "no-compatible-sources": "您似乎没有兼容的数据源", "title-deactivate-advanced-options": "停用高级选项", "title-queries-expressions-configured": "未配置任何查询或表达式" @@ -1833,7 +2137,8 @@ }, "recording-rules": { "description-target-data-source": "用于存储录制规则的 Prometheus 数据源", - "label-target-data-source": "目标数据源" + "label-target-data-source": "目标数据源", + "target-data-source-required": "" }, "recording-rules-name-space-and-group-step": { "description-select-namespace-group-recording": "为您的录制规则选择命名空间和组。", @@ -2091,6 +2396,9 @@ "collapse-all": "折叠全部", "expand-all": "展开全部" }, + "rule-list-v2": { + "import-to-gma": "" + }, "rule-modify-export": { "text-loading-the-rule": "正在加载规则...", "title-cannot-exist": "无法加载规则。规则不存在", @@ -2167,6 +2475,10 @@ "label-saved-searches": "保存的搜索" }, "health": "健康", + "label": { + "hide": "隐藏", + "show": "显示" + }, "manage-alerts": "在这些数据源中,您可以选择通过警报用户界面管理警报,以便能够在 Grafana 用户界面以及在其配置所在的数据源中管理这些警报规则。", "placeholder-all-data-sources": "所有数据源", "plugin-rules": "插件规则", @@ -2263,6 +2575,9 @@ "label-comment": "评论", "label-created-by": "创建者:", "label-duration": "持续时间", + "message": { + "required": "" + }, "placeholder-whos-creating-the-silence": "静默创建者", "save-silence": "保存静默", "saving": "正在保存..." @@ -2301,6 +2616,12 @@ "title-alert-rule-types": "警报规则类型" }, "state-history": { + "columns": { + "label": { + "state": "状态", + "time": "时间" + } + }, "filter-group": "筛选组", "filter-group-tooltip": "按完全匹配或正则表达式筛选每个状态历史记录组,例如:", "placeholder-search": "搜索", @@ -2340,6 +2661,9 @@ "label-examples-documentation": "示例文档", "label-template-group": "模板组", "label-template-group-name": "模板组名称", + "message": { + "required": "" + }, "new-template-name-placeholder-give-your-template-group-a-name": "为模板组命名", "title-error-saving-template": "保存模板时出错", "title-templating-cheat-sheet": "模板速查表" @@ -2362,6 +2686,11 @@ "existing-templates-selector-aria-label-choose-notification-template": "选择通知模板", "existing-templates-selector-placeholder-choose-notification-template": "选择通知模板", "loading": "加载中...", + "template-options": { + "label": { + "select-notification-template": "" + } + }, "tooltip-copy": "将选定的通知模板复制到剪贴板。您可以在自定义选项卡中使用它。" }, "templates": { @@ -2464,10 +2793,39 @@ } }, "use-columns": { + "columns": { + "label": { + "alert-rule-targeted": "", + "alerts-silenced": "", + "health": "健康", + "matching-labels": "匹配标签", + "name": "名称", + "schedule": "安排计划", + "state": "状态", + "time-range": "时间范围" + } + }, + "label": { + "actions": "操作", + "created": "已创建", + "group": "组", + "labels": "标签", + "next-evaluation": "下一次评估", + "state": "状态", + "summary": "摘要" + }, "title-edit": "编辑", "title-recreate": "重新创建", "title-unsilence": "取消静默" }, + "use-combined-labels": { + "grouped-options": { + "label": { + "from-alerts": "", + "from-system": "" + } + } + }, "use-create-dropdown-menu-actions": { "label-delete": "删除", "label-edit": "编辑", @@ -2501,6 +2859,17 @@ "title-edit-notification-policy": "编辑通知策略" } }, + "use-page-nav": { + "page-nav": { + "text": { + "details": "详情", + "history": "历史记录", + "instances": "实例", + "query-and-conditions": "", + "versions": "版本" + } + } + }, "use-state-history-modal": { "state-history-modal": { "title-state-history": "状态历史记录" @@ -2521,6 +2890,36 @@ "body": "编辑器中的 YAML 内容仅包含警报规则配置<1></1>要配置 Prometheus,您需要提供 <4>配置文件内容</4>的其余部分。" } }, + "alertlist": { + "group-by": { + "aria-label-group-by-label-keys": "", + "placeholder-group-by": "分组依据" + }, + "ungrouped-mode-view": { + "active-for": "", + "aria-label-view-alert-rule": "", + "view-alert-rule": "" + }, + "unified-alert-list": { + "clear": "清除", + "text-loading": "加载中..." + }, + "unified-alert-list-panel": { + "body-permission-required": "", + "title-permission-required": "" + } + }, + "annolist": { + "anno-list-panel": { + "aria-label-remove-filter": "", + "filter": "", + "loading": "加载中...", + "no-annotations-found": "" + }, + "annotation-list-item": { + "tooltip-created-by": "" + } + }, "annotations": { "annotation-field-mapper": { "annotation": "注释", @@ -2617,6 +3016,11 @@ "configuration-required": "需要配置", "refer-documentation-configure-authentication": "请参阅有关如何配置身份验证的文档" }, + "field-map": { + "label": { + "none": "无" + } + }, "fields": { "allow-assign-grafana-admin-description": "", "allow-assign-grafana-admin-label": "", @@ -2720,7 +3124,18 @@ "use-refresh-token-description": "", "use-refresh-token-label": "", "validate-hosted-domain-description": "", - "validate-hosted-domain-label": "" + "validate-hosted-domain-label": "", + "workload-identity-token-file-description": "", + "workload-identity-token-file-label": "", + "workload-identity-token-file-required": "" + }, + "get-page-nav": { + "subTitle": { + "configure-authentication-providers": "" + }, + "text": { + "authentication": "身份验证" + } }, "provider-card": { "text-badge-enabled": "已启用", @@ -2756,6 +3171,12 @@ "auth-config-auth-config-page-unconnected": { "subtitle": "管理身份验证设置并配置单点登录。不妨在我们的<2>文档</2>中了解更多信息。" }, + "barchart": { + "tick-spacing-editor": { + "content-require-space-from-the-right-side": "", + "label-rtl": "" + } + }, "bookmarks-page": { "empty": { "message": "您似乎还没有创建任何书签", @@ -2879,11 +3300,199 @@ "text-this-repository-is-read-only": "如果您可以直接访问目标,请复制 JSON 并将其粘贴到那里。" }, "canvas": { + "apieditor": { + "label-endpoint": "", + "label-header-parameters": "", + "label-method": "方法", + "label-payload": "负载", + "label-query-parameters": "查询参数", + "render-test-apibutton": { + "test-api": "", + "title-test-api": "" + } + }, + "button-item": { + "label": { + "center": "", + "left": "", + "right": "" + }, + "placeholder": { + "auto": "自动" + } + }, + "button-style-editor": { + "label-variant": "变体" + }, + "canvas-context-menu": { + "close-editor": "", + "open-editor": "", + "render-menu-items": { + "add-item-menu-item": { + "label-add-item": "" + }, + "edit-element-menu-item": { + "label-edit": "编辑" + }, + "label-bring-to-front": "", + "label-delete": "删除", + "label-duplicate": "复制", + "label-send-to-back": "", + "set-background-menu-item": { + "label-set-background": "" + } + } + }, + "cloud-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "自动" + } + }, + "ellipse-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "自动" + } + }, + "inline-edit": { + "canvas-inline-editor": "", + "tooltip-close-inline-editor": "" + }, + "inline-edit-body": { + "label-add-item": "", + "please-select-an-element": "" + }, + "line-style-editor": { + "label-animate": "" + }, + "metric-value-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "自动" + } + }, "not-found-display": { "not-found": "<0>未找到:</0><config />" }, + "pan-zoom-help": { + "ctrl-right-mouse": "", + "middle-mouse": "", + "pan-title": "", + "reset-double-click": "", + "title-pan-and-zoom-controls": "", + "zoom-scroll-wheel": "" + }, + "parallelogram-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "自动" + } + }, + "params-editor": { + "aria-label-add": "添加", + "aria-label-delete": "删除", + "placeholder-key": "密钥", + "placeholder-value": "值" + }, + "placement-editor": { + "label-constraints": "", + "label-position": "", + "loading": "加载中..." + }, + "quick-positioning": { + "tooltip-align-bottom": "", + "tooltip-align-horizontal-centers": "", + "tooltip-align-left": "", + "tooltip-align-right": "", + "tooltip-align-top": "", + "tooltip-align-vertical-centers": "" + }, + "rectangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "自动" + } + }, "text-display": { "double-click-to-set": "双击以设置文本" + }, + "text-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "自动" + } + }, + "tree-navigation-editor": { + "clear-selection": "清除选择", + "frame-selection": "", + "label-add-item": "", + "missing-layer": "", + "no-settings": "", + "switcher-icon": { + "title-node-icon": "" + } + }, + "tree-node-title": { + "title-duplicate": "复制", + "title-remove": "删除", + "tooltip-duplicate": "复制", + "tooltip-remove": "删除" + }, + "triangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "自动" + } } }, "carousel": { @@ -2963,6 +3572,22 @@ } }, "connections": { + "add-new-connection": { + "filter-by-options": { + "label": { + "all": "全部", + "installed": "已安装", + "new-updates": "" + } + }, + "label": { + "by-downloads": "", + "by-name-az": "", + "by-name-za": "", + "by-published-date": "", + "by-updated-date": "" + } + }, "advisor-redirect-notice": { "aria-label-link-to-advisor": "关联到顾问", "body": "尝试使用新的 Advisor 来发现数据源和插件的潜在问题。", @@ -2979,6 +3604,22 @@ "body": "数据源有了新家!您可以在“关联”页面中发现新的数据源或管理现有数据源,该页面可从主菜单访问。", "go-to-connections": "前往关联" }, + "data-source-details-page": { + "subTitle": { + "datasource-could-found": "" + }, + "text": { + "unknown-datasource": "" + } + }, + "new-data-source-page": { + "subTitle": { + "choose-a-data-source-type": "" + }, + "text": { + "add-data-source": "添加数据源" + } + }, "no-access-modal": { "connection-contact-grafana-admin": "要添加新的关联,请与您的 Grafana 管理员联系。", "editor-warning": "编辑者无法添加新的关联。您可以检查它是否已在<2>数据源</2>中配置。", @@ -2991,6 +3632,18 @@ "search": { "aria-label-search-all": "搜索全部", "placeholder": "搜索全部" + }, + "use-data-source-settings-nav": { + "node": { + "subTitle": { + "data-source-error": "" + } + }, + "page-nav": { + "text": { + "data-source-nav-node": "" + } + } } }, "core": { @@ -3286,6 +3939,11 @@ "title-plugin-dashboard": "插件数据面板" }, "dash-nav": { + "on-open-snapshot-original": { + "title": { + "proceed-to-external-site": "" + } + }, "render-left-actions": { "text-public": "公开", "tooltip-view-as-scene": "作为场景查看" @@ -3297,11 +3955,26 @@ "dashboard-loading": { "cancel-loading-dashboard": "取消加载数据面板" }, + "dashboard-page-error": { + "text": { + "not-found": "未找到" + } + }, "dashboard-settings": { "actions": { "close": "关闭" } }, + "dashboard-slice": { + "title": { + "dashboard-init-failed": "" + } + }, + "dashboard-srv": { + "message": { + "edit-dashboard-json": "" + } + }, "dashboard-validation": { "body-dashboard-failed-schema-validation": "验证是为了开发目的而提供的,应该可以正常忽略。如果您是 Grafana 开发人员,请考虑检查和更新数据面板架构", "title-checking-dashboard-validity": "检查数据面板有效性", @@ -3397,6 +4070,13 @@ "values": "以逗号分隔的值", "values-placeholder": "1, 10, mykey : myvalue, myvalue, escaped,value" }, + "datasource-options": { + "name-filter": "", + "name-filter-description": "", + "name-filter-placeholder": "", + "type": "类型", + "type-placeholder": "" + }, "description": "描述", "description-placeholder": "描述性文本", "label": "标签", @@ -3415,8 +4095,8 @@ "category": "选择内容选项", "custom-all-value": "自定义所有值", "custom-all-value-description": "用于表示“全部”的通配符正则表达式或其他值", - "include-all": "包含“全部”选项", - "include-all-description": "启用选项以包含所有值", + "include-all": "", + "include-all-description": "", "multi-value": "多值" }, "type-category": "{{type}} 选项" @@ -3442,14 +4122,97 @@ "errors": { "failed-to-load": "加载数据面板失败" }, + "fetch-dashboard": { + "message": { + "failed-to-fetch-dashboard": "" + } + }, "gen-aihistory": { "aria-label-send-custom-feedback": "发送自定义反馈", "footer-text": "此内容使用 <2>Grafana LLM 插件</2>通过 AI 生成", "placeholder-tell-ai-what-to-do-next": "告诉 AI 下一步该做什么..." }, + "general-settings-unconnected": { + "editable-options": { + "label": { + "editable": "可编辑", + "readonly": "" + } + } + }, + "get-debug-dashboard": { + "title": { + "annotations": "注释" + } + }, + "get-errors": { + "message": { + "error-loading-data": "" + } + }, "get-field-override-categories": { "label-add-field-override": "添加字段覆盖", - "label-add-override-property": "添加覆盖属性" + "label-add-override-property": "添加覆盖属性", + "title": { + "add-button": "" + } + }, + "get-library-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "信息", + "name": "名称" + } + }, + "get-library-viz-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "信息", + "name": "名称" + } + }, + "get-panel-editor-tabs": { + "text": { + "alert": "", + "query": "查询", + "transform-data": "" + } + }, + "get-panel-frame-category": { + "descriptor": { + "title": { + "panel-options": "面板选项" + } + }, + "direction-options": { + "label": { + "horizontal": "水平", + "vertical": "垂直" + } + }, + "title": { + "description": "描述", + "max-per-row": "每行最大值", + "panel-links": "面板关联", + "repeat-by-variable": "按变量重复", + "repeat-direction": "重复方向", + "repeat-options": "重复选项", + "title": "标题", + "transparent-background": "透明背景" + } + }, + "get-panel-menu": { + "text": { + "extensions": "" + } }, "help-wizard": { "copy-to-clipboard": "复制到剪贴板", @@ -3462,10 +4225,21 @@ "randomize-field-names-label-field-names": "字段名称", "randomize-labels-label-labels": "标签", "randomize-string-values-label-string-values": "字符串值", + "tabs": { + "label": { + "data": "数据", + "snapshot": "快照" + } + }, "title-complete-git-hub-comment-clipboard": "将完整的 GitHub 评论复制到剪贴板", "title-get-help-with-this-panel": "获取此面板的帮助", "troubleshooting-docs": "故障排除文档" }, + "init-dashboard": { + "message": { + "failed-create-dashboard-model": "" + } + }, "inspect": { "data-tab": "数据", "error-tab": "错误", @@ -3518,6 +4292,16 @@ "rows": "总行数", "table-title": "统计信息" }, + "k8s-dashboard-api": { + "title": { + "deleted": "" + } + }, + "k8s-dashboard-v2api": { + "title": { + "deleted": "" + } + }, "layout": { "common": { "copy": "复制", @@ -3530,6 +4314,13 @@ "panel-layout-disabled": "选择一行或选项卡以更改面板布局选项" } }, + "legacy-dashboard-api": { + "fetch-error": { + "message": { + "dashboard-not-found": "" + } + } + }, "make-editable": { "dashboard-not-editable": "数据面板不可编辑", "make-editable": "设为可编辑" @@ -3549,6 +4340,20 @@ "menu-use-library-panel": "使用库面板" }, "new-panel-title": "新面板", + "on-create-new-row": { + "new-row": { + "title": { + "row-title": "" + } + } + }, + "on-create-new-widget-panel": { + "new-panel": { + "title": { + "widget-title": "" + } + } + }, "options": { "description": "描述", "title-option": "标题" @@ -3607,6 +4412,30 @@ "paused": "此数据面板已被管理员暂停", "try-again-later": "请稍后再试" }, + "remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, + "repeat-row-select": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, + "repeat-row-select2": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, "revert-dashboard-modal": { "body-restore-version": "您确定要将数据面板还原到版本吗 {{version}}?所有未保存的更改都将丢失。", "title-restore-version": "恢复版本" @@ -3720,6 +4549,18 @@ "sub-menu-un-connected": { "aria-label-template-variables": "模板变量" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "tabs-layout": { "delete-tab-text": "删除此选项卡也将移除所有面板。您确认要继续吗?", "delete-tab-title": "删除选项卡?", @@ -3925,7 +4766,10 @@ }, "unthemed-dashboard-row": { "aria-label-delete-row": "刪除行", - "learn-more": "了解更多" + "learn-more": "了解更多", + "title": { + "delete-row": "刪除行" + } }, "validation": { "invalid-dashboard-id": "找不到有效的 Grafana.com ID", @@ -3960,6 +4804,16 @@ }, "visualization-select-pane": { "placeholder-search-for": "搜索...", + "radio-options": { + "description": { + "reusable-panels-share-between-multiple-dashboards": "" + }, + "label": { + "library-panels": "库面板", + "suggestions": "", + "visualizations": "" + } + }, "title-close": "关闭" }, "viz-panel": { @@ -4010,12 +4864,25 @@ "label-data-source": "数据源", "label-use-static-key-dimensions": "使用静态键维度" }, + "add-to-dashboard": { + "message": { + "could-navigate-selected-dashboard-please-again": "", + "could-panel-dashboard-please-again": "" + } + }, "add-to-dashboard-form": { "cancel": "取消", "description-choose-where-to-add-the-panel": "选择要添加面板的位置。", "description-select-which-dashboard-panel-created": "选择要在其中创建面板的数据面板。", + "label": { + "existing-dashboard": "现有数据面板", + "new-dashboard": "新建仪表板" + }, "label-dashboard": "仪表板", "label-target-dashboard": "目标数据面板", + "message": { + "this-field-is-required": "此字段是必填字段。" + }, "open-dashboard": "打开数据面板", "open-in-new-tab": "在新标签页中打开", "title-error-adding-the-panel": "添加面板时出错" @@ -4053,6 +4920,25 @@ "it-cannot-contain-or": "不能包含“//”或“..”。", "least-valid-character": "它必须至少有一个有效字符。" }, + "build-new-dashboard-save-model": { + "data": { + "title": { + "new-dashboard": "新建仪表板" + } + } + }, + "build-new-dashboard-save-model-v2": { + "data": { + "title": { + "new-dashboard": "新建仪表板" + } + } + }, + "config-public-dashboard": { + "title": { + "revoke-public-url": "撤销公共网址" + } + }, "constant-variable-form": { "constant-options": "常量选项", "label-value": "值", @@ -4100,22 +4986,89 @@ "value-not-saved": "该值尚未保存在 Grafana 数据库中", "view-pull-request-in-git-hub": "在 GitHub 中查看拉取请求" }, + "dashboard-scene": { + "text": { + "edit-panel": "", + "view-panel": "查看面板" + }, + "title": { + "dashboard": "仪表板", + "discard-changes-to-dashboard": "" + } + }, + "dashboard-scene-page-state-manager": { + "message": { + "dashboard-not-found": "" + } + }, + "dashboard-scene-page-state-manager-v2": { + "message": { + "dashboard-not-found": "" + } + }, "data-source-variable-form": { "data-source-options": "数据源选项", "description-instance-name-filter": "正则表达式筛选器,用于在变量值列表中选择数据源实例。保留所有为空。", "example-instance-name-filter": "示例:<codeExample />", "selection-options": "选择内容选项" }, + "default-grid-layout-manager": { + "row": { + "title": { + "row-title": "" + } + } + }, "description-label": { "description": "描述" }, + "edit-link-view": { + "edit-link-page-nav": { + "text": { + "edit-link": "编辑链接" + } + } + }, "email-list": { "aria-label-emailmenu": "切换电子邮件菜单" }, + "embedded-dashboard-test-page": { + "subTitle": { + "showing-dashboard-panel-tests-pie-chart": "" + }, + "text": { + "embedding-dashboard": "" + } + }, "empty-transformations-message": { "add-transformation": "添加转换" }, + "get-edit-options": { + "title": { + "column-options": "", + "row-height-options": "" + } + }, + "get-panel-frame-options": { + "descriptor": { + "title": { + "panel-options": "面板选项" + } + }, + "title": { + "description": "描述", + "panel-links": "面板关联", + "title": "标题", + "transparent-background": "透明背景" + } + }, + "get-workflow-options": { + "label": { + "push-to-a-new-branch": "" + } + }, "group-by-variable-form": { + "alert-not-supported": "", "description-enables-users-custom-values": "允许用户向列表中添加自定义值", "description-provide-dimensions-as-csv-dimension-name-dimension-id": "以 CSV 格式提供维度:{{name}}, {{value}}", "group-by-options": "分组选项", @@ -4134,6 +5087,12 @@ "randomize-field-names-label-field-names": "字段名称", "randomize-labels-label-labels": "标签", "randomize-string-values-label-string-values": "字符串值", + "tabs": { + "label": { + "data": "数据", + "snapshot": "快照" + } + }, "title-complete-git-hub-comment-clipboard": "将完整的 GitHub 评论复制到剪贴板", "title-get-help-with-this-panel": "获取此面板的帮助", "troubleshooting-docs": "故障排除文档", @@ -4175,6 +5134,14 @@ "body-name-already-exists": "所选文件夹中已存在具有相同名称的数据面板。您仍然要保存此数据面板吗?", "title-name-already-exists": "名称已存在" }, + "on-remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, "panel-data-alerting-tab-rendered": { "alert": { "title-errors-loading-rules": "加载规则时出错" @@ -4196,6 +5163,11 @@ "table-view-aria-label-toggletableview": "切换表格视图", "table-view-label-table-view": "表视图" }, + "panel-editor": { + "text": { + "edit-panel": "" + } + }, "panel-editor-renderer": { "aria-label-open-options-pane": "打开选项窗格", "tooltip-open-options-pane": "打开选项窗格" @@ -4204,8 +5176,22 @@ "body-panel-plugin-not-loaded": "在打开检查之前,请确保您要检查的面板可见且已显示。", "title-panel-plugin-not-loaded": "面板插件未加载" }, + "panel-menu-behavior": { + "async-func": { + "text": { + "extensions": "", + "metrics-drilldown": "" + } + } + }, "panel-viz-type-picker": { "placeholder-search-for": "搜索...", + "radio-options": { + "label": { + "suggestions": "", + "visualizations": "" + } + }, "title-close": "关闭" }, "provisioned-delete-modal": { @@ -4232,6 +5218,15 @@ "query-options": "查询选项", "selection-options": "选择内容选项" }, + "resource-export": { + "label": { + "classic": "", + "json": "JSON", + "v1-resource": "", + "v2-resource": "", + "yaml": "" + } + }, "revert-dashboard-modal": { "body-restore-version": "您确定要将数据面板还原到版本吗 {{version}}?所有未保存的更改都将丢失。", "title-restore-version": "恢复版本" @@ -4339,6 +5334,18 @@ "solo-panel-page": { "loading": "正在加载" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "text-box-variable-form": { "placeholder-default-value-if-any": "(可选)", "text-options": "文本选项" @@ -4349,6 +5356,13 @@ "title-field-label": { "title": "标题" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "transformations-drawer": { "search-box-suffix": { "tooltip-clear-search": "清除搜索" @@ -4364,6 +5378,13 @@ "save-dashboard": "保存仪表板", "title-unsaved-changes": "未保存的更改" }, + "use-dashboard-edit-page-nav": { + "page-nav": { + "text": { + "settings": "设置" + } + } + }, "variable-check-indicator": { "aria-label-variable-referenced-dashboard": "此变量未被任何变量或数据面板引用。", "aria-label-variable-referenced-other-variables-dashboard": "此变量被其他变量或数据面板引用。", @@ -4380,7 +5401,10 @@ "placeholder-descriptive-text": "描述性文本", "placeholder-label-name": "标签名称", "placeholder-variable-name": "变量名称", - "text-running-query": "正在运行查询..." + "text-running-query": "正在运行查询...", + "title": { + "delete-variable": "删除变量" + } }, "variable-editor-list": { "definition": "定义", @@ -4562,6 +5586,25 @@ "message": "未找到数据源" } }, + "datagrid": { + "add-column": { + "placeholder-column-name": "" + }, + "datagrid-context-menu": { + "render-context-menu-items": { + "label-clear-column": "", + "label-clear-row": "", + "label-remove-all-data": "", + "label-search": "搜索..." + }, + "render-header-menu-items": { + "label-clear-column": "", + "label-delete-column": "", + "label-rename-column": "", + "label-set-field-type": "" + } + } + }, "datasources": { "add-new-data-source-button": { "tooltip-no-permission": "您没有配置新数据源的权限" @@ -4583,6 +5626,46 @@ "label-default": "默认", "label-name": "名称" }, + "build-categories": { + "categories": { + "title": { + "cloud": "云", + "distributed-tracing": "", + "enterprise-plugins": "企业插件", + "industrial-io-t": "", + "logging-document-databases": "", + "others": "", + "profiling": "", + "sql": "", + "time-series-databases": "" + } + } + }, + "build-nav-model": { + "analytics": { + "text": { + "insights": "洞察" + } + }, + "caching": { + "text": { + "cache": "" + } + }, + "ds-permissions": { + "text": { + "permissions": "权限" + } + }, + "nav-model": { + "text": { + "settings": "设置" + } + }, + "text": { + "dashboards": "仪表板" + } + }, "button-row": { "delete": "删除", "save-and-test": "保存并测试", @@ -4618,6 +5701,11 @@ "data-source-read-only-message": { "title-provisioned-data-source": "配置的数据源" }, + "data-source-settings-reducer": { + "message": { + "testing-could-couple-minutes": "" + } + }, "data-source-type-card": { "aria-label-learn-more": "{{dataSourcePluginName}},了解更多。" }, @@ -4635,13 +5723,88 @@ "footer": { "add-csv-or-spreadsheet": "添加 csv 或电子表格" }, + "get-enterprise-phantom-plugins": { + "description": { + "adobe-analytics-datasource": "", + "app-dynamics-integration-and-data-source": "", + "atlassian-statuspage-datasource": "", + "aurora-data-source": "", + "azure-cosmos-db-datasource": "", + "azure-devops-datasource": "", + "catchpoint-datasource": "", + "cloudflare-datasource": "", + "cockroach-db-datasource": "", + "data-dog-integration-and-data-source": "", + "drone-datasource": "", + "git-lab-integration-and-datasource": "", + "honeycomb-integration-and-datasource": "", + "jira-integration-and-datasource": "", + "logic-monitor-devices-datasource": "", + "mongo-db-integration-and-data-source": "", + "netlify-datasource": "", + "new-relic-integration-and-data-source": "", + "pager-duty-datasource": "", + "salesforce-integration-and-datasource": "", + "sap-hana-integration-and-data-source": "", + "service-now-integration-and-data-source": "", + "signal-fx-integration-and-datasource": "", + "snowflake-integration-and-data-source": "", + "sumo-logic-integration-and-datasource": "", + "visualize-and-explore-dynatrace-data": "", + "visualize-and-explore-oracle-sql": "", + "visualize-and-explore-splunk-logs": "", + "wavefront-integration-and-data-source": "", + "zendesk-datasource": "" + } + }, + "get-grafana-cloud-phantom-plugin": { + "description": { + "hosted-graphite-prometheus-and-loki": "" + } + }, "new-data-source-view": { "cancel": "取消", "placeholder-filter-by-name-or-type": "按名称或类型筛选" }, + "update-data-source": { + "error-info": { + "message": { + "an-unexpected-error-occurred": "" + } + } + }, "use-data-source-info": { "badge-text-not-supported": "不支持", - "badge-text-supported": "支持" + "badge-text-supported": "支持", + "label": { + "alerting": "警报", + "type": "类型" + } + }, + "use-delete-loaded-data-source": { + "title": { + "delete": "删除" + } + } + }, + "debug": { + "cursor-view": { + "no-events-yet": "" + }, + "render-info-viewer": { + "data-counter": "", + "elapsed-time": "", + "field": "字段", + "last": "", + "render-counter": "", + "schema-counter": "", + "title-reset-counters": "", + "tooltip-step-back": "", + "type": "类型" + }, + "state-view": { + "current-value": "", + "label-state-name": "" } }, "dimensions": { @@ -4710,6 +5873,19 @@ "remove-value-mapping-aria-label-delete-value-mapping": "删除值映射", "remove-value-mapping-tooltip-delete": "删除", "set-color": "设置颜色", + "special-match-options": { + "description": { + "boolean-false-values": "", + "boolean-true-values": "", + "empty-string": "", + "matches-against-number-na-n-not-a-number": "", + "matches-null-and-undefined-values": "", + "matches-null-undefined-and-na-n": "" + }, + "label": { + "empty": "空" + } + }, "tooltip-remove-color": "移除颜色", "tooltip-remove-icon": "移除图标" }, @@ -4725,6 +5901,20 @@ "display-text": "显示文字", "icon": "图标", "label-add-a-new-mapping": "添加一个新映射", + "mapping-types": { + "description": { + "match-a-numerical-range-of-values": "", + "match-a-regular-expression-with-replacement": "", + "match-a-specific-text-value": "", + "match-boolean-empty-values": "" + }, + "label": { + "range": "", + "regex": "", + "special": "", + "value": "值" + } + }, "update": "更新" } }, @@ -4749,6 +5939,7 @@ }, "explore": { "accordian-logs": { + "events": "", "footer": "事件时间戳相对于完整跟踪的开始时间。" }, "accordian-references": { @@ -4759,6 +5950,11 @@ "basic-extensions": { "aria-label-add": "添加" }, + "build-dashboard-panel-from-explore-state": { + "title": { + "new-panel": "" + } + }, "clear": "清除", "confirm-navigation-modal": { "cancel": "取消", @@ -4845,6 +6041,33 @@ "title-table": "表格", "title-traces": "跟踪" }, + "explore-query-inspector": { + "data-tab": { + "label": { + "data": "数据" + } + }, + "error-tab": { + "label": { + "error": "错误" + } + }, + "json-tab": { + "label": { + "json": "JSON" + } + }, + "query-tab": { + "label": { + "query": "查询" + } + }, + "stats-tab": { + "label": { + "stats": "统计信息" + } + } + }, "explore-run-query-button": { "run-button": { "aria-label-run-query-options": "运行查询选项" @@ -4858,10 +6081,23 @@ "description-explore-disabled": "要启用 Explore,请在 Grafana 配置中启用该选项:", "title-explore-disabled": "Explore 已禁用" }, + "get-field-links-for-explore": { + "text": { + "data": "数据", + "raw-value": "" + } + }, "get-matches-metadata": { "matches": "0 个匹配项" }, "legacy-create-span-link-factory": { + "text": { + "tags": "标签" + }, + "title": { + "related-logs": "", + "session-for-this-span": "此跨度的会话" + }, "title-explore-metrics-for-this-span": "浏览此跨度的指标", "title-explore-split": "在分割视图中浏览此项目的日志", "title-session-for-this-span": "此跨度的会话" @@ -4902,6 +6138,10 @@ }, "logs-meta-row": { "download": "下载", + "label": { + "deduplication-count": "", + "showing-only-selected-fields": "" + }, "show-original-line": "显示原始行" }, "logs-sample-panel": { @@ -5083,6 +6323,21 @@ "run-query-button": "运行查询", "switch-datasource-button": "切换数据源并运行查询" }, + "scoped-vars-from-span": { + "text": { + "span": "" + } + }, + "scoped-vars-from-tags": { + "text": { + "tags": "标签" + } + }, + "scoped-vars-from-trace": { + "text": { + "trace": "跟踪" + } + }, "search-bar-input": { "placeholder-find": "查找...", "suffix": { @@ -5117,9 +6372,25 @@ "tooltip-tag-key": "将用于获取标记值的标记键。将搜索跨度的属性和资源以获取标记键" }, "span-detail": { + "label": { + "kind": "", + "library-name": "", + "library-version": "", + "status": "状态:", + "status-message": "", + "trace-state": "" + }, "label-resource-attributes": "资源属性", "label-span-attributes": "跨度属性", "label-stack-trace": "堆栈跟踪", + "overview-items": { + "label": { + "child-count": "", + "duration": "", + "service": "", + "start-time": "" + } + }, "warnings": "警告" }, "span-filters": { @@ -5226,6 +6497,18 @@ "title-node-graph": "节点图" }, "unthemed-logs": { + "description": { + "show-results-in-logs-visualisation": "", + "show-results-in-table-visualisation": "", + "show-results-newest-to-oldest": "", + "show-results-oldest-to-newest": "" + }, + "label": { + "logs": "日志", + "newest-first": "最新在前", + "oldest-first": "最早在前", + "table": "表格" + }, "label-deduplication": "去重", "label-display-results": "显示结果", "label-prettify-json": "美化 JSON", @@ -5241,6 +6524,15 @@ }, "unthemed-virtualized-trace-view": { "title-scroll-to-top": "滚动到顶部" + }, + "use-focus-span-link": { + "create-focus-span-link": { + "link": { + "title": { + "deep-link-to-this-span": "" + } + } + } } }, "export": { @@ -5326,6 +6618,15 @@ "folder-repo": { "badge-text": "已预置" }, + "folders": { + "get-loading-nav": { + "main": { + "title": { + "loading": "正在加载" + } + } + } + }, "forgot-password": { "back-button": "返回登录", "change-password": { @@ -5355,10 +6656,102 @@ "incomplete-request-error": "很抱歉,我无法完成您的请求。请重试。", "send-custom-feedback": "发送" }, + "geomap": { + "coordinates-map-view-editor": { + "label-latitude": "", + "label-longitude": "" + }, + "debug-overlay": { + "center": "", + "zoom": "" + }, + "fit-map-view-editor": { + "all-layers-editor-fragment": { + "label-layer": "" + }, + "label-data": "数据", + "last-only-editor-fragment": { + "label-padding": "", + "tooltip-padding-relative-percent-beyond-extent": "" + } + }, + "frame-multi-selection-editor": { + "placeholder-change-filter": "" + }, + "frame-selection-editor": { + "placeholder-change-filter": "" + }, + "geomap-panel": { + "aria-label-map": "" + }, + "geomap-style-rules-editor": { + "aria-label-add-geomap-style-rule": "" + }, + "layers-editor": { + "label-add-layer": "", + "no-layers": "" + }, + "map-view-editor": { + "label-max-zoom": "", + "label-view": "查看", + "label-zoom": "缩放", + "use-current-map-settings": "" + }, + "markers-legend": { + "title-symbol": "符号" + }, + "measure-overlay": { + "tooltip-show-measure-tools": "" + }, + "plugin": { + "basemap-layer-configured-server-admin": "" + }, + "style-editor": { + "label-align": "", + "label-baseline": "", + "label-color": "颜色", + "label-fill-opacity": "", + "label-font-size": "", + "label-opacity": "", + "label-rotation-angle": "", + "label-size": "", + "label-symbol": "符号", + "label-symbol-horizontal-align": "", + "label-symbol-vertical-align": "", + "label-text-label": "", + "label-x-offset": "", + "label-y-offset": "" + }, + "style-rule-editor": { + "aria-label-comparison-operator": "比较运算符", + "aria-label-comparison-value": "", + "aria-label-delete-style-rule": "", + "aria-label-feature-property": "", + "label-rule": "规则", + "placeholder-feature-property": "", + "placeholder-numeric-value": "", + "placeholder-value": "值" + } + }, "get-enterprise": { "requires-license": "需要 Grafana 企业版许可证", "title": "企业" }, + "gettingstarted": { + "docs-card": { + "complete": "完成", + "learn-how": "" + }, + "getting-started": { + "aria-label-to-advanced-tutorials": "", + "aria-label-to-basic-tutorials": "", + "checking-completed-setup-steps": "", + "remove-this-panel": "" + }, + "tutorial-card": { + "complete": "完成" + } + }, "gops": { "config-card": { "text-loading-configuration": "正在载入配置..." @@ -5375,6 +6768,74 @@ }, "progress-status": { "your-progress": "您的进度" + }, + "use-get-configuration-for-ui": { + "get-connect-data-source-configuration": { + "title": { + "connect-data-source": "" + } + }, + "title": { + "essentials": "基础项" + } + }, + "use-get-essentials-configuration": { + "essential-content": { + "description": { + "configure-grafana-alerting": "", + "create-integration-alerting-contact-point": "", + "initialize-incident-plugin-declare-manage-incidents": "", + "practice-solving-an-incident": "", + "receive-alerts-oncall-notifications-within-environment": "", + "select-chat-ops-channels-to-route-notifications": "" + }, + "label": { + "add": "添加", + "connect": "连接", + "initialize": "", + "select-integration": "", + "start-drill": "" + }, + "title": { + "add-slack-notifications-to-irm-integrations": "", + "connect-alerting-to-irm": "", + "connect-irm-to-your-slack-workspace": "", + "connect-your-messaging-workspace-to-incident": "", + "connect-your-messaging-workspace-to-on-call": "", + "create-incident-drill": "", + "detect": "检测", + "initialize-incident-plugin": "", + "messaging-workspace-channel-on-call-integration": "", + "respond": "", + "test-your-configuration": "" + } + }, + "get-grafana-alerting-config-steps": { + "description": { + "create-alert-monitor-system": "", + "create-on-call-integration-alerting-contact-point": "", + "create-slos-to-monitor-your-service": "" + }, + "label": { + "connect": "连接", + "create": "创建", + "enable": "启用" + }, + "steps": { + "label": { + "edit": "编辑" + }, + "title": { + "update-default-contact-point": "" + } + }, + "title": { + "connect-alerting-to-on-call": "", + "create-alert-rule": "创建警报规则", + "create-slo": "", + "enable-slo-alerting": "" + } + } } }, "grafana": { @@ -5741,14 +7202,18 @@ "duplicate-panel": "复制面板", "exit-edit/setting-views": "退出编辑/设置视图", "expand-all-rows": "展开所有行", + "explore-panel": "", "go-to-dashboards": "转到仪表板", "go-to-explore": "转到 浏览", "go-to-home-dashboard": "转到主仪表板", "go-to-profile": "转到个人资料", + "inspect-panel": "", "make-time-range-permanent": "使时间范围成为绝对/永久", "move-time-range-back": "向后移动时间范围", "move-time-range-forward": "向前移动时间范围", "open-search": "打开搜索", + "open-share-embed-drawer": "", + "open-share-link-drawer": "", "open-shared-modal": "共享面板快照", "paste-time-range": "粘贴时间范围", "refresh-all-panels": "刷新所有面板", @@ -5774,6 +7239,11 @@ "support-bundle": "您还可以在<1>支持包部分</1>中检索包含有关 Grafana 实例和已配置数据源信息的支持包。", "troubleshooting-help": "要请求故障排除帮助,请将此面板的快照发送给 Grafana Labs 技术支持。快照包含查询响应数据和面板设置。" }, + "histogram": { + "histogram-panel": { + "no-histogram-found-in-response": "" + } + }, "inspector": { "inspect-data-tab": { "loading": "正在加载", @@ -5821,6 +7291,9 @@ "label-name": "名称", "label-password": "密码", "label-username": "用户名", + "message": { + "email-is-invalid": "" + }, "placeholder-name-optional": "姓名(选填项)", "placeholder-password": "密码", "placeholder-username": "用户名", @@ -6077,8 +7550,26 @@ "discard-local-changes": "放弃本地更改", "title-dashboard-changed": "数据面板已更改" }, + "live-channel-editor": { + "description-grafana-live": "", + "namespace": "命名空间", + "path": "路径", + "placeholder-select-watchable-resource": "", + "scope": "", + "title-grafana-live": "" + }, "live-connection-warning": { "title-connection-to-server-is-lost": "与服务器的连接已丢失..." + }, + "live-panel": { + "error": "错误", + "grafana-requires-feature": "", + "panel-editor-channel": "", + "title-grafana-live": "", + "waiting-for-data": "" + }, + "live-publish": { + "publish": "" } }, "lock-icon": "锁定图标", @@ -6125,6 +7616,13 @@ } }, "logs": { + "get-dataframe-fields": { + "vars": { + "text": { + "labels": "标签" + } + } + }, "infinite-scroll": { "end-of-range": "所选时间范围的结束。", "load-more": "滚动以加载更多", @@ -6205,6 +7703,11 @@ "shortcut": "在按住 alt 键的同时选择以再次启用" } }, + "log-series-to-logs-model": { + "label": { + "total-bytes-processed": "" + } + }, "logs-controls": { "deduplication": "去重", "disable-highlighting": "禁用突出显示", @@ -6239,6 +7742,11 @@ "scroll-top": "滚动到顶部", "start-of-range": "范围的开始" }, + "logs-panel": { + "render-common-labels": { + "common-labels": "" + } + }, "out-of-range-message": { "end-of-the-selected-time-range": "所选时间范围的结束。" }, @@ -6295,6 +7803,14 @@ }, "snapshot-list-table": { "title-delete": "删除" + }, + "unthemed-dashboard-import": { + "subTitle": { + "import-dashboard-from-file-or-grafanacom": "" + }, + "text": { + "import-dashboard": "导入仪表板" + } } }, "migrate-to-cloud": { @@ -6952,8 +8468,54 @@ "close": "关闭抽屉" }, "link-title": "前往 Grafana Labs 博客", + "news-panel": { + "body-error-loading-rss-feed": "", + "loading": "加载中...", + "title-error-loading-rss-feed": "" + }, "title": "最新博客" }, + "nodeGraph": { + "arc-options-editor": { + "add-arc": "", + "title-remove-arc": "" + }, + "edge": { + "aria-label-from-to": "" + }, + "edge-header": { + "label-source-target": "" + }, + "marker": { + "100-node-count": "", + "aria-label-hidden-marker": "", + "node-count_other": "" + }, + "node": { + "aria-label-node-title": "" + }, + "node-graph": { + "aria-label-layered-layout-performance-warning": "", + "aria-label-nodes-hidden-warning": "", + "computing-layout": "", + "no-data": "没有数据", + "hidden-nodes_other": "", + "processed-nodes_other": "" + }, + "node-graph-panel": { + "no-data-found-in-response": "" + }, + "node-header": { + "label-subtitle": "", + "label-title": "标题" + }, + "view-controls": { + "hide-config": "", + "show-config": "", + "title-zoom-in": "", + "title-zoom-out": "" + } + }, "notifications": { "empty-state": { "description": "您收到的通知将显示在此处", @@ -6995,6 +8557,11 @@ "label-organization-name": "组织名称", "placeholder-org-name": "组织名称" }, + "org-details-page": { + "title": { + "confirm-preferences-update": "" + } + }, "org-profile": { "label-organization-name": "组织名称", "label-organization-profile": "组织资料", @@ -7014,7 +8581,10 @@ "tooltip": "您现在可以选择“无基本角色”选项,并根据自定义需求添加权限。您可以在<1>我们的文档</1>中找到更多信息。" }, "user-invite-page": { - "sub-title": "发送邀请或将现有 Grafana 用户添加到组织。<1>{{orgName}}</1>" + "sub-title": "发送邀请或将现有 Grafana 用户添加到组织。<1>{{orgName}}</1>", + "text": { + "invite-user": "" + } } }, "org-picker": { @@ -7026,6 +8596,38 @@ } }, "panel": { + "get-calculation-value-data-links-variable-suggestions": { + "value-calc-var": { + "label": { + "calculation-name": "" + } + } + }, + "get-data-links-variable-suggestions": { + "value-time-var": { + "label": { + "time": "时间" + } + } + }, + "get-field-links-supplier": { + "text": { + "data": "数据", + "field": "字段", + "series": "", + "value": "值" + } + }, + "get-field-vars": { + "label": { + "name": "名称" + } + }, + "get-panel-links-variable-suggestions": { + "label": { + "all-variables": "" + } + }, "header-menu": { "copy": "复制", "create-library-panel": "创建库面板", @@ -7086,6 +8688,13 @@ "select-placeholder": "按类型筛选" }, "playlist": { + "playlist-new-page": { + "page-nav": { + "text": { + "new-playlist": "新建播放列表" + } + } + }, "playlist-table-rows": { "aria-label-playlist-item": "播放列表项目,{{itemType}},{{itemValue}}", "multiple-dashboards-found": "找到多个项目:{{items}}", @@ -7102,6 +8711,12 @@ "label-mode": "模式", "label-time-and-refresh": "时间和刷新", "label-variables": "变量", + "modes": { + "label": { + "kiosk": "Kiosk", + "normal": "正常" + } + }, "title-start-playlist": "启动播放列表" } }, @@ -7168,6 +8783,19 @@ }, "browse": { "aria-label-plugin-type-filter": "插件类型筛选器", + "filter-by-options": { + "label": { + "all": "全部", + "installed": "已安装", + "new-updates": "" + } + }, + "label": { + "all": "全部", + "applications": "", + "data-sources": "数据源", + "panels": "面板" + }, "label-search": "搜索", "label-state": "状态", "label-type": "类型", @@ -7249,12 +8877,24 @@ "empty-state": { "message": "找不到插件" }, + "extensions-log-data-source": { + "message": { + "ok": "好" + } + }, "filter": { "disabled": "该筛选器已禁用,因为 Grafana 服务器无法访问 grafana.com", "sort": "排序", "sort-list": "对插件列表排序", "state": "状态" }, + "get-feature-state-info": { + "text": { + "alpha": "", + "beta": "Beta 测试版", + "deprecated": "已弃用" + } + }, "get-started-with-app": { "disable": "禁用", "enable": "启用" @@ -7311,6 +8951,16 @@ "plugin-details-header-dependencies": { "grafana-dependency": "Grafana {{grafanaDependency}}" }, + "plugin-details-page": { + "not-found-model": { + "subTitle": { + "requested-belong-plugin": "" + }, + "text": { + "unknown-plugin": "" + } + } + }, "plugin-details-signature": { "body-invalid-plugin-signature": "Grafana Labs 会检查每个插件,以验证它们是否具有有效的数字签名。插件签名验证是我们安全措施的一部分,旨在确保插件安全可信。Grafana Labs 无法保证此未签名插件的完整性。请让插件作者要求对其签名。", "read-more-about-plugins-signing": "了解更多有关插件签名的信息。", @@ -7356,6 +9006,13 @@ "search-field": { "placeholder-search-grafana-plugins": "搜索 Grafana 插件" }, + "use-plugin-details-tabs": { + "nav-model-children": { + "text": { + "dashboards": "仪表板" + } + } + }, "version-install-button": { "text-installed": "已安装" }, @@ -7472,6 +9129,11 @@ "label-git-hub-features": "GitHub 功能", "label-realtime-feedback": "实时反馈" }, + "connect-page": { + "subTitle": { + "connect-external-storage-manage-resources": "" + } + }, "connect-repository-button": { "configure": "配置", "configure-file": "配置文件预配", @@ -7505,7 +9167,13 @@ }, "edit-repository-page": { "back-to-repositories": "回到存储库", - "repository-config-exists-configuration": "确保存储库配置存在于配置文件中。" + "repository-config-exists-configuration": "确保存储库配置存在于配置文件中。", + "subTitle": { + "configure-repository-storing-resources": "" + }, + "text": { + "configure-repository": "" + } }, "empty-state": { "no-jobs": "无作业..." @@ -7568,6 +9236,11 @@ "no-results-matching-your-query": "没有找到与您的查询匹配的结果", "placeholder-search": "搜索" }, + "get-default-values": { + "title": { + "repository": "存储库" + } + }, "getting-started": { "alert-temporary-outage": "在连接整个实例的情况下,数据面板在运行迁移时将不可用。我们建议您在开始此流程之前提醒您的用户。", "modal-description-public-access": "设置对您 Grafana 实例的公共访问以启用 GitHub 集成", @@ -7712,7 +9385,18 @@ "dashboard-preview": "数据面板预览", "existing-dashboard": "现有数据面板", "history": "历史记录", + "message": { + "removed-from-repo-test-ui": "", + "updated-from-repo-test-ui": "" + }, "repository": "存储库", + "tab-info": { + "label": { + "dry-run-result-after-apply": "", + "existing-from-grafana": "", + "file-from-repository": "" + } + }, "title-error-saving-file": "保存文件时出错" }, "setup-modal": { @@ -8121,14 +9805,6 @@ "reload-button": "重新加载", "title": "无法找到应用程序文件" }, - "sandbox": { - "test-stuff-page": { - "application-notifications-toasts-testing": "应用程序通知(吐司)测试", - "error": "错误", - "success": "成功", - "warning": "警告" - } - }, "save-dashboards": { "message-length": { "info": "此消息有 {{messageLength}} 个字符,超出了 500 个字符的最大长度。请在保存前将其缩短。", @@ -8188,6 +9864,14 @@ "view-as-folders": "按文件夹查看", "view-as-list": "以列表形式查看" }, + "bluge-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } + }, "dashboard-actions": { "import": "导入", "new": "新建", @@ -8215,6 +9899,14 @@ "search-results-table": { "aria-label-search-results-table": "搜索结果表", "no-data": "没有值" + }, + "unified-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } } }, "select": { @@ -8286,6 +9978,11 @@ "delete-service-account": "删除服务账户", "disable-service-account": "禁用服务账户", "enable-service-account": "启用服务账户", + "page-nav": { + "subTitle": { + "manage-settings-individual-service-account": "" + } + }, "title-delete-service-account": "删除服务账户", "title-disable-service-account": "禁用服务账户", "tokens": "令牌", @@ -8602,6 +10299,11 @@ "sort-picker": { "select-aria-label": "排序" }, + "status-history": { + "status-history-panel": { + "too-many-points_other": "" + } + }, "support-bundles": { "new-bundle-button": { "new-support-bundle": "新的支持捆绑包" @@ -8609,7 +10311,10 @@ "support-bundles-create-unconnected": { "cancel": "取消", "create": "创建", - "sub-title": "选择支持捆绑包的组件。支持捆绑包将在创建后的 3 天内可用。" + "sub-title": "选择支持捆绑包的组件。支持捆绑包将在创建后的 3 天内可用。", + "text": { + "create-support-bundle": "" + } }, "support-bundles-unconnected": { "created-on": "创建时间", @@ -8624,10 +10329,35 @@ "login": "登录" }, "table": { + "auto-cell-options-editor": { + "description-wrap-text": "", + "label-wrap-text": "" + }, + "bar-gauge-cell-options-editor": { + "label-gauge-display-mode": "", + "label-value-display": "" + }, + "color-background-cell-options-editor": { + "description-apply-to-entire-row": "", + "description-wrap-text": "", + "label": { + "text-alpha": "" + }, + "label-apply-to-entire-row": "", + "label-background-display-mode": "", + "label-wrap-text": "", + "wrap-text": "" + }, "container": { "content": "在单个表中显示太多列可能会影响性能,并使数据难以阅读。请考虑优化您的查询。", "show-all-series": "显示所有列", "show-only-series": "仅显示 {{MAX_NUMBER_OF_COLUMNS}} 列" + }, + "image-cell-options-editor": { + "description-alt-text": "", + "description-title-text": "", + "label-alt-text": "", + "label-title-text": "" } }, "tag-filter": { @@ -8643,6 +10373,24 @@ "select-placeholder": "选择一个团队" }, "teams": { + "build-nav-model": { + "nav-model": { + "subTitle": { + "manage-members-and-settings": "" + }, + "text": { + "settings": "设置" + } + }, + "team-group-sync": { + "text": { + "external-group-sync": "外部组同步" + } + }, + "text": { + "members": "成员" + } + }, "create-team": { "create": "创建", "description-email": "这是可选项,主要用于允许自定义团队头像", @@ -8664,6 +10412,9 @@ "external-group-sync": "外部组同步", "label-add-external-group": "添加外部组", "team-sync-upgrade": "添加一个组,以便在试用 Grafana Pro 期间免费启用团队同步", + "text": { + "add-group": "添加组" + }, "title-there-external-groups": "没有可供同步的外部组", "tooltip-add-external-group": "LDAP 组示例:{{example}}" }, @@ -8765,6 +10516,42 @@ "select-search-input": "输入以搜索(国家、城市、缩写)" } }, + "timeseries": { + "annotation-editor2": { + "add-annotation": "添加注释", + "cancel": "取消", + "edit-annotation": "", + "label-description": "描述", + "label-tags": "标签", + "placeholder-add-tags": "", + "save": "保存", + "saving": "正在保存" + }, + "annotation-tooltip2": { + "tooltip-delete": "删除", + "tooltip-edit": "编辑" + }, + "line-style-editor": { + "title-the-input-expects-a-segment-list": "", + "tooltip-help": "帮助" + }, + "nulls-threshold-input": { + "placeholder-never": "从不" + }, + "outside-range-plugin": { + "data-outside-time-range": "", + "zoom-to-data": "" + }, + "timezones-editor": { + "tooltip-add-timezone": "", + "tooltip-remove-timezone": "" + } + }, + "traces": { + "traces-panel": { + "no-data-found-in-response": "" + } + }, "transformations": { "empty": { "add-transformation-body": "转换允许在显示可视化之前以各种方式更改数据。 <1></1>这包括合并数据、重命名字段、进行计算、格式化数据以便显示等等。", @@ -8801,6 +10588,10 @@ "convert-field-type-transformer-editor": { "aria-label-add-a-convert-field-type-transformer": "添加转换字段类型转换器", "aria-label-remove-convert-field-type-transformer": "移除转换字段类型转换器", + "label": { + "browser": "浏览器", + "utc": "" + }, "label-as": "为", "label-date-format": "日期格式", "label-field": "字段", @@ -8887,11 +10678,32 @@ "tooltip-format": "指定为 <2>Moment.js 格式字符串</2>的字段的输出格式。", "tooltip-timezone-manually": "手动设置日期的时区" }, + "get-timezone-options": { + "label": { + "browser": "浏览器", + "utc": "" + } + }, "get-tooltips": { "description": "json 对象的有效路径。", "json-value": "JSON 值:", + "map-valid-paths": { + "description": { + "extract-fields-from-object": "", + "extract-value": "", + "extract-value-first-element": "", + "extract-value-second-element": "" + } + }, "valid-paths": "有效路径:" }, + "get-transformer-option-pane": { + "root": { + "title": { + "root": "" + } + } + }, "group-by-field-configuration": { "placeholder-ignored": "已忽略", "placeholder-select-stats": "选择统计" @@ -8908,7 +10720,23 @@ "label-cell-value": "单元格值", "label-column": "列", "label-empty-value": "空值", - "label-row": "行" + "label-row": "行", + "special-value-options": { + "description": { + "boolean-false-value": "", + "boolean-true-value": "", + "empty-string": "", + "null-value": "", + "number-value": "" + }, + "label": { + "empty": "空", + "false": "", + "null": "", + "true": "", + "zero": "" + } + } }, "histogram-transformer-editor": { "placeholder-auto": "自动", @@ -8971,10 +10799,22 @@ "tooltip-naming": "设置所选字段名称的显示方式。因为帧名称通常更适合表格数据" }, "partition-by-values-editor": { + "keep-fields-options": { + "label": { + "no": "否", + "yes": "是" + } + }, "label-field": "字段", "label-keep-fields": "保留字段", "label-naming": "名称", "label-select-field": "选择字段", + "naming-modes-options": { + "label": { + "as-frame-name": "", + "as-label": "" + } + }, "partition-values-works-single-frame": "按值分区仅适用于单个帧。", "tooltip-keeps-partition-fields-frames": "在帧中保留分区字段" }, @@ -8996,6 +10836,16 @@ "label-include-time": "包含时间", "label-labels-to-fields": "标签到字段", "label-mode": "模式", + "modes": { + "description": { + "collapse-field-single-value": "", + "create-table-series-value": "" + }, + "label": { + "reduce-fields": "", + "series-to-rows": "" + } + }, "placeholder-choose-stat": "选择统计" }, "regex-matcher-editor": { @@ -9003,11 +10853,23 @@ "variable-regex-documentation": "" }, "regression-transformer-editor": { + "label": { + "cubic": "", + "quadratic": "", + "quartic": "", + "quintic": "" + }, "label-degree": "度", "label-model-type": "模型类型", "label-predicted-points": "预测点", "label-x-field": "X 字段", "label-y-field": "Y 字段", + "model-type-options": { + "label": { + "linear": "", + "polynomial": "" + } + }, "tooltip-number-of-xy-points-to-predict": "要预测的 X,Y 点的数量" }, "rename-by-regex-transformer-editor": { @@ -9025,6 +10887,23 @@ "label-reverse": "反转", "placeholder-select-field": "选择字段" }, + "supplier": { + "description": { + "apply-spatial-operations-to-the-geometry": "", + "create-a-line-between-two-points": "", + "geometry-define-field-headingdistancearea": "" + }, + "label": { + "area": "", + "as-line": "", + "calculate-value": "", + "distance": "", + "heading": "", + "line-builder": "", + "prepare-spatial-field": "", + "transform": "" + } + }, "time-series-table-transform-editor": { "label-stat": "统计", "label-time-field": "时间字段", @@ -9058,7 +10937,19 @@ "placeholder-auto": "自动", "placeholder-field": "字段", "tooltip-window-size": "窗口大小", - "tooltip-window-size-percent": "将窗口大小设置为占总数据的百分比" + "tooltip-window-size-percent": "将窗口大小设置为占总数据的百分比", + "type-options": { + "label": { + "centered": "", + "trailing": "" + } + }, + "window-size-mode-options": { + "label": { + "fixed": "", + "percentage": "" + } + } } }, "upgrade-box": { @@ -9115,6 +11006,11 @@ }, "users-action-bar-unconnected": { "invite": "邀请", + "options": { + "label": { + "users": "用户" + } + }, "placeholder-search-login-email": "按登录名、电子邮件或姓名搜索用户" } }, @@ -9158,6 +11054,32 @@ "confirm-delete-modal": { "title-delete-variable": "删除变量" }, + "create-ad-hoc-variable-adapter": { + "description": { + "add-keyvalue-filters-on-the-fly": "" + } + }, + "create-custom-variable-adapter": { + "description": { + "define-variable-values-manually": "" + } + }, + "create-interval-variable-adapter": { + "description": { + "define-timespan-interval": "" + } + }, + "create-query-variable-adapter": { + "description": { + "variable-values-fetched-datasource-query": "" + } + }, + "data-source-variable-slice": { + "text": { + "default": "", + "no-data-sources-found": "未找到数据源" + } + }, "empty-state": { "button-title": "添加变量", "info-box-content": "变量可以实现更具交互性和动态性的数据面板。您可以在指标查询中使用变量来代替硬编码服务器或传感器名称等内容。变量显示为数据面板顶部的列表框。这些下拉列表可以轻松更改数据面板中显示的数据。", @@ -9184,6 +11106,13 @@ "placeholder-default-value-if-any": "默认值(如有)", "text-options": "文本选项" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "unknown-table": { "loading": "加载中...", "no-unknowns": "未找到重命名或缺失的变量。", @@ -9240,5 +11169,25 @@ "data-hover-view": { "link": "链接" } + }, + "welcome": { + "welcome-banner": { + "need-help": "需要帮助吗?", + "welcome-to-grafana": "" + } + }, + "xychart": { + "series-editor": { + "add-series": "", + "aria-label-select-series": "", + "label-color-field": "", + "label-frame": "帧", + "label-size-field": "", + "label-x-field": "X 字段", + "label-y-field": "Y 字段", + "placeholder-all-frames": "", + "placeholder-select-frame": "", + "tooltip-delete-series": "" + } } } \ No newline at end of file diff --git a/public/locales/zh-Hant/grafana.json b/public/locales/zh-Hant/grafana.json index 9a4045cebb1..ad27e109aad 100644 --- a/public/locales/zh-Hant/grafana.json +++ b/public/locales/zh-Hant/grafana.json @@ -72,6 +72,11 @@ }, "admin-edit-org-page": { "label-name": "名稱", + "page-nav": { + "subTitle": { + "manage-settings-roles-organization": "" + } + }, "render-missing-permission-message": { "title-access-denied": "拒絕存取" } @@ -233,6 +238,13 @@ "upgrade-info": { "title": "企業版授權" }, + "user-admin-page": { + "page-nav": { + "subTitle": { + "manage-settings-for-an-individual-user": "" + } + } + }, "user-create-page": { "label-email": "電子郵件", "label-name": "名稱", @@ -243,9 +255,16 @@ "label-ldap": "LDAP" }, "user-list-admin-page-un-connected": { + "label": { + "active-last-days": "", + "all-users": "所有使用者" + }, "placeholder-search-login-email": "按登入、電子郵件或名稱搜尋使用者。" }, "user-list-anonymous-devices-page-un-connected": { + "label": { + "active-last-days": "" + }, "placeholder-search-devices-by-ip-address": "按 IP 位址搜尋裝置。" }, "user-list-page": { @@ -364,6 +383,12 @@ "no-grouping": "未分組" }, "alert-group-alerts-table": { + "columns": { + "label": { + "instance-labels": "", + "notification-state": "通知狀態" + } + }, "duration": "用於 {{time}}" }, "alert-group-filter": { @@ -439,6 +464,11 @@ "description-section": "輸入名稱以識別您的「{{entityName}}」。", "label-metric": "指標", "label-name": "名稱(名字)", + "message": { + "must-enter-a-metric-name": "", + "must-enter-a-name": "", + "please-select-a-data-source": "請選擇一個資料來源" + }, "metric-aria-label-metric": "指標", "metric-placeholder-recorded-metric": "提供新紀錄指標的名稱", "placeholder-name": "為您的{{namePlaceholder}}命名", @@ -491,6 +521,9 @@ "alertmanager-config": { "gma-manual-configuration-description": "無法手動變更內部 Grafana Alertmanager 設定。若要變更此設定,請透過使用者介面編輯個別資源。", "gma-manual-configuration-is-not-supported": "不支援手動設定變更", + "message": { + "configuration-cannot-be-empty": "" + }, "reset": "重設", "reset-confirmation": "確定要重設「{{alertmanagerName}}」的設定嗎?聯絡點和通知政策將重設為其預設值。", "resetting-configuration-might-while": "重設設定,這可能需要一段時間。", @@ -580,6 +613,9 @@ "create-a-contact-point": "建立聯絡點", "label-default-contact-point": "預設聯絡點", "label-timing-options": "計時選項", + "message": { + "required": "" + }, "or": "或" }, "am-routes-expanded-form": { @@ -601,11 +637,19 @@ "label-override-grouping": "覆寫分組", "label-value": "數值", "matching-labels": "匹配標籤", + "message": { + "required": "" + }, "placeholder-label": "標籤", "placeholder-value": "值", "remove": "移除", "tooltip-remove-matcher": "移除匹配器" }, + "annotation-header-field": { + "message": { + "required": "" + } + }, "annotations": { "dashboard-annotation-field": { "dashboard": "儀表板 {{dashboardUid}}", @@ -677,6 +721,25 @@ "title": "無法顯示所有事件" } }, + "central-alert-history-scene": { + "scene": { + "labels-filter-variable": { + "label": { + "labels": "" + } + }, + "transitions-from-filter-variable": { + "label": { + "start-state": "" + } + }, + "transitions-to-filter-variable": { + "label": { + "end-state": "" + } + } + } + }, "channel-sub-form": { "delete": "刪除", "duplicate": "重複", @@ -713,11 +776,17 @@ }, "cloud-data-source-selector": { "label": "選擇資料來源", - "label-disabled": "資料來源" + "label-disabled": "資料來源", + "message": { + "please-select-a-data-source": "請選擇一個資料來源" + } }, "cloud-evaluation-behavior": { "description-pending-period": "必須滿足閾值條件才能觸發警報的期間。選擇「無」表示條件一旦符合,即可觸發警報。", "label-pending-period": "待處理期間", + "message": { + "must-be-a-positive-integer": "" + }, "title-set-evaluation-behavior": "設定評估行為" }, "cloud-receiver-form": { @@ -758,6 +827,9 @@ "contact-point-selector": { "aria-label-refresh-contact-points": "重新整理聯絡點", "contact-point-picker-label-contact-point": "聯絡點", + "message": { + "contact-point-is-required": "" + }, "title-failed-to-fetch-contact-points": "無法擷取聯絡點", "tooltip-refresh-contact-points-list": "重新整理聯絡點清單" }, @@ -822,6 +894,14 @@ }, "copy-to-clipboard": "將「{{label}}」複製到剪貼簿", "create-metadata": { + "label": { + "dashboard": "儀表板", + "dashboard-and-panel": "", + "evaluation-interval": "評估間隔", + "labels": "標籤", + "metric-name": "", + "runbook-url": "" + }, "view-dashboard": "檢視儀表板", "view-panel": "檢視面板" }, @@ -862,9 +942,6 @@ "title-search-panel": "搜尋面板", "title-select-dashboard-and-panel": "選擇儀表板和面板" }, - "data-source-section": { - "import-to-grafana": "匯入至 Grafana 規則" - }, "datasource-not-found": { "card-description": "找不到此查詢項目的資料來源,不是被刪除就是未正確安裝。", "remove-query": "移除查詢", @@ -946,6 +1023,11 @@ "text-loading-template": "正在載入範本…", "title-failed-to-fetch-notification-template": "無法擷取通知範本" }, + "edit-mute-timing-page": { + "text": { + "edit-time-interval": "" + } + }, "editor": { "edit-alert-rule": "", "edit-recording-rule": "", @@ -959,6 +1041,11 @@ "error-summary-button": { "content-show-all-errors": "" }, + "evaluate-every-validation-options": { + "message": { + "required": "" + } + }, "evaluation-behavior-summary": { "evaluate": "", "label-evaluate": "評估", @@ -976,6 +1063,9 @@ "evaluation-group-creation-modal": { "description-group-name": "群組會在相同的評估間隔內評估其所有規則。", "description-often-rules-group-evaluated": "評估的群組中所有規則的頻率。", + "message": { + "required": "" + }, "placeholder-enter-a-name": "輸入名稱", "title-new-evaluation-group": "新的評估群組" }, @@ -998,12 +1088,24 @@ "title-permission-editrecreate-silence": "您沒有編輯/重新建立此靜音的權限", "title-silence-not-found": "未找到現有的靜音「{{silenceId}}」" }, + "existing-silence-editor-page": { + "page-nav": { + "text": { + "edit-silence": "" + } + } + }, "export": { "subtitle": { "formats": "選擇格式並下載檔案,或將內容複製到剪貼簿", "one-format": "下載檔案或將內容複製到剪貼簿" } }, + "export-new-grafana-rule-page": { + "text": { + "export-new-grafana-rule": "" + } + }, "export-new-rule-button": { "tooltip-export-new-grafana-rule": "匯出新的 grafana 規則" }, @@ -1029,6 +1131,16 @@ "no-data": "沒有資料", "page-counter": "" }, + "feature-toggle-page": { + "nav-model": { + "subTitle": { + "enable-alerting-grafana-config": "" + }, + "text": { + "alerting-is-not-enabled": "" + } + } + }, "federated-rule-warning": { "experimental": "聯合規則群組目前是一項實驗功能。", "read-documentation": "閱讀文件", @@ -1036,6 +1148,13 @@ }, "file-export-inline-documentation": { "api-provisioning": "{{name}}格式僅適用於 API 佈建。<3>請至文件中閱讀更多資訊。</3>", + "export-inline-doc": { + "title": { + "apiprovisioning-format": "", + "fileprovisioning-format": "", + "terraformprovisioning-format": "" + } + }, "file-provisioning": "{{name}}格式僅適用於檔案佈建。<3>請至文件中閱讀更多資訊。</3>", "terraform-provisioning": "{{name}}格式僅適用於 Terraform 佈建。<3>請至文件中閱讀更多資訊。</3>" }, @@ -1043,6 +1162,20 @@ "copy-code": "複製代碼", "download": "下載" }, + "filter-options": { + "label": { + "alert-rule": "警報規則", + "all": "全部", + "error": "錯誤", + "firing": "", + "no-data": "沒有資料", + "normal": "一般", + "ok": "確定", + "pending": "待處理", + "recording-rule": "錄製規則", + "recovering": "正在還原" + } + }, "filter-view-results": { "aria-label-filteredrulelist": "filtered-rule-list" }, @@ -1077,7 +1210,10 @@ } }, "folder-selector": { - "description-select-folder": "選擇資料夾以儲存您的規則。" + "description-select-folder": "選擇資料夾以儲存您的規則。", + "message": { + "select-a-folder": "" + } }, "folderAndGroup": { "evaluation": { @@ -1092,15 +1228,88 @@ "for-input": { "description-pending": "必須滿足閾值條件才能觸發警報的期間。選擇「無」表示條件一旦符合,即可觸發警報。" }, + "for-validation-options": { + "message": { + "required": "" + } + }, "generate-alert-data-modal": { "add-alert-data": "新增警報資料", "add-alert-data-to-payload": "將警報資料新增至負載", + "alert-options": { + "label": { + "firing": "", + "resolved": "" + } + }, "review-alert-payload": "檢閱要新增至負載的警報資料:", "title-add-custom-alerts": "新增自訂警報" }, + "get-alert-suggestions": { + "documentation": { + "annotations-attached-alert": "", + "fingerprint-identify-alert": "", + "grafana-external-alertmanager": "", + "organization-alert": "", + "time-the-alert-started-firing": "" + }, + "value": { + "labels-attached-alert": "", + "status-alert-firing-resolved": "" + } + }, + "get-cloud-scenes": { + "title": { + "mimir-alertmanager": "" + } + }, + "get-global-suggestions": { + "value": { + "an-array-containing-all-alerts": "" + } + }, + "get-grafana-alertmanager-scenes": { + "title": { + "grafana-alertmanager": "" + } + }, + "get-grafana-managed-scenes": { + "title": { + "grafanamanaged-alert-rules": "Grafana 管理的警報規則" + } + }, + "get-mimir-managed-rules-per-group-scenes": { + "rule-group-handler": { + "label": { + "rule-group": "" + } + }, + "title": { + "mimirmanaged-alert-rules-per-rule-group": "" + } + }, + "get-mimir-managed-rules-scenes": { + "title": { + "mimirmanaged-alert-rules": "" + } + }, "get-preview-results": { "title-error": "錯誤" }, + "get-state-display-model": { + "text": { + "alerting": "", + "error": "", + "firing": "", + "inactive": "", + "no-data": "", + "ok": "確定", + "paused": "", + "pending": "", + "recovering": "", + "unknown": "" + } + }, "getting-stared": { "learn-more": "如需手動操作介紹,請參閱我們的<2>教學課程,開始使用 Grafana 警報</2>" }, @@ -1142,6 +1351,10 @@ "label-disable-resolved-message": "停用已解決的訊息" }, "grafana-evaluation-behavior-step": { + "message": { + "must-be-a-positive-integer": "", + "must-enter-a-group-name": "" + }, "missing-series-resolve-placeholder": "預設值:2", "or": "或", "placeholder-select-an-evaluation-group": "選取評估群組…", @@ -1158,6 +1371,11 @@ "body-invalid-rule-id": "頁面網址中的規則 UID 無效。請檢查網址,然後再試一次。", "title-invalid-rule-id": "無效的規則 ID" }, + "grafana-modify-export-page": { + "text": { + "modify-export": "" + } + }, "grafana-mute-timing-exporter-preview": { "text-loading": "正在載入..." }, @@ -1210,6 +1428,9 @@ }, "group-and-namespace-fields": { "group-picker-label-group": "群組", + "message": { + "required": "" + }, "namespace-picker-label-namespace": "命名空間" }, "group-by": { @@ -1266,14 +1487,19 @@ "header": { "tooltip-remove": "移除表達式「{{refId}}」" }, + "history-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "成功" + } + }, "home": { "label-get-started": "開始使用", "label-insights": "深入分析", "title-alerting": "警報" }, - "import-from-dsrules": { - "description-folder-import-rules": "需匯入規則的資料夾" - }, "import-to-gma": { "action-button": "匯入", "additional-settings": "附加設定", @@ -1281,8 +1507,9 @@ "confirm-modal": { "confirm": "匯入", "loading": "正在載入…", - "loading-body": "正在準備要匯入的資料,這可能需要一段時間…", + "loading-body": "", "no-rules-body": "沒有要匯入的規則。請選擇其他命名空間或規則群組。", + "no-rules-body-yaml": "", "no-rules-title": "沒有要匯入的規則", "plugin-rules-warning": { "text": "我們已偵測到某些規則由外掛程式管理。系統不會匯入這些規則。", @@ -1301,11 +1528,12 @@ "label": "群組" }, "import-location-and-filters": "匯入位置和篩選條件", + "import-source": "", "namespace": { "description": "輸入以搜尋現有的命名空間", "label": "命名空間" }, - "pageTitle": "從資料來源將警報規則匯入至 Grafana 管理的規則", + "pageTitle": "", "pause": { "label": "暫停匯入的警報規則" }, @@ -1313,10 +1541,26 @@ "label": "暫停匯入的錄製規則" }, "recording-rules": "錄製規則", + "source": { + "datasource": "", + "datasource-description": "", + "yaml": "", + "yaml-description": "" + }, "success": "已成功將警報規則匯入至 Grafana 管理的規則。", "target-folder": { + "description": "需匯入規則的資料夾", "label": "目標資料夾" - } + }, + "yaml": { + "description": "", + "label": "", + "required-message": "", + "target-datasource": "目標資料來源", + "target-datasource-description": "", + "target-datasource-required": "" + }, + "yaml-error": "" }, "insights": { "monitor-status-of-system": "監控系統狀態", @@ -1392,6 +1636,9 @@ "text-loading-existing-labels": "正在載入現有標籤" }, "labels-without-suggestions": { + "message": { + "required": "" + }, "placeholder-key": "key", "placeholder-value": "值" }, @@ -1430,6 +1677,24 @@ "log-record-viewer-by-timestamp": { "aria-label-state-history-by-timestamp": "按時間戳記顯示狀態歷史紀錄" }, + "log-timeline-viewer": { + "label": { + "firing": "", + "mixed": "", + "no-data": "", + "normal": "一般", + "pending": "待處理", + "recovering": "正在還原" + } + }, + "loki-apidatasource": { + "message": { + "data-source-is-working": "" + }, + "title": { + "success": "成功" + } + }, "loki-state-history": { "clear-filters": "清除篩選", "common-labels": "通用標籤", @@ -1442,6 +1707,14 @@ "button": "管理權限", "title": "管理權限" }, + "manual-and-automatic-routing": { + "routing-options": { + "label": { + "select-contact-point": "", + "use-notification-policy": "" + } + } + }, "matcher-filter": { "filter-alerts-using-label-querying-without-braces": "使用不含大括號的標籤查詢來篩選警報,例如:", "filter-alerts-using-label-querying-without-spaces": "使用不含空格的標籤查詢來篩選警報,例如:", @@ -1459,6 +1732,9 @@ "label-operator": "運算子", "label-refine-affected-alerts": "縮小受影響警報的範圍", "label-value": "數值", + "message": { + "required": "" + }, "placeholder-label": "標籤", "placeholder-value": "值", "remove": "移除", @@ -1490,6 +1766,16 @@ "aria-label": "更多", "button-text": "更多" }, + "multiple-data-source-picker": { + "get-data-source-options": { + "grouped-options": { + "label": { + "data-sources-with-configured-alert-rules": "", + "other-data-sources": "" + } + } + } + }, "mute-timing-actions-buttons": { "text-disabled": "已停用", "title-delete-mute-timing": "刪除靜音時間" @@ -1553,11 +1839,26 @@ "read-more": "閱讀通知政策。", "title-notification-routing": "通知路由" }, + "new-mute-timing-page": { + "text": { + "add-time-interval": "" + } + }, "new-rule-from-panel-button": { "body-no-alerting-capable-query-found": "由於未找到對支援警報資料來源的查詢內容,因此無法從此面板建立警報。", "new-alert-rule": "新的警報規則", "title-no-alerting-capable-query-found": "找不到警報功能的查詢" }, + "new-silence-page": { + "page-nav": { + "subTitle": { + "configure-silences-notifications-particular-alert": "" + }, + "text": { + "silence-alert-rule": "靜音警報規則" + } + } + }, "no-alert-managers-available": { "body-no-alertmanager-found": "我們找不到任何外部的 Alertmanager,您可能沒有內建 Grafana Alertmanager 的存取權限。", "title-no-alertmanager-found": "找不到 Alertmanager" @@ -1782,6 +2083,9 @@ "expressions": "表達式", "loading-data-sources": "正在載入資料來源…", "manipulate-returned-queries-other-operations": "使用數學和其他運算來處理查詢返回的資料。", + "message": { + "a-valid-expression-is-required": "" + }, "no-compatible-sources": "您似乎沒有相容的資料來源", "title-deactivate-advanced-options": "停用進階選項", "title-queries-expressions-configured": "未設定任何查詢或表達式" @@ -1833,7 +2137,8 @@ }, "recording-rules": { "description-target-data-source": "Prometheus 資料來源用於儲存紀錄規則", - "label-target-data-source": "目標資料來源" + "label-target-data-source": "目標資料來源", + "target-data-source-required": "" }, "recording-rules-name-space-and-group-step": { "description-select-namespace-group-recording": "選擇您的錄製規則的命名空間和群組。", @@ -2091,6 +2396,9 @@ "collapse-all": "全部收闔", "expand-all": "展開全部" }, + "rule-list-v2": { + "import-to-gma": "" + }, "rule-modify-export": { "text-loading-the-rule": "正在載入規則…", "title-cannot-exist": "無法載入規則。規則不存在", @@ -2167,6 +2475,10 @@ "label-saved-searches": "搜尋紀錄" }, "health": "使用情況", + "label": { + "hide": "隱藏", + "show": "顯示" + }, "manage-alerts": "在這些資料來源中,您可以選擇透過警報 UI 管理警報,以便在 Grafana UI 以及在其設定的資料來源中管理這些警報規則。", "placeholder-all-data-sources": "所有資料來源", "plugin-rules": "外掛程式規則", @@ -2263,6 +2575,9 @@ "label-comment": "評論", "label-created-by": "建立者", "label-duration": "持續時間", + "message": { + "required": "" + }, "placeholder-whos-creating-the-silence": "靜音建立者", "save-silence": "儲存靜音", "saving": "正在儲存…" @@ -2301,6 +2616,12 @@ "title-alert-rule-types": "警報規則類型" }, "state-history": { + "columns": { + "label": { + "state": "狀態", + "time": "時間" + } + }, "filter-group": "篩選群組", "filter-group-tooltip": "透過完全匹配或正規表達式篩選每個狀態歷史紀錄組,例如:", "placeholder-search": "搜尋", @@ -2340,6 +2661,9 @@ "label-examples-documentation": "範例文件", "label-template-group": "範本群組", "label-template-group-name": "範本群組名稱", + "message": { + "required": "" + }, "new-template-name-placeholder-give-your-template-group-a-name": "為您的範本群組命名", "title-error-saving-template": "儲存範本時發生錯誤", "title-templating-cheat-sheet": "範本備忘錄" @@ -2362,6 +2686,11 @@ "existing-templates-selector-aria-label-choose-notification-template": "選擇通知範本", "existing-templates-selector-placeholder-choose-notification-template": "選擇通知範本", "loading": "正在載入…", + "template-options": { + "label": { + "select-notification-template": "" + } + }, "tooltip-copy": "將選定的通知範本複製到剪貼簿。您可以在自訂分頁中使用。" }, "templates": { @@ -2464,10 +2793,39 @@ } }, "use-columns": { + "columns": { + "label": { + "alert-rule-targeted": "", + "alerts-silenced": "", + "health": "使用情況", + "matching-labels": "匹配標籤", + "name": "名稱(名字)", + "schedule": "排程", + "state": "狀態", + "time-range": "時間範圍" + } + }, + "label": { + "actions": "動作", + "created": "已建立", + "group": "群組", + "labels": "標籤", + "next-evaluation": "下一個評估", + "state": "狀態", + "summary": "摘要" + }, "title-edit": "編輯", "title-recreate": "重新建立", "title-unsilence": "取消靜音" }, + "use-combined-labels": { + "grouped-options": { + "label": { + "from-alerts": "", + "from-system": "" + } + } + }, "use-create-dropdown-menu-actions": { "label-delete": "刪除", "label-edit": "編輯", @@ -2501,6 +2859,17 @@ "title-edit-notification-policy": "編輯通知政策" } }, + "use-page-nav": { + "page-nav": { + "text": { + "details": "詳細資訊", + "history": "歷史紀錄", + "instances": "執行個體", + "query-and-conditions": "", + "versions": "版本" + } + } + }, "use-state-history-modal": { "state-history-modal": { "title-state-history": "狀態歷史紀錄" @@ -2521,6 +2890,36 @@ "body": "編輯器中的 YAML 內容僅包含警報規則設定 <1></1>若要設定 Prometheus,則需要提供<4>設定檔內容的其餘部分。</4>" } }, + "alertlist": { + "group-by": { + "aria-label-group-by-label-keys": "", + "placeholder-group-by": "分組依據" + }, + "ungrouped-mode-view": { + "active-for": "", + "aria-label-view-alert-rule": "", + "view-alert-rule": "" + }, + "unified-alert-list": { + "clear": "清除", + "text-loading": "正在載入…" + }, + "unified-alert-list-panel": { + "body-permission-required": "", + "title-permission-required": "" + } + }, + "annolist": { + "anno-list-panel": { + "aria-label-remove-filter": "", + "filter": "", + "loading": "正在載入…", + "no-annotations-found": "" + }, + "annotation-list-item": { + "tooltip-created-by": "" + } + }, "annotations": { "annotation-field-mapper": { "annotation": "註解", @@ -2617,6 +3016,11 @@ "configuration-required": "必要設定", "refer-documentation-configure-authentication": "請參閱如何設定驗證的文件" }, + "field-map": { + "label": { + "none": "無" + } + }, "fields": { "allow-assign-grafana-admin-description": "", "allow-assign-grafana-admin-label": "", @@ -2720,7 +3124,18 @@ "use-refresh-token-description": "", "use-refresh-token-label": "", "validate-hosted-domain-description": "", - "validate-hosted-domain-label": "" + "validate-hosted-domain-label": "", + "workload-identity-token-file-description": "", + "workload-identity-token-file-label": "", + "workload-identity-token-file-required": "" + }, + "get-page-nav": { + "subTitle": { + "configure-authentication-providers": "" + }, + "text": { + "authentication": "身分驗證" + } }, "provider-card": { "text-badge-enabled": "已啟用", @@ -2756,6 +3171,12 @@ "auth-config-auth-config-page-unconnected": { "subtitle": "管理您的驗證設定並設定單一登入。請在我們的<2>文件</2>中閱讀更多資訊。" }, + "barchart": { + "tick-spacing-editor": { + "content-require-space-from-the-right-side": "", + "label-rtl": "" + } + }, "bookmarks-page": { "empty": { "message": "您似乎尚未建立任何書籤", @@ -2879,11 +3300,199 @@ "text-this-repository-is-read-only": "如果您可以直接存取目標,請複製 JSON 並將其貼上至該處。" }, "canvas": { + "apieditor": { + "label-endpoint": "", + "label-header-parameters": "", + "label-method": "方法", + "label-payload": "裝載", + "label-query-parameters": "查詢參數", + "render-test-apibutton": { + "test-api": "", + "title-test-api": "" + } + }, + "button-item": { + "label": { + "center": "", + "left": "", + "right": "" + }, + "placeholder": { + "auto": "自動" + } + }, + "button-style-editor": { + "label-variant": "變數" + }, + "canvas-context-menu": { + "close-editor": "", + "open-editor": "", + "render-menu-items": { + "add-item-menu-item": { + "label-add-item": "" + }, + "edit-element-menu-item": { + "label-edit": "編輯" + }, + "label-bring-to-front": "", + "label-delete": "刪除", + "label-duplicate": "重複", + "label-send-to-back": "", + "set-background-menu-item": { + "label-set-background": "" + } + } + }, + "cloud-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "自動" + } + }, + "ellipse-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "自動" + } + }, + "inline-edit": { + "canvas-inline-editor": "", + "tooltip-close-inline-editor": "" + }, + "inline-edit-body": { + "label-add-item": "", + "please-select-an-element": "" + }, + "line-style-editor": { + "label-animate": "" + }, + "metric-value-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "自動" + } + }, "not-found-display": { "not-found": "<0>未找到:<config /></0>" }, + "pan-zoom-help": { + "ctrl-right-mouse": "", + "middle-mouse": "", + "pan-title": "", + "reset-double-click": "", + "title-pan-and-zoom-controls": "", + "zoom-scroll-wheel": "" + }, + "parallelogram-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "自動" + } + }, + "params-editor": { + "aria-label-add": "新增", + "aria-label-delete": "刪除", + "placeholder-key": "鍵", + "placeholder-value": "數值" + }, + "placement-editor": { + "label-constraints": "", + "label-position": "", + "loading": "正在載入…" + }, + "quick-positioning": { + "tooltip-align-bottom": "", + "tooltip-align-horizontal-centers": "", + "tooltip-align-left": "", + "tooltip-align-right": "", + "tooltip-align-top": "", + "tooltip-align-vertical-centers": "" + }, + "rectangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "自動" + } + }, "text-display": { "double-click-to-set": "按兩下以設定文字" + }, + "text-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "自動" + } + }, + "tree-navigation-editor": { + "clear-selection": "清空選項", + "frame-selection": "", + "label-add-item": "", + "missing-layer": "", + "no-settings": "", + "switcher-icon": { + "title-node-icon": "" + } + }, + "tree-node-title": { + "title-duplicate": "重複", + "title-remove": "移除", + "tooltip-duplicate": "重複", + "tooltip-remove": "移除" + }, + "triangle-item": { + "label": { + "bottom": "", + "center": "", + "left": "", + "middle": "", + "right": "", + "top": "" + }, + "placeholder": { + "auto": "自動" + } } }, "carousel": { @@ -2963,6 +3572,22 @@ } }, "connections": { + "add-new-connection": { + "filter-by-options": { + "label": { + "all": "全部", + "installed": "已安裝", + "new-updates": "" + } + }, + "label": { + "by-downloads": "", + "by-name-az": "", + "by-name-za": "", + "by-published-date": "", + "by-updated-date": "" + } + }, "advisor-redirect-notice": { "aria-label-link-to-advisor": "連結到 Advisor", "body": "試試新的 Advisor,以便發現資料來源和外掛程式的潛在問題。", @@ -2979,6 +3604,22 @@ "body": "資料來源有新的位置!您可以在「連線」頁面中探索新的資料來源或管理現有的資料來源,該頁面可從主選單存取。", "go-to-connections": "前往連線" }, + "data-source-details-page": { + "subTitle": { + "datasource-could-found": "" + }, + "text": { + "unknown-datasource": "" + } + }, + "new-data-source-page": { + "subTitle": { + "choose-a-data-source-type": "" + }, + "text": { + "add-data-source": "新增資料來源" + } + }, "no-access-modal": { "connection-contact-grafana-admin": "若要新增連線,請聯絡您的 Grafana 管理員。", "editor-warning": "編輯者無法新增連線。您可以檢查是否已在<2>資料來源</2>中進行設定。", @@ -2991,6 +3632,18 @@ "search": { "aria-label-search-all": "搜尋所有", "placeholder": "搜尋所有" + }, + "use-data-source-settings-nav": { + "node": { + "subTitle": { + "data-source-error": "" + } + }, + "page-nav": { + "text": { + "data-source-nav-node": "" + } + } } }, "core": { @@ -3286,6 +3939,11 @@ "title-plugin-dashboard": "外掛程式儀表板" }, "dash-nav": { + "on-open-snapshot-original": { + "title": { + "proceed-to-external-site": "" + } + }, "render-left-actions": { "text-public": "公共", "tooltip-view-as-scene": "以場景形式檢視" @@ -3297,11 +3955,26 @@ "dashboard-loading": { "cancel-loading-dashboard": "取消載入儀表板" }, + "dashboard-page-error": { + "text": { + "not-found": "無結果" + } + }, "dashboard-settings": { "actions": { "close": "關閉" } }, + "dashboard-slice": { + "title": { + "dashboard-init-failed": "" + } + }, + "dashboard-srv": { + "message": { + "edit-dashboard-json": "" + } + }, "dashboard-validation": { "body-dashboard-failed-schema-validation": "驗證是為了開發目的,應該可以安全地忽略。若您是 Grafana 開發人員,請考慮檢查並更新儀表板架構", "title-checking-dashboard-validity": "正在檢查儀表板有效性", @@ -3397,6 +4070,13 @@ "values": "以逗號分隔的值", "values-placeholder": "1、10、mykey:myvalue、myvalue、轉義、值" }, + "datasource-options": { + "name-filter": "", + "name-filter-description": "", + "name-filter-placeholder": "", + "type": "類型", + "type-placeholder": "" + }, "description": "說明", "description-placeholder": "描述性文字", "label": "標籤", @@ -3415,8 +4095,8 @@ "category": "選擇選項", "custom-all-value": "自訂所有數值", "custom-all-value-description": "一個通配符正則表達式或其他表示「所有」的值", - "include-all": "包含所有選項", - "include-all-description": "啟用選項以包含所有值", + "include-all": "", + "include-all-description": "", "multi-value": "多值" }, "type-category": "{{type}}選項" @@ -3442,14 +4122,97 @@ "errors": { "failed-to-load": "無法載入儀表板" }, + "fetch-dashboard": { + "message": { + "failed-to-fetch-dashboard": "" + } + }, "gen-aihistory": { "aria-label-send-custom-feedback": "傳送自訂意見回饋", "footer-text": "此內容是使用 <2>Grafana LLM 外掛程式</2> AI 所產生", "placeholder-tell-ai-what-to-do-next": "告訴 AI 下一步該怎麼做…" }, + "general-settings-unconnected": { + "editable-options": { + "label": { + "editable": "可编辑", + "readonly": "" + } + } + }, + "get-debug-dashboard": { + "title": { + "annotations": "註釋" + } + }, + "get-errors": { + "message": { + "error-loading-data": "" + } + }, "get-field-override-categories": { "label-add-field-override": "新增欄位覆寫", - "label-add-override-property": "新增覆寫屬性" + "label-add-override-property": "新增覆寫屬性", + "title": { + "add-button": "" + } + }, + "get-library-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "資訊", + "name": "名稱(名字)" + } + }, + "get-library-viz-panel-options-category": { + "descriptor": { + "title": { + "library-panel-options": "" + } + }, + "title": { + "information": "資訊", + "name": "名稱(名字)" + } + }, + "get-panel-editor-tabs": { + "text": { + "alert": "", + "query": "查詢", + "transform-data": "" + } + }, + "get-panel-frame-category": { + "descriptor": { + "title": { + "panel-options": "面板選項" + } + }, + "direction-options": { + "label": { + "horizontal": "橫向", + "vertical": "縱向" + } + }, + "title": { + "description": "說明", + "max-per-row": "每列最大值", + "panel-links": "面板連結", + "repeat-by-variable": "按變數重複", + "repeat-direction": "重複方向", + "repeat-options": "重複選項", + "title": "標題", + "transparent-background": "透明背景" + } + }, + "get-panel-menu": { + "text": { + "extensions": "" + } }, "help-wizard": { "copy-to-clipboard": "複製至剪貼簿", @@ -3462,10 +4225,21 @@ "randomize-field-names-label-field-names": "欄位名稱", "randomize-labels-label-labels": "標籤", "randomize-string-values-label-string-values": "字串值", + "tabs": { + "label": { + "data": "資料", + "snapshot": "快照" + } + }, "title-complete-git-hub-comment-clipboard": "將完整的 GitHub 評論複製到剪貼簿", "title-get-help-with-this-panel": "取得此面板的相關說明", "troubleshooting-docs": "疑難排解文件" }, + "init-dashboard": { + "message": { + "failed-create-dashboard-model": "" + } + }, "inspect": { "data-tab": "資料", "error-tab": "錯誤", @@ -3518,6 +4292,16 @@ "rows": "總列數", "table-title": "統計資料" }, + "k8s-dashboard-api": { + "title": { + "deleted": "" + } + }, + "k8s-dashboard-v2api": { + "title": { + "deleted": "" + } + }, "layout": { "common": { "copy": "複製", @@ -3530,6 +4314,13 @@ "panel-layout-disabled": "選擇一列或分頁以變更面板版面配置選項" } }, + "legacy-dashboard-api": { + "fetch-error": { + "message": { + "dashboard-not-found": "" + } + } + }, "make-editable": { "dashboard-not-editable": "儀表板不可編輯", "make-editable": "使其可編輯" @@ -3549,6 +4340,20 @@ "menu-use-library-panel": "使用資料庫面板" }, "new-panel-title": "新的面板", + "on-create-new-row": { + "new-row": { + "title": { + "row-title": "" + } + } + }, + "on-create-new-widget-panel": { + "new-panel": { + "title": { + "widget-title": "" + } + } + }, "options": { "description": "說明", "title-option": "標題" @@ -3607,6 +4412,30 @@ "paused": "管理員已暫停此儀表板", "try-again-later": "稍後再試" }, + "remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, + "repeat-row-select": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, + "repeat-row-select2": { + "variable-options": { + "label": { + "disable-repeating": "", + "no-template-variables-found": "" + } + } + }, "revert-dashboard-modal": { "body-restore-version": "確定要將儀表板還原到版本{{version}}嗎?所有未儲存變更將會遺失。", "title-restore-version": "還原版本" @@ -3720,6 +4549,18 @@ "sub-menu-un-connected": { "aria-label-template-variables": "範本變數" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "tabs-layout": { "delete-tab-text": "刪除此分頁也會移除所有面板。確定要繼續嗎?", "delete-tab-title": "要刪除分頁嗎?", @@ -3925,7 +4766,10 @@ }, "unthemed-dashboard-row": { "aria-label-delete-row": "刪除行", - "learn-more": "了解更多資訊" + "learn-more": "了解更多資訊", + "title": { + "delete-row": "刪除行" + } }, "validation": { "invalid-dashboard-id": "沒有找到有效的 Grafana.com ID", @@ -3960,6 +4804,16 @@ }, "visualization-select-pane": { "placeholder-search-for": "搜尋…", + "radio-options": { + "description": { + "reusable-panels-share-between-multiple-dashboards": "" + }, + "label": { + "library-panels": "資料庫面板", + "suggestions": "", + "visualizations": "" + } + }, "title-close": "關閉" }, "viz-panel": { @@ -4010,12 +4864,25 @@ "label-data-source": "資料來源", "label-use-static-key-dimensions": "使用靜態金鑰維度" }, + "add-to-dashboard": { + "message": { + "could-navigate-selected-dashboard-please-again": "", + "could-panel-dashboard-please-again": "" + } + }, "add-to-dashboard-form": { "cancel": "取消", "description-choose-where-to-add-the-panel": "選擇要新增面板的位置。", "description-select-which-dashboard-panel-created": "選擇要在其中建立面板的儀表板。", + "label": { + "existing-dashboard": "現有儀表板", + "new-dashboard": "新儀表板" + }, "label-dashboard": "儀表板", "label-target-dashboard": "目標儀表板", + "message": { + "this-field-is-required": "此為必填欄位。" + }, "open-dashboard": "打開儀表板", "open-in-new-tab": "在新的分頁中開啟", "title-error-adding-the-panel": "新增面板時發生錯誤" @@ -4053,6 +4920,25 @@ "it-cannot-contain-or": "不能包含「//」或「..」。", "least-valid-character": "必須至少有一個有效字元。" }, + "build-new-dashboard-save-model": { + "data": { + "title": { + "new-dashboard": "新儀表板" + } + } + }, + "build-new-dashboard-save-model-v2": { + "data": { + "title": { + "new-dashboard": "新儀表板" + } + } + }, + "config-public-dashboard": { + "title": { + "revoke-public-url": "撤銷公共網址" + } + }, "constant-variable-form": { "constant-options": "常數選項", "label-value": "數值", @@ -4100,22 +4986,89 @@ "value-not-saved": "該數值尚未儲存在 Grafana 資料庫中", "view-pull-request-in-git-hub": "在 GitHub 中檢視拉取請求" }, + "dashboard-scene": { + "text": { + "edit-panel": "", + "view-panel": "檢視面板" + }, + "title": { + "dashboard": "儀表板", + "discard-changes-to-dashboard": "" + } + }, + "dashboard-scene-page-state-manager": { + "message": { + "dashboard-not-found": "" + } + }, + "dashboard-scene-page-state-manager-v2": { + "message": { + "dashboard-not-found": "" + } + }, "data-source-variable-form": { "data-source-options": "資料來源選項", "description-instance-name-filter": "在變數值清單中選擇資料來源執行個體的正規表達式篩選器。全部留空。", "example-instance-name-filter": "範例:<codeExample />", "selection-options": "選擇選項" }, + "default-grid-layout-manager": { + "row": { + "title": { + "row-title": "" + } + } + }, "description-label": { "description": "說明" }, + "edit-link-view": { + "edit-link-page-nav": { + "text": { + "edit-link": "編輯連結" + } + } + }, "email-list": { "aria-label-emailmenu": "切換電子郵件選單" }, + "embedded-dashboard-test-page": { + "subTitle": { + "showing-dashboard-panel-tests-pie-chart": "" + }, + "text": { + "embedding-dashboard": "" + } + }, "empty-transformations-message": { "add-transformation": "新增轉換" }, + "get-edit-options": { + "title": { + "column-options": "", + "row-height-options": "" + } + }, + "get-panel-frame-options": { + "descriptor": { + "title": { + "panel-options": "面板選項" + } + }, + "title": { + "description": "說明", + "panel-links": "面板連結", + "title": "標題", + "transparent-background": "透明背景" + } + }, + "get-workflow-options": { + "label": { + "push-to-a-new-branch": "" + } + }, "group-by-variable-form": { + "alert-not-supported": "", "description-enables-users-custom-values": "使用者能夠將自訂值新增至清單", "description-provide-dimensions-as-csv-dimension-name-dimension-id": "以 CSV 格式提供維度:{{name}},{{value}}", "group-by-options": "按選項分組", @@ -4134,6 +5087,12 @@ "randomize-field-names-label-field-names": "欄位名稱", "randomize-labels-label-labels": "標籤", "randomize-string-values-label-string-values": "字串值", + "tabs": { + "label": { + "data": "資料", + "snapshot": "快照" + } + }, "title-complete-git-hub-comment-clipboard": "將完整的 GitHub 評論複製到剪貼簿", "title-get-help-with-this-panel": "取得此面板的相關說明", "troubleshooting-docs": "疑難排解文件", @@ -4175,6 +5134,14 @@ "body-name-already-exists": "所選資料夾中已存在名稱相同的儀表板。仍要儲存此儀表板嗎?", "title-name-already-exists": "名稱已存在" }, + "on-remove-panel": { + "text": { + "remove-panel": "" + }, + "title": { + "remove-panel": "" + } + }, "panel-data-alerting-tab-rendered": { "alert": { "title-errors-loading-rules": "載入規則時發生錯誤" @@ -4196,6 +5163,11 @@ "table-view-aria-label-toggletableview": "切換表格檢視", "table-view-label-table-view": "表格檢視" }, + "panel-editor": { + "text": { + "edit-panel": "" + } + }, "panel-editor-renderer": { "aria-label-open-options-pane": "開啟選項窗格", "tooltip-open-options-pane": "開啟選項窗格" @@ -4204,8 +5176,22 @@ "body-panel-plugin-not-loaded": "請確認您要檢查的面板在開啟檢查之前為可見且已顯示。", "title-panel-plugin-not-loaded": "未載入面板外掛程式" }, + "panel-menu-behavior": { + "async-func": { + "text": { + "extensions": "", + "metrics-drilldown": "" + } + } + }, "panel-viz-type-picker": { "placeholder-search-for": "搜尋…", + "radio-options": { + "label": { + "suggestions": "", + "visualizations": "" + } + }, "title-close": "關閉" }, "provisioned-delete-modal": { @@ -4232,6 +5218,15 @@ "query-options": "查詢選項", "selection-options": "選擇選項" }, + "resource-export": { + "label": { + "classic": "", + "json": "JSON", + "v1-resource": "", + "v2-resource": "", + "yaml": "" + } + }, "revert-dashboard-modal": { "body-restore-version": "確定要將儀表板還原到版本{{version}}嗎?所有未儲存變更將會遺失。", "title-restore-version": "還原版本" @@ -4339,6 +5334,18 @@ "solo-panel-page": { "loading": "正在載入" }, + "support-snapshot-service": { + "description": { + "dashboard-troubleshoot-visualization-issues": "" + }, + "label": { + "git-hub-comment": "", + "panel-support-snapshot": "" + }, + "title": { + "copy-to-clipboard-failed": "" + } + }, "text-box-variable-form": { "placeholder-default-value-if-any": "(選填)", "text-options": "文字選項" @@ -4349,6 +5356,13 @@ "title-field-label": { "title": "標題" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "transformations-drawer": { "search-box-suffix": { "tooltip-clear-search": "清除搜尋" @@ -4364,6 +5378,13 @@ "save-dashboard": "儲存儀表板", "title-unsaved-changes": "未儲存變更" }, + "use-dashboard-edit-page-nav": { + "page-nav": { + "text": { + "settings": "設定" + } + } + }, "variable-check-indicator": { "aria-label-variable-referenced-dashboard": "此變數未被任何變數或儀表板參照使用。", "aria-label-variable-referenced-other-variables-dashboard": "此變數被其他變數或儀表板參照使用。", @@ -4380,7 +5401,10 @@ "placeholder-descriptive-text": "描述性文字", "placeholder-label-name": "標籤名稱", "placeholder-variable-name": "變數名稱", - "text-running-query": "正在執行查詢…" + "text-running-query": "正在執行查詢…", + "title": { + "delete-variable": "刪除變數" + } }, "variable-editor-list": { "definition": "定義", @@ -4562,6 +5586,25 @@ "message": "沒有找到資料來源" } }, + "datagrid": { + "add-column": { + "placeholder-column-name": "" + }, + "datagrid-context-menu": { + "render-context-menu-items": { + "label-clear-column": "", + "label-clear-row": "", + "label-remove-all-data": "", + "label-search": "搜尋…" + }, + "render-header-menu-items": { + "label-clear-column": "", + "label-delete-column": "", + "label-rename-column": "", + "label-set-field-type": "" + } + } + }, "datasources": { "add-new-data-source-button": { "tooltip-no-permission": "您沒有設定新資料來源的權限" @@ -4583,6 +5626,46 @@ "label-default": "預設值", "label-name": "名稱(名字)" }, + "build-categories": { + "categories": { + "title": { + "cloud": "", + "distributed-tracing": "", + "enterprise-plugins": "企業外掛程式", + "industrial-io-t": "", + "logging-document-databases": "", + "others": "", + "profiling": "", + "sql": "", + "time-series-databases": "" + } + } + }, + "build-nav-model": { + "analytics": { + "text": { + "insights": "深入分析" + } + }, + "caching": { + "text": { + "cache": "" + } + }, + "ds-permissions": { + "text": { + "permissions": "權限" + } + }, + "nav-model": { + "text": { + "settings": "設定" + } + }, + "text": { + "dashboards": "儀表板" + } + }, "button-row": { "delete": "刪除", "save-and-test": "儲存並測試", @@ -4618,6 +5701,11 @@ "data-source-read-only-message": { "title-provisioned-data-source": "已設定的資料來源" }, + "data-source-settings-reducer": { + "message": { + "testing-could-couple-minutes": "" + } + }, "data-source-type-card": { "aria-label-learn-more": "{{dataSourcePluginName}},了解更多。" }, @@ -4635,13 +5723,88 @@ "footer": { "add-csv-or-spreadsheet": "新增 CSV 或試算表" }, + "get-enterprise-phantom-plugins": { + "description": { + "adobe-analytics-datasource": "", + "app-dynamics-integration-and-data-source": "", + "atlassian-statuspage-datasource": "", + "aurora-data-source": "", + "azure-cosmos-db-datasource": "", + "azure-devops-datasource": "", + "catchpoint-datasource": "", + "cloudflare-datasource": "", + "cockroach-db-datasource": "", + "data-dog-integration-and-data-source": "", + "drone-datasource": "", + "git-lab-integration-and-datasource": "", + "honeycomb-integration-and-datasource": "", + "jira-integration-and-datasource": "", + "logic-monitor-devices-datasource": "", + "mongo-db-integration-and-data-source": "", + "netlify-datasource": "", + "new-relic-integration-and-data-source": "", + "pager-duty-datasource": "", + "salesforce-integration-and-datasource": "", + "sap-hana-integration-and-data-source": "", + "service-now-integration-and-data-source": "", + "signal-fx-integration-and-datasource": "", + "snowflake-integration-and-data-source": "", + "sumo-logic-integration-and-datasource": "", + "visualize-and-explore-dynatrace-data": "", + "visualize-and-explore-oracle-sql": "", + "visualize-and-explore-splunk-logs": "", + "wavefront-integration-and-data-source": "", + "zendesk-datasource": "" + } + }, + "get-grafana-cloud-phantom-plugin": { + "description": { + "hosted-graphite-prometheus-and-loki": "" + } + }, "new-data-source-view": { "cancel": "取消", "placeholder-filter-by-name-or-type": "按名稱或類型篩選" }, + "update-data-source": { + "error-info": { + "message": { + "an-unexpected-error-occurred": "" + } + } + }, "use-data-source-info": { "badge-text-not-supported": "不支援", - "badge-text-supported": "支援" + "badge-text-supported": "支援", + "label": { + "alerting": "警報", + "type": "類型" + } + }, + "use-delete-loaded-data-source": { + "title": { + "delete": "刪除" + } + } + }, + "debug": { + "cursor-view": { + "no-events-yet": "" + }, + "render-info-viewer": { + "data-counter": "", + "elapsed-time": "", + "field": "欄位", + "last": "", + "render-counter": "", + "schema-counter": "", + "title-reset-counters": "", + "tooltip-step-back": "", + "type": "類型" + }, + "state-view": { + "current-value": "", + "label-state-name": "" } }, "dimensions": { @@ -4710,6 +5873,19 @@ "remove-value-mapping-aria-label-delete-value-mapping": "刪除值對應", "remove-value-mapping-tooltip-delete": "刪除", "set-color": "設定顏色", + "special-match-options": { + "description": { + "boolean-false-values": "", + "boolean-true-values": "", + "empty-string": "", + "matches-against-number-na-n-not-a-number": "", + "matches-null-and-undefined-values": "", + "matches-null-undefined-and-na-n": "" + }, + "label": { + "empty": "空" + } + }, "tooltip-remove-color": "移除顏色", "tooltip-remove-icon": "移除圖示" }, @@ -4725,6 +5901,20 @@ "display-text": "顯示文字", "icon": "圖示", "label-add-a-new-mapping": "新增對應", + "mapping-types": { + "description": { + "match-a-numerical-range-of-values": "", + "match-a-regular-expression-with-replacement": "", + "match-a-specific-text-value": "", + "match-boolean-empty-values": "" + }, + "label": { + "range": "", + "regex": "", + "special": "", + "value": "數值" + } + }, "update": "更新" } }, @@ -4749,6 +5939,7 @@ }, "explore": { "accordian-logs": { + "events": "", "footer": "事件時間戳記是相對於完整追蹤的開始時間。" }, "accordian-references": { @@ -4759,6 +5950,11 @@ "basic-extensions": { "aria-label-add": "新增" }, + "build-dashboard-panel-from-explore-state": { + "title": { + "new-panel": "" + } + }, "clear": "清除", "confirm-navigation-modal": { "cancel": "取消", @@ -4845,6 +6041,33 @@ "title-table": "表格", "title-traces": "追蹤" }, + "explore-query-inspector": { + "data-tab": { + "label": { + "data": "資料" + } + }, + "error-tab": { + "label": { + "error": "錯誤" + } + }, + "json-tab": { + "label": { + "json": "JSON" + } + }, + "query-tab": { + "label": { + "query": "查詢" + } + }, + "stats-tab": { + "label": { + "stats": "統計資料" + } + } + }, "explore-run-query-button": { "run-button": { "aria-label-run-query-options": "執行查詢選項" @@ -4858,10 +6081,23 @@ "description-explore-disabled": "若要啟用「探索」,請在 Grafana 設定中啟用:", "title-explore-disabled": "「探索」已停用" }, + "get-field-links-for-explore": { + "text": { + "data": "資料", + "raw-value": "" + } + }, "get-matches-metadata": { "matches": "0 個匹配" }, "legacy-create-span-link-factory": { + "text": { + "tags": "標籤" + }, + "title": { + "related-logs": "", + "session-for-this-span": "此範圍的工作階段" + }, "title-explore-metrics-for-this-span": "探索此範圍的指標", "title-explore-split": "在分割檢視中探索此紀錄", "title-session-for-this-span": "此範圍的工作階段" @@ -4902,6 +6138,10 @@ }, "logs-meta-row": { "download": "下載", + "label": { + "deduplication-count": "", + "showing-only-selected-fields": "" + }, "show-original-line": "顯示原始行" }, "logs-sample-panel": { @@ -5083,6 +6323,21 @@ "run-query-button": "執行查詢", "switch-datasource-button": "切換資料來源並執行查詢" }, + "scoped-vars-from-span": { + "text": { + "span": "" + } + }, + "scoped-vars-from-tags": { + "text": { + "tags": "標籤" + } + }, + "scoped-vars-from-trace": { + "text": { + "trace": "追蹤" + } + }, "search-bar-input": { "placeholder-find": "尋找…", "suffix": { @@ -5117,9 +6372,25 @@ "tooltip-tag-key": "將用於取得標記值的標記鍵。將搜尋範圍的屬性和資源以取得標記鍵" }, "span-detail": { + "label": { + "kind": "", + "library-name": "", + "library-version": "", + "status": "狀態:", + "status-message": "", + "trace-state": "" + }, "label-resource-attributes": "資源屬性", "label-span-attributes": "範圍屬性", "label-stack-trace": "堆疊追蹤", + "overview-items": { + "label": { + "child-count": "", + "duration": "", + "service": "", + "start-time": "" + } + }, "warnings": "警告" }, "span-filters": { @@ -5226,6 +6497,18 @@ "title-node-graph": "節點圖表" }, "unthemed-logs": { + "description": { + "show-results-in-logs-visualisation": "", + "show-results-in-table-visualisation": "", + "show-results-newest-to-oldest": "", + "show-results-oldest-to-newest": "" + }, + "label": { + "logs": "紀錄", + "newest-first": "最新排前", + "oldest-first": "最舊排前", + "table": "表格" + }, "label-deduplication": "重複資料", "label-display-results": "顯示結果", "label-prettify-json": "美化 JSON", @@ -5241,6 +6524,15 @@ }, "unthemed-virtualized-trace-view": { "title-scroll-to-top": "捲動回頂部" + }, + "use-focus-span-link": { + "create-focus-span-link": { + "link": { + "title": { + "deep-link-to-this-span": "" + } + } + } } }, "export": { @@ -5326,6 +6618,15 @@ "folder-repo": { "badge-text": "已佈建" }, + "folders": { + "get-loading-nav": { + "main": { + "title": { + "loading": "正在載入" + } + } + } + }, "forgot-password": { "back-button": "回到登入", "change-password": { @@ -5355,10 +6656,102 @@ "incomplete-request-error": "很抱歉,我無法完成您的請求。請再試一次。", "send-custom-feedback": "傳送" }, + "geomap": { + "coordinates-map-view-editor": { + "label-latitude": "", + "label-longitude": "" + }, + "debug-overlay": { + "center": "", + "zoom": "" + }, + "fit-map-view-editor": { + "all-layers-editor-fragment": { + "label-layer": "" + }, + "label-data": "資料", + "last-only-editor-fragment": { + "label-padding": "", + "tooltip-padding-relative-percent-beyond-extent": "" + } + }, + "frame-multi-selection-editor": { + "placeholder-change-filter": "" + }, + "frame-selection-editor": { + "placeholder-change-filter": "" + }, + "geomap-panel": { + "aria-label-map": "" + }, + "geomap-style-rules-editor": { + "aria-label-add-geomap-style-rule": "" + }, + "layers-editor": { + "label-add-layer": "", + "no-layers": "" + }, + "map-view-editor": { + "label-max-zoom": "", + "label-view": "檢視", + "label-zoom": "縮放", + "use-current-map-settings": "" + }, + "markers-legend": { + "title-symbol": "符號" + }, + "measure-overlay": { + "tooltip-show-measure-tools": "" + }, + "plugin": { + "basemap-layer-configured-server-admin": "" + }, + "style-editor": { + "label-align": "", + "label-baseline": "", + "label-color": "顏色", + "label-fill-opacity": "", + "label-font-size": "", + "label-opacity": "", + "label-rotation-angle": "", + "label-size": "", + "label-symbol": "符號", + "label-symbol-horizontal-align": "", + "label-symbol-vertical-align": "", + "label-text-label": "", + "label-x-offset": "", + "label-y-offset": "" + }, + "style-rule-editor": { + "aria-label-comparison-operator": "比較運算子", + "aria-label-comparison-value": "", + "aria-label-delete-style-rule": "", + "aria-label-feature-property": "", + "label-rule": "規則", + "placeholder-feature-property": "", + "placeholder-numeric-value": "", + "placeholder-value": "值" + } + }, "get-enterprise": { "requires-license": "需要 Grafana 企業版授權", "title": "企業版" }, + "gettingstarted": { + "docs-card": { + "complete": "完成", + "learn-how": "" + }, + "getting-started": { + "aria-label-to-advanced-tutorials": "", + "aria-label-to-basic-tutorials": "", + "checking-completed-setup-steps": "", + "remove-this-panel": "" + }, + "tutorial-card": { + "complete": "完成" + } + }, "gops": { "config-card": { "text-loading-configuration": "正在載入設定...." @@ -5375,6 +6768,74 @@ }, "progress-status": { "your-progress": "您的進度" + }, + "use-get-configuration-for-ui": { + "get-connect-data-source-configuration": { + "title": { + "connect-data-source": "" + } + }, + "title": { + "essentials": "必需品" + } + }, + "use-get-essentials-configuration": { + "essential-content": { + "description": { + "configure-grafana-alerting": "", + "create-integration-alerting-contact-point": "", + "initialize-incident-plugin-declare-manage-incidents": "", + "practice-solving-an-incident": "", + "receive-alerts-oncall-notifications-within-environment": "", + "select-chat-ops-channels-to-route-notifications": "" + }, + "label": { + "add": "新增", + "connect": "連接", + "initialize": "", + "select-integration": "", + "start-drill": "" + }, + "title": { + "add-slack-notifications-to-irm-integrations": "", + "connect-alerting-to-irm": "", + "connect-irm-to-your-slack-workspace": "", + "connect-your-messaging-workspace-to-incident": "", + "connect-your-messaging-workspace-to-on-call": "", + "create-incident-drill": "", + "detect": "偵測", + "initialize-incident-plugin": "", + "messaging-workspace-channel-on-call-integration": "", + "respond": "", + "test-your-configuration": "" + } + }, + "get-grafana-alerting-config-steps": { + "description": { + "create-alert-monitor-system": "", + "create-on-call-integration-alerting-contact-point": "", + "create-slos-to-monitor-your-service": "" + }, + "label": { + "connect": "連接", + "create": "建立", + "enable": "啟用" + }, + "steps": { + "label": { + "edit": "編輯" + }, + "title": { + "update-default-contact-point": "" + } + }, + "title": { + "connect-alerting-to-on-call": "", + "create-alert-rule": "", + "create-slo": "", + "enable-slo-alerting": "" + } + } } }, "grafana": { @@ -5741,14 +7202,18 @@ "duplicate-panel": "複製面板", "exit-edit/setting-views": "結束編輯/設定檢視", "expand-all-rows": "展開所有列", + "explore-panel": "", "go-to-dashboards": "前往儀表板", "go-to-explore": "前往「探索」", "go-to-home-dashboard": "前往首頁儀表板", "go-to-profile": "前往個人資料", + "inspect-panel": "", "make-time-range-permanent": "將時間範圍設為絕對/永久", "move-time-range-back": "將時間範圍向後移動", "move-time-range-forward": "將時間範圍向前移動", "open-search": "開啟搜尋", + "open-share-embed-drawer": "", + "open-share-link-drawer": "", "open-shared-modal": "分享面板快照", "paste-time-range": "貼上時間範圍", "refresh-all-panels": "重新整理所有面板", @@ -5774,6 +7239,11 @@ "support-bundle": "您也可以在<1>支援套件部分</1>中擷取支援套件,其中包含有關 Grafana 執行個體和設定資料來源的資訊。", "troubleshooting-help": "若要請求疑難排解協助,請將此面板的快照傳送至 Grafana Labs 技術支援。快照包含查詢回應資料和面板設定。" }, + "histogram": { + "histogram-panel": { + "no-histogram-found-in-response": "" + } + }, "inspector": { "inspect-data-tab": { "loading": "正在載入", @@ -5821,6 +7291,9 @@ "label-name": "名稱(名字)", "label-password": "密碼", "label-username": "使用者名稱", + "message": { + "email-is-invalid": "" + }, "placeholder-name-optional": "名稱(可選)", "placeholder-password": "密碼", "placeholder-username": "使用者名稱", @@ -6077,8 +7550,26 @@ "discard-local-changes": "捨棄本機變更", "title-dashboard-changed": "儀表板已變更" }, + "live-channel-editor": { + "description-grafana-live": "", + "namespace": "命名空間", + "path": "路徑", + "placeholder-select-watchable-resource": "", + "scope": "", + "title-grafana-live": "" + }, "live-connection-warning": { "title-connection-to-server-is-lost": "與伺服器的連線中斷…" + }, + "live-panel": { + "error": "錯誤", + "grafana-requires-feature": "", + "panel-editor-channel": "", + "title-grafana-live": "", + "waiting-for-data": "" + }, + "live-publish": { + "publish": "" } }, "lock-icon": "鎖定圖示", @@ -6125,6 +7616,13 @@ } }, "logs": { + "get-dataframe-fields": { + "vars": { + "text": { + "labels": "標籤" + } + } + }, "infinite-scroll": { "end-of-range": "所選時間範圍的結束。", "load-more": "滾動以載入更多內容", @@ -6205,6 +7703,11 @@ "shortcut": "alt + 選取以再次啟用" } }, + "log-series-to-logs-model": { + "label": { + "total-bytes-processed": "" + } + }, "logs-controls": { "deduplication": "重複資料", "disable-highlighting": "停用醒目提示", @@ -6239,6 +7742,11 @@ "scroll-top": "捲動回頂部", "start-of-range": "範圍開始" }, + "logs-panel": { + "render-common-labels": { + "common-labels": "" + } + }, "out-of-range-message": { "end-of-the-selected-time-range": "所選時間範圍的結束。" }, @@ -6295,6 +7803,14 @@ }, "snapshot-list-table": { "title-delete": "刪除" + }, + "unthemed-dashboard-import": { + "subTitle": { + "import-dashboard-from-file-or-grafanacom": "" + }, + "text": { + "import-dashboard": "匯入儀表板" + } } }, "migrate-to-cloud": { @@ -6952,8 +8468,54 @@ "close": "關閉側邊選單" }, "link-title": "前往 Grafana labs 部落格", + "news-panel": { + "body-error-loading-rss-feed": "", + "loading": "正在載入…", + "title-error-loading-rss-feed": "" + }, "title": "部落格的最新消息" }, + "nodeGraph": { + "arc-options-editor": { + "add-arc": "", + "title-remove-arc": "" + }, + "edge": { + "aria-label-from-to": "" + }, + "edge-header": { + "label-source-target": "" + }, + "marker": { + "100-node-count": "", + "aria-label-hidden-marker": "", + "node-count_other": "" + }, + "node": { + "aria-label-node-title": "" + }, + "node-graph": { + "aria-label-layered-layout-performance-warning": "", + "aria-label-nodes-hidden-warning": "", + "computing-layout": "", + "no-data": "沒有資料", + "hidden-nodes_other": "", + "processed-nodes_other": "" + }, + "node-graph-panel": { + "no-data-found-in-response": "" + }, + "node-header": { + "label-subtitle": "", + "label-title": "標題" + }, + "view-controls": { + "hide-config": "", + "show-config": "", + "title-zoom-in": "", + "title-zoom-out": "" + } + }, "notifications": { "empty-state": { "description": "您收到的通知將顯示在此處", @@ -6995,6 +8557,11 @@ "label-organization-name": "組織名稱", "placeholder-org-name": "組織名稱" }, + "org-details-page": { + "title": { + "confirm-preferences-update": "" + } + }, "org-profile": { "label-organization-name": "組織名稱", "label-organization-profile": "組織設定檔", @@ -7014,7 +8581,10 @@ "tooltip": "您現在可以選擇「無基本角色」選項,並根據您的自訂需求新增權限。您可以在<1>我們的文件</1>中找到更多資訊。" }, "user-invite-page": { - "sub-title": "傳送邀請或將現有 Grafana 使用者新增至組織。<1>{{orgName}}</1>" + "sub-title": "傳送邀請或將現有 Grafana 使用者新增至組織。<1>{{orgName}}</1>", + "text": { + "invite-user": "" + } } }, "org-picker": { @@ -7026,6 +8596,38 @@ } }, "panel": { + "get-calculation-value-data-links-variable-suggestions": { + "value-calc-var": { + "label": { + "calculation-name": "" + } + } + }, + "get-data-links-variable-suggestions": { + "value-time-var": { + "label": { + "time": "時間" + } + } + }, + "get-field-links-supplier": { + "text": { + "data": "資料", + "field": "欄位", + "series": "", + "value": "數值" + } + }, + "get-field-vars": { + "label": { + "name": "名稱(名字)" + } + }, + "get-panel-links-variable-suggestions": { + "label": { + "all-variables": "" + } + }, "header-menu": { "copy": "複製", "create-library-panel": "建立資料庫面板", @@ -7086,6 +8688,13 @@ "select-placeholder": "按類型篩選" }, "playlist": { + "playlist-new-page": { + "page-nav": { + "text": { + "new-playlist": "新播放清單" + } + } + }, "playlist-table-rows": { "aria-label-playlist-item": "播放清單項目,{{itemType}},{{itemValue}}", "multiple-dashboards-found": "找到多個項目:{{items}}", @@ -7102,6 +8711,12 @@ "label-mode": "模式", "label-time-and-refresh": "時間與重新整理", "label-variables": "變數", + "modes": { + "label": { + "kiosk": "資訊站", + "normal": "一般" + } + }, "title-start-playlist": "開始播放清單" } }, @@ -7168,6 +8783,19 @@ }, "browse": { "aria-label-plugin-type-filter": "外掛程式類型篩選器", + "filter-by-options": { + "label": { + "all": "全部", + "installed": "已安裝", + "new-updates": "" + } + }, + "label": { + "all": "全部", + "applications": "", + "data-sources": "資料來源", + "panels": "面板" + }, "label-search": "搜尋", "label-state": "狀態", "label-type": "類型", @@ -7249,12 +8877,24 @@ "empty-state": { "message": "未找到外掛程式" }, + "extensions-log-data-source": { + "message": { + "ok": "確定" + } + }, "filter": { "disabled": "此篩選器已被停用,因為 Grafana 伺服器無法存取 grafana.com", "sort": "排序", "sort-list": "排序外掛程式清單", "state": "狀態" }, + "get-feature-state-info": { + "text": { + "alpha": "", + "beta": "Beta", + "deprecated": "已取代" + } + }, "get-started-with-app": { "disable": "停用", "enable": "啟用" @@ -7311,6 +8951,16 @@ "plugin-details-header-dependencies": { "grafana-dependency": "Grafana {{grafanaDependency}}" }, + "plugin-details-page": { + "not-found-model": { + "subTitle": { + "requested-belong-plugin": "" + }, + "text": { + "unknown-plugin": "" + } + } + }, "plugin-details-signature": { "body-invalid-plugin-signature": "Grafana Labs 檢查每個外掛程式,以驗證其是否具有有效的數位簽章。外掛程式簽章驗證是我們安全措施的一部分,以確保外掛程式安全且值得信賴。Grafana Labs 無法保證此未簽署外掛程式的完整性。請讓外掛程式作者要求簽署。", "read-more-about-plugins-signing": "閱讀更多關於外掛程式簽署的資訊。", @@ -7356,6 +9006,13 @@ "search-field": { "placeholder-search-grafana-plugins": "搜尋 Grafana 外掛程式" }, + "use-plugin-details-tabs": { + "nav-model-children": { + "text": { + "dashboards": "儀表板" + } + } + }, "version-install-button": { "text-installed": "已安裝" }, @@ -7472,6 +9129,11 @@ "label-git-hub-features": "GitHub 功能", "label-realtime-feedback": "即時意見回饋" }, + "connect-page": { + "subTitle": { + "connect-external-storage-manage-resources": "" + } + }, "connect-repository-button": { "configure": "設定", "configure-file": "設定檔案佈建", @@ -7505,7 +9167,13 @@ }, "edit-repository-page": { "back-to-repositories": "返回至儲存庫", - "repository-config-exists-configuration": "請確認儲存庫設定存在於設定檔案中。" + "repository-config-exists-configuration": "請確認儲存庫設定存在於設定檔案中。", + "subTitle": { + "configure-repository-storing-resources": "" + }, + "text": { + "configure-repository": "" + } }, "empty-state": { "no-jobs": "沒有作業…" @@ -7568,6 +9236,11 @@ "no-results-matching-your-query": "沒有符合您查詢的結果", "placeholder-search": "搜尋" }, + "get-default-values": { + "title": { + "repository": "存放庫" + } + }, "getting-started": { "alert-temporary-outage": "連接整個執行個體時,在執行移轉時將無法使用儀表板。建議您在開始此流程前通知使用者。", "modal-description-public-access": "設定 Grafana 執行個體的公共存取權限,以啟用 GitHub 整合", @@ -7712,7 +9385,18 @@ "dashboard-preview": "儀表板預覽", "existing-dashboard": "現有儀表板", "history": "歷史紀錄", + "message": { + "removed-from-repo-test-ui": "", + "updated-from-repo-test-ui": "" + }, "repository": "存放庫", + "tab-info": { + "label": { + "dry-run-result-after-apply": "", + "existing-from-grafana": "", + "file-from-repository": "" + } + }, "title-error-saving-file": "儲存檔案時發生錯誤" }, "setup-modal": { @@ -8121,14 +9805,6 @@ "reload-button": "重新載入", "title": "無法找到應用程式檔案" }, - "sandbox": { - "test-stuff-page": { - "application-notifications-toasts-testing": "應用程式通知(快顯通知)測試", - "error": "錯誤", - "success": "成功", - "warning": "警告" - } - }, "save-dashboards": { "message-length": { "info": "訊息為 {{messageLength}} 個字元,超過 500 個字元的最大長度。請在儲存前縮短。", @@ -8188,6 +9864,14 @@ "view-as-folders": "依資料夾檢視", "view-as-list": "以清單形式檢視" }, + "bluge-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } + }, "dashboard-actions": { "import": "匯入", "new": "新", @@ -8215,6 +9899,14 @@ "search-results-table": { "aria-label-search-results-table": "搜尋結果表格", "no-data": "沒有數值" + }, + "unified-searcher": { + "opts": { + "label": { + "alphabetically-az": "", + "alphabetically-za": "" + } + } } }, "select": { @@ -8286,6 +9978,11 @@ "delete-service-account": "刪除服務帳戶", "disable-service-account": "停用服務帳戶", "enable-service-account": "啟用服務帳戶", + "page-nav": { + "subTitle": { + "manage-settings-individual-service-account": "" + } + }, "title-delete-service-account": "刪除服務帳戶", "title-disable-service-account": "停用服務帳戶", "tokens": "權杖", @@ -8602,6 +10299,11 @@ "sort-picker": { "select-aria-label": "排序" }, + "status-history": { + "status-history-panel": { + "too-many-points_other": "" + } + }, "support-bundles": { "new-bundle-button": { "new-support-bundle": "新的支援套件" @@ -8609,7 +10311,10 @@ "support-bundles-create-unconnected": { "cancel": "取消", "create": "建立", - "sub-title": "選擇支援套件的組件。支援套件將在建立後 3 天內可用。" + "sub-title": "選擇支援套件的組件。支援套件將在建立後 3 天內可用。", + "text": { + "create-support-bundle": "" + } }, "support-bundles-unconnected": { "created-on": "建立時間", @@ -8624,10 +10329,35 @@ "login": "登入" }, "table": { + "auto-cell-options-editor": { + "description-wrap-text": "", + "label-wrap-text": "" + }, + "bar-gauge-cell-options-editor": { + "label-gauge-display-mode": "", + "label-value-display": "" + }, + "color-background-cell-options-editor": { + "description-apply-to-entire-row": "", + "description-wrap-text": "", + "label": { + "text-alpha": "" + }, + "label-apply-to-entire-row": "", + "label-background-display-mode": "", + "label-wrap-text": "", + "wrap-text": "" + }, "container": { "content": "在單個表格中顯示太多欄位可能會影響效能,並使資料難以讀取。請考慮縮小您的查詢範圍。", "show-all-series": "顯示所有列", "show-only-series": "僅顯示 {{MAX_NUMBER_OF_COLUMNS}} 個欄位" + }, + "image-cell-options-editor": { + "description-alt-text": "", + "description-title-text": "", + "label-alt-text": "", + "label-title-text": "" } }, "tag-filter": { @@ -8643,6 +10373,24 @@ "select-placeholder": "選擇團隊" }, "teams": { + "build-nav-model": { + "nav-model": { + "subTitle": { + "manage-members-and-settings": "" + }, + "text": { + "settings": "設定" + } + }, + "team-group-sync": { + "text": { + "external-group-sync": "外部群組同步" + } + }, + "text": { + "members": "會員" + } + }, "create-team": { "create": "建立", "description-email": "這是可選項目,主要用於允許自訂團隊頭像", @@ -8664,6 +10412,9 @@ "external-group-sync": "外部群組同步", "label-add-external-group": "新增外部群組", "team-sync-upgrade": "在試用 Grafana 專業版期間,新增群組以免費啟用團隊同步功能", + "text": { + "add-group": "新增群組" + }, "title-there-external-groups": "沒有可同步的外部群組", "tooltip-add-external-group": "LDAP 群組範例:{{example}}" }, @@ -8765,6 +10516,42 @@ "select-search-input": "輸入以搜尋(國家、城市、縮寫)" } }, + "timeseries": { + "annotation-editor2": { + "add-annotation": "新增注釋", + "cancel": "取消", + "edit-annotation": "", + "label-description": "說明", + "label-tags": "標籤", + "placeholder-add-tags": "", + "save": "儲存", + "saving": "正在儲存" + }, + "annotation-tooltip2": { + "tooltip-delete": "刪除", + "tooltip-edit": "編輯" + }, + "line-style-editor": { + "title-the-input-expects-a-segment-list": "", + "tooltip-help": "說明" + }, + "nulls-threshold-input": { + "placeholder-never": "從不" + }, + "outside-range-plugin": { + "data-outside-time-range": "", + "zoom-to-data": "" + }, + "timezones-editor": { + "tooltip-add-timezone": "", + "tooltip-remove-timezone": "" + } + }, + "traces": { + "traces-panel": { + "no-data-found-in-response": "" + } + }, "transformations": { "empty": { "add-transformation-body": "轉換功能可在顯示可視化之前,以各種方式變更資料。<1></1>這包括連接資料、重新命名欄位、進行計算、格式化資料以便顯示等。", @@ -8801,6 +10588,10 @@ "convert-field-type-transformer-editor": { "aria-label-add-a-convert-field-type-transformer": "新增轉換欄位類型轉換器", "aria-label-remove-convert-field-type-transformer": "移除轉換欄位類型轉換器", + "label": { + "browser": "瀏覽器", + "utc": "" + }, "label-as": "作為", "label-date-format": "日期格式", "label-field": "欄位", @@ -8887,11 +10678,32 @@ "tooltip-format": "指定為 <2>Moment.js 格式字串</2>的欄位輸出格式。", "tooltip-timezone-manually": "手動設定日期的時區" }, + "get-timezone-options": { + "label": { + "browser": "瀏覽器", + "utc": "" + } + }, "get-tooltips": { "description": "json 對象的有效路徑。", "json-value": "JSON 值:", + "map-valid-paths": { + "description": { + "extract-fields-from-object": "", + "extract-value": "", + "extract-value-first-element": "", + "extract-value-second-element": "" + } + }, "valid-paths": "有效路徑:" }, + "get-transformer-option-pane": { + "root": { + "title": { + "root": "" + } + } + }, "group-by-field-configuration": { "placeholder-ignored": "已略過", "placeholder-select-stats": "選擇統計資料" @@ -8908,7 +10720,23 @@ "label-cell-value": "儲存格數值", "label-column": "欄位", "label-empty-value": "空白數值", - "label-row": "列" + "label-row": "列", + "special-value-options": { + "description": { + "boolean-false-value": "", + "boolean-true-value": "", + "empty-string": "", + "null-value": "", + "number-value": "" + }, + "label": { + "empty": "空", + "false": "", + "null": "", + "true": "", + "zero": "" + } + } }, "histogram-transformer-editor": { "placeholder-auto": "自動", @@ -8971,10 +10799,22 @@ "tooltip-naming": "設定所選欄位名稱的顯示方式。因為框架名稱通常更適合表格資料" }, "partition-by-values-editor": { + "keep-fields-options": { + "label": { + "no": "否", + "yes": "是" + } + }, "label-field": "欄位", "label-keep-fields": "保留欄位", "label-naming": "命名", "label-select-field": "選擇欄位", + "naming-modes-options": { + "label": { + "as-frame-name": "", + "as-label": "" + } + }, "partition-values-works-single-frame": "按值分割僅適用於單個框架。", "tooltip-keeps-partition-fields-frames": "在框架中保留分割欄位" }, @@ -8996,6 +10836,16 @@ "label-include-time": "包含時間", "label-labels-to-fields": "欄位標籤", "label-mode": "模式", + "modes": { + "description": { + "collapse-field-single-value": "", + "create-table-series-value": "" + }, + "label": { + "reduce-fields": "", + "series-to-rows": "" + } + }, "placeholder-choose-stat": "選擇統計資料" }, "regex-matcher-editor": { @@ -9003,11 +10853,23 @@ "variable-regex-documentation": "" }, "regression-transformer-editor": { + "label": { + "cubic": "", + "quadratic": "", + "quartic": "", + "quintic": "" + }, "label-degree": "度", "label-model-type": "模型類型", "label-predicted-points": "預測點", "label-x-field": "X 欄位", "label-y-field": "Y 欄位", + "model-type-options": { + "label": { + "linear": "", + "polynomial": "" + } + }, "tooltip-number-of-xy-points-to-predict": "要預測的 X、Y 點數" }, "rename-by-regex-transformer-editor": { @@ -9025,6 +10887,23 @@ "label-reverse": "反向", "placeholder-select-field": "選擇欄位" }, + "supplier": { + "description": { + "apply-spatial-operations-to-the-geometry": "", + "create-a-line-between-two-points": "", + "geometry-define-field-headingdistancearea": "" + }, + "label": { + "area": "", + "as-line": "", + "calculate-value": "", + "distance": "", + "heading": "", + "line-builder": "", + "prepare-spatial-field": "", + "transform": "" + } + }, "time-series-table-transform-editor": { "label-stat": "統計資料", "label-time-field": "時間欄位", @@ -9058,7 +10937,19 @@ "placeholder-auto": "自動", "placeholder-field": "欄位", "tooltip-window-size": "視窗大小", - "tooltip-window-size-percent": "將視窗大小設定為總資料的百分比" + "tooltip-window-size-percent": "將視窗大小設定為總資料的百分比", + "type-options": { + "label": { + "centered": "", + "trailing": "" + } + }, + "window-size-mode-options": { + "label": { + "fixed": "", + "percentage": "" + } + } } }, "upgrade-box": { @@ -9115,6 +11006,11 @@ }, "users-action-bar-unconnected": { "invite": "邀請", + "options": { + "label": { + "users": "使用者" + } + }, "placeholder-search-login-email": "按登入、電子郵件或名稱搜尋使用者" } }, @@ -9158,6 +11054,32 @@ "confirm-delete-modal": { "title-delete-variable": "刪除變數" }, + "create-ad-hoc-variable-adapter": { + "description": { + "add-keyvalue-filters-on-the-fly": "" + } + }, + "create-custom-variable-adapter": { + "description": { + "define-variable-values-manually": "" + } + }, + "create-interval-variable-adapter": { + "description": { + "define-timespan-interval": "" + } + }, + "create-query-variable-adapter": { + "description": { + "variable-values-fetched-datasource-query": "" + } + }, + "data-source-variable-slice": { + "text": { + "default": "", + "no-data-sources-found": "沒有找到資料來源" + } + }, "empty-state": { "button-title": "新增變數", "info-box-content": "變數可啟用更具互動性和動態的儀表板。您可以使用變數來代替在指標查詢中對伺服器或感應器名稱等進行硬編碼。變數顯示為儀表板頂部的清單方塊。這些下拉式清單可讓您輕鬆變更儀表板中顯示的資料。", @@ -9184,6 +11106,13 @@ "placeholder-default-value-if-any": "預設值(如有)", "text-options": "文字選項" }, + "transform-usages-to-network": { + "result": { + "label": { + "dashboard": "" + } + } + }, "unknown-table": { "loading": "正在載入…", "no-unknowns": "未找到重新命名或遺失的變數。", @@ -9240,5 +11169,25 @@ "data-hover-view": { "link": "連結" } + }, + "welcome": { + "welcome-banner": { + "need-help": "需要幫忙嗎?", + "welcome-to-grafana": "" + } + }, + "xychart": { + "series-editor": { + "add-series": "", + "aria-label-select-series": "", + "label-color-field": "", + "label-frame": "畫面", + "label-size-field": "", + "label-x-field": "X 欄位", + "label-y-field": "Y 欄位", + "placeholder-all-frames": "", + "placeholder-select-frame": "", + "tooltip-delete-series": "" + } } } \ No newline at end of file diff --git a/public/openapi3.json b/public/openapi3.json index ca7f23f4414..f32b82e15d3 100644 --- a/public/openapi3.json +++ b/public/openapi3.json @@ -12974,6 +12974,7 @@ "type": "object" }, "alertGroups": { + "description": "AlertGroups alert groups", "items": { "$ref": "#/components/schemas/alertGroup" }, @@ -13301,6 +13302,7 @@ "type": "object" }, "gettableSilences": { + "description": "GettableSilences gettable silences", "items": { "$ref": "#/components/schemas/gettableSilence" }, diff --git a/public/swagger/SwaggerPage.tsx b/public/swagger/SwaggerPage.tsx index 940adc26a16..d44eda5d36c 100644 --- a/public/swagger/SwaggerPage.tsx +++ b/public/swagger/SwaggerPage.tsx @@ -127,8 +127,6 @@ export const Page = () => { persistAuthorization={false} /> )} - - {/* 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> diff --git a/public/test/helpers/alertingRuleEditor.tsx b/public/test/helpers/alertingRuleEditor.tsx index 0375a9123bd..9b23e8d1352 100644 --- a/public/test/helpers/alertingRuleEditor.tsx +++ b/public/test/helpers/alertingRuleEditor.tsx @@ -17,6 +17,7 @@ export const ui = { inputs: { name: byRole('textbox', { name: 'name' }), metric: byRole('textbox', { name: 'metric' }), + targetDatasource: byTestId('target-data-source'), alertType: byTestId('alert-type-picker'), dataSource: byTestId(selectors.components.DataSourcePicker.inputV2), folder: byTestId('folder-picker'), diff --git a/yarn.lock b/yarn.lock index 4d2b8c699f4..32e9d56f28c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1425,7 +1425,7 @@ __metadata: languageName: node linkType: hard -"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.1, @babel/runtime@npm:^7.11.1, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.0, @babel/runtime@npm:^7.12.1, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.15.4, @babel/runtime@npm:^7.16.3, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.18.0, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.20.0, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.23.9, @babel/runtime@npm:^7.24.5, @babel/runtime@npm:^7.24.7, @babel/runtime@npm:^7.25.0, @babel/runtime@npm:^7.25.6, @babel/runtime@npm:^7.25.7, @babel/runtime@npm:^7.27.0, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7": +"@babel/runtime@npm:^7.0.0, @babel/runtime@npm:^7.1.2, @babel/runtime@npm:^7.10.1, @babel/runtime@npm:^7.11.1, @babel/runtime@npm:^7.11.2, @babel/runtime@npm:^7.12.0, @babel/runtime@npm:^7.12.1, @babel/runtime@npm:^7.12.13, @babel/runtime@npm:^7.12.5, @babel/runtime@npm:^7.13.10, @babel/runtime@npm:^7.16.3, @babel/runtime@npm:^7.17.8, @babel/runtime@npm:^7.18.0, @babel/runtime@npm:^7.18.3, @babel/runtime@npm:^7.20.0, @babel/runtime@npm:^7.20.7, @babel/runtime@npm:^7.23.2, @babel/runtime@npm:^7.23.9, @babel/runtime@npm:^7.24.5, @babel/runtime@npm:^7.24.7, @babel/runtime@npm:^7.25.0, @babel/runtime@npm:^7.25.6, @babel/runtime@npm:^7.25.7, @babel/runtime@npm:^7.27.0, @babel/runtime@npm:^7.3.1, @babel/runtime@npm:^7.5.5, @babel/runtime@npm:^7.7.6, @babel/runtime@npm:^7.8.4, @babel/runtime@npm:^7.8.7": version: 7.27.1 resolution: "@babel/runtime@npm:7.27.1" checksum: 10/34cefcbf781ea5a4f1b93f8563327b9ac82694bebdae91e8bd9d7f58d084cbe5b9a6e7f94d77076e15b0bcdaa0040a36cb30737584028df6c4673b4c67b2a31d @@ -1594,10 +1594,10 @@ __metadata: languageName: node linkType: hard -"@bsull/augurs@npm:^0.9.0": - version: 0.9.0 - resolution: "@bsull/augurs@npm:0.9.0" - checksum: 10/284299c0af22ca9f91efc981b4e6471d9a5791de2ffa6b987ed95309c9d0fce1d6bfa6b3f58e8a935859b04b5b3714d3617be1d569f7164c68d4748ba12b6722 +"@bsull/augurs@npm:^0.10.0": + version: 0.10.0 + resolution: "@bsull/augurs@npm:0.10.0" + checksum: 10/ba981263ed270d5c552ca41b0a8a22065dc67a34bb4834a30dda587694f5fa8a42dc7ffdd9d4f59695d3a5ac401a3ca513d54eba0de6b7eecbd04226b3afd6c4 languageName: node linkType: hard @@ -1752,24 +1752,6 @@ __metadata: languageName: node linkType: hard -"@date-io/core@npm:^1.3.13": - version: 1.3.13 - resolution: "@date-io/core@npm:1.3.13" - checksum: 10/5a9e9d1de20f0346a3c7d2d5946190caef4bfb0b64d82ba1f4c566657a9192667c94ebe7f438d11d4286d9c190974daad4fb2159294225cd8af4d9a140239879 - languageName: node - linkType: hard - -"@date-io/moment@npm:^1.3.13": - version: 1.3.13 - resolution: "@date-io/moment@npm:1.3.13" - dependencies: - "@date-io/core": "npm:^1.3.13" - peerDependencies: - moment: ^2.24.0 - checksum: 10/ed62d4fd5629935110dbf75dc2e5cfa376c9da4338726dcca967d04d082006a3cddcc18eacd3b8332e930a6d2edb6ebe8eb5a2e8b11427ac534c50a2acd0b3e1 - languageName: node - linkType: hard - "@daybrush/utils@npm:^1.1.1, @daybrush/utils@npm:^1.13.0, @daybrush/utils@npm:^1.4.0, @daybrush/utils@npm:^1.6.0, @daybrush/utils@npm:^1.7.1": version: 1.13.0 resolution: "@daybrush/utils@npm:1.13.0" @@ -2338,9 +2320,9 @@ __metadata: languageName: node linkType: hard -"@floating-ui/react@npm:0.27.8": - version: 0.27.8 - resolution: "@floating-ui/react@npm:0.27.8" +"@floating-ui/react@npm:0.27.9": + version: 0.27.9 + resolution: "@floating-ui/react@npm:0.27.9" dependencies: "@floating-ui/react-dom": "npm:^2.1.2" "@floating-ui/utils": "npm:^0.2.9" @@ -2348,7 +2330,7 @@ __metadata: peerDependencies: react: ">=17.0.0" react-dom: ">=17.0.0" - checksum: 10/9423e3b7d6298918cb14ad3cfa36ba7b88ef86f18c4c47f7870b367716e918757dc0cf9842ef4995ee784b68aebe725c28c2ae143ecfe16380d3ccfd05cacb43 + checksum: 10/0f5cab7a20fd882845fb7aec0aabb4bcb0f380149e99bc7623033c810f24274d80645d8494beb1fd5e7b5068a1a2cfa645be1a92f5439855edfdfcb737bbc8b7 languageName: node linkType: hard @@ -2846,7 +2828,7 @@ __metadata: "@lezer/lr": "npm:1.4.2" "@opentelemetry/api": "npm:1.9.0" "@opentelemetry/exporter-collector": "npm:0.25.0" - "@opentelemetry/semantic-conventions": "npm:1.28.0" + "@opentelemetry/semantic-conventions": "npm:1.34.0" "@testing-library/dom": "npm:10.4.0" "@testing-library/jest-dom": "npm:6.6.3" "@testing-library/react": "npm:16.2.0" @@ -2950,22 +2932,23 @@ __metadata: languageName: unknown linkType: soft -"@grafana/async-query-data@npm:0.3.0": - version: 0.3.0 - resolution: "@grafana/async-query-data@npm:0.3.0" +"@grafana/async-query-data@npm:0.4.1": + version: 0.4.1 + resolution: "@grafana/async-query-data@npm:0.4.1" dependencies: + semver: "npm:^7.6.3" tslib: "npm:^2.8.0" - checksum: 10/257331c0333abce16f6b4c994abfd60ca27076a4f8897392118beddc2f24686ecaad8dfbcbbf573f91f842e1c236124f99febb01a0e4f671d7759cdc1c9481af + checksum: 10/f75d3114f15b91227e23fa8214ca55ec00f5b6bce0ebb977ab14ad197ae1ab46126e9fdcce9af5816774b13e2797e5e26283f6a14d3f57420a08b2ded64a6515 languageName: node linkType: hard -"@grafana/aws-sdk@npm:0.6.0": - version: 0.6.0 - resolution: "@grafana/aws-sdk@npm:0.6.0" +"@grafana/aws-sdk@npm:0.7.1": + version: 0.7.1 + resolution: "@grafana/aws-sdk@npm:0.7.1" dependencies: - "@grafana/async-query-data": "npm:0.3.0" - "@grafana/plugin-ui": "npm:^0.9.3" - checksum: 10/a9ec4b54fbc7397c6ade0b7698baf5f296c121ba1c2f913ce9f12e03b3179628acaff157c04c1ab5c71f7fdeb4509e35e31c3e7b2eaf83dc7674a860d77698d6 + "@grafana/async-query-data": "npm:0.4.1" + "@grafana/plugin-ui": "npm:^0.10.1" + checksum: 10/3b03b2bc6a7174d7b7e8aae77d62d70e87fb694781e69c16bb75312071c2adac9c6cfa2a51c0881cc302c6630a7b94adbb2696e0dc674e43cc9de8954ac761bf languageName: node linkType: hard @@ -3224,10 +3207,11 @@ __metadata: languageName: node linkType: hard -"@grafana/llm@npm:0.13.2": - version: 0.13.2 - resolution: "@grafana/llm@npm:0.13.2" +"@grafana/llm@npm:0.19.2": + version: 0.19.2 + resolution: "@grafana/llm@npm:0.19.2" dependencies: + "@modelcontextprotocol/sdk": "npm:^1.7.0" react-use: "npm:^17.6.0" semver: "npm:^7.6.3" uuid: "npm:^11.0.5" @@ -3236,7 +3220,7 @@ __metadata: "@grafana/runtime": ^10.4.0 || ^11 react: ^18 rxjs: ^7.8.1 - checksum: 10/f30a637902cd8a2de6c9bb82ed9e31d98a7817c833023c0930c658a4087a299d2e40036b0262fd4acca1335e029994664a221037cc9279d99bebe3e3f43322ac + checksum: 10/a348702f78171e43a46c0c72b1a290acadd3ea0dc81b27cb106d31e2246e75d0da1c92e41d4659f224b9f34618b2ea4013051c77c241f4e37dd11b2ef8093578 languageName: node linkType: hard @@ -3320,7 +3304,7 @@ __metadata: languageName: node linkType: hard -"@grafana/plugin-ui@npm:0.10.6": +"@grafana/plugin-ui@npm:0.10.6, @grafana/plugin-ui@npm:^0.10.1": version: 0.10.6 resolution: "@grafana/plugin-ui@npm:0.10.6" dependencies: @@ -3348,42 +3332,12 @@ __metadata: languageName: node linkType: hard -"@grafana/plugin-ui@npm:^0.9.3": - version: 0.9.6 - resolution: "@grafana/plugin-ui@npm:0.9.6" - dependencies: - "@hello-pangea/dnd": "npm:^17.0.0" - lodash: "npm:^4.17.21" - prismjs: "npm:^1.29.0" - prompts: "npm:^2.4.2" - rc-cascader: "npm:1.0.1" - react-awesome-query-builder: "npm:^5.3.1" - react-popper-tooltip: "npm:^4.4.2" - react-use: "npm:17.3.1" - react-virtualized-auto-sizer: "npm:^1.0.6" - sql-formatter-plus: "npm:^1.3.6" - uuid: "npm:^8.3.2" - peerDependencies: - "@changesets/cli": ">=2.x" - "@grafana/data": ^10.4.0 || ^11.0.0 - "@grafana/e2e-selectors": ^10.4.0 || ^11.0.0 - "@grafana/runtime": ^10.4.0 || ^11.0.0 - "@grafana/ui": ^10.4.0 || ^11.0.0 - react: ^18.2.0 - react-dom: ^18.2.0 - rxjs: ^7.8.1 - bin: - changeset-improved: dist/utils/changeset/index.js - checksum: 10/260317fd20becd3bed4b7beb758e855075c707952622169e1cd1c8624ff40e2d297b8b92584abb55a012cecbf81f1712372bc5420c3b93cfb0079504e649f858 - languageName: node - linkType: hard - "@grafana/prometheus@workspace:*, @grafana/prometheus@workspace:packages/grafana-prometheus": version: 0.0.0-use.local resolution: "@grafana/prometheus@workspace:packages/grafana-prometheus" dependencies: "@emotion/css": "npm:11.13.5" - "@floating-ui/react": "npm:0.27.8" + "@floating-ui/react": "npm:0.27.9" "@grafana/data": "npm:12.1.0-pre" "@grafana/e2e-selectors": "npm:12.1.0-pre" "@grafana/plugin-ui": "npm:0.10.6" @@ -3396,7 +3350,7 @@ __metadata: "@lezer/common": "npm:1.2.3" "@lezer/highlight": "npm:1.2.1" "@lezer/lr": "npm:1.4.2" - "@prometheus-io/lezer-promql": "npm:0.301.0" + "@prometheus-io/lezer-promql": "npm:0.304.0" "@reduxjs/toolkit": "npm:2.5.1" "@rollup/plugin-image": "npm:3.0.3" "@rollup/plugin-node-resolve": "npm:16.0.0" @@ -3490,10 +3444,10 @@ __metadata: linkType: soft "@grafana/scenes-react@npm:^6.12.0": - version: 6.13.0 - resolution: "@grafana/scenes-react@npm:6.13.0" + version: 6.16.0 + resolution: "@grafana/scenes-react@npm:6.16.0" dependencies: - "@grafana/scenes": "npm:6.13.0" + "@grafana/scenes": "npm:6.16.0" lru-cache: "npm:^10.2.2" react-use: "npm:^17.4.0" peerDependencies: @@ -3505,13 +3459,13 @@ __metadata: react: ^18.0.0 react-dom: ^18.0.0 react-router-dom: ^6.28.0 - checksum: 10/8bbb098770d3b24fd60f4caa88579cd2e2327131061c7f54c25aa86688b4f4b7326d112515fe8ff3d62134af37af757d12d023c76dfaa68836f034e38f02da6d + checksum: 10/a1a7824b1c8f05fd5149d93a5aa0037014d5ff3e777669d5212c2426812973510dbeea225cb4f5d5e5a9038910a590d6d170b5ebe681c5be6e2fd951a3fabc07 languageName: node linkType: hard -"@grafana/scenes@npm:6.13.0, @grafana/scenes@npm:^6.12.0": - version: 6.13.0 - resolution: "@grafana/scenes@npm:6.13.0" +"@grafana/scenes@npm:6.16.0, @grafana/scenes@npm:^6.12.0": + version: 6.16.0 + resolution: "@grafana/scenes@npm:6.16.0" dependencies: "@floating-ui/react": "npm:^0.26.16" "@leeoniya/ufuzzy": "npm:^1.0.16" @@ -3529,7 +3483,7 @@ __metadata: react: ^18.0.0 react-dom: ^18.0.0 react-router-dom: ^6.28.0 - checksum: 10/62247045c095ac951c83059816214407e2fcf3736a61b536323616cdce08cd77a99b6a3532a1dbbe4f50ca26c94094a82e1713df84c37b0a7c0bebcf164b0b26 + checksum: 10/e379ba53fc835b6b3a6eb19d7527a6e775c10684d4eed650f85e5ad8c3fdb682fe20428c2ea467e66fc9050b19b19eb46ebed2ef5253dd1c3f6a58fd04d42205 languageName: node linkType: hard @@ -3622,7 +3576,7 @@ __metadata: "@emotion/react": "npm:11.14.0" "@emotion/serialize": "npm:1.3.3" "@faker-js/faker": "npm:^9.0.0" - "@floating-ui/react": "npm:0.27.8" + "@floating-ui/react": "npm:0.27.9" "@grafana/data": "npm:12.1.0-pre" "@grafana/e2e-selectors": "npm:12.1.0-pre" "@grafana/faro-web-sdk": "npm:^1.13.2" @@ -3631,7 +3585,7 @@ __metadata: "@grafana/tsconfig": "npm:^2.0.0" "@hello-pangea/dnd": "npm:17.0.0" "@leeoniya/ufuzzy": "npm:1.0.18" - "@monaco-editor/react": "npm:4.6.0" + "@monaco-editor/react": "npm:4.7.0" "@popperjs/core": "npm:2.11.8" "@react-aria/dialog": "npm:3.5.25" "@react-aria/focus": "npm:3.20.3" @@ -3718,7 +3672,7 @@ __metadata: react-calendar: "npm:^5.1.0" react-colorful: "npm:5.6.1" react-custom-scrollbars-2: "npm:4.5.0" - react-data-grid: "npm:7.0.0-beta.46" + react-data-grid: "grafana/react-data-grid#3420f7f2a9e0d707d3313ec5b143a6be53f720b5" react-dom: "npm:18.3.1" react-dropzone: "npm:14.3.8" react-highlight-words: "npm:0.21.0" @@ -4959,27 +4913,44 @@ __metadata: languageName: node linkType: hard -"@monaco-editor/loader@npm:^1.4.0": - version: 1.4.0 - resolution: "@monaco-editor/loader@npm:1.4.0" +"@modelcontextprotocol/sdk@npm:^1.7.0": + version: 1.12.0 + resolution: "@modelcontextprotocol/sdk@npm:1.12.0" + dependencies: + ajv: "npm:^6.12.6" + content-type: "npm:^1.0.5" + cors: "npm:^2.8.5" + cross-spawn: "npm:^7.0.5" + eventsource: "npm:^3.0.2" + express: "npm:^5.0.1" + express-rate-limit: "npm:^7.5.0" + pkce-challenge: "npm:^5.0.0" + raw-body: "npm:^3.0.0" + zod: "npm:^3.23.8" + zod-to-json-schema: "npm:^3.24.1" + checksum: 10/38760dc7529313901f9d643ed1d872bb903b586fdce34be169c67eeeb98ef87e1e1eef436a6ed5f919a35c2c709c6cbb915d335fe2c6b0a504a400e9337d65e4 + languageName: node + linkType: hard + +"@monaco-editor/loader@npm:^1.5.0": + version: 1.5.0 + resolution: "@monaco-editor/loader@npm:1.5.0" dependencies: state-local: "npm:^1.0.6" - peerDependencies: - monaco-editor: ">= 0.21.0 < 1" - checksum: 10/32ad01de015fc187450aa1cc0aa763af167664b6a61efcb9e1523a0f51ca5d0b35ba11ed95889edd6d774dfe98f196ef58f1607243abcbdd3d6d743f82ba8285 + checksum: 10/97d79916afa856809de4eaafaee1b1c6dc9443c0fdde81a7562f4ffa0c252496e97c4becf4c1f00c4119878c76d73390ce416a64305e59865a5830bded5afe55 languageName: node linkType: hard -"@monaco-editor/react@npm:4.6.0": - version: 4.6.0 - resolution: "@monaco-editor/react@npm:4.6.0" +"@monaco-editor/react@npm:4.7.0": + version: 4.7.0 + resolution: "@monaco-editor/react@npm:4.7.0" dependencies: - "@monaco-editor/loader": "npm:^1.4.0" + "@monaco-editor/loader": "npm:^1.5.0" peerDependencies: monaco-editor: ">= 0.25.0 < 1" - react: ^16.8.0 || ^17.0.0 || ^18.0.0 - react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 - checksum: 10/e32724ebcc2fc81e91169d69eff8533e15a595c13156ec57965238a0f0afa67e2ed2abbf735a57cfaae15430bbc905b016b644bf7383a82d607501d557a6dd82 + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 + checksum: 10/d72392c4ed6faf8d830ba43421461e1b767b5978edba0739457d7781aa9533c66982be7f59bb156a77a2b578eddfb4711f50e0d84f0f0d25d28b5ab11140f5cc languageName: node linkType: hard @@ -5796,17 +5767,10 @@ __metadata: languageName: node linkType: hard -"@opentelemetry/semantic-conventions@npm:1.28.0": - version: 1.28.0 - resolution: "@opentelemetry/semantic-conventions@npm:1.28.0" - checksum: 10/c182a3206769b5d5a8ab89a5c674d046fd789421cef27ea55af179990e314732433c98e5017aa23e99f15fd2b0e13cb129bb6c2282da6860ce9419adf32b2e87 - languageName: node - linkType: hard - -"@opentelemetry/semantic-conventions@npm:^1.29.0, @opentelemetry/semantic-conventions@npm:^1.32.0": - version: 1.32.0 - resolution: "@opentelemetry/semantic-conventions@npm:1.32.0" - checksum: 10/5f0e5f36f5f808a5312f98faeb0ea099c66f531c06ab638177d2635faa8e7637c025b146342b49907d9af585963f078a2b28fde1f85437daba7a9163d9294906 +"@opentelemetry/semantic-conventions@npm:1.34.0, @opentelemetry/semantic-conventions@npm:^1.29.0, @opentelemetry/semantic-conventions@npm:^1.32.0": + version: 1.34.0 + resolution: "@opentelemetry/semantic-conventions@npm:1.34.0" + checksum: 10/1892b4cc69c9e00456c809604a980e32696563e96463ff5f9d07e72d5aca73836a7378090509f28f54445ac6e072d2343a888c9d64d9ce287198e899082ff7aa languageName: node linkType: hard @@ -6068,13 +6032,13 @@ __metadata: languageName: node linkType: hard -"@prometheus-io/lezer-promql@npm:0.301.0": - version: 0.301.0 - resolution: "@prometheus-io/lezer-promql@npm:0.301.0" +"@prometheus-io/lezer-promql@npm:0.304.0": + version: 0.304.0 + resolution: "@prometheus-io/lezer-promql@npm:0.304.0" peerDependencies: "@lezer/highlight": ^1.1.2 "@lezer/lr": ^1.2.3 - checksum: 10/4ee6c9cfb318d6741b471b9abd3db7e4acab9d8ad035bf95fce450ba60b540eae8a3387a425bda78108c2526ec5cc44c34ecb1ddab33dc4b189652afb66aa736 + checksum: 10/c582072a8a5b4bc4e44a36ce577ea1d082092972d79b736014891d4aaf8e9b6308473a0ee5f23b4c446f0f601a796b213ea1e94bf1a5771a980663939f9e70fb languageName: node linkType: hard @@ -9322,7 +9286,7 @@ __metadata: languageName: node linkType: hard -"@types/hoist-non-react-statics@npm:3.3.6, @types/hoist-non-react-statics@npm:^3.3.0, @types/hoist-non-react-statics@npm:^3.3.1": +"@types/hoist-non-react-statics@npm:3.3.6, @types/hoist-non-react-statics@npm:^3.3.1": version: 3.3.6 resolution: "@types/hoist-non-react-statics@npm:3.3.6" dependencies: @@ -9757,18 +9721,6 @@ __metadata: languageName: node linkType: hard -"@types/react-redux@npm:^7.1.20": - version: 7.1.34 - resolution: "@types/react-redux@npm:7.1.34" - dependencies: - "@types/hoist-non-react-statics": "npm:^3.3.0" - "@types/react": "npm:*" - hoist-non-react-statics: "npm:^3.3.0" - redux: "npm:^4.0.0" - checksum: 10/febcd1db0c83c5002c6bee0fdda9e70da0653454ffbb72d6c37cbf2f5c005e06fb5271cff344d7164c385c944526565282de9a95ff379e040476b71d27fc2512 - languageName: node - linkType: hard - "@types/react-resizable@npm:3.0.8": version: 3.0.8 resolution: "@types/react-resizable@npm:3.0.8" @@ -10840,6 +10792,16 @@ __metadata: languageName: node linkType: hard +"accepts@npm:^2.0.0": + version: 2.0.0 + resolution: "accepts@npm:2.0.0" + dependencies: + mime-types: "npm:^3.0.0" + negotiator: "npm:^1.0.0" + checksum: 10/ea1343992b40b2bfb3a3113fa9c3c2f918ba0f9197ae565c48d3f84d44b174f6b1d5cd9989decd7655963eb03a272abc36968cc439c2907f999bd5ef8653d5a7 + languageName: node + linkType: hard + "accepts@npm:~1.3.4, accepts@npm:~1.3.5, accepts@npm:~1.3.8": version: 1.3.8 resolution: "accepts@npm:1.3.8" @@ -10905,15 +10867,6 @@ __metadata: languageName: node linkType: hard -"add-dom-event-listener@npm:^1.1.0": - version: 1.1.0 - resolution: "add-dom-event-listener@npm:1.1.0" - dependencies: - object-assign: "npm:4.x" - checksum: 10/dcab339517668e46887b4d5ddf3e299d5b3a1797e027cafe0480da6fb32591bfe04b567dd002d3b2c4d43f3c8addf208f7ae45db847b79daa1d7a7391dc3c076 - languageName: node - linkType: hard - "add-px-to-style@npm:1.0.0": version: 1.0.0 resolution: "add-px-to-style@npm:1.0.0" @@ -11021,7 +10974,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:^6.12.4, ajv@npm:^6.12.5": +"ajv@npm:^6.12.4, ajv@npm:^6.12.5, ajv@npm:^6.12.6": version: 6.12.6 resolution: "ajv@npm:6.12.6" dependencies: @@ -11315,13 +11268,6 @@ __metadata: languageName: node linkType: hard -"array-tree-filter@npm:^2.1.0": - version: 2.1.0 - resolution: "array-tree-filter@npm:2.1.0" - checksum: 10/ca65dbeb80777eadadfcd4dbd2658d9eb0be66e426a6b6d64f1a71dff5351f2e6f370e0cbcc418e9e6e01d06b337b128441a71c7143abe4d925d027d5aa0100f - languageName: node - linkType: hard - "array-union@npm:^2.1.0": version: 2.1.0 resolution: "array-union@npm:2.1.0" @@ -11950,6 +11896,23 @@ __metadata: languageName: node linkType: hard +"body-parser@npm:^2.2.0": + version: 2.2.0 + resolution: "body-parser@npm:2.2.0" + dependencies: + bytes: "npm:^3.1.2" + content-type: "npm:^1.0.5" + debug: "npm:^4.4.0" + http-errors: "npm:^2.0.0" + iconv-lite: "npm:^0.6.3" + on-finished: "npm:^2.4.1" + qs: "npm:^6.14.0" + raw-body: "npm:^3.0.0" + type-is: "npm:^2.0.0" + checksum: 10/e9d844b036bd15970df00a16f373c7ed28e1ef870974a0a1d4d6ef60d70e01087cc20a0dbb2081c49a88e3c08ce1d87caf1e2898c615dffa193f63e8faa8a84e + languageName: node + linkType: hard + "body@npm:^5.1.0": version: 5.1.0 resolution: "body@npm:5.1.0" @@ -12164,7 +12127,7 @@ __metadata: languageName: node linkType: hard -"bytes@npm:3.1.2": +"bytes@npm:3.1.2, bytes@npm:^3.1.2": version: 3.1.2 resolution: "bytes@npm:3.1.2" checksum: 10/a10abf2ba70c784471d6b4f58778c0beeb2b5d405148e66affa91f23a9f13d07603d0a0354667310ae1d6dc141474ffd44e2a074be0f6e2254edb8fc21445388 @@ -13201,7 +13164,16 @@ __metadata: languageName: node linkType: hard -"content-type@npm:~1.0.4, content-type@npm:~1.0.5": +"content-disposition@npm:^1.0.0": + version: 1.0.0 + resolution: "content-disposition@npm:1.0.0" + dependencies: + safe-buffer: "npm:5.2.1" + checksum: 10/0dcc1a2d7874526b0072df3011b134857b49d97a3bc135bb464a299525d4972de6f5f464fd64da6c4d8406d26a1ffb976f62afaffef7723b1021a44498d10e08 + languageName: node + linkType: hard + +"content-type@npm:^1.0.5, content-type@npm:~1.0.4, content-type@npm:~1.0.5": version: 1.0.5 resolution: "content-type@npm:1.0.5" checksum: 10/585847d98dc7fb8035c02ae2cb76c7a9bd7b25f84c447e5ed55c45c2175e83617c8813871b4ee22f368126af6b2b167df655829007b21aa10302873ea9c62662 @@ -13331,6 +13303,13 @@ __metadata: languageName: node linkType: hard +"cookie-signature@npm:^1.2.1": + version: 1.2.2 + resolution: "cookie-signature@npm:1.2.2" + checksum: 10/be44a3c9a56f3771aea3a8bd8ad8f0a8e2679bcb967478267f41a510b4eb5ec55085386ba79c706c4ac21605ca76f4251973444b90283e0eb3eeafe8a92c7708 + languageName: node + linkType: hard + "cookie@npm:0.7.1": version: 0.7.1 resolution: "cookie@npm:0.7.1" @@ -13338,7 +13317,7 @@ __metadata: languageName: node linkType: hard -"cookie@npm:^0.7.2, cookie@npm:~0.7.2": +"cookie@npm:^0.7.1, cookie@npm:^0.7.2, cookie@npm:~0.7.2": version: 0.7.2 resolution: "cookie@npm:0.7.2" checksum: 10/24b286c556420d4ba4e9bc09120c9d3db7d28ace2bd0f8ccee82422ce42322f73c8312441271e5eefafbead725980e5996cc02766dbb89a90ac7f5636ede608f @@ -13414,7 +13393,7 @@ __metadata: languageName: node linkType: hard -"cors@npm:2.8.5, cors@npm:~2.8.5": +"cors@npm:2.8.5, cors@npm:^2.8.5, cors@npm:~2.8.5": version: 2.8.5 resolution: "cors@npm:2.8.5" dependencies: @@ -13561,7 +13540,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.6": +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.5, cross-spawn@npm:^7.0.6": version: 7.0.6 resolution: "cross-spawn@npm:7.0.6" dependencies: @@ -14688,7 +14667,7 @@ __metadata: languageName: node linkType: hard -"depd@npm:2.0.0": +"depd@npm:2.0.0, depd@npm:^2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" checksum: 10/c0c8ff36079ce5ada64f46cc9d6fd47ebcf38241105b6e0c98f412e8ad91f084bcf906ff644cc3a4bd876ca27a62accb8b0fff72ea6ed1a414b89d8506f4a5ca @@ -14861,13 +14840,6 @@ __metadata: languageName: node linkType: hard -"dom-align@npm:^1.7.0": - version: 1.12.2 - resolution: "dom-align@npm:1.12.2" - checksum: 10/4659909b9ab48de2976f0668220289e3835490537b1ce834b7f2dd3189b21e0996011ec8826a2789c9597729bbb457f6e54f07787a00774e3ce04b15fcbfa636 - languageName: node - linkType: hard - "dom-converter@npm:^0.2.0": version: 0.2.0 resolution: "dom-converter@npm:0.2.0" @@ -15161,6 +15133,13 @@ __metadata: languageName: node linkType: hard +"encodeurl@npm:^2.0.0, encodeurl@npm:~2.0.0": + version: 2.0.0 + resolution: "encodeurl@npm:2.0.0" + checksum: 10/abf5cd51b78082cf8af7be6785813c33b6df2068ce5191a40ca8b1afe6a86f9230af9a9ce694a5ce4665955e5c1120871826df9c128a642e09c58d592e2807fe + languageName: node + linkType: hard + "encodeurl@npm:~1.0.2": version: 1.0.2 resolution: "encodeurl@npm:1.0.2" @@ -15168,13 +15147,6 @@ __metadata: languageName: node linkType: hard -"encodeurl@npm:~2.0.0": - version: 2.0.0 - resolution: "encodeurl@npm:2.0.0" - checksum: 10/abf5cd51b78082cf8af7be6785813c33b6df2068ce5191a40ca8b1afe6a86f9230af9a9ce694a5ce4665955e5c1120871826df9c128a642e09c58d592e2807fe - languageName: node - linkType: hard - "encoding-japanese@npm:2.0.0": version: 2.0.0 resolution: "encoding-japanese@npm:2.0.0" @@ -15671,7 +15643,7 @@ __metadata: languageName: node linkType: hard -"escape-html@npm:~1.0.3": +"escape-html@npm:^1.0.3, escape-html@npm:~1.0.3": version: 1.0.3 resolution: "escape-html@npm:1.0.3" checksum: 10/6213ca9ae00d0ab8bccb6d8d4e0a98e76237b2410302cf7df70aaa6591d509a2a37ce8998008cbecae8fc8ffaadf3fb0229535e6a145f3ce0b211d060decbb24 @@ -16153,7 +16125,7 @@ __metadata: languageName: node linkType: hard -"etag@npm:~1.8.1": +"etag@npm:^1.8.1, etag@npm:~1.8.1": version: 1.8.1 resolution: "etag@npm:1.8.1" checksum: 10/571aeb3dbe0f2bbd4e4fadbdb44f325fc75335cd5f6f6b6a091e6a06a9f25ed5392f0863c5442acb0646787446e816f13cbfc6edce5b07658541dff573cab1ff @@ -16188,6 +16160,22 @@ __metadata: languageName: node linkType: hard +"eventsource-parser@npm:^3.0.1": + version: 3.0.2 + resolution: "eventsource-parser@npm:3.0.2" + checksum: 10/a42b0c494eb8026a88e9a3d313f5cc3efc4b81bdf59e64a13f69972ed71b7a4317f3c5d36410128e2c23193364ae8d851afda12738bb71fa40946c82c5bb3027 + languageName: node + linkType: hard + +"eventsource@npm:^3.0.2": + version: 3.0.7 + resolution: "eventsource@npm:3.0.7" + dependencies: + eventsource-parser: "npm:^3.0.1" + checksum: 10/e034915bc97068d1d38617951afd798e6776d6a3a78e36a7569c235b177c7afc2625c9fe82656f7341ab72c7eeecb3fd507b7f88e9328f2448872ff9c4742bb6 + languageName: node + linkType: hard + "execa@npm:4.1.0": version: 4.1.0 resolution: "execa@npm:4.1.0" @@ -16300,6 +16288,15 @@ __metadata: languageName: node linkType: hard +"express-rate-limit@npm:^7.5.0": + version: 7.5.0 + resolution: "express-rate-limit@npm:7.5.0" + peerDependencies: + express: ^4.11 || 5 || ^5.0.0-beta.1 + checksum: 10/eff34c83bf586789933a332a339b66649e2cca95c8e977d193aa8bead577d3182ac9f0e9c26f39389287539b8038890ff023f910b54ebb506a26a2ce135b92ca + languageName: node + linkType: hard + "express@npm:^4.21.2": version: 4.21.2 resolution: "express@npm:4.21.2" @@ -16339,6 +16336,41 @@ __metadata: languageName: node linkType: hard +"express@npm:^5.0.1": + version: 5.1.0 + resolution: "express@npm:5.1.0" + dependencies: + accepts: "npm:^2.0.0" + body-parser: "npm:^2.2.0" + content-disposition: "npm:^1.0.0" + content-type: "npm:^1.0.5" + cookie: "npm:^0.7.1" + cookie-signature: "npm:^1.2.1" + debug: "npm:^4.4.0" + encodeurl: "npm:^2.0.0" + escape-html: "npm:^1.0.3" + etag: "npm:^1.8.1" + finalhandler: "npm:^2.1.0" + fresh: "npm:^2.0.0" + http-errors: "npm:^2.0.0" + merge-descriptors: "npm:^2.0.0" + mime-types: "npm:^3.0.0" + on-finished: "npm:^2.4.1" + once: "npm:^1.4.0" + parseurl: "npm:^1.3.3" + proxy-addr: "npm:^2.0.7" + qs: "npm:^6.14.0" + range-parser: "npm:^1.2.1" + router: "npm:^2.2.0" + send: "npm:^1.1.0" + serve-static: "npm:^2.2.0" + statuses: "npm:^2.0.1" + type-is: "npm:^2.0.1" + vary: "npm:^1.1.2" + checksum: 10/6dba00bbdf308f43a84ed3f07a7e9870d5208f2a0b8f60f39459dda089750379747819863fad250849d3c9163833f33f94ce69d73938df31e0c5a430800d7e56 + languageName: node + linkType: hard + "extend@npm:^3.0.2, extend@npm:~3.0.2": version: 3.0.2 resolution: "extend@npm:3.0.2" @@ -16662,6 +16694,20 @@ __metadata: languageName: node linkType: hard +"finalhandler@npm:^2.1.0": + version: 2.1.0 + resolution: "finalhandler@npm:2.1.0" + dependencies: + debug: "npm:^4.4.0" + encodeurl: "npm:^2.0.0" + escape-html: "npm:^1.0.3" + on-finished: "npm:^2.4.1" + parseurl: "npm:^1.3.3" + statuses: "npm:^2.0.1" + checksum: 10/b2bd68c310e2c463df0ab747ab05f8defbc540b8c3f2442f86e7d084ac8acbc31f8cae079931b7f5a406521501941e3395e963de848a0aaf45dd414adeb5ff4e + languageName: node + linkType: hard + "find-cache-dir@npm:^3.3.1": version: 3.3.2 resolution: "find-cache-dir@npm:3.3.2" @@ -16963,6 +17009,13 @@ __metadata: languageName: node linkType: hard +"fresh@npm:^2.0.0": + version: 2.0.0 + resolution: "fresh@npm:2.0.0" + checksum: 10/44e1468488363074641991c1340d2a10c5a6f6d7c353d89fd161c49d120c58ebf9890720f7584f509058385836e3ce50ddb60e9f017315a4ba8c6c3461813bfc + languageName: node + linkType: hard + "front-matter@npm:^4.0.2": version: 4.0.2 resolution: "front-matter@npm:4.0.2" @@ -17693,18 +17746,18 @@ __metadata: "@babel/runtime": "npm:7.27.0" "@betterer/betterer": "npm:5.4.0" "@betterer/cli": "npm:5.4.0" - "@bsull/augurs": "npm:^0.9.0" + "@bsull/augurs": "npm:^0.10.0" "@crowdin/crowdin-api-client": "npm:^1.42.0" "@cypress/webpack-preprocessor": "npm:6.0.4" "@emotion/css": "npm:11.13.5" "@emotion/eslint-plugin": "npm:11.12.0" "@emotion/react": "npm:11.14.0" "@fingerprintjs/fingerprintjs": "npm:^3.4.2" - "@floating-ui/react": "npm:0.27.8" + "@floating-ui/react": "npm:0.27.9" "@formatjs/intl-durationformat": "npm:^0.7.0" "@glideapps/glide-data-grid": "npm:^6.0.0" "@grafana/alerting": "workspace:*" - "@grafana/aws-sdk": "npm:0.6.0" + "@grafana/aws-sdk": "npm:0.7.1" "@grafana/azure-sdk": "npm:0.0.7" "@grafana/data": "workspace:*" "@grafana/e2e-selectors": "workspace:*" @@ -17717,7 +17770,7 @@ __metadata: "@grafana/google-sdk": "npm:0.1.2" "@grafana/i18n": "workspace:*" "@grafana/lezer-logql": "npm:0.2.7" - "@grafana/llm": "npm:0.13.2" + "@grafana/llm": "npm:0.19.2" "@grafana/monaco-logql": "npm:^0.0.8" "@grafana/o11y-ds-frontend": "workspace:*" "@grafana/plugin-e2e": "npm:2.0.0" @@ -17746,7 +17799,7 @@ __metadata: "@npmcli/package-json": "npm:^5.2.0" "@opentelemetry/api": "npm:1.9.0" "@opentelemetry/exporter-collector": "npm:0.25.0" - "@opentelemetry/semantic-conventions": "npm:1.28.0" + "@opentelemetry/semantic-conventions": "npm:1.34.0" "@playwright/test": "npm:1.52.0" "@pmmmwh/react-refresh-webpack-plugin": "npm:0.5.15" "@popperjs/core": "npm:2.11.8" @@ -18549,7 +18602,7 @@ __metadata: languageName: node linkType: hard -"http-errors@npm:2.0.0": +"http-errors@npm:2.0.0, http-errors@npm:^2.0.0": version: 2.0.0 resolution: "http-errors@npm:2.0.0" dependencies: @@ -19634,6 +19687,13 @@ __metadata: languageName: node linkType: hard +"is-promise@npm:^4.0.0": + version: 4.0.0 + resolution: "is-promise@npm:4.0.0" + checksum: 10/0b46517ad47b00b6358fd6553c83ec1f6ba9acd7ffb3d30a0bf519c5c69e7147c132430452351b8a9fc198f8dd6c4f76f8e6f5a7f100f8c77d57d9e0f4261a8a + languageName: node + linkType: hard + "is-regex@npm:^1.2.1": version: 1.2.1 resolution: "is-regex@npm:1.2.1" @@ -22008,6 +22068,13 @@ __metadata: languageName: node linkType: hard +"media-typer@npm:^1.1.0": + version: 1.1.0 + resolution: "media-typer@npm:1.1.0" + checksum: 10/a58dd60804df73c672942a7253ccc06815612326dc1c0827984b1a21704466d7cde351394f47649e56cf7415e6ee2e26e000e81b51b3eebb5a93540e8bf93cbd + languageName: node + linkType: hard + "memfs@npm:^3.4.1, memfs@npm:^3.4.12": version: 3.5.3 resolution: "memfs@npm:3.5.3" @@ -22089,6 +22156,13 @@ __metadata: languageName: node linkType: hard +"merge-descriptors@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-descriptors@npm:2.0.0" + checksum: 10/e383332e700a94682d0125a36c8be761142a1320fc9feeb18e6e36647c9edf064271645f5669b2c21cf352116e561914fd8aa831b651f34db15ef4038c86696a + languageName: node + linkType: hard + "merge-stream@npm:^2.0.0": version: 2.0.0 resolution: "merge-stream@npm:2.0.0" @@ -22127,13 +22201,20 @@ __metadata: languageName: node linkType: hard -"mime-db@npm:1.52.0, mime-db@npm:>= 1.43.0 < 2": +"mime-db@npm:1.52.0": version: 1.52.0 resolution: "mime-db@npm:1.52.0" checksum: 10/54bb60bf39e6f8689f6622784e668a3d7f8bed6b0d886f5c3c446cb3284be28b30bf707ed05d0fe44a036f8469976b2629bbea182684977b084de9da274694d7 languageName: node linkType: hard +"mime-db@npm:>= 1.43.0 < 2, mime-db@npm:^1.54.0": + version: 1.54.0 + resolution: "mime-db@npm:1.54.0" + checksum: 10/9e7834be3d66ae7f10eaa69215732c6d389692b194f876198dca79b2b90cbf96688d9d5d05ef7987b20f749b769b11c01766564264ea5f919c88b32a29011311 + languageName: node + linkType: hard + "mime-types@npm:^2.1.12, mime-types@npm:^2.1.27, mime-types@npm:^2.1.31, mime-types@npm:~2.1.17, mime-types@npm:~2.1.19, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" @@ -22143,6 +22224,15 @@ __metadata: languageName: node linkType: hard +"mime-types@npm:^3.0.0, mime-types@npm:^3.0.1": + version: 3.0.1 + resolution: "mime-types@npm:3.0.1" + dependencies: + mime-db: "npm:^1.54.0" + checksum: 10/fa1d3a928363723a8046c346d87bf85d35014dae4285ad70a3ff92bd35957992b3094f8417973cfe677330916c6ef30885109624f1fb3b1e61a78af509dba120 + languageName: node + linkType: hard + "mime@npm:1.6.0, mime@npm:^1.6.0": version: 1.6.0 resolution: "mime@npm:1.6.0" @@ -22489,13 +22579,13 @@ __metadata: languageName: node linkType: hard -"ml-matrix@npm:^6.11.0": - version: 6.11.0 - resolution: "ml-matrix@npm:6.11.0" +"ml-matrix@npm:^6.12.0": + version: 6.12.1 + resolution: "ml-matrix@npm:6.12.1" dependencies: is-any-array: "npm:^2.0.1" ml-array-rescale: "npm:^1.3.7" - checksum: 10/0fe34b43ae23a012ee616435766fafad2c35c69f1f5195b798975b89b279c940a87171d05906af2226c40d908310289dda7d6135a0d12a1a3d719a5d6e482e67 + checksum: 10/b59a6f0fc2657b2ff2718327f1cf49db7f87a0370528e0f92cecb79c716d9887d0e5996d1228d66e3881927c7aa26ee8e3bd1035dc0c9efe0b3b98506f02618d languageName: node linkType: hard @@ -22510,13 +22600,12 @@ __metadata: linkType: hard "ml-regression-polynomial@npm:^3.0.0": - version: 3.0.1 - resolution: "ml-regression-polynomial@npm:3.0.1" + version: 3.0.2 + resolution: "ml-regression-polynomial@npm:3.0.2" dependencies: - cheminfo-types: "npm:^1.7.3" - ml-matrix: "npm:^6.11.0" + ml-matrix: "npm:^6.12.0" ml-regression-base: "npm:^4.0.0" - checksum: 10/ae0dd3a05458af2a75ea24bcd9e0c1201650eca8a2bee699d9a432a6ba89074b0961496b7b6ccc32c57e8913524620fda6383dfe4f0c9735844cf2d98bd21d90 + checksum: 10/a36eedb96882465f10cc0c56ad57284195c35ee3404a29d4761781499c53ebbdc5efcc4769b17f27dbe5629b049ae581fa64bff473119bc9e8a787e384fb66b2 languageName: node linkType: hard @@ -22712,7 +22801,7 @@ __metadata: languageName: node linkType: hard -"nano-css@npm:^5.3.1, nano-css@npm:^5.6.1, nano-css@npm:^5.6.2": +"nano-css@npm:^5.6.1, nano-css@npm:^5.6.2": version: 5.6.2 resolution: "nano-css@npm:5.6.2" dependencies: @@ -22763,6 +22852,13 @@ __metadata: languageName: node linkType: hard +"negotiator@npm:^1.0.0": + version: 1.0.0 + resolution: "negotiator@npm:1.0.0" + checksum: 10/b5734e87295324fabf868e36fb97c84b7d7f3156ec5f4ee5bf6e488079c11054f818290fc33804cef7b1ee21f55eeb14caea83e7dafae6492a409b3e573153e5 + languageName: node + linkType: hard + "neo-async@npm:^2.6.2": version: 2.6.2 resolution: "neo-async@npm:2.6.2" @@ -23361,13 +23457,6 @@ __metadata: languageName: node linkType: hard -"object-assign@npm:4.x, object-assign@npm:^4, object-assign@npm:^4.1.0, object-assign@npm:^4.1.1": - version: 4.1.1 - resolution: "object-assign@npm:4.1.1" - checksum: 10/fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f - languageName: node - linkType: hard - "object-assign@npm:^3.0.0": version: 3.0.0 resolution: "object-assign@npm:3.0.0" @@ -23375,6 +23464,13 @@ __metadata: languageName: node linkType: hard +"object-assign@npm:^4, object-assign@npm:^4.1.0, object-assign@npm:^4.1.1": + version: 4.1.1 + resolution: "object-assign@npm:4.1.1" + checksum: 10/fcc6e4ea8c7fe48abfbb552578b1c53e0d194086e2e6bbbf59e0a536381a292f39943c6e9628af05b5528aa5e3318bb30d6b2e53cadaf5b8fe9e12c4b69af23f + languageName: node + linkType: hard + "object-inspect@npm:^1.13.3": version: 1.13.3 resolution: "object-inspect@npm:1.13.3" @@ -24183,7 +24279,7 @@ __metadata: languageName: node linkType: hard -"parseurl@npm:~1.3.2, parseurl@npm:~1.3.3": +"parseurl@npm:^1.3.3, parseurl@npm:~1.3.2, parseurl@npm:~1.3.3": version: 1.3.3 resolution: "parseurl@npm:1.3.3" checksum: 10/407cee8e0a3a4c5cd472559bca8b6a45b82c124e9a4703302326e9ab60fc1081442ada4e02628efef1eb16197ddc7f8822f5a91fd7d7c86b51f530aedb17dfa2 @@ -24325,6 +24421,13 @@ __metadata: languageName: node linkType: hard +"path-to-regexp@npm:^8.0.0": + version: 8.2.0 + resolution: "path-to-regexp@npm:8.2.0" + checksum: 10/23378276a172b8ba5f5fb824475d1818ca5ccee7bbdb4674701616470f23a14e536c1db11da9c9e6d82b82c556a817bbf4eee6e41b9ed20090ef9427cbb38e13 + languageName: node + linkType: hard + "path-type@npm:^3.0.0": version: 3.0.0 resolution: "path-type@npm:3.0.0" @@ -24479,6 +24582,13 @@ __metadata: languageName: node linkType: hard +"pkce-challenge@npm:^5.0.0": + version: 5.0.0 + resolution: "pkce-challenge@npm:5.0.0" + checksum: 10/e60c06a0e0481cb82f80072053d5c479a7490758541c4226460450285dd5d72a995c44b3c553731ca7c2f64cc34b35f1d2e5f9de08d276b59899298f9efe1ddf + languageName: node + linkType: hard + "pkg-dir@npm:^4.1.0, pkg-dir@npm:^4.2.0": version: 4.2.0 resolution: "pkg-dir@npm:4.2.0" @@ -25118,7 +25228,7 @@ __metadata: languageName: node linkType: hard -"prismjs@npm:1.30.0, prismjs@npm:^1.27.0, prismjs@npm:^1.29.0, prismjs@npm:^1.30.0": +"prismjs@npm:1.30.0, prismjs@npm:^1.27.0, prismjs@npm:^1.30.0": version: 1.30.0 resolution: "prismjs@npm:1.30.0" checksum: 10/6b48a2439a82e5c6882f48ebc1564c3890e16463ba17ac10c3ad4f62d98dea5b5c915b172b63b83023a70ad4f5d7be3e8a60304420db34a161fae69dd4e3e2da @@ -25198,7 +25308,7 @@ __metadata: languageName: node linkType: hard -"prompts@npm:^2.0.1, prompts@npm:^2.4.2": +"prompts@npm:^2.0.1": version: 2.4.2 resolution: "prompts@npm:2.4.2" dependencies: @@ -25280,7 +25390,7 @@ __metadata: languageName: node linkType: hard -"proxy-addr@npm:~2.0.7": +"proxy-addr@npm:^2.0.7, proxy-addr@npm:~2.0.7": version: 2.0.7 resolution: "proxy-addr@npm:2.0.7" dependencies: @@ -25358,7 +25468,7 @@ __metadata: languageName: node linkType: hard -"qs@npm:6.14.0, qs@npm:^6.11.2, qs@npm:^6.4.0": +"qs@npm:6.14.0, qs@npm:^6.11.2, qs@npm:^6.14.0, qs@npm:^6.4.0": version: 6.14.0 resolution: "qs@npm:6.14.0" dependencies: @@ -25436,7 +25546,7 @@ __metadata: languageName: node linkType: hard -"raf@npm:^3.1.0, raf@npm:^3.4.1": +"raf@npm:^3.1.0": version: 3.4.1 resolution: "raf@npm:3.4.1" dependencies: @@ -25499,6 +25609,18 @@ __metadata: languageName: node linkType: hard +"raw-body@npm:^3.0.0": + version: 3.0.0 + resolution: "raw-body@npm:3.0.0" + dependencies: + bytes: "npm:3.1.2" + http-errors: "npm:2.0.0" + iconv-lite: "npm:0.6.3" + unpipe: "npm:1.0.0" + checksum: 10/2443429bbb2f9ae5c50d3d2a6c342533dfbde6b3173740b70fa0302b30914ff400c6d31a46b3ceacbe7d0925dc07d4413928278b494b04a65736fc17ca33e30c + languageName: node + linkType: hard + "raw-body@npm:~1.1.0": version: 1.1.7 resolution: "raw-body@npm:1.1.7" @@ -25518,37 +25640,6 @@ __metadata: languageName: node linkType: hard -"rc-align@npm:^4.0.0": - version: 4.0.15 - resolution: "rc-align@npm:4.0.15" - dependencies: - "@babel/runtime": "npm:^7.10.1" - classnames: "npm:2.x" - dom-align: "npm:^1.7.0" - rc-util: "npm:^5.26.0" - resize-observer-polyfill: "npm:^1.5.1" - peerDependencies: - react: ">=16.9.0" - react-dom: ">=16.9.0" - checksum: 10/de1af4a58a371bc01cf5f327ce82b5e5631960c3e2dbae03532081e63bf86a809cebf9b8a231495db1dc659c28b6dbb35b0b33f2c29579b8b068388c1288c1b1 - languageName: node - linkType: hard - -"rc-cascader@npm:1.0.1": - version: 1.0.1 - resolution: "rc-cascader@npm:1.0.1" - dependencies: - array-tree-filter: "npm:^2.1.0" - rc-trigger: "npm:^4.0.0" - rc-util: "npm:^4.0.4" - warning: "npm:^4.0.1" - peerDependencies: - react: ^15.0.0 || ^16.0.0 - react-dom: ^15.0.0 || ^16.0.0 - checksum: 10/e4c7b156527d048f28bcfb116c06df9522476ecfbee23ec9cec2e46a34a7f3f55abb8639f0c3589cc9a17e028404c8fda902f51c1a7b6b9af33706f96c6c3e96 - languageName: node - linkType: hard - "rc-cascader@npm:3.33.0": version: 3.33.0 resolution: "rc-cascader@npm:3.33.0" @@ -25581,21 +25672,6 @@ __metadata: languageName: node linkType: hard -"rc-motion@npm:^1.0.0": - version: 1.1.2 - resolution: "rc-motion@npm:1.1.2" - dependencies: - "@babel/runtime": "npm:^7.11.1" - classnames: "npm:^2.2.1" - raf: "npm:^3.4.1" - rc-util: "npm:^5.0.6" - peerDependencies: - react: ^16.0.0 - react-dom: ^16.0.0 - checksum: 10/61ab6b1f22de26247c7dbe28f13ddfa2fc53e00d389552ce7319ad1b4f8fca68b089c8766c61a6a899b0a76f47361353b1cde105c175653d5e06287fb5412d20 - languageName: node - linkType: hard - "rc-motion@npm:^2.0.0, rc-motion@npm:^2.0.1, rc-motion@npm:^2.6.1": version: 2.6.2 resolution: "rc-motion@npm:2.6.2" @@ -25733,34 +25809,7 @@ __metadata: languageName: node linkType: hard -"rc-trigger@npm:^4.0.0": - version: 4.4.3 - resolution: "rc-trigger@npm:4.4.3" - dependencies: - "@babel/runtime": "npm:^7.11.2" - classnames: "npm:^2.2.6" - raf: "npm:^3.4.1" - rc-align: "npm:^4.0.0" - rc-motion: "npm:^1.0.0" - rc-util: "npm:^5.0.1" - checksum: 10/4af3ee112dd6daf71b4190b16276bbdbae9e608ae441ae2aeadd0eea9d5aac755a6344c69b6273e26d84d5646b82efe82ad55c8dd91934915ba84b82156229e8 - languageName: node - linkType: hard - -"rc-util@npm:^4.0.4": - version: 4.21.1 - resolution: "rc-util@npm:4.21.1" - dependencies: - add-dom-event-listener: "npm:^1.1.0" - prop-types: "npm:^15.5.10" - react-is: "npm:^16.12.0" - react-lifecycles-compat: "npm:^3.0.4" - shallowequal: "npm:^1.1.0" - checksum: 10/aa68990486c6e45d4a37446ef6ec0ad4d6829ec01975a009494ba36b2d3c2d4eda8a64c75ee8d6984cdc30450b83e975dcefb6781bff9297f4b5c0fa56567629 - languageName: node - linkType: hard - -"rc-util@npm:^5.0.1, rc-util@npm:^5.0.6, rc-util@npm:^5.15.0, rc-util@npm:^5.16.1, rc-util@npm:^5.21.0, rc-util@npm:^5.24.4, rc-util@npm:^5.26.0, rc-util@npm:^5.36.0, rc-util@npm:^5.37.0, rc-util@npm:^5.38.0, rc-util@npm:^5.38.1, rc-util@npm:^5.43.0, rc-util@npm:^5.44.1, rc-util@npm:^5.44.3": +"rc-util@npm:^5.15.0, rc-util@npm:^5.16.1, rc-util@npm:^5.21.0, rc-util@npm:^5.24.4, rc-util@npm:^5.36.0, rc-util@npm:^5.37.0, rc-util@npm:^5.38.0, rc-util@npm:^5.38.1, rc-util@npm:^5.43.0, rc-util@npm:^5.44.1, rc-util@npm:^5.44.3": version: 5.44.3 resolution: "rc-util@npm:5.44.3" dependencies: @@ -25798,46 +25847,6 @@ __metadata: languageName: node linkType: hard -"react-awesome-query-builder@npm:^5.3.1": - version: 5.4.0 - resolution: "react-awesome-query-builder@npm:5.4.0" - dependencies: - "@date-io/moment": "npm:^1.3.13" - classnames: "npm:^2.3.1" - clone: "npm:^2.1.2" - immutable: "npm:^3.8.2" - lodash: "npm:^4.17.21" - moment: "npm:^2.29.4" - prop-types: "npm:^15.7.2" - react-redux: "npm:^7.2.2" - redux: "npm:^4.2.0" - spel2js: "npm:^0.2.8" - sqlstring: "npm:^2.3.3" - peerDependencies: - "@ant-design/icons": ^4.0.0 - "@emotion/react": ^11.7.1 - "@emotion/styled": ^11.6.0 - "@fortawesome/fontawesome-svg-core": ^1.2.0 || ^6.1.0 - "@fortawesome/free-solid-svg-icons": ^5.15.4 || ^6.0.0 - "@fortawesome/react-fontawesome": ^0.1.16 || ^0.2.0 - "@material-ui/core": ^4.12.3 - "@material-ui/icons": ^4.0.0 - "@material-ui/lab": ^4.0.0-alpha.57 - "@material-ui/pickers": ^3.2.10 - "@mui/icons-material": ^5.2.4 - "@mui/lab": ^5.0.0-alpha.60 - "@mui/material": ^5.2.4 - "@mui/x-date-pickers": ^5.0.0-beta.2 - antd: ^4.0.0 - bootstrap: ^5.1.3 - material-ui-confirm: ^2.0.1 || ^3.0.0 - react: ^16.8.4 || ^17.0.1 || ^18.0.0 - react-dom: ^16.8.4 || ^17.0.1 || ^18.0.0 - reactstrap: ^9.0.0 - checksum: 10/2a71349e3b091adc62ae68dbbcac0d0d8ad71a9fe42ef634009313df8303188c8c19d7dce7b21a30826c6f0647fbe493eb57fcb1ad1b3db7c78f0e69328af8c8 - languageName: node - linkType: hard - "react-calendar@npm:^4.8.0": version: 4.8.0 resolution: "react-calendar@npm:4.8.0" @@ -25923,15 +25932,15 @@ __metadata: languageName: node linkType: hard -"react-data-grid@npm:7.0.0-beta.46": - version: 7.0.0-beta.46 - resolution: "react-data-grid@npm:7.0.0-beta.46" +"react-data-grid@grafana/react-data-grid#3420f7f2a9e0d707d3313ec5b143a6be53f720b5": + version: 7.0.0-beta.55 + resolution: "react-data-grid@https://github.com/grafana/react-data-grid.git#commit=3420f7f2a9e0d707d3313ec5b143a6be53f720b5" dependencies: clsx: "npm:^2.0.0" peerDependencies: react: ^18.0 || ^19.0 react-dom: ^18.0 || ^19.0 - checksum: 10/d8a679b5e22a07293923894591adcac5ad57b8bd28dcc93f7438563384f6acc2287f14394a3ef360bc1dc901defa00b4030aa9af37c70cf53cf121437e0882bc + checksum: 10/9fe309924a7b22d0a62f0df69bdc7b9e0df62c5624e96125f2d729500dfe103037cfbe654fa63294d89fc9b5fea618a540160e2e12e7de4c7052049827df3687 languageName: node linkType: hard @@ -26195,14 +26204,14 @@ __metadata: languageName: node linkType: hard -"react-is@npm:^16.12.0, react-is@npm:^16.13.1, react-is@npm:^16.6.0, react-is@npm:^16.7.0": +"react-is@npm:^16.13.1, react-is@npm:^16.6.0, react-is@npm:^16.7.0": version: 16.13.1 resolution: "react-is@npm:16.13.1" checksum: 10/5aa564a1cde7d391ac980bedee21202fc90bdea3b399952117f54fb71a932af1e5902020144fb354b4690b2414a0c7aafe798eb617b76a3d441d956db7726fdf languageName: node linkType: hard -"react-is@npm:^17.0.1, react-is@npm:^17.0.2": +"react-is@npm:^17.0.1": version: 17.0.2 resolution: "react-is@npm:17.0.2" checksum: 10/73b36281e58eeb27c9cc6031301b6ae19ecdc9f18ae2d518bdb39b0ac564e65c5779405d623f1df9abf378a13858b79442480244bd579968afc1faf9a2ce5e05 @@ -26305,27 +26314,6 @@ __metadata: languageName: node linkType: hard -"react-redux@npm:^7.2.2": - version: 7.2.9 - resolution: "react-redux@npm:7.2.9" - dependencies: - "@babel/runtime": "npm:^7.15.4" - "@types/react-redux": "npm:^7.1.20" - hoist-non-react-statics: "npm:^3.3.2" - loose-envify: "npm:^1.4.0" - prop-types: "npm:^15.7.2" - react-is: "npm:^17.0.2" - peerDependencies: - react: ^16.8.3 || ^17 || ^18 - peerDependenciesMeta: - react-dom: - optional: true - react-native: - optional: true - checksum: 10/1c3018bd2601e6d18339281867910b583dcbb3d8856403086e08c00abf0dfe467a94c0d1356bafa8cdf107bf1e2c9899a28486e4778e85c8bc4dfed2076b116f - languageName: node - linkType: hard - "react-redux@npm:^8.1.3": version: 8.1.3 resolution: "react-redux@npm:8.1.3" @@ -26600,31 +26588,6 @@ __metadata: languageName: node linkType: hard -"react-use@npm:17.3.1": - version: 17.3.1 - resolution: "react-use@npm:17.3.1" - dependencies: - "@types/js-cookie": "npm:^2.2.6" - "@xobotyi/scrollbar-width": "npm:^1.9.5" - copy-to-clipboard: "npm:^3.3.1" - fast-deep-equal: "npm:^3.1.3" - fast-shallow-equal: "npm:^1.0.0" - js-cookie: "npm:^2.2.1" - nano-css: "npm:^5.3.1" - react-universal-interface: "npm:^0.6.2" - resize-observer-polyfill: "npm:^1.5.1" - screenfull: "npm:^5.1.0" - set-harmonic-interval: "npm:^1.0.1" - throttle-debounce: "npm:^3.0.1" - ts-easing: "npm:^0.2.0" - tslib: "npm:^2.1.0" - peerDependencies: - react: ^16.8.0 || ^17.0.0 - react-dom: ^16.8.0 || ^17.0.0 - checksum: 10/9e4fd337ec7c62ddb99b1f75aef488b8f9b8b923586a1fe5176f581ccbe7fb876bf64cf93b6a81925b92a779440b8d0994ed4edf883671a614652915e98a9fe4 - languageName: node - linkType: hard - "react-use@npm:17.5.0": version: 17.5.0 resolution: "react-use@npm:17.5.0" @@ -27611,6 +27574,19 @@ __metadata: languageName: node linkType: hard +"router@npm:^2.2.0": + version: 2.2.0 + resolution: "router@npm:2.2.0" + dependencies: + debug: "npm:^4.4.0" + depd: "npm:^2.0.0" + is-promise: "npm:^4.0.0" + parseurl: "npm:^1.3.3" + path-to-regexp: "npm:^8.0.0" + checksum: 10/8949bd1d3da5403cc024e2989fee58d7fda0f3ffe9f2dc5b8a192f295f400b3cde307b0b554f7d44851077640f36962ca469a766b3d57410d7d96245a7ba6c91 + languageName: node + linkType: hard + "rslog@npm:^1.2.3": version: 1.2.3 resolution: "rslog@npm:1.2.3" @@ -27976,6 +27952,25 @@ __metadata: languageName: node linkType: hard +"send@npm:^1.1.0, send@npm:^1.2.0": + version: 1.2.0 + resolution: "send@npm:1.2.0" + dependencies: + debug: "npm:^4.3.5" + encodeurl: "npm:^2.0.0" + escape-html: "npm:^1.0.3" + etag: "npm:^1.8.1" + fresh: "npm:^2.0.0" + http-errors: "npm:^2.0.0" + mime-types: "npm:^3.0.1" + ms: "npm:^2.1.3" + on-finished: "npm:^2.4.1" + range-parser: "npm:^1.2.1" + statuses: "npm:^2.0.1" + checksum: 10/9fa3b1a3b9a06b7b4ab00c25e8228326d9665a9745753a34d1ffab8ac63c7c206727331d1dc5be73647f1b658d259a1aa8e275b0e0eee51349370af02e9da506 + languageName: node + linkType: hard + "sentence-case@npm:^3.0.4": version: 3.0.4 resolution: "sentence-case@npm:3.0.4" @@ -28032,6 +28027,18 @@ __metadata: languageName: node linkType: hard +"serve-static@npm:^2.2.0": + version: 2.2.0 + resolution: "serve-static@npm:2.2.0" + dependencies: + encodeurl: "npm:^2.0.0" + escape-html: "npm:^1.0.3" + parseurl: "npm:^1.3.3" + send: "npm:^1.2.0" + checksum: 10/9f1a900738c5bb02258275ce3bd1273379c4c3072b622e15d44e8f47d89a1ba2d639ec2d63b11c263ca936096b40758acb7a0d989cd6989018a65a12f9433ada + languageName: node + linkType: hard + "set-blocking@npm:^2.0.0, set-blocking@npm:~2.0.0": version: 2.0.0 resolution: "set-blocking@npm:2.0.0" @@ -28118,13 +28125,6 @@ __metadata: languageName: node linkType: hard -"shallowequal@npm:^1.1.0": - version: 1.1.0 - resolution: "shallowequal@npm:1.1.0" - checksum: 10/f4c1de0837f106d2dbbfd5d0720a5d059d1c66b42b580965c8f06bb1db684be8783538b684092648c981294bf817869f743a066538771dbecb293df78f765e00 - languageName: node - linkType: hard - "shebang-command@npm:^2.0.0": version: 2.0.0 resolution: "shebang-command@npm:2.0.0" @@ -30464,6 +30464,17 @@ __metadata: languageName: node linkType: hard +"type-is@npm:^2.0.0, type-is@npm:^2.0.1": + version: 2.0.1 + resolution: "type-is@npm:2.0.1" + dependencies: + content-type: "npm:^1.0.5" + media-typer: "npm:^1.1.0" + mime-types: "npm:^3.0.0" + checksum: 10/bacdb23c872dacb7bd40fbd9095e6b2fca2895eedbb689160c05534d7d4810a7f4b3fd1ae87e96133c505958f6d602967a68db5ff577b85dd6be76eaa75d58af + languageName: node + linkType: hard + "type-is@npm:~1.6.18": version: 1.6.18 resolution: "type-is@npm:1.6.18" @@ -31100,7 +31111,7 @@ __metadata: languageName: node linkType: hard -"vary@npm:^1, vary@npm:~1.1.2": +"vary@npm:^1, vary@npm:^1.1.2, vary@npm:~1.1.2": version: 1.1.2 resolution: "vary@npm:1.1.2" checksum: 10/31389debef15a480849b8331b220782230b9815a8e0dbb7b9a8369559aed2e9a7800cd904d4371ea74f4c3527db456dc8e7ac5befce5f0d289014dbdf47b2242 @@ -31242,7 +31253,7 @@ __metadata: languageName: node linkType: hard -"warning@npm:^4.0.0, warning@npm:^4.0.1, warning@npm:^4.0.2": +"warning@npm:^4.0.0, warning@npm:^4.0.2": version: 4.0.3 resolution: "warning@npm:4.0.3" dependencies: @@ -32225,6 +32236,15 @@ __metadata: languageName: node linkType: hard +"zod-to-json-schema@npm:^3.24.1": + version: 3.24.5 + resolution: "zod-to-json-schema@npm:3.24.5" + peerDependencies: + zod: ^3.24.1 + checksum: 10/1af291b4c429945c9568c2e924bdb7c66ab8d139cbeb9a99b6e9fc9e1b02863f85d07759b9303714f07ceda3993dcaf0ebcb80d2c18bb2aaf5502b2c1016affd + languageName: node + linkType: hard + "zod@npm:^3.23.8, zod@npm:^3.24.1": version: 3.24.1 resolution: "zod@npm:3.24.1"