diff --git a/.betterer.results b/.betterer.results index bf13ad71e29..1faa18d7dd4 100644 --- a/.betterer.results +++ b/.betterer.results @@ -794,50 +794,12 @@ exports[`better eslint`] = { [0, 0, 0, "Do not re-export imported variable (\`notifyApp\`)", "2"], [0, 0, 0, "Do not re-export imported variable (\`hideAppNotification\`)", "3"] ], - "public/app/core/components/AccessControl/PermissionListItem.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], "public/app/core/components/AccessControl/index.ts:5381": [ [0, 0, 0, "Do not use export all (\`export * from ...\`)", "0"] ], - "public/app/core/components/AppChrome/AppChrome.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], - "public/app/core/components/AppChrome/TopBar/SignInLink.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], - "public/app/core/components/AppChrome/TopBar/TopSearchBarCommandPaletteTrigger.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], - "public/app/core/components/AppNotifications/AppNotificationItem.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], "public/app/core/components/DynamicImports/SafeDynamicImport.tsx:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], - "public/app/core/components/EmptyListCTA/EmptyListCTA.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], - "public/app/core/components/FolderFilter/FolderFilter.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], - "public/app/core/components/ForgottenPassword/ChangePassword.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] - ], - "public/app/core/components/ForgottenPassword/ForgottenPassword.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"] - ], - "public/app/core/components/FormPrompt/FormPrompt.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] - ], "public/app/core/components/GraphNG/GraphNG.tsx:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Do not use any type assertions.", "1"], @@ -849,79 +811,14 @@ exports[`better eslint`] = { "public/app/core/components/LocalStorageValueProvider/index.tsx:5381": [ [0, 0, 0, "Do not re-export imported variable (\`./LocalStorageValueProvider\`)", "0"] ], - "public/app/core/components/Login/LoginLayout.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], - "public/app/core/components/Login/LoginServiceButtons.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], - "public/app/core/components/NestedFolderPicker/NestedFolderList.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], - "public/app/core/components/PageNotFound/EntityNotFound.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] - ], - "public/app/core/components/PanelTypeFilter/PanelTypeFilter.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], - "public/app/core/components/PluginHelp/PluginHelp.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] - ], - "public/app/core/components/RolePicker/BuiltinRoleSelector.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], - "public/app/core/components/RolePicker/RolePickerInput.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], - "public/app/core/components/RolePicker/RolePickerMenu.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] - ], - "public/app/core/components/RolePicker/RolePickerSubMenu.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], - "public/app/core/components/Select/OldFolderPicker.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], - "public/app/core/components/Signup/SignupPage.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] - ], - "public/app/core/components/Signup/VerifyEmail.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] - ], "public/app/core/components/TagFilter/TagFilter.tsx:5381": [ - [0, 0, 0, "Unexpected any. Specify a different type.", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] + [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], "public/app/core/components/TimeSeries/utils.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Do not use any type assertions.", "1"], [0, 0, 0, "Unexpected any. Specify a different type.", "2"] ], - "public/app/core/components/Upgrade/UpgradeBox.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"] - ], - "public/app/core/components/help/HelpModal.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] - ], "public/app/core/config.ts:5381": [ [0, 0, 0, "Do not re-export imported variable (\`config\`)", "0"], [0, 0, 0, "Do not re-export imported variable (\`Settings\`)", "1"] @@ -936,15 +833,6 @@ exports[`better eslint`] = { [0, 0, 0, "Do not re-export imported variable (\`TimeSeries\`)", "6"], [0, 0, 0, "Do not re-export imported variable (\`updateLegendValues\`)", "7"] ], - "public/app/core/navigation/GrafanaRouteError.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] - ], - "public/app/core/navigation/RouterDebugger.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] - ], "public/app/core/navigation/types.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], @@ -1035,161 +923,18 @@ exports[`better eslint`] = { [0, 0, 0, "Do not use any type assertions.", "0"], [0, 0, 0, "Do not use any type assertions.", "1"] ], - "public/app/features/actions/ActionEditorModalContent.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] - ], - "public/app/features/actions/ActionsInlineEditor.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] - ], "public/app/features/actions/ParamsEditor.tsx:5381": [ [0, 0, 0, "Do not use any type assertions.", "0"] ], - "public/app/features/admin/AdminEditOrgPage.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] - ], - "public/app/features/admin/AdminFeatureTogglesPage.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] - ], "public/app/features/admin/AdminFeatureTogglesTable.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] ], - "public/app/features/admin/AdminListOrgsPage.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], - "public/app/features/admin/AdminOrgsTable.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] - ], - "public/app/features/admin/AdminSettings.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], - "public/app/features/admin/ServerStats.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"] - ], "public/app/features/admin/UpgradePage.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "6"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "7"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "8"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "9"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "10"] - ], - "public/app/features/admin/UserCreatePage.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], - "public/app/features/admin/UserLdapSyncInfo.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "6"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "7"] - ], - "public/app/features/admin/UserListAdminPage.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], - "public/app/features/admin/UserListPublicDashboardPage/DashboardsListModalButton.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], - "public/app/features/admin/UserListPublicDashboardPage/UserListPublicDashboardPage.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], - "public/app/features/admin/UserOrgs.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "6"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "7"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "8"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "9"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "10"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "11"] - ], - "public/app/features/admin/UserPermissions.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] - ], - "public/app/features/admin/UserProfile.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"] - ], - "public/app/features/admin/UserSessions.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "4"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "5"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "6"] - ], - "public/app/features/admin/Users/AnonUsersTable.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], - "public/app/features/admin/Users/OrgUsersTable.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "3"] - ], - "public/app/features/admin/Users/UsersTable.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] ], - "public/app/features/admin/ldap/LdapConnectionStatus.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] - ], - "public/app/features/admin/ldap/LdapPage.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"] - ], - "public/app/features/admin/ldap/LdapSyncInfo.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], - "public/app/features/admin/ldap/LdapUserGroups.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], - "public/app/features/admin/ldap/LdapUserInfo.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"] - ], - "public/app/features/admin/ldap/LdapUserPermissions.tsx:5381": [ - [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "1"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "2"] - ], "public/app/features/alerting/routes.tsx:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"] ], diff --git a/public/app/core/components/AccessControl/PermissionListItem.tsx b/public/app/core/components/AccessControl/PermissionListItem.tsx index 2409dc0560a..84a0a9244bb 100644 --- a/public/app/core/components/AccessControl/PermissionListItem.tsx +++ b/public/app/core/components/AccessControl/PermissionListItem.tsx @@ -2,6 +2,7 @@ import { css } from '@emotion/css'; import { GrafanaTheme2 } from '@grafana/data'; import { Box, Button, Icon, Select, Tooltip, useStyles2 } from '@grafana/ui'; +import { Trans } from 'app/core/internationalization'; import { ResourcePermission } from './types'; @@ -20,7 +21,13 @@ export const PermissionListItem = ({ item, permissionLevels, canSet, onRemove, o {getAvatar(item)} {getDescription(item)} - {item.isInherited && Inherited from folder} + + {item.isInherited && ( + + Inherited from folder + + )} + { - + - Back to login + Back to login diff --git a/public/app/core/components/Signup/VerifyEmail.tsx b/public/app/core/components/Signup/VerifyEmail.tsx index 9e6ce9577c7..fd1c642c997 100644 --- a/public/app/core/components/Signup/VerifyEmail.tsx +++ b/public/app/core/components/Signup/VerifyEmail.tsx @@ -5,6 +5,7 @@ import { getBackendSrv } from '@grafana/runtime'; import { Field, Input, Button, Legend, Container, LinkButton, Stack } from '@grafana/ui'; import { getConfig } from 'app/core/config'; import { useAppNotification } from 'app/core/copy/appNotification'; +import { Trans } from 'app/core/internationalization'; import { w3cStandardEmailValidator } from 'app/features/admin/utils'; interface EmailDTO { @@ -35,10 +36,14 @@ export const VerifyEmail = () => { if (emailSent) { return (
-

An email with a verification link has been sent to the email address. You should receive it shortly.

+

+ + An email with a verification link has been sent to the email address. You should receive it shortly. + +

- Complete Signup + Complete signup
); @@ -46,7 +51,9 @@ export const VerifyEmail = () => { return (
- Verify Email + + Verify email + { /> - + - Back to login + Back to login
diff --git a/public/app/core/components/Signup/VerifyEmailPage.test.tsx b/public/app/core/components/Signup/VerifyEmailPage.test.tsx index 24f62c19d78..f29ec8decbf 100644 --- a/public/app/core/components/Signup/VerifyEmailPage.test.tsx +++ b/public/app/core/components/Signup/VerifyEmailPage.test.tsx @@ -28,7 +28,7 @@ jest.mock('@grafana/runtime', () => ({ describe('VerifyEmail Page', () => { it('renders correctly', () => { render(); - expect(screen.getByText('Verify Email')).toBeInTheDocument(); + expect(screen.getByText('Verify email')).toBeInTheDocument(); expect(screen.getByRole('textbox', { name: /Email/i })).toBeInTheDocument(); expect(screen.getByRole('button', { name: 'Send verification email' })).toBeInTheDocument(); @@ -60,7 +60,7 @@ describe('VerifyEmail Page', () => { email: 'test@gmail.com', }) ); - expect(screen.getByRole('link', { name: 'Complete Signup' })).toBeInTheDocument(); - expect(screen.getByRole('link', { name: 'Complete Signup' })).toHaveAttribute('href', '/signup'); + expect(screen.getByRole('link', { name: 'Complete signup' })).toBeInTheDocument(); + expect(screen.getByRole('link', { name: 'Complete signup' })).toHaveAttribute('href', '/signup'); }); }); diff --git a/public/app/core/components/TagFilter/TagFilter.tsx b/public/app/core/components/TagFilter/TagFilter.tsx index f7afcc9387d..c75b7349c17 100644 --- a/public/app/core/components/TagFilter/TagFilter.tsx +++ b/public/app/core/components/TagFilter/TagFilter.tsx @@ -4,7 +4,7 @@ import { components, MultiValueRemoveProps } from 'react-select'; import { escapeStringForRegex, GrafanaTheme2, SelectableValue } from '@grafana/data'; import { Icon, MultiSelect, useStyles2 } from '@grafana/ui'; -import { t } from 'app/core/internationalization'; +import { t, Trans } from 'app/core/internationalization'; import { TagBadge, getStyles as getTagBadgeStyles } from './TagBadge'; import { TagOption, TagSelectOption } from './TagOption'; @@ -156,7 +156,7 @@ export const TagFilter = ({
{isClearable && tags.length > 0 && ( )} } aria-label="Tag filter" /> diff --git a/public/app/core/components/Upgrade/UpgradeBox.tsx b/public/app/core/components/Upgrade/UpgradeBox.tsx index 9f655eea77d..3d76687035d 100644 --- a/public/app/core/components/Upgrade/UpgradeBox.tsx +++ b/public/app/core/components/Upgrade/UpgradeBox.tsx @@ -4,6 +4,7 @@ import { HTMLAttributes, useEffect } from 'react'; import { GrafanaTheme2 } from '@grafana/data'; import { reportExperimentView } from '@grafana/runtime/src'; import { Button, Icon, LinkButton, useStyles2 } from '@grafana/ui'; +import { t, Trans } from 'app/core/internationalization'; type ComponentSize = 'sm' | 'md'; @@ -36,7 +37,11 @@ export const UpgradeBox = ({

- You’ve discovered a Pro feature! {text || `Get the Grafana Pro plan to access ${featureName}.`} + You’ve discovered a Pro feature!{' '} + {text || + t('upgrade-box.discovery-text-continued', 'Get the Grafana Pro plan to access {{featureName}}.', { + featureName, + })}

- Upgrade + Upgrade
@@ -130,7 +135,9 @@ export const UpgradeContent = ({ return (
-

Get started with {featureName}

+

+ Get started with {{ featureName }} +

{description &&
{description}
}
    {listItems.map((item, index) => ( @@ -151,7 +158,7 @@ export const UpgradeContent = ({ )} {featureUrl && ( - Learn more + Learn more )}
@@ -221,10 +228,12 @@ export const UpgradeContentVertical = ({ const styles = useStyles2(getContentVerticalStyles); return (
-

Get started with {featureName}

+

+ Get started with {{ featureName }} +

{description &&
{description}
} - Learn more + Learn more
{'Feature diff --git a/public/app/core/components/help/HelpModal.tsx b/public/app/core/components/help/HelpModal.tsx index 7f363828420..a86afc947c0 100644 --- a/public/app/core/components/help/HelpModal.tsx +++ b/public/app/core/components/help/HelpModal.tsx @@ -3,7 +3,7 @@ import { useMemo } from 'react'; import { GrafanaTheme2 } from '@grafana/data'; import { Grid, Modal, useStyles2, Text } from '@grafana/ui'; -import { t } from 'app/core/internationalization'; +import { t, Trans } from 'app/core/internationalization'; import { getModKey } from 'app/core/utils/browser'; const getShortcuts = (modKey: string) => { @@ -165,8 +165,12 @@ export const HelpModal = ({ onDismiss }: HelpModalProps): JSX.Element => { - Keys - Description + + Keys + + + Description + diff --git a/public/app/core/navigation/GrafanaRouteError.tsx b/public/app/core/navigation/GrafanaRouteError.tsx index 7c3650eaec7..bc45925cd0b 100644 --- a/public/app/core/navigation/GrafanaRouteError.tsx +++ b/public/app/core/navigation/GrafanaRouteError.tsx @@ -6,6 +6,7 @@ import { GrafanaTheme2, locationUtil, PageLayoutType } from '@grafana/data'; import { Button, ErrorWithStack, useStyles2 } from '@grafana/ui'; import { Page } from '../components/Page/Page'; +import { Trans } from '../internationalization'; interface Props { error: Error | null; @@ -31,12 +32,18 @@ export function GrafanaRouteError({ error, errorInfo }: Props) {
{isChunkLoadingError && (
-

Unable to find application file

+

+ Unable to find application file +


-

Grafana has likely been updated. Please try reloading the page.

+

+ + Grafana has likely been updated. Please try reloading the page. + +


diff --git a/public/app/core/navigation/RouterDebugger.tsx b/public/app/core/navigation/RouterDebugger.tsx deleted file mode 100644 index f1e165edc8b..00000000000 --- a/public/app/core/navigation/RouterDebugger.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { Link } from 'react-router-dom-v5-compat'; - -import { getAppRoutes } from '../../routes/routes'; -import { PageContents } from '../components/Page/PageContents'; - -import { RouteDescriptor } from './types'; - -export const RouterDebugger = () => { - const manualRoutes: RouteDescriptor[] = []; - return ( - -

Static routes

-
    - {getAppRoutes().map((r, i) => { - if (r.path.indexOf(':') > -1 || r.path.indexOf('test') > -1) { - if (r.path.indexOf('test') === -1) { - manualRoutes.push(r); - } - return null; - } - - return ( -
  • - - {r.path} - -
  • - ); - })} -
- -

Dynamic routes - check those manually

-
    - {manualRoutes.map((r, i) => { - return ( -
  • - - {r.path} - -
  • - ); - })} -
-
- ); -}; diff --git a/public/app/features/actions/ActionEditorModalContent.tsx b/public/app/features/actions/ActionEditorModalContent.tsx index 21fa3eeaff0..54de7277d61 100644 --- a/public/app/features/actions/ActionEditorModalContent.tsx +++ b/public/app/features/actions/ActionEditorModalContent.tsx @@ -3,6 +3,7 @@ import { useState } from 'react'; import { Action, DataFrame, VariableSuggestion } from '@grafana/data'; import { Button } from '@grafana/ui/src/components/Button'; import { Modal } from '@grafana/ui/src/components/Modal/Modal'; +import { Trans } from 'app/core/internationalization'; import { ActionEditor } from './ActionEditor'; @@ -36,7 +37,7 @@ export const ActionEditorModalContent = ({ /> diff --git a/public/app/features/actions/ActionsInlineEditor.tsx b/public/app/features/actions/ActionsInlineEditor.tsx index 356fb4a2410..b392725f16c 100644 --- a/public/app/features/actions/ActionsInlineEditor.tsx +++ b/public/app/features/actions/ActionsInlineEditor.tsx @@ -7,6 +7,7 @@ import { Action, DataFrame, GrafanaTheme2, defaultActionConfig, VariableSuggesti import { Button } from '@grafana/ui/src/components/Button'; import { Modal } from '@grafana/ui/src/components/Modal/Modal'; import { useStyles2 } from '@grafana/ui/src/themes'; +import { Trans } from 'app/core/internationalization'; import { ActionEditorModalContent } from './ActionEditorModalContent'; import { ActionListItem } from './ActionsListItem'; @@ -95,7 +96,9 @@ export const ActionsInlineEditor = ({ {/* one-link placeholder */} {showOneClick && actionsSafe.length > 0 && (
- One-click link + + One-click link +
)} @@ -151,7 +154,7 @@ export const ActionsInlineEditor = ({ )}
); diff --git a/public/app/features/admin/AdminEditOrgPage.tsx b/public/app/features/admin/AdminEditOrgPage.tsx index c557c3a8507..815b96815c8 100644 --- a/public/app/features/admin/AdminEditOrgPage.tsx +++ b/public/app/features/admin/AdminEditOrgPage.tsx @@ -7,6 +7,7 @@ import { NavModelItem } from '@grafana/data'; import { Field, Input, Button, Legend, Alert } from '@grafana/ui'; import { Page } from 'app/core/components/Page/Page'; import { contextSrv } from 'app/core/core'; +import { Trans } from 'app/core/internationalization'; import { OrgUser, AccessControlAction, OrgRole } from 'app/types'; import { OrgUsersTable } from './Users/OrgUsersTable'; @@ -56,8 +57,10 @@ const AdminEditOrgPage = () => { const renderMissingPermissionMessage = () => ( - You do not have permission to see users in this organization. To update this organization, contact your server - administrator. + + You do not have permission to see users in this organization. To update this organization, contact your server + administrator. + ); @@ -85,7 +88,9 @@ const AdminEditOrgPage = () => { <> - Edit organization + + Edit Organization + {orgState.value && (
@@ -96,13 +101,15 @@ const AdminEditOrgPage = () => { />
)}
- Organization users + + Organization users + {!canReadUsers && renderMissingPermissionMessage()} {canReadUsers && !!users.length && ( - View and edit feature toggles. Read more about feature toggles at{' '} - - grafana.com - - . + + View and edit feature toggles. Read more about feature toggles at{' '} + + grafana.com + + . +
); diff --git a/public/app/features/admin/AdminListOrgsPage.tsx b/public/app/features/admin/AdminListOrgsPage.tsx index f5fe2fe7fd4..a919ad04aeb 100644 --- a/public/app/features/admin/AdminListOrgsPage.tsx +++ b/public/app/features/admin/AdminListOrgsPage.tsx @@ -4,6 +4,7 @@ import useAsyncFn from 'react-use/lib/useAsyncFn'; import { getBackendSrv, isFetchError } from '@grafana/runtime'; import { LinkButton } from '@grafana/ui'; import { Page } from 'app/core/components/Page/Page'; +import { Trans } from 'app/core/internationalization'; import { contextSrv } from 'app/core/services/context_srv'; import { AccessControlAction, Organization } from 'app/types'; @@ -34,7 +35,7 @@ export default function AdminListOrgsPages() { navId="global-orgs" actions={ - New org + New org } > diff --git a/public/app/features/admin/AdminOrgsTable.tsx b/public/app/features/admin/AdminOrgsTable.tsx index 6c99f023609..19d5a26c877 100644 --- a/public/app/features/admin/AdminOrgsTable.tsx +++ b/public/app/features/admin/AdminOrgsTable.tsx @@ -6,6 +6,7 @@ import { GrafanaTheme2 } from '@grafana/data'; import { Button, ConfirmModal, useStyles2 } from '@grafana/ui'; import { SkeletonComponent, attachSkeleton } from '@grafana/ui/src/unstable'; import { contextSrv } from 'app/core/core'; +import { Trans } from 'app/core/internationalization'; import { AccessControlAction, Organization } from 'app/types'; interface Props { @@ -16,8 +17,12 @@ interface Props { const getTableHeader = () => ( - ID - Name + + ID + + + Name + @@ -27,6 +32,7 @@ function AdminOrgsTableComponent({ orgs, onDelete }: Props) { const canDeleteOrgs = contextSrv.hasPermission(AccessControlAction.OrgsDelete); const [deleteOrg, setDeleteOrg] = useState(); + const deleteOrgName = deleteOrg?.name; return ( {getTableHeader()} @@ -59,8 +65,10 @@ function AdminOrgsTableComponent({ orgs, onDelete }: Props) { title="Delete" body={
- Are you sure you want to delete '{deleteOrg.name}'? -
All dashboards for this organization will be removed! + + Are you sure you want to delete '{{ deleteOrgName }}'? +
All dashboards for this organization will be removed! +
} confirmText="Delete" diff --git a/public/app/features/admin/AdminSettings.tsx b/public/app/features/admin/AdminSettings.tsx index ddad7b7993a..93917e06d65 100644 --- a/public/app/features/admin/AdminSettings.tsx +++ b/public/app/features/admin/AdminSettings.tsx @@ -3,6 +3,7 @@ import { useAsync } from 'react-use'; import { getBackendSrv } from '@grafana/runtime'; import { Alert } from '@grafana/ui'; import { Page } from 'app/core/components/Page/Page'; +import { Trans } from 'app/core/internationalization'; import { AdminSettingsTable } from './AdminSettingsTable'; @@ -15,8 +16,10 @@ function AdminSettings() { - These system settings are defined in grafana.ini or custom.ini (or overridden in ENV variables). To change - these you currently need to restart Grafana. + + These system settings are defined in grafana.ini or custom.ini (or overridden in ENV variables). To change + these you currently need to restart Grafana. + {loading && } diff --git a/public/app/features/admin/ServerStats.tsx b/public/app/features/admin/ServerStats.tsx index 9d0e0da9ae9..c2c9f35e454 100644 --- a/public/app/features/admin/ServerStats.tsx +++ b/public/app/features/admin/ServerStats.tsx @@ -4,6 +4,7 @@ import { useEffect, useState } from 'react'; import { GrafanaTheme2 } from '@grafana/data'; import { config, GrafanaBootConfig } from '@grafana/runtime'; import { LinkButton, useStyles2 } from '@grafana/ui'; +import { Trans } from 'app/core/internationalization'; import { AccessControlAction } from 'app/types'; import { contextSrv } from '../../core/services/context_srv'; @@ -34,9 +35,13 @@ export const ServerStats = () => { return ( <> -

Instance statistics

+

+ Instance statistics +

{!isLoading && !stats ? ( -

No stats found.

+

+ No stats found. +

) : (
{ ]} footer={ - Manage dashboards + Manage dashboards } /> @@ -61,7 +66,7 @@ export const ServerStats = () => { footer={ hasAccessToDataSources && ( - Manage data sources + Manage data sources ) } @@ -71,7 +76,7 @@ export const ServerStats = () => { content={[{ name: 'Alerts', value: stats?.alerts }]} footer={ - Manage alerts + Manage alerts } /> @@ -88,7 +93,7 @@ export const ServerStats = () => { footer={ hasAccessToAdminUsers && ( - Manage users + Manage users ) } diff --git a/public/app/features/admin/UpgradePage.tsx b/public/app/features/admin/UpgradePage.tsx index fe8a358b28e..2ba5d8476bc 100644 --- a/public/app/features/admin/UpgradePage.tsx +++ b/public/app/features/admin/UpgradePage.tsx @@ -5,6 +5,7 @@ import { connect } from 'react-redux'; import { GrafanaTheme2, NavModel } from '@grafana/data'; import { LinkButton, useStyles2 } from '@grafana/ui'; import { Page } from 'app/core/components/Page/Page'; +import { Trans } from 'app/core/internationalization'; import { getNavModel } from '../../core/selectors/navModel'; import { StoreState } from '../../types'; @@ -41,7 +42,9 @@ export const UpgradeInfo = ({ editionNotice }: UpgradeInfoProps) => { return ( <> -

Enterprise license

+

+ Enterprise license +

@@ -73,11 +76,15 @@ const getStyles = (theme: GrafanaTheme2) => { const GetEnterprise = () => { return (
-

Get Grafana Enterprise

+

+ Get Grafana Enterprise +

- You can use the trial version for free for 30 days. We will remind you about it five days before the trial - period ends. + + You can use the trial version for free for 30 days. We will remind you about it five days before the trial + period ends. +

); @@ -90,7 +97,7 @@ const CallToAction = () => { size="lg" href="https://grafana.com/contact?about=grafana-enterprise&utm_source=grafana-upgrade-page" > - Contact us and get a free trial + Contact us and get a free trial ); }; @@ -98,7 +105,9 @@ const CallToAction = () => { const ServiceInfo = () => { return (
-

At your service

+

+ At your service +

@@ -117,9 +126,13 @@ const ServiceInfo = () => {
- Also included: + + Also included: +
- Indemnification, working with Grafana Labs on future prioritization, and training from the core Grafana team. + + Indemnification, working with Grafana Labs on future prioritization, and training from the core Grafana team. +
@@ -130,7 +143,9 @@ const ServiceInfo = () => { const FeatureInfo = () => { return (
-

Enhanced functionality

+

+ Enhanced functionality +

); @@ -143,7 +158,9 @@ const FeatureListing = () => { - LDAP, GitHub OAuth, Auth Proxy, Okta + + LDAP, GitHub OAuth, Auth Proxy, Okta + diff --git a/public/app/features/admin/UserCreatePage.tsx b/public/app/features/admin/UserCreatePage.tsx index 7de79ff2d6b..b4f22b4c071 100644 --- a/public/app/features/admin/UserCreatePage.tsx +++ b/public/app/features/admin/UserCreatePage.tsx @@ -6,6 +6,7 @@ import { NavModelItem } from '@grafana/data'; import { getBackendSrv } from '@grafana/runtime'; import { Button, Input, Field } from '@grafana/ui'; import { Page } from 'app/core/components/Page/Page'; +import { Trans } from 'app/core/internationalization'; interface UserDTO { name: string; @@ -69,7 +70,9 @@ const UserCreatePage = () => { type="password" /> - + diff --git a/public/app/features/admin/UserLdapSyncInfo.tsx b/public/app/features/admin/UserLdapSyncInfo.tsx index f76ca72a5cd..36ddefdfb65 100644 --- a/public/app/features/admin/UserLdapSyncInfo.tsx +++ b/public/app/features/admin/UserLdapSyncInfo.tsx @@ -3,6 +3,7 @@ import { PureComponent } from 'react'; import { dateTimeFormat } from '@grafana/data'; import { Button, LinkButton } from '@grafana/ui'; import { contextSrv } from 'app/core/core'; +import { Trans } from 'app/core/internationalization'; import { AccessControlAction, SyncInfo, UserDTO } from 'app/types'; import { TagBadge } from '../../core/components/TagFilter/TagBadge'; @@ -33,30 +34,37 @@ export class UserLdapSyncInfo extends PureComponent { return ( <> -

LDAP Synchronisation

+

+ LDAP Synchronisation +

- - + + - {ldapSyncInfo.enabled ? ( - <> - - - - ) : ( - <> - - - - )} + +
External syncUser synced via LDAP. Some changes must be done in LDAP or mappings. + External sync + + + User synced via LDAP. Some changes must be done in LDAP or mappings. + +
Next scheduled synchronization{nextSyncTime}Next scheduled synchronizationNot enabled + Next scheduled synchronization + + {ldapSyncInfo.enabled ? ( + nextSyncTime + ) : ( + Not enabled + )} +
@@ -64,12 +72,12 @@ export class UserLdapSyncInfo extends PureComponent {
{canSyncLDAPUser && ( )} {canReadLDAPUser && ( - Debug LDAP Mapping + Debug LDAP Mapping )}
diff --git a/public/app/features/admin/UserListAdminPage.tsx b/public/app/features/admin/UserListAdminPage.tsx index 1456a8844f4..72f7aa49431 100644 --- a/public/app/features/admin/UserListAdminPage.tsx +++ b/public/app/features/admin/UserListAdminPage.tsx @@ -7,7 +7,7 @@ import { selectors as e2eSelectors } from '@grafana/e2e-selectors/src'; import { LinkButton, RadioButtonGroup, useStyles2, FilterInput, EmptyState } from '@grafana/ui'; import { Page } from 'app/core/components/Page/Page'; import { contextSrv } from 'app/core/core'; -import { t } from 'app/core/internationalization'; +import { t, Trans } from 'app/core/internationalization'; import { AccessControlAction, StoreState, UserFilter } from '../../types'; @@ -94,7 +94,7 @@ const UserListAdminPageUnConnected = ({ ))} {contextSrv.hasPermission(AccessControlAction.UsersCreate) && ( - New user + New user )}
diff --git a/public/app/features/admin/UserListPublicDashboardPage/DashboardsListModalButton.tsx b/public/app/features/admin/UserListPublicDashboardPage/DashboardsListModalButton.tsx index 2823105f1a1..62081fe419d 100644 --- a/public/app/features/admin/UserListPublicDashboardPage/DashboardsListModalButton.tsx +++ b/public/app/features/admin/UserListPublicDashboardPage/DashboardsListModalButton.tsx @@ -57,7 +57,7 @@ export const DashboardsListModal = ({ email, onDismiss }: { email: string; onDis )} - + {'•'} { {user.lastSeenAtAge} - {user.totalDashboards} dashboard(s) + + + {{ count: user.totalDashboards }} dashboards + + diff --git a/public/app/features/admin/UserOrgs.tsx b/public/app/features/admin/UserOrgs.tsx index 66ecda8c441..2e384aa51de 100644 --- a/public/app/features/admin/UserOrgs.tsx +++ b/public/app/features/admin/UserOrgs.tsx @@ -19,6 +19,7 @@ import { UserRolePicker } from 'app/core/components/RolePicker/UserRolePicker'; import { fetchRoleOptions, updateUserRoles } from 'app/core/components/RolePicker/api'; import { OrgPicker, OrgSelectItem } from 'app/core/components/Select/OrgPicker'; import { contextSrv } from 'app/core/core'; +import { t, Trans } from 'app/core/internationalization'; import { AccessControlAction, Organization, OrgRole, Role, UserDTO, UserOrg } from 'app/types'; import { OrgRolePicker } from './OrgRolePicker'; @@ -60,7 +61,9 @@ export class UserOrgs extends PureComponent { const canAddToOrg = contextSrv.hasPermission(AccessControlAction.OrgUsersAdd) && !isExternalUser; return (
-

Organizations

+

+ Organizations +

@@ -80,7 +83,7 @@ export class UserOrgs extends PureComponent {
{canAddToOrg && ( )}
@@ -242,7 +245,7 @@ class UnThemedOrgRow extends PureComponent { onCancel={this.onCancelClick} onConfirm={this.onOrgRemove} > - Remove from organization + {t('admin.user-orgs.remove-button', 'Remove from organization')} )} @@ -383,10 +386,10 @@ export class AddToOrgModal extends PureComponent @@ -438,17 +441,19 @@ export function ChangeOrgButton({ interactive={true} content={
- This user's role is not editable because it is synchronized from your auth provider. Refer to - the  - - Grafana authentication docs - -  for details. + + This user's role is not editable because it is synchronized from your auth provider. Refer to + the  + + Grafana authentication docs + +  for details. +
} > @@ -465,7 +470,7 @@ export function ChangeOrgButton({ onConfirm={onOrgRoleSave} disabled={isExternalUser} > - Change role + {t('admin.user-orgs.change-role-button', 'Change role')} )} @@ -486,17 +491,19 @@ export const ExternalUserTooltip = ({ lockMessage }: ExternalUserTooltipProps) = interactive={true} content={
- This user's built-in role is not editable because it is synchronized from your auth provider. Refer to - the  - - Grafana authentication docs - -  for details. + + This user's built-in role is not editable because it is synchronized from your auth provider. Refer + to the  + + Grafana authentication docs + +  for details. +
} > diff --git a/public/app/features/admin/UserPermissions.tsx b/public/app/features/admin/UserPermissions.tsx index 8b7d46970c0..0999b343453 100644 --- a/public/app/features/admin/UserPermissions.tsx +++ b/public/app/features/admin/UserPermissions.tsx @@ -4,6 +4,7 @@ import { useState } from 'react'; import { GrafanaTheme2 } from '@grafana/data'; import { ConfirmButton, RadioButtonGroup, Icon, useStyles2 } from '@grafana/ui'; import { contextSrv } from 'app/core/core'; +import { t, Trans } from 'app/core/internationalization'; import { ExternalUserTooltip } from 'app/features/admin/UserOrgs'; import { AccessControlAction } from 'app/types'; @@ -39,11 +40,15 @@ export function UserPermissions({ isGrafanaAdmin, isExternalUser, lockMessage, o return (
-

Permissions

+

+ Permissions +

- + {isEditing ? ( )} @@ -72,7 +77,7 @@ export function UserPermissions({ isGrafanaAdmin, isExternalUser, lockMessage, o onCancel={onCancelClick} confirmText="Change" > - Change + {t('admin.user-permissions.change-button', 'Change')} )} {isExternalUser && ( diff --git a/public/app/features/admin/UserProfile.tsx b/public/app/features/admin/UserProfile.tsx index f676c10ccac..2614bd794a0 100644 --- a/public/app/features/admin/UserProfile.tsx +++ b/public/app/features/admin/UserProfile.tsx @@ -4,6 +4,7 @@ import * as React from 'react'; import { Button, ConfirmButton, ConfirmModal, Input, LegacyInputStatus, Stack } from '@grafana/ui'; import { contextSrv } from 'app/core/core'; +import { t, Trans } from 'app/core/internationalization'; import { AccessControlAction, UserDTO } from 'app/types'; interface Props { @@ -82,7 +83,9 @@ export function UserProfile({ return (
-

User information

+

+ User information +

Grafana Admin + Grafana Admin + {isGrafanaAdmin ? ( <> - Yes + Yes ) : ( - <>No + No )}
@@ -124,7 +127,7 @@ export function UserProfile({ {canDelete && ( <> - Enable user + Enable user )} {!user.isDisabled && canDisable && ( <> - Edit + {t('admin.user-profile.edit-button', 'Edit')} diff --git a/public/app/features/admin/UserSessions.tsx b/public/app/features/admin/UserSessions.tsx index 1c6695a0488..6ed87f37ca0 100644 --- a/public/app/features/admin/UserSessions.tsx +++ b/public/app/features/admin/UserSessions.tsx @@ -3,7 +3,7 @@ import { createRef, PureComponent } from 'react'; import { ConfirmButton, ConfirmModal, Button, Stack } from '@grafana/ui'; import { TagBadge } from 'app/core/components/TagFilter/TagBadge'; import { contextSrv } from 'app/core/core'; -import { Trans } from 'app/core/internationalization'; +import { t, Trans } from 'app/core/internationalization'; import { formatDate } from 'app/core/internationalization/dates'; import { AccessControlAction, UserSession } from 'app/types'; @@ -53,16 +53,26 @@ class BaseUserSessions extends PureComponent { return (
-

Sessions

+

+ Sessions +

- - - - + + + + @@ -86,7 +96,7 @@ class BaseUserSessions extends PureComponent { confirmVariant="destructive" onConfirm={this.onSessionRevoke(session.id)} > - Force logout + {t('admin.user-sessions.force-logout-button', 'Force logout')} )} @@ -99,7 +109,7 @@ class BaseUserSessions extends PureComponent {
{canLogout && sessions.length > 0 && ( )} - No anonymous users found. + + No anonymous users found. + )} diff --git a/public/app/features/admin/Users/OrgUsersTable.tsx b/public/app/features/admin/Users/OrgUsersTable.tsx index 607d732bb12..2ae1d20872f 100644 --- a/public/app/features/admin/Users/OrgUsersTable.tsx +++ b/public/app/features/admin/Users/OrgUsersTable.tsx @@ -24,6 +24,7 @@ import { fetchRoleOptions, updateUserRoles } from 'app/core/components/RolePicke import { RolePickerBadges } from 'app/core/components/RolePickerDrawer/RolePickerBadges'; import { TagBadge } from 'app/core/components/TagFilter/TagBadge'; import { contextSrv } from 'app/core/core'; +import { Trans } from 'app/core/internationalization'; import { AccessControlAction, OrgUser, Role } from 'app/types'; import { OrgRolePicker } from '../OrgRolePicker'; @@ -113,7 +114,21 @@ export const OrgUsersTable = ({ id: 'lastSeenAtAge', header: 'Last active', cell: ({ cell: { value } }: Cell<'lastSeenAtAge'>) => { - return <>{value && <>{value === '10 years' ? Never : value}}; + return ( + <> + {value && ( + <> + {value === '10 years' ? ( + + Never + + ) : ( + value + )} + + )} + + ); }, sortType: (a, b) => new Date(a.original.lastSeenAt).getTime() - new Date(b.original.lastSeenAt).getTime(), }, @@ -170,18 +185,20 @@ export const OrgUsersTable = ({ interactive={true} content={
- This user's role is not editable because it is synchronized from your auth provider. Refer to - the  - - Grafana authentication docs - -  for details. + + This user's role is not editable because it is synchronized from your auth provider. Refer + to the  + + Grafana authentication docs + +  for details. +
} > diff --git a/public/app/features/admin/Users/UsersTable.tsx b/public/app/features/admin/Users/UsersTable.tsx index dd90bd46f1e..d8cd3bc2440 100644 --- a/public/app/features/admin/Users/UsersTable.tsx +++ b/public/app/features/admin/Users/UsersTable.tsx @@ -16,6 +16,7 @@ import { Tooltip, } from '@grafana/ui'; import { TagBadge } from 'app/core/components/TagFilter/TagBadge'; +import { Trans } from 'app/core/internationalization'; import { UserDTO } from 'app/types'; import { OrgUnits } from './OrgUnits'; @@ -101,10 +102,12 @@ export const UsersTable = ({ cell: ({ cell: { value } }: Cell<'licensedRole'>) => { return value === 'None' ? ( - Not assigned{' '} - - - + + Not assigned{' '} + + + + ) : ( value @@ -121,7 +124,21 @@ export const UsersTable = ({ iconName: 'question-circle', }, cell: ({ cell: { value } }: Cell<'lastSeenAtAge'>) => { - return <>{value && <>{value === '10 years' ? Never : value}}; + return ( + <> + {value && ( + <> + {value === '10 years' ? ( + + Never + + ) : ( + value + )} + + )} + + ); }, sortType: (a, b) => new Date(a.original.lastSeenAt!).getTime() - new Date(b.original.lastSeenAt!).getTime(), }, diff --git a/public/app/features/admin/ldap/LdapConnectionStatus.tsx b/public/app/features/admin/ldap/LdapConnectionStatus.tsx index 647688111f8..281013fe76b 100644 --- a/public/app/features/admin/ldap/LdapConnectionStatus.tsx +++ b/public/app/features/admin/ldap/LdapConnectionStatus.tsx @@ -1,6 +1,7 @@ import { useMemo } from 'react'; import { Alert, CellProps, Column, Icon, InteractiveTable, Stack, Text, Tooltip } from '@grafana/ui'; +import { Trans } from 'app/core/internationalization'; import { AppNotificationSeverity, LdapConnectionInfo, LdapServerInfo } from 'app/types'; interface Props { @@ -54,7 +55,7 @@ export const LdapConnectionStatus = ({ ldapConnectionInfo }: Props) => {
- LDAP Connection + LDAP Connection serverInfo.host + serverInfo.port} /> @@ -83,7 +84,7 @@ export const LdapErrorBox = ({ ldapConnectionInfo }: LdapConnectionErrorProps) = const errorElements = connectionErrors.map((info, index) => (
- {info.host}:{info.port} + {`${info.host}:${info.port}`}
{info.error} diff --git a/public/app/features/admin/ldap/LdapPage.tsx b/public/app/features/admin/ldap/LdapPage.tsx index d7eaade9b1a..7f8a2ee5f63 100644 --- a/public/app/features/admin/ldap/LdapPage.tsx +++ b/public/app/features/admin/ldap/LdapPage.tsx @@ -7,6 +7,7 @@ import { featureEnabled } from '@grafana/runtime'; import { Alert, Button, Field, Input, Stack } from '@grafana/ui'; import { Page } from 'app/core/components/Page/Page'; import { contextSrv } from 'app/core/core'; +import { Trans } from 'app/core/internationalization'; import { GrafanaRouteComponentProps } from 'app/core/navigation/types'; import { AppNotificationSeverity, @@ -118,7 +119,9 @@ export const LdapPage = ({ {canReadLDAPUser && (
-

Test user mapping

+

+ Test user mapping +

- Run + Run } /> diff --git a/public/app/features/admin/ldap/LdapSyncInfo.tsx b/public/app/features/admin/ldap/LdapSyncInfo.tsx index b51441d98e0..11c3001fc91 100644 --- a/public/app/features/admin/ldap/LdapSyncInfo.tsx +++ b/public/app/features/admin/ldap/LdapSyncInfo.tsx @@ -1,5 +1,6 @@ import { dateTimeFormat } from '@grafana/data'; import { InteractiveTable, Text } from '@grafana/ui'; +import { Trans } from 'app/core/internationalization'; import { SyncInfo } from 'app/types'; interface Props { @@ -29,7 +30,9 @@ export const LdapSyncInfo = ({ ldapSyncInfo }: Props) => { return (
- LDAP Synchronization + + LDAP Synchronization + sync.syncAttribute} />
); diff --git a/public/app/features/admin/ldap/LdapUserGroups.tsx b/public/app/features/admin/ldap/LdapUserGroups.tsx index b5e35ea6285..890ec4aee56 100644 --- a/public/app/features/admin/ldap/LdapUserGroups.tsx +++ b/public/app/features/admin/ldap/LdapUserGroups.tsx @@ -1,6 +1,7 @@ import { useMemo } from 'react'; import { Tooltip, Icon, InteractiveTable, type CellProps, Column } from '@grafana/ui'; +import { Trans } from 'app/core/internationalization'; import { LdapRole } from 'app/types'; interface Props { @@ -28,10 +29,12 @@ export const LdapUserGroups = ({ groups }: Props) => { cell: (props: CellProps) => props.value || ( <> - No match{' '} - - - + + No match{' '} + + + + ), }, diff --git a/public/app/features/admin/ldap/LdapUserInfo.tsx b/public/app/features/admin/ldap/LdapUserInfo.tsx index 115c41f78c0..5652594e8ca 100644 --- a/public/app/features/admin/ldap/LdapUserInfo.tsx +++ b/public/app/features/admin/ldap/LdapUserInfo.tsx @@ -1,4 +1,5 @@ import { Box, Stack, Text } from '@grafana/ui'; +import { Trans } from 'app/core/internationalization'; import { LdapUser } from 'app/types'; import { LdapUserGroups } from './LdapUserGroups'; @@ -21,7 +22,9 @@ export const LdapUserInfo = ({ ldapUser }: Props) => { ) : ( - No teams found via LDAP + + No teams found via LDAP + )} diff --git a/public/app/features/admin/ldap/LdapUserPermissions.tsx b/public/app/features/admin/ldap/LdapUserPermissions.tsx index 96071801be9..9a851ecc1c5 100644 --- a/public/app/features/admin/ldap/LdapUserPermissions.tsx +++ b/public/app/features/admin/ldap/LdapUserPermissions.tsx @@ -2,6 +2,7 @@ import { useMemo } from 'react'; import * as React from 'react'; import { Column, Icon, InteractiveTable } from '@grafana/ui'; +import { Trans } from 'app/core/internationalization'; import { LdapPermissions } from 'app/types'; interface Props { @@ -33,9 +34,9 @@ export const LdapUserPermissions = ({ permissions }: Props) => { { permission: 'Grafana admin', value: permissions.isGrafanaAdmin ? ( - <> + Yes - + ) : ( 'No' ), @@ -43,13 +44,13 @@ export const LdapUserPermissions = ({ permissions }: Props) => { { permission: 'Status', value: permissions.isDisabled ? ( - <> + Inactive - + ) : ( - <> + Active - + ), }, ], diff --git a/public/locales/en-US/grafana.json b/public/locales/en-US/grafana.json index e2fb153b789..a4cd22a86c6 100644 --- a/public/locales/en-US/grafana.json +++ b/public/locales/en-US/grafana.json @@ -14,6 +14,9 @@ "permission-list": { "permission": "Permission" }, + "permission-list-item": { + "inherited": "Inherited from folder" + }, "permissions": { "add-label": "Add a permission", "no-permissions": "There are no permissions", @@ -25,6 +28,143 @@ "user": "User" } }, + "action-editor": { + "modal": { + "cancel-button": "Cancel", + "save-button": "Save" + } + }, + "actions-editor": { + "inline": { + "add-button": "Add action", + "one-click-link": "One-click link" + } + }, + "admin": { + "anon-users": { + "not-found": "No anonymous users found." + }, + "edit-org": { + "access-denied": "You do not have permission to see users in this organization. To update this organization, contact your server administrator.", + "heading": "Edit Organization", + "update-button": "Update", + "users-heading": "Organization users" + }, + "feature-toggles": { + "sub-title": "View and edit feature toggles. Read more about feature toggles at <2>grafana.com." + }, + "get-enterprise": { + "contact-us": "Contact us and get a free trial", + "description": "You can use the trial version for free for 30 days. We will remind you about it five days before the trial period ends.", + "features-heading": "Enhanced functionality", + "included-description": "Indemnification, working with Grafana Labs on future prioritization, and training from the core Grafana team.", + "included-heading": "Also included:", + "service-title": "At your service", + "team-sync-details": "LDAP, GitHub OAuth, Auth Proxy, Okta", + "title": "Get Grafana Enterprise" + }, + "ldap": { + "test-mapping-heading": "Test user mapping", + "test-mapping-run-button": "Run" + }, + "ldap-permissions": { + "active": "<0> Active", + "admin": "<0> Yes", + "inactive": "<0> Inactive" + }, + "ldap-status": { + "title": "LDAP Connection" + }, + "ldap-sync": { + "debug-button": "Debug LDAP Mapping", + "external-sync-description": "User synced via LDAP. Some changes must be done in LDAP or mappings.", + "external-sync-label": "External sync", + "next-sync-label": "Next scheduled synchronization", + "not-enabled": "Not enabled", + "sync-button": "Sync user", + "title": "LDAP Synchronisation" + }, + "ldap-sync-info": { + "title": "LDAP Synchronization" + }, + "ldap-user-groups": { + "no-org-found": "No match <2><0>" + }, + "ldap-user-info": { + "no-team": "No teams found via LDAP" + }, + "org-uers": { + "last-seen-never": "Never" + }, + "org-users": { + "not-editable": "This user's role is not editable because it is synchronized from your auth provider. Refer to the <1>Grafana authentication docs for details." + }, + "orgs": { + "delete-body": "Are you sure you want to delete '{{deleteOrgName}}'?<3> <5>All dashboards for this organization will be removed!", + "id-header": "ID", + "name-header": "Name", + "new-org-button": "New org" + }, + "server-settings": { + "alerts-button": "Manage alerts", + "dashboards-button": "Manage dashboards", + "data-sources-button": "Manage data sources", + "not-found": "No stats found.", + "title": "Instance statistics", + "users-button": "Manage users" + }, + "settings": { + "info-description": "These system settings are defined in grafana.ini or custom.ini (or overridden in ENV variables). To change these you currently need to restart Grafana." + }, + "upgrade-info": { + "title": "Enterprise license" + }, + "user-orgs": { + "add-button": "Add user to organization", + "change-role-button": "Change role", + "external-user-tooltip": "This user's built-in role is not editable because it is synchronized from your auth provider. Refer to the <1>Grafana authentication docs for details.", + "remove-button": "Remove from organization", + "role-not-editable": "This user's role is not editable because it is synchronized from your auth provider. Refer to the <1>Grafana authentication docs for details.", + "title": "Organizations" + }, + "user-orgs-modal": { + "add-button": "Add to organization", + "cancel-button": "Cancel" + }, + "user-permissions": { + "change-button": "Change", + "grafana-admin-key": "Grafana Admin", + "grafana-admin-no": "No", + "grafana-admin-yes": "Yes", + "title": "Permissions" + }, + "user-profile": { + "delete-button": "Delete user", + "disable-button": "Disable user", + "edit-button": "Edit", + "enable-button": "Enable user", + "title": "User information" + }, + "user-sessions": { + "browser-column": "Browser and OS", + "force-logout-all-button": "Force logout from all devices", + "force-logout-button": "Force logout", + "ip-column": "IP address", + "last-seen-column": "Last seen", + "logged-on-column": "Logged on", + "title": "Sessions" + }, + "users-create": { + "create-button": "Create user" + }, + "users-list": { + "create-button": "New user" + }, + "users-table": { + "last-seen-never": "Never", + "no-licensed-role": "Not assigned <2><0>" + } + }, "alert-labels": { "button": { "hide": "Hide common labels", @@ -371,6 +511,17 @@ "message": "No API keys found" } }, + "app-chrome": { + "skip-content-button": "Skip to main content", + "top-bar": { + "sign-in": "Sign in" + } + }, + "app-notification": { + "item": { + "trace-id": "Trace ID: {{traceId}}" + } + }, "bookmarks-page": { "empty": { "message": "It looks like you haven’t created any bookmarks yet", @@ -406,15 +557,15 @@ }, "counts": { "alertRule_one": "{{count}} alert rule", - "alertRule_other": "{{count}} alert rule", + "alertRule_other": "{{count}} alert rules", "dashboard_one": "{{count}} dashboard", - "dashboard_other": "{{count}} dashboard", + "dashboard_other": "{{count}} dashboards", "folder_one": "{{count}} folder", - "folder_other": "{{count}} folder", + "folder_other": "{{count}} folders", "libraryPanel_one": "{{count}} library panel", - "libraryPanel_other": "{{count}} library panel", + "libraryPanel_other": "{{count}} library panels", "total_one": "{{count}} item", - "total_other": "{{count}} item" + "total_other": "{{count}} items" }, "dashboards-tree": { "collapse-folder-button": "Collapse folder {{title}}", @@ -442,6 +593,7 @@ "clear-selection": "Clear selection", "empty-message": "No folders found", "error-title": "Error loading folders", + "non-folder-item": "Non-folder {{itemKind}} {{itemUID}}", "search-placeholder": "Search folders", "unknown-error": "Unknown error" }, @@ -883,6 +1035,12 @@ "time-range-label": "Lock time range" } }, + "empty-list-cta": { + "pro-tip": "ProTip: {{proTip}}" + }, + "entity-not-found": { + "description": "We're looking but can't seem to find this {{lowerCaseEntity}}. Try returning <4>home or seeking help on the <7>community site." + }, "errors": { "dashboard-settings": { "annotations": { @@ -1103,9 +1261,29 @@ "export-as-json-tooltip": "Export" } }, + "folder-filter": { + "clear-folder-button": "Clear folders" + }, "folder-picker": { + "create-instructions": "Press enter to create the new folder.", "loading": "Loading folders..." }, + "forgot-password": { + "back-button": "Back to login", + "change-password": { + "skip-button": "Skip", + "submit-button": "Submit" + }, + "contact-admin": "Did you forget your username or email? Contact your Grafana administrator.", + "email-sent": "An email with a reset link has been sent to the email address. You should receive it shortly.", + "reset-password-header": "Reset password", + "send-email-button": "Send reset email" + }, + "form-prompt": { + "continue-button": "Continue editing", + "description": "Changes that you made may not be saved.", + "discard-button": "Discard unsaved changes" + }, "gen-ai": { "apply-suggestion": "Apply", "incomplete-request-error": "Sorry, I was unable to complete your request. Please try again.", @@ -1225,6 +1403,10 @@ } }, "help-modal": { + "column-headers": { + "description": "Description", + "keys": "Keys" + }, "shortcuts-category": { "dashboard": "Dashboard", "focused-panel": "Focused panel", @@ -1475,6 +1657,9 @@ } }, "login": { + "divider": { + "connecting-text": "or" + }, "error": { "blocked": "You have exceeded the number of login attempts for this user. Please try again later.", "invalid-user-or-password": "Invalid username or password", @@ -1502,6 +1687,9 @@ "verify-email-label": "Send a verification email", "verify-email-loading-label": "Sending email..." }, + "layout": { + "update-password": "Update your password" + }, "services": { "sing-in-with-prefix": "Sign in with {{serviceName}}" }, @@ -2147,6 +2335,9 @@ "no-matches": "No matches found", "unsupported-layout": "Unsupported layout" }, + "panel-type-filter": { + "clear-button": "Clear types" + }, "playlist-edit": { "error-prefix": "Error loading playlist:", "form": { @@ -2240,6 +2431,10 @@ }, "empty-state": { "message": "No plugins found" + }, + "plugin-help": { + "error": "An error occurred when loading help.", + "not-found": "No query help could be found." } }, "profile": { @@ -2433,6 +2628,10 @@ "dashboard-modal-title": "Public dashboards", "shared-dashboard-modal-title": "Shared dashboards" }, + "table-body": { + "dashboard-count_one": "{{count}} dashboard", + "dashboard-count_other": "{{count}} dashboards" + }, "table-header": { "activated-label": "Activated", "activated-tooltip": "Earliest time user has been an active user to a dashboard", @@ -2527,6 +2726,19 @@ "dismissable-button": "Close" }, "role-picker": { + "built-in": { + "basic-roles": "Basic roles" + }, + "input": { + "no-roles": "No roles assigned" + }, + "menu": { + "clear-button": "Clear all", + "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." + }, + "sub-menu": { + "clear-button": "Clear" + }, "title": { "description": "Assign roles to users to ensure granular control over access to Grafana‘s features and resources. Find out more in our <2>documentation." } @@ -2536,6 +2748,11 @@ "label": "Basic Roles" } }, + "route-error": { + "description": "Grafana has likely been updated. Please try reloading the page.", + "reload-button": "Reload", + "title": "Unable to find application file" + }, "save-dashboards": { "name-exists": { "message-info": "A dashboard with the same name in the selected folder already exists, including recently deleted dashboards.", @@ -2808,6 +3025,17 @@ }, "title": "Preferences" }, + "sign-up": { + "back-button": "Back to login", + "submit-button": "Submit", + "verify": { + "back-button": "Back to login", + "complete-button": "Complete signup", + "header": "Verify email", + "info": "An email with a verification link has been sent to the email address. You should receive it shortly.", + "send-button": "Send verification email" + } + }, "silences": { "empty-state": { "button-title": "Create silence", @@ -2860,6 +3088,7 @@ "view-button": "View" }, "tag-filter": { + "clear-button": "Clear tags", "loading": "Loading...", "no-tags": "No tags found", "placeholder": "Filter by tag" @@ -2980,6 +3209,13 @@ "add-transformation-header": "Start transforming data" } }, + "upgrade-box": { + "discovery-text": "You’ve discovered a Pro feature!", + "discovery-text-continued": "Get the Grafana Pro plan to access {{featureName}}.", + "get-started": "Get started with {{featureName}}", + "learn-more": "Learn more", + "upgrade-button": "Upgrade" + }, "user-orgs": { "current-org-button": "Current", "name-column": "Name", diff --git a/public/locales/pseudo-LOCALE/grafana.json b/public/locales/pseudo-LOCALE/grafana.json index a471dce121f..b01b2025965 100644 --- a/public/locales/pseudo-LOCALE/grafana.json +++ b/public/locales/pseudo-LOCALE/grafana.json @@ -14,6 +14,9 @@ "permission-list": { "permission": "Pęřmįşşįőʼn" }, + "permission-list-item": { + "inherited": "Ĩʼnĥęřįŧęđ ƒřőm ƒőľđęř" + }, "permissions": { "add-label": "Åđđ ä pęřmįşşįőʼn", "no-permissions": "Ŧĥęřę äřę ʼnő pęřmįşşįőʼnş", @@ -25,6 +28,143 @@ "user": "Ůşęř" } }, + "action-editor": { + "modal": { + "cancel-button": "Cäʼnčęľ", + "save-button": "Ŝävę" + } + }, + "actions-editor": { + "inline": { + "add-button": "Åđđ äčŧįőʼn", + "one-click-link": "Øʼnę-čľįčĸ ľįʼnĸ" + } + }, + "admin": { + "anon-users": { + "not-found": "Ńő äʼnőʼnymőūş ūşęřş ƒőūʼnđ." + }, + "edit-org": { + "access-denied": "Ÿőū đő ʼnőŧ ĥävę pęřmįşşįőʼn ŧő şęę ūşęřş įʼn ŧĥįş őřģäʼnįžäŧįőʼn. Ŧő ūpđäŧę ŧĥįş őřģäʼnįžäŧįőʼn, čőʼnŧäčŧ yőūř şęřvęř äđmįʼnįşŧřäŧőř.", + "heading": "Ēđįŧ Øřģäʼnįžäŧįőʼn", + "update-button": "Ůpđäŧę", + "users-heading": "Øřģäʼnįžäŧįőʼn ūşęřş" + }, + "feature-toggles": { + "sub-title": "Vįęŵ äʼnđ ęđįŧ ƒęäŧūřę ŧőģģľęş. Ŗęäđ mőřę äþőūŧ ƒęäŧūřę ŧőģģľęş äŧ <2>ģřäƒäʼnä.čőm." + }, + "get-enterprise": { + "contact-us": "Cőʼnŧäčŧ ūş äʼnđ ģęŧ ä ƒřęę ŧřįäľ", + "description": "Ÿőū čäʼn ūşę ŧĥę ŧřįäľ vęřşįőʼn ƒőř ƒřęę ƒőř 30 đäyş. Ŵę ŵįľľ řęmįʼnđ yőū äþőūŧ įŧ ƒįvę đäyş þęƒőřę ŧĥę ŧřįäľ pęřįőđ ęʼnđş.", + "features-heading": "Ēʼnĥäʼnčęđ ƒūʼnčŧįőʼnäľįŧy", + "included-description": "Ĩʼnđęmʼnįƒįčäŧįőʼn, ŵőřĸįʼnģ ŵįŧĥ Ğřäƒäʼnä Ŀäþş őʼn ƒūŧūřę přįőřįŧįžäŧįőʼn, äʼnđ ŧřäįʼnįʼnģ ƒřőm ŧĥę čőřę Ğřäƒäʼnä ŧęäm.", + "included-heading": "Åľşő įʼnčľūđęđ:", + "service-title": "Åŧ yőūř şęřvįčę", + "team-sync-details": "ĿĐÅP, ĞįŧĦūþ ØÅūŧĥ, Åūŧĥ Přőχy, Øĸŧä", + "title": "Ğęŧ Ğřäƒäʼnä Ēʼnŧęřpřįşę" + }, + "ldap": { + "test-mapping-heading": "Ŧęşŧ ūşęř mäppįʼnģ", + "test-mapping-run-button": "Ŗūʼn" + }, + "ldap-permissions": { + "active": "<0> Åčŧįvę", + "admin": "<0> Ÿęş", + "inactive": "<0> Ĩʼnäčŧįvę" + }, + "ldap-status": { + "title": "ĿĐÅP Cőʼnʼnęčŧįőʼn" + }, + "ldap-sync": { + "debug-button": "Đęþūģ ĿĐÅP Mäppįʼnģ", + "external-sync-description": "Ůşęř şyʼnčęđ vįä ĿĐÅP. Ŝőmę čĥäʼnģęş mūşŧ þę đőʼnę įʼn ĿĐÅP őř mäppįʼnģş.", + "external-sync-label": "Ēχŧęřʼnäľ şyʼnč", + "next-sync-label": "Ńęχŧ şčĥęđūľęđ şyʼnčĥřőʼnįžäŧįőʼn", + "not-enabled": "Ńőŧ ęʼnäþľęđ", + "sync-button": "Ŝyʼnč ūşęř", + "title": "ĿĐÅP Ŝyʼnčĥřőʼnįşäŧįőʼn" + }, + "ldap-sync-info": { + "title": "ĿĐÅP Ŝyʼnčĥřőʼnįžäŧįőʼn" + }, + "ldap-user-groups": { + "no-org-found": "Ńő mäŧčĥ <2><0>" + }, + "ldap-user-info": { + "no-team": "Ńő ŧęämş ƒőūʼnđ vįä ĿĐÅP" + }, + "org-uers": { + "last-seen-never": "Ńęvęř" + }, + "org-users": { + "not-editable": "Ŧĥįş ūşęř'ş řőľę įş ʼnőŧ ęđįŧäþľę þęčäūşę įŧ įş şyʼnčĥřőʼnįžęđ ƒřőm yőūř äūŧĥ přővįđęř. Ŗęƒęř ŧő ŧĥę <1>Ğřäƒäʼnä äūŧĥęʼnŧįčäŧįőʼn đőčş ƒőř đęŧäįľş." + }, + "orgs": { + "delete-body": "Åřę yőū şūřę yőū ŵäʼnŧ ŧő đęľęŧę '{{deleteOrgName}}'?<3> <5>Åľľ đäşĥþőäřđş ƒőř ŧĥįş őřģäʼnįžäŧįőʼn ŵįľľ þę řęmővęđ!", + "id-header": "ĨĐ", + "name-header": "Ńämę", + "new-org-button": "Ńęŵ őřģ" + }, + "server-settings": { + "alerts-button": "Mäʼnäģę äľęřŧş", + "dashboards-button": "Mäʼnäģę đäşĥþőäřđş", + "data-sources-button": "Mäʼnäģę đäŧä şőūřčęş", + "not-found": "Ńő şŧäŧş ƒőūʼnđ.", + "title": "Ĩʼnşŧäʼnčę şŧäŧįşŧįčş", + "users-button": "Mäʼnäģę ūşęřş" + }, + "settings": { + "info-description": "Ŧĥęşę şyşŧęm şęŧŧįʼnģş äřę đęƒįʼnęđ įʼn ģřäƒäʼnä.įʼnį őř čūşŧőm.įʼnį (őř ővęřřįđđęʼn įʼn ĒŃV väřįäþľęş). Ŧő čĥäʼnģę ŧĥęşę yőū čūřřęʼnŧľy ʼnęęđ ŧő řęşŧäřŧ Ğřäƒäʼnä." + }, + "upgrade-info": { + "title": "Ēʼnŧęřpřįşę ľįčęʼnşę" + }, + "user-orgs": { + "add-button": "Åđđ ūşęř ŧő őřģäʼnįžäŧįőʼn", + "change-role-button": "Cĥäʼnģę řőľę", + "external-user-tooltip": "Ŧĥįş ūşęř'ş þūįľŧ-įʼn řőľę įş ʼnőŧ ęđįŧäþľę þęčäūşę įŧ įş şyʼnčĥřőʼnįžęđ ƒřőm yőūř äūŧĥ přővįđęř. Ŗęƒęř ŧő ŧĥę <1>Ğřäƒäʼnä äūŧĥęʼnŧįčäŧįőʼn đőčş ƒőř đęŧäįľş.", + "remove-button": "Ŗęmővę ƒřőm őřģäʼnįžäŧįőʼn", + "role-not-editable": "Ŧĥįş ūşęř'ş řőľę įş ʼnőŧ ęđįŧäþľę þęčäūşę įŧ įş şyʼnčĥřőʼnįžęđ ƒřőm yőūř äūŧĥ přővįđęř. Ŗęƒęř ŧő ŧĥę <1>Ğřäƒäʼnä äūŧĥęʼnŧįčäŧįőʼn đőčş ƒőř đęŧäįľş.", + "title": "Øřģäʼnįžäŧįőʼnş" + }, + "user-orgs-modal": { + "add-button": "Åđđ ŧő őřģäʼnįžäŧįőʼn", + "cancel-button": "Cäʼnčęľ" + }, + "user-permissions": { + "change-button": "Cĥäʼnģę", + "grafana-admin-key": "Ğřäƒäʼnä Åđmįʼn", + "grafana-admin-no": "Ńő", + "grafana-admin-yes": "Ÿęş", + "title": "Pęřmįşşįőʼnş" + }, + "user-profile": { + "delete-button": "Đęľęŧę ūşęř", + "disable-button": "Đįşäþľę ūşęř", + "edit-button": "Ēđįŧ", + "enable-button": "Ēʼnäþľę ūşęř", + "title": "Ůşęř įʼnƒőřmäŧįőʼn" + }, + "user-sessions": { + "browser-column": "ßřőŵşęř äʼnđ ØŜ", + "force-logout-all-button": "Főřčę ľőģőūŧ ƒřőm äľľ đęvįčęş", + "force-logout-button": "Főřčę ľőģőūŧ", + "ip-column": "ĨP äđđřęşş", + "last-seen-column": "Ŀäşŧ şęęʼn", + "logged-on-column": "Ŀőģģęđ őʼn", + "title": "Ŝęşşįőʼnş" + }, + "users-create": { + "create-button": "Cřęäŧę ūşęř" + }, + "users-list": { + "create-button": "Ńęŵ ūşęř" + }, + "users-table": { + "last-seen-never": "Ńęvęř", + "no-licensed-role": "Ńőŧ äşşįģʼnęđ <2><0>" + } + }, "alert-labels": { "button": { "hide": "Ħįđę čőmmőʼn ľäþęľş", @@ -371,6 +511,17 @@ "message": "Ńő ÅPĨ ĸęyş ƒőūʼnđ" } }, + "app-chrome": { + "skip-content-button": "Ŝĸįp ŧő mäįʼn čőʼnŧęʼnŧ", + "top-bar": { + "sign-in": "Ŝįģʼn įʼn" + } + }, + "app-notification": { + "item": { + "trace-id": "Ŧřäčę ĨĐ: {{traceId}}" + } + }, "bookmarks-page": { "empty": { "message": "Ĩŧ ľőőĸş ľįĸę yőū ĥävęʼn’ŧ čřęäŧęđ äʼny þőőĸmäřĸş yęŧ", @@ -406,15 +557,15 @@ }, "counts": { "alertRule_one": "{{count}} äľęřŧ řūľę", - "alertRule_other": "{{count}} äľęřŧ řūľę", + "alertRule_other": "{{count}} äľęřŧ řūľęş", "dashboard_one": "{{count}} đäşĥþőäřđ", - "dashboard_other": "{{count}} đäşĥþőäřđ", + "dashboard_other": "{{count}} đäşĥþőäřđş", "folder_one": "{{count}} ƒőľđęř", - "folder_other": "{{count}} ƒőľđęř", + "folder_other": "{{count}} ƒőľđęřş", "libraryPanel_one": "{{count}} ľįþřäřy päʼnęľ", - "libraryPanel_other": "{{count}} ľįþřäřy päʼnęľ", + "libraryPanel_other": "{{count}} ľįþřäřy päʼnęľş", "total_one": "{{count}} įŧęm", - "total_other": "{{count}} įŧęm" + "total_other": "{{count}} įŧęmş" }, "dashboards-tree": { "collapse-folder-button": "Cőľľäpşę ƒőľđęř {{title}}", @@ -442,6 +593,7 @@ "clear-selection": "Cľęäř şęľęčŧįőʼn", "empty-message": "Ńő ƒőľđęřş ƒőūʼnđ", "error-title": "Ēřřőř ľőäđįʼnģ ƒőľđęřş", + "non-folder-item": "Ńőʼn-ƒőľđęř {{itemKind}} {{itemUID}}", "search-placeholder": "Ŝęäřčĥ ƒőľđęřş", "unknown-error": "Ůʼnĸʼnőŵʼn ęřřőř" }, @@ -883,6 +1035,12 @@ "time-range-label": "Ŀőčĸ ŧįmę řäʼnģę" } }, + "empty-list-cta": { + "pro-tip": "PřőŦįp: {{proTip}}" + }, + "entity-not-found": { + "description": "Ŵę'řę ľőőĸįʼnģ þūŧ čäʼn'ŧ şęęm ŧő ƒįʼnđ ŧĥįş {{lowerCaseEntity}}. Ŧřy řęŧūřʼnįʼnģ <4>ĥőmę őř şęęĸįʼnģ ĥęľp őʼn ŧĥę <7>čőmmūʼnįŧy şįŧę." + }, "errors": { "dashboard-settings": { "annotations": { @@ -1103,9 +1261,29 @@ "export-as-json-tooltip": "Ēχpőřŧ" } }, + "folder-filter": { + "clear-folder-button": "Cľęäř ƒőľđęřş" + }, "folder-picker": { + "create-instructions": "Přęşş ęʼnŧęř ŧő čřęäŧę ŧĥę ʼnęŵ ƒőľđęř.", "loading": "Ŀőäđįʼnģ ƒőľđęřş..." }, + "forgot-password": { + "back-button": "ßäčĸ ŧő ľőģįʼn", + "change-password": { + "skip-button": "Ŝĸįp", + "submit-button": "Ŝūþmįŧ" + }, + "contact-admin": "Đįđ yőū ƒőřģęŧ yőūř ūşęřʼnämę őř ęmäįľ? Cőʼnŧäčŧ yőūř Ğřäƒäʼnä äđmįʼnįşŧřäŧőř.", + "email-sent": "Åʼn ęmäįľ ŵįŧĥ ä řęşęŧ ľįʼnĸ ĥäş þęęʼn şęʼnŧ ŧő ŧĥę ęmäįľ äđđřęşş. Ÿőū şĥőūľđ řęčęįvę įŧ şĥőřŧľy.", + "reset-password-header": "Ŗęşęŧ päşşŵőřđ", + "send-email-button": "Ŝęʼnđ řęşęŧ ęmäįľ" + }, + "form-prompt": { + "continue-button": "Cőʼnŧįʼnūę ęđįŧįʼnģ", + "description": "Cĥäʼnģęş ŧĥäŧ yőū mäđę mäy ʼnőŧ þę şävęđ.", + "discard-button": "Đįşčäřđ ūʼnşävęđ čĥäʼnģęş" + }, "gen-ai": { "apply-suggestion": "Åppľy", "incomplete-request-error": "Ŝőřřy, Ĩ ŵäş ūʼnäþľę ŧő čőmpľęŧę yőūř řęqūęşŧ. Pľęäşę ŧřy äģäįʼn.", @@ -1225,6 +1403,10 @@ } }, "help-modal": { + "column-headers": { + "description": "Đęşčřįpŧįőʼn", + "keys": "Ķęyş" + }, "shortcuts-category": { "dashboard": "Đäşĥþőäřđ", "focused-panel": "Főčūşęđ päʼnęľ", @@ -1475,6 +1657,9 @@ } }, "login": { + "divider": { + "connecting-text": "őř" + }, "error": { "blocked": "Ÿőū ĥävę ęχčęęđęđ ŧĥę ʼnūmþęř őƒ ľőģįʼn äŧŧęmpŧş ƒőř ŧĥįş ūşęř. Pľęäşę ŧřy äģäįʼn ľäŧęř.", "invalid-user-or-password": "Ĩʼnväľįđ ūşęřʼnämę őř päşşŵőřđ", @@ -1502,6 +1687,9 @@ "verify-email-label": "Ŝęʼnđ ä vęřįƒįčäŧįőʼn ęmäįľ", "verify-email-loading-label": "Ŝęʼnđįʼnģ ęmäįľ..." }, + "layout": { + "update-password": "Ůpđäŧę yőūř päşşŵőřđ" + }, "services": { "sing-in-with-prefix": "Ŝįģʼn įʼn ŵįŧĥ {{serviceName}}" }, @@ -2147,6 +2335,9 @@ "no-matches": "Ńő mäŧčĥęş ƒőūʼnđ", "unsupported-layout": "Ůʼnşūppőřŧęđ ľäyőūŧ" }, + "panel-type-filter": { + "clear-button": "Cľęäř ŧypęş" + }, "playlist-edit": { "error-prefix": "Ēřřőř ľőäđįʼnģ pľäyľįşŧ:", "form": { @@ -2240,6 +2431,10 @@ }, "empty-state": { "message": "Ńő pľūģįʼnş ƒőūʼnđ" + }, + "plugin-help": { + "error": "Åʼn ęřřőř őččūřřęđ ŵĥęʼn ľőäđįʼnģ ĥęľp.", + "not-found": "Ńő qūęřy ĥęľp čőūľđ þę ƒőūʼnđ." } }, "profile": { @@ -2433,6 +2628,10 @@ "dashboard-modal-title": "Pūþľįč đäşĥþőäřđş", "shared-dashboard-modal-title": "Ŝĥäřęđ đäşĥþőäřđş" }, + "table-body": { + "dashboard-count_one": "{{count}} đäşĥþőäřđ", + "dashboard-count_other": "{{count}} đäşĥþőäřđş" + }, "table-header": { "activated-label": "Åčŧįväŧęđ", "activated-tooltip": "Ēäřľįęşŧ ŧįmę ūşęř ĥäş þęęʼn äʼn äčŧįvę ūşęř ŧő ä đäşĥþőäřđ", @@ -2527,6 +2726,19 @@ "dismissable-button": "Cľőşę" }, "role-picker": { + "built-in": { + "basic-roles": "ßäşįč řőľęş" + }, + "input": { + "no-roles": "Ńő řőľęş äşşįģʼnęđ" + }, + "menu": { + "clear-button": "Cľęäř äľľ", + "tooltip": "Ÿőū čäʼn ʼnőŵ şęľęčŧ ŧĥę \"Ńő þäşįč řőľę\" őpŧįőʼn äʼnđ äđđ pęřmįşşįőʼnş ŧő yőūř čūşŧőm ʼnęęđş. Ÿőū čäʼn ƒįʼnđ mőřę įʼnƒőřmäŧįőʼn įʼn <1>őūř đőčūmęʼnŧäŧįőʼn." + }, + "sub-menu": { + "clear-button": "Cľęäř" + }, "title": { "description": "Åşşįģʼn řőľęş ŧő ūşęřş ŧő ęʼnşūřę ģřäʼnūľäř čőʼnŧřőľ ővęř äččęşş ŧő Ğřäƒäʼnä&ľşqūő;ş ƒęäŧūřęş äʼnđ řęşőūřčęş. Fįʼnđ őūŧ mőřę įʼn őūř <2>đőčūmęʼnŧäŧįőʼn." } @@ -2536,6 +2748,11 @@ "label": "ßäşįč Ŗőľęş" } }, + "route-error": { + "description": "Ğřäƒäʼnä ĥäş ľįĸęľy þęęʼn ūpđäŧęđ. Pľęäşę ŧřy řęľőäđįʼnģ ŧĥę päģę.", + "reload-button": "Ŗęľőäđ", + "title": "Ůʼnäþľę ŧő ƒįʼnđ äppľįčäŧįőʼn ƒįľę" + }, "save-dashboards": { "name-exists": { "message-info": "Å đäşĥþőäřđ ŵįŧĥ ŧĥę şämę ʼnämę įʼn ŧĥę şęľęčŧęđ ƒőľđęř äľřęäđy ęχįşŧş, įʼnčľūđįʼnģ řęčęʼnŧľy đęľęŧęđ đäşĥþőäřđş.", @@ -2808,6 +3025,17 @@ }, "title": "Přęƒęřęʼnčęş" }, + "sign-up": { + "back-button": "ßäčĸ ŧő ľőģįʼn", + "submit-button": "Ŝūþmįŧ", + "verify": { + "back-button": "ßäčĸ ŧő ľőģįʼn", + "complete-button": "Cőmpľęŧę şįģʼnūp", + "header": "Vęřįƒy ęmäįľ", + "info": "Åʼn ęmäįľ ŵįŧĥ ä vęřįƒįčäŧįőʼn ľįʼnĸ ĥäş þęęʼn şęʼnŧ ŧő ŧĥę ęmäįľ äđđřęşş. Ÿőū şĥőūľđ řęčęįvę įŧ şĥőřŧľy.", + "send-button": "Ŝęʼnđ vęřįƒįčäŧįőʼn ęmäįľ" + } + }, "silences": { "empty-state": { "button-title": "Cřęäŧę şįľęʼnčę", @@ -2860,6 +3088,7 @@ "view-button": "Vįęŵ" }, "tag-filter": { + "clear-button": "Cľęäř ŧäģş", "loading": "Ŀőäđįʼnģ...", "no-tags": "Ńő ŧäģş ƒőūʼnđ", "placeholder": "Fįľŧęř þy ŧäģ" @@ -2980,6 +3209,13 @@ "add-transformation-header": "Ŝŧäřŧ ŧřäʼnşƒőřmįʼnģ đäŧä" } }, + "upgrade-box": { + "discovery-text": "Ÿőū’vę đįşčővęřęđ ä Přő ƒęäŧūřę!", + "discovery-text-continued": "Ğęŧ ŧĥę Ğřäƒäʼnä Přő pľäʼn ŧő äččęşş {{featureName}}.", + "get-started": "Ğęŧ şŧäřŧęđ ŵįŧĥ {{featureName}}", + "learn-more": "Ŀęäřʼn mőřę", + "upgrade-button": "Ůpģřäđę" + }, "user-orgs": { "current-org-button": "Cūřřęʼnŧ", "name-column": "Ńämę",
Last seenLogged onIP addressBrowser and OS + Last seen + + Logged on + + IP address + + Browser and OS + Identity Provider