feat: expose axe.resetLocale() to restore the default locale - #5108
Conversation
axe.configure({ locale }) has no inverse, and axe.reset() also clears
branding, rule enable/disable overrides, frameMessenger, and other
configuration. Consumers that let end users switch languages at
runtime had no clean way to roll back to the default English messages
without destroying the rest of their setup.
axe.resetLocale() maps directly to the existing Audit._resetLocale()
private method: no-op when no non-default locale has ever been
applied, restores rule descriptions, check messages, failure
summaries and lang to the snapshot captured on the first
applyLocale call, and leaves all other configuration untouched.
Safe to call repeatedly.
Closes #5107
There was a problem hiding this comment.
Pull request overview
This PR introduces a new public API axe.resetLocale() to revert axe-core’s runtime locale back to the original default snapshot captured on the first locale application, without performing a full axe.reset() (and therefore without clearing unrelated configuration like branding, rules, messaging configuration, etc.).
Changes:
- Added a new public method
axe.resetLocale()wired into the core public API surface. - Added unit tests covering expected behavior (error when unconfigured, no-op behavior, restoring messages/lang, repeatability, and preserving other configuration).
- Updated public-facing documentation and TypeScript declarations to include
resetLocale.
Reviewed changes
Copilot reviewed 4 out of 5 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
lib/core/public/reset-locale.js |
Adds the public wrapper that delegates to audit._resetLocale() and matches axe.reset error semantics. |
lib/core/core.js |
Exposes resetLocale on the axe public API object alongside existing axe.reset. |
test/core/public/reset-locale.js |
Adds coverage for the new API’s key behaviors and non-interference with other configuration. |
doc/API.md |
Documents the new axe.resetLocale() API and adds it to the Table of Contents. |
axe.d.ts |
Extends TypeScript typings with axe.resetLocale(): void. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
|
||
| #### Description | ||
|
|
||
| `axe.configure({ locale })` has no inverse, and `axe.reset()` also clears branding, rule enable/disable overrides, `frameMessenger`, and other configuration. `axe.resetLocale()` reverts only the locale (rule descriptions, check messages, failure summaries, `lang`) back to the default that was in effect before the first `applyLocale` call. It is a no-op if no non-default locale has ever been applied, and safe to call repeatedly. |
straker
left a comment
There was a problem hiding this comment.
Just a minor nit on the docs, but not something that really blocks the pr. Up to you if you'd like to chagne it.
| #### Description | ||
|
|
||
| `axe.configure({ locale })` has no inverse, and `axe.reset()` also clears branding, rule enable/disable overrides, `frameMessenger`, and other configuration. `axe.resetLocale()` reverts only the locale (rule descriptions, check messages, failure summaries, `lang`) back to the default that was in effect before the first `applyLocale` call. It is a no-op if no non-default locale has ever been applied, and safe to call repeatedly. |
There was a problem hiding this comment.
This describes more of why the api exists instead of what it's doing. A simple description of what the api does and an example should suffice.
## [4.12.0](v4.11.4...v4.12.0) (2026-06-01) ### Features - add gather-internals.js external script ([#5099](#5099)) ([c61d58b](c61d58b)), closes [#5080](#5080) - **aria-allowed/prohibited-attr, aria-required-parent/children:** partially support element internals role ([#5080](#5080)) ([417b48a](417b48a)), closes [#5039](#5039) [#4259](#4259) - **axe.externalAPIs:** add public api for setting elementInternal data ([#5105](#5105)) ([63bab8f](63bab8f)) - **core:** expose normalizeRunOptions ([#4998](#4998)) ([b8e6a59](b8e6a59)) - expose axe.resetLocale() to restore the default locale ([#5108](#5108)) ([c2b5292](c2b5292)), closes [#5107](#5107) - **getRules:** include rule enabled state in returned objects ([#5118](#5118)) ([75bf772](75bf772)), closes [#5116](#5116) - **list,listitem:** support element internals role ([#5119](#5119)) ([7d9d696](7d9d696)) - **new-rule:** check that aria-tab have an accessible name ([#5001](#5001)) ([0d4e4e7](0d4e4e7)), closes [#4842](#4842) - **rules:** deprecate landmark-complementary-is-top-level rules ([#4992](#4992)) ([9e09139](9e09139)), closes [#4950](#4950) - **utils:** add `getElementInternals` function ([#5077](#5077)) ([1c15f82](1c15f82)) ### Bug Fixes - **aria-allowed-attr:** restrict br and wbr elements to aria-hidden only ([#4974](#4974)) ([c6245e7](c6245e7)) - **aria-conditional-attr:** add support for radio ([#5100](#5100)) ([8223c98](8223c98)) - **aria-valid-attr-value:** handle multiple aria-errormessage IDs ([#4973](#4973)) ([0489e30](0489e30)) - **aria:** prevent getOwnedVirtual from returning duplicate nodes ([#4987](#4987)) ([48ca955](48ca955)), closes [#4840](#4840) - **commons/text:** exclude natively hidden elements from aria-labelledby accessible name ([#5076](#5076)) ([ea7202c](ea7202c)), closes [#4704](#4704) - **DqElement:** avoid calling constructors with cloneNode ([#5013](#5013)) ([0281fa1](0281fa1)) - **existing-rule:** aria-busy now shows an error message for a use with unallowed children ([#5017](#5017)) ([2067b87](2067b87)) - **helpUrl:** ensure axe.configure always updates the help URLs ([#5114](#5114)) ([c4f60ff](c4f60ff)) - **label-content-name-mismatch:** match visible text with aria-label and exclude invisible text ([#5096](#5096)) ([3a012a1](3a012a1)) - **locale:** ensure all subtags are correctly set ([#5112](#5112)) ([13005ed](13005ed)) - **scrollable-region-focusable:** clarify the issue is in safari ([#4995](#4995)) ([4ec5211](4ec5211)), closes [WebKit#190870](https://github.com/dequelabs/WebKit/issues/190870) [WebKit#277290](https://github.com/dequelabs/WebKit/issues/277290) - **scrollable-region-focusable:** do not fail scroll areas when all content is visible without scrolling ([#4993](#4993)) ([838707a](838707a)) - **target-size:** determine offset using clientRects if target is display:inline ([#5012](#5012)) ([a4b8091](a4b8091)) - **target-size:** ignore position: fixed elements that are offscreen when page is scrolled ([#5066](#5066)) ([1229a6e](1229a6e)), closes [#5065](#5065) - **target-size:** ignore widgets that are inline with other inline elements ([#5000](#5000)) ([a8dd81b](a8dd81b)) - **utils/getAncestry:** escape node name ([#5079](#5079)) ([d1fabaa](d1fabaa)), closes [#5078](#5078) - **utils:** Add null check to parseCrossOriginStylesheet, closes [#5074](#5074) ([#5075](#5075)) ([f12ef32](f12ef32)) - **utils:** update isShadowRoot to use spec-compliant custom element regex ([#5059](#5059)) ([edc6ce2](edc6ce2)), closes [#5030](#5030) This PR was opened by a robot 🤖 🎉
Adds a public
axe.resetLocale()that reverts the locale back to the default English snapshot taken on the firstapplyLocalecall, without touching any other configuration.Closes #5107
Motivation
axe.configure({ locale })has no inverse, andaxe.reset()also clears branding, rule enable/disable overrides,frameMessenger,noHtml,allowedOrigins, and anything elseAudit._init()resets. Consumers that let end users switch languages at runtime have no clean way to roll back to the default English messages without destroying the rest of their setup. The internal machinery for this already exists (Audit._setDefaultLocale+Audit._resetLocale) — this PR just exposes it as a public method.Implementation
lib/core/public/reset-locale.js, wired intolib/core/core.jsnext toaxe.reset.audit._resetLocale(). ThrowsNo audit configuredif called before_load, matchingaxe.reset._resetLocaleearly-return when_defaultLocaleis null).tagExclude,noHtml,allowedOrigins,frameMessenger, or standards.axe.d.ts.doc/API.md.Tests
test/core/public/reset-locale.jscovers:axe.configure({ locale })langAll 6 pass; existing
resetandconfiguretests still pass (61/61).