Internationalization: Mark up more of Dashboard Variables and Browse/Search Dashboards (#63518)

* Extract dirty translations from main

* Translate some variable phrases

* Translate nav bar

* Translate search/browse

* Fix header returning null

* Translate search results type

* fix test
This commit is contained in:
Josh Hunt 2023-02-23 11:46:07 +01:00 committed by GitHub
parent 0abbfbcc59
commit 54aaaf169f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 422 additions and 47 deletions

View File

@ -4086,9 +4086,7 @@ exports[`better eslint`] = {
[0, 0, 0, "Do not use any type assertions.", "0"],
[0, 0, 0, "Do not use any type assertions.", "1"],
[0, 0, 0, "Unexpected any. Specify a different type.", "2"],
[0, 0, 0, "Do not use any type assertions.", "3"],
[0, 0, 0, "Unexpected any. Specify a different type.", "4"],
[0, 0, 0, "Do not use any type assertions.", "5"]
[0, 0, 0, "Do not use any type assertions.", "3"]
],
"public/app/features/search/service/bluge.ts:5381": [
[0, 0, 0, "Do not use any type assertions.", "0"],

View File

@ -7,6 +7,7 @@ import { AsyncState } from 'react-use/lib/useAsync';
import { SelectableValue } from '@grafana/data';
import { useStyles2 } from '../../themes';
import { t } from '../../utils/i18n';
import { InlineLabel } from '../Forms/InlineLabel';
import { SegmentSelect } from './SegmentSelect';
@ -101,15 +102,15 @@ export function SegmentAsync<T>({
function mapStateToNoOptionsMessage<T>(state: AsyncState<Array<SelectableValue<T>>>): string {
if (state.loading) {
return 'Loading options...';
return t('grafana-ui.segment-async.loading', 'Loading options...');
}
if (state.error) {
return 'Failed to load options';
return t('grafana-ui.segment-async.error', 'Failed to load options');
}
if (!Array.isArray(state.value) || state.value.length === 0) {
return 'No options found';
return t('grafana-ui.segment-async.no-options', 'No options found');
}
return '';

View File

@ -4,6 +4,7 @@ import React from 'react';
import { GrafanaTheme2, NavModelItem } from '@grafana/data';
import { Components } from '@grafana/e2e-selectors';
import { Icon, IconButton, ToolbarButton, useStyles2 } from '@grafana/ui';
import { t } from 'app/core/internationalization';
import { HOME_NAV_ID } from 'app/core/reducers/navModel';
import { useSelector } from 'app/types';
@ -39,16 +40,31 @@ export function NavToolbar({
return (
<div data-testid={Components.NavToolbar.container} className={styles.pageToolbar}>
<div className={styles.menuButton}>
<IconButton name="bars" tooltip="Toggle menu" tooltipPlacement="bottom" size="xl" onClick={onToggleMegaMenu} />
<IconButton
name="bars"
tooltip={t('navigation.toolbar.toggle-menu', 'Toggle menu')}
tooltipPlacement="bottom"
size="xl"
onClick={onToggleMegaMenu}
/>
</div>
<Breadcrumbs breadcrumbs={breadcrumbs} className={styles.breadcrumbs} />
<div className={styles.actions}>
{actions}
{actions && <NavToolbarSeparator />}
{searchBarHidden && (
<ToolbarButton onClick={onToggleKioskMode} narrow title="Enable kiosk mode" icon="monitor" />
<ToolbarButton
onClick={onToggleKioskMode}
narrow
title={t('navigation.toolbar.enable-kiosk', 'Enable kiosk mode')}
icon="monitor"
/>
)}
<ToolbarButton onClick={onToggleSearchBar} narrow title="Toggle top search bar">
<ToolbarButton
onClick={onToggleSearchBar}
narrow
title={t('navigation.toolbar.toggle-search-bar', 'Toggle top search bar')}
>
<Icon name={searchBarHidden ? 'angle-down' : 'angle-up'} size="xl" />
</ToolbarButton>
</div>

View File

@ -148,6 +148,8 @@ export function getNavSubTitle(navId: string | undefined) {
return config.featureToggles.topnav
? t('nav.dashboards.subtitle', 'Create and manage dashboards to visualize your data')
: undefined;
case 'manage-folder':
return t('nav.manage-folder.subtitle', 'Manage folder dashboards and permissions');
case 'dashboards/playlists':
return t('nav.playlists.subtitle', 'Groups of dashboards that are displayed in a sequence');
case 'dashboards/snapshots':

View File

@ -4,6 +4,7 @@ import { components } from 'react-select';
import { escapeStringForRegex, GrafanaTheme2 } from '@grafana/data';
import { Icon, MultiSelect, useStyles2 } from '@grafana/ui';
import { t } from 'app/core/internationalization';
import { TagBadge } from './TagBadge';
import { TagOption } from './TagOption';
@ -45,7 +46,7 @@ export const TagFilter = ({
inputId,
isClearable,
onChange,
placeholder = 'Filter by tag',
placeholder,
tagOptions,
tags,
width,
@ -134,10 +135,10 @@ export const TagFilter = ({
getOptionValue: (i: any) => i.value,
inputId,
isMulti: true,
loadingMessage: 'Loading...',
noOptionsMessage: 'No tags found',
onChange: onTagChange,
placeholder,
loadingMessage: t('tag-filter.loading', 'Loading...'),
noOptionsMessage: t('tag-filter.no-tags', 'No tags found'),
placeholder: placeholder || t('tag-filter.placeholder', 'Filter by tag'),
value: currentlySelectedTags,
width,
components: {

View File

@ -3,6 +3,7 @@ import React, { useEffect } from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { Input, useStyles2, Spinner } from '@grafana/ui';
import { t } from 'app/core/internationalization';
import { contextSrv } from 'app/core/services/context_srv';
import { FolderDTO, AccessControlAction } from 'app/types';
@ -49,7 +50,11 @@ export const ManageDashboardsNew = React.memo(({ folder }: Props) => {
// eslint-disable-next-line jsx-a11y/no-autofocus
autoFocus
spellCheck={false}
placeholder={state.includePanels ? 'Search for dashboards and panels' : 'Search for dashboards'}
placeholder={
state.includePanels
? t('search.search-input.include-panels-placeholder', 'Search for dashboards and panels')
: t('search.search-input.placeholder', 'Search for dashboards')
}
className={styles.searchInput}
suffix={false ? <Spinner /> : null}
/>

View File

@ -6,16 +6,25 @@ import { config } from '@grafana/runtime';
import { HorizontalGroup, RadioButtonGroup, useStyles2, Checkbox, Button } from '@grafana/ui';
import { SortPicker } from 'app/core/components/Select/SortPicker';
import { TagFilter, TermCount } from 'app/core/components/TagFilter/TagFilter';
import { t, Trans } from 'app/core/internationalization';
import { SearchLayout, SearchState } from '../../types';
export const layoutOptions = [
{ value: SearchLayout.Folders, icon: 'folder', ariaLabel: 'View by folders' },
{ value: SearchLayout.List, icon: 'list-ul', ariaLabel: 'View as list' },
];
function getLayoutOptions() {
const layoutOptions = [
{ value: SearchLayout.Folders, icon: 'folder', ariaLabel: t('search.actions.view-as-folders', 'View by folders') },
{ value: SearchLayout.List, icon: 'list-ul', ariaLabel: t('search.actions.view-as-list', 'View as list') },
];
if (config.featureToggles.dashboardPreviews) {
layoutOptions.push({ value: SearchLayout.Grid, icon: 'apps', ariaLabel: 'Grid view' });
if (config.featureToggles.dashboardPreviews) {
layoutOptions.push({
value: SearchLayout.Grid,
icon: 'apps',
ariaLabel: t('search.actions.view-as-grid', 'Grid view'),
});
}
return layoutOptions;
}
interface Props {
@ -80,26 +89,33 @@ export const ActionRow: FC<Props> = ({
disabled={layout === SearchLayout.Folders}
value={state.includePanels}
onChange={() => onSetIncludePanels(!state.includePanels)}
label="Include panels"
label={t('search.actions.include-panels', 'Include panels')}
/>
)}
{showStarredFilter && (
<div className={styles.checkboxWrapper}>
<Checkbox label="Starred" onChange={onStarredFilterChange} value={state.starred} />
<Checkbox
label={t('search.actions.starred', 'Starred')}
onChange={onStarredFilterChange}
value={state.starred}
/>
</div>
)}
{state.datasource && (
<Button icon="times" variant="secondary" onClick={() => onDatasourceChange(undefined)}>
Datasource: {state.datasource}
<Trans i18nKey="search.actions.remove-datasource-filter">
Datasource: {{ datasource: state.datasource }}
</Trans>
</Button>
)}
</HorizontalGroup>
<div className={styles.rowContainer}>
<HorizontalGroup spacing="md" width="auto">
{!hideLayout && (
<RadioButtonGroup
options={layoutOptions}
options={getLayoutOptions()}
disabledOptions={disabledOptions}
onChange={onLayoutChange}
value={layout}
@ -109,7 +125,7 @@ export const ActionRow: FC<Props> = ({
onChange={(change) => onSortChange(change?.value)}
value={state.sort}
getSortOptions={getSortOptions}
placeholder={sortPlaceholder || 'Sort'}
placeholder={sortPlaceholder || t('search.actions.sort-placeholder', 'Sort')}
isClearable
/>
</HorizontalGroup>

View File

@ -5,6 +5,7 @@ import { useAsync, useLocalStorage } from 'react-use';
import { GrafanaTheme2 } from '@grafana/data';
import { selectors } from '@grafana/e2e-selectors';
import { Card, Checkbox, CollapsableSection, Icon, IconName, Spinner, useStyles2 } from '@grafana/ui';
import { t } from 'app/core/internationalization';
import { getSectionStorageKey } from 'app/features/search/utils';
import { useUniqueId } from 'app/plugins/datasource/influxdb/components/useUniqueId';
@ -174,7 +175,10 @@ export const FolderSection = ({
<>
{selectionToggle && selection && (
<div onClick={onToggleFolder}>
<Checkbox value={selection(section.kind, section.uid)} aria-label="Select folder" />
<Checkbox
value={selection(section.kind, section.uid)}
aria-label={t('search.folder-view.select-folder', 'Select folder')}
/>
</div>
)}
@ -186,7 +190,8 @@ export const FolderSection = ({
<span id={labelId}>{section.title}</span>
{section.url && section.uid !== 'general' && (
<a href={section.url} className={styles.link}>
<span className={styles.separator}>|</span> <Icon name="folder-upload" /> Go to folder
<span className={styles.separator}>|</span> <Icon name="folder-upload" />{' '}
{t('search.folder-view.go-to-folder', 'Go to folder')}
</a>
)}
</div>

View File

@ -12,6 +12,7 @@ import {
import { config, getDataSourceSrv } from '@grafana/runtime';
import { Checkbox, Icon, IconButton, IconName, TagList } from '@grafana/ui';
import appEvents from 'app/core/app_events';
import { t } from 'app/core/internationalization';
import { PluginIconName } from 'app/features/plugins/admin/types';
import { ShowModalReactEvent } from 'app/types/events';
@ -63,7 +64,7 @@ export const generateColumns = (
if (selection('*', '*')) {
return (
<div className={styles.checkboxHeader}>
<IconButton name={'check-square' as any} onClick={clearSelection} />
<IconButton name="check-square" onClick={clearSelection} />
</div>
);
}
@ -132,9 +133,7 @@ export const generateColumns = (
},
id: `column-name`,
field: access.name!,
Header: () => {
return <div className={styles.headerNameStyle}>Name</div>;
},
Header: () => <div className={styles.headerNameStyle}>{t('search.results-table.name-header', 'Name')}</div>,
width,
});
availableWidth -= width;
@ -184,7 +183,7 @@ export const generateColumns = (
},
id: `column-location`,
field: access.location ?? access.url,
Header: 'Location',
Header: () => t('search.results-table.location-header', 'Location'),
width,
});
}
@ -281,7 +280,7 @@ function makeDataSourceColumn(
return {
id: `column-datasource`,
field,
Header: 'Data source',
Header: () => t('search.results-table.datasource-header', 'Data source'),
Cell: (p) => {
const dslist = field.values.get(p.row.index);
if (!dslist?.length) {
@ -329,7 +328,7 @@ function makeTypeColumn(
return {
id: `column-type`,
field: kindField ?? typeField,
Header: 'Type',
Header: () => t('search.results-table.type-header', 'Type'),
Cell: (p) => {
const i = p.row.index;
const kind = kindField?.values.get(i) ?? 'dashboard';
@ -339,12 +338,12 @@ function makeTypeColumn(
txt = kind;
switch (txt) {
case 'dashboard':
txt = 'Dashboard';
txt = t('search.results-table.type-dashboard', 'Dashboard');
break;
case 'folder':
icon = 'folder';
txt = 'Folder';
txt = t('search.results-table.type-folder', 'Folder');
break;
case 'panel':
@ -400,7 +399,7 @@ function makeTagsColumn(
},
id: `column-tags`,
field: field,
Header: 'Tags',
Header: () => t('search.results-table.tags-header', 'Tags'),
width,
};
}

View File

@ -29,7 +29,7 @@ describe('AdHocFilter', () => {
await selectEvent.select(selectEl, 'key3', { container: document.body });
// Select value
await userEvent.click(screen.getByText('select value'));
await userEvent.click(screen.getByText('Select value'));
// There are already some filters rendered
const selectEl2 = screen.getAllByTestId('AdHocFilterValue-value-wrapper')[2];
await selectEvent.select(selectEl2, 'val3', { container: document.body });

View File

@ -1,6 +1,7 @@
import React, { FC, useCallback, useState } from 'react';
import { DataSourceRef, SelectableValue } from '@grafana/data';
import { t } from 'app/core/internationalization';
import { AdHocVariableFilter } from 'app/features/variables/types';
import { AdHocFilterKey, REMOVE_FILTER_KEY } from './AdHocFilterKey';
@ -64,7 +65,7 @@ export const AdHocFilterBuilder: FC<Props> = ({ datasource, appendBefore, onComp
<AdHocFilterRenderer
datasource={datasource}
filter={{ key, value: '', operator, condition: '' }}
placeHolder="select value"
placeHolder={t('variable.adhoc.placeholder', 'Select value')}
onKeyChange={onKeyChanged}
onOperatorChange={onOperatorChanged}
onValueChange={onValueChanged}

View File

@ -43,7 +43,7 @@ export class VariableInput extends PureComponent<Props> {
value={value ?? ''}
onChange={this.onChange}
onKeyDown={this.onKeyDown}
placeholder={t('variable.picker.input', 'Enter variable value')}
placeholder={t('variable.dropdown.placeholder', 'Enter variable value')}
/>
);
}

View File

@ -1,6 +1,7 @@
import React, { ChangeEvent, FocusEvent, KeyboardEvent, ReactElement, useCallback, useEffect, useState } from 'react';
import { Input } from '@grafana/ui';
import { t } from 'app/core/internationalization';
import { useDispatch } from 'app/types';
import { variableAdapters } from '../adapters';
@ -70,7 +71,7 @@ export function TextBoxVariablePicker({ variable, onVariableChange, readOnly }:
onBlur={onBlur}
disabled={readOnly}
onKeyDown={onKeyDown}
placeholder="Enter variable value"
placeholder={t('variable.textbox.placeholder', 'Enter variable value')}
id={`var-${variable.id}`}
/>
);

View File

@ -18,6 +18,7 @@
"section": {
"actions": "",
"dashboard-search-results": "",
"folder-search-results": "",
"pages": "",
"preferences": "",
"recent-dashboards": ""
@ -110,6 +111,13 @@
"folder-picker": {
"loading": "Ordner werden geladen …"
},
"grafana-ui": {
"segment-async": {
"error": "",
"loading": "",
"no-options": ""
}
},
"library-panel": {
"add-modal": {
"cancel": "Abbrechen",
@ -251,6 +259,9 @@
"manage-dashboards": {
"title": "Durchsuchen"
},
"manage-folder": {
"subtitle": ""
},
"monitoring": {
"subtitle": "Überwachungs- und Infrastruktur-Apps",
"title": "Überwachung"
@ -345,6 +356,11 @@
"navigation": {
"kiosk": {
"tv-alert": "Drücke ESC, um den Kiosk-Modus zu verlassen"
},
"toolbar": {
"enable-kiosk": "",
"toggle-menu": "",
"toggle-search-bar": ""
}
},
"news": {
@ -393,11 +409,37 @@
}
},
"search": {
"actions": {
"include-panels": "",
"remove-datasource-filter": "",
"sort-placeholder": "",
"starred": "",
"view-as-folders": "",
"view-as-grid": "",
"view-as-list": ""
},
"dashboard-actions": {
"import": "",
"new": "",
"new-dashboard": "",
"new-folder": ""
},
"folder-view": {
"go-to-folder": "",
"select-folder": ""
},
"results-table": {
"datasource-header": "",
"location-header": "",
"name-header": "",
"tags-header": "",
"type-dashboard": "",
"type-folder": "",
"type-header": ""
},
"search-input": {
"include-panels-placeholder": "",
"placeholder": ""
}
},
"share-modal": {
@ -497,6 +539,11 @@
},
"title": "Einstellungen"
},
"tag-filter": {
"loading": "",
"no-tags": "",
"placeholder": ""
},
"time-picker": {
"absolute": {
"recent-title": "Kürzlich verwendete absolute Bereiche",
@ -572,12 +619,20 @@
"loading": "Sitzungen werden geladen …"
},
"variable": {
"adhoc": {
"placeholder": ""
},
"dropdown": {
"placeholder": ""
},
"picker": {
"input": "Variablenwert eingeben",
"link-all": "Alle",
"option-all": "Alle",
"option-selected-values": "Ausgewählt",
"option-tooltip": "Auswahl löschen"
},
"textbox": {
"placeholder": ""
}
}
}

View File

@ -18,6 +18,7 @@
"section": {
"actions": "Actions",
"dashboard-search-results": "Dashboards",
"folder-search-results": "Folders",
"pages": "Pages",
"preferences": "Preferences",
"recent-dashboards": "Recent dashboards"
@ -110,6 +111,13 @@
"folder-picker": {
"loading": "Loading folders..."
},
"grafana-ui": {
"segment-async": {
"error": "Failed to load options",
"loading": "Loading options...",
"no-options": "No options found"
}
},
"library-panel": {
"add-modal": {
"cancel": "Cancel",
@ -251,6 +259,9 @@
"manage-dashboards": {
"title": "Browse"
},
"manage-folder": {
"subtitle": "Manage folder dashboards and permissions"
},
"monitoring": {
"subtitle": "Monitoring and infrastructure apps",
"title": "Monitoring"
@ -345,6 +356,11 @@
"navigation": {
"kiosk": {
"tv-alert": "Press ESC to exit kiosk mode"
},
"toolbar": {
"enable-kiosk": "Enable kiosk mode",
"toggle-menu": "Toggle menu",
"toggle-search-bar": "Toggle top search bar"
}
},
"news": {
@ -393,11 +409,37 @@
}
},
"search": {
"actions": {
"include-panels": "Include panels",
"remove-datasource-filter": "Datasource: {{datasource}}",
"sort-placeholder": "Sort",
"starred": "Starred",
"view-as-folders": "View by folders",
"view-as-grid": "Grid view",
"view-as-list": "View as list"
},
"dashboard-actions": {
"import": "Import",
"new": "New",
"new-dashboard": "New Dashboard",
"new-folder": "New Folder"
},
"folder-view": {
"go-to-folder": "Go to folder",
"select-folder": "Select folder"
},
"results-table": {
"datasource-header": "Data source",
"location-header": "Location",
"name-header": "Name",
"tags-header": "Tags",
"type-dashboard": "Dashboard",
"type-folder": "Folder",
"type-header": "Type"
},
"search-input": {
"include-panels-placeholder": "Search for dashboards and panels",
"placeholder": "Search for dashboards"
}
},
"share-modal": {
@ -497,6 +539,11 @@
},
"title": "Preferences"
},
"tag-filter": {
"loading": "Loading...",
"no-tags": "No tags found",
"placeholder": "Filter by tag"
},
"time-picker": {
"absolute": {
"recent-title": "Recently used absolute ranges",
@ -572,12 +619,20 @@
"loading": "Loading sessions..."
},
"variable": {
"adhoc": {
"placeholder": "Select value"
},
"dropdown": {
"placeholder": "Enter variable value"
},
"picker": {
"input": "Enter variable value",
"link-all": "All",
"option-all": "All",
"option-selected-values": "Selected",
"option-tooltip": "Clear selections"
},
"textbox": {
"placeholder": "Enter variable value"
}
}
}

View File

@ -18,6 +18,7 @@
"section": {
"actions": "",
"dashboard-search-results": "",
"folder-search-results": "",
"pages": "",
"preferences": "",
"recent-dashboards": ""
@ -110,6 +111,13 @@
"folder-picker": {
"loading": "Cargando carpetas..."
},
"grafana-ui": {
"segment-async": {
"error": "",
"loading": "",
"no-options": ""
}
},
"library-panel": {
"add-modal": {
"cancel": "Cancelar",
@ -251,6 +259,9 @@
"manage-dashboards": {
"title": "Navegar"
},
"manage-folder": {
"subtitle": ""
},
"monitoring": {
"subtitle": "Aplicaciones de supervisión e infraestructura",
"title": "Seguimiento"
@ -345,6 +356,11 @@
"navigation": {
"kiosk": {
"tv-alert": "Pulse ESC para salir del modo de quiosco"
},
"toolbar": {
"enable-kiosk": "",
"toggle-menu": "",
"toggle-search-bar": ""
}
},
"news": {
@ -393,11 +409,37 @@
}
},
"search": {
"actions": {
"include-panels": "",
"remove-datasource-filter": "",
"sort-placeholder": "",
"starred": "",
"view-as-folders": "",
"view-as-grid": "",
"view-as-list": ""
},
"dashboard-actions": {
"import": "",
"new": "",
"new-dashboard": "",
"new-folder": ""
},
"folder-view": {
"go-to-folder": "",
"select-folder": ""
},
"results-table": {
"datasource-header": "",
"location-header": "",
"name-header": "",
"tags-header": "",
"type-dashboard": "",
"type-folder": "",
"type-header": ""
},
"search-input": {
"include-panels-placeholder": "",
"placeholder": ""
}
},
"share-modal": {
@ -497,6 +539,11 @@
},
"title": "Preferencias"
},
"tag-filter": {
"loading": "",
"no-tags": "",
"placeholder": ""
},
"time-picker": {
"absolute": {
"recent-title": "Intervalos absolutos utilizados recientemente",
@ -572,12 +619,20 @@
"loading": "Cargando sesiones..."
},
"variable": {
"adhoc": {
"placeholder": ""
},
"dropdown": {
"placeholder": ""
},
"picker": {
"input": "Introducir el valor de la variable",
"link-all": "Todo",
"option-all": "Todo",
"option-selected-values": "Seleccionados",
"option-tooltip": "Eliminar selecciones"
},
"textbox": {
"placeholder": ""
}
}
}

View File

@ -18,6 +18,7 @@
"section": {
"actions": "",
"dashboard-search-results": "",
"folder-search-results": "",
"pages": "",
"preferences": "",
"recent-dashboards": ""
@ -110,6 +111,13 @@
"folder-picker": {
"loading": "Chargement des dossiers..."
},
"grafana-ui": {
"segment-async": {
"error": "",
"loading": "",
"no-options": ""
}
},
"library-panel": {
"add-modal": {
"cancel": "Annuler",
@ -251,6 +259,9 @@
"manage-dashboards": {
"title": "Parcourir"
},
"manage-folder": {
"subtitle": ""
},
"monitoring": {
"subtitle": "Applications de suivi et d'infrastructure",
"title": "Suivi"
@ -345,6 +356,11 @@
"navigation": {
"kiosk": {
"tv-alert": "Appuyez sur ESC pour quitter le mode kiosque"
},
"toolbar": {
"enable-kiosk": "",
"toggle-menu": "",
"toggle-search-bar": ""
}
},
"news": {
@ -393,11 +409,37 @@
}
},
"search": {
"actions": {
"include-panels": "",
"remove-datasource-filter": "",
"sort-placeholder": "",
"starred": "",
"view-as-folders": "",
"view-as-grid": "",
"view-as-list": ""
},
"dashboard-actions": {
"import": "",
"new": "",
"new-dashboard": "",
"new-folder": ""
},
"folder-view": {
"go-to-folder": "",
"select-folder": ""
},
"results-table": {
"datasource-header": "",
"location-header": "",
"name-header": "",
"tags-header": "",
"type-dashboard": "",
"type-folder": "",
"type-header": ""
},
"search-input": {
"include-panels-placeholder": "",
"placeholder": ""
}
},
"share-modal": {
@ -497,6 +539,11 @@
},
"title": "Préférences"
},
"tag-filter": {
"loading": "",
"no-tags": "",
"placeholder": ""
},
"time-picker": {
"absolute": {
"recent-title": "Périodes absolues récemment utilisées",
@ -572,12 +619,20 @@
"loading": "Chargement des sessions..."
},
"variable": {
"adhoc": {
"placeholder": ""
},
"dropdown": {
"placeholder": ""
},
"picker": {
"input": "Entrer la valeur de la variable",
"link-all": "Tout",
"option-all": "Tout",
"option-selected-values": "Sélection",
"option-tooltip": "Effacer les sélections"
},
"textbox": {
"placeholder": ""
}
}
}

View File

@ -18,6 +18,7 @@
"section": {
"actions": "Åčŧįőʼnş",
"dashboard-search-results": "Đäşĥþőäřđş",
"folder-search-results": "Főľđęřş",
"pages": "Päģęş",
"preferences": "Přęƒęřęʼnčęş",
"recent-dashboards": "Ŗęčęʼnŧ đäşĥþőäřđş"
@ -110,6 +111,13 @@
"folder-picker": {
"loading": "Ŀőäđįʼnģ ƒőľđęřş..."
},
"grafana-ui": {
"segment-async": {
"error": "Fäįľęđ ŧő ľőäđ őpŧįőʼnş",
"loading": "Ŀőäđįʼnģ őpŧįőʼnş...",
"no-options": "Ńő őpŧįőʼnş ƒőūʼnđ"
}
},
"library-panel": {
"add-modal": {
"cancel": "Cäʼnčęľ",
@ -251,6 +259,9 @@
"manage-dashboards": {
"title": "ßřőŵşę"
},
"manage-folder": {
"subtitle": "Mäʼnäģę ƒőľđęř đäşĥþőäřđş äʼnđ pęřmįşşįőʼnş"
},
"monitoring": {
"subtitle": "Mőʼnįŧőřįʼnģ äʼnđ įʼnƒřäşŧřūčŧūřę äppş",
"title": "Mőʼnįŧőřįʼnģ"
@ -345,6 +356,11 @@
"navigation": {
"kiosk": {
"tv-alert": "Přęşş ĒŜC ŧő ęχįŧ ĸįőşĸ mőđę"
},
"toolbar": {
"enable-kiosk": "Ēʼnäþľę ĸįőşĸ mőđę",
"toggle-menu": "Ŧőģģľę męʼnū",
"toggle-search-bar": "Ŧőģģľę ŧőp şęäřčĥ þäř"
}
},
"news": {
@ -393,11 +409,37 @@
}
},
"search": {
"actions": {
"include-panels": "Ĩʼnčľūđę päʼnęľş",
"remove-datasource-filter": "Đäŧäşőūřčę: {{datasource}}",
"sort-placeholder": "Ŝőřŧ",
"starred": "Ŝŧäřřęđ",
"view-as-folders": "Vįęŵ þy ƒőľđęřş",
"view-as-grid": "Ğřįđ vįęŵ",
"view-as-list": "Vįęŵ äş ľįşŧ"
},
"dashboard-actions": {
"import": "Ĩmpőřŧ",
"new": "Ńęŵ",
"new-dashboard": "Ńęŵ Đäşĥþőäřđ",
"new-folder": "Ńęŵ Főľđęř"
},
"folder-view": {
"go-to-folder": "Ğő ŧő ƒőľđęř",
"select-folder": "Ŝęľęčŧ ƒőľđęř"
},
"results-table": {
"datasource-header": "Đäŧä şőūřčę",
"location-header": "Ŀőčäŧįőʼn",
"name-header": "Ńämę",
"tags-header": "Ŧäģş",
"type-dashboard": "Đäşĥþőäřđ",
"type-folder": "Főľđęř",
"type-header": "Ŧypę"
},
"search-input": {
"include-panels-placeholder": "Ŝęäřčĥ ƒőř đäşĥþőäřđş äʼnđ päʼnęľş",
"placeholder": "Ŝęäřčĥ ƒőř đäşĥþőäřđş"
}
},
"share-modal": {
@ -497,6 +539,11 @@
},
"title": "Přęƒęřęʼnčęş"
},
"tag-filter": {
"loading": "Ŀőäđįʼnģ...",
"no-tags": "Ńő ŧäģş ƒőūʼnđ",
"placeholder": "Fįľŧęř þy ŧäģ"
},
"time-picker": {
"absolute": {
"recent-title": "Ŗęčęʼnŧľy ūşęđ äþşőľūŧę řäʼnģęş",
@ -572,12 +619,20 @@
"loading": "Ŀőäđįʼnģ şęşşįőʼnş..."
},
"variable": {
"adhoc": {
"placeholder": "Ŝęľęčŧ väľūę"
},
"dropdown": {
"placeholder": "Ēʼnŧęř väřįäþľę väľūę"
},
"picker": {
"input": "Ēʼnŧęř väřįäþľę väľūę",
"link-all": "Åľľ",
"option-all": "Åľľ",
"option-selected-values": "Ŝęľęčŧęđ",
"option-tooltip": "Cľęäř şęľęčŧįőʼnş"
},
"textbox": {
"placeholder": "Ēʼnŧęř väřįäþľę väľūę"
}
}
}

View File

@ -18,6 +18,7 @@
"section": {
"actions": "",
"dashboard-search-results": "",
"folder-search-results": "",
"pages": "",
"preferences": "",
"recent-dashboards": ""
@ -110,6 +111,13 @@
"folder-picker": {
"loading": "正在加载文件夹..."
},
"grafana-ui": {
"segment-async": {
"error": "",
"loading": "",
"no-options": ""
}
},
"library-panel": {
"add-modal": {
"cancel": "取消",
@ -251,6 +259,9 @@
"manage-dashboards": {
"title": "浏览"
},
"manage-folder": {
"subtitle": ""
},
"monitoring": {
"subtitle": "监控和基础设施应用",
"title": "正在监控"
@ -345,6 +356,11 @@
"navigation": {
"kiosk": {
"tv-alert": "按 ESC 退出 kiosk 模式"
},
"toolbar": {
"enable-kiosk": "",
"toggle-menu": "",
"toggle-search-bar": ""
}
},
"news": {
@ -393,11 +409,37 @@
}
},
"search": {
"actions": {
"include-panels": "",
"remove-datasource-filter": "",
"sort-placeholder": "",
"starred": "",
"view-as-folders": "",
"view-as-grid": "",
"view-as-list": ""
},
"dashboard-actions": {
"import": "",
"new": "",
"new-dashboard": "",
"new-folder": ""
},
"folder-view": {
"go-to-folder": "",
"select-folder": ""
},
"results-table": {
"datasource-header": "",
"location-header": "",
"name-header": "",
"tags-header": "",
"type-dashboard": "",
"type-folder": "",
"type-header": ""
},
"search-input": {
"include-panels-placeholder": "",
"placeholder": ""
}
},
"share-modal": {
@ -497,6 +539,11 @@
},
"title": "首选项"
},
"tag-filter": {
"loading": "",
"no-tags": "",
"placeholder": ""
},
"time-picker": {
"absolute": {
"recent-title": "最近使用的绝对范围",
@ -572,12 +619,20 @@
"loading": "正在加载会话..."
},
"variable": {
"adhoc": {
"placeholder": ""
},
"dropdown": {
"placeholder": ""
},
"picker": {
"input": "",
"link-all": "",
"option-all": "",
"option-selected-values": "",
"option-tooltip": ""
},
"textbox": {
"placeholder": ""
}
}
}