Skip to content

Commit 35eb475

Browse files
committed
feat(@clayui/language-picker): LPD-45714 Add aria-labels or correct reading with the screen reader
1 parent a9f6c7f commit 35eb475

File tree

3 files changed

+34
-13
lines changed

3 files changed

+34
-13
lines changed

packages/clay-language-picker/src/__tests__/__snapshots__/index.tsx.snap

+6-6
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ exports[`ClayLanguagePicker renders 1`] = `
66
aria-activedescendant=""
77
aria-expanded="false"
88
aria-haspopup="listbox"
9-
aria-label="Select a language, current language: en-US."
9+
aria-label="Select a language, current language: English (United States)."
1010
class="form-control-select btn btn-secondary"
1111
role="combobox"
1212
tabindex="0"
@@ -39,7 +39,7 @@ exports[`ClayLanguagePicker renders a class name for the trigger 1`] = `
3939
aria-activedescendant=""
4040
aria-expanded="false"
4141
aria-haspopup="listbox"
42-
aria-label="Select a language, current language: en-US."
42+
aria-label="Select a language, current language: English (United States)."
4343
class="trigger-class form-control-select btn btn-secondary"
4444
role="combobox"
4545
tabindex="0"
@@ -72,7 +72,7 @@ exports[`ClayLanguagePicker renders a small picker 1`] = `
7272
aria-activedescendant=""
7373
aria-expanded="false"
7474
aria-haspopup="listbox"
75-
aria-label="Select a language, current language: en-US."
75+
aria-label="Select a language, current language: English (United States)."
7676
class="form-control-select btn btn-sm btn-secondary"
7777
role="combobox"
7878
tabindex="0"
@@ -105,7 +105,7 @@ exports[`ClayLanguagePicker renders hidding the trigger text 1`] = `
105105
aria-activedescendant=""
106106
aria-expanded="false"
107107
aria-haspopup="listbox"
108-
aria-label="Select a language, current language: en-US."
108+
aria-label="Select a language, current language: English (United States)."
109109
class="form-control-select hidden-label btn btn-secondary"
110110
role="combobox"
111111
tabindex="0"
@@ -133,7 +133,7 @@ exports[`ClayLanguagePicker renders the picker with id 1`] = `
133133
aria-activedescendant=""
134134
aria-expanded="false"
135135
aria-haspopup="listbox"
136-
aria-label="Select a language, current language: en-US."
136+
aria-label="Select a language, current language: English (United States)."
137137
class="form-control-select btn btn-secondary"
138138
id="pickerId"
139139
role="combobox"
@@ -200,7 +200,7 @@ exports[`ClayLanguagePicker renders with translations 1`] = `
200200
aria-activedescendant=""
201201
aria-expanded="false"
202202
aria-haspopup="listbox"
203-
aria-label="Select a language, current language: en-US."
203+
aria-label="Select a language, current language: English (United States)."
204204
class="form-control-select btn btn-secondary"
205205
role="combobox"
206206
tabindex="0"

packages/clay-language-picker/src/__tests__/index.tsx

+5-4
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,7 @@ describe('ClayLanguagePicker', () => {
9191
<ClayLanguagePicker
9292
labels={{
9393
default: 'Default Label',
94+
option: 'Option Label',
9495
translated: 'Translated Label',
9596
translating: 'Translating Label',
9697
trigger: 'Trigger Label',
@@ -167,10 +168,10 @@ describe('ClayLanguagePicker', () => {
167168

168169
fireEvent.click(screen.getByRole('combobox'));
169170

170-
const esOption = screen.getByRole('option', {name: /es-ES/});
171-
const enOption = screen.getByRole('option', {name: /en-US/});
172-
const frOption = screen.getByRole('option', {name: /fr-FR/});
173-
const nlOption = screen.getByRole('option', {name: /nl-NL/});
171+
const esOption = screen.getByRole('option', {name: /Spanish/});
172+
const enOption = screen.getByRole('option', {name: /English/});
173+
const frOption = screen.getByRole('option', {name: /French/});
174+
const nlOption = screen.getByRole('option', {name: /Dutch/});
174175

175176
expect(enOption).toHaveTextContent('Default');
176177
expect(esOption).toHaveTextContent('Translating 2/4');

packages/clay-language-picker/src/index.tsx

+23-3
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import React from 'react';
1515
type DisplayType = 'info' | 'secondary' | 'success' | 'warning';
1616

1717
type Item = {
18+
displayName?: string;
1819
href?: string;
1920
id: string;
2021
label: string;
@@ -23,6 +24,7 @@ type Item = {
2324

2425
type Labels = {
2526
default: string;
27+
option: string;
2628
trigger: string;
2729
translated: string;
2830
translating: string;
@@ -129,7 +131,20 @@ const TranslationLabel = ({
129131
}
130132
}
131133

132-
return <ClayLabel displayType={displayType}>{label}</ClayLabel>;
134+
return (
135+
<>
136+
<span className="sr-only">
137+
{sub(labels.option, [
138+
locale.displayName || locale.label,
139+
label,
140+
])}
141+
</span>
142+
143+
<ClayLabel aria-hidden="true" displayType={displayType}>
144+
{label}
145+
</ClayLabel>
146+
</>
147+
);
133148
};
134149

135150
TranslationLabel.displayName = 'Label';
@@ -184,6 +199,7 @@ Trigger.displayName = 'Trigger';
184199
const ClayLanguagePicker = ({
185200
labels = {
186201
default: 'Default',
202+
option: '{0} language: {1}.',
187203
translated: 'Translated',
188204
translating: 'Translating {0}/{1}',
189205
trigger: 'Select a language, current language: {0}.',
@@ -207,7 +223,9 @@ const ClayLanguagePicker = ({
207223
return (
208224
<Picker
209225
active={active}
210-
ariaLabelTrigger={sub(labels.trigger, [selectedLocale.label])}
226+
ariaLabelTrigger={sub(labels.trigger, [
227+
selectedLocale.displayName || selectedLocale.label,
228+
])}
211229
as={Trigger}
212230
classNamesTrigger={classNamesTrigger}
213231
hideTriggerText={hideTriggerText}
@@ -237,7 +255,9 @@ const ClayLanguagePicker = ({
237255
symbol={locale.symbol}
238256
/>
239257

240-
{locale.label}
258+
<span aria-hidden="true">
259+
{locale.label}
260+
</span>
241261
</ClayLayout.ContentSection>
242262
</ClayLayout.ContentCol>
243263
{hasTranslations ? (

0 commit comments

Comments
 (0)