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>
pull/78116/head
Khushi Jain 2 years ago committed by GitHub
parent cf89307428
commit f41f939c1c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 30
      public/app/features/correlations/Forms/ConfigureCorrelationBasicInfoForm.tsx
  2. 80
      public/app/features/correlations/Forms/ConfigureCorrelationSourceForm.tsx
  3. 23
      public/app/features/correlations/Forms/ConfigureCorrelationTargetForm.tsx
  4. 9
      public/app/features/correlations/Forms/CorrelationFormNavigation.tsx
  5. 54
      public/app/features/correlations/Forms/QueryEditorField.tsx
  6. 53
      public/app/features/correlations/Forms/TransformationEditorRow.tsx
  7. 13
      public/app/features/correlations/Forms/TransformationsEditor.tsx
  8. 26
      public/app/features/correlations/Forms/types.ts
  9. 76
      public/locales/de-DE/grafana.json
  10. 76
      public/locales/en-US/grafana.json
  11. 76
      public/locales/es-ES/grafana.json
  12. 76
      public/locales/fr-FR/grafana.json
  13. 76
      public/locales/pseudo-LOCALE/grafana.json
  14. 76
      public/locales/zh-Hans/grafana.json

@ -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…
Cancel
Save