Skip to content
Draft
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
2 changes: 1 addition & 1 deletion source/braille/regions/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ def update(self):
brailleTables.TableType.OUTPUT,
).casefold()

if translationTable.startswith("zh"):
if translationTable.startswith("zh") and config.conf["braille"]["useChineseWordSegmentation"]:
converter = WordSegWithSeparatorOffsetConverter(textToTranslate)
textToTranslate, textToTranslateTypeforms, cursorPos = _applyOffsetConverter(
converter,
Expand Down
1 change: 1 addition & 0 deletions source/config/configSpec.py
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,7 @@
wordWrap = boolean(default=true)
textWrap = featureFlag(optionsEnum="BrailleTextWrapFlag", behaviorOfDefault="AT_WORD_BOUNDARIES")
unicodeNormalization = featureFlag(optionsEnum="BoolFlag", behaviorOfDefault="disabled")
useChineseWordSegmentation = boolean(default=True)
focusContextPresentation = option("changedContext", "fill", "scroll", default="changedContext")
interruptSpeechWhileScrolling = featureFlag(optionsEnum="BoolFlag", behaviorOfDefault="enabled")
speakOnRouting = boolean(default=false)
Expand Down
18 changes: 18 additions & 0 deletions source/gui/settingsDialogs.py
Original file line number Diff line number Diff line change
Expand Up @@ -5627,11 +5627,29 @@ def makeSettings(self, settingsSizer):
self.autoScrollRateSlider.SetPageSize(10)
self.bindHelpEvent("BrailleAutoScrollRate", self.autoScrollRateSlider)

self.useChineseWordSegmentationCheckBox = sHelper.addItem(
wx.CheckBox(
self,
# Translators: The label for a checkbox in the Braille settings panel.
label=_("Use &Chinese word segmentation"),
),
)
self.bindHelpEvent(
"ChineseBrailleWordSegmentation",
self.useChineseWordSegmentationCheckBox,
)
self.useChineseWordSegmentationCheckBox.SetValue(
config.conf["braille"]["useChineseWordSegmentation"],
)

if gui._isDebug():
log.debug("Finished making settings, now at %.2f seconds from start" % (time.time() - startTime))

def onSave(self):
AutoSettingsMixin.onSave(self)
config.conf["braille"]["useChineseWordSegmentation"] = (
self.useChineseWordSegmentationCheckBox.IsChecked()
)
if self.outTableList.GetSelection() > 0:
braille.handler.table = self.outTables[self.outTableList.GetSelection() - 1]
else:
Expand Down
19 changes: 19 additions & 0 deletions tests/unit/test_braille/test_routing.py
Original file line number Diff line number Diff line change
Expand Up @@ -44,14 +44,17 @@ class TestBrailleOffsetConverters(unittest.TestCase):
def setUp(self) -> None:
self._originalTranslationTable = config.conf["braille"]["translationTable"]
self._originalUnicodeNormalization = config.conf["braille"]["unicodeNormalization"]
self._originalUseChineseWordSegmentation = config.conf["braille"]["useChineseWordSegmentation"]

def tearDown(self) -> None:
config.conf["braille"]["translationTable"] = self._originalTranslationTable
config.conf["braille"]["unicodeNormalization"] = self._originalUnicodeNormalization
config.conf["braille"]["useChineseWordSegmentation"] = self._originalUseChineseWordSegmentation

def test_chineseWordSegmentationAndUnicodeNormalizationOffsetsAreComposed(self) -> None:
config.conf["braille"]["translationTable"] = "zh-chn.ctb"
config.conf["braille"]["unicodeNormalization"] = "enabled"
config.conf["braille"]["useChineseWordSegmentation"] = True
wordSegmenter = Mock()
wordSegmenter.segmentedText.side_effect = _segmentedTextWithSeparator
translate = Mock(return_value=([1, 2, 3], [0, 1, 2], [0, 1, 2], 2))
Expand All @@ -72,6 +75,22 @@ def test_chineseWordSegmentationAndUnicodeNormalizationOffsetsAreComposed(self)
self.assertEqual(region.brailleToRawPos, [0, 1, 1])
self.assertEqual(region.rawToBraillePos, [0, 2])

def test_chineseWordSegmentationCanBeDisabled(self) -> None:
config.conf["braille"]["translationTable"] = "zh-chn.ctb"
config.conf["braille"]["useChineseWordSegmentation"] = False
translate = Mock(return_value=([1, 2], [0, 1], [0, 1], None))
with (
patch("braille.regions.base.WordSegWithSeparatorOffsetConverter") as wordSegConverter,
patch("braille.regions.base.louisHelper.translate", translate),
):
region = braille.regions.base.Region()
region.rawText = "中文"

region.update()

wordSegConverter.assert_not_called()
self.assertEqual(translate.call_args.args[1], "中文")


class TestReviewRoutingMovesSystemCaretInNavigableText(unittest.TestCase):
"""A test for the move system caret when routing review cursor braille setting
Expand Down
15 changes: 13 additions & 2 deletions user_docs/en/userGuide.md
Original file line number Diff line number Diff line change
Expand Up @@ -2727,6 +2727,18 @@ Disabling this option allows speech to be heard while simultaneously reading Bra
|Options |Default (Enabled), Enabled, Disabled|
|Default |Enabled|

##### Use Chinese word segmentation {#ChineseBrailleWordSegmentation}

This setting controls whether NVDA uses Chinese word segmentation when translating text into braille.
When enabled and a Chinese braille output table is in use, NVDA inserts spaces between Chinese words before translation.
When disabled, NVDA passes text directly to the output table without inserting spaces between words.
This setting has no effect with other output tables.

| . {.hideHeaderRow} |.|
|---|---|
|Options |Enabled, Disabled|
|Default |Enabled|

#### Select Braille Display {#SelectBrailleDisplay}

<!-- KC:setting -->
Expand Down Expand Up @@ -3676,8 +3688,7 @@ You may toggle through the available paragraph styles from anywhere by assigning
##### Word Segmentation Standard {#WordSegmentationStandard}

This setting controls how NVDA determines word boundaries when navigating by word.
Chinese word segmentation is also used for braille.
When a Chinese braille output table is in use, NVDA can insert spaces between Chinese words in braille.
Chinese braille output uses a separate [Chinese word segmentation setting](#ChineseBrailleWordSegmentation).

| . {.hideHeaderRow} |.|
|---|---|
Expand Down
Loading