¡Hola a todos!
Faltan un par de semanas para que NVDA 2018.2 vea la luz, y sin embargo nadie ha parado de hablar de los cambios que trae desde hace ya un tiempo. Uno de los más importantes es el nuevo diálogo de preferencias organizado en categorías, al que hemos hecho referencia ya en varias entradas al hablar de complementos que se actualizan. En este tutorial veremos qué hay que hacer para que el diálogo de preferencias de nuestro complemento se integre en el nuevo diálogo de opciones de NVDA. Nos apoyaremos en el complemento Enhanced Aria, ya que su código es bastante simple, está en un único módulo y los cambios realizados son relativamente sencillos de entender. ¡Comencemos!
Nota: este es un artículo avanzado de desarrollo. Se asume que el lector sabe hacer complementos sencillos, y conoce el lenguaje Python con todo lo que ello conlleva.

Creación de ajustes sensibles a cambios de perfil

NVDA nos da mucha flexibilidad a la hora de crear diálogos para nuestros complementos. De hecho, nos da tanta que nos podemos perder, hacernos un lío, y programar todo con wx para luego darnos cuenta de que existen módulos que nos abstraen de un montón de detalles complejos. Con la configuración pasa exactamente lo mismo, podemos saber que existe configobj, pero ignorar que hay una capa por encima que nos facilita la vida. Definir una especificación de configuración es tan sencillo como crear una variable global en el módulo de nuestro complemento, indicando de qué tipo son los valores y el valor por defecto de cada uno. Esta es la configuración de Enhanced Aria:
confspec={
 "reportBanner":"boolean(default=true)",
 "reportMain":"boolean(default=true)",
 "reportContentinfo":"boolean(default=true)",
 "reportNavigation":"boolean(default=true)",
 "reportComplementary":"boolean(default=true)",
...}
En el caso de Enhanced Aria, todo lo que se configura es booleano, casillas que se marcan o desmarcan. Una vez definida la especificación, hay que decirle a NVDA que la añada al conjunto de especificaciones. Una variable global definida por sí sola en un módulo no va a hacer nada: config.conf.spec['aria']=confspec
Después de este inciso, breve pero necesario para entender todo lo demás, vamos a los diálogos en sí.

El diálogo tradicional de ajustes

Un diálogo tradicional de ajustes es una clase que hereda de gui.settingsDialogs.SettingsDialog. ¡Cuidado con las mayúsculas al programar, nos pueden hacer pasar un mal rato! Todos los diálogos de preferencias de NVDA heredan de esta clase, y los complementos también suelen hacerlo. La clase SettingsDialog nos ofrece varios métodos y propiedades que podemos redefinir:

  • title: propiedad que define el título del diálogo. Debe ser una cadena de caracteres.
  • makeSettings(self, sizer): este método se usa para rellenar el sizer que se recibe como parámetro con los controles que queramos. Enseguida vemos un ejemplo.
  • postInit(self): se ejecuta tras crear y mostrar el diálogo en pantalla. Sirve para llevar el foco por defecto a un control que nos interese, por ejemplo.
  • onOk(self, evt): NVDA llama a este método cuando se pulse el botón aceptar. Los botones Aceptar y Cancelar vienen ya en la clase padre, no tenemos que añadirlos en makeSettings. Aquí se hacen cosas tales como guardar la configuración. Importante llamar al método de la clase padre cuando terminemos.
  • onCancel(self, evt): método que se ejecuta al pulsar el botón cancelar. Importante llamar al método de la clase padre si lo redefinimos.

NVDA 2018.2 extiende este diálogo añadiendo un botón de aplicar, el evento asociado (onApply), y la posibilidad de que el diálogo pueda abrirse varias veces simultáneamente. Todas estas novedades son opcionales para conservar la compatibilidad con complementos que no se adapten a ellas.
Veamos algunos ejemplos. El título de Enhanced Aria es traducible a otros idiomas, y quedaría así: title=(u"Enhanced Aria settings")
El método makeSettings sería el siguiente. Para no hacer muy pesada la lectura, se pondrá sólo una parte:
 def makeSettings(self, sizer):
  #TRANSLATORS: report banners checkbox
  self.bannerenabled=wx.CheckBox(self, wx.NewId(), label=
(u"Report banners"))
  self.bannerenabled.SetValue(config.conf['aria']['reportBanner'])
  sizer.Add(self.bannerenabled,border=10,flag=wx.BOTTOM)
  #TRANSLATORS: report main content checkbox
  self.mainenabled=wx.CheckBox(self, wx.NewId(), label=(u"Report main content"))
  self.mainenabled.SetValue(config.conf['aria']['reportMain'])
  sizer.Add(self.mainenabled,border=10,flag=wx.BOTTOM)
#TRANSLATORS: report search forms checkbox
  self.searchenabled=wx.CheckBox(self, wx.NewId(), label=
(u"Report search forms"))
  self.searchenabled.SetValue(config.conf['aria']['reportSearch'])
  sizer.Add(self.searchenabled,border=10,flag=wx.BOTTOM)
...

Como se puede ver, no sólo creamos, etiquetamos y añadimos casillas de verificación, sino que establecemos su valor basándonos en la configuración actual. Una vez creadas, postInit hace lo siguiente:
 def postInit(self):
  self.bannerenabled.SetFocus()

Nuestro diálogo ya está listo. Como se puede intuir, no se ha redefinido el método onCancel, que simplemente descarta todo y no tiene que hacer nada más. Sin embargo, el método onOk sí tiene trabajo.
def onOk(self, evt):
  config.conf['aria']['reportBanner']=self.bannerenabled.GetValue()
  config.conf['aria']['reportMain']=self.mainenabled.GetValue()
  config.conf['aria']['reportSearch']=self.searchenabled.GetValue()
  config.conf['aria']['reportForm']=self.formenabled.GetValue()
  ...
  applyConfig()
  super(enhancedAriaSettings, self).onOk(evt) # Importante, llamada al padre!

Y ahora, ¿qué hacemos para poder llegar a este diálogo?
Como bien se ha dicho antes, la magia no existe. En el método init de la clase GlobalPlugin, hay que crear un elemento de menú y asociarlo al submenú preferencias de NVDA.
  self.prefsMenu = gui.mainFrame.sysTrayIcon.menu.GetMenuItems()[0]
  #TRANSLATORS: The configuration option in NVDA Preferences menu
  self.enhancedAriaSettingsItem = self.prefsMenu.Append(wx.ID_ANY, _(u"Enhanced aria settings..."), _(u"Change enhanced Aria settings"))
  gui.mainFrame.sysTrayIcon.Bind(wx.EVT_MENU, self.onEnhancedAriaMenu, self.enhancedAriaSettingsItem) # Asociamos abrir el menú a activar el diálogo

No debemos olvidarnos de eliminar el elemento de menú en el método terminate, de lo contrario aparecerá duplicado al recargar las extensiones: self.prefsMenu.RemoveItem(self.enhancedAriaSettingsItem)
Para activar el diálogo, hacemos algo como esto: gui.mainFrame._popupSettingsDialog(enhancedAriaSettings)
Esta es la clase que contiene nuestro diálogo, enhancedAriaSettings. Pero lo hará por poco tiempo, ¡es hora de dar el salto al diálogo de categorías!

El panel de configuración en el diálogo de categorías

Para añadir paneles de configuración al diálogo de opciones, simplemente debemos crear una clase que herede de gui.settingsDialogs.SettingsPanel, y añadir nuestro panel al diálogo de opciones de NVDA, que está definido como variable global en el módulo gui. Esta clase nos ofrece los siguientes métodos y propiedades:

  • title: el título del panel de configuración.
  • makeSettings(self, sizer): al igual que antes, se nos pasa un sizer que rellenaremos con controles.
  • onSave(self): código que se ejecuta al pulsar los botones aceptar o aplicar del diálogo. Ya no es necesario llamar al método padre, como sí pasaba en onOk.
  • onPanelActivated(self): código que se ejecuta cuando se selecciona este panel. Aquí sí se debería llamar al método padre. Sin embargo, no deberíamos mover el foco como se hacía en postInit.
  • onPanelDeactivated(self): código que se ejecuta al abandonar el panel. Se debe llamar al método padre si lo redefinimos.
  • onDiscard(self): método que se llama al salir del diálogo de opciones sin guardar los cambios.

Una vez definido nuestro panel, debemos agregarlo al diálogo de opciones de NVDA. Por ejemplo, en el método init de la clase GlobalPlugin: NVDASettingsDialog.categoryClasses.append(enhancedAriaPanel)
Y por supuesto, eliminarlo en el método terminate, de lo contrario nos arriesgamos a que se duplique: NVDASettingsDialog.categoryClasses.remove(enhancedAriaPanel)
El código queda más simple, ¿verdad? Es muy sencillo hacer un complemento con preferencias que se adapte a NVDA 2018.2. Y como a mí no me gusta lo fácil, vamos a complicarlo un poco: vamos a añadir compatibilidad entre versiones. Puede haber gente que no quiera actualizar NVDA, y no debemos olvidarnos de ellos.

Soporte para todas las versiones de NVDA posibles

Llegados a este punto, podríamos tener dos clases: una con el diálogo y otra con el panel. Podríamos añadir el panel al diálogo de opciones y crear un elemento de menú en el submenú preferencias, y no pasaría nada. Como ya se ha dicho, NVDA nos da flexibilidad. ¿Permitiría esto que nuestro complemento adaptado funcionase con versiones antiguas? La respuesta ya te la puedes imaginar, si fuera afirmativa no existiría este apartado en el tutorial.
Por un lado, tal y como está, nuestro complemento muere estrepitosamente en NVDA 2018.1.1, diciendo que hay módulos que no encuentra. Por otro, queremos que el elemento de menú aparezca en versiones antiguas, y el panel del diálogo de opciones en las nuevas. Para lo último, en los métodos init y terminate de GlobalPlugin, podemos hacer algo como esto.
Método init:
  if hasattr(settingsDialogs, 'SettingsPanel'): # Es el nuevo NVDA
   NVDASettingsDialog.categoryClasses.append(enhancedAriaPanel)
  else:
   self.prefsMenu = gui.mainFrame.sysTrayIcon.menu.GetMenuItems()[0].GetSubMenu()
   #TRANSLATORS: The configuration option in NVDA Preferences menu
   self.enhancedAriaSettingsItem = self.prefsMenu.Append(wx.ID_ANY, _(u"Enhanced aria settings..."), _(u"Change enhanced Aria settings"))
   gui.mainFrame.sysTrayIcon.Bind(wx.EVT_MENU, self.onEnhancedAriaMenu, self.enhancedAriaSettingsItem)

Método terminate:
   if hasattr(settingsDialogs, 'SettingsPanel'):
    NVDASettingsDialog.categoryClasses.remove(enhancedAriaPanel)
 else: # Es el antiguo
    self.prefsMenu.RemoveItem(self.enhancedAriaSettingsItem)

Como se puede comprobar, miramos si existen atributos que sólo podrían existir en NVDA 2018.2.
De cara a la importación de módulos, podríamos hacer algo como esto:
import gui
from gui import settingsDialogs
try:
 from gui import NVDASettingsDialog
 from gui.settingsDialogs import SettingsPanel
except:
 pass # No hacer nada si falla

El planteamiento está muy bien. Si falla al importar las clases es porque no existen, ya que estamos en un NVDA antiguo. Por lo tanto, nos olvidamos del panel y usamos el elemento de menú y el diálogo clásico. ¿Todos estamos deacuerdo? Sí, excepto el intérprete Python.
Cuando Python lea nuestro archivo de complemento, verá que intentamos definir la clase del panel, y que indicamos un padre que no existe porque no lo hemos importado. Por suerte, Python es tan flexible como NVDA: cualquier variable se puede asignar a cualquier cosa, sin importar el tipo e incluso sin que importe que sea una clase o función. Lo único que nos pide es algo de lo que pueda heredar el panel, así que vamos a darle el objeto base del lenguaje: object. En la cláusula except, en vez de poner pass para que no haga nada, hacemos: SettingsPanel=object

Optimización de código

Es tentador copiar y pegar código de unos métodos a otros. En el caso de EnhancedAria, siempre define las mismas casillas, y siempre guarda la misma configuración. Sin embargo, no es una buena práctica, ya que si tenemos un fallo este también se duplica, y hay que corregirlo tantas veces como se haya hecho el copia-pega. Por lo tanto, se ha sacado el código repetido y se ha metido en funciones globales del módulo:

  • addonSettingsTitle: título del diálogo y del panel. Es el mismo en ambos casos. Si lo dejamos duplicado, un traductor tendría que modificarlo dos veces.
  • createSettings(obj, sizer): obj es una referencia al objeto que llama a la función. Es como el self que vimos antes. Esta función crea las casillas.
  • storeSettings(obj): almacena los ajustes al pulsar el botón aceptar.

Haciendo estos cambios, el tamaño de las clases se reduce. Así quedaría el método onSave:
 def onSave(self):
  storeSettings(self)

Conclusión

Existen muchas formas de adaptar nuestros complementos para que aprovechen las nuevas características introducidas en NVDA 2018.2. Podemos modificarlos, o podemos dejarlos como están. Sin embargo, para proporcionar una experiencia de usuario consistente, se recomienda lo primero más que lo segundo. En este tutorial se ha visto sólo una de las muchísimas alternativas existentes. Tanto Python como NVDA son flexibles, permitiendo que cada desarrollador haga las cosas a su manera y optimice el código como le parezca oportuno. Por ejemplo, la simplificación de código vista anteriormente podría haberse hecho definiendo una clase y aplicando herencia múltiple, si bien es cierto que este enfoque podría complicar un poco las cosas. Espero que hayáis disfrutado leyendo este tutorial tanto como yo al escribirlo, y que os sirva para poner vuestros complementos al día. Para cualquier pregunta o sugerencia, no dudéis en dejarnos un comentario debajo.
¡Hasta la próxima!

Aunque hace unos días os hablábamos de que no es conveniente utilizar portables modificados de NVDA, sí es cierto que tener copias portables creadas bajo nuestra propia responsabilidad y en principio para nuestro uso o de personas cercanas en las que confiemos, puede resultar muy útil en determinados momentos, como tener acceso a un PC en el que ayudar a alguien, en lugares públicos como bibliotecas o centros de trabajo, etc. Lo malo es que NVDA ejecutándose de manera portable no tendrá todos los privilegios necesarios para acceder al sistema entero, pero lo bueno es que al menos sí podremos hacerlo.

¿Qué es un portable?

Una copia portable de NVDA es aquella que podemos llevar en un Pen drive o cualquier otro soporte de almacenamiento que se nos ocurra, con nuestras configuraciones (o no), que nos permite ejecutar NVDA en cualquier equipo donde podamos conectar un USB y que cumpla los requisitos mínimos para ejecutar NVDA. Esto resulta especialmente útil a la hora de trabajar en un equipo que no es nuestro o en momentos similares.

¿Es recomendable? Depende de para qué. Aunque desde nvda.es no lo recomendamos para el uso habitual del equipo, nadie te impide no instalar NVDA y ejecutarlo desde donde más te gusta, al igual que nadie te asegura su óptimo funcionamiento, y esto es porque probablemente no lo tendrás. Al ser una copia portable, a la que no permitimos privilegios para acceder a determinadas partes del sistema, como las ventanas del control de usuarios, por ejemplo, habrá partes del sistema con las que nos será imposible trabajar con NVDA portable.

¿Cómo se crea?

Tenemos dos formas de crearlo, las dos igual de sencillas.

  • Desde el instalador de NVDA.
    1. Abrimos el instalador de NVDA.
    2. Nos movemos con Tab hasta el botón crear una copia portable.
    3. Seleccionamos donde queremos que se guarde.
  • Desde nuestro NVDA ya instalado.
    1. Abrimos el menú de NVDA.
    2. Bajamos hasta herramientas y pulsamos crear copia portable.
    3. Pulsamos el botón de examinar, y seleccionamos en la ventana de Explorador de Archivos que se nos abre el directorio donde queremos que se guarde nuestra copia portable.
    4. Si queremos que lo haga, marcamos la casilla correspondiente para que se copien la configuración y los complementos de nuestra copia instalada al portable que estamos creando. Esto copiará todos los complementos instalados, los sintetizadores y sus licencias y todo cuanto tengamos personalizado (salvo la aplicación de los ajustes de NVDA a ventanas seguras).
    5. Pulsamos continuar y después aceptar cuando se nos haya creado.

Es recomendable crear el portable en una carpeta vacía, ya que genera más de 50 archivos.

¿Cómo se ejecuta?

Para ejecutar NVDA portable, será tan sencillo como navegar al directorio donde se haya guardado y ejecutar el archivo nvda.exe. Si queremos instalarlo en nuestro equipo, será tan sencillo como navegar de nuevo al menú herramientas, donde la opción de crear copia portable se habrá sustituido por la de instalar. Al instalarlo, podemos aplicar (o no) los complementos y configuraciones que teníamos en el portable.

Conclusiones

La creación de este artículo viene motivada por la grabación de un vídeo de Félix Couce, donde explica de forma más detallada el uso y creación de las copias portables de NVDA que se puede encontrar en nuestro canal de YouTube y que insertamos aquí.

En definitiva. ¿Conviene crear copias portables de NVDA? Depende del uso que vayamos a darle, pero desde luego es algo que se le ha reprochado en multitud de ocasiones a JAWS y que incluso se ha tratado de emular para este lector de pantalla en muchas ocasiones. No obstante, todas estas iniciativas han resultado fallidas. No creemos que sea conveniente para el uso continuo del lector, ya que se le puede sacar todo el potencial instalado, pero es la mejor opción para utilizar equipos ajenos.

Referencias

NVDA tiene una opción que, aunque desconocida para mucha gente, lo hace ser muy versátil a la hora de trabajar en entornos concretos con programas aún más concretos. La opción de la que hablamos son los perfiles, que podemos configurar según nuestras necesidades.

Contenido

¿Qué son?. 1

El menú de perfiles. 1

Creando un nuevo perfil. 1

Notas adicionales. 2

Referencias. 2

 

 

¿Qué son?

Son configuraciones concretas que podemos hacer a NVDA en escenarios concretos según las necesidades que tengamos al trabajar en determinada aplicación. Estos perfiles se lanzarán de dos maneras, o bien cuando los lancemos de forma manual o bien al configurarlos en determinados entornos, al estar usando una aplicación, por ejemplo. Realmente es mucho más sencillo de lo que parece.

Por ejemplo, puede que, al estar editando en Word, necesitemos que NVDA nos lea los atributos de la letra, los errores de ortografía, los ajustes de párrafo y las sangrías, pero esto nos incomode a la hora de navegar por internet con Firefox. En lugar de activarlo y desactivarlo manualmente, NVDA puede hacerlo por nosotros. La mayoría de las opciones de NVDA, menos las opciones generales, que se aplican a todo el programa, pueden aplicarse en un perfil de configuración cuando lo estamos editando. Incluso podríamos configurar que NVDA cambiara de sintetizador y/o velocidad de lectura al abrir un lector de e-books, por ejemplo.

 

El menú de perfiles

Accedemos a él desde el menú principal de NVDA, perfiles de configuración, o con NVDA+Control+P. Por defecto, solo tendremos el perfil de la configuración normal, que estamos editando. Si por ejemplo tenemos el complemento para Lambda instalado, veremos que tenemos un perfil para Lambda que este nos crea para aplicar sus configuraciones.

  • Al entrar en el menú, lo primero que tenemos es esta lista de perfiles mencionada más arriba.
  • Al movernos con tab, encontramos una opción para crear un nuevo perfil.
  • Al colocarnos en un perfil adicional de NVDA, podemos eliminarlo o editarlo desde este menú.
  • Si continuamos, podemos desplegar una lista de disparadores.
  • Si continuamos, podemos deshabilitar la actuación de los disparadores.

 

Creando un nuevo perfil.

                Para crear un nuevo perfil, pulsamos el botón nuevo. Podemos ponerle un nombre, que nos ayudará a identificarlo, y al pulsar tab seleccionaremos qué actuará como disparador, es decir, en qué situación se activará este perfil. Lo ideal es que, si queremos que se ejecute en una aplicación, Word, por ejemplo, lo creemos con una ventana de Word abierta. Será entonces cuando podremos seleccionar aplicación actual (Winword) y solo se lanzará al abrir Word. Esto, por supuesto, podríamos aplicarlo a la mayoría de las aplicaciones para las que consideremos que necesitamos una configuración diferente.

                Es importante reseñar que, si no rellenamos el nombre, al seleccionar que se ejecute en una aplicación, se asignará un nombre automáticamente que nos permitirá identificar el perfil.

 

 

Notas adicionales

  • Se puede activar un perfil manual mediante su opción correspondiente, pero esto no evitará que los lanzadores activen otros. Las opciones del primer perfil, el manual, primarán sobre las que active el lanzador. Por ejemplo, si en el perfil activado manualmente no tenemos activado el aviso de errores de ortografía, pero sí lo tenemos en el automático activado por un lanzador, al no estar activado en el primero no se leerán. No obstante, sin en el del disparador se ha cambiado la voz y esto no se ha hecho en el manual, se utilizará la voz del perfil disparado y las configuraciones modificadas se guardarán en el manual.
  • Desde la opción de disparadores podemos ver que disparador está asociado a cada perfil y editarlo.
  • Si se ha activado manualmente un perfil, las opciones que se modifiquen se guardarán en él. Si no se ha hecho, las opciones modificadas se guardarán en el perfil que más recientemente se haya lanzado. Si no hay perfil, asociado o manual, las opciones modificadas se guardarán en el perfil normal.
  • Para editar el perfil asociado a verbalizar todo, este se debe activar de forma manual.
  • Se pueden desactivar todos los disparadores marcando la casilla de verificación correspondiente. Esto puede ser útil para hacer determinadas configuraciones sin que interfieran los perfiles.

 

Referencias

 

Nota: Esta guía fue publicada en el año 2015 en la antigua web de NVDA en español. La versión que se ofrece a continuación ha sido actualizada solucionando errores producidos por la conversión entre lenguajes de marcado, eliminando algunos fallos ortográficos y gramaticales del autor y cambiando la referencia al apartado de la guía de usuario que habla de los diccionarios. Si detectas algún error, déjanos un comentario más abajo.

Como se explica en la sección 11.1.14 de Diccionarios del Habla en la Guía de Usuario, gracias a la creación o modificación de los diccionarios NVDA permite personalizar la forma en que el sintetizador lee ciertas palabras, símbolos o dígitos.

En esta pequeña guía vamos a ver como utilizar Expresiones regulares en los diccionarios del habla del lector de pantalla NVDA, ya que en la guía de usuario no se explican con detalle.

A continuación se muestra una breve introducción a las expresiones regulares, seguida de una lista de caracteres y secuencias especiales. No trates de memorizar estas listas, por ahora solo debes tener en cuenta que cada carácter y secuencia especial tiene su propio significado y función.

Con los ejemplos aprenderás a entender el funcionamiento y a crear tu propio diccionario con expresiones regulares.

¿Estás listo? ¡Vamos!

Expresiones regulares: conceptos básicos

En esta sección se presentan conceptos de expresiones regulares, y se explica cómo se crean y se utilizan en los diccionarios de voz de NVDA.

Una expresión regular, llamada también regex, es una secuencia de caracteres que forma un patrón de búsqueda, principalmente utilizada para la búsqueda de cadenas de caracteres y operaciones de sustitución.

Específicamente, NVDA va a aplicar Expresiones regulares para reemplazar patrones cada vez que se encuentre una coincidencia en la lectura.

Podemos decir que es una operación de sustitución cuando el texto escrito se reemplaza antes de ser procesado por el sintetizador de voz.

Las expresiones regulares pueden contener caracteres ordinarios y caracteres especiales.

Los caracteres ordinarios son las letras de la a a la z, los números, el signo subrayado y otros signos de puntuación que no están incluidos en los caracteres especiales.

La mayoría de los caracteres ordinarios, como “a A b 9 0”, son las expresiones regulares más simples, simplemente coinciden consigo mismos.

Por ejemplo, se pueden concatenar caracteres ordinarios así:

la expresión “Odissea2001” coincide con “Odissea2001”.

Caracteres Especiales

Lista completa de caracteres especiales y su comportamiento en el contexto de las expresiones regulares:

  • “\”. Marca el siguiente caracter como un caracter especial, un literal, una referencia inversa. Por ejemplo, “r” coincide con el caracter “r”, mientras que “\r” coincide con un caracter de retorno de carro. Cuando precede a caracteres que normalmente se tratan de forma especial, indica que el siguiente caracter no es especial y debe ser interpretado literalmente. Por ejemplo, la secuencia \” coincide con ” y ( coincide con (.
  • “.”. Coincide con cualquier caracter excepto con “\n”.
  • “^”. Coincide con la posición al principio de la cadena de entrada. La propiedad Multiline está establecida para coincidir también con la siguiente posición después de “\n” o “\r”. Es decir, este caracter corresponde también a la posición inmediatamente después de una nueva línea o un retorno de carro.
  • “$”. Coincide con la posición al final de la cadena de entrada. La propiedad Multiline está establecida para que $ coincida también con la posición anterior a “\n” o “\r”.
  • “?”. Cuando este caracter va inmediatamente después de cualquier otro cuantificador (se mencionan a continuación), el modelo coincidente es no expansivo. Un modelo no expansivo coincide lo menos posible con la cadena buscada, mientras que el modelo expansivo predeterminado coincide tanto como sea posible con la cadena buscada.
  • “?”. Un cuantificador,coincide una vez o ninguna con el caracter o subexpresión anterior. Equivale a {0,1}
  • “*”. Un cuantificador, coincide cero o más veces con el caracter o subexpresión anterior. Equivale a {0,N}.
  • “+”. Un cuantificador, coincide una o más veces con el caracter o subexpresión anterior. Equivale a {1,N}.
  • “{n}”. Un cuantificador: coincide exactamente n veces, donde n es un entero no negativo. Por ejemplo, “o{2}” no coincide con la ‘o’ de “soy”, pero coincide con las dos oes de “Cooperar”.
  • “{n,}”. Un cuantificador: coincide como mínimo n veces, donde n es un entero no negativo. Por ejemplo, “o{2,}” coincide con todas las oes de “nooooo”, pero no coincide con la “o” de “sol”.
  • “{n,m}”. Un cuantificador. M y n son enteros no negativos donde n es menor o igual de m. Coincide n veces como mínimo y m veces como máximo. Tener en cuenta que no se puede incluir un espacio entre la coma y los números.
  • “[xy]”. Un juego de caracteres, coincide con cualquiera de los caracteres incluidos entre corchetes. Por ejemplo, “[aeu]” coincide con “a” en “Madrid”.
  • “[^xy]”. Un juego de caracteres negativo. Coincide con cualquier caracter no incluido entre corchetes. Por ejemplo, “[^aeu]” coincide con la “M”, la”d”, la “r”, la “d” de “Madrid”, pero no coincide con la “a”.
  • “[a-z]”. Un intervalo de caracteres, coincide con cualquier caracter del intervalo especificado. Por ejemplo, “[a-z]” coincide con cualquier caracter alfabético en minúsculas dentro del intervalo de la ‘a’ a la ‘z’.
  • “[^a-z]”. Caracteres de un intervalo negativo. Es decir, coincide con cualquier caracter que no esté incluido en el intervalo especificado. Por ejemplo, “[^a-z]” coincide con cualquier caracter que no esté incluido en el intervalo de la ‘a’ a la ‘z’.
  • “|” Es un carácter disyuntivo: x|y, coincide con x o con y. Por ejemplo, la expresión “Juli(a|o)” coincide con “Julia” o con “Julio”.
  • “(…)”. Una subexpresión que coincide con el modelo entre paréntesis y captura la coincidencia. La coincidencia capturada se puede recuperar en el remplazo mediante las secuencias especiales “\1” “\2” etc. Para que coincidan los paréntesis ( ), utilice “(” o “)”.
  • “(?:…)”. Una subexpresión que coincide con el modelo entre los paréntesis, pero que no captura la coincidencia, es decir, la coincidencia no se almacena para un posible uso posterior. La expresión “(?:\d+)(Salir)” coincide con la palabra “Salir” después de un conjunto de números en una cadena como por ejemplo “123456Salir Gráfico Enlace”. Nota, los números no se almacenan y además no serán procesados por el sintetizador. El sintetizador simplemente ignora el contenido de esta Afirmación. Esta subexpresión se considera como grupo de cadena irregular, No se utiliza mucho en los diccionarios.
  • “(?=…)”. Una subexpresión que realiza una búsqueda anticipada positiva, la cual coincide con la cadena en cualquier punto donde empiece una cadena que coincida con el modelo entre los paréntesis. Por ejemplo, “Juli(?=a|o)” coincide con “Juli” en “Julia” pero no con “Juli” en “Juliu”. Ésta es una coincidencia sin captura, es decir, la coincidencia no se captura para un posible uso posterior. Las búsquedas anticipadas no consumen caracteres, es decir, después de que se produce una coincidencia, la búsqueda de la siguiente comienza inmediatamente después de la última coincidencia, no después de los caracteres que componen la cadena de búsqueda anticipada.
  • “(?!…)”. Una subexpresión que realiza una búsqueda anticipada negativa, la cual coincide con la cadena de búsqueda en cualquier punto donde empiece una cadena que no coincida con el modelo. Por ejemplo, “Juli(?!e|u)” coincide con “Juli” en “Julia” pero no coincide con “Juli” en “Julie”. Ésta es una coincidencia sin captura, es decir, la coincidencia no se captura para un posible uso posterior. Las búsquedas anticipadas no consumen caracteres, es decir, después de que se produce una coincidencia, la búsqueda de la siguiente comienza inmediatamente después de la última coincidencia, no después de los caracteres que componen la cadena de búsqueda anticipada.
  • “(?<=…)”. Afirmación look-behind positiva, es decir, es válida la siguiente expresión sólo si la condición del modelo entre paréntesis se verifica. Por ejemplo, “(?<=0)\d” coincide con cualquier número precedido por cero. Las afirmaciones son sin captura, es decir, no se captura para un posible uso posterior.
  • “(?<!…)”. Afirmación look-behind no positiva, es decir, es válida la siguiente expresión sólo si la condición del modelo entre paréntesis no se verifica. Por ejemplo, “(?<![1-9])\d” coincide con cualquier número que no está precedido por un número comprendido entre 1 y 9.

Secuencias Especiales

Las secuencias especiales consisten en “\” y un caracter ordinario como en la lista de abajo. Si el caracter ordinario no está en la lista, entonces la expresión resultante coincidirá con el segundo caracter.

  • “\A”. Coincide sólo en el inicio de la cadena.
  • “\Z”. Coincide sólo con el final de la cadena.
  • “\b”. Coincide con el límite de una palabra. Es decir, la posición entre una palabra y un espacio. Por ejemplo, “ir\b” coincide con ‘ir’ en “mentir”, pero no coincide con ‘ir’ en “mentira”.
  • “\B”. Coincide con una posición que no es un límite de palabra. La expresión “ir\B” coincide con “ir” en “mentiras”, pero no coincide con “ir” en “mentir”.
  • “\d”. Coincide con un dígito. Equivale a “[0-9]”.
  • “\D”. Coincide con un caracter que no sea un dígito. Equivale a “[^0-9]”.
  • “\s”. Coincide con cualquier caracter de espacio en blanco incluidos espacio, tabulación, salto de página, etc. Equivale a “[\f\n\r\t\v]”.
  • “\S”. Coincide con cualquier caracter que no sea un espacio en blanco. Equivale a “[^\f\n\r\t\v]”.
  • “\w”. Coincide con cualquier caracter alfanumérico incluido el subrayado. Equivale a “[A-Za-z0-9_]”.
  • “\W”. Coincide con cualquier caracter que no pertenezca a los caracteres alfanuméricos. Equivale a “[^A-Za-z0-9_]”.

Ejemplos

Finalmente llegamos a la parte práctica con los ejemplos.

Por conveniencia usaremos un diccionario temporál en los ejemplos. Para ello, necesitamos ajustar la opción para las expresiones regulares desde el diálogo correspondiente.

Ejemplo 1

El sintetizador eSpeak en español pronuncia con C suave palabras extranjeras que comienzan con “ch”, como Christ, christmass, Christofer o Christopher, Christian, etc. Si deseamos escuchar una pronunciación mejor, podemos usar la siguiente expresión regular, muy sencilla.

Patrón: “\bChri\B”

Reemplazar: “Cri”

Explicación: la secuencia especial “\b” marca el inicio de la palabra, mientras que la secuencia “\B” (la B mayúscula) dice que en esta posición no hay limite de palabra.

Cada vez que se encuentra el prefijo “Chri” en el texto, el sintetizador lee el texto indicado en el Reemplazo “Cri”.

Tener en cuenta que las secuencias especiales \b y \B son marcadores de posición, no necesitan una recuperación en el reemplazo.

La mayoría de las secuencias especiales, como por ejemplo \s, \w, \d, necesitan ser recuperadas en el reemplazo, si no vamos a recuperarlas no se envierán al sintetizador.

Ejemplo 2

A veces puede ser útil leer el nombre de unidades de medida cuando en el texto aparecen como abreviaturas.

Por ejemplo, 1ml 12 ml. ¿no sería fantástico que el sintetizador las leyera así?

Un mililitro y doce mililitros.

Necesitamos dos expresiones regulares para distinguir el plural y el singular.

Primera expresión regular.

Patrón: “(^|\s)1[ ]?ml\b”

Reemplazar: “\1un mililitro”

Segunda expresión:

Patrón: “(?<=\d)[ ]?ml\b”.

Reemplazar: ” Mililitros”.

Explicación: la primera subexpresión “(^|\s)” tiene en cuenta si la posición está al principio o si hay un espacio antes del número 1.

Esta subexpresión se puede recuperar en el remplazo mediante la secuencia especial \1.

Recuerda que las subexpresiones regulares entre paréntesis, llamadas también grupos de cadena, se pueden recuperar en el remplazo con la secuencia especial correspondiente. Es decir, el primer grupo de cadena de izquierda a derecha se recupera con \1, el segundo con \2, etcétera. Después del grupo está el número 1, ya que estamos buscando en el texto 1ml o 1 ml, puede ser que haya o no un espacio entre el número y la abreviatura.

Entre corchetes se ha puesto un espacio, se pueden añadir distintos caracteres de espacio. Luego hay un cuantificador, cerrar interrogación, que indica que este espacio puede aparecer una vez o ninguna.

Finalmente, nuestra abreviatura ml y una secuencia especial “\b” para cerrar la expresión regular.

La secuencia al fin indica un límite de palabra, es decir que “ml\b” no puede coincidir por ejemplo con “mls” o “mla”.

La segunda expresión regular se abre con una aserción “(?<=\d), significa que nuestra expresión Es válida solo si hay un dígito antes.

La aserción usa una secuencia especial “\d” que coincide con cualquier número.

Entonces, ¿por qué no funciona si antes está solo el número 1?

Te toca adivinar la respuesta…

Ahora, gracias a las dos expresiones regulares, cuando “ml” es precedido por 1 o ningún caracter alfanumérico, el sintetizador lee “mililitro”. En los demás casos el sintetizador lee “mililitros”.

El orden es importante, las expresiones regulares más arriba Tienen prioridad y pueden cancelar las expresiones posteriores. Por eso la segunda expresiónSe inserta a continuación de la primera.

¿A qué estás esperando? Ahora trata de crear reglas para leer otras unidades como Kg, MB, m² o cm³.

Ejemplo 3

Todavía es común separar los millares, millones, etc., mediante un espacio Para facilitar la lectura de números cuando constan de más de cuatro cifras:

12 354 o 1 303 404.

Algunos sintetizadores no leen correctamente esta forma de escribir los números enteros, más adelante se explica cómo configurar una expresión regular para leerlos correctamente.

Abrimos un diálogo para crear nuestro diccionario del habla desde el menú Preferencias.

Necesitamos ajustar el patrón para comparar como expresión regular desde el botón de opción correspondiente, y rellenar el campo Patrón y el campo de reemplazar.

Patrón: “(?<=\d)([  ]?)(\d{3})”

reemplazar: “\2”

Vamos a explicar.

La primera afirmación indica que la búsqueda es cierta si hay un dígito antes de la cadena. Sigue una subexpresión entre paréntesis con un conjunto de espacios dentro, son tres signos distintos de espacio que se pueden encontrar.

Recuerda que solo uno de los caracteres entre corchetes coincide con la búsqueda, luego hay un cuantificador “?” para indicar que se puede encontrar cero o una sola vez. Sigue a la derecha otra subexpresión entre paréntesis que indica un número de tres dígitos. El cuantificador “{3}” significa que el dígito “\d” debe repetirse tres veces, ni más ni menos.

Vamos a ver lo que tenemos que insertar en el campo reemplazar.

La primera subexpresión “(?<=\d)” en el patrón es una afirmación, no se almacena para un posible uso en el remplazo. Esto no significa que no se tengan en cuenta los caracteres de esa afirmación, el sintetizador va a leer estos dígitos junto a los otros sin recuperar la subexpresión en el campo reemplazar.

El segundo grupo o subexpresión “([ ]?)” es una subexpresión regular y se puede recuperar en el remplazo mediante la secuencia especial \1. Pero nosotros queremos excluirlo, así que no lo recuperamos.

Por el contrario, vamos a recuperar la tercera subexpresión “(\d{3})” mediante la secuencia especial \2.

De esta manera enviamos al sintetizador un número sin espacios entre los dígitos.

Ejemplo 4

Cuando consultamos una lista de números de teléfono o algo similar, puede ser útil leer los números dígito a dígito.

Por ejemplo, si encontramos 3332211444 podríamos leerlo como si estuviera escrito “3 3 3 2 2 1 1 4 4 4”.

Necesitamos una secuencia especial en el patrón de búsqueda que encuentre o coincida con cualquier número, y luego añadir un espacio después de cada dígito sólo cuando es seguido por otro dígito.

Patrón: “(\d)(?=\d)”

Reemplazar: “\1 “.

En el reemplazo recuperamos el primer grupo “(\d)” con “\1”, e inmediatamente después hay un espacio. El patrón de búsqueda encuentra cualquier dígito solo si va seguido de otro dígito.

Este es un ejemplo de una expresión regular que se puede utilizar en determinados casos, pero la mayoría de las veces dá como resultado una lectura tediosa. Está bien para leer números de teléfono, pero no sería agradable leer por ejemplo “Son las 13:26”.

Como hemos visto, las expresiones regulares permiten encontrar un texto específico y reemplazarlo a nuestro gusto antes de enviarlo al sintetizador.

La mayoría de las veces es suficiente utilizar expresiones regulares simples, aunque debemos tener en cuenta que cuanto más simple sea la expresión regular, menos específica será la búsqueda.

Una sugerencia antes de concluir: no se deberían crear diccionarios del habla muy largos. Si el diccionario es demasiado grande puede ralentizar mucho el lector de pantalla. (1500 expresiones o más).

Además, no hay necesidad de corregir los errores de ortografía, o tratar de simular la pronunciación extranjera cuando el sintetizador no tiene los fonemas necesarios.

¡Hola a todos!
En este videotutorial, que ya tiene algún tiempo, Felipe Ibarra nos explica cómo instalar complementos en NVDA de una forma clara y sencilla. El vídeo dura aproximadamente 24 minutos, y ha sido grabado teniendo en cuenta también a personas sin discapacidad visual, de tal forma que todo el mundo pueda aprender de un modo guiado cómo se instalan complementos en este lector de pantalla. ¡Que lo disfrutes! Y como siempre, si tienes cualquier inquietud, no dudes en compartirla con nosotros más abajo, en los comentarios.

¡Hola a todos!

En esta entrada vamos a hablar de la integración entre NVDA y las aplicaciones Java, y cómo administrar Java Access Bridge, la librería de accesibilidad ofrecida para este propósito.

¿Qué es Java Access Bridge?

Java Access Bridge es una librería de accesibilidad que permite que las tecnologías de asistencia, incluyendo lectores de pantalla, puedan comunicarse con las aplicaciones Java que disponen de interfaz gráfica hecha con el motor de interfaces Swing. Esta librería no es necesaria para aplicaciones que utilizan la línea de órdenes (consola), y aplicaciones que usan otros motores gráficos con controles nativos del sistema (motor SWT, Eclipse).

Java Access Bridge debe habilitarse en el sistema para que los lectores de pantalla puedan acceder a las aplicaciones Java mencionadas anteriormente. Si no está habilitado, estas aplicaciones se mostrarán inaccesibles. Algunos programas que lo necesitan para ser compatibles con tecnologías de asistencia son:

  • Open Office y Libre Office, aunque en sus últimas versiones ya están eliminando este requisito
  • Android Studio
  • Entorno de desarrollo para Arduino
  • JDownloader, el popular gestor de descargas
  • Aplicaciones Java integradas en el navegador
  • El propio panel de control de Java
  • Y muchos otros programas que no se mencionan aquí

Nota: el hecho de que Java Access Bridge esté activado no implica necesariamente que todas las aplicaciones Java sean accesibles. Es responsabilidad del desarrollador programar los controles de forma adecuada. En la mayoría de controles estándar, basta con etiquetarlos de forma correcta.

Instalación

Hasta hace un tiempo, instalar Java Access Bridge siempre ha sido una operación complicada, en la que se veían involucradas una descarga con archivos extra, la línea de órdenes y la copia de archivos a los lugares adecuados. Con la llegada de Java 7 y Windows 7, el procedimiento se ha simplificado muchísimo, y es el que vamos a documentar aquí.

Descarga del entorno de ejecución de Java (JRE)

El entorno de ejecución de Java es lo primero que debemos obtener. Sin él, ningún programa basado en Java funcionará. Se puede descargar de dos sitios oficiales distintos: la web de java.com, y la página de descargas de Oracle. Visita una u otra dependiendo de lo que necesites descargar. Si tienes un sistema de 64 bits, es muy importante que descargues el entorno de 32 bits para que funcione con NVDA. Lo ideal es instalar ambos entornos: el de 32 bits para activar las funciones de accesibilidad e integrar complementos en los navegadores web de 32 bits, y el de 64 bits para garantizar un rendimiento máximo y el funcionamiento con otros lectores de pantalla, como Jaws for Windows. Una vez descargados, instálalos en el orden que prefieras.

Activación de Java Access Bridge

Para activar Java Access Bridge, debes ir al centro de accesibilidad en el panel de control. En la vista por categorías, se encuentra bajo Accesibilidad. Si tienes Windows 8 o posterior, no uses la aplicación de configuración. Java Access Bridge sólo está disponible en el panel de control.

Una vez en el centro de accesibilidad, pulsa un enlace llamado “Facilitar uso del equipo”.

Busca la casilla “Activar Java Access Bridge” y márcala. A continuación, pulsa aceptar y cierra el centro de accesibilidad.

Para acabar, comprueba que todo funciona. En el panel de control, busca la opción Java. Cambia la vista a Iconos grandes o iconos pequeños, en la vista por categoría te puede costar más encontrarlo.

Si al abrir el panel de control de Java NVDA detecta la pestaña General, ¡enhorabuena, ya has terminado! De no ser así, reinicia NVDA y prueba de nuevo.

Consideraciones al actualizar el entorno de ejecución de Java

De vez en cuando, Java nos avisará de que hay una nueva versión. En estos casos siempre se recomienda actualizar, ya que seguramente habrá algún fallo de seguridad solucionado o mejoras en el rendimiento y la estabilidad. Sin embargo, si usas NVDA, ¡cuidado! Hay algo que debes hacer antes.

Cuando NVDA se inicia, busca la librería Java Access Bridge en el sistema y la carga. El problema es que la mantiene siempre cargada, aunque ninguna aplicación Java esté abierta. El instalador de Java no tiene esto en cuenta. Al actualizar, ve que no puede sobreescribir el archivo dll de la librería, programa su actualización para el siguiente reinicio… y siempre sale algo mal porque NVDA interfiere, haciendo que la dll desaparezca y nos quedemos sin soporte para aplicaciones Java irremediablemente.

Al actualizar el entorno Java para 64 bits no hay ningún problema (salvo que debes hacerlo a mano). Sin embargo, cuando actualices el entorno de 32 bits, toma las siguientes precauciones:

Haz copia de seguridad de la librería

Navega al directorio C:\windows\system32 en sistemas de 32 bits, o a C:\windows\SysWOW64 en sistemas de 64 bits. Busca el archivo windowsAccessBridge-32.dll, y cópialo a cualquier parte de tu disco duro. Si algo sale mal, puedes restaurarlo después y continuar con tus tareas como siempre.

Haz que NVDA libere la librería antes de actualizar Java

Mucha gente podría tomar la sabia decisión de cerrar NVDA para actualizar Java. Por desgracia, si es el único lector de pantalla que tenemos, esa no es una opción válida. Hay que desactivar aquellas partes de NVDA que van a causar problemas, y activarlas más adelante. El hecho de que NVDA sea tan modular, permite hacerlo con facilidad.

Para desactivar el soporte para Java Access Bridge, haz lo siguiente:

  • Pulsa NVDA+ctrl+z para abrir la consola Python de NVDA. También puedes abrirla desde el submenú herramientas del menú de NVDA.
  • Escribe las siguientes líneas:

    import JABHandler
    JABHandler.terminate()

  • Actualiza el entorno de Java para 32 bits con normalidad.
  • Reactiva el soporte para Java Access Bridge. Puedes hacerlo reiniciando NVDA directamente, o escribiendo las siguientes líneas en la consola:

    reload(JABHandler)
    JABHandler.initialize()

¿Qué pasa con Java 9?

Actualmente, mientras escribimos esta entrada, la versión recomendada de Java es la 8. Sin embargo, ya se ha liberado el entorno de ejecución de Java 9, con muchísimas ventajas y mejoras. Por desgracia, sólo es compatible con sistemas de 64 bits. No hay ningún entorno de Java 9 para 32 bits, por lo que NVDA no funciona con Java Access Bridge. Habrá que esperar a que NVAccess y Oracle pongan soluciones a este contratiempo. Mientras tanto, no queda más remedio que continuar en Java 8.

¿Tienes dudas o quieres aportar algo nuevo no documentado en esta guía? No lo pienses dos veces, escribe un comentario más abajo. ¡Estaremos encantados de actualizar esta entrada con nueva información!

El mes pasado se publicó la versión definitiva de Windows 10 Fall Creators, también conocida como versión 1709 o actualización de características 1709. No vamos a entrar en detalles sobre sus múltiples ventajas y novedades, ya que son bastantes y por la red circulan infinidad de noticias que hablan de ellas. En esta entrada vamos a hablar de una nueva característica de seguridad que, si bien es cierto que no interfiere con NVDA al usarlo de forma cotidiana, sí nos puede ocasionar un gran dolor de cabeza al instalar o actualizar. Se trata del control de acceso a carpetas.

¿Qué es el control de acceso a carpetas?

El control de acceso a carpetas es una nueva característica de Windows Defender que monitoriza y puede bloquear el acceso no autorizado a las carpetas y archivos de nuestro disco duro por parte de programas de terceros, como es el caso de NVDA. Esta característica viene muy bien para protegernos contra virus y programas dañinos, pero también provocará fallos en la instalación y actualización de NVDA. Por ejemplo, el icono de acceso directo del escritorio nunca llegará a crearse, y podremos obtener errores que harán que el proceso no se complete, dejando nuestra copia de NVDA en un estado inconsistente. Por suerte, esta característica parece venir desactivada por defecto, según han informado la mayoría de los usuarios. Si este no es tu caso, sigue leyendo. Te explicaremos cómo desactivarla.

¿Cómo se desactiva?

Sigue estos pasos para desactivar el control de acceso a carpetas:

  • Pulsa las teclas windows+i para abrir la aplicación de configuración.
  • En la lista, pulsa intro sobre actualización y seguridad, y después sobre Windows Defender. Es posible que cada vez que pulses intro en la lista el foco se sitúe en el cuadro de búsqueda. No hay problema, pulsa una vez el tabulador para volver.
  • Tabula y pulsa el botón “Abre el centro de seguridad de Windows Defender”
  • Cuando se abra el centro de seguridad, pulsa el botón “Protección antivirus y contra amenazas”
  • Tabula y pulsa el botón “Configuración de antivirus y protección contra amenazas”
  • Pulsa tabulador hasta llegar al botón “Controla el acceso a la carpeta”. Si NVDA te indica que está pulsado, significa que la protección está activada. Si el estado del botón es no pulsado, no tienes que hacer nada más.
  • Pulsa espacio para desactivar la protección. Es posible que se muestre una ventana del control de cuentas de usuario pidiendo confirmación. Si es así, pulsa alt+s para confirmar.

Ahora que tienes el control de acceso a carpetas desactivado, NVDA se instalará y actualizará con normalidad. El hecho de tenerlo activado, como hemos dicho, no afecta al uso regular del lector de pantalla. Por lo tanto, si quieres estar más seguro, ¡no te lo pienses dos veces y actívalo!

Cuando está activado, el control de acceso a carpetas permite agregar aplicaciones excluidas; es decir, aplicaciones que podrán entrar a las carpetas saltándose la protección. Si consigues instalar o actualizar NVDA por este medio, sin desactivar la protección, déjanos un comentario explicando cómo lo has hecho. ¡De esa forma podremos actualizar esta entrada con más posibilidades y opciones!

¡Hola a todos!
Soy Carlos Esteban Martínez Macías, y este es mi primer aporte para la web nvda.es, la nueva página de la comunidad hispanohablante de NVDA totalmente en español, que fue puesta a disposición desde el 23 de octubre de este mismo año, 2017.
Como ya sabrán los usuarios de NVDA, NVDA reproduce sonidos para cuando se inicia, se cierra, se conmuta entre modos foco o exploración, cuando hay un error en NVDA (aunque veo que ese sonido solo se reproduce en las versiones en desarrollo), un error de ortografía cuando se escribe (en programas que revisen la ortografía mientras se escribe) y cuando se abren y cierran auto sugerencias en varios cuadros de edición, por ejemplo los de búsqueda en el menú inicio de Windows.
Sin embargo, puede haber ocasiones en los que estos sonidos que reproduce NVDA los quisieras cambiar, talvez porque ya estás aburrido de escuchar los mismos sonidos, o por alguna otra razón. Esto se puede hacer, de la siguiente forma:

  • Si tienes NVDA instalado, dirígete a la carpeta archivos de programa en 32 bits, o archivos de programa (x86) en 64 bits. A veces, en lugar de archivos de programa la carpeta puede llamarse Progran Files, pero en este caso es lo mismo dicho en inglés.
  • Luego, navega hasta la carpeta NVDA.
  • A continuación, abre la carpeta Waves. Si tu NVDA es un portable, puedes ir a la carpeta donde tienes el portable, y luego a la carpeta Waves.
  • Aquí es donde se encuentran los sonidos, y, si activaste la visualización de extensiones para tipos de archivos conocidos en el explorador de archivos de Windows, en opciones de carpeta, te darás cuenta que están en .Wav.

A continuación, veremos qué evento corresponde a cada sonido:

  • BrowseMode.wav, Modo exploración.
  • Error.wav, Error.
  • Exit.wav, Salida.
  • FocusMode.wav, Modo foco.
  • Start.wav, Inicio.
  • SuggestionsClosed.wav, Sugerencia cerrada.
  • SuggestionsOpened.wav, Sugerencia abierta.
  • TextError.wav, Error de ortografía.

Ahora, ¿Cómo se cambian? Supongo que ya lo imaginas, ¿No? Pero supongo que muchos usuarios no sabrán cómo hacerlo…
Bien.
Primero, debemos tener varios sonidos en formato.wav. Si no tienes el sonido que le quieres poner en ese mismo formato, puedes utilizar algún editor de audio, o algún otro programa, para convertir el archivo (por ejemplo en .mp3) a.wav.
Luego, debemos cambiarle el nombre a estos sonidos, a los mismos nombres de los sonidos de la carpeta Waves, que podemos leer arriba.
Después, copiar esos archivos de sonido en formato.wav y con los mismos nombres de los sonidos de NVDA, y pegarlos en la carpeta Waves, que ya dije cómo se encuentra. Le damos que sí a la pregunta sobre reemplazar los archivos, y, si nos aparece un cuadro de diálogo indicándonos que necesitamos tener derechos de administrador para hacer esto (generalmente sucede cuando hacemos operaciones en las carpetas de archivos de programa y no tenemos privilegios de administrador), y queremos cambiar los sonidos, le damos en continuar con derechos de administrador automáticos.
Luego, para que veas el efecto, reinicia NVDA, ¡Y verás que los sonidos han cambiado!
En el archivo.zip Dejo este documento, junto con 3 Pacx con otros sonidos para NVDA, uno de la web grossgan.com, otro, con sonidos de Windows XP que lo hice yo mismo, y otro con nuevos sonidos que iba a incorporar NVDA en la versión 2017.3, que al final no se pusieron, pero sin embargo estuvieron en las versiones en desarrollo. Puedes probarlos copiándolos y pegándolos en la carpeta Waves.
También, dejo los sonidos originales de NVDA, por si quisieras volver a esos.
Saludos
Haz clic en este enlace para descargar un archivo.zip con tres packs de sonidos y un documento con estas mismas instrucciones

Hola a todos:

En ocasiones ocurre que NVDA se desestabiliza y comienza a verbalizar la palabra desconocido en menús, diálogos del sistema y de aplicaciones de Mozilla o de Internet Explorer. Esto aparenta ser por un problema con el registro de una librería. El modo de solucionarlo es muy sencillo y se hace siguiendo las instrucciones de más abajo:

En primer lugar ejecutaremos la terminal de Windows en modo administrador: windows+x para sistemas 8.x o posteriores, tecla aplicaciones sobre inicio, todos los programas, accesorios, símbolo del sistema para windows 7.

En segundo lugar con la orden cd cambiaremos al directorio donde estén instaladas las librerías que están dando problemas a NVDA:
cd %systemroot%\system32
en sistemas de 32 bits, o
cd %systemroot%\syswow64
en sistemas de 64.

En tercer lugar deberemos registrar las librerías problemáticas: oleacc.dll y UIAutomationCore.dll pegando o escribiendo las siguientes líneas de órdenes:

regsvr32 oleacc.DLL

regsvr32 UIAutomationCore.dll

Con esto deberíamos volver a tener a NVDA ejecutándose y verbalizando toda la información con normalidad.

La llegada del navegador Firefox 57 “Quantum” está prevista para el 14 de noviembre. Esta versión es esperada y deseada por muchos, ya que deja atrás los threads para pasarse al modelo multiproceso que usa Chrome, y gracias al que se impide que el navegador quede completamente bloqueado cuando una página se cuelga. Suena bien, ¿verdad? Pues si usas NVDA, tal vez se te quiten las ganas de instalarlo.

El problema

Durante bastante tiempo, Google Chrome ha trabajado con múltiples procesos. De esta forma, si uno se bloqueaba, era tan sencillo como terminarlo mientras el navegador continuaba con otras tareas. Firefox ahora quiere adoptar este modelo, pero no ha tenido en cuenta los problemas de accesibilidad derivados de ello.

Al abandonar la implementación basada en hilos, se dejan atrás recursos tales como la memoria compartida. Hay que crear canales de comunicación entre distintos procesos. Esto no será un problema para muchos usuarios. Sin embargo, para los que usamos lectores de pantalla sí, ya que la información de accesibilidad debe viajar al proceso principal antes de llegar al lector de pantalla, disminuyendo notablemente el rendimiento. Ayer Jonathan Mosen advertía a los usuarios de Jaws for Windows en un artículo publicado en el blog de Freedom Scientific, desaconsejando el uso de Jaws con Firefox incluso en su nueva versión 2018. Poco tiempo después, James Teh confirmaba que, si bien los problemas de rendimiento no iban a ser tan graves en NVDA, serían perceptibles. En la comunidad española de NVDA hemos realizado algunas pruebas con Firefox 57 beta 11, y esto es lo que hemos visto.

  • Aunque las páginas sean pequeñas, NVDA verbaliza el mensaje “Cargando documento…” antes de permitirnos navegar por la web. Esto sólo lo hace cuando le cuesta cargarlo.
  • Se nota un considerable aumento en el tiempo de carga para páginas complejas y dinámicas.
  • La representación virtual del documento es inestable, y no suele reflejar el documento web tal y como es. Por ejemplo, eventualmente hemos visto que desaparecían filas de una tabla sin motivo aparente. Esto no es perceptible si se navega por la web con el modo foco activado.

Las pruebas se han hecho con procesadores i7 bastante potentes. En ordenadores con menos recursos, sin duda, los problemas aquí descritos serán mucho peores.

La solución

Se espera que tanto Mozilla como NVAccess colaboren para solucionar estos problemas de rendimiento y los tengan resueltos a mediados de 2018. Mientras tanto, tienes varias alternativas:

  • Usa Chrome. Puede ser una buena alternativa, ¡y a lo mejor decides quedarte con él como navegador principal! Más información sobre Google Chrome
  • Actualiza Firefox y espera a que pase la tormenta. Evidentemente, esto no se va a quedar así, y cuando se solucione serás el primero en disponer de toda la potencia del nuevo Firefox.
  • Instala Firefox ESR (publicación de soporte extendido) y úsalo durante unos meses. Firefox ESR siempre tarda más en actualizarse, así que el modelo multiproceso no llegará hasta mediados del 2018. Seguirás teniendo la seguridad y la estabilidad que garantiza Mozilla. Descarga Firefox ESR desde esta página
  • Usa otros navegadores, como Internet Explorer o Edge. El primero ya es muy antiguo y el segundo no es totalmente accesible, pero son alternativas perfectamente válidas que puedes emplear bajo tu responsabilidad.

¿Y tú? ¿Con qué alternativa te quedas?