Internationalisation: More markup (#103634)

* some manual markup

* more markup

* update count names
This commit is contained in:
Ashley Harrison
2025-04-09 11:31:48 +01:00
committed by GitHub
parent 837f4864b1
commit a420e2f8f2
32 changed files with 295 additions and 204 deletions
+4 -115
View File
@@ -1482,10 +1482,6 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "2"], [0, 0, 0, "Do not use any type assertions.", "2"],
[0, 0, 0, "Unexpected any. Specify a different type.", "3"] [0, 0, 0, "Unexpected any. Specify a different type.", "3"]
], ],
"public/app/features/annotations/components/StandardAnnotationQueryEditor.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"]
],
"public/app/features/annotations/events_processing.ts:5381": [ "public/app/features/annotations/events_processing.ts:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"] [0, 0, 0, "Unexpected any. Specify a different type.", "0"]
], ],
@@ -1494,33 +1490,6 @@ exports[`better eslint`] = {
[0, 0, 0, "Unexpected any. Specify a different type.", "1"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"],
[0, 0, 0, "Unexpected any. Specify a different type.", "2"] [0, 0, 0, "Unexpected any. Specify a different type.", "2"]
], ],
"public/app/features/api-keys/ApiKeysPage.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "2"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "3"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "4"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "5"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "6"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "7"]
],
"public/app/features/api-keys/MigrateToServiceAccountsCard.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "2"]
],
"public/app/features/auth-config/AuthDrawer.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "2"]
],
"public/app/features/auth-config/AuthProvidersListPage.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
],
"public/app/features/auth-config/ProviderConfigForm.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"]
],
"public/app/features/auth-config/fields.tsx:5381": [ "public/app/features/auth-config/fields.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"], [0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"], [0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"],
@@ -1542,28 +1511,12 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use export all (\`export * from ...\`)", "1"], [0, 0, 0, "Do not use export all (\`export * from ...\`)", "1"],
[0, 0, 0, "Do not use export all (\`export * from ...\`)", "2"] [0, 0, 0, "Do not use export all (\`export * from ...\`)", "2"]
], ],
"public/app/features/canvas/elements/notFound.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
],
"public/app/features/canvas/runtime/ables.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"]
],
"public/app/features/canvas/runtime/frame.tsx:5381": [ "public/app/features/canvas/runtime/frame.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"] [0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
], ],
"public/app/features/commandPalette/ResultItem.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
],
"public/app/features/connections/components/ConnectionsRedirectNotice/ConnectionsRedirectNotice.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
],
"public/app/features/connections/components/ConnectionsRedirectNotice/index.ts:5381": [ "public/app/features/connections/components/ConnectionsRedirectNotice/index.ts:5381": [
[0, 0, 0, "Do not use export all (\`export * from ...\`)", "0"] [0, 0, 0, "Do not use export all (\`export * from ...\`)", "0"]
], ],
"public/app/features/connections/pages/DataSourceDetailsPage.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
],
"public/app/features/connections/pages/index.tsx:5381": [ "public/app/features/connections/pages/index.tsx:5381": [
[0, 0, 0, "Do not re-export imported variable (\`./AddNewConnectionPage\`)", "0"], [0, 0, 0, "Do not re-export imported variable (\`./AddNewConnectionPage\`)", "0"],
[0, 0, 0, "Do not re-export imported variable (\`./DataSourceDashboardsPage\`)", "1"], [0, 0, 0, "Do not re-export imported variable (\`./DataSourceDashboardsPage\`)", "1"],
@@ -1583,8 +1536,7 @@ exports[`better eslint`] = {
], ],
"public/app/features/connections/tabs/ConnectData/NoAccessModal/NoAccessModal.tsx:5381": [ "public/app/features/connections/tabs/ConnectData/NoAccessModal/NoAccessModal.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"], [0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"], [0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"]
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "2"]
], ],
"public/app/features/connections/tabs/ConnectData/NoAccessModal/index.tsx:5381": [ "public/app/features/connections/tabs/ConnectData/NoAccessModal/index.tsx:5381": [
[0, 0, 0, "Do not use export all (\`export * from ...\`)", "0"] [0, 0, 0, "Do not use export all (\`export * from ...\`)", "0"]
@@ -1613,24 +1565,9 @@ exports[`better eslint`] = {
"public/app/features/dashboard-scene/edit-pane/DashboardEditPane.tsx:5381": [ "public/app/features/dashboard-scene/edit-pane/DashboardEditPane.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"] [0, 0, 0, "Do not use any type assertions.", "0"]
], ],
"public/app/features/dashboard-scene/embedding/EmbeddedDashboardTestPage.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
],
"public/app/features/dashboard-scene/inspect/HelpWizard/HelpWizard.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "2"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "3"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "4"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "5"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "6"]
],
"public/app/features/dashboard-scene/inspect/HelpWizard/utils.ts:5381": [ "public/app/features/dashboard-scene/inspect/HelpWizard/utils.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"] [0, 0, 0, "Do not use any type assertions.", "0"]
], ],
"public/app/features/dashboard-scene/inspect/PanelInspectDrawer.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
],
"public/app/features/dashboard-scene/pages/DashboardScenePage.tsx:5381": [ "public/app/features/dashboard-scene/pages/DashboardScenePage.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"], [0, 0, 0, "Do not use any type assertions.", "1"],
@@ -1639,42 +1576,21 @@ exports[`better eslint`] = {
"public/app/features/dashboard-scene/panel-edit/LibraryVizPanelInfo.tsx:5381": [ "public/app/features/dashboard-scene/panel-edit/LibraryVizPanelInfo.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"] [0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
], ],
"public/app/features/dashboard-scene/panel-edit/PanelDataPane/NewAlertRuleButton.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
],
"public/app/features/dashboard-scene/panel-edit/PanelDataPane/PanelDataAlertingTab.tsx:5381": [ "public/app/features/dashboard-scene/panel-edit/PanelDataPane/PanelDataAlertingTab.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"] [0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
], ],
"public/app/features/dashboard-scene/panel-edit/PanelDataPane/PanelDataPane.tsx:5381": [ "public/app/features/dashboard-scene/panel-edit/PanelDataPane/PanelDataPane.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"] [0, 0, 0, "Do not use any type assertions.", "0"]
], ],
"public/app/features/dashboard-scene/panel-edit/PanelDataPane/PanelDataQueriesTab.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
],
"public/app/features/dashboard-scene/panel-edit/PanelDataPane/TransformationsDrawer.tsx:5381": [ "public/app/features/dashboard-scene/panel-edit/PanelDataPane/TransformationsDrawer.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"] [0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
], ],
"public/app/features/dashboard-scene/panel-edit/PanelEditorRenderer.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "2"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "3"]
],
"public/app/features/dashboard-scene/panel-edit/PanelOptionsPane.test.tsx:5381": [ "public/app/features/dashboard-scene/panel-edit/PanelOptionsPane.test.tsx:5381": [
[0, 0, 0, "Unexpected any. Specify a different type.", "0"] [0, 0, 0, "Unexpected any. Specify a different type.", "0"]
], ],
"public/app/features/dashboard-scene/panel-edit/SaveLibraryVizPanelModal.tsx:5381": [ "public/app/features/dashboard-scene/panel-edit/SaveLibraryVizPanelModal.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"] [0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
], ],
"public/app/features/dashboard-scene/saving/SaveDashboardDrawer.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"]
],
"public/app/features/dashboard-scene/saving/SaveDashboardForm.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "2"]
],
"public/app/features/dashboard-scene/saving/SaveProvisionedDashboardForm.tsx:5381": [ "public/app/features/dashboard-scene/saving/SaveProvisionedDashboardForm.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"] [0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
], ],
@@ -1687,9 +1603,6 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "5"], [0, 0, 0, "Do not use any type assertions.", "5"],
[0, 0, 0, "Unexpected any. Specify a different type.", "6"] [0, 0, 0, "Unexpected any. Specify a different type.", "6"]
], ],
"public/app/features/dashboard-scene/saving/shared.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
],
"public/app/features/dashboard-scene/scene/PanelMenuBehavior.tsx:5381": [ "public/app/features/dashboard-scene/scene/PanelMenuBehavior.tsx:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"] [0, 0, 0, "Do not use any type assertions.", "0"]
], ],
@@ -1723,31 +1636,16 @@ exports[`better eslint`] = {
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"], [0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"] [0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"]
], ],
"public/app/features/dashboard-scene/settings/JsonModelEditView.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
],
"public/app/features/dashboard-scene/settings/annotations/AnnotationSettingsEdit.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
],
"public/app/features/dashboard-scene/settings/annotations/AnnotationSettingsList.tsx:5381": [ "public/app/features/dashboard-scene/settings/annotations/AnnotationSettingsList.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"], [0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"],
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"], [0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"]
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "2"]
], ],
"public/app/features/dashboard-scene/settings/annotations/index.tsx:5381": [ "public/app/features/dashboard-scene/settings/annotations/index.tsx:5381": [
[0, 0, 0, "Do not re-export imported variable (\`./AnnotationSettingsEdit\`)", "0"], [0, 0, 0, "Do not re-export imported variable (\`./AnnotationSettingsEdit\`)", "0"],
[0, 0, 0, "Do not re-export imported variable (\`./AnnotationSettingsList\`)", "1"] [0, 0, 0, "Do not re-export imported variable (\`./AnnotationSettingsList\`)", "1"]
], ],
"public/app/features/dashboard-scene/settings/links/DashboardLinkList.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
],
"public/app/features/dashboard-scene/settings/variables/components/DataSourceVariableForm.tsx:5381": [ "public/app/features/dashboard-scene/settings/variables/components/DataSourceVariableForm.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"], [0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "1"]
],
"public/app/features/dashboard-scene/settings/variables/components/IntervalVariableForm.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"],
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "1"]
], ],
"public/app/features/dashboard-scene/settings/variables/components/QueryVariableForm.tsx:5381": [ "public/app/features/dashboard-scene/settings/variables/components/QueryVariableForm.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"] [0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
@@ -1769,9 +1667,6 @@ exports[`better eslint`] = {
"public/app/features/dashboard-scene/settings/version-history/VersionHistoryHeader.tsx:5381": [ "public/app/features/dashboard-scene/settings/version-history/VersionHistoryHeader.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"] [0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
], ],
"public/app/features/dashboard-scene/settings/version-history/VersionHistoryTable.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
],
"public/app/features/dashboard-scene/settings/version-history/index.ts:5381": [ "public/app/features/dashboard-scene/settings/version-history/index.ts:5381": [
[0, 0, 0, "Do not re-export imported variable (\`./HistorySrv\`)", "0"], [0, 0, 0, "Do not re-export imported variable (\`./HistorySrv\`)", "0"],
[0, 0, 0, "Do not re-export imported variable (\`./VersionHistoryButtons\`)", "1"], [0, 0, 0, "Do not re-export imported variable (\`./VersionHistoryButtons\`)", "1"],
@@ -1785,9 +1680,6 @@ exports[`better eslint`] = {
"public/app/features/dashboard-scene/sharing/ShareButton/share-snapshot/UpsertSnapshot.tsx:5381": [ "public/app/features/dashboard-scene/sharing/ShareButton/share-snapshot/UpsertSnapshot.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"] [0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
], ],
"public/app/features/dashboard-scene/sharing/public-dashboards/ConfigPublicDashboard.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
],
"public/app/features/dashboard-scene/solo/SoloPanelPage.tsx:5381": [ "public/app/features/dashboard-scene/solo/SoloPanelPage.tsx:5381": [
[0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"] [0, 0, 0, "No untranslated strings. Wrap text with <Trans />", "0"]
], ],
@@ -1802,9 +1694,6 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "1"], [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.", "2"]
], ],
"public/app/features/dashboard-scene/variables/VariableUsagesButton.tsx:5381": [
[0, 0, 0, "No untranslated strings in text props. Wrap text with <Trans /> or use t()", "0"]
],
"public/app/features/dashboard/api/ResponseTransformers.ts:5381": [ "public/app/features/dashboard/api/ResponseTransformers.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"], [0, 0, 0, "Do not use any type assertions.", "1"],
@@ -156,9 +156,13 @@ export default class StandardAnnotationQueryEditor extends PureComponent<Props,
} }
const frame = panelData?.series?.[0] ?? panelData?.annotations?.[0]; const frame = panelData?.series?.[0] ?? panelData?.annotations?.[0];
const numEvents = events.length;
const numFields = frame?.fields.length;
return ( return (
<p> <p>
{events.length} events (from {frame?.fields.length} fields) <Trans i18nKey="annotations.standard-annotation-query-editor.events-found">
{{ numEvents }} events (from {{ numFields }} fields)
</Trans>
</p> </p>
); );
} }
@@ -212,7 +216,13 @@ export default class StandardAnnotationQueryEditor extends PureComponent<Props,
// Find the annotation runner // Find the annotation runner
let QueryEditor = datasource.annotations?.QueryEditor || datasource.components?.QueryEditor; let QueryEditor = datasource.annotations?.QueryEditor || datasource.components?.QueryEditor;
if (!QueryEditor) { if (!QueryEditor) {
return <div>Annotations are not supported. This datasource needs to export a QueryEditor</div>; return (
<div>
<Trans i18nKey="annotations.standard-annotation-query-editor.no-query-editor">
Annotations are not supported. This datasource needs to export a QueryEditor
</Trans>
</div>
);
} }
const query = { const query = {
+35 -16
View File
@@ -190,41 +190,60 @@ export const MigrationSummary: React.FC<MigrationSummaryProps> = ({ visible, dat
<Trans i18nKey="api-keys.migration-summary.migration-successful">Migration Successful!</Trans> <Trans i18nKey="api-keys.migration-summary.migration-successful">Migration Successful!</Trans>
</p> </p>
<p> <p>
<strong>Total: </strong> <Trans i18nKey="api-keys.migration-summary.total" values={{ total: data.total }}>
{data.total} <strong>Total: </strong>
{'{{total}}'}
</Trans>
</p> </p>
<p> <p>
<strong>Migrated: </strong> <Trans i18nKey="api-keys.migration-summary.migrated" values={{ migrated: data.migrated }}>
{data.migrated} <strong>Migrated: </strong>
{'{{migrated}}'}
</Trans>
</p> </p>
</div> </div>
)} )}
{data.failedApikeyIDs.length !== 0 && ( {data.failedApikeyIDs.length !== 0 && (
<div style={styles.migrationSummary}> <div style={styles.migrationSummary}>
<p> <p>
Migration Complete! Please note, while there might be a few API keys flagged as `failed migrations`, rest <Trans i18nKey="api-keys.migration-summary.migration-complete">
assured, all of your API keys are fully functional and operational. Please try again or contact support. Migration complete! Please note, while there might be a few API keys flagged as `failed migrations`, rest
assured, all of your API keys are fully functional and operational. Please try again or contact support.
</Trans>
</p> </p>
<hr /> <hr />
<p> <p>
<strong>Total: </strong> <Trans i18nKey="api-keys.migration-summary.total" values={{ total: data.total }}>
{data.total} <strong>Total: </strong>
{'{{total}}'}
</Trans>
</p> </p>
<p> <p>
<strong>Migrated: </strong> <Trans i18nKey="api-keys.migration-summary.migrated" values={{ migrated: data.migrated }}>
{data.migrated} <strong>Migrated: </strong>
{'{{migrated}}'}
</Trans>
</p> </p>
<p> <p>
<strong>Failed: </strong> <Trans i18nKey="api-keys.migration-summary.failed" values={{ failed: data.failed }}>
{data.failed} <strong>Failed: </strong>
{'{{failed}}'}
</Trans>
</p> </p>
<p> <p>
<strong>Failed Api Key IDs: </strong> <Trans i18nKey="api-keys.migration-summary.failed-ids" values={{ ids: data.failedApikeyIDs.join(', ') }}>
{data.failedApikeyIDs.join(', ')} <strong>Failed api key IDs: </strong>
{'{{ids}}'}
</Trans>
</p> </p>
<p> <p>
<strong>Failed Details: </strong> <Trans
{data.failedDetails.join(', ')} i18nKey="api-keys.migration-summary.failed-details"
values={{ details: data.failedDetails.join(', ') }}
>
<strong>Failed details: </strong>
{'{{details}}'}
</Trans>
</p> </p>
</div> </div>
)} )}
@@ -46,9 +46,14 @@ export const MigrateToServiceAccountsCard = ({ onMigrate, apikeysCount, disabled
severity="warning" severity="warning"
> >
<div className={styles.text}> <div className={styles.text}>
API keys are deprecated and will be removed from Grafana on Jan 31, 2025. Each API key will be migrated into <Trans
a service account with a token and will continue to work as they were. We encourage you to migrate your API i18nKey="api-keys.migrate-to-service-accounts-card.body-switch-service-accounts"
keys to service accounts now. {docsLink} components={{ docsLink }}
>
API keys are deprecated and will be removed from Grafana on Jan 31, 2025. Each API key will be migrated
into a service account with a token and will continue to work as they were. We encourage you to migrate
your API keys to service accounts now. {'<docsLink />'}
</Trans>
</div> </div>
<div className={styles.actionRow}> <div className={styles.actionRow}>
<Button className={styles.actionButton} onClick={() => setIsModalOpen(true)}> <Button className={styles.actionButton} onClick={() => setIsModalOpen(true)}>
@@ -57,7 +62,7 @@ export const MigrateToServiceAccountsCard = ({ onMigrate, apikeysCount, disabled
</Trans> </Trans>
</Button> </Button>
<ConfirmModal <ConfirmModal
title={'Migrate API keys to Service accounts'} title={t('api-keys.migrate-to-service-accounts-card.modal-title', 'Migrate API keys to service accounts')}
isOpen={isModalOpen} isOpen={isModalOpen}
body={migrationBoxDesc} body={migrationBoxDesc}
confirmText={'Yes, migrate now'} confirmText={'Yes, migrate now'}
@@ -76,7 +81,9 @@ export const MigrateToServiceAccountsCard = ({ onMigrate, apikeysCount, disabled
severity="warning" severity="warning"
> >
<div className={styles.text}> <div className={styles.text}>
No API keys were found. If you reload the browser, this page will not be available anymore. <Trans i18nKey="api-keys.migrate-to-service-accounts-card.body-no-api-keys-found">
No API keys were found. If you reload the browser, this page will not be available anymore.
</Trans>
</div> </div>
</Alert> </Alert>
</> </>
@@ -70,7 +70,7 @@ export const AuthDrawerUnconnected = ({
}; };
const subtitle = ( const subtitle = (
<> <Trans i18nKey="auth-config.auth-drawer-unconneced.subtitle">
Configure auth settings. Find out more in our{' '} Configure auth settings. Find out more in our{' '}
<TextLink <TextLink
external={true} external={true}
@@ -79,7 +79,7 @@ export const AuthDrawerUnconnected = ({
documentation documentation
</TextLink> </TextLink>
. .
</> </Trans>
); );
const styles = useStyles2(getStyles); const styles = useStyles2(getStyles);
@@ -101,7 +101,9 @@ export const AuthDrawerUnconnected = ({
</Trans> </Trans>
</Text> </Text>
<Text variant="body" color="secondary"> <Text variant="body" color="secondary">
Allow users to use the same email address to log into Grafana with different identity providers. <Trans i18nKey="auth-config.auth-drawer-unconnected.enable-insecure-email-lookup-description">
Allow users to use the same email address to log into Grafana with different identity providers.
</Trans>
</Text> </Text>
<Switch value={allowInsecureEmail} onChange={oauthAllowInsecureEmailLookupOnChange} /> <Switch value={allowInsecureEmail} onChange={oauthAllowInsecureEmailLookupOnChange} />
</div> </div>
@@ -110,7 +112,10 @@ export const AuthDrawerUnconnected = ({
variant="secondary" variant="secondary"
className={styles.button} className={styles.button}
onClick={resetButtonOnClick} onClick={resetButtonOnClick}
tooltip="This action will disregard any saved changes and load the configuration from the configuration file." tooltip={t(
'auth-config.auth-drawer-unconnected.reset-tooltip',
'This action will disregard any saved changes and load the configuration from the configuration file.'
)}
> >
<Trans i18nKey="auth-config.auth-drawer-unconnected.reset">Reset</Trans> <Trans i18nKey="auth-config.auth-drawer-unconnected.reset">Reset</Trans>
</Button> </Button>
@@ -82,7 +82,7 @@ export const AuthConfigPageUnconnected = ({
<Page <Page
navId="authentication" navId="authentication"
subTitle={ subTitle={
<> <Trans i18nKey="auth-config-auth-config-page-unconnected.subtitle">
Manage your auth settings and configure single sign-on. Find out more in our{' '} Manage your auth settings and configure single sign-on. Find out more in our{' '}
<TextLink <TextLink
external={true} external={true}
@@ -91,7 +91,7 @@ export const AuthConfigPageUnconnected = ({
documentation documentation
</TextLink> </TextLink>
. .
</> </Trans>
} }
actions={ actions={
config.buildInfo.edition !== GrafanaEdition.OpenSource && ( config.buildInfo.edition !== GrafanaEdition.OpenSource && (
@@ -168,7 +168,11 @@ export const ProviderConfigForm = ({ config, provider, isLoading }: ProviderConf
}} }}
/> />
<Field label={t('auth-config.provider-config-form.label-enabled', 'Enabled')} hidden={true}> <Field label={t('auth-config.provider-config-form.label-enabled', 'Enabled')} hidden={true}>
<Switch {...register('enabled')} id="enabled" label={'Enabled'} /> <Switch
{...register('enabled')}
id="enabled"
label={t('auth-config.provider-config-form.enabled-label-enabled', 'Enabled')}
/>
</Field> </Field>
<Stack gap={2} direction={'column'}> <Stack gap={2} direction={'column'}>
{sections {sections
@@ -244,8 +248,10 @@ export const ProviderConfigForm = ({ config, provider, isLoading }: ProviderConf
</Trans> </Trans>
</span> </span>
<small> <small>
After resetting these settings Grafana will use the provider configuration from the system (config <Trans i18nKey="auth-config.provider-config-form.reset-configuration-description">
file/environment variables) if any. After resetting these settings Grafana will use the provider configuration from the system (config
file/environment variables) if any.
</Trans>
</small> </small>
</Stack> </Stack>
} }
@@ -1,5 +1,6 @@
import { PureComponent } from 'react'; import { PureComponent } from 'react';
import { Trans } from '../../../core/internationalization';
import { CanvasElementItem, CanvasElementProps } from '../element'; import { CanvasElementItem, CanvasElementProps } from '../element';
class NotFoundDisplay extends PureComponent<CanvasElementProps> { class NotFoundDisplay extends PureComponent<CanvasElementProps> {
@@ -7,8 +8,13 @@ class NotFoundDisplay extends PureComponent<CanvasElementProps> {
const { config } = this.props; const { config } = this.props;
return ( return (
<div> <div>
<h3>NOT FOUND:</h3> <Trans
<pre>{JSON.stringify(config, null, 2)}</pre> i18nKey="canvas.not-found-display.not-found"
components={{ config: <pre>{JSON.stringify(config, null, 2)}</pre> }}
>
<h3>Not found: </h3>
{'<config />'}
</Trans>
</div> </div>
); );
} }
@@ -34,6 +34,7 @@ export const settingsViewable = (scene: Scene) => ({
const rect = moveable.getRect(); const rect = moveable.getRect();
return ( return (
// eslint-disable-next-line @grafana/no-untranslated-strings
<div <div
key={'settings-viewable'} key={'settings-viewable'}
className={'moveable-settings'} className={'moveable-settings'}
@@ -69,6 +70,7 @@ export const dimensionViewable = {
render(moveable: MoveableManagerInterface<unknown, unknown>, React: Renderer) { render(moveable: MoveableManagerInterface<unknown, unknown>, React: Renderer) {
const rect = moveable.getRect(); const rect = moveable.getRect();
return ( return (
// eslint-disable-next-line @grafana/no-untranslated-strings
<div <div
key={'dimension-viewable'} key={'dimension-viewable'}
className={'moveable-dimension'} className={'moveable-dimension'}
@@ -54,6 +54,7 @@ export const ResultItem = React.forwardRef(
{!hasCommandOrLink(ancestor) && ( {!hasCommandOrLink(ancestor) && (
<> <>
<span className={styles.breadcrumbAncestor}>{ancestor.name}</span> <span className={styles.breadcrumbAncestor}>{ancestor.name}</span>
{/* eslint-disable-next-line @grafana/no-untranslated-strings */}
<span className={styles.breadcrumbSeparator}>&rsaquo;</span> <span className={styles.breadcrumbSeparator}>&rsaquo;</span>
</> </>
)} )}
@@ -34,8 +34,10 @@ export function ConnectionsRedirectNotice() {
<Alert severity="info" title="" onRemove={() => setShowNotice(false)}> <Alert severity="info" title="" onRemove={() => setShowNotice(false)}>
<div className={styles.alertContent}> <div className={styles.alertContent}>
<p className={styles.alertParagraph}> <p className={styles.alertParagraph}>
Data sources have a new home! You can discover new data sources or manage existing ones in the Connections <Trans i18nKey="connections.connections-redirect-notice.body">
page, accessible from the main menu. 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.
</Trans>
</p> </p>
<LinkButton <LinkButton
aria-label={t( aria-label={t(
@@ -1,9 +1,10 @@
import { useParams } from 'react-router-dom-v5-compat'; import { useParams } from 'react-router-dom-v5-compat';
import { Alert, Badge } from '@grafana/ui'; import { Alert, Badge, TextLink } from '@grafana/ui';
import { PluginDetailsPage } from 'app/features/plugins/admin/components/PluginDetailsPage'; import { PluginDetailsPage } from 'app/features/plugins/admin/components/PluginDetailsPage';
import { StoreState, useSelector, AppNotificationSeverity } from 'app/types'; import { StoreState, useSelector, AppNotificationSeverity } from 'app/types';
import { Trans } from '../../../core/internationalization';
import { ROUTES } from '../constants'; import { ROUTES } from '../constants';
export function DataSourceDetailsPage() { export function DataSourceDetailsPage() {
@@ -32,9 +33,11 @@ function NotFoundDatasource() {
return ( return (
<Alert severity={AppNotificationSeverity.Warning} title=""> <Alert severity={AppNotificationSeverity.Warning} title="">
Maybe you mistyped the URL or the plugin with the id <Badge text={id} color="orange" /> is unavailable. <Trans i18nKey="connections.not-found-datasource.body">
<br /> Maybe you mistyped the URL or the plugin with the id <Badge text={id} color="orange" /> is unavailable.
To see a list of available datasources please <a href={ROUTES.AddNewConnection}>click here</a>. <br />
To see a list of available datasources please <TextLink href={ROUTES.AddNewConnection}>click here</TextLink>.
</Trans>
</Alert> </Alert>
); );
} }
@@ -90,8 +90,10 @@ export function NoAccessModal({ item, isOpen, onDismiss }: NoAccessModalProps) {
</div> </div>
<div> <div>
<p> <p>
Editors cannot add new connections. You may check to see if it is already configured in{' '} <Trans i18nKey="connections.no-access-modal.editor-warning">
<a href="/connections/datasources">Data sources</a>. Editors cannot add new connections. You may check to see if it is already configured in{' '}
<a href="/connections/datasources">Data sources</a>.
</Trans>
</p> </p>
<p> <p>
<Trans i18nKey="connections.no-access-modal.connection-contact-grafana-admin"> <Trans i18nKey="connections.no-access-modal.connection-contact-grafana-admin">
@@ -15,6 +15,8 @@ export function EmbeddedDashboardTestPage() {
pageNav={{ text: 'Embedding dashboard', subTitle: 'Showing dashboard: Panel Tests - Pie chart' }} pageNav={{ text: 'Embedding dashboard', subTitle: 'Showing dashboard: Panel Tests - Pie chart' }}
layout={PageLayoutType.Canvas} layout={PageLayoutType.Canvas}
> >
{/* this is a test page, no need to translate */}
{/* eslint-disable-next-line @grafana/no-untranslated-strings */}
<Box paddingY={2}>Internal url state: {state}</Box> <Box paddingY={2}>Internal url state: {state}</Box>
<EmbeddedDashboard uid="lVE-2YFMz" initialState={state} onStateChange={setState} /> <EmbeddedDashboard uid="lVE-2YFMz" initialState={state} onStateChange={setState} />
</Page> </Page>
@@ -19,8 +19,8 @@ import {
FeatureBadge, FeatureBadge,
Select, Select,
ClipboardButton, ClipboardButton,
Icon,
Stack, Stack,
TextLink,
} from '@grafana/ui'; } from '@grafana/ui';
import { t, Trans } from 'app/core/internationalization'; import { t, Trans } from 'app/core/internationalization';
import { contextSrv } from 'app/core/services/context_srv'; import { contextSrv } from 'app/core/services/context_srv';
@@ -77,23 +77,22 @@ export function HelpWizard({ panel, onClose }: Props) {
<Stack direction="column" gap={1}> <Stack direction="column" gap={1}>
<Stack direction="row" gap={1}> <Stack direction="row" gap={1}>
<FeatureBadge featureState={FeatureState.beta} /> <FeatureBadge featureState={FeatureState.beta} />
<a <TextLink href="https://grafana.com/docs/grafana/latest/troubleshooting/" external>
href="https://grafana.com/docs/grafana/latest/troubleshooting/" <Trans i18nKey="dashboard-scene.help-wizard.troubleshooting-docs">Troubleshooting docs</Trans>
target="blank" </TextLink>
className="external-link"
rel="noopener noreferrer"
>
Troubleshooting docs <Icon name="external-link-alt" />
</a>
</Stack> </Stack>
<span className="muted"> <span className="muted">
To request troubleshooting help, send a snapshot of this panel to Grafana Labs Technical Support. The <Trans i18nKey="dashboard-scene.help-wizard.troubleshooting-request-help">
snapshot contains query response data and panel settings. To request troubleshooting help, send a snapshot of this panel to Grafana Labs Technical Support. The
snapshot contains query response data and panel settings.
</Trans>
</span> </span>
{hasSupportBundleAccess && ( {hasSupportBundleAccess && (
<span className="muted"> <span className="muted">
You can also retrieve a support bundle containing information concerning your Grafana instance and <Trans i18nKey="dashboard-scene-help-wizard.support-bundle">
configured datasources in the <a href="/support-bundles">support bundles section</a>. You can also retrieve a support bundle containing information concerning your Grafana instance and
configured datasources in the <TextLink href="/support-bundles">support bundles section</TextLink>.
</Trans>
</span> </span>
)} )}
</Stack> </Stack>
@@ -127,7 +126,7 @@ export function HelpWizard({ panel, onClose }: Props) {
</ClipboardButton> </ClipboardButton>
) : ( ) : (
<Button icon="download-alt" onClick={service.onDownloadDashboard}> <Button icon="download-alt" onClick={service.onDownloadDashboard}>
Download ({snapshotSize}) <Trans i18nKey="dashboard-scene.help-wizard.download-snapshot">Download ({{ snapshotSize }})</Trans>
</Button> </Button>
)} )}
</div> </div>
@@ -151,7 +150,10 @@ export function HelpWizard({ panel, onClose }: Props) {
<> <>
<Field <Field
label={t('dashboard-scene.help-wizard.label-randomize-data', 'Randomize data')} label={t('dashboard-scene.help-wizard.label-randomize-data', 'Randomize data')}
description="Modify the original data to hide sensitive information. Note the lengths will stay the same, and duplicate values will be equal." description={t(
'dashboard-scene.help-wizard.description-randomize-data',
'Modify the original data to hide sensitive information. Note the lengths will stay the same, and duplicate values will be equal.'
)}
> >
<Stack> <Stack>
<InlineSwitch <InlineSwitch
@@ -180,11 +182,13 @@ export function HelpWizard({ panel, onClose }: Props) {
<Field <Field
label={t('dashboard-scene.help-wizard.label-support-snapshot', 'Support snapshot')} label={t('dashboard-scene.help-wizard.label-support-snapshot', 'Support snapshot')}
description={`Panel: ${panelTitle}`} description={t('dashboard-scene.help-wizard.description-support-snapshot', 'Panel: {{panelTitle}}', {
panelTitle,
})}
> >
<Stack> <Stack>
<Button icon="download-alt" onClick={service.onDownloadDashboard}> <Button icon="download-alt" onClick={service.onDownloadDashboard}>
Dashboard ({snapshotSize}) <Trans i18nKey="dashboard-scene.help-wizard.download-dashboard">Dashboard ({{ snapshotSize }})</Trans>
</Button> </Button>
<ClipboardButton <ClipboardButton
icon="github" icon="github"
@@ -11,7 +11,7 @@ import {
SceneObjectRef, SceneObjectRef,
} from '@grafana/scenes'; } from '@grafana/scenes';
import { Alert, Drawer, Tab, TabsBar } from '@grafana/ui'; import { Alert, Drawer, Tab, TabsBar } from '@grafana/ui';
import { t } from 'app/core/internationalization'; import { t, Trans } from 'app/core/internationalization';
import { getDataSourceWithInspector } from 'app/features/dashboard/components/Inspector/hooks'; import { getDataSourceWithInspector } from 'app/features/dashboard/components/Inspector/hooks';
import { supportsDataQuery } from 'app/features/dashboard/components/PanelEditor/utils'; import { supportsDataQuery } from 'app/features/dashboard/components/PanelEditor/utils';
import { InspectTab } from 'app/features/inspector/types'; import { InspectTab } from 'app/features/inspector/types';
@@ -139,7 +139,9 @@ function PanelInspectRenderer({ model }: SceneComponentProps<PanelInspectDrawer>
<Alert <Alert
title={t('dashboard-scene.panel-inspect-renderer.title-panel-plugin-not-loaded', 'Panel plugin not loaded')} title={t('dashboard-scene.panel-inspect-renderer.title-panel-plugin-not-loaded', 'Panel plugin not loaded')}
> >
Make sure the panel you want to inspect is visible and has been displayed before opening inspect. <Trans i18nKey="dashboard-scene.panel-inspect-renderer.body-panel-plugin-not-loaded">
Make sure the panel you want to inspect is visible and has been displayed before opening inspect.
</Trans>
</Alert> </Alert>
)} )}
{currentTab && currentTab.Component && <currentTab.Component model={currentTab} />} {currentTab && currentTab.Component && <currentTab.Component model={currentTab} />}
@@ -35,7 +35,9 @@ export const ScenesNewRuleFromPanelButton = ({ panel, className }: ScenesNewRule
'No alerting capable query found' 'No alerting capable query found'
)} )}
> >
Cannot create alerts from this panel because no query to an alerting capable datasource is found. <Trans i18nKey="dashboard-scene.scenes-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.
</Trans>
</Alert> </Alert>
); );
} }
@@ -400,7 +400,9 @@ export function PanelDataQueriesTabRendered({ model }: SceneComponentProps<Panel
variant="secondary" variant="secondary"
data-testid={selectors.components.QueryTab.addExpression} data-testid={selectors.components.QueryTab.addExpression}
> >
<span>Expression&nbsp;</span> <span>
<Trans i18nKey="dashboard-scene.panel-data-queries-tab-rendered.expression">Expression&nbsp;</Trans>
</span>
</Button> </Button>
)} )}
{model.renderExtraActions()} {model.renderExtraActions()}
@@ -5,6 +5,7 @@ import { GrafanaTheme2 } from '@grafana/data';
import { selectors } from '@grafana/e2e-selectors'; import { selectors } from '@grafana/e2e-selectors';
import { SceneComponentProps, VizPanel } from '@grafana/scenes'; import { SceneComponentProps, VizPanel } from '@grafana/scenes';
import { Button, Spinner, ToolbarButton, useStyles2 } from '@grafana/ui'; import { Button, Spinner, ToolbarButton, useStyles2 } from '@grafana/ui';
import { t } from 'app/core/internationalization';
import { useEditPaneCollapsed } from '../edit-pane/shared'; import { useEditPaneCollapsed } from '../edit-pane/shared';
import { NavToolbarActions } from '../scene/NavToolbarActions'; import { NavToolbarActions } from '../scene/NavToolbarActions';
@@ -53,12 +54,15 @@ export function PanelEditorRenderer({ model }: SceneComponentProps<PanelEditor>)
{splitterState.collapsed && ( {splitterState.collapsed && (
<div className={styles.expandOptionsWrapper}> <div className={styles.expandOptionsWrapper}>
<ToolbarButton <ToolbarButton
tooltip={'Open options pane'} tooltip={t('dashboard-scene.panel-editor-renderer.tooltip-open-options-pane', 'Open options pane')}
icon={'arrow-to-right'} icon={'arrow-to-right'}
onClick={onToggleCollapse} onClick={onToggleCollapse}
variant="canvas" variant="canvas"
className={styles.rotate180} className={styles.rotate180}
aria-label={'Open options pane'} aria-label={t(
'dashboard-scene.panel-editor-renderer.aria-label-open-options-pane',
'Open options pane'
)}
/> />
</div> </div>
)} )}
@@ -127,13 +131,13 @@ function VizAndDataPane({ model }: SceneComponentProps<PanelEditor>) {
{splitterState.collapsed && ( {splitterState.collapsed && (
<div className={styles.expandDataPane}> <div className={styles.expandDataPane}>
<Button <Button
tooltip={'Open query pane'} tooltip={t('dashboard-scene.viz-and-data-pane.tooltip-open-query-pane', 'Open query pane')}
icon={'arrow-to-right'} icon={'arrow-to-right'}
onClick={onToggleCollapse} onClick={onToggleCollapse}
variant="secondary" variant="secondary"
size="sm" size="sm"
className={styles.openDataPaneButton} className={styles.openDataPaneButton}
aria-label={'Open query pane'} aria-label={t('dashboard-scene.viz-and-data-pane.aria-label-open-query-pane', 'Open query pane')}
/> />
</div> </div>
)} )}
@@ -1,5 +1,6 @@
import { SceneComponentProps, SceneObjectBase, SceneObjectState, SceneObjectRef } from '@grafana/scenes'; import { SceneComponentProps, SceneObjectBase, SceneObjectState, SceneObjectRef } from '@grafana/scenes';
import { Drawer, Tab, TabsBar } from '@grafana/ui'; import { Drawer, Tab, TabsBar } from '@grafana/ui';
import { t } from 'app/core/internationalization';
import { SaveDashboardDiff } from 'app/features/dashboard/components/SaveDashboard/SaveDashboardDiff'; import { SaveDashboardDiff } from 'app/features/dashboard/components/SaveDashboard/SaveDashboardDiff';
import { useIsProvisionedNG } from 'app/features/provisioning/hooks/useIsProvisionedNG'; import { useIsProvisionedNG } from 'app/features/provisioning/hooks/useIsProvisionedNG';
@@ -59,10 +60,14 @@ export class SaveDashboardDrawer extends SceneObjectBase<SaveDashboardDrawerStat
const tabs = ( const tabs = (
<TabsBar> <TabsBar>
<Tab label={'Details'} active={!showDiff} onChangeTab={() => model.setState({ showDiff: false })} /> <Tab
label={t('dashboard-scene.save-dashboard-drawer.tabs.label-details', 'Details')}
active={!showDiff}
onChangeTab={() => model.setState({ showDiff: false })}
/>
{changesCount > 0 && ( {changesCount > 0 && (
<Tab <Tab
label={'Changes'} label={t('dashboard-scene.save-dashboard-drawer.tabs.label-changes', 'Changes')}
active={showDiff} active={showDiff}
onChangeTab={() => model.setState({ showDiff: true })} onChangeTab={() => model.setState({ showDiff: true })}
counter={changesCount} counter={changesCount}
@@ -110,7 +110,10 @@ export function SaveDashboardForm({ dashboard, drawer, changeInfo }: Props) {
severity="error" severity="error"
> >
<p> <p>
Your changes will be lost when you update the plugin. Use <strong>Save As</strong> to create custom version. <Trans i18nKey="dashboard-scene.save-dashboard-form.render-footer.body-plugin-dashboard">
Your changes will be lost when you update the plugin. Use <strong>Save as</strong> to create custom
version.
</Trans>
</p> </p>
<Box paddingTop={2}> <Box paddingTop={2}>
<Stack alignItems="center"> <Stack alignItems="center">
@@ -162,9 +165,11 @@ export function SaveDashboardForm({ dashboard, drawer, changeInfo }: Props) {
severity="warning" severity="warning"
> >
<p> <p>
Because you're using new dashboards features only supported on new Grafana dashboard schema format, the <Trans i18nKey="dashboard-scene.save-dashboard-form.body-dashboard-drastically-changed">
dashboard will be saved in the new format. Please make sure you want to perform this action or you prefer to Because you're using new dashboards features only supported on new Grafana dashboard schema format, the
save the dashboard as a new copy. dashboard will be saved in the new format. Please make sure you want to perform this action or you prefer
to save the dashboard as a new copy.
</Trans>
</p> </p>
</Alert> </Alert>
)} )}
@@ -211,7 +216,10 @@ export function SaveDashboardFormCommonOptions({ drawer, changeInfo }: SaveDashb
'dashboard-scene.save-dashboard-form-common-options.save-timerange-label-update-default-time-range', 'dashboard-scene.save-dashboard-form-common-options.save-timerange-label-update-default-time-range',
'Update default time range' 'Update default time range'
)} )}
description={'Will make current time range the new default'} description={t(
'dashboard-scene.save-dashboard-form-common-options.save-timerange-description-current-range-default',
'Will make current time range the new default'
)}
data-testid={selectors.pages.SaveDashboardModal.saveTimerange} data-testid={selectors.pages.SaveDashboardModal.saveTimerange}
/> />
)} )}
@@ -61,7 +61,9 @@ export function NameAlreadyExistsError({ cancelButton, saveButton }: NameAlready
severity="error" severity="error"
> >
<p> <p>
A dashboard with the same name in selected folder already exists. Would you still like to save this dashboard? <Trans i18nKey="dashboard-scene.name-already-exists-error.body-name-already-exists">
A dashboard with the same name in selected folder already exists. Would you still like to save this dashboard?
</Trans>
</p> </p>
<Box paddingTop={2}> <Box paddingTop={2}>
<Stack alignItems="center"> <Stack alignItems="center">
@@ -183,8 +183,10 @@ export class JsonModelEditView extends SceneObjectBase<JsonModelEditViewState> i
severity="error" severity="error"
> >
<p> <p>
Your changes will be lost when you update the plugin. Use <strong>Save As</strong> to create custom <Trans i18nKey="dashboard-scene.json-model-edit-view.render-save-button-and-error.body-plugin-dashboard">
version. Your changes will be lost when you update the plugin. Use <strong>Save as</strong> to create custom
version.
</Trans>
</p> </p>
<Box paddingTop={2}> <Box paddingTop={2}>
<Stack alignItems="center">{saveButton(true)}</Stack> <Stack alignItems="center">{saveButton(true)}</Stack>
@@ -215,7 +215,10 @@ export const AnnotationSettingsEdit = ({ annotation, editIndex, panels, onUpdate
</Field> </Field>
<Field <Field
label={t('dashboard-scene.annotation-settings-edit.label-hidden', 'Hidden')} label={t('dashboard-scene.annotation-settings-edit.label-hidden', 'Hidden')}
description="Annotation queries can be toggled on or off at the top of the dashboard. With this option checked this toggle will be hidden." description={t(
'dashboard-scene.annotation-settings-edit.description-hidden',
'Annotation queries can be toggled on or off at the top of the dashboard. With this option checked this toggle will be hidden.'
)}
> >
<Checkbox <Checkbox
name="hide" name="hide"
@@ -95,7 +95,11 @@ export const AnnotationSettingsList = ({ annotations, onNew, onEdit, onMove, onD
<DeleteButton <DeleteButton
size="sm" size="sm"
onConfirm={() => onDelete(idx)} onConfirm={() => onDelete(idx)}
aria-label={`Delete query with title "${annotation.name}"`} aria-label={t(
'dashboard-scene.annotation-settings-list.delete-aria-label',
'Delete query with title "{{title}}"',
{ title: annotation.name }
)}
/> />
)} )}
</td> </td>
@@ -106,7 +106,11 @@ export function DashboardLinkList({
</td> </td>
<td style={{ width: '1%' }} role="gridcell"> <td style={{ width: '1%' }} role="gridcell">
<DeleteButton <DeleteButton
aria-label={`Delete link with title "${link.title}"`} aria-label={t(
'dashboard-scene.dashboard-link-list.delete-aria-label',
'Delete link with title "{{title}}"',
{ title: link.title }
)}
size="sm" size="sm"
onConfirm={() => onDelete(idx)} onConfirm={() => onDelete(idx)}
/> />
@@ -60,6 +60,7 @@ export function DataSourceVariableForm({
<VariableTextField <VariableTextField
defaultValue={regex} defaultValue={regex}
name="Instance name filter" name="Instance name filter"
// eslint-disable-next-line @grafana/no-untranslated-strings
placeholder="/.*-(.*)-.*/" placeholder="/.*-(.*)-.*/"
onBlur={onRegExBlur} onBlur={onRegExBlur}
description={ description={
@@ -59,7 +59,10 @@ export function IntervalVariableForm({
<VariableCheckboxField <VariableCheckboxField
value={autoEnabled} value={autoEnabled}
name="Auto option" name="Auto option"
description="Dynamically calculates interval by dividing time range by the count specified" description={t(
'dashbaord-scene.interval-variable-form.description-auto-option',
'Dynamically calculates interval by dividing time range by the count specified'
)}
onChange={onAutoEnabledChange} onChange={onAutoEnabledChange}
testId={selectors.pages.Dashboard.Settings.Variables.Edit.IntervalVariable.autoEnabledCheckbox} testId={selectors.pages.Dashboard.Settings.Variables.Edit.IntervalVariable.autoEnabledCheckbox}
/> />
@@ -67,7 +70,10 @@ export function IntervalVariableForm({
<div className={styles.autoFields}> <div className={styles.autoFields}>
<VariableSelectField <VariableSelectField
name="Step count" name="Step count"
description="How many times the current time range should be divided to calculate the value" description={t(
'dashboard-scene.interval-variable-form.description-step-count',
'How many times the current time range should be divided to calculate the value'
)}
value={stepCount} value={stepCount}
options={STEP_OPTIONS} options={STEP_OPTIONS}
onChange={onAutoCountChanged} onChange={onAutoCountChanged}
@@ -3,7 +3,7 @@ import * as React from 'react';
import { GrafanaTheme2 } from '@grafana/data'; import { GrafanaTheme2 } from '@grafana/data';
import { Checkbox, Button, Tag, ModalsController, useStyles2 } from '@grafana/ui'; import { Checkbox, Button, Tag, ModalsController, useStyles2 } from '@grafana/ui';
import { Trans } from 'app/core/internationalization'; import { t, Trans } from 'app/core/internationalization';
import { DashboardInteractions } from 'app/features/dashboard-scene/utils/interactions'; import { DashboardInteractions } from 'app/features/dashboard-scene/utils/interactions';
import { DecoratedRevisionModel } from '../VersionsEditView'; import { DecoratedRevisionModel } from '../VersionsEditView';
@@ -46,7 +46,11 @@ export const VersionHistoryTable = ({ versions, canCompare, onCheck, onRestore }
<tr key={version.id}> <tr key={version.id}>
<td> <td>
<Checkbox <Checkbox
aria-label={`Toggle selection of version ${version.version}`} aria-label={t(
'dashboard-scene.version-history-table.aria-label-toggle-selection',
'Toggle selection of version {{version}}',
{ version: version.version }
)}
className={css({ className={css({
display: 'inline', display: 'inline',
})} })}
@@ -9,6 +9,7 @@ import { ConfigPublicDashboardBase } from 'app/features/dashboard/components/Sha
import { PublicDashboard } from 'app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboardUtils'; import { PublicDashboard } from 'app/features/dashboard/components/ShareModal/SharePublicDashboard/SharePublicDashboardUtils';
import { AccessControlAction } from 'app/types'; import { AccessControlAction } from 'app/types';
import { Trans } from '../../../../core/internationalization';
import { shareDashboardType } from '../../../dashboard/components/ShareModal/utils'; import { shareDashboardType } from '../../../dashboard/components/ShareModal/utils';
import { getDashboardSceneFor } from '../../utils/utils'; import { getDashboardSceneFor } from '../../utils/utils';
import { ShareModal } from '../ShareModal'; import { ShareModal } from '../ShareModal';
@@ -49,7 +50,9 @@ export function ConfigPublicDashboard({ model, publicDashboard, isGetLoading }:
confirmText: 'Revoke public URL', confirmText: 'Revoke public URL',
body: ( body: (
<p className={styles.description}> <p className={styles.description}>
Are you sure you want to revoke this URL? The dashboard will no longer be public. <Trans i18nKey="public-dashboard.config.revoke-body">
Are you sure you want to revoke this URL? The dashboard will no longer be public.
</Trans>
</p> </p>
), ),
onDismiss: () => { onDismiss: () => {
@@ -30,7 +30,14 @@ export const VariableUsagesButton = ({ id, usages, isAdhoc }: Props) => {
}); });
return ( return (
<NetworkGraphModal show={false} title={`Showing usages for: $${id}`} nodes={nodes} edges={network.edges}> <NetworkGraphModal
show={false}
title={t('dashboard-scene.variable-usages-button.title-show-usages', 'Showing usages for: {{variableId}}', {
variableId: `$${id}`,
})}
nodes={nodes}
edges={network.edges}
>
{({ showModal }) => { {({ showModal }) => {
return ( return (
<IconButton <IconButton
+77 -3
View File
@@ -2080,7 +2080,9 @@
"title": "There are no custom annotation queries added yet" "title": "There are no custom annotation queries added yet"
}, },
"standard-annotation-query-editor": { "standard-annotation-query-editor": {
"events-found": "{{numEvents}} events (from {{numFields}} fields)",
"no-events-found": "No events found", "no-events-found": "No events found",
"no-query-editor": "Annotations are not supported. This datasource needs to export a QueryEditor",
"test-annotation-query": "Test annotation query", "test-annotation-query": "Test annotation query",
"title-query-result": "Query result" "title-query-result": "Query result"
} }
@@ -2104,6 +2106,8 @@
"message": "No API keys found" "message": "No API keys found"
}, },
"migrate-to-service-accounts-card": { "migrate-to-service-accounts-card": {
"body-no-api-keys-found": "No API keys were found. If you reload the browser, this page will not be available anymore.",
"body-switch-service-accounts": "API keys are deprecated and will be removed from Grafana on Jan 31, 2025. Each API key will be migrated into a service account with a token and will continue to work as they were. We encourage you to migrate your API keys to service accounts now. <docsLink />",
"docs-link": { "docs-link": {
"about-migration": "Find out more about the migration here." "about-migration": "Find out more about the migration here."
}, },
@@ -2111,13 +2115,20 @@
"migration-box-desc": { "migration-box-desc": {
"migrating": "Migrating all API keys will hide the API keys tab." "migrating": "Migrating all API keys will hide the API keys tab."
}, },
"modal-title": "Migrate API keys to service accounts",
"title-no-api-keys-found": "No API keys found", "title-no-api-keys-found": "No API keys found",
"title-switch-service-accounts": "Switch from API keys to service accounts" "title-switch-service-accounts": "Switch from API keys to service accounts"
}, },
"migration-summary": { "migration-summary": {
"close": "Close", "close": "Close",
"failed": "<0>Failed: </0>{{failed}}",
"failed-details": "<0>Failed details: </0>{{details}}",
"failed-ids": "<0>Failed api key IDs: </0>{{ids}}",
"migrated": "<0>Migrated: </0>{{migrated}}",
"migration-complete": "Migration complete! Please note, while there might be a few API keys flagged as `failed migrations`, rest assured, all of your API keys are fully functional and operational. Please try again or contact support.",
"migration-successful": "Migration Successful!", "migration-successful": "Migration Successful!",
"title-migration-summary": "Migration summary" "title-migration-summary": "Migration summary",
"total": "<0>Total: </0>{{total}}"
} }
}, },
"app-chrome": { "app-chrome": {
@@ -2135,10 +2146,15 @@
"auth-config-page-unconnected": { "auth-config-page-unconnected": {
"auth-settings": "Auth settings" "auth-settings": "Auth settings"
}, },
"auth-drawer-unconneced": {
"subtitle": "Configure auth settings. Find out more in our <2>documentation</2>."
},
"auth-drawer-unconnected": { "auth-drawer-unconnected": {
"advanced-auth": "Advanced Auth", "advanced-auth": "Advanced Auth",
"enable-insecure-email-lookup": "Enable insecure email lookup", "enable-insecure-email-lookup": "Enable insecure email lookup",
"enable-insecure-email-lookup-description": "Allow users to use the same email address to log into Grafana with different identity providers.",
"reset": "Reset", "reset": "Reset",
"reset-tooltip": "This action will disregard any saved changes and load the configuration from the configuration file.",
"title-auth-settings": "Auth settings" "title-auth-settings": "Auth settings"
}, },
"configure-auth-cta": { "configure-auth-cta": {
@@ -2151,8 +2167,10 @@
"label-reset-to-default-values": "Reset to default values" "label-reset-to-default-values": "Reset to default values"
}, },
"discard": "Discard", "discard": "Discard",
"enabled-label-enabled": "Enabled",
"label-enabled": "Enabled", "label-enabled": "Enabled",
"reset-configuration": "Are you sure you want to reset this configuration?", "reset-configuration": "Are you sure you want to reset this configuration?",
"reset-configuration-description": "After resetting these settings Grafana will use the provider configuration from the system (config file/environment variables) if any.",
"title-more-actions": "More actions", "title-more-actions": "More actions",
"title-reset": "Reset", "title-reset": "Reset",
"tooltip-more-actions": "More actions" "tooltip-more-actions": "More actions"
@@ -2162,6 +2180,9 @@
"title-open-id-connect-discovery-url": "OpenID Connect Discovery URL" "title-open-id-connect-discovery-url": "OpenID Connect Discovery URL"
} }
}, },
"auth-config-auth-config-page-unconnected": {
"subtitle": "Manage your auth settings and configure single sign-on. Find out more in our <2>documentation</2>."
},
"bookmarks-page": { "bookmarks-page": {
"empty": { "empty": {
"message": "It looks like you haven’t created any bookmarks yet", "message": "It looks like you haven’t created any bookmarks yet",
@@ -2288,6 +2309,11 @@
}, },
"text-this-repository-is-read-only": "If you have direct access to the target, copy the JSON and paste it there." "text-this-repository-is-read-only": "If you have direct access to the target, copy the JSON and paste it there."
}, },
"canvas": {
"not-found-display": {
"not-found": "<0>Not found: </0><config />"
}
},
"carousel": { "carousel": {
"close": "Close", "close": "Close",
"error": "Something went wrong loading images", "error": "Something went wrong loading images",
@@ -2367,12 +2393,17 @@
}, },
"connections-redirect-notice": { "connections-redirect-notice": {
"aria-label-link-to-connections": "Link to Connections", "aria-label-link-to-connections": "Link to Connections",
"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" "go-to-connections": "Go to connections"
}, },
"no-access-modal": { "no-access-modal": {
"connection-contact-grafana-admin": "To add a new connection, contact your Grafana admin.", "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>.",
"okay": "Okay" "okay": "Okay"
}, },
"not-found-datasource": {
"body": "Maybe you mistyped the URL or the plugin with the id <1></1> is unavailable.<3></3>To see a list of available datasources please <5>click here</5>."
},
"search": { "search": {
"aria-label-search-all": "Search all", "aria-label-search-all": "Search all",
"placeholder": "Search all" "placeholder": "Search all"
@@ -2508,6 +2539,11 @@
"type-tooltip": "The type of transformation that will be applied to the source data." "type-tooltip": "The type of transformation that will be applied to the source data."
} }
}, },
"dashbaord-scene": {
"interval-variable-form": {
"description-auto-option": "Dynamically calculates interval by dividing time range by the count specified"
}
},
"dashboard": { "dashboard": {
"actions": { "actions": {
"open-settings": "Settings" "open-settings": "Settings"
@@ -3278,6 +3314,7 @@
"delete": "Delete", "delete": "Delete",
"description-color-annotation-event-markers": "Color to use for the annotation event markers", "description-color-annotation-event-markers": "Color to use for the annotation event markers",
"description-enabled-annotation-query-issued-every-dashboard": "When enabled the annotation query is issued every dashboard refresh", "description-enabled-annotation-query-issued-every-dashboard": "When enabled the annotation query is issued every dashboard refresh",
"description-hidden": "Annotation queries can be toggled on or off at the top of the dashboard. With this option checked this toggle will be hidden.",
"label-color": "Color", "label-color": "Color",
"label-data-source": "Data source", "label-data-source": "Data source",
"label-enabled": "Enabled", "label-enabled": "Enabled",
@@ -3290,6 +3327,7 @@
}, },
"annotation-settings-list": { "annotation-settings-list": {
"data-source": "Data source", "data-source": "Data source",
"delete-aria-label": "Delete query with title \"{{title}}\"",
"new-query": "New query", "new-query": "New query",
"query-name": "Query name", "query-name": "Query name",
"tooltip-move-down": "Move down", "tooltip-move-down": "Move down",
@@ -3329,6 +3367,7 @@
"placeholder-open-dashboard": "Open dashboard" "placeholder-open-dashboard": "Open dashboard"
}, },
"dashboard-link-list": { "dashboard-link-list": {
"delete-aria-label": "Delete link with title \"{{title}}\"",
"info": "Info", "info": "Info",
"new-link": "New link", "new-link": "New link",
"tooltip-copy-link": "Copy link", "tooltip-copy-link": "Copy link",
@@ -3369,6 +3408,10 @@
}, },
"help-wizard": { "help-wizard": {
"copy-to-clipboard": "Copy to clipboard", "copy-to-clipboard": "Copy to clipboard",
"description-randomize-data": "Modify the original data to hide sensitive information. Note the lengths will stay the same, and duplicate values will be equal.",
"description-support-snapshot": "Panel: {{panelTitle}}",
"download-dashboard": "Dashboard ({{snapshotSize}})",
"download-snapshot": "Download ({{snapshotSize}})",
"label-randomize-data": "Randomize data", "label-randomize-data": "Randomize data",
"label-support-snapshot": "Support snapshot", "label-support-snapshot": "Support snapshot",
"label-template": "Template", "label-template": "Template",
@@ -3376,7 +3419,9 @@
"randomize-labels-label-labels": "Labels", "randomize-labels-label-labels": "Labels",
"randomize-string-values-label-string-values": "String values", "randomize-string-values-label-string-values": "String values",
"title-complete-git-hub-comment-clipboard": "Copy a complete GitHub comment to the clipboard", "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" "title-get-help-with-this-panel": "Get help with this panel",
"troubleshooting-docs": "Troubleshooting docs",
"troubleshooting-request-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."
}, },
"inspect-data-tab": { "inspect-data-tab": {
"no-data-found": "No data found" "no-data-found": "No data found"
@@ -3386,6 +3431,7 @@
}, },
"interval-variable-form": { "interval-variable-form": {
"description-calculated-value-below-threshold": "The calculated value will not go below this threshold", "description-calculated-value-below-threshold": "The calculated value will not go below this threshold",
"description-step-count": "How many times the current time range should be divided to calculate the value",
"interval-options": "Interval options" "interval-options": "Interval options"
}, },
"json-model-edit-view": { "json-model-edit-view": {
@@ -3393,6 +3439,7 @@
"cancel": "Cancel" "cancel": "Cancel"
}, },
"render-save-button-and-error": { "render-save-button-and-error": {
"body-plugin-dashboard": "Your changes will be lost when you update the plugin. Use <1>Save as</1> to create custom version.",
"title-failed-to-save-dashboard": "Failed to save dashboard", "title-failed-to-save-dashboard": "Failed to save dashboard",
"title-plugin-dashboard": "Plugin dashboard", "title-plugin-dashboard": "Plugin dashboard",
"title-someone-else-has-updated-this-dashboard": "Someone else has updated this dashboard", "title-someone-else-has-updated-this-dashboard": "Someone else has updated this dashboard",
@@ -3400,6 +3447,7 @@
} }
}, },
"name-already-exists-error": { "name-already-exists-error": {
"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" "title-name-already-exists": "Name already exists"
}, },
"panel-data-alerting-tab-rendered": { "panel-data-alerting-tab-rendered": {
@@ -3410,7 +3458,8 @@
"title-dashboard-not-saved": "Dashboard not saved" "title-dashboard-not-saved": "Dashboard not saved"
}, },
"panel-data-queries-tab-rendered": { "panel-data-queries-tab-rendered": {
"add-query": "Add query" "add-query": "Add query",
"expression": "Expression "
}, },
"panel-data-transformations-tab-rendered": { "panel-data-transformations-tab-rendered": {
"add-another-transformation": "Add another transformation", "add-another-transformation": "Add another transformation",
@@ -3421,7 +3470,12 @@
"table-view-aria-label-toggletableview": "Toggle table view", "table-view-aria-label-toggletableview": "Toggle table view",
"table-view-label-table-view": "Table view" "table-view-label-table-view": "Table view"
}, },
"panel-editor-renderer": {
"aria-label-open-options-pane": "Open options pane",
"tooltip-open-options-pane": "Open options pane"
},
"panel-inspect-renderer": { "panel-inspect-renderer": {
"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" "title-panel-plugin-not-loaded": "Panel plugin not loaded"
}, },
"panel-viz-type-picker": { "panel-viz-type-picker": {
@@ -3461,14 +3515,22 @@
"title-failed-to-save-dashboard": "Failed to save dashboard" "title-failed-to-save-dashboard": "Failed to save dashboard"
} }
}, },
"save-dashboard-drawer": {
"tabs": {
"label-changes": "Changes",
"label-details": "Details"
}
},
"save-dashboard-form": { "save-dashboard-form": {
"aria-label-message": "message", "aria-label-message": "message",
"body-dashboard-drastically-changed": "Because you're using new dashboards features only supported on new Grafana dashboard schema format, the dashboard will be saved in the new format. Please make sure you want to perform this action or you prefer to save the dashboard as a new copy.",
"cancel-button": { "cancel-button": {
"cancel": "Cancel" "cancel": "Cancel"
}, },
"label-message": "Message", "label-message": "Message",
"placeholder-describe-changes-optional": "Add a note to describe your changes (optional).", "placeholder-describe-changes-optional": "Add a note to describe your changes (optional).",
"render-footer": { "render-footer": {
"body-plugin-dashboard": "Your changes will be lost when you update the plugin. Use <1>Save as</1> to create custom version.",
"no-changes-to-save": "No changes to save", "no-changes-to-save": "No changes to save",
"title-failed-to-save-dashboard": "Failed to save dashboard", "title-failed-to-save-dashboard": "Failed to save dashboard",
"title-plugin-dashboard": "Plugin dashboard", "title-plugin-dashboard": "Plugin dashboard",
@@ -3480,6 +3542,7 @@
"save-dashboard-form-common-options": { "save-dashboard-form-common-options": {
"save-refresh-description-current-refresh-default": "Will make the current refresh the new default", "save-refresh-description-current-refresh-default": "Will make the current refresh the new default",
"save-refresh-label-update-default-refresh-value": "Update default refresh value", "save-refresh-label-update-default-refresh-value": "Update default refresh value",
"save-timerange-description-current-range-default": "Will make current time range the new default",
"save-timerange-label-update-default-time-range": "Update default time range", "save-timerange-label-update-default-time-range": "Update default time range",
"save-variables-description-current-values-default": "Will make the current values the new default", "save-variables-description-current-values-default": "Will make the current values the new default",
"save-variables-label-update-default-variable-values": "Update default variable values" "save-variables-label-update-default-variable-values": "Update default variable values"
@@ -3517,6 +3580,7 @@
"title-validation-failed": "Dashboard title validation failed." "title-validation-failed": "Dashboard title validation failed."
}, },
"scenes-new-rule-from-panel-button": { "scenes-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", "new-alert-rule": "New alert rule",
"title-no-alerting-capable-query-found": "No alerting capable query found" "title-no-alerting-capable-query-found": "No alerting capable query found"
}, },
@@ -3580,6 +3644,7 @@
"label-show-on-dashboard": "Show on dashboard" "label-show-on-dashboard": "Show on dashboard"
}, },
"variable-usages-button": { "variable-usages-button": {
"title-show-usages": "Showing usages for: {{variableId}}",
"tooltip-show-usages": "Show usages" "tooltip-show-usages": "Show usages"
}, },
"variable-values-preview": { "variable-values-preview": {
@@ -3594,6 +3659,7 @@
"tooltip-reset-version": "Reset version" "tooltip-reset-version": "Reset version"
}, },
"version-history-table": { "version-history-table": {
"aria-label-toggle-selection": "Toggle selection of version {{version}}",
"date": "Date", "date": "Date",
"notes": "Notes", "notes": "Notes",
"restore": "Restore", "restore": "Restore",
@@ -3608,10 +3674,17 @@
"aria-label-change-visualization": "Change visualization", "aria-label-change-visualization": "Change visualization",
"tooltip-click-to-change-visualization": "Click to change visualization" "tooltip-click-to-change-visualization": "Click to change visualization"
}, },
"viz-and-data-pane": {
"aria-label-open-query-pane": "Open query pane",
"tooltip-open-query-pane": "Open query pane"
},
"viz-panel-links-renderer": { "viz-panel-links-renderer": {
"aria-label-panel-links": "Panel links" "aria-label-panel-links": "Panel links"
} }
}, },
"dashboard-scene-help-wizard": {
"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>."
},
"dashboard-settings": { "dashboard-settings": {
"annotations": { "annotations": {
"title": "Annotations" "title": "Annotations"
@@ -6652,6 +6725,7 @@
"email-share-type-option-label": "Only specified people", "email-share-type-option-label": "Only specified people",
"pause-sharing-dashboard-label": "Pause sharing dashboard", "pause-sharing-dashboard-label": "Pause sharing dashboard",
"public-share-type-option-label": "Anyone with a link", "public-share-type-option-label": "Anyone with a link",
"revoke-body": "Are you sure you want to revoke this URL? The dashboard will no longer be public.",
"revoke-public-URL-button": "Revoke public URL", "revoke-public-URL-button": "Revoke public URL",
"revoke-public-URL-button-title": "Revoke public URL", "revoke-public-URL-button-title": "Revoke public URL",
"settings-title": "Settings" "settings-title": "Settings"