VirtualBrailleDisplay (Виртуальная Брайлевская Строка)
Автор:- Исходный код дополнения: Посетить Web-сайт virtualBrailleDisplay
Краткое описание
Дополнение VirtualBrailleDisplay предназначено для инспекции и отладки вывода NVDA в брайль.
Оно регистрируется как виртуальная брайлевская строка и сохраняет байт за байтом все данные, которые NVDA передаёт драйверу.
Это позволяет разработчикам и тестировщикам увидеть, что получила бы реальная брайлевская строка без её физического наличия.
Дополнение захватывает два уровня информации и никогда их не смешивает.
Первый уровень — это точные байты, которые NVDA передаёт в функцию display(cells).
Второй уровень — это текст, который приложение запросило для отображения с помощью nvdaController_brailleMessage.
Каждый кадр сохраняет подробный контекст, включая происхождение данных и уровень достоверности.
Вы можете открыть технический просмотрщик, который показывает историю кадров и внешних событий.
Для удобства предусмотрено простое объяснение на человеческом языке для тех, кто не знает брайль.
Доступна фильтрация по конкретному приложению, чтобы видеть только его вывод.
Встроенные инструменты позволяют сравнивать кадры и видеть, какие ячейки изменились.
Вы можете симулировать строки разного размера, чтобы проверить, как содержимое будет выглядеть на различных устройствах.
Дополнение поддерживает взаимодействие со строкой, включая маршрутизацию и брайлевские аккорды.
Настройки позволяют гибко управлять параметрами захвата и отображения информации.
Важно отметить, что все данные хранятся только в памяти и не записываются на диск автоматически.
При экспорте данных выводится предупреждение о конфиденциальности, так как брайль может содержать личную информацию.
Все особенности дополнения описаны в справочном руководстве.
Основная информация
| Название | Версия | Совместимость с API NVDA | Последняя протестированная версия NVDA | Минимальная версия NVDA | Дата загрузки в каталог | Размер | Лицензия |
|---|---|---|---|---|---|---|---|
| virtualBrailleDisplay | 2026.08.30 | 2026.1 | 2026.3.0 | 2026.1.0 | 09-09-2026 21:41:25 | 208 Кб. | GPL v2 |
Журнал изменений
Подробнее
Добавлена фильтрация по приложению, реальный контекст происхождения, списки с навигацией по столбцам, настройки с вкладками, объяснение на человеческом языке, свободное сравнение
кадров, симуляция других размеров, маршрутизация и симулированный ввод с брайлевской
клавиатуры, а также опциональное непрерывное журналирование.
Скачать
VirtualBrailleDisplay-V.2026.08.30.nvda-addon
⬇ Перейти к истории версий 🔝 Назад к оглавлениюИнформация о локализации на русский язык
- Локализация от: Разработчик или другой переводчик
- Перевод: Да
- Перевод интерфейса: Да
- Перевод справки: Да
Разделы
🔝 Назад к оглавлениюСправка
Подробнее
Virtual Braille Display 2026.08.30
Дополнение NVDA, которое регистрируется как дополнительная брайлевская
строка и сохраняет, байт за байтом, то, что NVDA передаёт в
display(cells). Оно позволяет узнать, что получила бы реальная брайлевская
строка без её наличия, а также проверить, предоставляет ли приложение полезную
информацию в брайле.
Автор: Héctor J. Benítez Corredera · Лицензия: GNU GPL версии 2 или более поздней
Содержание
- Что делает
- Требования и установка
- Первые шаги
- Подменю «Сервис»
- Назначаемые жесты
- Просмотрщик
- Простое объяснение
- Фильтрация по приложению
- Навигация по спискам
- Настройки
- Конфиденциальность и журналирование
- Тестирование со сторонними приложениями
- Происхождение и достоверность
- Переводы
- Разработка
- Частые проблемы
- Ограничения и план развития
Что делает
Захватывает два уровня информации и никогда их не смешивает:
| Уровень | Что это | Где отображается |
|---|---|---|
| B — Кадры | Точные байты, которые NVDA передаёт в display(cells). Это первоисточник. |
История кадров |
| A — Внешние события | Текст, который приложение запросило для отображения с помощью nvdaController_brailleMessage. |
История внешних событий |
Каждый кадр также сохраняет контекст , считанный из самого NVDA непосредственно перед записью: какой буфер его сгенерировал (навигационный или сообщение), к чему привязана строка, а также процесс, приложение, имя и роль объекта, который в этот момент отображался.
Никогда не восстанавливает брайль из голоса, не использует OCR, не предполагает, что сфокусированный процесс является вызвавшим Controller Client, и не выдумывает PID.
Требования и установка
Требуется Windows и NVDA 2026.1 или новее (работает с единственным
модулем braille в 2026.1 и с реорганизованным пакетом в 2026.3). Не требует
внешних библиотек. Примеры требуют Python 3, accessible-output2 и
wxPython.
- Откройте
virtualBrailleDisplay-2026.08.30.nvda-addonи подтвердите установку. - Перезапустите NVDA.
- В настройках брайля NVDA выберите Virtual Braille Display в качестве брайлевской строки.
Первые шаги
- Назначьте жест команде Открыть просмотрщик с фильтром по приложению в фокусе в Параметры > Жесты ввода > Virtual Braille Display.
- Переведите фокус на приложение, которое хотите проверить, и нажмите этот жест: дополнение захватывает его PID и открывает просмотрщик, показывая только то, что создаёт это приложение.
- Используйте приложение как обычно; кадры будут появляться в истории.
- Если вы не читаете брайль, нажмите Простое объяснение — вы получите те же данные, изложенные на простом русском языке.
Подменю «Сервис»
Всё сгруппировано в NVDA > Сервис > Virtual Braille Display:
| Пункт | Что делает |
|---|---|
| Просмотрщик кадров и событий… | Открывает технический просмотрщик. |
| Простое объяснение… | Открывает окно на простом языке. |
| Подключить виртуальную строку | Выбирает Virtual Braille Display в качестве брайлевской строки. |
| Отключить виртуальную строку | Выбирает «без брайля», сохраняя историю. |
| Фильтровать по приложению, бывшему в фокусе | Фильтрует по приложению, из которого было открыто меню. |
| Убрать фильтр приложений | Возвращает отображение всех приложений. |
| Озвучить последний кадр | Сообщает текст и заполненность последнего кадра. |
| Искать новые переводы и документацию | Загружает опубликованные ресурсы с момента последней версии. |
| Настройки… | Открывает диалог с вкладками. |
| Справка по дополнению | Открывает эту документацию. |
Две детали, чтобы меню действительно работало:
- Фильтр правильно определяет приложение. При открытии меню фокус переходит на само меню, которое принадлежит NVDA. Дополнение отбрасывает этот PID и использует
gui.mainFrame.prevFocus— объект, который NVDA сохраняет при открытии меню; это именно то приложение, из которого вы его открыли. - Сообщения не теряются.
ui.message, отправленное при закрытии меню, отменяется объявлением окна, возвращающего фокус. Сообщения меню используютui.delayedMessage— функцию, которую NVDA предлагает для подтверждения действий меню. Если вы предпочитаете не полагаться на голос, в Настройках можно включить отображение диалогового окна.
Назначаемые жесты
В Параметры > Жесты ввода, категория Virtual Braille Display. Ни один из них не имеет назначенной клавиши по умолчанию.
| Команда | Что делает |
|---|---|
| Открыть просмотрщик Virtual Braille Display | Открывает просмотрщик. В зависимости от настроек, перед этим фильтрует по приложению в фокусе или открывает простое объяснение. |
| Открыть просмотрщик с фильтром по приложению в фокусе | Захватывает PID вашего приложения и открывает просмотрщик, ограниченный им. |
| Включить или отключить фильтр по приложению в фокусе | Переключает фильтр без открытия окон. |
| Открыть простое объяснение брайлевского вывода | Открывает окно на простом языке. |
| Озвучить последний кадр, полученный виртуальной строкой | Сообщает текст и заполненность последнего кадра. |
| Искать новые переводы и документацию для дополнения | Проверяет наличие новых ресурсов без ожидания автоматической проверки. |
Просмотрщик
Начинается с сводки состояния , доступной через Tab: подключение, геометрия, режим просмотрщика, активный фильтр и количество кадров и событий. Под ней — семь вкладок:
| Вкладка | Содержимое |
|---|---|
| Дружелюбная сводка | Реальная заполненность кадра, происхождение и достоверность, часть NVDA, сгенерировавшая его, отображаемое приложение, запрашивающее приложение и PID, читаемый текст и его источник. |
| Точные технические данные | Юникод-брайль, шестнадцатеричный, десятичный, двоичный код, точки на ячейку и распределение по строкам. |
| История кадров | Доступный список с фильтром по тексту и раскрывающимся списком приложений. Выбор строки фиксирует этот кадр. |
| Внешние события | Запросы, полученные через Controller Client, с PID, приложением и связанным кадром. |
| Сравнение | Два раскрывающихся списка Кадр A и Кадр B с последними ста кадрами, а также кнопки Сравнить два последних , Сравнить предпоследний с последним и Использовать отображаемый кадр как B. В результате объясняется, сколько ячеек изменилось, и для каждой — юникод-паттерн, точки и шестнадцатеричное значение. |
| Симуляция размера | Распределяет тот же буфер по окнам, которые отобразила бы строка на 14, 20, 32, 40, 64 или 80 ячеек. Ничего не переводит заново: группирует те же ячейки иначе. |
| Взаимодействие со строкой | Клавиши маршрутизации, прокрутки назад и вперёд, а также брайлевские аккорды от точек 1 до 8 и пробел. Они передаются в NVDA как реальные жесты; требуют подключённой строки. |
Кнопки: Подключить , Отключить , Приостановить обновления (только интерфейса; захват продолжается), Зафиксировать отображаемый кадр , Обновить сейчас , Фильтровать по приложению в фокусе , Убрать фильтр , Простое объяснение , Копировать , Сохранить… , Очистить , Настройки… и Закрыть.
Пока просмотрщик в фокусе, он не обновляется автоматически, чтобы не создавать цикл между его собственной доступностью и выводом в брайль. Используйте Обновить сейчас для загрузки снимка.
Простое объяснение
Окно, предназначенное для тех, кто видит, не знает брайль и хочет сделать своё приложение доступным. Показывает, какой текст читал бы пользователь брайлевской строки, откуда он берётся, из какого приложения и сколько места занимает; а под ним — автоматический анализ:
| Наблюдение | Что означает |
|---|---|
| Брайлевская строка опустела | Никто ничего не воспринимает. Обычно это элемент без доступного имени или окно, не предоставляющее текст. |
| Есть точки, но текст не удалось восстановить | Проверьте активную брайлевскую таблицу. |
| Содержимое заполняет всю строку | Вероятно, текст продолжается и строку нужно прокручивать; помещайте важное в начало. |
| Содержимое почти заполняет строку | На строке в 14 или 20 ячеек оно уже не поместилось бы целиком. |
| На строке в 20 ячеек заняло бы несколько окон | Указывает, сколько прокруток потребовалось бы. |
| Исходит из запроса внешнего приложения | Атрибуция вероятна, но не подтверждена. |
| Не удалось определить источник | Ячейки по-прежнему точны; неизвестно, какая часть NVDA их создала. |
| Приложение не определено | Ни контекст, ни внешний запрос не предоставили процесс, и он не был выведен из фокуса. |
Скопировать отчёт помещает весь текст в буфер обмена.
Фильтрация по приложению
Позволяет видеть только то, что создаёт ваша программа. Есть три способа: жест клавиатуры (лучший, потому что фокус всё ещё находится в вашем приложении), подменю «Сервис» и раскрывающийся список Показывать только приложение в истории кадров.
Фильтр сравнивает два реальных данных, никогда не предположение: PID контекста кадра и PID, подтверждённый через RPC коррелированным внешним событием. Он влияет на историю, сравнение, статистику, экспорт и простое объяснение, но не изменяет происхождение и достоверность ни одного кадра: это решение об отображении.
Кнопка Фильтровать по приложению в фокусе внутри просмотрщика предупреждает, если не может определить приложение, потому что с открытым просмотрщиком фокус находится на самом просмотрщике.
Навигация по спискам
NVDA читает целую строку с помощью стрелок вверх и вниз. Дополнение добавляет перемещение от ячейки к ячейке:
| Клавиша | Действие |
|---|---|
| Стрелка вправо / влево | Следующий / предыдущий столбец сфокусированной строки. |
| Ctrl+1 … Ctrl+9 | Переход прямо к этому столбцу. |
| Ctrl+Shift+C | Копирует полный текст сфокусированной ячейки. |
Объявления используют ui.message — собственную функцию NVDA, которая
одновременно говорит и отправляет текст на брайлевскую строку; никакие внешние
библиотеки не задействованы. Списки хранят полный текст каждой ячейки,
потому что нативный элемент управления Windows обрезает его примерно до 511
символов.
Настройки
Шесть вкладок. Все элементы управления создаются с помощью gui.guiHelper,
который помещает метку перед элементом управления; именно такой порядок нужен
экранному диктофу, чтобы озвучивать имя поля вместе с его значением.
| Вкладка | Опции |
|---|---|
| Брайлевская строка | Ячеек в строке (14, 20, 32, 40, 64, 80 или пользовательское от 1 до 256) и строк на строке (от 1 до 40, для симуляции многострочной строки). При изменении NVDA переинициализирует драйвер и пересчитывает брайлевский вывод. |
| Захват и история | Сохраняемое количество кадров и событий (от 10 до 10000); не сохранять пустые кадры; не сохранять повторяющиеся кадры; следить за последним кадром при открытии; сначала открывать простое объяснение; фильтровать по приложению в фокусе при открытии жестом. |
| Корреляция источников | Окно корреляции (от 50 до 10000 мс) и временное окно (от 0 до 2000 мс), которое используется только при отсутствии совпадения текста и наличии единственного кандидата. |
| Списки и уведомления | Что озвучивать при перемещении по столбцам: номер строки, общее количество строк, имя столбца, содержимое, предупреждение о пустой ячейке, возврат в конец и только голос. А также уведомления о результате действия : голос и брайль, диалоговое окно или оба варианта. |
| Обновления | Автоматическая проверка при запуске NVDA и интервал между проверками в часах. |
| Журналирование и конфиденциальность | Непрерывное журналирование, его формат (JSON Lines или текст) и целевой файл. |
Если вы отключите все опции озвучивания столбцов, содержимое ячейки всё равно будет произноситься, чтобы навигация не оставалась беззвучной.
Конфиденциальность и журналирование
Брайль, получаемый строкой, может содержать пароли, документы, сообщения и уведомления.
- Истории хранятся только в памяти и исчезают при закрытии NVDA.
- На диск автоматически ничего не записывается.
- Сохранить… экспортирует снимок в TXT, JSON или JSONL в кодировке UTF-8 после явного предупреждения. В JSONL каждая запись содержит поле
typeсо значениемframeилиexternalEvent. - Непрерывное журналирование по умолчанию отключено. При активации оно пишет в отдельном потоке с ограниченной очередью:
display(cells)только помещает запись в журнал и продолжает работу. Если диск не успевает, записи отбрасываются с подсчётом, прежде чем замедлить NVDA.
Включайте его во время отладки и отключайте после.
Тестирование со сторонними приложениями
Работает с уже существующими приложениями без их модификации:
output = Auto() output.braille("Загрузка завершена") ```
Путь: приложение вызывает `nvdaController_brailleMessage` в DLL Controller
Client → RPC → `NVDAHelper` ставит в очередь `BrailleHandler.message(text)` →
`TextRegion` и liblouis → `_writeCells` уведомляет `pre_writeCells` →
`display(cells)` в виртуальной строке.
В папке `examples/` есть две программы, которые запускаются **вне** NVDA:
`test_accessible_output2.py`, которая проверяет, активен ли NVDA, и позволяет
повторять сообщения, и `wx_test_app.py` — приложение wxPython с кнопками для
отправки в голос и брайль или только в брайль. В проанализированной версии
`accessible_output2` `Auto.output` только говорит; поэтому в примерах явно
вызывается `braille(text)`.
## Происхождение и достоверность
Каждый кадр содержит происхождение и уровень достоверности:
Происхождение | Когда используется
---|---
`NVDA_NAVIGATION` | Активным буфером был основной и имел видимые области.
`BRAILLE_MESSAGE` | Активным буфером был буфер сообщений NVDA.
`CORRELATED_EXTERNAL_MESSAGE` | Был сопоставлен с внешним запросом.
`UNKNOWN` | NVDA не предоставил достаточного контекста.
Достоверность | Что именно означает
---|---
`CONFIRMED` | Личность буфера NVDA проверяема. Подтверждает, **какая часть NVDA** создала ячейки, но никогда не подтверждает, какое приложение запросило сообщение.
`PROBABLE` | Корреляция по тексту и времени с внешним запросом.
`CONTEXT` | Есть только контекст; происхождение не приписывается.
`UNKNOWN` | Не определено.
**Ключевое различие.** Просмотрщик показывает два разных приложения и никогда
их не путает:
* _Приложение, содержимое которого отображалось_ : контекст, полученный из `region.obj`. Отвечает на вопрос «кому принадлежит отображаемый текст».
* _Запрашивающее приложение_ : PID, подтверждённый с помощью `I_RpcBindingInqLocalClientPID` во время обработки вызова RPC. Отвечает на вопрос «кто вызвал `nvdaController_brailleMessage`».
NVDA не передаёт личность RPC-клиента вплоть до `display(cells)`. Поэтому
личность события подтверждена, но его связь с последующим кадром является, в
лучшем случае, вероятной. Полная информация — в [`docs/origin-
tracking.md`](docs/origin-tracking.md).
## Переводы
Дополнение написано на испанском и поддерживает переводы на любые языки.
Важно: **переводы и документация распространяются отдельно от дополнения** в
виде отдельного релиза ресурсов, чтобы они попадали к пользователю без
установки новой версии.
**Если вы хотите перевести его:** возьмите `virtualBrailleDisplay.pot` из
корня репозитория или уже готовый шаблон в
`addon/locale/en/LC_MESSAGES/nvda.po`. Создайте
`addon/locale/{язык}/LC_MESSAGES/nvda.po` и отправьте его. Компилировать
ничего не нужно.
**Что происходит потом:** при объединении файла GitHub Action компилирует
`.po`, генерирует переведённый `manifest.ini` и документацию в HTML,
упаковывает всё и публикует в релизе ресурсов. Принять перевод — значит просто
объединить один файл.
**Если вы используете дополнение:** оно проверяет наличие новых ресурсов при
запуске NVDA, не чаще одного раза в день. Вы можете изменить это или отключить
в **Настройки > Обновления**, а также проверить вручную через **Сервис >
Virtual Braille Display > Искать новые переводы и документацию**. Загружаются
только переводы и документация — никогда код.
Тег релиза ресурсов вычисляется автоматически из версии дополнения: для
`2026.08.30` это `recursos_2026.08`. GitHub Action и дополнение используют
одно и то же правило, и это правило покрыто тестами, поэтому рассинхронизация
невозможна.
Полная информация, включая что нужно знать при переводе, находится в
[`docs/traducciones.md`](docs/traducciones.md).
## Разработка
Код находится в `addon/globalPlugins/virtualBrailleDisplay/`, драйвер отдельно
в `addon/brailleDisplayDrivers/virtualBraille.py`. У каждого модуля своя
ответственность: захват и хранилище (`runtime`, `frameStore`,
`contextTracker`, `originTracker`, `controllerTracker`), преобразование и
объяснение (`brailleUtils`, `brailleDecoder`, `diagnostics`, `frameText`),
интерфейс (`gui`, `simpleView`, `settingsDialog`, `accessibleList`,
`guiUtils`, `messages`) и поддержка (`config`, `models`, `logWriter`,
`gestures`, `nvdaCompat`) и обновление ресурсов (`resourceUpdates`, а также
`actualizadorRecursos` без изменений).
Сборка и очистка с помощью `scons -c`:
`bash scons`
Тесты, не требующие NVDA:
`bash python -m pytest tests -q`
Стиль:
`bash python -m ruff check .`
Техническая документация: [`docs/architecture.md`](docs/architecture.md)
(реальный поток и используемые API NVDA), [`docs/origin-
tracking.md`](docs/origin-tracking.md) (что известно, что нет и где теряется)
и [`docs/traducciones.md`](docs/traducciones.md) (полный процесс перевода) и
[`docs/testing.md`](docs/testing.md) (автоматические тесты и 45 ручных
сценариев).
## Частые проблемы
Симптом | Что проверить
---|---
Не появляется ни одного кадра | Убедитесь, что **Virtual Braille Display** выбран в настройках брайля и в сводке состояния сказано «Строка подключена».
Фильтр ничего не показывает | Вероятно, был захвачен PID просмотрщика. Нажмите _Убрать фильтр_ и захватите снова жестом из вашего приложения.
Внешние события не поступают | NVDA запущен, `accessible_output2` его обнаруживает, брайлевские сообщения активированы и явно вызывается `braille(text)`. Если NVDA пишет «API interna ausente», хук не удалось установить в этой версии; захват кадров продолжает работать.
Маршрутизация или аккорд не работают | Требуется подключённая виртуальная строка.
Теряется сообщение из меню | Такого не должно происходить: они используют `ui.delayedMessage`. Если это случается, включите диалоговое окно в _Списки и уведомления_.
NVDA не озвучивает имя поля | Это ошибка, а не ограничение: сообщите о ней.
## Ограничения и план развития
* Обратный перевод, предлагаемый, когда NVDA не предоставляет текст, является **приблизительным** и всегда помечается как таковой; он никогда не заменяет ячейки.
* Связь между внешним запросом и кадром является, в лучшем случае, **вероятной**.
* PID контекста идентифицирует приложение, содержимое которого отображалось, но не обязательно приложение, запросившее сообщение.
* Хук Controller Client использует внутренний API NVDA. Если он изменится, отключится только история внешних событий.
* Виртуального HID-устройства нет: строка существует внутри NVDA.
В планах: кооперативный протокол через локальный IPC, позволяющий приложению
сообщать свой PID и идентификатор корреляции перед вызовом Controller Client,
что сделает атрибуцию подтверждённой; вспомогательный модуль
`virtual_braille_debug`; и исследование виртуального HID Braille-устройства
для Windows.
История версий
История версий
| Версия файла | Тестируемая версия NVDA | Минимальная версия NVDA | Размер файла (КБ) | Ссылка на загрузку |
|---|---|---|---|---|
| 2026.08.30 | 2026.3.0 | 2026.1.0 | 208 | VirtualBrailleDisplay-V.2026.08.30.nvda-addon |