diff --git a/README.md b/README.md index a0de323..fcca653 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ClassicSpeech is an NVDA add-on for configurable speech verbosity, conservative text and number processing, Web / Browse Mode tools, and same-synth Voice Profiles. -> **Current release:** [ClassicSpeech 1.01](https://github.com/trssharp/classicspeech-nvda/releases/tag/v1.01) is the latest stable release. The `main` branch remains active development; commits after a release may not yet have completed live NVDA validation. +> **Current release:** Download the [latest stable ClassicSpeech release](https://github.com/trssharp/classicspeech-nvda/releases/latest). The `main` branch remains active development; commits after a release may not yet have completed live NVDA validation. ## Settings access @@ -35,7 +35,7 @@ Position announcements are separate from the Position token and are set per verb The Intermediate profile leaves Description and Hotkey off by default. You can change these choices in **General Settings → Verbosity**. -**Read edit field contents when focused**, also in **General Settings → Verbosity**, is on for every profile by default. Moving to an edit field then speaks its current line, or "blank" when it is empty, as NVDA does natively. Clear it to hear only selected text, which was the behavior before 1.02. +**Read edit field contents when focused**, also in **General Settings → Verbosity**, is on for every profile by default. Moving to an edit field then speaks its current line, or "blank" when it is empty, as NVDA does natively. Clear it to hear only selected text, which was the behavior in 1.01. ### Voice Profiles diff --git a/_speech_core/update_check.py b/_speech_core/update_check.py index 8cfe4de..56a5538 100644 --- a/_speech_core/update_check.py +++ b/_speech_core/update_check.py @@ -389,9 +389,16 @@ def _checked(self, outcome, version, repository, manual): release = outcome if not is_newer(release.version, version): if manual: - self._message( - _("ClassicSpeech is up to date. You have version {version}, the latest release.").format(version=version) - ) + if is_newer(version, release.version): + message = _( + "You have ClassicSpeech {version}. The latest published release is {latest}. " + "Your installed version is newer; no update is available." + ).format(version=version, latest=release.version) + else: + message = _( + "ClassicSpeech is up to date. You have version {version}, the latest release." + ).format(version=version) + self._message(message) return self._offer(release, version, repository) diff --git a/doc/en/readme.html b/doc/en/readme.html index 7d4eae4..c53fbf8 100644 --- a/doc/en/readme.html +++ b/doc/en/readme.html @@ -590,7 +590,14 @@
ClassicSpeech can check for a newer version on the GitHub page it comes from: the releases of the page shown as its homepage in NVDA's Add-on Store. A copy of ClassicSpeech without a GitHub homepage can't check. Check for Updates says so, and automatic checks don't run.
To check now, press NVDA+N, then choose Preferences, then ClassicSpeech, then Check for Updates.... You can also assign a gesture to the Checks for ClassicSpeech updates command. You hear "Checking for ClassicSpeech updates", then a message says whether ClassicSpeech is up to date.
+The updater checks GitHub's latest published regular release. Draft releases, prereleases and ordinary workflow build artifacts are not offered. It compares version numbers, not the contents of the installed package:
+To replace a local build with a published package of the same version, download and open the published add-on file yourself. Date-and-run development builds also compare numerically and may be ahead of regular release versions; install a regular release manually when switching back from such a build.
When a newer version is available, a dialog opens. It says which version you have and which version is available, and then holds the new release's notes in a box called What's new.
diff --git a/docs/RELEASE-1.02.md b/docs/RELEASE-1.02.md deleted file mode 100644 index cfd50c4..0000000 --- a/docs/RELEASE-1.02.md +++ /dev/null @@ -1,96 +0,0 @@ -# ClassicSpeech 1.02 - -ClassicSpeech 1.02 fixes speech lag in Windows Explorer and file dialogs, restores edit field contents on focus, and adds a Mouse voice profile, per-item voices for document formatting and web elements, and Speech and Sound Schemes. - -Supported NVDA versions: 2025.1 through 2026.2. - -## What's new - -* Speech in Windows Explorer and in Open and Save dialogs is quick again: ClassicSpeech no longer searches a dialog for its default button on every key press. -* Tabbing into an edit field reads its current line, or "blank" when it is empty, as NVDA does. **Read edit field contents when focused**, on the Verbosity page, turns this off for a verbosity profile. -* An address bar and similar fields keep their name when NVDA announces a tool bar just before them. -* **Voice Profiles** has two new categories: **Mouse**, for speech from mouse tracking, and **Document and web formatting**, for a voice on any formatting or web element NVDA reports. -* **Speech and Sound Schemes**, in the ClassicSpeech menu, works like the JAWS Speech and Sounds Manager: give object types, states, window classes, document formatting and web elements a sound, a voice or both, and keep them in named schemes. - -## Fixes - -### Faster speech in Windows Explorer and file dialogs - -With the speech hook enabled, arrowing through files in Windows Explorer, the Run dialog's **Browse** window and other Open or Save dialogs was slow. An NVDA log showed 550 to 600 milliseconds of ClassicSpeech work before each file name was spoken in the Browse window. - -There were two causes: - -* ClassicSpeech looked for the dialog's default button on every focus change, before checking whether focus was on a button. In a file dialog the search found no default button, so it searched again on the next key press, reading up to 250 accessibility objects each time. -* Several checks walked up to 20 parent objects on every speech sequence. In Explorer and web browsers, each step creates a new cross-process accessibility object. - -ClassicSpeech now: - -* looks for a default button only when focus is on a button; -* remembers "no default button" for each dialog for ten seconds, while NVDA+E still searches again on request; -* skips file lists, trees, tables and documents when it searches; -* reads NVDA's own cached list of the focus's ancestors; -* stops re-checking its whole configuration section each time it reads a setting. - -### Edit field contents are read on focus - -Tabbing into an edit field now speaks its current line, or "blank" when the field is empty, as NVDA does natively. Earlier versions deliberately spoke only selected text. - -To change this, open **General Settings → Verbosity** and use **Read edit field contents when focused**. Like position announcements, the setting is kept separately for each verbosity profile, and it is on for every profile by default. - -### Address bar and similar fields keep their name - -When NVDA announced a tool bar immediately before an edit field, for example with Ctrl+L in Chrome, ClassicSpeech merged the two announcements and dropped the field's name, role and text. The tool bar is now spoken on its own, followed by the full field announcement. - -## New features - -### Mouse voice profile - -**Voice Profiles** now has a **Mouse** category. It is used for speech from NVDA's mouse tracking when you move a physical mouse or touchpad. Mouse speech used the Review profile before. - -### Document and web formatting voices - -**Voice Profiles** now has a **Document and web formatting** category. It lists every option from NVDA's Document Formatting panel, grouped the same way: - -* Font and text formatting; -* specific font names, font sizes and style names (for example Heading 1 or Quote); -* Document information; -* Pages and spacing; -* Table information; -* Elements, and landmarks and regions. - -Choose an item, check **Use a custom voice for this item**, and set any voice setting your synthesizer offers. The voice is used for the announcement, for example "bold" or "heading level 2", and for the text itself: the bold words, the heading or the link. - -An item can also use a different synthesizer. NVDA then has to load that synthesizer each time the item is spoken, which adds a noticeable delay. The active synthesizer is the fastest choice. - -NVDA's Document Navigation panel has only the paragraph style option, which produces no announcement, so it has no item. - -### Speech and Sound Schemes - -**NVDA menu → Preferences → ClassicSpeech → Speech and Sound Schemes...** works like the JAWS Speech and Sounds Manager. You can: - -* choose a WAV sound for any object type (control type), object state, window class, unknown object, unlabeled graphic, document formatting option or web element; -* choose whether the sound plays in addition to the spoken announcement or instead of it; -* give any of those items a custom voice; -* keep several named schemes (New, Copy, Rename, Delete), and switch between them in the dialog or with a gesture. - -The dialog has a search box, a **List** filter that shows only the items you changed, and a category tree. Each item's name in the tree says what is set, for example "Bold (sound, voice)" or "Link (sound only)". **Add font name**, **Add font size**, **Add style name** and **Add window class** add your own entries. The window class offered is the one from the object you were on before opening the dialog. - -Sounds and voices apply to focus changes, object navigation, the review cursor, say all, browse mode, and the physical mouse. An item without a sound or voice keeps NVDA's normal speech. - -New Input Gestures commands, with no default gestures, are in the ClassicSpeech category: - -* Opens ClassicSpeech Speech and Sound Schemes -* Turns ClassicSpeech speech and sound schemes on or off -* Switches to the next ClassicSpeech speech and sound scheme - -## Installation - -1. Download `ClassicSpeech-1.02.nvda-addon`. -2. Open it from Windows Explorer and accept NVDA's installation prompt. -3. Restart NVDA when prompted. - -## Verification - -* Full local harness gate, including the new `classic_speech_latency_harness.py` and `classic_speech_schemes_harness.py`. -* The Speech and Sound Schemes and Voice Profiles dialogs were built and exercised with real wxPython and stand-in NVDA modules. That covered choosing sounds, voices on the active synthesizer and on another synthesizer, previews, search, the customized-items filter, custom entries, named schemes, Apply, OK and Cancel. -* Live NVDA testing has not been done yet. Please check Explorer and the Run → Browse dialog, edit fields, the Mouse profile, formatting voices in Word or a web page, and a few scheme sounds. diff --git a/docs/RELEASE-2.0.md b/docs/RELEASE-2.0.md new file mode 100644 index 0000000..4b235c1 --- /dev/null +++ b/docs/RELEASE-2.0.md @@ -0,0 +1,95 @@ +# ClassicSpeech 2.0 + +Draft release notes for ClassicSpeech 2.0, covering the changes since 1.01 merged in PRs #16 through #39. This release has not yet been published. + +Supported NVDA versions: 2025.1 through 2026.2. + +## What's new + +### Speech and navigation fixes + +* Speech in Windows Explorer and Open and Save dialogs no longer repeatedly searches for a default button on each file-list focus change. ClassicSpeech also uses NVDA's cached focus ancestors to reduce speech-processing delays. +* Tabbing into an edit field reads its current line, or "blank" when it is empty. **Read edit field contents when focused**, on the Verbosity page, can turn this off separately for each verbosity profile. Address bars also keep their name and contents when NVDA announces a tool bar immediately before them. +* Selecting or unselecting the focused item with **Control+Space** announces "selected" or "not selected", regardless of the **List item state reporting** choice. Announcements while moving between items still follow that choice. +* The keyboard-layout menu that opens while adding an Input Gesture now reads its initial item. Stale, held speech fragments no longer suppress the new menu announcement. +* Speech and Sound Schemes tree items named after roles or states, such as "menu" and "selected", are read instead of being mistaken for speech tokens and dropped. +* **NVDA+E** and **Announce default button in dialogs** identify the dialog's real default button more accurately, including split buttons, rather than assuming the focused button is the default. When the default cannot be determined, NVDA+E can explain what Enter presses or identify a uniquely highlighted button by appearance. The appearance check runs only on request, not during ordinary focus speech; with Screen Curtain enabled, it asks you to turn the curtain off before that check. + +### Voice Profiles and Speech and Sound Schemes + +* **Voice Profiles** adds **Mouse**, for physical mouse tracking, and **Document and web formatting**, for voices on formatting and web elements. Use settings supported by the active synthesizer, or choose another synthesizer for an item. Switching synthesizers can add noticeable delay. +* **Speech and Sound Schemes** lets you assign WAV sounds, voices, or both to object types, states, window classes, document formatting and web elements. Sounds can accompany or replace spoken announcements. Named schemes, search, a customized-items filter, custom entries and unassigned switching commands help organize the settings. +* Formatting and element voices now work across character, word, line, sentence, paragraph and Say All reading, including LibreOffice. The required formatting is requested without changing your saved Document Formatting choices or adding unwanted spoken formatting. Fixes also preserve voices across element text, support synthesizers with limited inline voice commands, and make object-state and style/color items effective. Replacing an announcement with a sound does not remove the document text. +* Each scheme keeps its settings and copied WAV files in its own folder. **Open schemes folder**, **Export scheme** and **Import scheme** let you locate and share schemes. Voice Profiles also has export and import controls. Existing schemes migrate to the folder format, and custom fonts, sizes, styles and window classes belong to their individual scheme. +* **Reset this item** in Document and web formatting removes the item's voice without deleting its scheme sound. +* The **NVDA sounds** scheme category can replace NVDA's own sounds, including browse/focus mode, suggestions, spelling errors, screen curtain, Remote Access, startup and exit sounds, without modifying NVDA's waves folder. Removing a replacement restores the native sound. Failed replacement startup, shutdown and Windows sign-out sounds fall back safely to NVDA's own files, and sound-handler cleanup preserves other add-ons' handlers. + +### Settings and message controls + +* ClassicSpeech stores its settings separately in `ClassicSpeech/settings.ini` under NVDA's configuration folder, migrating the previous settings automatically. It backs up the NVDA settings it changes so **Reset All ClassicSpeech Settings** and uninstall can restore them, while preserving subsequent changes you made in NVDA. Updating the add-on keeps ClassicSpeech settings. +* Reset confirmation and update dialogs no longer open inside NVDA's core speech/event pump, fixing the reset freeze. Reset asks for confirmation with **No** as the default. +* Cancelling Web / Browse Mode settings restores the dialog's changes correctly. NVDA settings changed while a Voice Profile speaks are retained, and temporary scheme/voice settings no longer leak into saved synthesizer settings. Voice Profile triggers pause in settings dialogs, apart from explicit scheme previews. +* The Hotkeys options **Speak hotkeys in** and **Which shortcuts to speak** use NVDA's accessible checklists instead of combination-based combo boxes. Menus and Dialogs, and Access keys and Command shortcuts, can each be selected independently. Existing settings remain compatible. ClassicSpeech's other checklists use the same native accessible control. +* **Give ClassicSpeech messages priority over NVDA speech**, on the Misc page, is a new optional setting, off by default. When enabled, it protects ClassicSpeech announcements from automatic interruptions; keyboard, braille and touch input can still stop them. It covers messages such as hook loaded, page ready, page summaries and speech-history replay. + +### Help, updates and Spanish translation + +* A bundled user guide opens from the Add-on Store's **Help** action. An unassigned **Opens the ClassicSpeech user guide** command is also available in Input Gestures. The guide covers the new settings and commands. +* **Check for Updates...** checks this repository's GitHub releases. Automatic checking is enabled by default and runs once a day after startup; it can be turned off on the Advanced page. Checks do not run on secure screens. Installation verifies the downloaded add-on against its published SHA-256 file and uses NVDA's own installation confirmation. +* Manual update checks distinguish an installed development build from GitHub's latest published release: if your installed version is newer, the message reports both versions instead of calling the local build the latest release. The user guide explains draft/prerelease exclusions, numeric version comparisons and same-version manual installation. +* Update offers show the full release notes in a read-only, multiline **What's new** box. You can navigate, select and copy the text with the keyboard; Tab reaches the buttons and Escape closes the dialog without installing. +* On NVDA 2026.1 and later, the Add-on Store's **What's new** action can display the changelog bundled in the add-on manifest. Older supported NVDA versions ignore that field. Packaging checks that it matches the release notes. +* The Spanish catalog now fills previously untranslated entries for recent features. Follow-up corrections improve meaning, NVDA terminology, examples, translation context and scheme-dialog access keys; the compiled catalog is updated too. Spanish remains open to feedback from fluent speakers and NVDA users. +* Josh Kennedy is credited alongside Tim and Calli in the add-on manifest. A runtime compatibility fix removes an unavailable Python-module dependency that otherwise prevented the folder-based schemes version from loading in NVDA. + +## Usage notes and limitations + +### Scheme voices and sounds + +Open **NVDA menu → Preferences → ClassicSpeech → Speech and Sound Schemes...** to configure a scheme. An item without a configured sound or voice keeps NVDA's normal speech. Prefer the active synthesizer for the fastest voice changes. + +Schemes are stored under `ClassicSpeech/Schemes` in NVDA's configuration folder. Exported schemes use `.classicspeech-scheme` files; exported Voice Profiles use `.classicspeech-voices` files. Importing Voice Profiles replaces only the synthesizers and categories included in the file. + +A scheme's custom NVDA startup sound requires ClassicSpeech to manage startup and exit playback because NVDA normally plays its startup sound before add-ons load. The previous **Play sounds when starting or exiting NVDA** setting is restored when the custom startup sound is removed, ClassicSpeech is disabled or removed, or settings are reset. + +Known limitation: when another computer controls this computer through Remote Access, it may not hear replacement NVDA sounds because the sound is sent by a local file path that does not exist on the controlling computer. + +### Updates and release identity + +The updater uses the repository URL in the manifest, now set to this ClassicSpeech repository. Published update releases need the add-on and its matching `.sha256` file. An available download still goes through NVDA's confirmation; a check does not silently install an update. + +The selected release version is **2.0**, with notes in `RELEASE-2.0.md`. Build the release with `python scripts/package_addon.py --version 2.0`, or enter `2.0` in the workflow's **Release version** field. The resulting package is `ClassicSpeech-2.0.nvda-addon`; its packaged manifest reports version `2.0`. The source manifest keeps its neutral `0.0.0` placeholder, and ordinary CI builds retain their date-and-run versions. The intended GitHub release tag is `v2.0`; building the package does not create or publish that release. + +## Pull requests covered + +This list records every merged PR from #16 through #39, not just those authored by Josh. There is no PR #25 in the repository's PR listing. + +* [#16](https://github.com/trssharp/classicspeech-nvda/pull/16): Explorer latency, edit-field and address-bar fixes; Mouse and document-formatting voices; Speech and Sound Schemes. +* [#17](https://github.com/trssharp/classicspeech-nvda/pull/17): Josh Kennedy's author credit. +* [#18](https://github.com/trssharp/classicspeech-nvda/pull/18): Bundled user guide and opening command; preserve sounds when resetting an item's voice. +* [#19](https://github.com/trssharp/classicspeech-nvda/pull/19): Scheme folders and migration; scheme and Voice Profile export/import. +* [#20](https://github.com/trssharp/classicspeech-nvda/pull/20): Remove the unavailable `filecmp` dependency and add runtime-import checks. +* [#21](https://github.com/trssharp/classicspeech-nvda/pull/21): Separate settings file, NVDA-settings backup, reset/uninstall cleanup and saved-voice protection. +* [#22](https://github.com/trssharp/classicspeech-nvda/pull/22): Preserve settings changed during voice overlays; restore Web / Browse Mode changes on Cancel. +* [#23](https://github.com/trssharp/classicspeech-nvda/pull/23): GitHub update checking and checksum-verified installation. +* [#24](https://github.com/trssharp/classicspeech-nvda/pull/24): Fix reset and update modal-dialog scheduling; default reset confirmation to No. +* [#26](https://github.com/trssharp/classicspeech-nvda/pull/26): Scheme coverage across reading modes, formatting ranges, object states and synthesizer capabilities. +* [#27](https://github.com/trssharp/classicspeech-nvda/pull/27): Full, keyboard-navigable update notes. +* [#28](https://github.com/trssharp/classicspeech-nvda/pull/28): Point the updater at this repository. +* [#29](https://github.com/trssharp/classicspeech-nvda/pull/29): Real default-button detection and on-request appearance fallback. +* [#30](https://github.com/trssharp/classicspeech-nvda/pull/30): Restore the initial Input Gestures menu announcement and discard stale cancellation markers. +* [#31](https://github.com/trssharp/classicspeech-nvda/pull/31): Read scheme-tree row names that resemble roles or states. +* [#32](https://github.com/trssharp/classicspeech-nvda/pull/32): Native accessible Hotkeys checklists and shared checklist controls. +* [#33](https://github.com/trssharp/classicspeech-nvda/pull/33): Manifest changelog and release-note synchronization checks. +* [#34](https://github.com/trssharp/classicspeech-nvda/pull/34): Optional priority for ClassicSpeech messages. +* [#35](https://github.com/trssharp/classicspeech-nvda/pull/35): Scheme replacements for NVDA's own sounds. +* [#36](https://github.com/trssharp/classicspeech-nvda/pull/36): Safe sound-wrapper cleanup and native startup/shutdown fallback. +* [#37](https://github.com/trssharp/classicspeech-nvda/pull/37): Complete the current Spanish catalog, including translation-context and access-key repairs before merge. +* [#38](https://github.com/trssharp/classicspeech-nvda/pull/38): Preserve explicit Control+Space selection announcements. +* [#39](https://github.com/trssharp/classicspeech-nvda/pull/39): Correct Spanish meaning, terminology and examples; rebuild and regression-check the catalog. + +## Verification scope + +The linked PRs contain their individual automated-test results and any contributor-reported live tests. Those reports are not a claim that every feature in this combined build has received a fresh live NVDA test. + +Before publishing, verify the selected build and package, and check the relevant speech, scheme, settings and update paths in live NVDA. Updating these notes does not install the add-on or change NVDA's configuration. diff --git a/locale/classicspeech.pot b/locale/classicspeech.pot index 06464d6..8e93d40 100644 --- a/locale/classicspeech.pot +++ b/locale/classicspeech.pot @@ -26,7 +26,7 @@ msgstr "" msgid "&Clickable" msgstr "" -#: _speech_core/update_check.py:445 _speech_core/update_dialog.py:55 +#: _speech_core/update_check.py:452 _speech_core/update_dialog.py:55 msgid "&Close" msgstr "" @@ -38,7 +38,7 @@ msgstr "" msgid "&Copy" msgstr "" -#: _speech_core/update_check.py:425 +#: _speech_core/update_check.py:432 msgid "&Download and install" msgstr "" @@ -86,7 +86,7 @@ msgstr "" msgid "&Maximum number of characters on one line" msgstr "" -#: _speech_core/update_check.py:445 +#: _speech_core/update_check.py:452 msgid "&Not now" msgstr "" @@ -534,7 +534,7 @@ msgstr "" msgid "ClassicSpeech could not check for updates. {reason}" msgstr "" -#: _speech_core/update_check.py:467 +#: _speech_core/update_check.py:474 msgid "ClassicSpeech could not download the update. {reason}" msgstr "" @@ -546,7 +546,7 @@ msgstr "" msgid "ClassicSpeech could not load the {engine} synthesizer. The item keeps using the active synthesizer." msgstr "" -#: _speech_core/update_check.py:393 +#: _speech_core/update_check.py:398 msgid "ClassicSpeech is up to date. You have version {version}, the latest release." msgstr "" @@ -558,7 +558,7 @@ msgstr "" msgid "ClassicSpeech settings were reset, and the NVDA settings it changed were put back. ClassicSpeech now uses its default settings. To remove ClassicSpeech, uninstall it from the Add-on Store." msgstr "" -#: _speech_core/update_check.py:440 _speech_core/update_check.py:491 +#: _speech_core/update_check.py:447 _speech_core/update_check.py:498 msgid "ClassicSpeech update" msgstr "" @@ -566,7 +566,7 @@ msgstr "" msgid "ClassicSpeech voice profiles" msgstr "" -#: _speech_core/update_check.py:401 +#: _speech_core/update_check.py:408 msgid "ClassicSpeech {new} is available. You have version {installed}." msgstr "" @@ -750,11 +750,11 @@ msgstr "" msgid "Double strikethrough" msgstr "" -#: _speech_core/update_check.py:421 +#: _speech_core/update_check.py:428 msgid "Download and install it now? NVDA asks you to confirm the installation, then offers to restart. Your ClassicSpeech settings are kept." msgstr "" -#: _speech_core/update_check.py:453 +#: _speech_core/update_check.py:460 msgid "Downloading ClassicSpeech {version}" msgstr "" @@ -1286,7 +1286,7 @@ msgstr "" msgid "NVDA announces the new font size. Specific sizes are listed separately." msgstr "" -#: _speech_core/update_check.py:475 +#: _speech_core/update_check.py:482 msgid "NVDA could not install the update. Details are in the NVDA log." msgstr "" @@ -2282,11 +2282,11 @@ msgstr "" msgid "This file is not a ClassicSpeech voice profiles file, or it has no voice profiles." msgstr "" -#: _speech_core/update_check.py:413 +#: _speech_core/update_check.py:420 msgid "This release has no add-on file to install. Download it from {url}" msgstr "" -#: _speech_core/update_check.py:408 +#: _speech_core/update_check.py:415 msgid "This release has no notes." msgstr "" @@ -2486,6 +2486,10 @@ msgstr "" msgid "Year month day" msgstr "" +#: _speech_core/update_check.py:393 +msgid "You have ClassicSpeech {version}. The latest published release is {latest}. Your installed version is newer; no update is available." +msgstr "" + #: _speech_core/processors/web/summary.py:28 msgid "annotation" msgstr "" diff --git a/locale/es/LC_MESSAGES/nvda.mo b/locale/es/LC_MESSAGES/nvda.mo index b7c7c2a..7a99c82 100644 Binary files a/locale/es/LC_MESSAGES/nvda.mo and b/locale/es/LC_MESSAGES/nvda.mo differ diff --git a/locale/es/LC_MESSAGES/nvda.po b/locale/es/LC_MESSAGES/nvda.po index 44ab92e..efbdd03 100644 --- a/locale/es/LC_MESSAGES/nvda.po +++ b/locale/es/LC_MESSAGES/nvda.po @@ -26,7 +26,7 @@ msgstr "Buscar &sonido..." msgid "&Clickable" msgstr "&Cliqueable" -#: _speech_core/update_check.py:445 _speech_core/update_dialog.py:55 +#: _speech_core/update_check.py:452 _speech_core/update_dialog.py:55 msgid "&Close" msgstr "&Cerrar" @@ -38,7 +38,7 @@ msgstr "&Colores" msgid "&Copy" msgstr "&Copiar" -#: _speech_core/update_check.py:425 +#: _speech_core/update_check.py:432 msgid "&Download and install" msgstr "&Descargar e instalar" @@ -86,7 +86,7 @@ msgstr "&Listas" msgid "&Maximum number of characters on one line" msgstr "&Número máximo de caracteres en una línea" -#: _speech_core/update_check.py:445 +#: _speech_core/update_check.py:452 msgid "&Not now" msgstr "&Ahora no" @@ -534,7 +534,7 @@ msgstr "Configuraciones de ClassicSpeech para Web / Modo Exploración" msgid "ClassicSpeech could not check for updates. {reason}" msgstr "ClassicSpeech no pudo buscar actualizaciones. {reason}" -#: _speech_core/update_check.py:467 +#: _speech_core/update_check.py:474 msgid "ClassicSpeech could not download the update. {reason}" msgstr "ClassicSpeech no pudo descargar la actualización. {reason}" @@ -546,7 +546,7 @@ msgstr "ClassicSpeech no pudo completar el restablecimiento. Los detalles están msgid "ClassicSpeech could not load the {engine} synthesizer. The item keeps using the active synthesizer." msgstr "ClassicSpeech no pudo cargar el sintetizador {engine}. El elemento seguirá usando el sintetizador activo." -#: _speech_core/update_check.py:393 +#: _speech_core/update_check.py:398 msgid "ClassicSpeech is up to date. You have version {version}, the latest release." msgstr "ClassicSpeech está actualizado. Tienes la versión {version}, la última publicada." @@ -558,7 +558,7 @@ msgstr "Paquete de esquemas de ClassicSpeech" msgid "ClassicSpeech settings were reset, and the NVDA settings it changed were put back. ClassicSpeech now uses its default settings. To remove ClassicSpeech, uninstall it from the Add-on Store." msgstr "Se restablecieron los ajustes de ClassicSpeech y se recuperaron los ajustes de NVDA que había cambiado. ClassicSpeech utiliza ahora sus ajustes predeterminados. Para quitar ClassicSpeech, desinstálalo desde la Tienda de complementos." -#: _speech_core/update_check.py:440 _speech_core/update_check.py:491 +#: _speech_core/update_check.py:447 _speech_core/update_check.py:498 msgid "ClassicSpeech update" msgstr "Actualización de ClassicSpeech" @@ -566,7 +566,7 @@ msgstr "Actualización de ClassicSpeech" msgid "ClassicSpeech voice profiles" msgstr "Perfiles de voz de ClassicSpeech" -#: _speech_core/update_check.py:401 +#: _speech_core/update_check.py:408 msgid "ClassicSpeech {new} is available. You have version {installed}." msgstr "ClassicSpeech {new} está disponible. Tienes la versión {installed}." @@ -750,11 +750,11 @@ msgstr "Dólares y centavos" msgid "Double strikethrough" msgstr "Doble tachado" -#: _speech_core/update_check.py:421 +#: _speech_core/update_check.py:428 msgid "Download and install it now? NVDA asks you to confirm the installation, then offers to restart. Your ClassicSpeech settings are kept." msgstr "¿Descargarla e instalarla ahora? NVDA te pedirá que confirmes la instalación y después ofrecerá reiniciarse. Se conservarán tus ajustes de ClassicSpeech." -#: _speech_core/update_check.py:453 +#: _speech_core/update_check.py:460 msgid "Downloading ClassicSpeech {version}" msgstr "Descargando ClassicSpeech {version}" @@ -1286,7 +1286,7 @@ msgstr "NVDA anuncia el nuevo nombre de fuente. Las fuentes específicas se mues msgid "NVDA announces the new font size. Specific sizes are listed separately." msgstr "NVDA anuncia el nuevo tamaño de fuente. Los tamaños específicos se muestran por separado." -#: _speech_core/update_check.py:475 +#: _speech_core/update_check.py:482 msgid "NVDA could not install the update. Details are in the NVDA log." msgstr "NVDA no pudo instalar la actualización. Los detalles están en el registro de NVDA." @@ -2282,11 +2282,11 @@ msgstr "Este archivo no es un paquete de esquemas de ClassicSpeech." msgid "This file is not a ClassicSpeech voice profiles file, or it has no voice profiles." msgstr "Este archivo no es un archivo de perfiles de voz de ClassicSpeech o no contiene perfiles de voz." -#: _speech_core/update_check.py:413 +#: _speech_core/update_check.py:420 msgid "This release has no add-on file to install. Download it from {url}" msgstr "Esta versión publicada no contiene un archivo de complemento que instalar. Descárgalo desde {url}" -#: _speech_core/update_check.py:408 +#: _speech_core/update_check.py:415 msgid "This release has no notes." msgstr "Esta versión publicada no contiene notas." @@ -2486,6 +2486,10 @@ msgstr "Clases de ventana" msgid "Year month day" msgstr "Año mes día" +#: _speech_core/update_check.py:393 +msgid "You have ClassicSpeech {version}. The latest published release is {latest}. Your installed version is newer; no update is available." +msgstr "Tiene ClassicSpeech {version}. La última versión publicada es la {latest}. La versión instalada es más reciente; no hay ninguna actualización disponible." + #: _speech_core/processors/web/summary.py:28 msgid "annotation" msgstr "anotación" diff --git a/manifest.ini b/manifest.ini index 7dfe2ed..b26cef9 100644 --- a/manifest.ini +++ b/manifest.ini @@ -7,8 +7,38 @@ url = "https://github.com/trssharp/classicspeech-nvda" minimumNVDAVersion = 2025.1 lastTestedNVDAVersion = 2026.2 docFileName = readme.html -changelog = """* Speech in Windows Explorer and in Open and Save dialogs is quick again: ClassicSpeech no longer searches a dialog for its default button on every key press. -* Tabbing into an edit field reads its current line, or "blank" when it is empty, as NVDA does. **Read edit field contents when focused**, on the Verbosity page, turns this off for a verbosity profile. -* An address bar and similar fields keep their name when NVDA announces a tool bar just before them. -* **Voice Profiles** has two new categories: **Mouse**, for speech from mouse tracking, and **Document and web formatting**, for a voice on any formatting or web element NVDA reports. -* **Speech and Sound Schemes**, in the ClassicSpeech menu, works like the JAWS Speech and Sounds Manager: give object types, states, window classes, document formatting and web elements a sound, a voice or both, and keep them in named schemes.""" +changelog = """### Speech and navigation fixes + +* Speech in Windows Explorer and Open and Save dialogs no longer repeatedly searches for a default button on each file-list focus change. ClassicSpeech also uses NVDA's cached focus ancestors to reduce speech-processing delays. +* Tabbing into an edit field reads its current line, or "blank" when it is empty. **Read edit field contents when focused**, on the Verbosity page, can turn this off separately for each verbosity profile. Address bars also keep their name and contents when NVDA announces a tool bar immediately before them. +* Selecting or unselecting the focused item with **Control+Space** announces "selected" or "not selected", regardless of the **List item state reporting** choice. Announcements while moving between items still follow that choice. +* The keyboard-layout menu that opens while adding an Input Gesture now reads its initial item. Stale, held speech fragments no longer suppress the new menu announcement. +* Speech and Sound Schemes tree items named after roles or states, such as "menu" and "selected", are read instead of being mistaken for speech tokens and dropped. +* **NVDA+E** and **Announce default button in dialogs** identify the dialog's real default button more accurately, including split buttons, rather than assuming the focused button is the default. When the default cannot be determined, NVDA+E can explain what Enter presses or identify a uniquely highlighted button by appearance. The appearance check runs only on request, not during ordinary focus speech; with Screen Curtain enabled, it asks you to turn the curtain off before that check. + +### Voice Profiles and Speech and Sound Schemes + +* **Voice Profiles** adds **Mouse**, for physical mouse tracking, and **Document and web formatting**, for voices on formatting and web elements. Use settings supported by the active synthesizer, or choose another synthesizer for an item. Switching synthesizers can add noticeable delay. +* **Speech and Sound Schemes** lets you assign WAV sounds, voices, or both to object types, states, window classes, document formatting and web elements. Sounds can accompany or replace spoken announcements. Named schemes, search, a customized-items filter, custom entries and unassigned switching commands help organize the settings. +* Formatting and element voices now work across character, word, line, sentence, paragraph and Say All reading, including LibreOffice. The required formatting is requested without changing your saved Document Formatting choices or adding unwanted spoken formatting. Fixes also preserve voices across element text, support synthesizers with limited inline voice commands, and make object-state and style/color items effective. Replacing an announcement with a sound does not remove the document text. +* Each scheme keeps its settings and copied WAV files in its own folder. **Open schemes folder**, **Export scheme** and **Import scheme** let you locate and share schemes. Voice Profiles also has export and import controls. Existing schemes migrate to the folder format, and custom fonts, sizes, styles and window classes belong to their individual scheme. +* **Reset this item** in Document and web formatting removes the item's voice without deleting its scheme sound. +* The **NVDA sounds** scheme category can replace NVDA's own sounds, including browse/focus mode, suggestions, spelling errors, screen curtain, Remote Access, startup and exit sounds, without modifying NVDA's waves folder. Removing a replacement restores the native sound. Failed replacement startup, shutdown and Windows sign-out sounds fall back safely to NVDA's own files, and sound-handler cleanup preserves other add-ons' handlers. + +### Settings and message controls + +* ClassicSpeech stores its settings separately in `ClassicSpeech/settings.ini` under NVDA's configuration folder, migrating the previous settings automatically. It backs up the NVDA settings it changes so **Reset All ClassicSpeech Settings** and uninstall can restore them, while preserving subsequent changes you made in NVDA. Updating the add-on keeps ClassicSpeech settings. +* Reset confirmation and update dialogs no longer open inside NVDA's core speech/event pump, fixing the reset freeze. Reset asks for confirmation with **No** as the default. +* Cancelling Web / Browse Mode settings restores the dialog's changes correctly. NVDA settings changed while a Voice Profile speaks are retained, and temporary scheme/voice settings no longer leak into saved synthesizer settings. Voice Profile triggers pause in settings dialogs, apart from explicit scheme previews. +* The Hotkeys options **Speak hotkeys in** and **Which shortcuts to speak** use NVDA's accessible checklists instead of combination-based combo boxes. Menus and Dialogs, and Access keys and Command shortcuts, can each be selected independently. Existing settings remain compatible. ClassicSpeech's other checklists use the same native accessible control. +* **Give ClassicSpeech messages priority over NVDA speech**, on the Misc page, is a new optional setting, off by default. When enabled, it protects ClassicSpeech announcements from automatic interruptions; keyboard, braille and touch input can still stop them. It covers messages such as hook loaded, page ready, page summaries and speech-history replay. + +### Help, updates and Spanish translation + +* A bundled user guide opens from the Add-on Store's **Help** action. An unassigned **Opens the ClassicSpeech user guide** command is also available in Input Gestures. The guide covers the new settings and commands. +* **Check for Updates...** checks this repository's GitHub releases. Automatic checking is enabled by default and runs once a day after startup; it can be turned off on the Advanced page. Checks do not run on secure screens. Installation verifies the downloaded add-on against its published SHA-256 file and uses NVDA's own installation confirmation. +* Manual update checks distinguish an installed development build from GitHub's latest published release: if your installed version is newer, the message reports both versions instead of calling the local build the latest release. The user guide explains draft/prerelease exclusions, numeric version comparisons and same-version manual installation. +* Update offers show the full release notes in a read-only, multiline **What's new** box. You can navigate, select and copy the text with the keyboard; Tab reaches the buttons and Escape closes the dialog without installing. +* On NVDA 2026.1 and later, the Add-on Store's **What's new** action can display the changelog bundled in the add-on manifest. Older supported NVDA versions ignore that field. Packaging checks that it matches the release notes. +* The Spanish catalog now fills previously untranslated entries for recent features. Follow-up corrections improve meaning, NVDA terminology, examples, translation context and scheme-dialog access keys; the compiled catalog is updated too. Spanish remains open to feedback from fluent speakers and NVDA users. +* Josh Kennedy is credited alongside Tim and Calli in the add-on manifest. A runtime compatibility fix removes an unavailable Python-module dependency that otherwise prevented the folder-based schemes version from loading in NVDA.""" diff --git a/scripts/package_addon.py b/scripts/package_addon.py index e3f5569..412e973 100644 --- a/scripts/package_addon.py +++ b/scripts/package_addon.py @@ -18,7 +18,7 @@ # NVDA's Add-on Store Help opens doc/