[ML] field data card translations (#27593)

[ML] translate field data card
This commit is contained in:
pavel06081991 2019-01-04 09:58:34 +03:00 committed by GitHub
parent 20ed7d43b7
commit ac99a2eb85
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 261 additions and 67 deletions

View file

@ -1,13 +1,23 @@
<div ng-if="card.existsInDocs === true" class="card-contents">
<div class="stats euiText">
<div class="stat"><i class="fa fa-files-o" aria-hidden="true"></i>
{{ card.stats.count }} <ng-pluralize count="card.stats.count" when="{'1':'document', 'other':'documents'}">documents</ng-pluralize>
<span
i18n-id="xpack.ml.fieldDataCard.cardBoolean.cardStatsCountDocumentsPercentsLabel"
i18n-default-message="{cardStatsCount, plural, one {# document} other {# documents}}"
i18n-values="{
cardStatsCount: card.stats.count,
}"
></span>
({{ 100 * card.stats.count / card.stats.sampleCount | number:1 }}%)
</div>
</div>
<div class="stats euiText">
<div class="stat">values</div>
<div
class="stat"
i18n-id="xpack.ml.fieldDataCard.cardBoolean.valuesLabel"
i18n-default-message="values"
></div>
<div class="top-value">
<div class="field-label"
tooltip-html-unsafe="true"

View file

@ -1,11 +1,30 @@
<div ng-if="card.existsInDocs === true" class="card-contents">
<div class="stats euiText">
<div class="stat"><i class="fa fa-files-o" aria-hidden="true"></i>
{{ card.stats.count }} <ng-pluralize count="card.stats.count" when="{'1':'document', 'other':'documents'}">documents</ng-pluralize>
<span
i18n-id="xpack.ml.fieldDataCard.cardDate.cardStatsCountDocumentsPercentsLabel"
i18n-default-message="{cardStatsCount, plural, one {# document} other {# documents}}"
i18n-values="{
cardStatsCount: card.stats.count,
}"
></span>
({{ 100 * card.stats.count / card.stats.sampleCount | number:1 }}%)
</div>
<div class="stat">earliest {{ card.stats.earliest | moment }}</div>
<div class="stat">latest {{ card.stats.latest | moment }}</div>
<div
class="stat"
i18n-id="xpack.ml.fieldDataCard.cardDate.earliestLabel"
i18n-default-message="earliest {earliestCardStats}"
i18n-values="{
earliestCardStats: (card.stats.earliest | moment),
}"
></div>
<div
class="stat"
i18n-id="xpack.ml.fieldDataCard.cardDate.latestLabel"
i18n-default-message="latest {latestCardStats}"
i18n-values="{
latestCardStats: (card.stats.latest | moment),
}"
></div>
</div>
</div>

View file

@ -8,8 +8,10 @@
<div class="content-wrapper" />
</ml-document-count-chart>
</div>
<div class="sampled-message euiText">
Calculated over all documents
</div>
<div
class="sampled-message euiText"
i18n-id="xpack.ml.fieldDataCard.cardDocumentCount.calculatedOverAllDocumentsLabel"
i18n-default-message="Calculated over all documents"
></div>
</div>

View file

@ -1,15 +1,34 @@
<div ng-if="card.existsInDocs === true" class="card-contents">
<div class="stats euiText">
<div ng-if="card.aggregatable === true" class="stat"><i class="fa fa-files-o" aria-hidden="true"></i>
{{ card.stats.count }} <ng-pluralize count="card.stats.count" when="{'1':'document', 'other':'documents'}">documents</ng-pluralize>
<span
i18n-id="xpack.ml.fieldDataCard.cardGeoPoint.cardStatsCountDocumentsPercentsLabel"
i18n-default-message="{cardStatsCount, plural, one {# document} other {# documents}}"
i18n-values="{
cardStatsCount: card.stats.count,
}"
></span>
({{ 100 * card.stats.count / card.stats.sampleCount | number:1 }}%)
</div>
<div ng-if="card.aggregatable === true" class="stat"><i class="fa fa-cubes" aria-hidden="true"></i> {{ card.stats.cardinality }} distinct
<ng-pluralize count="card.stats.cardinality" when="{'1':'value', 'other':'values'}">values</ng-pluralize>
<div ng-if="card.aggregatable === true" class="stat"><i class="fa fa-cubes" aria-hidden="true"></i>
<span
i18n-id="xpack.ml.fieldDataCard.cardGeoPoint.cardStatsCardinalityDistinctValuesLabel"
i18n-default-message="{cardStatsCardinality} distinct {cardStatsCardinality, plural, one {value} other {values}}"
i18n-values="{
cardStatsCardinality: card.stats.cardinality,
}"
></span>
</div>
</div>
<div ng-if="card.stats.examples.length > 0" class="stats euiText">
<div class="stat"><ng-pluralize count="card.stats.examples.length" when="{'1':'value', 'other':'examples'}">examples</ng-pluralize></div>
<div
class="stat"
i18n-id="xpack.ml.fieldDataCard.cardGeoPoint.cardStatsExamplesLabel"
i18n-default-message="{cardStatsExamplesLength, plural, one {value} other {examples}}"
i18n-values="{
cardStatsExamplesLength: card.stats.examples.length,
}"
></div>
<div ng-repeat="example in card.stats.examples">
{{ example }}
</div>

View file

@ -1,17 +1,33 @@
<div ng-if="card.existsInDocs === true" class="card-contents">
<div class="stats euiText">
<div class="stat"><i class="fa fa-files-o" aria-hidden="true"></i>
{{ card.stats.count }} <ng-pluralize count="card.stats.count" when="{'1':'document', 'other':'documents'}">documents</ng-pluralize>
<span
i18n-id="xpack.ml.fieldDataCard.cardIp.cardStatsCountDocumentsPercentsLabel"
i18n-default-message="{cardStatsCount, plural, one {# document} other {# documents}}"
i18n-values="{
cardStatsCount: card.stats.count,
}"
></span>
({{ 100 * card.stats.count / card.stats.sampleCount | number:1 }}%)
</div>
<div class="stat"><i class="fa fa-cubes" aria-hidden="true"></i> {{ card.stats.cardinality }} distinct
<ng-pluralize count="card.stats.cardinality" when="{'1':'value', 'other':'values'}">values</ng-pluralize>
<div class="stat"><i class="fa fa-cubes" aria-hidden="true"></i>
<span
i18n-id="xpack.ml.fieldDataCard.cardIp.cardStatsCardinalityDistinctValuesLabel"
i18n-default-message="{cardStatsCardinality} distinct {cardStatsCardinality, plural, one {value} other {values}}"
i18n-values="{
cardStatsCardinality: card.stats.cardinality,
}"
></span>
</div>
</div>
<div class="stats euiText">
<div class="stat">top values</div>
<div
class="stat"
i18n-id="xpack.ml.fieldDataCard.cardIp.topValuesLabel"
i18n-default-message="top values"
></div>
<ml-top-values></ml-top-values>
</div>
</div>

View file

@ -1,16 +1,32 @@
<div ng-if="card.existsInDocs === true" class="card-contents">
<div class="stats euiText">
<div class="stat"><i class="fa fa-files-o" aria-hidden="true"></i>
{{ card.stats.count }} <ng-pluralize count="card.stats.count" when="{'1':'document', 'other':'documents'}">documents</ng-pluralize>
<span
i18n-id="xpack.ml.fieldDataCard.cardKeyword.cardStatsCountDocumentsPercentsLabel"
i18n-default-message="{cardStatsCount, plural, one {# document} other {# documents}}"
i18n-values="{
cardStatsCount: card.stats.count,
}"
></span>
({{ 100 * card.stats.count / card.stats.sampleCount | number:1 }}%)
</div>
<div class="stat"><i class="fa fa-cubes" aria-hidden="true"></i> {{ card.stats.cardinality }} distinct
<ng-pluralize count="card.stats.cardinality" when="{'1':'value', 'other':'values'}">values</ng-pluralize>
<div class="stat"><i class="fa fa-cubes" aria-hidden="true"></i>
<span
i18n-id="xpack.ml.fieldDataCard.cardKeyword.cardStatsCardinalityDistinctValuesLabel"
i18n-default-message="{cardStatsCardinality} distinct {cardStatsCardinality, plural, one {value} other {values}}"
i18n-values="{
cardStatsCardinality: card.stats.cardinality,
}"
></span>
</div>
</div>
<div class="stats euiText">
<div class="stat">top values</div>
<div
class="stat"
i18n-id="xpack.ml.fieldDataCard.cardKeyword.topValuesLabel"
i18n-default-message="top values"
></div>
<ml-top-values></ml-top-values>
</div>
</div>

View file

@ -1,16 +1,40 @@
<div ng-if="card.existsInDocs === true" class="card-contents">
<div class="stats euiText">
<div class="stat"><i class="fa fa-files-o" aria-hidden="true"></i>
{{ card.stats.count }} <ng-pluralize count="card.stats.count" when="{'1':'document', 'other':'documents'}">documents</ng-pluralize>
<span
i18n-id="xpack.ml.fieldDataCard.cardNumber.cardStatsCountDocumentsPercentsLabel"
i18n-default-message="{cardStatsCount, plural, one {# document} other {# documents}}"
i18n-values="{
cardStatsCount: card.stats.count,
}"
></span>
({{ 100 * card.stats.count / card.stats.sampleCount | number:1 }}%)
</div>
<div class="stat"><i class="fa fa-cubes" aria-hidden="true"></i> {{ card.stats.cardinality }} distinct
<ng-pluralize count="card.stats.cardinality" when="{'1':'value', 'other':'values'}">values</ng-pluralize>
<div class="stat"><i class="fa fa-cubes" aria-hidden="true"></i>
<span
i18n-id="xpack.ml.fieldDataCard.cardNumber.cardStatsCardinalityDistinctValuesLabel"
i18n-default-message="{cardStatsCardinality} distinct {cardStatsCardinality, plural, one {value} other {values}}"
i18n-values="{
cardStatsCardinality: card.stats.cardinality,
}"
></span>
</div>
<div>
<div class="stat min heading">min</div>
<div class="stat median heading">median</div>
<div class="stat max heading">max</div>
<div
class="stat min heading"
i18n-id="xpack.ml.fieldDataCard.cardNumber.minLabel"
i18n-default-message="min"
></div>
<div
class="stat median heading"
i18n-id="xpack.ml.fieldDataCard.cardNumber.medianLabel"
i18n-default-message="median"
></div>
<div
class="stat max heading"
i18n-id="xpack.ml.fieldDataCard.cardNumber.maxLabel"
i18n-default-message="max"
></div>
</div>
<div>
<div class="stat min">{{ card.stats.min | formatField:card.fieldFormat }}</div>
@ -23,9 +47,17 @@
<select class="kuiSelect"
ng-model="detailsMode"
ng-change="detailsModeChanged(detailsMode)"
aria-label="Select metric details display">
<option value="distribution">distribution of values</option>
<option value="top">top values</option>
aria-label="{{:: 'xpack.ml.fieldDataCard.cardNumber.details.selectMetricDetailsDisplayAriaLabel' | i18n: { defaultMessage: 'Select metric details display' } }}">
<option
value="distribution"
i18n-id="xpack.ml.fieldDataCard.cardNumber.details.distributionOfValuesLabel"
i18n-default-message="distribution of values"
></option>
<option
value="top"
i18n-id="xpack.ml.fieldDataCard.cardNumber.details.topValuesLabel"
i18n-default-message="top values"
></option>
</select>
</div>
<div class="details-container" ng-switch on="detailsMode">

View file

@ -1,18 +1,42 @@
<div ng-if="card.existsInDocs === true" class="card-contents">
<div class="stats euiText">
<div class="stat">
{{ card.type }} type
</div>
<div
class="stat"
i18n-id="xpack.ml.fieldDataCard.cardOther.cardTypeLabel"
i18n-default-message="{cardType} type"
i18n-values="{
cardType: card.type,
}"
></div>
<div ng-if="card.aggregatable === true" class="stat"><i class="fa fa-files-o" aria-hidden="true"></i>
{{ card.stats.count }} <ng-pluralize count="card.stats.count" when="{'1':'document', 'other':'documents'}">documents</ng-pluralize>
<span
i18n-id="xpack.ml.fieldDataCard.cardOther.cardStatsCountDocumentsPercentsLabel"
i18n-default-message="{cardStatsCount, plural, one {# document} other {# documents}}"
i18n-values="{
cardStatsCount: card.stats.count,
}"
></span>
({{ 100 * card.stats.count / card.stats.sampleCount | number:1 }}%)
</div>
<div ng-if="card.aggregatable === true" class="stat"><i class="fa fa-cubes" aria-hidden="true"></i> {{ card.stats.cardinality }} distinct
<ng-pluralize count="card.stats.cardinality" when="{'1':'value', 'other':'values'}">values</ng-pluralize>
<div ng-if="card.aggregatable === true" class="stat"><i class="fa fa-cubes" aria-hidden="true"></i>
<span
i18n-id="xpack.ml.fieldDataCard.cardOther.cardStatsCardinalityDistinctValuesLabel"
i18n-default-message="{cardStatsCardinality} distinct {cardStatsCardinality, plural, one {value} other {values}}"
i18n-values="{
cardStatsCardinality: card.stats.cardinality,
}"
></span>
</div>
</div>
<div ng-if="examples.length > 0" class="stats euiText">
<div class="stat"><ng-pluralize count="card.stats.examples.length" when="{'1':'value', 'other':'examples'}">examples</ng-pluralize></div>
<div
class="stat"
i18n-id="xpack.ml.fieldDataCard.cardOther.cardStatsExamplesLabel"
i18n-default-message="{cardStatsExamplesLength, plural, one {value} other {examples}}"
i18n-values="{
cardStatsExamplesLength: card.stats.examples.length,
}"
></div>
<div ng-repeat="example in card.stats.examples">
{{ example }}
</div>

View file

@ -1,26 +1,43 @@
<div ng-if="card.existsInDocs === true" class="card-contents">
<div ng-if="card.stats.examples.length > 0" class="stats euiText">
<div class="stat"><ng-pluralize count="card.stats.examples.length" when="{'1':'value', 'other':'examples'}">examples</ng-pluralize></div>
<div
class="stat"
i18n-id="xpack.ml.fieldDataCard.cardText.examplesLabel"
i18n-default-message="{examplesLength, plural, one {value} other {examples}}"
i18n-values="{
examplesLength: card.stats.examples.length,
}"
></div>
<div ng-repeat="example in card.stats.examples">
{{ example }}
</div>
</div>
<div ng-if="card.stats.examples.length === 0" class="not-exist-message">
<div>
<p>
<i class="fa fa-exclamation-triangle" aria-hidden="true"></i> No examples were obtained for this field.
</p>
<p>
This field was not present in the <span class="text-code">_source</span>
field of documents queried.
</p>
<p>
It may be populated, for example, using a
<span class="text-code">copy_to</span> parameter in the document mapping,
or be pruned from the <span class="text-code">_source</span> field afer
indexing through the use of <span class="text-code">includes</span> and
<span class="text-code">excludes</span> parameters.
</p>
<p
i18n-id="xpack.ml.fieldDataCard.cardText.noExampleForFieldsTitle"
i18n-default-message="{icon} No examples were obtained for this field."
i18n-values="{
html_icon: '<i class=\'fa fa-exclamation-triangle\' aria-hidden=\'true\'></i>',
}"
></p>
<p
i18n-id="xpack.ml.fieldDataCard.cardText.fieldNotPresentInDocumentQueriedFieldDescription"
i18n-default-message="This field was not present in the {sourceParam} field of documents queried."
i18n-values="{
html_sourceParam: '<span class=\'text-code\'>_source</span>',
}"
></p>
<p
i18n-id="xpack.ml.fieldDataCard.cardText.fieldMayBePopulatedDescription"
i18n-default-message="It may be populated, for example, using a {copyToParam} parameter in the document mapping, or be pruned from the {sourceParam} field afer indexing through the use of {includesParam} and {excludesParam} parameters."
i18n-values="{
html_copyToParam: '<span class=\'text-code\'>copy_to</span>',
html_sourceParam: '<span class=\'text-code\'>_source</span>',
html_includesParam: '<span class=\'text-code\'>includes</span>',
html_excludesParam: '<span class=\'text-code\'>excludes</span>',
}"
></p>
</div>
</div>

View file

@ -26,7 +26,7 @@ import { uiModules } from 'ui/modules';
import { timefilter } from 'ui/timefilter';
const module = uiModules.get('apps/ml');
module.directive('mlDocumentCountChart', function (Private) {
module.directive('mlDocumentCountChart', function (Private, i18n) {
function link(scope, element, attrs) {
const svgWidth = attrs.width ? +attrs.width : 400;
const svgHeight = scope.height = attrs.height ? +attrs.height : 400;
@ -157,7 +157,15 @@ module.directive('mlDocumentCountChart', function (Private) {
function showChartTooltip(data, rect) {
const formattedDate = formatHumanReadableDateTime(data.time);
const contents = `${formattedDate}<br/><hr/>count: ${data.value}`;
const contents = i18n('xpack.ml.fieldDataCard.documentCountChart.chartTooltip', {
defaultMessage: '{formattedDate}{br}{hr}count: {dataValue}',
values: {
formattedDate,
dataValue: data.value,
br: '<br />',
hr: '<hr />',
},
});
// Calculate the y offset.
// rectY are mouseY are relative to top of the chart area.

View file

@ -3,17 +3,21 @@
<div ng-if="card.loading === true" class="card-contents">
<ml-loading-indicator
label="Loading"
label="{{:: 'xpack.ml.fieldDataCard.loadingLabel' | i18n: { defaultMessage: 'Loading' } }}"
is-loading="card.loading"
height="200"
/>
</div>
<div ng-if="card.existsInDocs === false" class="card-contents">
<div class="not-exist-message">
<i class="fa fa-exclamation-triangle" aria-hidden="true"></i>
This field does not appear in any documents for the selected time range
</div>
<div
class="not-exist-message"
i18n-id="xpack.ml.fieldDataCard.fieldDoesNotAppearInDocumentsDescription"
i18n-default-message="{icon} This field does not appear in any documents for the selected time range"
i18n-values="{
html_icon: '<i class=\'fa fa-exclamation-triangle\' aria-hidden=\'true\'></i>',
}"
></div>
</div>
<ng-include ng-if="card.loading === false" src="getCardUrl()"></ng-include>

View file

@ -21,7 +21,7 @@ import { mlChartTooltipService } from '../../components/chart_tooltip/chart_tool
import { uiModules } from 'ui/modules';
const module = uiModules.get('apps/ml');
module.directive('mlMetricDistributionChart', function () {
module.directive('mlMetricDistributionChart', function (i18n) {
function link(scope, element, attrs) {
const svgWidth = attrs.width ? +attrs.width : 400;
@ -179,7 +179,13 @@ module.directive('mlMetricDistributionChart', function () {
.attr('y', 10)
.attr('class', 'info-text')
.attr('transform', `translate(${margin.left}, ${margin.top})`)
.text(`Displaying ${minPercent} - ${maxPercent} percentiles`);
.text(i18n('xpack.ml.fieldDataCard.metricDistributionChart.displayingPercentilesLabel', {
defaultMessage: 'Displaying {minPercent} - {maxPercent} percentiles',
values: {
minPercent,
maxPercent,
},
}));
const translateTop = margin.top + infoLabelHeight;
chartGroup = svg.append('g')
@ -245,14 +251,29 @@ module.directive('mlMetricDistributionChart', function () {
}
}
let contents = `value:${xVal}`;
let contents;
const bar = scope.processedData[processedDataIdx];
const minValFormatted = scope.card.fieldFormat.convert(bar.dataMin, 'text');
if (bar.dataMax > bar.dataMin) {
const maxValFormatted = scope.card.fieldFormat.convert(bar.dataMax, 'text');
contents = `${bar.percent}% of documents have<br>values between ${minValFormatted} and ${maxValFormatted}`;
contents = i18n('xpack.ml.fieldDataCard.metricDistributionChart.documentsBarPercentBetweenValuesDescription', {
defaultMessage: '{barPercent}% of documents have{br}values between {minValFormatted} and {maxValFormatted}',
values: {
barPercent: bar.percent,
minValFormatted,
maxValFormatted,
br: '<br />',
},
});
} else {
contents = `${bar.percent}% of documents have<br>a value of ${minValFormatted}`;
contents = i18n('xpack.ml.fieldDataCard.metricDistributionChart.documentsBarPercentValueDescription', {
defaultMessage: '{barPercent}% of documents have{br}a value of {minValFormatted}',
values: {
barPercent: bar.percent,
minValFormatted,
br: '<br />',
},
});
}
contents = `<div class='eui-textCenter'>${contents}</div>`;

View file

@ -26,6 +26,12 @@
{{ 100 * value.doc_count/card.stats.topValuesSampleSize >= 0.1 ? (100 * value.doc_count/card.stats.topValuesSampleSize | number:1): '< 0.1' }}%
</div>
</div>
<div ng-if="card.stats.isTopValuesSampled === true" class="sampled-message euiText">
Calculated from sample of {{ card.stats.topValuesSamplerShardSize }} documents per shard
</div>
<div
ng-if="card.stats.isTopValuesSampled === true"
class="sampled-message euiText"
i18n-id="xpack.ml.fieldDataCard.calculatedFromSampleDescription"
i18n-default-message="Calculated from sample of {topValuesSamplerShardSize} documents per shard"
i18n-values="{
topValuesSamplerShardSize: card.stats.topValuesSamplerShardSize,
}"
></div>