diff --git a/e2e/testcafe-devextreme/tests/accessibility/pivotGrid.ts b/e2e/testcafe-devextreme/tests/accessibility/pivotGrid.ts
new file mode 100644
index 000000000000..832980a06f49
--- /dev/null
+++ b/e2e/testcafe-devextreme/tests/accessibility/pivotGrid.ts
@@ -0,0 +1,118 @@
+import PivotGrid from 'devextreme-testcafe-models/pivotGrid';
+import { Selector } from 'testcafe';
+import url from '../../helpers/getPageUrl';
+import { createWidget } from '../../helpers/createWidget';
+import { a11yCheck } from '../../helpers/accessibility/utils';
+
+fixture.disablePageReloads`PivotGrid - Accessibility`
+ .page(url(__dirname, '../container.html'));
+
+const PIVOT_GRID_SELECTOR = '#container';
+
+const createConfig = () => ({
+ width: 1000,
+ allowSorting: true,
+ allowSortingBySummary: true,
+ allowFiltering: true,
+ allowExpandAll: true,
+ showBorders: true,
+ fieldPanel: {
+ visible: true,
+ },
+ fieldChooser: {
+ enabled: true,
+ height: 500,
+ },
+ dataSource: {
+ fields: [{
+ dataField: 'country',
+ area: 'filter',
+ }, {
+ caption: 'Region',
+ width: 120,
+ dataField: 'region',
+ area: 'row',
+ }, {
+ caption: 'City',
+ dataField: 'city',
+ width: 150,
+ area: 'row',
+ }, {
+ caption: 'Country',
+ dataField: 'country',
+ area: 'column',
+ }, {
+ dataField: 'date',
+ dataType: 'date',
+ area: 'column',
+ }, {
+ groupName: 'date',
+ groupInterval: 'year',
+ expanded: true,
+ area: 'column',
+ }, {
+ caption: 'Sales',
+ dataField: 'amount',
+ dataType: 'number',
+ summaryType: 'sum',
+ area: 'data',
+ }],
+ store: [{
+ region: 'Africa',
+ country: 'Egypt',
+ city: 'Cairo',
+ amount: 500,
+ date: new Date('2015-05-26'),
+ }, {
+ region: 'South America',
+ country: 'Argentina',
+ city: 'Buenos Aires',
+ amount: 780,
+ date: new Date('2015-05-07'),
+ }],
+ },
+});
+
+test('grid with field panel', async (t) => {
+ await a11yCheck(t, {}, PIVOT_GRID_SELECTOR);
+}).before(async () => createWidget('dxPivotGrid', createConfig()));
+
+// The popup/menu widgets are portaled to
, outside the harness page
+// landmarks, so the best-practice 'region' rule fires on them regardless of
+// the widget's own accessibility (same convention as dataGrid/cardView a11y
+// tests). It is disabled for the overlay scenarios.
+const overlayA11yOptions = { rules: { region: { enabled: false } } };
+
+test('field chooser popup', async (t) => {
+ const pivotGrid = new PivotGrid(PIVOT_GRID_SELECTOR);
+
+ await t.click(pivotGrid.getFieldChooserButton());
+
+ await a11yCheck(t, overlayA11yOptions);
+}).before(async () => createWidget('dxPivotGrid', createConfig()));
+
+test('header filter popup', async (t) => {
+ const pivotGrid = new PivotGrid(PIVOT_GRID_SELECTOR);
+ const filterIcon = pivotGrid
+ .getColumnHeaderArea()
+ .getHeaderFilterIcon()
+ .element;
+
+ await t.click(filterIcon);
+
+ // Wait for the popup list to render so axe audits the fully-open popup.
+ await t.expect(Selector('.dx-header-filter-menu .dx-list-item').visible).ok();
+
+ await a11yCheck(t, overlayA11yOptions);
+}).before(async () => createWidget('dxPivotGrid', createConfig()));
+
+test('cell context menu', async (t) => {
+ const columnHeaderCell = Selector('.dx-pivotgrid-horizontal-headers td[tabindex]');
+
+ await t.rightClick(columnHeaderCell);
+
+ // Wait for the menu items so axe audits the fully-open context menu.
+ await t.expect(Selector('.dx-context-menu .dx-menu-item').visible).ok();
+
+ await a11yCheck(t, overlayA11yOptions);
+}).before(async () => createWidget('dxPivotGrid', createConfig()));
diff --git a/e2e/testcafe-devextreme/tests/common/pivotGrid/kbn/fields.ts b/e2e/testcafe-devextreme/tests/common/pivotGrid/kbn/fields.ts
index b153dfce0b37..6f405daa35f3 100644
--- a/e2e/testcafe-devextreme/tests/common/pivotGrid/kbn/fields.ts
+++ b/e2e/testcafe-devextreme/tests/common/pivotGrid/kbn/fields.ts
@@ -127,7 +127,9 @@ const createConfig = () => ({
.expect(menubar.count)
.eql(1, 'the area has a single menubar')
.expect(menubar.getAttribute('aria-label'))
- .eql('Row Fields', 'the menubar is labelled with the area name');
+ .contains('Row Fields', 'the menubar label starts with the area name')
+ .expect(menubar.getAttribute('aria-label'))
+ .contains('Shift + F10', 'the menubar label also describes the keyboard interactions');
await t
.expect(firstField.getAttribute('role'))
@@ -405,3 +407,58 @@ test('FieldChooser: Should traverse fields in all areas by tab', async (t) => {
.expect(dataFirstField.focused)
.ok('first field in data area is focused');
}).before(async () => createWidget('dxPivotGrid', createConfig()));
+
+// TestCafe's pressKey does not support function keys (F1-F12), so the Shift+F10
+// shortcut is reproduced by dispatching the keydown event on the focused field.
+const SHIFT_F10_KEYDOWN = {
+ key: 'F10', code: 'F10', shiftKey: true, bubbles: true, cancelable: true,
+};
+
+test('PivotGrid: Should open the context menu by Shift+F10 on a field', async (t) => {
+ const pivotGrid = new PivotGrid(PIVOT_GRID_SELECTOR);
+ const firstField = pivotGrid.getRowHeaderArea().getField(0);
+ const contextMenuItem = Selector('.dx-context-menu .dx-menu-item-text').withText('Show Field Chooser');
+
+ await t
+ .click(firstField)
+ .expect(firstField.focused)
+ .ok('field is focused after click')
+ .dispatchEvent(firstField, 'keydown', SHIFT_F10_KEYDOWN)
+ .expect(contextMenuItem.visible)
+ .ok('the field context menu is shown after Shift+F10');
+}).before(async () => createWidget('dxPivotGrid', createConfig()));
+
+test('PivotGrid: Field should have focus after the context menu is closed', async (t) => {
+ const pivotGrid = new PivotGrid(PIVOT_GRID_SELECTOR);
+ const firstField = pivotGrid.getRowHeaderArea().getField(0);
+ const contextMenuItem = Selector('.dx-context-menu .dx-menu-item-text').withText('Show Field Chooser');
+
+ await t
+ .click(firstField)
+ .dispatchEvent(firstField, 'keydown', SHIFT_F10_KEYDOWN)
+ .expect(contextMenuItem.visible)
+ .ok('the field context menu is shown after Shift+F10');
+
+ await t
+ .pressKey('esc')
+ .expect(firstField.focused)
+ .ok('the field is focused after the context menu is closed');
+}).before(async () => createWidget('dxPivotGrid', createConfig()));
+
+test('FieldChooser: Shift+F10 on a popup field should not open the grid context menu', async (t) => {
+ const pivotGrid = new PivotGrid(PIVOT_GRID_SELECTOR);
+ const fieldChooser = pivotGrid.getFieldChooser();
+ const contextMenu = Selector('.dx-context-menu .dx-menu-item-text');
+
+ await t.click(pivotGrid.getFieldChooserButton());
+
+ const firstField = fieldChooser.getRowAreaItem(0);
+
+ // Parity with the mouse: right-click on the popup fields does not show the
+ // grid context menu either.
+ await t
+ .click(firstField)
+ .dispatchEvent(firstField, 'keydown', SHIFT_F10_KEYDOWN)
+ .expect(contextMenu.exists)
+ .notOk('the grid context menu is not shown for a field chooser popup field');
+}).before(async () => createWidget('dxPivotGrid', createConfig()));
diff --git a/packages/devextreme/js/__internal/grids/pivot_grid/field_chooser/a11y.test.ts b/packages/devextreme/js/__internal/grids/pivot_grid/field_chooser/a11y.test.ts
index 2aa7ec1782c8..6d2ef1cf3155 100644
--- a/packages/devextreme/js/__internal/grids/pivot_grid/field_chooser/a11y.test.ts
+++ b/packages/devextreme/js/__internal/grids/pivot_grid/field_chooser/a11y.test.ts
@@ -3,21 +3,24 @@ import {
} from '@jest/globals';
import messageLocalization from '@js/common/core/localization/message';
-import { getFieldItemA11yLabel } from './a11y';
+import { getFieldItemA11yLabel, getFieldsAreaA11yDescription, getFieldsAreaA11yLabel } from './a11y';
-describe('getFieldItemA11yLabel', () => {
- beforeAll(() => {
- // @ts-expect-error load is not declared on the localization typing
- messageLocalization.load({
- en: {
- 'dxPivotGrid-ariaFieldLabel': 'Field: {0}',
- 'dxPivotGrid-ariaFieldHeaderFilterLabel': 'Header filter applied',
- 'dxPivotGrid-ariaFieldSortAscLabel': 'Sort order: ascending',
- 'dxPivotGrid-ariaFieldSortDescLabel': 'Sort order: descending',
- },
- });
+const AREA_DESCRIPTION = 'Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu';
+
+beforeAll(() => {
+ // @ts-expect-error load is not declared on the localization typing
+ messageLocalization.load({
+ en: {
+ 'dxPivotGrid-ariaFieldLabel': 'Field: {0}',
+ 'dxPivotGrid-ariaFieldHeaderFilterLabel': 'Header filter applied',
+ 'dxPivotGrid-ariaFieldSortAscLabel': 'Sort order: ascending',
+ 'dxPivotGrid-ariaFieldSortDescLabel': 'Sort order: descending',
+ 'dxPivotGrid-ariaFieldsAreaDescription': AREA_DESCRIPTION,
+ },
});
+});
+describe('getFieldItemA11yLabel', () => {
it('should contain only the field name by default', () => {
expect(getFieldItemA11yLabel('Region', {})).toBe('Field: Region');
});
@@ -42,3 +45,20 @@ describe('getFieldItemA11yLabel', () => {
.toBe('Field: Region, Header filter applied, Sort order: ascending');
});
});
+
+describe('getFieldsAreaA11yDescription', () => {
+ it('should return the localized interaction description', () => {
+ expect(getFieldsAreaA11yDescription()).toBe(AREA_DESCRIPTION);
+ });
+});
+
+describe('getFieldsAreaA11yLabel', () => {
+ it('should compose the area name with the interaction description', () => {
+ expect(getFieldsAreaA11yLabel('Row Fields')).toBe(`Row Fields. ${AREA_DESCRIPTION}`);
+ });
+
+ it('should fall back to the description alone when the area name is empty', () => {
+ expect(getFieldsAreaA11yLabel(undefined)).toBe(AREA_DESCRIPTION);
+ expect(getFieldsAreaA11yLabel('')).toBe(AREA_DESCRIPTION);
+ });
+});
diff --git a/packages/devextreme/js/__internal/grids/pivot_grid/field_chooser/a11y.ts b/packages/devextreme/js/__internal/grids/pivot_grid/field_chooser/a11y.ts
index ba96debfe86b..21b7d24160b9 100644
--- a/packages/devextreme/js/__internal/grids/pivot_grid/field_chooser/a11y.ts
+++ b/packages/devextreme/js/__internal/grids/pivot_grid/field_chooser/a11y.ts
@@ -8,6 +8,7 @@ const I18N_KEYS = {
hasHeaderFilter: 'dxPivotGrid-ariaFieldHeaderFilterLabel',
sortingAsc: 'dxPivotGrid-ariaFieldSortAscLabel',
sortingDesc: 'dxPivotGrid-ariaFieldSortDescLabel',
+ fieldsAreaDescription: 'dxPivotGrid-ariaFieldsAreaDescription',
};
const I18N_MESSAGE_SEPARATOR = ', ';
@@ -28,6 +29,20 @@ const getSortingLabel = (sortOrder?: SortOrderType): string | null => {
}
};
+export const getFieldsAreaA11yDescription = (): string => messageLocalization
+ .format(I18N_KEYS.fieldsAreaDescription);
+
+// The keyboard instructions are folded into the area's aria-label rather than
+// exposed via aria-description: aria-description is an ARIA 1.3 draft attribute
+// that screen readers do not read reliably, whereas the label composition
+// mirrors how DataGrid/TreeList surface such instructions.
+export const getFieldsAreaA11yLabel = (areaLabel?: string): string => {
+ const description = getFieldsAreaA11yDescription();
+ // A custom (public, optional) area caption may be empty; fall back to the
+ // description alone rather than composing "null. …"/"undefined. …".
+ return areaLabel ? `${areaLabel}. ${description}` : description;
+};
+
export const getFieldItemA11yLabel = (
caption: string,
{ sortOrder, hasHeaderFilterValue }: FieldItemA11yOptions,
diff --git a/packages/devextreme/js/__internal/grids/pivot_grid/field_chooser/m_field_chooser.ts b/packages/devextreme/js/__internal/grids/pivot_grid/field_chooser/m_field_chooser.ts
index b0e368ca563a..8c6b983cf05c 100644
--- a/packages/devextreme/js/__internal/grids/pivot_grid/field_chooser/m_field_chooser.ts
+++ b/packages/devextreme/js/__internal/grids/pivot_grid/field_chooser/m_field_chooser.ts
@@ -12,6 +12,7 @@ import ContextMenu from '@js/ui/context_menu';
import TreeView from '@js/ui/tree_view';
import { foreachDataLevel, getCompareFunction } from '../m_widget_utils';
+import { getFieldsAreaA11yLabel } from './a11y';
import { ATTRIBUTES, CLASSES, ICONS } from './const';
import { FieldChooserBase } from './m_field_chooser_base';
@@ -554,7 +555,7 @@ export class FieldChooser extends FieldChooserBase {
const hasFields = !!$container.children().length;
$container
.attr('role', hasFields ? 'menubar' : null)
- .attr('aria-label', hasFields ? that.option(`texts.${area}Fields`) : null);
+ .attr('aria-label', hasFields ? getFieldsAreaA11yLabel(that.option(`texts.${area}Fields`)) : null);
}
_renderArea(container, area) {
diff --git a/packages/devextreme/js/__internal/grids/pivot_grid/field_chooser/m_field_chooser_base.ts b/packages/devextreme/js/__internal/grids/pivot_grid/field_chooser/m_field_chooser_base.ts
index 2b3ea4e62b0f..03e52e1532e7 100644
--- a/packages/devextreme/js/__internal/grids/pivot_grid/field_chooser/m_field_chooser_base.ts
+++ b/packages/devextreme/js/__internal/grids/pivot_grid/field_chooser/m_field_chooser_base.ts
@@ -48,6 +48,11 @@ function isFieldNavigationEvent(e): boolean {
&& !e.altKey && !e.ctrlKey && !e.metaKey && !e.shiftKey;
}
+function isContextMenuKeyEvent(e): boolean {
+ return e.type === 'keydown'
+ && (e.key === 'ContextMenu' || (e.shiftKey && e.key === 'F10'));
+}
+
class HeaderFilterView extends HeaderFilterViewBase {
_getSearchExpr(options, headerFilterOptions) {
options.useDefaultSearchExpr = true;
@@ -127,6 +132,7 @@ export class FieldChooserBase extends mixinWidget {
allowFieldDragging: true,
applyChangesMode: 'instantly',
state: undefined,
+ onFieldContextMenuKeyDown: null,
headerFilter: {
width: 252,
height: 325,
@@ -187,6 +193,9 @@ export class FieldChooserBase extends mixinWidget {
break;
case 'applyChangesMode':
case 'remoteSort':
+ case 'onFieldContextMenuKeyDown':
+ // The context menu handler is read from the options on each keydown,
+ // so a runtime change requires no re-render.
break;
case 'state':
if (this._skipStateChange || !this._dataSource) {
@@ -424,6 +433,11 @@ export class FieldChooserBase extends mixinWidget {
return;
}
+ if (isContextMenuKeyEvent(e)) {
+ this._handleFieldContextMenuKey(e, field);
+ return;
+ }
+
if (!isClick) {
return;
}
@@ -555,6 +569,24 @@ export class FieldChooserBase extends mixinWidget {
return FIELD_NAVIGATION_DELTAS[key];
}
+ private _handleFieldContextMenuKey(e, field): void {
+ const onContextMenuKey = this.option('onFieldContextMenuKeyDown');
+
+ if (!field.area || !onContextMenuKey) {
+ return;
+ }
+
+ const navigation = this._getFieldNavigation(field.area);
+
+ // The event can bubble to another instance subscribed to an ancestor
+ // element; the field then does not belong to this instance's items.
+ if (!navigation.getItems().includes(e.currentTarget)) {
+ return;
+ }
+
+ onContextMenuKey(e, navigation);
+ }
+
private _handleFieldNavigation(e, field): void {
if (!field.area) {
return;
diff --git a/packages/devextreme/js/__internal/grids/pivot_grid/fields_area/m_fields_area.ts b/packages/devextreme/js/__internal/grids/pivot_grid/fields_area/m_fields_area.ts
index 5f2ce5e9afc6..fc5e16ed8ade 100644
--- a/packages/devextreme/js/__internal/grids/pivot_grid/fields_area/m_fields_area.ts
+++ b/packages/devextreme/js/__internal/grids/pivot_grid/fields_area/m_fields_area.ts
@@ -9,6 +9,7 @@ import Popup from '@js/ui/popup/ui.popup';
import { capitalize } from '@ts/core/utils/capitalize';
import { AreaItem } from '../area_item/m_area_item';
+import { getFieldsAreaA11yLabel } from '../field_chooser/a11y';
const DIV = '';
@@ -188,7 +189,7 @@ class FieldsArea extends AreaItem {
row.attr('role', 'presentation');
tableElement
.attr('role', 'menubar')
- .attr('aria-label', this._getAreaLabel());
+ .attr('aria-label', getFieldsAreaA11yLabel(this._getAreaLabel()));
} else {
// A menubar without menu items is invalid ARIA, so an empty area keeps
// the plain placeholder text and the table stays presentational. The
diff --git a/packages/devextreme/js/__internal/grids/pivot_grid/m_widget.ts b/packages/devextreme/js/__internal/grids/pivot_grid/m_widget.ts
index 1f0416414458..8958a3a5fa68 100644
--- a/packages/devextreme/js/__internal/grids/pivot_grid/m_widget.ts
+++ b/packages/devextreme/js/__internal/grids/pivot_grid/m_widget.ts
@@ -1053,7 +1053,19 @@ class PivotGrid extends Widget {
const cell = e.currentTarget;
const navigation = this._getCellAreaNavigation(cell);
- if (!navigation || !this._contextMenu) {
+ if (!navigation) {
+ return;
+ }
+
+ this._showContextMenuFromKeyboard(e, navigation);
+ }
+
+ _handleFieldContextMenuKeyDown(e, navigation: RovingTabIndex) {
+ this._showContextMenuFromKeyboard(e, navigation);
+ }
+
+ _showContextMenuFromKeyboard(e, navigation: RovingTabIndex) {
+ if (!this._contextMenu) {
return;
}
@@ -1449,6 +1461,7 @@ class PivotGrid extends Widget {
visible: that.option('visible'),
// @ts-expect-error ts-error
remoteSort: that.option('scrolling.mode') === 'virtual',
+ onFieldContextMenuKeyDown: that._handleFieldContextMenuKeyDown.bind(that),
};
if (that._fieldChooserBase) {
diff --git a/packages/devextreme/js/localization/messages/ar.json b/packages/devextreme/js/localization/messages/ar.json
index ae97bf463ae5..7f1f5cd1f245 100644
--- a/packages/devextreme/js/localization/messages/ar.json
+++ b/packages/devextreme/js/localization/messages/ar.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "من {0} إلى {1}",
"dxScheduler-ariaLabel": "المجدول. عرض {0}: {1} مع {2} مواعيد",
diff --git a/packages/devextreme/js/localization/messages/bg.json b/packages/devextreme/js/localization/messages/bg.json
index 38e8b23dadff..19bc9858b535 100644
--- a/packages/devextreme/js/localization/messages/bg.json
+++ b/packages/devextreme/js/localization/messages/bg.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "от {0} до {1}",
"dxScheduler-ariaLabel": "Планиращ. Изглед {0}: {1} с {2} срещи",
diff --git a/packages/devextreme/js/localization/messages/ca.json b/packages/devextreme/js/localization/messages/ca.json
index df5bfaab2b7f..08434194877b 100644
--- a/packages/devextreme/js/localization/messages/ca.json
+++ b/packages/devextreme/js/localization/messages/ca.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "de {0} a {1}",
"dxScheduler-ariaLabel": "Planificador. Vista {0}: {1} amb {2} cites",
diff --git a/packages/devextreme/js/localization/messages/cs.json b/packages/devextreme/js/localization/messages/cs.json
index 421bb08a22a6..6c061051d2c6 100644
--- a/packages/devextreme/js/localization/messages/cs.json
+++ b/packages/devextreme/js/localization/messages/cs.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "od {0} do {1}",
"dxScheduler-ariaLabel": "Plánovač. Zobrazení {0}: {1} s {2} schůzkami",
diff --git a/packages/devextreme/js/localization/messages/da.json b/packages/devextreme/js/localization/messages/da.json
index 1c618d9c90b8..11a9a05e18a8 100644
--- a/packages/devextreme/js/localization/messages/da.json
+++ b/packages/devextreme/js/localization/messages/da.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "fra {0} til {1}",
"dxScheduler-ariaLabel": "Planlægger. {0} visning: {1} med {2} aftaler",
diff --git a/packages/devextreme/js/localization/messages/de.json b/packages/devextreme/js/localization/messages/de.json
index 32a23c4c855d..b879d887b2e0 100644
--- a/packages/devextreme/js/localization/messages/de.json
+++ b/packages/devextreme/js/localization/messages/de.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "von {0} bis {1}",
"dxScheduler-ariaLabel": "Planer. {0} Ansicht: {1} mit {2} Terminen",
diff --git a/packages/devextreme/js/localization/messages/el.json b/packages/devextreme/js/localization/messages/el.json
index 50303e2f3f32..410525906916 100644
--- a/packages/devextreme/js/localization/messages/el.json
+++ b/packages/devextreme/js/localization/messages/el.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "από {0} έως {1}",
"dxScheduler-ariaLabel": "Χρονοδιάγραμμα. Προβολή {0}: {1} με {2} ραντεβού",
diff --git a/packages/devextreme/js/localization/messages/en.json b/packages/devextreme/js/localization/messages/en.json
index 9e18b0112bb9..3cc9ee712f45 100644
--- a/packages/devextreme/js/localization/messages/en.json
+++ b/packages/devextreme/js/localization/messages/en.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "from {0} to {1}",
"dxScheduler-ariaLabel": "Scheduler. {0} view: {1} with {2} appointments",
diff --git a/packages/devextreme/js/localization/messages/es.json b/packages/devextreme/js/localization/messages/es.json
index 6c425262afb6..a5eb82dfd2f4 100644
--- a/packages/devextreme/js/localization/messages/es.json
+++ b/packages/devextreme/js/localization/messages/es.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "desde {0} hasta {1}",
"dxScheduler-ariaLabel": "Programador. Vista {0}: {1} con {2} citas",
diff --git a/packages/devextreme/js/localization/messages/fa.json b/packages/devextreme/js/localization/messages/fa.json
index 0e6e33896bda..0b555fdb31cd 100644
--- a/packages/devextreme/js/localization/messages/fa.json
+++ b/packages/devextreme/js/localization/messages/fa.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "از {0} تا {1}",
"dxScheduler-ariaLabel": "زمانبندی. نمای {0}: {1} با {2} قرار ملاقات",
diff --git a/packages/devextreme/js/localization/messages/fi.json b/packages/devextreme/js/localization/messages/fi.json
index 40fc04c86121..880645f0ee67 100644
--- a/packages/devextreme/js/localization/messages/fi.json
+++ b/packages/devextreme/js/localization/messages/fi.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "{0}–{1}",
"dxScheduler-ariaLabel": "Kalenteri. {0} näkymä: {1}, {2} tapaamista",
diff --git a/packages/devextreme/js/localization/messages/fr.json b/packages/devextreme/js/localization/messages/fr.json
index 56199a27fbf7..17202169a75f 100644
--- a/packages/devextreme/js/localization/messages/fr.json
+++ b/packages/devextreme/js/localization/messages/fr.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "de {0} à {1}",
"dxScheduler-ariaLabel": "Agenda. {0} vue : {1} avec {2} rendez-vous",
diff --git a/packages/devextreme/js/localization/messages/hi.json b/packages/devextreme/js/localization/messages/hi.json
index 4565fa033c74..8edd00ee8896 100644
--- a/packages/devextreme/js/localization/messages/hi.json
+++ b/packages/devextreme/js/localization/messages/hi.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "{0} से {1} तक",
"dxScheduler-ariaLabel": "अनुसूचक. {0} दृश्य: {1} {2} नियुक्तियों के साथ",
diff --git a/packages/devextreme/js/localization/messages/hu.json b/packages/devextreme/js/localization/messages/hu.json
index 0489c368b29b..702917079837 100644
--- a/packages/devextreme/js/localization/messages/hu.json
+++ b/packages/devextreme/js/localization/messages/hu.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "{0}-tól {1}-ig",
"dxScheduler-ariaLabel": "Ütemező. {0} nézet: {1}, {2} eseménnyel",
diff --git a/packages/devextreme/js/localization/messages/it.json b/packages/devextreme/js/localization/messages/it.json
index 18706faf09dc..bc6dbf5fd8be 100644
--- a/packages/devextreme/js/localization/messages/it.json
+++ b/packages/devextreme/js/localization/messages/it.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "da {0} a {1}",
"dxScheduler-ariaLabel": "Pianificatore. Vista {0}: {1} con {2} appuntamenti",
diff --git a/packages/devextreme/js/localization/messages/ja.json b/packages/devextreme/js/localization/messages/ja.json
index 67765a05647c..edf393f5e225 100644
--- a/packages/devextreme/js/localization/messages/ja.json
+++ b/packages/devextreme/js/localization/messages/ja.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "{0} から {1} まで",
"dxScheduler-ariaLabel": "スケジューラー。{0} ビュー: {2} 件の予定がある {1}",
diff --git a/packages/devextreme/js/localization/messages/ko.json b/packages/devextreme/js/localization/messages/ko.json
index f8e54232e4ae..5aaa4fbc750a 100644
--- a/packages/devextreme/js/localization/messages/ko.json
+++ b/packages/devextreme/js/localization/messages/ko.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "{0}부터 {1}까지",
"dxScheduler-ariaLabel": "스케줄러. {0} 보기: {1}, 일정 {2}개",
diff --git a/packages/devextreme/js/localization/messages/lt.json b/packages/devextreme/js/localization/messages/lt.json
index 404566053665..a7c63239882c 100644
--- a/packages/devextreme/js/localization/messages/lt.json
+++ b/packages/devextreme/js/localization/messages/lt.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "nuo {0} iki {1}",
"dxScheduler-ariaLabel": "Planuotuvas. {0} vaizdas: {1} su {2} įvykių",
diff --git a/packages/devextreme/js/localization/messages/lv.json b/packages/devextreme/js/localization/messages/lv.json
index c5f598c42ab0..366c2e30101a 100644
--- a/packages/devextreme/js/localization/messages/lv.json
+++ b/packages/devextreme/js/localization/messages/lv.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "no {0} līdz {1}",
"dxScheduler-ariaLabel": "Plānotājs. {0} skats: {1} ar {2} apmeklējumiem",
diff --git a/packages/devextreme/js/localization/messages/nb.json b/packages/devextreme/js/localization/messages/nb.json
index 3278298e3929..33db6adbb1a3 100644
--- a/packages/devextreme/js/localization/messages/nb.json
+++ b/packages/devextreme/js/localization/messages/nb.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "fra {0} til {1}",
"dxScheduler-ariaLabel": "Planlegger. {0}-visning: {1} med {2} avtaler",
diff --git a/packages/devextreme/js/localization/messages/nl.json b/packages/devextreme/js/localization/messages/nl.json
index cec1f875e4e1..7657acbef6da 100644
--- a/packages/devextreme/js/localization/messages/nl.json
+++ b/packages/devextreme/js/localization/messages/nl.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "van {0} tot {1}",
"dxScheduler-ariaLabel": "Planner. {0} weergave: {1} met {2} afspraken",
diff --git a/packages/devextreme/js/localization/messages/pl.json b/packages/devextreme/js/localization/messages/pl.json
index 9d3e2ddfb49b..efc85cda233d 100644
--- a/packages/devextreme/js/localization/messages/pl.json
+++ b/packages/devextreme/js/localization/messages/pl.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "od {0} do {1}",
"dxScheduler-ariaLabel": "Harmonogram. Widok {0}: {1}, liczba spotkań: {2}",
diff --git a/packages/devextreme/js/localization/messages/pt-BR.json b/packages/devextreme/js/localization/messages/pt-BR.json
index cfc76b361fcb..f1148877c3b9 100644
--- a/packages/devextreme/js/localization/messages/pt-BR.json
+++ b/packages/devextreme/js/localization/messages/pt-BR.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "de {0} a {1}",
"dxScheduler-ariaLabel": "Agendador. Visualização {0}: {1} com {2} compromissos",
diff --git a/packages/devextreme/js/localization/messages/pt-PT.json b/packages/devextreme/js/localization/messages/pt-PT.json
index e7ed42e50c46..2b6a8b0903ae 100644
--- a/packages/devextreme/js/localization/messages/pt-PT.json
+++ b/packages/devextreme/js/localization/messages/pt-PT.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "de {0} a {1}",
"dxScheduler-ariaLabel": "Agendador. Visualização {0}: {1} com {2} compromissos",
diff --git a/packages/devextreme/js/localization/messages/pt.json b/packages/devextreme/js/localization/messages/pt.json
index f330fc6e4a3b..ef1f7b811c37 100644
--- a/packages/devextreme/js/localization/messages/pt.json
+++ b/packages/devextreme/js/localization/messages/pt.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "de {0} a {1}",
"dxScheduler-ariaLabel": "Agendador. Visualização {0}: {1} com {2} compromissos",
diff --git a/packages/devextreme/js/localization/messages/ro.json b/packages/devextreme/js/localization/messages/ro.json
index 226075399cb2..e3390cdd8163 100644
--- a/packages/devextreme/js/localization/messages/ro.json
+++ b/packages/devextreme/js/localization/messages/ro.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "de la {0} până la {1}",
"dxScheduler-ariaLabel": "Planificator. Vedere {0}: {1} cu {2} programări",
diff --git a/packages/devextreme/js/localization/messages/ru.json b/packages/devextreme/js/localization/messages/ru.json
index 7a74b7478883..b5ff260f08be 100644
--- a/packages/devextreme/js/localization/messages/ru.json
+++ b/packages/devextreme/js/localization/messages/ru.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "с {0} по {1}",
"dxScheduler-ariaLabel": "Планировщик. Вид {0}: {1}, записей: {2}",
diff --git a/packages/devextreme/js/localization/messages/sl.json b/packages/devextreme/js/localization/messages/sl.json
index a1f66f0c40da..57b2634d199f 100644
--- a/packages/devextreme/js/localization/messages/sl.json
+++ b/packages/devextreme/js/localization/messages/sl.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "od {0} do {1}",
"dxScheduler-ariaLabel": "Načrtovalnik. Pogled {0}: {1} z {2} dogodki",
diff --git a/packages/devextreme/js/localization/messages/sv.json b/packages/devextreme/js/localization/messages/sv.json
index b96168402604..b9f2a4cddf9d 100644
--- a/packages/devextreme/js/localization/messages/sv.json
+++ b/packages/devextreme/js/localization/messages/sv.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "från {0} till {1}",
"dxScheduler-ariaLabel": "Schemaläggare. {0}-vy: {1} med {2} bokningar",
diff --git a/packages/devextreme/js/localization/messages/tr.json b/packages/devextreme/js/localization/messages/tr.json
index 11cdc4026f00..045fae33fa47 100644
--- a/packages/devextreme/js/localization/messages/tr.json
+++ b/packages/devextreme/js/localization/messages/tr.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "{0} - {1}",
"dxScheduler-ariaLabel": "Zamanlayıcı. {0} görünümü: {1}, {2} randevu",
diff --git a/packages/devextreme/js/localization/messages/uk.json b/packages/devextreme/js/localization/messages/uk.json
index 1c5d1ccedc56..b7e42ce5fabf 100644
--- a/packages/devextreme/js/localization/messages/uk.json
+++ b/packages/devextreme/js/localization/messages/uk.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "з {0} по {1}",
"dxScheduler-ariaLabel": "Планувальник. Вид {0}: {1}, подій: {2}",
diff --git a/packages/devextreme/js/localization/messages/vi.json b/packages/devextreme/js/localization/messages/vi.json
index c353a0af4f09..c0a5a2590966 100644
--- a/packages/devextreme/js/localization/messages/vi.json
+++ b/packages/devextreme/js/localization/messages/vi.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "từ {0} đến {1}",
"dxScheduler-ariaLabel": "Lịch biểu. Chế độ xem {0}: {1} với {2} cuộc hẹn",
diff --git a/packages/devextreme/js/localization/messages/zh-CN.json b/packages/devextreme/js/localization/messages/zh-CN.json
index ef258103d173..7a1ca838dba5 100644
--- a/packages/devextreme/js/localization/messages/zh-CN.json
+++ b/packages/devextreme/js/localization/messages/zh-CN.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "从 {0} 到 {1}",
"dxScheduler-ariaLabel": "日程表。{0} 视图:{1},共 {2} 个日程",
diff --git a/packages/devextreme/js/localization/messages/zh-Hans.json b/packages/devextreme/js/localization/messages/zh-Hans.json
index 80524184160c..0d842f770a10 100644
--- a/packages/devextreme/js/localization/messages/zh-Hans.json
+++ b/packages/devextreme/js/localization/messages/zh-Hans.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "从 {0} 到 {1}",
"dxScheduler-ariaLabel": "日程表。{0} 视图:{1},共 {2} 个日程",
diff --git a/packages/devextreme/js/localization/messages/zh-tw.json b/packages/devextreme/js/localization/messages/zh-tw.json
index 24cf8ce6e3d6..a64449466788 100644
--- a/packages/devextreme/js/localization/messages/zh-tw.json
+++ b/packages/devextreme/js/localization/messages/zh-tw.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "從 {0} 到 {1}",
"dxScheduler-ariaLabel": "日程表。{0} 視圖:{1},共 {2} 個日程",
diff --git a/packages/devextreme/js/localization/messages/zh.json b/packages/devextreme/js/localization/messages/zh.json
index 5f8d476678c4..1753221a7682 100644
--- a/packages/devextreme/js/localization/messages/zh.json
+++ b/packages/devextreme/js/localization/messages/zh.json
@@ -288,6 +288,7 @@
"dxPivotGrid-ariaFieldHeaderFilterLabel": "Header filter applied",
"dxPivotGrid-ariaFieldSortAscLabel": "Sort order: ascending",
"dxPivotGrid-ariaFieldSortDescLabel": "Sort order: descending",
+ "dxPivotGrid-ariaFieldsAreaDescription": "Press Enter or Space to sort by the field, Alt + Down arrow to open the header filter, Shift + F10 to open the context menu",
"dxScheduler-dateRange": "从 {0} 到 {1}",
"dxScheduler-ariaLabel": "日程表。{0} 视图:{1},共 {2} 个日程",
diff --git a/packages/devextreme/testing/tests/DevExpress.ui.widgets.pivotGrid/pivotGrid.markup.tests.js b/packages/devextreme/testing/tests/DevExpress.ui.widgets.pivotGrid/pivotGrid.markup.tests.js
index eb4019396c83..aa0407749f27 100644
--- a/packages/devextreme/testing/tests/DevExpress.ui.widgets.pivotGrid/pivotGrid.markup.tests.js
+++ b/packages/devextreme/testing/tests/DevExpress.ui.widgets.pivotGrid/pivotGrid.markup.tests.js
@@ -270,7 +270,9 @@ QUnit.module('PivotGrid accessibility markup', {
assert.strictEqual($table.length, 1, `${area} field table exists`);
assert.strictEqual($table.attr('role'), 'menubar', `${area} field table is a menubar`);
- assert.strictEqual($table.attr('aria-label'), expectedLabels[area], `${area} menubar has localized label`);
+ assert.strictEqual($table.attr('aria-label').indexOf(expectedLabels[area]), 0, `${area} menubar label starts with the area name`);
+ assert.ok($table.attr('aria-label').length > expectedLabels[area].length, `${area} menubar label also carries the keyboard instructions`);
+ assert.strictEqual($table.attr('aria-description'), undefined, `${area} menubar does not use the unsupported aria-description attribute`);
});
// The filter area has no fields in this data source; a menubar without