mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
i18n: Markup up correlations forms for translations (#75264)
* correlations/forms * Update public/app/features/correlations/Forms/ConfigureCorrelationBasicInfoForm.tsx Co-authored-by: Josh Hunt <joshhunt@users.noreply.github.com> * Update public/app/features/correlations/Forms/ConfigureCorrelationBasicInfoForm.tsx Co-authored-by: Josh Hunt <joshhunt@users.noreply.github.com> * Update public/app/features/correlations/Forms/ConfigureCorrelationBasicInfoForm.tsx Co-authored-by: Josh Hunt <joshhunt@users.noreply.github.com> * Update public/app/features/correlations/Forms/ConfigureCorrelationBasicInfoForm.tsx Co-authored-by: Josh Hunt <joshhunt@users.noreply.github.com> * Added rest of filed * minor-changes * map function * retriggered * Update public/app/features/correlations/Forms/TransformationsEditor.tsx Co-authored-by: Piotr Jamróz <pm.jamroz@gmail.com> * removed whitespace * removed whitespace * more changes --------- Co-authored-by: Josh Hunt <joshhunt@users.noreply.github.com> Co-authored-by: Piotr Jamróz <pm.jamroz@gmail.com>
This commit is contained in:
parent
cf89307428
commit
f41f939c1c
@ -4,6 +4,7 @@ import { useFormContext } from 'react-hook-form';
|
||||
|
||||
import { GrafanaTheme2 } from '@grafana/data';
|
||||
import { Field, FieldSet, Input, TextArea, useStyles2 } from '@grafana/ui';
|
||||
import { Trans, t } from 'app/core/internationalization';
|
||||
|
||||
import { useCorrelationsFormContext } from './correlationsFormContext';
|
||||
import { FormDTO } from './types';
|
||||
@ -25,27 +26,40 @@ export const ConfigureCorrelationBasicInfoForm = () => {
|
||||
|
||||
return (
|
||||
<>
|
||||
<FieldSet label="Define correlation label (Step 1 of 3)">
|
||||
<p>Define text that will describe the correlation.</p>
|
||||
<FieldSet label={t('correlations.basic-info-form.title', 'Define correlation label (Step 1 of 3)')}>
|
||||
<Trans i18nKey="correlations.basic-info-form.sub-text">
|
||||
<p>Define text that will describe the correlation.</p>
|
||||
</Trans>
|
||||
<input type="hidden" {...register('config.type')} />
|
||||
<Field
|
||||
label="Label"
|
||||
description="This name will be used as the label for the correlation. This will show as button text, a menu item, or hover text on a link."
|
||||
label={t('correlations.basic-info-form.label-label', 'Label')}
|
||||
description={t(
|
||||
'correlations.basic-info-form.label-description',
|
||||
'This name will be used as the label for the correlation. This will show as button text, a menu item, or hover text on a link.'
|
||||
)}
|
||||
className={styles.label}
|
||||
invalid={!!formState.errors.label}
|
||||
error={formState.errors.label?.message}
|
||||
>
|
||||
<Input
|
||||
id={getInputId('label', correlation)}
|
||||
{...register('label', { required: { value: true, message: 'This field is required.' } })}
|
||||
{...register('label', {
|
||||
required: {
|
||||
value: true,
|
||||
message: t('correlations.basic-info-form.label-required', 'This field is required.'),
|
||||
},
|
||||
})}
|
||||
readOnly={readOnly}
|
||||
placeholder="e.g. Tempo traces"
|
||||
placeholder={t('correlations.basic-info-form.label-placeholder', 'e.g. Tempo traces')}
|
||||
/>
|
||||
</Field>
|
||||
|
||||
<Field
|
||||
label="Description"
|
||||
description="Optional description with more information about the link"
|
||||
label={t('correlations.basic-info-form.description-label', 'Description')}
|
||||
description={t(
|
||||
'correlations.basic-info-form.description-description',
|
||||
'Optional description with more information about the link'
|
||||
)}
|
||||
// the Field component automatically adds margin to itself, so we are forced to workaround it by overriding its styles
|
||||
className={cx(styles.description)}
|
||||
>
|
||||
|
@ -4,6 +4,7 @@ import { Controller, useFormContext } from 'react-hook-form';
|
||||
|
||||
import { DataSourceInstanceSettings, GrafanaTheme2 } from '@grafana/data';
|
||||
import { Card, Field, FieldSet, Input, useStyles2 } from '@grafana/ui';
|
||||
import { Trans, t } from 'app/core/internationalization';
|
||||
import { DataSourcePicker } from 'app/features/datasources/components/picker/DataSourcePicker';
|
||||
import { getDatasourceSrv } from 'app/features/plugins/datasource_srv';
|
||||
|
||||
@ -34,26 +35,52 @@ export const ConfigureCorrelationSourceForm = () => {
|
||||
const variables = getVariableUsageInfo(currentTargetQuery, {}).variables.map(
|
||||
(variable) => variable.variableName + (variable.fieldPath ? `.${variable.fieldPath}` : '')
|
||||
);
|
||||
|
||||
function VariableList() {
|
||||
return (
|
||||
<>
|
||||
{variables.map((name, i) => (
|
||||
<span className={styles.variable} key={i}>
|
||||
{name}
|
||||
{i < variables.length - 1 ? ', ' : ''}
|
||||
</span>
|
||||
))}
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
const dataSourceName = getDatasourceSrv().getInstanceSettings(correlation?.targetUID)?.name;
|
||||
return (
|
||||
<>
|
||||
<FieldSet
|
||||
label={`Configure the data source that will link to ${getDatasourceSrv().getInstanceSettings(
|
||||
correlation?.targetUID
|
||||
)?.name} (Step 3 of 3)`}
|
||||
label={t(
|
||||
'correlations.source-form.title',
|
||||
'Configure the data source that will link to {{dataSourceName}} (Step 3 of 3)',
|
||||
{ dataSourceName }
|
||||
)}
|
||||
>
|
||||
<p>
|
||||
Define what data source will display the correlation, and what data will replace previously defined variables.
|
||||
</p>
|
||||
<Trans i18nKey="correlations.source-form.sub-text">
|
||||
<p>
|
||||
Define what data source will display the correlation, and what data will replace previously defined
|
||||
variables.
|
||||
</p>
|
||||
</Trans>
|
||||
<Controller
|
||||
control={control}
|
||||
name="sourceUID"
|
||||
rules={{
|
||||
required: { value: true, message: 'This field is required.' },
|
||||
required: {
|
||||
value: true,
|
||||
message: t('correlations.source-form.control-required', 'This field is required.'),
|
||||
},
|
||||
}}
|
||||
render={({ field: { onChange, value } }) => (
|
||||
<Field
|
||||
label="Source"
|
||||
description="Results from selected source data source have links displayed in the panel"
|
||||
label={t('correlations.source-form.source-label', 'Source')}
|
||||
description={t(
|
||||
'correlations.source-form.source-description',
|
||||
'Results from selected source data source have links displayed in the panel'
|
||||
)}
|
||||
htmlFor="source"
|
||||
invalid={!!formState.errors.sourceUID}
|
||||
error={formState.errors.sourceUID?.message}
|
||||
@ -71,34 +98,37 @@ export const ConfigureCorrelationSourceForm = () => {
|
||||
/>
|
||||
|
||||
<Field
|
||||
label="Results field"
|
||||
description="The link will be shown next to the value of this field"
|
||||
label={t('correlations.source-form.results-label', 'Results field')}
|
||||
description={t(
|
||||
'correlations.source-form.results-description',
|
||||
'The link will be shown next to the value of this field'
|
||||
)}
|
||||
className={styles.label}
|
||||
invalid={!!formState.errors?.config?.field}
|
||||
error={formState.errors?.config?.field?.message}
|
||||
>
|
||||
<Input
|
||||
id={getInputId('field', correlation)}
|
||||
{...register('config.field', { required: 'This field is required.' })}
|
||||
{...register('config.field', {
|
||||
required: t('correlations.source-form.results-required', 'This field is required.'),
|
||||
})}
|
||||
readOnly={readOnly}
|
||||
/>
|
||||
</Field>
|
||||
{variables.length > 0 && (
|
||||
<Card>
|
||||
<Card.Heading>Variables used in the target query</Card.Heading>
|
||||
<Card.Heading>
|
||||
<Trans i18nKey="correlations.source-form.heading">Variables used in the target query</Trans>
|
||||
</Card.Heading>
|
||||
<Card.Description>
|
||||
You have used following variables in the target query:{' '}
|
||||
{variables.map((name, i) => (
|
||||
<span className={styles.variable} key={i}>
|
||||
{name}
|
||||
{i < variables.length - 1 ? ', ' : ''}
|
||||
</span>
|
||||
))}
|
||||
<br />A data point needs to provide values to all variables as fields or as transformations output to make
|
||||
the correlation button appear in the visualization.
|
||||
<br />
|
||||
Note: Not every variable needs to be explicitly defined below. A transformation such as{' '}
|
||||
<span className={styles.variable}>logfmt</span> will create variables for every key/value pair.
|
||||
<Trans i18nKey="correlations.source-form.description">
|
||||
You have used following variables in the target query: <VariableList />
|
||||
<br />A data point needs to provide values to all variables as fields or as transformations output to
|
||||
make the correlation button appear in the visualization.
|
||||
<br />
|
||||
Note: Not every variable needs to be explicitly defined below. A transformation such as{' '}
|
||||
<span className={styles.variable}>logfmt</span> will create variables for every key/value pair.
|
||||
</Trans>
|
||||
</Card.Description>
|
||||
</Card>
|
||||
)}
|
||||
|
@ -3,6 +3,7 @@ import { Controller, useFormContext, useWatch } from 'react-hook-form';
|
||||
|
||||
import { DataSourceInstanceSettings } from '@grafana/data';
|
||||
import { Field, FieldSet } from '@grafana/ui';
|
||||
import { Trans, t } from 'app/core/internationalization';
|
||||
import { DataSourcePicker } from 'app/features/datasources/components/picker/DataSourcePicker';
|
||||
|
||||
import { QueryEditorField } from './QueryEditorField';
|
||||
@ -16,18 +17,26 @@ export const ConfigureCorrelationTargetForm = () => {
|
||||
|
||||
return (
|
||||
<>
|
||||
<FieldSet label="Setup the target for the correlation (Step 2 of 3)">
|
||||
<p>
|
||||
Define what data source the correlation will link to, and what query will run when the correlation is clicked.
|
||||
</p>
|
||||
<FieldSet label={t('correlations.target-form.title', 'Setup the target for the correlation (Step 2 of 3)')}>
|
||||
<Trans i18nKey="correlations.target-form.sub-text">
|
||||
<p>
|
||||
Define what data source the correlation will link to, and what query will run when the correlation is
|
||||
clicked.
|
||||
</p>
|
||||
</Trans>
|
||||
<Controller
|
||||
control={control}
|
||||
name="targetUID"
|
||||
rules={{ required: { value: true, message: 'This field is required.' } }}
|
||||
rules={{
|
||||
required: { value: true, message: t('correlations.target-form.control-rules', 'This field is required.') },
|
||||
}}
|
||||
render={({ field: { onChange, value } }) => (
|
||||
<Field
|
||||
label="Target"
|
||||
description="Specify which data source is queried when the link is clicked"
|
||||
label={t('correlations.target-form.target-label', 'Target')}
|
||||
description={t(
|
||||
'correlations.target-form.target-description',
|
||||
'Specify which data source is queried when the link is clicked'
|
||||
)}
|
||||
htmlFor="target"
|
||||
invalid={!!formState.errors.targetUID}
|
||||
error={formState.errors.targetUID?.message}
|
||||
|
@ -1,6 +1,7 @@
|
||||
import React from 'react';
|
||||
|
||||
import { Button, HorizontalGroup } from '@grafana/ui';
|
||||
import { Trans, t } from 'app/core/internationalization';
|
||||
|
||||
import { useWizardContext } from '../components/Wizard/wizardContext';
|
||||
|
||||
@ -12,13 +13,15 @@ export const CorrelationFormNavigation = () => {
|
||||
|
||||
const LastPageNext = !readOnly && (
|
||||
<Button variant="primary" icon={loading ? 'spinner' : 'save'} type="submit" disabled={loading}>
|
||||
{correlation === undefined ? 'Add' : 'Save'}
|
||||
{correlation === undefined
|
||||
? t('correlations.navigation-form.add-button', 'Add')
|
||||
: t('correlations.navigation-form.save-button', 'Save')}
|
||||
</Button>
|
||||
);
|
||||
|
||||
const NextPage = (
|
||||
<Button variant="primary" type="submit">
|
||||
Next
|
||||
<Trans i18nKey="correlations.navigation-form.next-button">Next</Trans>
|
||||
</Button>
|
||||
);
|
||||
|
||||
@ -26,7 +29,7 @@ export const CorrelationFormNavigation = () => {
|
||||
<HorizontalGroup justify="flex-start">
|
||||
{currentPage > 0 ? (
|
||||
<Button variant="secondary" onClick={prevPage}>
|
||||
Back
|
||||
<Trans i18nKey="correlations.navigation-form.back-button">Back</Trans>
|
||||
</Button>
|
||||
) : undefined}
|
||||
|
||||
|
@ -5,6 +5,7 @@ import { useAsync } from 'react-use';
|
||||
import { CoreApp } from '@grafana/data';
|
||||
import { getDataSourceSrv } from '@grafana/runtime';
|
||||
import { Field, LoadingPlaceholder, Alert } from '@grafana/ui';
|
||||
import { Trans, t } from 'app/core/internationalization';
|
||||
|
||||
interface Props {
|
||||
dsUid?: string;
|
||||
@ -29,18 +30,20 @@ export const QueryEditorField = ({ dsUid, invalid, error, name }: Props) => {
|
||||
|
||||
return (
|
||||
<Field
|
||||
label="Query"
|
||||
label={t('correlations.query-editor.query-label', 'Query')}
|
||||
description={
|
||||
<span>
|
||||
Define the query that is run when the link is clicked. You can use{' '}
|
||||
<a
|
||||
href="https://grafana.com/docs/grafana/latest/panels-visualizations/configure-data-links/"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
>
|
||||
variables
|
||||
</a>{' '}
|
||||
to access specific field values.
|
||||
<Trans i18nKey="correlations.query-editor.query-description">
|
||||
Define the query that is run when the link is clicked. You can use{' '}
|
||||
<a
|
||||
href="https://grafana.com/docs/grafana/latest/panels-visualizations/configure-data-links/"
|
||||
target="_blank"
|
||||
rel="noreferrer"
|
||||
>
|
||||
variables
|
||||
</a>{' '}
|
||||
to access specific field values.
|
||||
</Trans>
|
||||
</span>
|
||||
}
|
||||
invalid={invalid}
|
||||
@ -51,25 +54,44 @@ export const QueryEditorField = ({ dsUid, invalid, error, name }: Props) => {
|
||||
rules={{
|
||||
validate: {
|
||||
hasQueryEditor: () =>
|
||||
QueryEditor !== undefined || 'The selected target data source must export a query editor.',
|
||||
QueryEditor !== undefined ||
|
||||
t(
|
||||
'correlations.query-editor.control-rules',
|
||||
'The selected target data source must export a query editor.'
|
||||
),
|
||||
},
|
||||
}}
|
||||
render={({ field: { value, onChange } }) => {
|
||||
if (dsLoading) {
|
||||
return <LoadingPlaceholder text="Loading query editor..." />;
|
||||
return <LoadingPlaceholder text={t('correlations.query-editor.loading', 'Loading query editor...')} />;
|
||||
}
|
||||
if (dsError) {
|
||||
return <Alert title="Error loading data source">The selected data source could not be loaded.</Alert>;
|
||||
return (
|
||||
<Alert title={t('correlations.query-editor.error-title', 'Error loading data source')}>
|
||||
<Trans i18nKey="correlations.query-editor.error-text">
|
||||
The selected data source could not be loaded.
|
||||
</Trans>
|
||||
</Alert>
|
||||
);
|
||||
}
|
||||
if (!datasource) {
|
||||
return (
|
||||
<Alert title="No data source selected" severity="info">
|
||||
Please select a target data source first.
|
||||
<Alert
|
||||
title={t('correlations.query-editor.data-source-title', 'No data source selected')}
|
||||
severity="info"
|
||||
>
|
||||
<Trans i18nKey="correlations.query-editor.data-source-text">
|
||||
Please select a target data source first.
|
||||
</Trans>
|
||||
</Alert>
|
||||
);
|
||||
}
|
||||
if (!QueryEditor) {
|
||||
return <Alert title="Data source does not export a query editor."></Alert>;
|
||||
return (
|
||||
<Alert
|
||||
title={t('correlations.query-editor.query-editor-title', 'Data source does not export a query editor.')}
|
||||
></Alert>
|
||||
);
|
||||
}
|
||||
return (
|
||||
<>
|
||||
|
@ -3,9 +3,9 @@ import React, { useState } from 'react';
|
||||
import { useFormContext, useWatch } from 'react-hook-form';
|
||||
|
||||
import { Field, Icon, IconButton, Input, Label, Select, Stack, Tooltip, useStyles2 } from '@grafana/ui';
|
||||
import { Trans, t } from 'app/core/internationalization';
|
||||
|
||||
import { getSupportedTransTypeDetails, getTransformOptions } from './types';
|
||||
|
||||
type Props = {
|
||||
index: number;
|
||||
value: Record<string, string>;
|
||||
@ -28,7 +28,10 @@ const TransformationEditorRow = (props: Props) => {
|
||||
const [keptVals, setKeptVals] = useState<{ expression?: string; mapValue?: string }>({});
|
||||
|
||||
register(`config.transformations.${index}.type`, {
|
||||
required: { value: true, message: 'Please select a transformation type' },
|
||||
required: {
|
||||
value: true,
|
||||
message: t('correlations.transform-row.transform-required', 'Please select a transformation type'),
|
||||
},
|
||||
});
|
||||
const typeValue = useWatch({ name: `config.transformations.${index}.type`, control });
|
||||
|
||||
@ -41,11 +44,17 @@ const TransformationEditorRow = (props: Props) => {
|
||||
<Field
|
||||
label={
|
||||
<Stack gap={0.5}>
|
||||
<Label htmlFor={`config.transformations.${defaultValue.id}-${index}.type`}>Type</Label>
|
||||
<Label htmlFor={`config.transformations.${defaultValue.id}-${index}.type`}>
|
||||
<Trans i18nKey="correlations.transform-row.type-label">Type</Trans>
|
||||
</Label>
|
||||
<Tooltip
|
||||
content={
|
||||
<div>
|
||||
<p>The type of transformation that will be applied to the source data.</p>
|
||||
<p>
|
||||
<Trans i18nKey="correlations.transform-row.type-tooltip">
|
||||
The type of transformation that will be applied to the source data.
|
||||
</Trans>
|
||||
</p>
|
||||
</div>
|
||||
}
|
||||
>
|
||||
@ -92,13 +101,17 @@ const TransformationEditorRow = (props: Props) => {
|
||||
<Field
|
||||
label={
|
||||
<Stack gap={0.5}>
|
||||
<Label htmlFor={`config.transformations.${defaultValue.id}.field`}>Field</Label>
|
||||
<Label htmlFor={`config.transformations.${defaultValue.id}.field`}>
|
||||
<Trans i18nKey="correlations.transform-row.field-label">Field</Trans>
|
||||
</Label>
|
||||
<Tooltip
|
||||
content={
|
||||
<div>
|
||||
<p>
|
||||
Optional. The field to transform. If not specified, the transformation will be applied to the
|
||||
results field.
|
||||
<Trans i18nKey="correlations.transform-row.field-tooltip">
|
||||
Optional. The field to transform. If not specified, the transformation will be applied to the
|
||||
results field.
|
||||
</Trans>
|
||||
</p>
|
||||
</div>
|
||||
}
|
||||
@ -112,7 +125,7 @@ const TransformationEditorRow = (props: Props) => {
|
||||
{...register(`config.transformations.${index}.field`)}
|
||||
readOnly={readOnly}
|
||||
defaultValue={defaultValue.field}
|
||||
label="field"
|
||||
label={t('correlations.transform-row.field-input', 'field')}
|
||||
id={`config.transformations.${defaultValue.id}.field`}
|
||||
/>
|
||||
</Field>
|
||||
@ -120,7 +133,7 @@ const TransformationEditorRow = (props: Props) => {
|
||||
label={
|
||||
<Stack gap={0.5}>
|
||||
<Label htmlFor={`config.transformations.${defaultValue.id}.expression`}>
|
||||
Expression
|
||||
<Trans i18nKey="correlations.transform-row.expression-label">Expression</Trans>
|
||||
{getSupportedTransTypeDetails(watch(`config.transformations.${index}.type`)).expressionDetails.required
|
||||
? ' *'
|
||||
: ''}
|
||||
@ -129,8 +142,10 @@ const TransformationEditorRow = (props: Props) => {
|
||||
content={
|
||||
<div>
|
||||
<p>
|
||||
Required for regular expression. The expression the transformation will use. Logfmt does not use
|
||||
further specifications.
|
||||
<Trans i18nKey="correlations.transform-row.expression-tooltip">
|
||||
Required for regular expression. The expression the transformation will use. Logfmt does not use
|
||||
further specifications.
|
||||
</Trans>
|
||||
</p>
|
||||
</div>
|
||||
}
|
||||
@ -146,7 +161,7 @@ const TransformationEditorRow = (props: Props) => {
|
||||
{...register(`config.transformations.${index}.expression`, {
|
||||
required: getSupportedTransTypeDetails(watch(`config.transformations.${index}.type`)).expressionDetails
|
||||
.required
|
||||
? 'Please define an expression'
|
||||
? t('correlations.transform-row.expression-required', 'Please define an expression')
|
||||
: undefined,
|
||||
})}
|
||||
defaultValue={defaultValue.expression}
|
||||
@ -158,13 +173,17 @@ const TransformationEditorRow = (props: Props) => {
|
||||
<Field
|
||||
label={
|
||||
<Stack gap={0.5}>
|
||||
<Label htmlFor={`config.transformations.${defaultValue.id}.mapValue`}>Map value</Label>
|
||||
<Label htmlFor={`config.transformations.${defaultValue.id}.mapValue`}>
|
||||
<Trans i18nKey="correlations.transform-row.map-value-label">Map value</Trans>
|
||||
</Label>
|
||||
<Tooltip
|
||||
content={
|
||||
<div>
|
||||
<p>
|
||||
Optional. Defines the name of the variable. This is currently only valid for regular expressions
|
||||
with a single, unnamed capture group.
|
||||
<Trans i18nKey="correlations.transform-row.map-value-tooltip">
|
||||
Optional. Defines the name of the variable. This is currently only valid for regular expressions
|
||||
with a single, unnamed capture group.
|
||||
</Trans>
|
||||
</p>
|
||||
</div>
|
||||
}
|
||||
@ -185,13 +204,13 @@ const TransformationEditorRow = (props: Props) => {
|
||||
{!readOnly && (
|
||||
<div className={styles.removeButton}>
|
||||
<IconButton
|
||||
tooltip="Remove transformation"
|
||||
tooltip={t('correlations.transform-row.remove-tooltip', 'Remove transformation')}
|
||||
name="trash-alt"
|
||||
onClick={() => {
|
||||
remove(index);
|
||||
}}
|
||||
>
|
||||
Remove
|
||||
<Trans i18nKey="correlations.transform-row.remove-button">Remove</Trans>
|
||||
</IconButton>
|
||||
</div>
|
||||
)}
|
||||
|
@ -4,6 +4,7 @@ import { useFormContext } from 'react-hook-form';
|
||||
|
||||
import { GrafanaTheme2 } from '@grafana/data';
|
||||
import { Button, FieldArray, Stack, useStyles2 } from '@grafana/ui';
|
||||
import { Trans } from 'app/core/internationalization';
|
||||
|
||||
import TransformationsEditorRow from './TransformationEditorRow';
|
||||
|
||||
@ -29,8 +30,14 @@ export const TransformationsEditor = (props: Props) => {
|
||||
{({ fields, append, remove }) => (
|
||||
<>
|
||||
<Stack direction="column" alignItems="flex-start">
|
||||
<div className={styles.heading}>Transformations</div>
|
||||
{fields.length === 0 && <div> No transformations defined.</div>}
|
||||
<div className={styles.heading}>
|
||||
<Trans i18nKey="correlations.transform.heading">Transformations</Trans>
|
||||
</div>
|
||||
{fields.length === 0 && (
|
||||
<div>
|
||||
<Trans i18nKey="correlations.transform.no-transform">No transformations defined.</Trans>
|
||||
</div>
|
||||
)}
|
||||
{fields.length > 0 && (
|
||||
<div>
|
||||
{fields.map((fieldVal, index) => {
|
||||
@ -53,7 +60,7 @@ export const TransformationsEditor = (props: Props) => {
|
||||
variant="secondary"
|
||||
type="button"
|
||||
>
|
||||
Add transformation
|
||||
<Trans i18nKey="correlations.transform.add-button">Add transformation</Trans>
|
||||
</Button>
|
||||
)}
|
||||
</Stack>
|
||||
|
@ -1,4 +1,5 @@
|
||||
import { SupportedTransformationType } from '@grafana/data';
|
||||
import { t } from 'app/core/internationalization';
|
||||
|
||||
import { CorrelationConfig } from '../types';
|
||||
|
||||
@ -38,27 +39,38 @@ export function getSupportedTransTypeDetails(
|
||||
switch (transType) {
|
||||
case SupportedTransformationType.Logfmt:
|
||||
return {
|
||||
label: 'Logfmt',
|
||||
label: t('correlations.trans-details.logfmt-label', 'Logfmt'),
|
||||
value: SupportedTransformationType.Logfmt,
|
||||
description: 'Parse provided field with logfmt to get variables',
|
||||
description: t(
|
||||
'correlations.trans-details.logfmt-description',
|
||||
'Parse provided field with logfmt to get variables'
|
||||
),
|
||||
expressionDetails: { show: false },
|
||||
mapValueDetails: { show: false },
|
||||
};
|
||||
case SupportedTransformationType.Regex:
|
||||
return {
|
||||
label: 'Regular expression',
|
||||
label: t('correlations.trans-details.regex-label', 'Regular expression'),
|
||||
value: SupportedTransformationType.Regex,
|
||||
description:
|
||||
'Field will be parsed with regex. Use named capture groups to return multiple variables, or a single unnamed capture group to add variable to named map value. Regex is case insensitive.',
|
||||
description: t(
|
||||
'correlations.trans-details.regex-description',
|
||||
'Field will be parsed with regex. Use named capture groups to return multiple variables, or a single unnamed capture group to add variable to named map value. Regex is case insensitive.'
|
||||
),
|
||||
expressionDetails: {
|
||||
show: true,
|
||||
required: true,
|
||||
helpText: 'Use capture groups to extract a portion of the field.',
|
||||
helpText: t(
|
||||
'correlations.trans-details.regex-expression',
|
||||
'Use capture groups to extract a portion of the field.'
|
||||
),
|
||||
},
|
||||
mapValueDetails: {
|
||||
show: true,
|
||||
required: false,
|
||||
helpText: 'Defines the name of the variable if the capture group is not named.',
|
||||
helpText: t(
|
||||
'correlations.trans-details.regex-map-values',
|
||||
'Defines the name of the variable if the capture group is not named.'
|
||||
),
|
||||
},
|
||||
};
|
||||
default:
|
||||
|
@ -138,6 +138,16 @@
|
||||
"error-message": "",
|
||||
"title": ""
|
||||
},
|
||||
"basic-info-form": {
|
||||
"description-description": "",
|
||||
"description-label": "",
|
||||
"label-description": "",
|
||||
"label-label": "",
|
||||
"label-placeholder": "",
|
||||
"label-required": "",
|
||||
"sub-text": "",
|
||||
"title": ""
|
||||
},
|
||||
"list": {
|
||||
"delete": "",
|
||||
"label": "",
|
||||
@ -146,9 +156,73 @@
|
||||
"source": "",
|
||||
"target": ""
|
||||
},
|
||||
"navigation-form": {
|
||||
"add-button": "",
|
||||
"back-button": "",
|
||||
"next-button": "",
|
||||
"save-button": ""
|
||||
},
|
||||
"page-content": "",
|
||||
"page-heading": "",
|
||||
"sub-title": ""
|
||||
"query-editor": {
|
||||
"control-rules": "",
|
||||
"data-source-text": "",
|
||||
"data-source-title": "",
|
||||
"error-text": "",
|
||||
"error-title": "",
|
||||
"loading": "",
|
||||
"query-description": "",
|
||||
"query-editor-title": "",
|
||||
"query-label": ""
|
||||
},
|
||||
"source-form": {
|
||||
"control-required": "",
|
||||
"description": "",
|
||||
"heading": "",
|
||||
"results-description": "",
|
||||
"results-label": "",
|
||||
"results-required": "",
|
||||
"source-description": "",
|
||||
"source-label": "",
|
||||
"sub-text": "",
|
||||
"title": ""
|
||||
},
|
||||
"sub-title": "",
|
||||
"target-form": {
|
||||
"control-rules": "",
|
||||
"sub-text": "",
|
||||
"target-description": "",
|
||||
"target-label": "",
|
||||
"title": ""
|
||||
},
|
||||
"trans-details": {
|
||||
"logfmt-description": "",
|
||||
"logfmt-label": "",
|
||||
"regex-description": "",
|
||||
"regex-expression": "",
|
||||
"regex-label": "",
|
||||
"regex-map-values": ""
|
||||
},
|
||||
"transform": {
|
||||
"add-button": "",
|
||||
"heading": "",
|
||||
"no-transform": ""
|
||||
},
|
||||
"transform-row": {
|
||||
"expression-label": "",
|
||||
"expression-required": "",
|
||||
"expression-tooltip": "",
|
||||
"field-input": "",
|
||||
"field-label": "",
|
||||
"field-tooltip": "",
|
||||
"map-value-label": "",
|
||||
"map-value-tooltip": "",
|
||||
"remove-button": "",
|
||||
"remove-tooltip": "",
|
||||
"transform-required": "",
|
||||
"type-label": "",
|
||||
"type-tooltip": ""
|
||||
}
|
||||
},
|
||||
"dashboard": {
|
||||
"add-menu": {
|
||||
|
@ -138,6 +138,16 @@
|
||||
"error-message": "An unknown error occurred while fetching correlation data. Please try again.",
|
||||
"title": "Error fetching correlation data"
|
||||
},
|
||||
"basic-info-form": {
|
||||
"description-description": "Optional description with more information about the link",
|
||||
"description-label": "Description",
|
||||
"label-description": "This name will be used as the label for the correlation. This will show as button text, a menu item, or hover text on a link.",
|
||||
"label-label": "Label",
|
||||
"label-placeholder": "e.g. Tempo traces",
|
||||
"label-required": "This field is required.",
|
||||
"sub-text": "<0>Define text that will describe the correlation.</0>",
|
||||
"title": "Define correlation label (Step 1 of 3)"
|
||||
},
|
||||
"list": {
|
||||
"delete": "delete correlation",
|
||||
"label": "Label",
|
||||
@ -146,9 +156,73 @@
|
||||
"source": "Source",
|
||||
"target": "Target"
|
||||
},
|
||||
"navigation-form": {
|
||||
"add-button": "Add",
|
||||
"back-button": "Back",
|
||||
"next-button": "Next",
|
||||
"save-button": "Save"
|
||||
},
|
||||
"page-content": "To enable Correlations, add it in the Grafana config:",
|
||||
"page-heading": "Correlations are disabled",
|
||||
"sub-title": "Define how data living in different data sources relates to each other. Read more in the <2>documentation<1></1></2>"
|
||||
"query-editor": {
|
||||
"control-rules": "The selected target data source must export a query editor.",
|
||||
"data-source-text": "Please select a target data source first.",
|
||||
"data-source-title": "No data source selected",
|
||||
"error-text": "The selected data source could not be loaded.",
|
||||
"error-title": "Error loading data source",
|
||||
"loading": "Loading query editor...",
|
||||
"query-description": "Define the query that is run when the link is clicked. You can use <2>variables</2> to access specific field values.",
|
||||
"query-editor-title": "Data source does not export a query editor.",
|
||||
"query-label": "Query"
|
||||
},
|
||||
"source-form": {
|
||||
"control-required": "This field is required.",
|
||||
"description": "You have used following variables in the target query: <1></1><2></2>A data point needs to provide values to all variables as fields or as transformations output to make the correlation button appear in the visualization.<4></4>Note: Not every variable needs to be explicitly defined below. A transformation such as <7>logfmt</7> will create variables for every key/value pair.",
|
||||
"heading": "Variables used in the target query",
|
||||
"results-description": "The link will be shown next to the value of this field",
|
||||
"results-label": "Results field",
|
||||
"results-required": "This field is required.",
|
||||
"source-description": "Results from selected source data source have links displayed in the panel",
|
||||
"source-label": "Source",
|
||||
"sub-text": "<0>Define what data source will display the correlation, and what data will replace previously defined variables.</0>",
|
||||
"title": "Configure the data source that will link to {{dataSourceName}} (Step 3 of 3)"
|
||||
},
|
||||
"sub-title": "Define how data living in different data sources relates to each other. Read more in the <2>documentation<1></1></2>",
|
||||
"target-form": {
|
||||
"control-rules": "This field is required.",
|
||||
"sub-text": "<0>Define what data source the correlation will link to, and what query will run when the correlation is clicked.</0>",
|
||||
"target-description": "Specify which data source is queried when the link is clicked",
|
||||
"target-label": "Target",
|
||||
"title": "Setup the target for the correlation (Step 2 of 3)"
|
||||
},
|
||||
"trans-details": {
|
||||
"logfmt-description": "Parse provided field with logfmt to get variables",
|
||||
"logfmt-label": "Logfmt",
|
||||
"regex-description": "Field will be parsed with regex. Use named capture groups to return multiple variables, or a single unnamed capture group to add variable to named map value. Regex is case insensitive.",
|
||||
"regex-expression": "Use capture groups to extract a portion of the field.",
|
||||
"regex-label": "Regular expression",
|
||||
"regex-map-values": "Defines the name of the variable if the capture group is not named."
|
||||
},
|
||||
"transform": {
|
||||
"add-button": "Add transformation",
|
||||
"heading": "Transformations",
|
||||
"no-transform": "No transformations defined."
|
||||
},
|
||||
"transform-row": {
|
||||
"expression-label": "Expression",
|
||||
"expression-required": "Please define an expression",
|
||||
"expression-tooltip": "Required for regular expression. The expression the transformation will use. Logfmt does not use further specifications.",
|
||||
"field-input": "field",
|
||||
"field-label": "Field",
|
||||
"field-tooltip": "Optional. The field to transform. If not specified, the transformation will be applied to the results field.",
|
||||
"map-value-label": "Map value",
|
||||
"map-value-tooltip": "Optional. Defines the name of the variable. This is currently only valid for regular expressions with a single, unnamed capture group.",
|
||||
"remove-button": "Remove",
|
||||
"remove-tooltip": "Remove transformation",
|
||||
"transform-required": "Please select a transformation type",
|
||||
"type-label": "Type",
|
||||
"type-tooltip": "The type of transformation that will be applied to the source data."
|
||||
}
|
||||
},
|
||||
"dashboard": {
|
||||
"add-menu": {
|
||||
|
@ -143,6 +143,16 @@
|
||||
"error-message": "",
|
||||
"title": ""
|
||||
},
|
||||
"basic-info-form": {
|
||||
"description-description": "",
|
||||
"description-label": "",
|
||||
"label-description": "",
|
||||
"label-label": "",
|
||||
"label-placeholder": "",
|
||||
"label-required": "",
|
||||
"sub-text": "",
|
||||
"title": ""
|
||||
},
|
||||
"list": {
|
||||
"delete": "",
|
||||
"label": "",
|
||||
@ -151,9 +161,73 @@
|
||||
"source": "",
|
||||
"target": ""
|
||||
},
|
||||
"navigation-form": {
|
||||
"add-button": "",
|
||||
"back-button": "",
|
||||
"next-button": "",
|
||||
"save-button": ""
|
||||
},
|
||||
"page-content": "",
|
||||
"page-heading": "",
|
||||
"sub-title": ""
|
||||
"query-editor": {
|
||||
"control-rules": "",
|
||||
"data-source-text": "",
|
||||
"data-source-title": "",
|
||||
"error-text": "",
|
||||
"error-title": "",
|
||||
"loading": "",
|
||||
"query-description": "",
|
||||
"query-editor-title": "",
|
||||
"query-label": ""
|
||||
},
|
||||
"source-form": {
|
||||
"control-required": "",
|
||||
"description": "",
|
||||
"heading": "",
|
||||
"results-description": "",
|
||||
"results-label": "",
|
||||
"results-required": "",
|
||||
"source-description": "",
|
||||
"source-label": "",
|
||||
"sub-text": "",
|
||||
"title": ""
|
||||
},
|
||||
"sub-title": "",
|
||||
"target-form": {
|
||||
"control-rules": "",
|
||||
"sub-text": "",
|
||||
"target-description": "",
|
||||
"target-label": "",
|
||||
"title": ""
|
||||
},
|
||||
"trans-details": {
|
||||
"logfmt-description": "",
|
||||
"logfmt-label": "",
|
||||
"regex-description": "",
|
||||
"regex-expression": "",
|
||||
"regex-label": "",
|
||||
"regex-map-values": ""
|
||||
},
|
||||
"transform": {
|
||||
"add-button": "",
|
||||
"heading": "",
|
||||
"no-transform": ""
|
||||
},
|
||||
"transform-row": {
|
||||
"expression-label": "",
|
||||
"expression-required": "",
|
||||
"expression-tooltip": "",
|
||||
"field-input": "",
|
||||
"field-label": "",
|
||||
"field-tooltip": "",
|
||||
"map-value-label": "",
|
||||
"map-value-tooltip": "",
|
||||
"remove-button": "",
|
||||
"remove-tooltip": "",
|
||||
"transform-required": "",
|
||||
"type-label": "",
|
||||
"type-tooltip": ""
|
||||
}
|
||||
},
|
||||
"dashboard": {
|
||||
"add-menu": {
|
||||
|
@ -143,6 +143,16 @@
|
||||
"error-message": "",
|
||||
"title": ""
|
||||
},
|
||||
"basic-info-form": {
|
||||
"description-description": "",
|
||||
"description-label": "",
|
||||
"label-description": "",
|
||||
"label-label": "",
|
||||
"label-placeholder": "",
|
||||
"label-required": "",
|
||||
"sub-text": "",
|
||||
"title": ""
|
||||
},
|
||||
"list": {
|
||||
"delete": "",
|
||||
"label": "",
|
||||
@ -151,9 +161,73 @@
|
||||
"source": "",
|
||||
"target": ""
|
||||
},
|
||||
"navigation-form": {
|
||||
"add-button": "",
|
||||
"back-button": "",
|
||||
"next-button": "",
|
||||
"save-button": ""
|
||||
},
|
||||
"page-content": "",
|
||||
"page-heading": "",
|
||||
"sub-title": ""
|
||||
"query-editor": {
|
||||
"control-rules": "",
|
||||
"data-source-text": "",
|
||||
"data-source-title": "",
|
||||
"error-text": "",
|
||||
"error-title": "",
|
||||
"loading": "",
|
||||
"query-description": "",
|
||||
"query-editor-title": "",
|
||||
"query-label": ""
|
||||
},
|
||||
"source-form": {
|
||||
"control-required": "",
|
||||
"description": "",
|
||||
"heading": "",
|
||||
"results-description": "",
|
||||
"results-label": "",
|
||||
"results-required": "",
|
||||
"source-description": "",
|
||||
"source-label": "",
|
||||
"sub-text": "",
|
||||
"title": ""
|
||||
},
|
||||
"sub-title": "",
|
||||
"target-form": {
|
||||
"control-rules": "",
|
||||
"sub-text": "",
|
||||
"target-description": "",
|
||||
"target-label": "",
|
||||
"title": ""
|
||||
},
|
||||
"trans-details": {
|
||||
"logfmt-description": "",
|
||||
"logfmt-label": "",
|
||||
"regex-description": "",
|
||||
"regex-expression": "",
|
||||
"regex-label": "",
|
||||
"regex-map-values": ""
|
||||
},
|
||||
"transform": {
|
||||
"add-button": "",
|
||||
"heading": "",
|
||||
"no-transform": ""
|
||||
},
|
||||
"transform-row": {
|
||||
"expression-label": "",
|
||||
"expression-required": "",
|
||||
"expression-tooltip": "",
|
||||
"field-input": "",
|
||||
"field-label": "",
|
||||
"field-tooltip": "",
|
||||
"map-value-label": "",
|
||||
"map-value-tooltip": "",
|
||||
"remove-button": "",
|
||||
"remove-tooltip": "",
|
||||
"transform-required": "",
|
||||
"type-label": "",
|
||||
"type-tooltip": ""
|
||||
}
|
||||
},
|
||||
"dashboard": {
|
||||
"add-menu": {
|
||||
|
@ -138,6 +138,16 @@
|
||||
"error-message": "Åʼn ūʼnĸʼnőŵʼn ęřřőř őččūřřęđ ŵĥįľę ƒęŧčĥįʼnģ čőřřęľäŧįőʼn đäŧä. Pľęäşę ŧřy äģäįʼn.",
|
||||
"title": "Ēřřőř ƒęŧčĥįʼnģ čőřřęľäŧįőʼn đäŧä"
|
||||
},
|
||||
"basic-info-form": {
|
||||
"description-description": "Øpŧįőʼnäľ đęşčřįpŧįőʼn ŵįŧĥ mőřę įʼnƒőřmäŧįőʼn äþőūŧ ŧĥę ľįʼnĸ",
|
||||
"description-label": "Đęşčřįpŧįőʼn",
|
||||
"label-description": "Ŧĥįş ʼnämę ŵįľľ þę ūşęđ äş ŧĥę ľäþęľ ƒőř ŧĥę čőřřęľäŧįőʼn. Ŧĥįş ŵįľľ şĥőŵ äş þūŧŧőʼn ŧęχŧ, ä męʼnū įŧęm, őř ĥővęř ŧęχŧ őʼn ä ľįʼnĸ.",
|
||||
"label-label": "Ŀäþęľ",
|
||||
"label-placeholder": "ę.ģ. Ŧęmpő ŧřäčęş",
|
||||
"label-required": "Ŧĥįş ƒįęľđ įş řęqūįřęđ.",
|
||||
"sub-text": "<0>Đęƒįʼnę ŧęχŧ ŧĥäŧ ŵįľľ đęşčřįþę ŧĥę čőřřęľäŧįőʼn.</0>",
|
||||
"title": "Đęƒįʼnę čőřřęľäŧįőʼn ľäþęľ (Ŝŧęp 1 őƒ 3)"
|
||||
},
|
||||
"list": {
|
||||
"delete": "đęľęŧę čőřřęľäŧįőʼn",
|
||||
"label": "Ŀäþęľ",
|
||||
@ -146,9 +156,73 @@
|
||||
"source": "Ŝőūřčę",
|
||||
"target": "Ŧäřģęŧ"
|
||||
},
|
||||
"navigation-form": {
|
||||
"add-button": "Åđđ",
|
||||
"back-button": "ßäčĸ",
|
||||
"next-button": "Ńęχŧ",
|
||||
"save-button": "Ŝävę"
|
||||
},
|
||||
"page-content": "Ŧő ęʼnäþľę Cőřřęľäŧįőʼnş, äđđ įŧ įʼn ŧĥę Ğřäƒäʼnä čőʼnƒįģ:",
|
||||
"page-heading": "Cőřřęľäŧįőʼnş äřę đįşäþľęđ",
|
||||
"sub-title": "Đęƒįʼnę ĥőŵ đäŧä ľįvįʼnģ įʼn đįƒƒęřęʼnŧ đäŧä şőūřčęş řęľäŧęş ŧő ęäčĥ őŧĥęř. Ŗęäđ mőřę įʼn ŧĥę <2>đőčūmęʼnŧäŧįőʼn<1></1></2>"
|
||||
"query-editor": {
|
||||
"control-rules": "Ŧĥę şęľęčŧęđ ŧäřģęŧ đäŧä şőūřčę mūşŧ ęχpőřŧ ä qūęřy ęđįŧőř.",
|
||||
"data-source-text": "Pľęäşę şęľęčŧ ä ŧäřģęŧ đäŧä şőūřčę ƒįřşŧ.",
|
||||
"data-source-title": "Ńő đäŧä şőūřčę şęľęčŧęđ",
|
||||
"error-text": "Ŧĥę şęľęčŧęđ đäŧä şőūřčę čőūľđ ʼnőŧ þę ľőäđęđ.",
|
||||
"error-title": "Ēřřőř ľőäđįʼnģ đäŧä şőūřčę",
|
||||
"loading": "Ŀőäđįʼnģ qūęřy ęđįŧőř...",
|
||||
"query-description": "Đęƒįʼnę ŧĥę qūęřy ŧĥäŧ įş řūʼn ŵĥęʼn ŧĥę ľįʼnĸ įş čľįčĸęđ. Ÿőū čäʼn ūşę <2>väřįäþľęş</2> ŧő äččęşş şpęčįƒįč ƒįęľđ väľūęş.",
|
||||
"query-editor-title": "Đäŧä şőūřčę đőęş ʼnőŧ ęχpőřŧ ä qūęřy ęđįŧőř.",
|
||||
"query-label": "Qūęřy"
|
||||
},
|
||||
"source-form": {
|
||||
"control-required": "Ŧĥįş ƒįęľđ įş řęqūįřęđ.",
|
||||
"description": "Ÿőū ĥävę ūşęđ ƒőľľőŵįʼnģ väřįäþľęş įʼn ŧĥę ŧäřģęŧ qūęřy: <1></1><2></2>Å đäŧä pőįʼnŧ ʼnęęđş ŧő přővįđę väľūęş ŧő äľľ väřįäþľęş äş ƒįęľđş őř äş ŧřäʼnşƒőřmäŧįőʼnş őūŧpūŧ ŧő mäĸę ŧĥę čőřřęľäŧįőʼn þūŧŧőʼn äppęäř įʼn ŧĥę vįşūäľįžäŧįőʼn.<4></4>Ńőŧę: Ńőŧ ęvęřy väřįäþľę ʼnęęđş ŧő þę ęχpľįčįŧľy đęƒįʼnęđ þęľőŵ. Å ŧřäʼnşƒőřmäŧįőʼn şūčĥ äş <7>ľőģƒmŧ</7> ŵįľľ čřęäŧę väřįäþľęş ƒőř ęvęřy ĸęy/väľūę päįř.",
|
||||
"heading": "Väřįäþľęş ūşęđ įʼn ŧĥę ŧäřģęŧ qūęřy",
|
||||
"results-description": "Ŧĥę ľįʼnĸ ŵįľľ þę şĥőŵʼn ʼnęχŧ ŧő ŧĥę väľūę őƒ ŧĥįş ƒįęľđ",
|
||||
"results-label": "Ŗęşūľŧş ƒįęľđ",
|
||||
"results-required": "Ŧĥįş ƒįęľđ įş řęqūįřęđ.",
|
||||
"source-description": "Ŗęşūľŧş ƒřőm şęľęčŧęđ şőūřčę đäŧä şőūřčę ĥävę ľįʼnĸş đįşpľäyęđ įʼn ŧĥę päʼnęľ",
|
||||
"source-label": "Ŝőūřčę",
|
||||
"sub-text": "<0>Đęƒįʼnę ŵĥäŧ đäŧä şőūřčę ŵįľľ đįşpľäy ŧĥę čőřřęľäŧįőʼn, äʼnđ ŵĥäŧ đäŧä ŵįľľ řępľäčę přęvįőūşľy đęƒįʼnęđ väřįäþľęş.</0>",
|
||||
"title": "Cőʼnƒįģūřę ŧĥę đäŧä şőūřčę ŧĥäŧ ŵįľľ ľįʼnĸ ŧő {{dataSourceName}} (Ŝŧęp 3 őƒ 3)"
|
||||
},
|
||||
"sub-title": "Đęƒįʼnę ĥőŵ đäŧä ľįvįʼnģ įʼn đįƒƒęřęʼnŧ đäŧä şőūřčęş řęľäŧęş ŧő ęäčĥ őŧĥęř. Ŗęäđ mőřę įʼn ŧĥę <2>đőčūmęʼnŧäŧįőʼn<1></1></2>",
|
||||
"target-form": {
|
||||
"control-rules": "Ŧĥįş ƒįęľđ įş řęqūįřęđ.",
|
||||
"sub-text": "<0>Đęƒįʼnę ŵĥäŧ đäŧä şőūřčę ŧĥę čőřřęľäŧįőʼn ŵįľľ ľįʼnĸ ŧő, äʼnđ ŵĥäŧ qūęřy ŵįľľ řūʼn ŵĥęʼn ŧĥę čőřřęľäŧįőʼn įş čľįčĸęđ.</0>",
|
||||
"target-description": "Ŝpęčįƒy ŵĥįčĥ đäŧä şőūřčę įş qūęřįęđ ŵĥęʼn ŧĥę ľįʼnĸ įş čľįčĸęđ",
|
||||
"target-label": "Ŧäřģęŧ",
|
||||
"title": "Ŝęŧūp ŧĥę ŧäřģęŧ ƒőř ŧĥę čőřřęľäŧįőʼn (Ŝŧęp 2 őƒ 3)"
|
||||
},
|
||||
"trans-details": {
|
||||
"logfmt-description": "Päřşę přővįđęđ ƒįęľđ ŵįŧĥ ľőģƒmŧ ŧő ģęŧ väřįäþľęş",
|
||||
"logfmt-label": "Ŀőģƒmŧ",
|
||||
"regex-description": "Fįęľđ ŵįľľ þę päřşęđ ŵįŧĥ řęģęχ. Ůşę ʼnämęđ čäpŧūřę ģřőūpş ŧő řęŧūřʼn mūľŧįpľę väřįäþľęş, őř ä şįʼnģľę ūʼnʼnämęđ čäpŧūřę ģřőūp ŧő äđđ väřįäþľę ŧő ʼnämęđ mäp väľūę. Ŗęģęχ įş čäşę įʼnşęʼnşįŧįvę.",
|
||||
"regex-expression": "Ůşę čäpŧūřę ģřőūpş ŧő ęχŧřäčŧ ä pőřŧįőʼn őƒ ŧĥę ƒįęľđ.",
|
||||
"regex-label": "Ŗęģūľäř ęχpřęşşįőʼn",
|
||||
"regex-map-values": "Đęƒįʼnęş ŧĥę ʼnämę őƒ ŧĥę väřįäþľę įƒ ŧĥę čäpŧūřę ģřőūp įş ʼnőŧ ʼnämęđ."
|
||||
},
|
||||
"transform": {
|
||||
"add-button": "Åđđ ŧřäʼnşƒőřmäŧįőʼn",
|
||||
"heading": "Ŧřäʼnşƒőřmäŧįőʼnş",
|
||||
"no-transform": "Ńő ŧřäʼnşƒőřmäŧįőʼnş đęƒįʼnęđ."
|
||||
},
|
||||
"transform-row": {
|
||||
"expression-label": "Ēχpřęşşįőʼn",
|
||||
"expression-required": "Pľęäşę đęƒįʼnę äʼn ęχpřęşşįőʼn",
|
||||
"expression-tooltip": "Ŗęqūįřęđ ƒőř řęģūľäř ęχpřęşşįőʼn. Ŧĥę ęχpřęşşįőʼn ŧĥę ŧřäʼnşƒőřmäŧįőʼn ŵįľľ ūşę. Ŀőģƒmŧ đőęş ʼnőŧ ūşę ƒūřŧĥęř şpęčįƒįčäŧįőʼnş.",
|
||||
"field-input": "ƒįęľđ",
|
||||
"field-label": "Fįęľđ",
|
||||
"field-tooltip": "Øpŧįőʼnäľ. Ŧĥę ƒįęľđ ŧő ŧřäʼnşƒőřm. Ĩƒ ʼnőŧ şpęčįƒįęđ, ŧĥę ŧřäʼnşƒőřmäŧįőʼn ŵįľľ þę äppľįęđ ŧő ŧĥę řęşūľŧş ƒįęľđ.",
|
||||
"map-value-label": "Mäp väľūę",
|
||||
"map-value-tooltip": "Øpŧįőʼnäľ. Đęƒįʼnęş ŧĥę ʼnämę őƒ ŧĥę väřįäþľę. Ŧĥįş įş čūřřęʼnŧľy őʼnľy väľįđ ƒőř řęģūľäř ęχpřęşşįőʼnş ŵįŧĥ ä şįʼnģľę, ūʼnʼnämęđ čäpŧūřę ģřőūp.",
|
||||
"remove-button": "Ŗęmővę",
|
||||
"remove-tooltip": "Ŗęmővę ŧřäʼnşƒőřmäŧįőʼn",
|
||||
"transform-required": "Pľęäşę şęľęčŧ ä ŧřäʼnşƒőřmäŧįőʼn ŧypę",
|
||||
"type-label": "Ŧypę",
|
||||
"type-tooltip": "Ŧĥę ŧypę őƒ ŧřäʼnşƒőřmäŧįőʼn ŧĥäŧ ŵįľľ þę äppľįęđ ŧő ŧĥę şőūřčę đäŧä."
|
||||
}
|
||||
},
|
||||
"dashboard": {
|
||||
"add-menu": {
|
||||
|
@ -133,6 +133,16 @@
|
||||
"error-message": "",
|
||||
"title": ""
|
||||
},
|
||||
"basic-info-form": {
|
||||
"description-description": "",
|
||||
"description-label": "",
|
||||
"label-description": "",
|
||||
"label-label": "",
|
||||
"label-placeholder": "",
|
||||
"label-required": "",
|
||||
"sub-text": "",
|
||||
"title": ""
|
||||
},
|
||||
"list": {
|
||||
"delete": "",
|
||||
"label": "",
|
||||
@ -141,9 +151,73 @@
|
||||
"source": "",
|
||||
"target": ""
|
||||
},
|
||||
"navigation-form": {
|
||||
"add-button": "",
|
||||
"back-button": "",
|
||||
"next-button": "",
|
||||
"save-button": ""
|
||||
},
|
||||
"page-content": "",
|
||||
"page-heading": "",
|
||||
"sub-title": ""
|
||||
"query-editor": {
|
||||
"control-rules": "",
|
||||
"data-source-text": "",
|
||||
"data-source-title": "",
|
||||
"error-text": "",
|
||||
"error-title": "",
|
||||
"loading": "",
|
||||
"query-description": "",
|
||||
"query-editor-title": "",
|
||||
"query-label": ""
|
||||
},
|
||||
"source-form": {
|
||||
"control-required": "",
|
||||
"description": "",
|
||||
"heading": "",
|
||||
"results-description": "",
|
||||
"results-label": "",
|
||||
"results-required": "",
|
||||
"source-description": "",
|
||||
"source-label": "",
|
||||
"sub-text": "",
|
||||
"title": ""
|
||||
},
|
||||
"sub-title": "",
|
||||
"target-form": {
|
||||
"control-rules": "",
|
||||
"sub-text": "",
|
||||
"target-description": "",
|
||||
"target-label": "",
|
||||
"title": ""
|
||||
},
|
||||
"trans-details": {
|
||||
"logfmt-description": "",
|
||||
"logfmt-label": "",
|
||||
"regex-description": "",
|
||||
"regex-expression": "",
|
||||
"regex-label": "",
|
||||
"regex-map-values": ""
|
||||
},
|
||||
"transform": {
|
||||
"add-button": "",
|
||||
"heading": "",
|
||||
"no-transform": ""
|
||||
},
|
||||
"transform-row": {
|
||||
"expression-label": "",
|
||||
"expression-required": "",
|
||||
"expression-tooltip": "",
|
||||
"field-input": "",
|
||||
"field-label": "",
|
||||
"field-tooltip": "",
|
||||
"map-value-label": "",
|
||||
"map-value-tooltip": "",
|
||||
"remove-button": "",
|
||||
"remove-tooltip": "",
|
||||
"transform-required": "",
|
||||
"type-label": "",
|
||||
"type-tooltip": ""
|
||||
}
|
||||
},
|
||||
"dashboard": {
|
||||
"add-menu": {
|
||||
|
Loading…
Reference in New Issue
Block a user