Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 14 additions & 8 deletions source/synthDriverHandler.py
Original file line number Diff line number Diff line change
Expand Up @@ -344,15 +344,21 @@ def languageIsSupported(self, lang: str | None) -> bool:
"""
if lang is None:
return True
normalizedLang = languageHandler.normalizeLanguage(lang)
if normalizedLang is None:
return False
rootLang = normalizedLang.split("_")[0]
normalizedAvailableLangs: set[str] = set()
for availableLang in self.availableLanguages:
if availableLang is not None and (
lang == languageHandler.normalizeLanguage(availableLang)
or lang == languageHandler.normalizeLanguage(availableLang).split("_")[0]
):
return True
rootLang = languageHandler.normalizeLanguage(lang).split("_")[0]
fallbackLang = f"{rootLang}-{rootLang}"
if fallbackLang in self.availableLanguages:
if availableLang is None:
continue
normalizedAvailableLang = languageHandler.normalizeLanguage(availableLang)
if normalizedAvailableLang is None:
continue
normalizedAvailableLangs.add(normalizedAvailableLang)
if normalizedLang in normalizedAvailableLangs:
return True
if any(rootLang == availableLang.split("_")[0] for availableLang in normalizedAvailableLangs):
return True
return False

Expand Down
36 changes: 36 additions & 0 deletions tests/unit/test_synthDriverHandler.py
Original file line number Diff line number Diff line change
Expand Up @@ -132,3 +132,39 @@ def test_synthChangedExtensionPoint(self):
**expectedKwargs,
):
synthDriverHandler.setSynth("auto")


class TestLanguageIsSupported(unittest.TestCase):
def setUp(self) -> None:
self._synth = MockSynth(FAKE_DEFAULT_SYNTH_NAME)
self._synth.availableLanguages = set()

def tearDown(self) -> None:
del self._synth

def _languageIsSupported(self, lang: str | None) -> bool:
return synthDriverHandler.SynthDriver.languageIsSupported(self._synth, lang)

def test_noneLanguageIsSupported(self):
self._synth.availableLanguages = {"en_US"}
self.assertTrue(self._languageIsSupported(None))

def test_normalizedExactLanguageMatch(self):
self._synth.availableLanguages = {"en_US"}
self.assertTrue(self._languageIsSupported("en-us"))

def test_rootLanguageMatch(self):
self._synth.availableLanguages = {"en_GB"}
self.assertTrue(self._languageIsSupported("en"))

def test_unsupportedLanguage(self):
self._synth.availableLanguages = {"en_US"}
self.assertFalse(self._languageIsSupported("fr"))

def test_metaAndNoneAvailableLanguagesIgnored(self):
self._synth.availableLanguages = {None, "x-western", "en_US"}
self.assertTrue(self._languageIsSupported("en"))

def test_metaInputLanguageNotSupported(self):
self._synth.availableLanguages = {"en_US"}
self.assertFalse(self._languageIsSupported("x-western"))
2 changes: 1 addition & 1 deletion user_docs/en/changes.md
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ The setting is disabled by default. (#20013, @LeonarddeR)

### Bug Fixes

* Fixed an error when a synthesizer doesn't have available languages, and NVDA tries to report if a language is supported. (#20080, @nvdaes)
* Fixed an error that could occur when NVDA checked whether a language is supported for a synthesizer with invalid languages. (#20080, @nvdaes)
* NVDA will attempt to recover more quickly from freezes in some applications, especially those written in Java. (#14396, @thgcode)
* In Firefox browse mode, the accessible name of form controls (such as checkboxes and radio buttons) is now correctly announced when the control has an `aria-label` and an associated `<label>` element that contains only `aria-hidden` content. (#19409, @bramd)
* The "Toggles on and off if the screen layout is preserved while rendering the document content" item in the "Browse mode" category of the Input Gestures dialog now behaves correctly. (#18378)
Expand Down
Loading