Différences entre les versions de « Traduction du NVDA 2011.1 Developer Guide »

De April MediaWiki
Aller à la navigationAller à la recherche
 
(39 versions intermédiaires par 5 utilisateurs non affichées)
Ligne 1 : Ligne 1 :
<PRE> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
+
[[catégorie:Tutoriel NVDA|Accessibilité]]
<HTML>
 
<HEAD>
 
<META NAME="generator" CONTENT="http://txt2tags.sf.net">
 
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
 
<TITLE> NVDA 2011.1 Guide du développeur </TITLE>
 
</HEAD><BODY BGCOLOR="white" TEXT="black">
 
<P ALIGN="center"><CENTER> <H1> NVDA 2011.1 Guide du développeur </H1>
 
<FONT SIZE="4">
 
</FONT></CENTER>
 
</PRE>
 
<A NAME="toc"></A>
 
<H2> Table des matières </H2>
 
<UL>
 
  
<LI><A HREF="#toc2"> 1. Introduction </A>
+
<div class="source" style="border: black 1px solid; background-color: silver; margin: 1em;">Source : [http://www.nvda-project.org/documentation/developerGuide.html NVDA 2011.3 Developer Guide]</div>
  <UL>
+
 
  <LI><A HREF="#toc3"> 1.1. Remarque à propos de Python </A>
+
== Introduction ==  
  </UL>
 
<LI><A HREF="#toc4"> 2. Greffons logiciels </A>
 
  <UL>
 
  <LI><A HREF="#toc5"> 2.1. Aperçu </A>
 
  <LI><A HREF="#toc6"> 2.2. Types de greffons </A>
 
  <LI><A HREF="#toc7"> 2.3. Les bases d'un module App </A>
 
  <LI><A HREF="#Example1"> 2.4. Exemple 1: Un module App qui génère un Bip lors des événements de changement du Focus </A>
 
  <LI><A HREF="#toc9"> 2.5. Les bases d'un plugin global </A>
 
  <LI><A HREF="#toc10"> 2.6. Exemple 2: un Plugin global qui Fourni un script annonçant la version de NVDA </A>
 
  <LI><A HREF="#toc11"> 2.7. Objets NVDA </A>
 
  <LI><A HREF="#toc12"> 2.8. Scripts et Gesture Bindings </A>
 
  <LI><A HREF="#toc13"> 2.9. Exemple 3: un Plugin global pour trouver la classe de fenètre et le contrôle d'ID </A>
 
  <LI><A HREF="#toc14"> 2.10. Evénements </A>
 
  <LI><A HREF="#toc15"> 2.11. La variable App SleepMode module </A>
 
  <LI><A HREF="#toc16"> 2.12. Exemple 4: Un module App mode veille </A>
 
  <LI><A HREF="#toc17"> 2.13. Fourniture de Classes d'Objets pour personnaliser NVDA </A>
 
  <LI><A HREF="#toc18"> 2.14. Exemple 5: étiquetage du champ d'édition de Notepad à l'aide d'un objet de personnalisation NVDA </A>
 
  </UL>
 
</UL>
 
  
<P></P>
 
<A NAME="toc2"></A>
 
<H2> 1. Introduction </H2>
 
<P>
 
 
Ce guide fournit des informations pour les nouveaux développeurs qui souhaitent développer des composants pour NVDA.  
 
Ce guide fournit des informations pour les nouveaux développeurs qui souhaitent développer des composants pour NVDA.  
 
Notez que ce n'est qu'une introduction. Les développeurs devraient consulter la documentation du code pour avoir une information plus complète.
 
Notez que ce n'est qu'une introduction. Les développeurs devraient consulter la documentation du code pour avoir une information plus complète.
</P>
+
<A NAME="toc3"></A>
+
=== À propos de Python ===
<H3> 1.1. Remarque à propos de Python </H3>
+
 
<P>
 
 
NVDA et ses composants sont principalement écrits en langage de programmation Python.  
 
NVDA et ses composants sont principalement écrits en langage de programmation Python.  
Le but de ce guide n'est pas de vous apprendre Python, bien des exemples sont fournis tout au long de ce guide, ils vous aideront à vous familiariser avec la syntaxe de Python.  
+
Le but de ce guide n'est pas de vous apprendre Python, bien que des exemples soient fournis tout au long de ce guide, qui vous aideront à vous familiariser avec la syntaxe de Python.  
La documentation et d'autres ressources liées au langage Python se trouve sur le site <A HREF="http://www.python.org/">www.python.org/</A>
+
La documentation et d'autres ressources liées au langage Python se trouvent sur le site http://www.python.org/
</P>
+
 
<A NAME="toc4"></A>
+
<div class="toTranslate" style="background-color: #ffb;">
<H2> 2. Greffons logiciels </H2>
+
 
<A NAME="toc5"></A>
+
==Translation==
<H3> 2.1. Aperçu </H3>
+
 
<P>
+
In order to support multiple languages/locales, NVDA must be translated and data specific to the locale must be provided.
Les plugins vous permettent de personnaliser la façon dont se comporte NVDA en général ou dans une application particulière.  
+
 
Ils sont capables de:
+
===Character Descriptions===
</P>
+
 
<UL>
+
Sometimes, it can be very difficult or even impossible to distinguish one character from another. For example, two characters might be pronounced the same way, even though they are actually different characters. To help users when this occurs, character descriptions can be provided which describe the character in a unique way.
<LI> Répondre à des évènements particuliers tels que la prise de focus ou les changements dans les propriétés des objets, par exemple quand un contrôle change de nom.
+
 
<LI> Mettre en oeuvre les commandes qui sont liées a des touches spécifiques ou d'autres entrées.
+
Character descriptions can be provided for a locale in a file named characterDescriptions.dic in the directory for the locale. This is a UTF-8 encoded text file. Blank lines and lines beginning with a "#" character are ignored. All other lines should contain a character, followed by a tab, then one or more descriptions separated by tabs.
<LI> Personnalisez le comportement ou mettre en oevre des fonctionnalités supplémentaires pour des contrôles spécifiques.
+
 
<LI> Personnalisez ou ajouter un nouveau support pour le contenu textuel et les documents complexes.
+
For example:
</UL>
+
 
 +
# This is a comment.
 +
a alpha
 +
b bravo
 +
 
 +
See the file locale\en\characterDescriptions.dic for a full example.
 +
 
 +
===Symbol Pronunciation===
 +
 
 +
It is often useful to hear punctuation and other symbols pronounced as words when reading text, particularly when moving by character. Unfortunately, the pronunciation of symbols is inconsistent between speech synthesisers and many synthesisers do not speak many symbols and/or do not allow control over what symbols are spoken. Therefore, NVDA allows information about symbol pronunciation to be provided.
 +
 
 +
This is done for a locale by providing a file named symbols.dic in the directory for the locale. This is a UTF-8 encoded text file. Blank lines and lines beginning with a "#" character are ignored. All locales implicitly inherit the symbol information for English, though any of this information can be overridden.
 +
 
 +
The file contains two sections.
 +
 
 +
====Defining Complex Symbols====
 +
 
 +
The first section is optional and defines regular expression patterns for complex symbols. Complex symbols are symbols which aren't simply a character or sequence of characters, but instead require a more complicated match. An example is the full stop (.) sentence ending in English. The "." is used for multiple purposes, so a more complicated check is required to determine whether this refers to the end of a sentence.
 +
 
 +
The complex symbols section begins with the line:
 +
 
 +
complexSymbols :
 +
 
 +
Subsequent lines contain a textual identifier used to identify the symbol, a tab and the regular expression pattern for that symbol. For example:
 +
 
 +
. sentence ending (?<=[^\s.])\.(?=[\"')\s]|$)
 +
 
 +
Again, the English symbols are inherited by all other locales, so you need not include any complex symbols already defined for English.
 +
 
 +
====Defining Symbol Information====
 +
 
 +
The second section provides information about when and how to pronounce all symbols. It begins with the line:
 +
 
 +
symbols:
 +
 
 +
Subsequent lines should contain several fields separated by tabs. The only mandatory fields are the identifier and replacement. The default will be used for omitted fields. The fields are as follows:
 +
 
 +
    identifier: The identifier of the symbol. In most cases, this is just the character or characters of the symbol. However, it can also be the identifier of a complex symbol. Certain characters cannot be typed into the file, so the following special sequences can be used:
 +
        \0: null
 +
        \t: tab
 +
        \n: line feed
 +
        \r: carriage return
 +
        \f: form feed
 +
        \#: # character (needed because # at the start of a line denotes a comment)
 +
    replacement: The text which should be spoken for the symbol.
 +
    level: The symbol level at which the symbol should be spoken. The symbol level is configured by the user and specifies the amount of symbols that should be spoken. This field should contain one of the levels "none", "some", "most", "all" or "char", or "-" to use the default. "char" means that the symbol should only be pronounced when moving by character. The default is to inherit the value or "all" if there is nothing to inherit.
 +
    preserve: Whether the symbol itself should be preserved to facilitate correct pronunciation by the synthesiser. For example, symbols which cause pauses or inflection (such as the comma in English) should be preserved. This field should be one of the following:
 +
        never: Never preserve the symbol.
 +
        always: Always preserve the symbol.
 +
        norep: Only preserve the symbol if it is not being replaced; i.e. the user has set symbol level lower than the level of this symbol.
 +
        -: Use the default.
 +
    The default is to inherit the value or "never" if there is nothing to inherit.
 +
 
 +
Finally, a display name for the symbol can be provided in a comment after a tab at the end of the line. This will be shown to users when editing the symbol information and is especially useful for translators to define translated names for English complex symbols.
 +
 
 +
Here are some examples:
 +
 
 +
( left paren most
 +
 
 +
This means that the "(" character should be spoken as "left paren" only when the symbol level is set to most or higher; i.e. most or all.
 +
 
 +
, comma all always
 +
 
 +
This means that the "," character should be spoken as "comma" when the symbol level is set to all and that the character itself should always be preserved so that the synthesiser will pause appropriately.
 +
 
 +
. sentence ending point # . fin de phrase
 +
 
 +
This line appears in the French symbols.dic file. It means that the ". sentence ending" complex symbol should be spoken as "point". Level and preserve are not specified, so they will be taken from English. A display name is provided so that French users will know what the symbol represents.
 +
 
 +
Please see the file locale\en\symbols.dic for the English definitions which are inherited for all locales. This is also a good full example.
 +
</div>
 +
 
 +
==  Greffons logiciels ==
 +
 +
=== Aperçu ===
 +
 
 +
Les greffons vous permettent de personnaliser la façon dont se comporte NVDA en général ou dans une application particulière.  
 +
Ils sont capables de :
 +
* Répondre à des évènements particuliers tels que la prise de focus ou les changements dans les propriétés des objets, par exemple quand un contrôle change de nom.
 +
* Mettre en œuvre les commandes qui sont liées à des touches spécifiques ou d'autres entrées.
 +
* Personnaliser le comportement ou mettre en œuvre des fonctionnalités supplémentaires pour des contrôles spécifiques.
 +
* Personnaliser ou ajouter un nouveau support pour le contenu textuel et les documents complexes.
 +
 
 +
=== Types de greffons ===
  
<P></P>
 
<A NAME="toc6"></A>
 
<H3> 2.2. Types de greffons </H3>
 
<P>
 
 
Il existe deux types de greffons :
 
Il existe deux types de greffons :
</P>
+
 
<UL>
+
* Les Modules App : code spécifique à une application particulière,  
<LI> Les Modules App : code spécifique à une application particulière,  
 
 
le module App reçoit tous les événements d'une application précise, même si ce n'est pas l'application courante.  
 
le module App reçoit tous les événements d'une application précise, même si ce n'est pas l'application courante.  
 
Lorsque l'application est active, toutes les commandes que le module App a associé aux touches ou à une autre entrée peuvent être exécutées par l'utilisateur.
 
Lorsque l'application est active, toutes les commandes que le module App a associé aux touches ou à une autre entrée peuvent être exécutées par l'utilisateur.
<LI> Plugins Globaux : le code Global de NVDA, C'est à dire utilisé dans toutes les applications.  
+
* Plugins Globaux : le code Global de NVDA, C'est à dire utilisé dans toutes les applications.  
Les plugins Globaux contiennent tous les événements liés à tous les contrôles du système d'exploitation.  
+
Les greffons Globaux contiennent tous les événements liés à tous les contrôles du système d'exploitation.  
Toutes les commandes associes à un Plugin global peuvent être exécutées par l'utilisateur, où qu'elles soient dans le système d'exploitation, indépendamment de l'application.
+
Toutes les commandes associées à un Plugin global peuvent être exécutées par l'utilisateur, où qu'elles soient dans le système d'exploitation, indépendamment de l'application.
</UL>
+
 
  
<P></P>
 
<P>
 
 
Si vous souhaitez améliorer l'accès de NVDA à une application donnée, il est plus probable que vous vouliez écrire un module App.  
 
Si vous souhaitez améliorer l'accès de NVDA à une application donnée, il est plus probable que vous vouliez écrire un module App.  
En revanche, si vous souhaitez ajouter des fonctionnalités à NVDA en général (par exemple un script donnant la puissance instantanée du réseau sans fil quelque soit l'application), un greffon global est ce qu'il vous faut.
+
En revanche, si vous souhaitez ajouter des fonctionnalités à NVDA en général (par exemple un script donnant la puissance instantanée du réseau sans fil quelle que soit l'application), un greffon global est ce qu'il vous faut.
</P>
+
 
<P>
+
Modules et Plugins App Globaux se présentent de la même manière.  
Tous deux, modules et Plugins App Globaux se présente de la même manière.  
 
 
Ce sont des fichiers source Python (avec une extension .Py), ils définissent tous deux une classe spéciale contenant tous les événements, les scripts et les bindings, et ils peuvent définir des classes personnalisées pour les accès, le contenu du texte et les documents complexes.  
 
Ce sont des fichiers source Python (avec une extension .Py), ils définissent tous deux une classe spéciale contenant tous les événements, les scripts et les bindings, et ils peuvent définir des classes personnalisées pour les accès, le contenu du texte et les documents complexes.  
 
Cependant, ils diffèrent à certains égards.
 
Cependant, ils diffèrent à certains égards.
</P>
+
 
<P>
+
Les quelques sections suivantes traitent séparément les modules App et les greffons globaux.  
Les quelque sections suivantes traitent séparément les modules App et les greffons globaux.  
 
 
Après cela, la discussion est à nouveau plus générale.
 
Après cela, la discussion est à nouveau plus générale.
</P>
+
 
<A NAME="toc7"></A>
+
=== Les bases d'un module App ===
<H3> 2.3. Les bases d'un module App </H3>
+
 
<P>
+
Les fichiers des modules App ont l'extension '''.Py''', et portent le même nom que l'exécutable principal de l'application pour laquelle vous souhaitez les utiliser.  
Les fichiers des modules App ont l'extension. .Py, et portent le même nom que l'exécutable principal de l'application pour laquelle vous souhaitez les utiliser.  
+
Par exemple, un module d'application pour Notepad seraient appelés ''notepad.py'', puisque l'exécutable principal de Notepad est appelé ''notepad.exe''.
Par exemple, un module d'application pour Notepad seraient appelés notepad.py, puisque l'exécutable principal de Notepad est appelé notepad.exe.
+
 
</P>
+
Les fichiers du module App doivent être placés dans le sous-répertoire appModules du répertoire configuration de NVDA de l'utilisateur.  
<P>
+
Pour plus d'informations sur la localisation du répertoire de configuration de l'utilisateur, consultez, s'il-vous-plaît, le guide utilisateur de NVDA.
Les fichiers du module App doivent être placés dans le sous-répertoire appModules du répertoire configuration de l'utilisateur du NVDA de l'utilisateur.  
+
 
Pour plus d'informations sur la localisation du répertoire de configuration de l'utilisateur, consulter, s'il vous plaît, le guide utilisateur de NVDA.
 
</P>
 
<P>
 
 
Les Modules App doivent définir une classe appelée AppModule, qui hérite de appModuleHandler.AppModule.  
 
Les Modules App doivent définir une classe appelée AppModule, qui hérite de appModuleHandler.AppModule.  
Cette classe peut alors définir des événements et des méthodes pour les scripts, des gesture bindings et d'autres codes.  
+
Cette classe peut alors définir des événements et des méthodes pour les scripts, des ''gesture bindings'' et d'autres codes.  
 
Tout cela sera abordé en profondeur plus tard.
 
Tout cela sera abordé en profondeur plus tard.
</P>
+
 
<P>
 
 
NVDA charge un module App pour une application dès qu'il détecte que l'application est exécutée.  
 
NVDA charge un module App pour une application dès qu'il détecte que l'application est exécutée.  
 
Le module App est déchargé une fois l'application fermée ou lorsqu'on quitte NVDA.
 
Le module App est déchargé une fois l'application fermée ou lorsqu'on quitte NVDA.
</P>
+
 
<A NAME="Example1"></A>
+
=== Exemple 1: Un module App qui génère un Bip lors des événements de changement du Focus ===
<H3> 2.4. Exemple 1: Un module App qui génère un Bip lors des événements de changement du Focus </H3>
+
 
<P>
 
 
L'exemple suivant de module App, fait biper NVDA chaque fois que le focus change dans l'application Notepad.  
 
L'exemple suivant de module App, fait biper NVDA chaque fois que le focus change dans l'application Notepad.  
 
Cet exemple vous montre le schéma de base d'un module app.
 
Cet exemple vous montre le schéma de base d'un module app.
</P>
+
 
<P>
+
Dans un nouveau fichier texte appelé ''notepad.py'', qui doit être sauvegardé dans le répertoire AppModules, copiez et collez le code entre les marqueurs de début et de fin, sans les inclure.  
Dans un nouveau fichier texte appelé notepad.py, qui doit être sauvegardé dans le répertoire AppModules, copiez et collez le code entre les marqueurs de début et de fin, sans les inclure.  
+
Faites très attention de garder toutes les tabulations et les espaces intactes.
Faite très attention de garder tous les tabulations et les espaces intacts.
+
 
</P>
+
Une fois enregistré à l'emplacement correct, vous pouvez redémarrer NVDA ou choisir de recharger les greffons. Vous trouverez ceci dans le sous-menu ''Outils'' du menu NVDA.
<P>
+
 
Une fois enregistré à l'emplacement correct, vous pouvez redémarrer NVDA ou choisir de Recharger les Plugins. Vous trouverez ceci dans le sous-menu Outils du menu NVDA.
+
Pour finir, ouvrez le bloc-notes et placer le focus dans l'application. Par exemple, déplacer-vous le long de la barre de menu, ouvrez certaines boîtes de dialogue, etc.  
</P>
 
<P>
 
Pour finir, ouvrez le Bloc-notes et déplacer le focus dans l'application. Par exemple déplacer-vous le long de la barre de menu, ouvrez certaines boîtes de dialogue, etc.  
 
 
Vous devriez entendre des bips chaque fois que le focus change.  
 
Vous devriez entendre des bips chaque fois que le focus change.  
Notez cependant que si vous vous déplacez en dehors de Notepad - par exemple, dans l'Explorateur Windows - vous ne devriez pas entendre de bips.
+
Notez cependant que si vous vous déplacez en dehors de Notepad par exemple, dans l'Explorateur Windows vous ne devriez pas entendre de bips.
</P>
+
 
<PRE>
+
<pre>
 
--- start ---
 
--- start ---
 
# Notepad App Module for NVDA
 
# Notepad App Module for NVDA
Ligne 147 : Ligne 176 :
  
 
--- end ---
 
--- end ---
</PRE>
+
</pre>
<P></P>
+
 
<P>
+
 
Le fichier de Ce Module App commence par deux lignes de commentaires, qui décrivent à quoi le fichier est destiné.
+
Le fichier de ce Module App commence par deux lignes de commentaires, qui décrivent à quoi le fichier est destiné.
</P>
+
 
<P>
 
 
Il importe alors le module appModuleHandler, de sorte que le module App a alors accès à la classe AppModule base.
 
Il importe alors le module appModuleHandler, de sorte que le module App a alors accès à la classe AppModule base.
</P>
+
 
<P>
 
 
Ensuite, il définit une classe appelée AppModule, qui est héritée de appModuleHandler.AppModule.
 
Ensuite, il définit une classe appelée AppModule, qui est héritée de appModuleHandler.AppModule.
</P>
+
 
<P>
+
À l'intérieur de cette classe, il définit un ou plusieurs événements, des scripts ou des ''gesture bindings''.  
A l'intérieur de cette classe, il définit un ou plusieurs événements, des scripts ou des gesture bindings.  
+
Dans cet exemple, il définit une méthode pour l’événement recevoir le focus (event_gainFocus), qui émet un bip court à chaque fois qu'il est exécuté.  
Dans cet exemple, il définit une méthode pour l'évènement recevoir le Focus (event_gainFocus), qui émet un bip court à chaque fois qu'il est exécuté.  
+
La mise en œuvre de cet événement n'est pas ce qui importe pour cet exemple ; la partie la plus importante est la classe elle-même.  
La mise en oevre de cet évènement n'est pas ce qui importe pour cet exemple ;  
+
Les événements seront traités plus en détail ultérieurement.
la partie la plus importante est la classe elle-même.  
+
 
Les événements seront traîtés plus en détail ultérieurement.
+
De la même façon que pour d'autres exemples de ce guide, n'oubliez pas de supprimer le module Application créé lorsque vous avez terminé les essais ; puis redémarrez NVDA ou bien recharger les greffons, afin que la fonctionnalité d'origine soit restaurée.
</P>
+
 
<P>
+
=== Les bases d'un greffon global ===
De la même façon que pour d'autres exemples de ce guide, n'oubliez pas de supprimer le module Application créé lorsque vous avez terminé les essais ; puis redémarrez NVDA ou bien recharger les plugins, afin que la fonctionnalité d'origine soit restaurée.
+
 
</P>
+
Les fichiers de greffons globaux ont une extension '''.Py''', et devraient avoir un nom court et unique identifiant ce qu'ils font.
<A NAME="toc9"></A>
+
 
<H3> 2.5. Les bases d'un plugin global </H3>
+
Les fichiers de greffons globaux doivent être placés dans le sous-répertoire globalPlugins du répertoire configuration de NVDA de l'utilisateur.  
<P>
+
Pour plus d'informations sur la localisation du répertoire de configuration de l'utilisateur, consultez, s'il-vous-plaît, le guide utilisateur de NVDA.
Les fichiers de Plugin globaux ont une extension .Py, et devrait avoir un nom court et unique identifiant ce qu'ils font.
+
 
</P>
+
Les greffons globaux doivent définir une classe appelée GlobalPlugin, qui hérite de globalPluginHandler.GlobalPlugin.  
<P>
+
Cette classe peut alors définir des événements et des méthodes de script, des ''gesture bindings'' et d'autres codes.  
Les Fichiers de Plugin globaux doivent être placés dans le sous-répertoire globalPlugins du répertoire configuration de l'utilisateur du NVDA de l'utilisateur.  
 
Pour plus d'informations sur la localisation du répertoire de configuration de l'utilisateur, consulter, s'il vous plaît, le guide utilisateur de NVDA.
 
</P>
 
<P>
 
Les plugins globaux doivent définir une classe appelée GlobalPlugin, qui hérite de globalPluginHandler.GlobalPlugin.  
 
Cette classe peut alors définir des évènements et des méthodes de script, des gesture bindings et d'autres codes.  
 
 
Tout cela sera abordé plus précisément par la suite.
 
Tout cela sera abordé plus précisément par la suite.
</P>
+
 
<P>
+
NVDA charge tous les greffons globaux au démarrage, et les décharge à la fermeture.
NVDA charge tous les plugins globaux au démarrage, et les décharge à la fermeture.
+
 
</P>
+
=== Exemple 2: un Plugin global qui Fourni un script annonçant la version de NVDA ===
<A NAME="toc10"></A>
+
 
<H3> 2.6. Exemple 2: un Plugin global qui Fourni un script annonçant la version de NVDA </H3>
+
L'exemple suivant de greffon global vous permet d'appuyer sur <code>NVDA + Maj + V</code> depuis n'importe où dans le système d'exploitation pour connaître la version de NVDA.  
<P>
 
L'exemple suivant de Plugin global vous permet d'appuyer sur NVDA + Maj + V depuis n'importe où dans le système d'exploitation pour connaitre la version de NVDA.  
 
 
Cet exemple est seulement là pour vous montrer la structure de base d'un greffon global.
 
Cet exemple est seulement là pour vous montrer la structure de base d'un greffon global.
</P>
+
 
<P>
+
Dans un nouveau fichier texte nommé ''example2.py'', qui doit être sauvegardé dans le répertoire globalPlugins, copiez et collez le code entre les marqueurs de début et de fin, sans les inclure. Faites très attention de garder toutes les tabulations et les espaces intactes.
Dans un nouveau fichier texte nommé example2.py, qui doit être sauvegardé dans le répertoire globalPlugins, copiez et collez le code entre les marqueurs de début et de fin, sans les inclure.  
+
 
Faite très attention de garder tout les tabulations et les espaces intacts.
+
Une fois enregistré à l'emplacement correct, vous pouvez redémarrer NVDA ou choisir de recharger les greffons. Vous trouverez ceci dans le sous-menu ''Outils'' du menu NVDA.
</P>
+
 
<P>
+
Vous pouvez maintenant, de n'importe où, appuyer sur les touches <code>NVDA + Maj + V</code> pour entendre ou lire en braille la version de NVDA.
Une fois enregistré à l'emplacement correct, vous pouvez redémarrer NVDA ou choisir de Recharger les Plugins. Vous trouverez ceci dans le sous-menu Outils du menu NVDA.
+
 
</P>
+
<pre>
<P>
 
Vous pouvez maintenant, de n'importe où, appuyer sur les touches NVDA + Maj + V pour entendre ou lire en braille la version de NVDA.
 
</P>
 
<PRE>
 
 
--- start ---
 
--- start ---
# Version announcement plugin for NVDA
+
# Version announcement greffon for NVDA
 
# Developer guide example 2
 
# Developer guide example 2
  
Ligne 220 : Ligne 235 :
  
 
--- end ---
 
--- end ---
</PRE>
+
</pre>
<P></P>
+
 
<P>
+
Le fichier de ce greffon global commence par deux lignes de commentaires, qui décrivent à quoi ce fichier doit servir.
Le fichier de ce Plugin global commence par deux lignes de commentaires, qui décrivent à quoi ce fichier doit servir.
+
 
</P>
+
Il importe alors le module globalPluginHandler, afin que le greffon global ait accès à la classe GlobalPlugin de base.
<P>
+
 
Il importe alors le module globalPluginHandler, afin que le plugin global ai accès à la classe GlobalPlugin de base.
+
Il importe également quelques autres modules, à savoir UI et VERSIONINFO, dont un de ces greffons spécifiques est nécessaire pour effectuer l'ensemble des actions requises afin d'annoncer la version.
</P>
+
 
<P>
 
Il importe également quelques autres modules, à savoir ui et VERSIONINFO, dont un de ses plugins spécifiques est nécessaire pour effectuer l'ensemble des actions requises afin d'annoncer la version.
 
</P>
 
<P>
 
 
Puis il définit une classe appelée GlobalPlugin, qui est héritée de globalPluginHandler.GlobalPlugin.
 
Puis il définit une classe appelée GlobalPlugin, qui est héritée de globalPluginHandler.GlobalPlugin.
</P>
+
 
<P>
+
x À l'intérieur de cette classe, il définit un ou plusieurs événements, des scripts ou des ''gesture bindings''.  
x A l'intérieur de cette classe, il définit un ou plusieurs événements, des scripts ou des gesture bindings.  
+
Dans cet exemple, il définit une méthode de script qui effectue l'annonce de version, et lie <code>NVDA + Maj + V</code> à ce script.  
Dans cet exemple, il définit une méthode de script qui effectue l'annonce de version, et lie NVDA + Maj + V a ce script.  
+
Toutefois, les détails du script et de son affectation importent peu dans cet exemple. La partie la plus importante est la classe elle-même.
Toutefois, les détails du script et de son affectation importent peut dans cet exemple.  
+
 
La partie la plus importante est la classe elle-même.
+
De la même façon que pour d'autres exemples de ce guide, quand vous aurez terminé les essais n'oubliez pas de supprimer le greffon global que vous avez créé ; puis redémarrez NVDA ou bien recharger les greffons, afin que la fonctionnalité d'origine soit restaurée.
</P>
+
 
<P>
+
=== Objets NVDA ===
De la même façon que pour d'autres exemples de ce guide, quand vous aurez terminé les essais n'oubliez pas de supprimer le plugin global que vous avez créé ; puis redémarrez NVDA ou bien recharger les plugins, afin que la fonctionnalité d'origine soit restaurée.
+
 
</P>
 
<A NAME="toc11"></A>
 
<H3> 2.7. Objets NVDA </H3>
 
<P>
 
 
NVDA représente les contrôles et d'autres éléments d'interface graphique sous forme d'objets NVDA.  
 
NVDA représente les contrôles et d'autres éléments d'interface graphique sous forme d'objets NVDA.  
Ces objets contiennent des propriétés NVDA standardisées, comme le nom, le rôle, la valeur, les Etats et la description, ce qui permet à d'autres parties de NVDA de demander ou d'afficher des informations à propos d'un contrôle d'une manière générale.  
+
Ces objets contiennent des propriétés NVDA standardisées, comme le nom, le rôle, la valeur, les états et la description, ce qui permet à d'autres parties de NVDA de demander ou d'afficher des informations à propos d'un contrôle d'une manière générale.  
Par exemple, le bouton OK d'une boîte de dialogue serait représenté par un objet NVDA avec un nom "OK" et un rôle de bouton.  
+
Par exemple, le bouton ''OK'' d'une boîte de dialogue serait représenté par un objet NVDA avec un nom « OK » et un rôle de bouton.  
De même, une case à cocher avec une étiquette J'accepte aurait le nom J'accepte, un rôle de case à cocher et si elle est cochée, un état coché.
+
De même, une case à cocher avec une étiquette ''J'accepte'' aurait le nom « J'accepte », un rôle de case à cocher et si elle est cochée, un état coché.
</P>
+
 
<P>
+
Comme il existe de nombreux toolkits graphiques, de plateformes et API d'accessibilités, les objets NVDA font abstraction de ces différences dans un formulaire standard, utilisable par NVDA, indépendamment du tooltip ou de l'API avec lequel le contrôle est effectué.
Comme il y a beaucoup de différents Toolkits GUI, plateformes et API d'accessibilités, les objets NVDA font abstraction de ces différences dans un formulaire standard, utilisable par NVDA, indépendamment du tooltip ou de l'API avec lequel le contrôle est effectué.
+
Par exemple, le bouton ''Ok'', dont nous venons de discuter, pourrait être un widget dans une application Java, un objet MSAA, un objet ou un élément IAccessible2 UI Automation.
Par exemple, le bouton Ok, dont nous venons de discuter, pourrait être un widget dans une application Java, un objet MSAA, un objet ou un élément IAccessible2 UI Automation.
+
 
</P>
+
Les objets NVDA ont de nombreuses propriétés, parmi les plus utiles on a :
<P>
+
* name (nom) : l'étiquette du contrôle.
Les objets NVDA ont de nombreuses propriétés,  
+
* rôle (rôle) : l'une des constantes ROLE_* du module controlTypes de NVDA.
parmi les plus utiles on a :
 
</P>
 
<UL>
 
<LI> name (nom): l'étiquette du contrôle.
 
<LI> rôle (rôle): l'une des constantes ROLE_* du module controlTypes de NVDA.
 
 
Button, dialog, editableText, window et checkbox sont des exemples de rôles.
 
Button, dialog, editableText, window et checkbox sont des exemples de rôles.
<LI> states (Etats): une série de 0 ou plusieurs des constantes STATE_* à du module NVDA controlTypes.  
+
* states (états): une série de 0 ou plusieurs des constantes STATE_* à du module NVDA controlTypes.  
 
Focusable, focused, selected, selectable, expanded, collapsed et checked sont quelques exemples d'états.
 
Focusable, focused, selected, selectable, expanded, collapsed et checked sont quelques exemples d'états.
<LI> value (valeur): la valeur du contrôle ; par exemple le pourcentage d'une barre de défilement ou l'item sélectionné pour une liste déroulante.
+
* value (valeur) : la valeur du contrôle ; par exemple le pourcentage d'une barre de défilement ou l'item sélectionné pour une liste déroulante.
<LI> description (Description): une phrase ou deux décrivant ce que le contrôle fait (en générale identique à son info-bulle).
+
* description (Description) : une phrase ou deux décrivant ce que le contrôle fait (en générale identique à son info-bulle).
<LI> location (Emplacement): la position de l'objet en coordonnées écran (gauche, en haut, la largeur et la hauteur).
+
* location (Emplacement): la position de l'objet en coordonnées écran (gauche, en haut, la largeur et la hauteur).
<LI> parent (parent): l'objet parent de cet objet.  
+
* parent (parent) : l'objet parent de cet objet.  
 
Par exemple, le parent de l'objet élément de liste serait la liste qui le contient.
 
Par exemple, le parent de l'objet élément de liste serait la liste qui le contient.
<LI> next (suivant): l'objet juste après celui-ci au même niveau d'un ordre logique.  
+
* next (suivant) : l'objet juste après celui-ci au même niveau d'un ordre logique.  
 
Par exemple, l'objet le plus susceptible de suivre un objet item du menu NVDA est un autre item du même menu.
 
Par exemple, l'objet le plus susceptible de suivre un objet item du menu NVDA est un autre item du même menu.
<LI> previous (précédent): comme next, mais dans l'ordre inverse.
+
* previous (précédent) : comme ''next'', mais dans l'ordre inverse.
<LI> firstChild (premier enfant): l'objet premier enfant direct de cet objet.  
+
* firstChild (premier enfant) : l'objet premier enfant direct de cet objet.  
 
Par exemple, le premier enfant d'une liste serait le premier élément de la liste.
 
Par exemple, le premier enfant d'une liste serait le premier élément de la liste.
<LI> lastChild (dernier enfant): le dernier enfant direct de cet objet.
+
* lastChild (dernier enfant) : le dernier enfant direct de cet objet.
<UL>
+
* children (enfants): une liste de tous les enfants directs de cet objet ; par exemple tous les items du menu dans un menu.
<LI> children (enfants): une liste de tous les enfents dirrects de cet objet; par exemple tous les items du menu dans un menu. -
+
 
<P></P>
 
 
Il y a aussi quelques propriétés de navigation simplifiée tels que simpleParent, simpleNext, simpleFirstChild et simpleLastChild.  
 
Il y a aussi quelques propriétés de navigation simplifiée tels que simpleParent, simpleNext, simpleFirstChild et simpleLastChild.  
Ce sont respectivement les mêmes propriétés de navigation que celle décrites ci-dessus, mais NVDA filtre les objets inutiles.  
+
Ce sont respectivement les mêmes propriétés de navigation que celles décrites ci-dessus, mais NVDA filtre les objets inutiles.  
Ces propriétés sont utilisées lorsque NVDA est en mode navigation simplifié, ce qui est le mode par défaut.  
+
Ces propriétés sont utilisées lorsque NVDA est en mode navigation simplifiée, ce qui est le mode par défaut.  
Ces propriétés simples peuvent être plus faciles à utiliser, mais les propriétés de navigation réelle reflètent mieux la structure sous-jacente du system d'exploitation.
+
Ces propriétés simples peuvent être plus faciles à utiliser, mais les propriétés de navigation réelles reflètent mieux la structure sous-jacente du système d'exploitation.
<P></P>
 
Lors du développement des plugins, généralement, il n'est pas important que le toolkit ou l'API rétrodiffuse un objet NVDA, puisque le plugin va la plus pare du temps n'accéder qu'aux propriétés standard, telles que le nom, le rôle et la valeur.
 
Cependant, comme les plugins deviennent plus avancés, il est certainement possible de creuser davantage sur les Objets NVDA pour trouver des informations sur les boîte à outils ou API spécifiques si nécessaire.
 
  
When developing plugins, most of the time, it is not important what toolkit or API backs an NVDA Object, as the plugin will usually only access standard properties such as name, role and value.  
+
Lors du développement de greffons, généralement, le toolkit ou l'API qui renvoie un objet NVDA importe peu, puisque le greffon va, la plupart du temps, n’accéder qu'aux propriétés standards, telles que le nom, le rôle et la valeur.  
However, as plugins become more advanced, it is certainly possible to delve deeper into NVDA Objects to find out toolkit or API specific information if required.  
+
Cependant, pour les greffons plus avancés, il est certainement possible de creuser davantage sur les objets NVDA pour trouver des informations sur les boîtes à outils ou API spécifiques si nécessaire.
<P></P>
+
 
Les Plugins utilisent des objets NVDA pour trois raisons précises:
+
Les greffons utilisent des objets NVDA pour trois raisons précises :
</UL>
+
 
<LI> La plupart des événements que les plugins reçoivent prennent en argument l'objet NVDA sur lequel l'événement s'est produit.
+
* La plupart des événements que les greffons reçoivent prennent en argument l'objet NVDA sur lequel l'événement s'est produit.
Par exemple, event_gainFocus prend l'objet NVDA qui représente le gain du focus par le contrôle.
+
Par exemple, event_gainFocus prend l'objet NVDA qui représente le contrôle recevant le focus.
<LI> Les scripts, les événements ou d'autres codes peuvent aller chercher des objets d'intérêt tels que les objets NVDA en focus, les objets de navigation courante de NVDA, ou peut-être l'objet NVDA du bureau.  
+
* Les scripts, les événements ou d'autres codes peuvent aller chercher des objets d'intérêt tels que les objets NVDA en focus, les objets de navigation courante de NVDA, ou peut-être l'objet NVDA du bureau.  
Le code peut alors récupérer des informations de cet objet ou peut-être même d'un objet liés à celui-ci (par exemple, son parent, le premier enfant, etc.)
+
Le code peut alors récupérer des informations de cet objet ou peut-être même d'un objet lié à celui-ci (par exemple, son parent, le premier enfant, etc.).
<LI> le plugin peut définir ses propres classes d'objets NVDA, elles seront utilisées pour contenir un contrôle spécifique afin de lui donner des fonctionnalités supplémentaires, muter ses propriétés, etc.
+
* Le greffon peut définir ses propres classes d'objets NVDA, elles seront utilisées pour contenir un contrôle spécifique afin de lui donner des fonctionnalités supplémentaires, muter ses propriétés, etc.
</UL>
+
 
 +
Tout comme les modules et greffons App globaux, les objets NVDA peuvent également définir des événements, des scripts et des ''gesture bindings''.
 +
 
 +
=== Scripts et Gesture Bindings ===
 +
 
 +
Les Modules App, les Plugins globaux et les Objets NVDA peuvent définir des méthodes spéciales qui peuvent être liées à un raccourci spécifique, ainsi, une touche NVDA se réfère à ces méthodes de scripts.
  
<P></P>
 
<P>
 
Tout comme les modules et plugins App globaux, les Objets NVDA peuvent également définir des événements, des scripts et des gesture bindings.
 
</P>
 
<A NAME="toc12"></A>
 
<H3> 2.8. Scripts et Gesture Bindings </H3>
 
<P>
 
Les Modules App, les Plugins globaux et les Objets NVDA peuvent définir des méthodes spéciales qui peuvent être liés à un raccourci spécifique,
 
ainsi, une touche NVDA se réfère à ces méthodes de scripts.
 
</P>
 
<P>
 
 
Un script est une méthode standard d'instance de Python possédant un nom commençant par "script_", par exemple "script_sayDateTime".
 
Un script est une méthode standard d'instance de Python possédant un nom commençant par "script_", par exemple "script_sayDateTime".
</P>
 
<P>
 
Une méthode de script prend deux arguments:
 
</P>
 
<UL>
 
<LI> self (auto): une référence au module App, au plugin global ou a une instance de l'objet NVDA du script qui a été appelé.
 
<LI> gesture: un objet Input Gesture, qui représente l'entrée qui a déclenche le script à exécuter.
 
</UL>
 
  
<P></P>
+
Une méthode de script prend deux arguments :
<P>
+
* self (auto) : une référence au module App, au greffon global ou a une instance de l'objet NVDA du script qui a été appelé.
De même que la méthode de script, une certaine forme de gesture binding doit être définie, de sorte que NVDA sait quelle entrée doit exécuter le script.
+
* gesture : un objet ''Input Gesture'', qui représente l'entrée qui a déclenché le script à exécuter.
</P>
+
 
<P>
+
De même que la méthode de script, une certaine forme de ''gesture binding'' doit être définie, de sorte que NVDA sait quelle entrée doit exécuter le script.
Pour affecter la gesture à un script, un dictionnaire Python spécial "__gestures" peut être défini comme une variable de classe dans le module App, le Plugin global ou l'objet NVDA.  
+
 
Ces dictionnaires doivent contenir des chaînes d'identification de gesture pointant vers le nom du script demandé, sans le préfixe
+
Pour affecter la ''gesture'' à un script, un dictionnaire Python spécial "__gestures" peut être défini comme une variable de classe dans le module App, le greffon global ou l'objet NVDA.  
</P>
+
Ces dictionnaires doivent contenir des chaînes d'identification de ''gesture'' pointant vers le nom du script demandé, sans le préfixe
<P>
+
 
Il ya des manières plus avancées de faire des gestures binding dans un mode plus dynamique, même si le dictionnaire __gestures est le plus simple.
+
Il y a des manières plus avancées de faire des ''gestures binding'' dans un mode plus dynamique, même si le dictionnaire __gestures est le plus simple.
</P>
+
 
<P>
+
Une chaîne d'identification de ''gesture'' est une chaîne simple représentant un raccourci.  
Une chaîne d'identification de gesture est une chaîne simple représentant un raccourci.  
+
Il se compose d'un code de deux lettres correspondant à la source d'entrée, une partie facultative entre parenthèses, deux points (:) et un ou plusieurs noms séparés par un signe plus (+) désignant des touches réelles ou valeurs d'entrée.
Il se compose d'un code de deux lettres en format caractères donnant la source de l'entrée, une partie facultative entre parenthèses, deux points (:) et un ou plusieurs noms séparés par un signe plus (+) désignant des touches réelles ou valeurs d'entrée.
+
 
</P>
+
Quelques exemples de chaînes d'identification de ''gesture'' sont :
<P>
+
* "kb:NVDA+shift+v" ;
Quelques exemples de chaînes d'identification de gesture sont:
+
* "br(freedomScientific):leftWizWheelUp" ;
</P>
+
* "kb(laptop):NVDA+t".
<UL>
+
 
<LI> "kb:NVDA+shift+v"
+
Actuellement, les seules sources d'entrée de NVDA sont :
<LI> "br(freedomScientific):leftWizWheelUp"
+
* kb: keyboard input (saisie au clavier) ;
<LI> "kb(laptop):NVDA+t"
+
* br: braille input (entrée braille).
</UL>
+
 
 +
Quand NVDA reçoit une entrée, il cherche les ''gestures bindings'' correspondantes dans un ordre précis.
 +
Une fois qu'une ''gesture binding'' est trouvée, le script est exécuté et aucune des ''bindings'' supplémentaires ne sont utilisées, Nore est ''gesture'' particulière transmise automatiquement au système d'exploitation.
 +
(nore is that particular gesture passed on automatically to the Operating System.)
 +
 
 +
L'ordre de recherche des ''gestures bindings'' est le suivant :
 +
* les greffons globaux chargés ;
 +
* les Module App de l'application active ;
 +
* l'arborescence d'interception de l'objet NVDA sous le focus le cas échéant, par exemple un virtualBuffer ;
 +
* l'objet NVDA sous le focus ;
 +
* les commandes globales (intégrées dans les commandes comme quitter NVDA, les commandes d'objets de navigation, etc.).
 +
 
 +
=== Exemple 3: un Plugin global pour trouver la classe de fenêtre et le contrôle d'ID ===
 +
 
 +
Le greffon global ci-dessous, vous permet d'annoncer la classe de fenêtre du focus actuel en appuyant sur touche NVDA + flèche gauche et l'ID du contrôle sous le focus dans la fenêtre avec touche NVDA + flèche droite.
 +
Cet exemple vous montre comment définir un ou plusieurs scripts avec ''gesture bindings'' dans une classe comme un module App, un greffon global ou un objet NVDA.
  
<P></P>
+
Dans un nouveau fichier texte nommé '''example3.py''', qui doit être sauvegardé dans le répertoire globalPlugins, copiez et collez le code entre les marqueurs de début et de fin, sans les inclure.
<P>
+
Faites très attention de garder toutes les tabulations et les espaces intactes.
Actuellement, les seules sources des entrées de NVDA sont:
 
</P>
 
<UL>
 
<LI> kb: keyboard input (saisie au clavier)
 
<LI> br: braille input (entrée braille)
 
</UL>
 
  
<P></P>
+
Une fois enregistré à l'emplacement correct, vous pouvez redémarrer NVDA ou choisir de recharger les greffons. Vous trouverez ceci dans le sous-menu ''Outils'' du menu NVDA.
<P>
 
Quand NVDA reçoit une entrée, il cherche les gestures bindings correspondantes dans un ordre précis.
 
Une fois qu'une gesture binding est trouvée, le script est exécuté et aucune des bindings supplémentaires ne sont utilisées, Nore c'est que certain gesture sont transmis automatiquement au système d'exploitation.
 
</P>
 
<P>
 
L'ordre de recherche des gestures bindings est:
 
</P>
 
<UL>
 
<LI> les plugins globaux Chargés
 
<LI> les Module App de l'application active
 
<LI> l'arborescence d'interception de l'objet NVDA sous le focus si cas échéant, par exemple un virtualBuffer
 
<LI> l'Objet NVDA sous le focus
 
<LI> Commandes globales (intégrées dans les commandes comme quitter NVDA, les commandes d'objets de navigation, etc.)
 
</UL>
 
  
<P></P>
+
<pre>
<A NAME="toc13"></A>
 
<H3> 2.9. Exemple 3: un Plugin global pour trouver la classe de fenêtre et le contrôle d'ID </H3>
 
<P>
 
Le plugin global ci-dessous, vous permet d'annoncer la window classe du focus actuelle en appuyant sur touche NVDA + Flèche gauche et l'ID du contrôle sous le focus dans la fenêtre avec touche NVDA + flèche droite.
 
Cet exemple vous montre comment définir un ou plusieurs scripts avec gesture bindings dans une classe comme un module App, un plugin global ou un objet NVDA.
 
</P>
 
<P>
 
Dans un nouveau fichier texte nommé example3.py, qui doit être sauvegardé dans le répertoire globalPlugins, copiez et collez le code entre les marqueurs de début et de fin, sans les inclure.
 
Faite très attention de garder tout les tabulations et les espaces intacts.
 
</P>
 
<P>
 
Une fois enregistré à l'emplacement correct, vous pouvez redémarrer NVDA ou choisir de Recharger les Plugins. Vous trouverez ceci dans le sous-menu Outils du menu NVDA.
 
</P>
 
<PRE>
 
 
--- start ---
 
--- start ---
 
#Window utility scripts for NVDA
 
#Window utility scripts for NVDA
Ligne 412 : Ligne 377 :
  
 
--- end ---
 
--- end ---
</PRE>
+
</pre>
<P></P>
+
 
<A NAME="toc14"></A>
+
=== Événements ===
<H3> 2.10. Evènements </H3>
+
 
<P>
+
Quand NVDA détecte des toolkits particuliers, l'API ou les événements du système d'exploitation, '''it abstracts these''' et appelle ses propres événements internes sur les greffons et les objets NVDA.
Quand NVDA détecte des toolkit particulier, l'API ou les événements du système d'exploitation, à it abstracts these and fires its own internal events on plugins and NVDA Objects.
+
 
</P>
 
<P>
 
 
Bien que la plupart des événements soient liés à un objet NVDA spécifique (par exemple changement de nom, gain du focus, changement d'état, etc.), ces événements peuvent être traités à différents niveaux.  
 
Bien que la plupart des événements soient liés à un objet NVDA spécifique (par exemple changement de nom, gain du focus, changement d'état, etc.), ces événements peuvent être traités à différents niveaux.  
 
Quand un événement est géré, il est empêché d'aller plus loin dans la chaîne.  
 
Quand un événement est géré, il est empêché d'aller plus loin dans la chaîne.  
 
Toutefois, le code dans l'événement peut choisir de se propager davantage si nécessaire.
 
Toutefois, le code dans l'événement peut choisir de se propager davantage si nécessaire.
</P>
 
<P>
 
L'ordre des niveaux par lequel passe l'événement jusqu'à ce qu'une méthode d'événement soit trouvée est:
 
</P>
 
<UL>
 
<LI> les plugins globaux Chargés
 
<LI> les Module App associés à l'objet NVDA dont l'événement est actif
 
The App Module associated with the NVDA Object on which the event was fired
 
<LI> l'arborescence d'interception de l'objet NVDA dont l'évènement est actif si cas échéant
 
The Tree Interceptor (if any) associated with the NVDAObject on which the event was fired
 
<LI> l'Objet NVDA lui-même.
 
</UL>
 
  
<P></P>
+
L'ordre des niveaux par lequel passe l'événement jusqu'à ce qu'une méthode d'événement soit trouvée est le suivant :
<P>
+
* les greffons globaux chargés ;
Les événements sont des méthodes d'instance Python, possédant un nom commençant par "event_" suivie par le nom de l'événement (par exemple gainFocus).
+
* les modules App associés à l'objet NVDA pour lesquels l'événement a été appelé ;
</P>
+
* l'arborescence d'interception (s'il existe) de l'objet NVDA pour lequel l'événement a été appelé ;
<P>
+
* l'objet NVDA lui-même.
 +
 
 +
Les événements sont des méthodes d'instance Python, possédant un nom commençant par "event_" suivi par le nom de l'événement (par exemple gainFocus).
 +
 
 
Ces méthodes d'événement prennent des arguments légèrement différents selon le niveau auquel ils sont définis.
 
Ces méthodes d'événement prennent des arguments légèrement différents selon le niveau auquel ils sont définis.
</P>
+
 
<P>
+
Si un événement d'un objet NVDA est défini pour lui-même, la méthode prend un seul argument obligatoire, le ''self'' argument : à savoir l'instance d'objet NVDA).  
Si un événement d'un objet NVDA est défini pour lui-même, la méthode prend un seul argument obligatoire, le 'self' argument: à savoir l'instance d'objet NVDA).  
 
 
Certains événements peuvent prendre des arguments supplémentaires, mais cela est assez rare.
 
Certains événements peuvent prendre des arguments supplémentaires, mais cela est assez rare.
</P>
 
<P>
 
Si un événement d'un objet NVDA est définie sur un greffon global, un module App ou l'arborescence d'interception, l'événement prend les arguments suivants:
 
</P>
 
<UL>
 
<LI> self (auto): l'instance du plug-in Global, du Module App ou de l'arborescence d'interception
 
<LI> obj (objet): objet NVDA sur lequel l'événement a été appelé
 
<LI> nextHandler: une fonction qui sera appelé lorsque l'événement se propage loin dans la chaîne.
 
</UL>
 
  
<P></P>
+
Si un événement d'un objet NVDA est défini sur un greffon global, un module App ou l'arborescence d'interception, l'événement prend les arguments suivants :
<P>
+
* self (auto): l'instance du greffon global, du Module App ou de l'arborescence d'interception ;
Certains événements communs aux objets NVDA sont:
+
* obj (objet): objet NVDA sur lequel l'événement a été appelé ;
</P>
+
* nextHandler: une fonction qui propagera l'événement dans la chaîne lorsqu’elle est appelée.
<UL>
+
 
<LI> foreground (avant-plan): cet objet NVDA est passé en avant-plan, c'est à dire l'objet actif de plus haut niveau
+
Certains événements communs aux objets NVDA sont :
<LI> gainFocus (obtention du focus)
+
* foreground (avant-plan): cet objet NVDA est passé en avant-plan, c'est à dire l'objet actif de plus haut niveau ;
<LI> loseFocus (perte du focus)
+
* gainFocus (obtention du focus) ;
<LI> nameChange (Changement du nom)
+
* loseFocus (perte du focus) ;
<LI> valueChange ((Changement de la valeur)
+
* nameChange (changement du nom) ;
<LI> stateChange (((Changement de l'tat)
+
* valueChange (changement de la valeur) ;
<LI> caret (curseur): lorsque le curseur (point d'insertion) se déplace au sein de cette objet NVDA
+
* stateChange (changement de l'état) ;
<LI> locationChange (Changement de l'emplacement): changements physiques de l'emplacement à l'cran
+
* caret (curseur): lorsque le curseur (point d'insertion) se déplace au sein de cet objet NVDA ;
</UL>
+
* locationChange (changement de l'emplacement): changements physiques de l'emplacement à l'écran.
  
<P></P>
 
<P>
 
 
Il existe beaucoup d'autres événements, bien que ceux énumérés ci-dessus sont généralement les plus utiles.
 
Il existe beaucoup d'autres événements, bien que ceux énumérés ci-dessus sont généralement les plus utiles.
</P>
+
 
<P>
+
Pour voir un exemple d'événement géré par un module App, référez-vous à l'exemple 1.
Pour voir un exemple d'un événement géré par un module App, référez-vous à l'<A HREF="#Example1">exemple 1</A> (focus bipant dans Notepad).
+
 
</P>
+
=== La variable SleepMode des modules App===
<A NAME="toc15"></A>
+
 
<H3> 2.11. La variable App SleepMode module </H3>
+
Les modules App ont une propriété très utile appelée "sleepMode", qui, si elle est à "true", désactive presque complètement NVDA au sein de cette application.  
<P>
+
Le mode veille est très utile pour les applications auto-vocalisée qui possèdent leurs propres fonctionnalités de lecture d'écran, ou peut-être même certains jeux qui ont besoin d'utiliser pleinement le clavier.
Les Modules App ont une propriété très utile appelée "sleepMode", qui, si elle est à "true" désactive presque complètement NVDA au sein de cette application.  
+
 
Le mode veille est très utile pour les applications auto vocalisée qui possèdent leur propre fonctionnalité de lecture d'écran, ou peut-être même certains jeux qui ont besoin d'utiliser pleinement le clavier.
+
Bien que le mode veille puisse être activé et désactivé par l'utilisateur avec la combinaison clavier NVDA + MAJ + S, un développeur peut choisir d'activé le mode veille par défaut pour une application donnée.  
</P>
+
Ceci est fait en fournissant un module App pour cette application, dans la classe AppModule sleepMode est simplement à "true".
<P>
+
 
Bien que le mode veille puisse être activé et désactivé par l'utilisateur avec la commande touche NVDA + MAJ + S, un développeur peut choisir d'activé le mode veille par défaut pour une application donnée.  
+
=== Exemple 4 : Un module App mode veille ===
Ceci est fait en fournissant un module App pour cette application, dans la classe AppModule sleepMode est simplement à True.
+
 
</P>
+
Vous pouvez copier-coller le code suivant dans un fichier texte, puis l'enregistrer dans le répertoire appModules en lui donnant le nom de l'application pour laquelle vous souhaitez activer le mode veille.  
<A NAME="toc16"></A>
+
Le fichier doit avoir l'extension '''.Py''', comme d'habitude.
<H3> 2.12. Exemple 4: Un module App mode veille </H3>
+
 
<P>
+
<pre>
Vous pouvez copier coller Le code suivant dans un fichier texte, puis l'enregistrer dans le répertoire appModules en lui donnant le nom de l'application pour laquelle vous souhaitez activer le mode veille.  
 
Le fichier doit avoir l'extension .Py, Comme d'habitude.
 
</P>
 
<PRE>
 
 
--- start ---
 
--- start ---
 
import appModuleHandler
 
import appModuleHandler
Ligne 503 : Ligne 441 :
  
 
--- end ---
 
--- end ---
</PRE>
+
</pre>
<P></P>
+
 
<A NAME="toc17"></A>
+
===  Fourniture de classes d'objets NVDA personnalisées ===
<H3> 2.13. Fourniture de Classes d'Objets pour personnaliser NVDA </H3>
+
 
<P>
+
Fournir des classes d'objet NVDA à l'intérieur d'un greffon NVDA est probablement le moyen le plus puissant et le plus utile pour améliorer l'utilisation d'une application.  
Fournir des classes d'objet NVDA à l'intérieur d'un plugin NVDA est probablement le moyen le plus puissant et le plus utile pour améliorer l'utilisation d'une application.  
+
Cette méthode vous permet de placer l'ensemble de tout ce qui est nécessaire pour un contrôle précis dans une classe d'objet NVDA, plutôt que de disperser le code des contrôles dans les événements de nombreux greffons.
Cette méthode vous permet de placer l'ensemble de tout ce qui est nécessaire pour un contrôle précis dans une classe d'objet NVDA, plutôt que de disperser le code des contrôles dans les événements de nombreux plugin.
+
 
</P>
+
Il y a deux étapes pour créer une classe d'objet NVDA personnalisée :
<P>
+
* Définir la classe d'objet NVDA et ses événements, scripts, ''gesture bindings'' et propriétés de remplacement ;
Il ya deux étapes pour créer une classe d'objet NVDA personnalisée :
+
* Dire à NVDA d'utiliser cette classe d'objets NVDA pour des situations spécifiques en le définissant dans la méthode chooseNVDAObjectOverlayClasses du greffon.
</P>
 
<UL>
 
<LI> Définir la classe d'Objet NVDA et de ses évènements, scripts, gesture bindings et propriétés de remplacement.
 
<LI> Dire à NVDA d'utiliser cette classe d'objet NVDA pour des situations spécifiques en le définissant dans la méthode chooseNVDAObjectOverlayClasses du plugin.
 
</UL>
 
  
<P></P>
+
Lors de la définition d'une classe d'objets NVDA personnalisée, vous pouvez choisir parmi les nombreuses classes de NVDAObjec de base.  
<P>
+
Ces classes de base contiennent le support de base, notamment pour l'accessibilité ou une OS API sous-jacente au contrôle, tels que Win32, MSAA ou Java access Bridge.  
Lors de la définition d'une classe d'Objet NVDA personnalisé, vous pouvez choisir entre de nombreuses classes de NVDAObjec de base.  
 
Ces classes de base contiennent le support de base notamment pour l'accessibilité ou une OS API sous-jacente au contrôle, tels que Win32, MSAA ou Java access Bridge.  
 
 
Vous devriez normalement hériter vos classes personnalisées NVDAObject de la classe de base la plus élevée dont vous avez besoin pour que votre classe soit choisi en premier.  
 
Vous devriez normalement hériter vos classes personnalisées NVDAObject de la classe de base la plus élevée dont vous avez besoin pour que votre classe soit choisi en premier.  
Par exemple, si vous choisissez d'utiliser votre classe NVDAObject personnalisée lorsque le nom de la window classe est "Edit" (Edition) et l'ID du window contrôle est de 15, vous devriez probablement hériter de NVDAObjects.window.Window, aussi clairement que vous êtes conscient que c'est un Window object.
+
Par exemple, si vous choisissez d'utiliser votre classe NVDAObject personnalisée lorsque le nom de la classe window est "Edit" (Edition) et l'ID du window contrôle est de 15, vous devriez probablement hériter de NVDAObjects.window.Window, aussi clairement que vous êtes conscient que c'est un objet fenêtre.
De même, si vous lui associez la propriété accRole de MSAA, vous aurez probablement besoin d'hériter d'NVDAObjects.IAccessible.IAccessible.
+
De même, si vous lui associez la propriété accRole de MSAA, vous aurez probablement besoin d'hériter de NVDAObjects.IAccessible.IAccessible.
Vous devriez également songer à quelles propriétés vous allez substituer dans les objets personnalisés NVDA.
+
Vous devriez également songer aux propriétés que vous allez substituer dans les objets personnalisés NVDA.
 
Par exemple, si vous substituez une propriété IAccessible spécifiques tels que shouldAllowIAccessibleFocusEvent, alors vous aurez besoin d'hériter de NVDAObjects.IAccessible.IAccessible.
 
Par exemple, si vous substituez une propriété IAccessible spécifiques tels que shouldAllowIAccessibleFocusEvent, alors vous aurez besoin d'hériter de NVDAObjects.IAccessible.IAccessible.
</P>
 
<P>
 
La méthode chooseNVDAObjectOverlayClasses peut être implémenté dans des modules app ou des classes de plugins globaux.
 
Elle prend 3 arguments:
 
</P>
 
<OL>
 
<LI> self (auto): l'instance du module app ou du plugin global.
 
<LI> obj (objet): le NVDAObject pour lequel les classes sont choisies.
 
<LI> clsList: une liste de classes Python de NVDAObject qui sera utilisées pour obj.
 
</OL>
 
  
<P></P>
+
La méthode chooseNVDAObjectOverlayClasses peut être implémentée dans des modules App ou des classes de greffons globaux.
<P>
+
 
A l'intérieur de cette méthode, vous devez décider de l'usage des classe(es) d'objet NVDA (si cas échéant) si cet objet NVDA doit être utilisé en vérifiant ses propriétés, etc.  
+
Elle prend 3 arguments :
Si une classe personnalisée doit être utilisée, elle doit être insérée dans la liste de classe, généralement au début.  
+
* self (auto) : l'instance du module app ou du greffon global ;
Vous pouvez également supprimer de la liste de classe des classes choisies par NVDA, bien que cela soit rarement nécessaire.
+
* obj (objet) : le NVDAObject pour lequel les classes sont choisies ;
</P>
+
* clsList : une liste de classes Python de NVDAObject qui sera utilisées pour obj.
<A NAME="toc18"></A>
+
 
<H3> 2.14. Exemple 5: étiquetage du champ d'édition de Notepad à l'aide d'un objet de personnalisation NVDA </H3>
+
À l'intérieur de cette méthode, vous devez décider de l'usage des classes d'objets NVDA (le cas échéant) si cet objet NVDA doit être utilisé en vérifiant ses propriétés, etc.  
<P>
+
Si une classe personnalisée doit être utilisée, elle doit être insérée dans la liste de classes, généralement au début.  
Ce module app pour Notepad fait NVDA rapport du Bloc-notes zone d'édition principale comme ayant le nom "content".
+
Vous pouvez également supprimer de la liste de classes des classes choisies par NVDA, bien que cela soit rarement nécessaire.
Qui est, lorsqu'il reçoit le focus, NVDA dira "Content edit" (éditer le contenu).
+
 
 +
=== Exemple 5 : étiquetage du champ d'édition de Notepad à l'aide d'un objet NDVA personnalisé===
 +
 
 +
Ce module app pour Notepad fait renvoyer par NVDA le nom de la zone d'édition principale du bloc-notes comme étant "Content".
 +
Autrement dit, lorsqu'il reçoit le focus, NVDA dira "Content edit" (éditer le contenu).
  
This app module for notepad makes NVDA report Notepad's main edit field as having a name of "content".
 
That is, when it receives focus, NVDA will say "Content edit".
 
</P>
 
<P>
 
 
Le code suivant peut être copié et collé dans un fichier texte, puis enregistré dans le répertoire appModules en le nommant notepad.py.
 
Le code suivant peut être copié et collé dans un fichier texte, puis enregistré dans le répertoire appModules en le nommant notepad.py.
</P>
+
 
<PRE>
+
<pre>
 
--- start ---
 
--- start ---
 
import appModuleHandler
 
import appModuleHandler
Ligne 573 : Ligne 494 :
  
 
--- end ---
 
--- end ---
</PRE>
+
</pre>
 +
 
 +
<div class="toTranslate" style="background-color: #ffb;">
 +
==NVDA Python Console==
 +
 
 +
The NVDA Python console emulates the interactive Python interpreter from within NVDA. It is a development tool which is useful for debugging, general inspection of NVDA internals or inspection of the accessibility hierarchy of an application.
 +
 
 +
===Usage===
 +
 
 +
The console can be activated in two ways:
 +
 
 +
* By pressing NVDA+control+z. If activated in this fashion, a snapshot of the current state of NVDA at the time the key was pressed will be taken and saved in certain variables available in the console. See Snapshot Variables for more details.
 +
* By selecting Tools -> Python console from the NVDA system tray menu.
 +
 
 +
The console is similar to the standard interactive Python interpreter. Input is accepted one line at a time. The current line is processed when enter is pressed. You can navigate through the history of previously entered lines using the up and down arrow keys.
 +
 
 +
Output (responses from the interpreter) will be spoken when enter is pressed. The f6 key toggles between the input and output controls.
 +
 
 +
Closing the console window simply hides it. This allows the user to return to the session as it was left when it was closed, including history and variables.
 +
 
 +
===Namespace===
 +
 
 +
====Automatic Imports====
 +
 
 +
For convenience, the following modules and variables are automatically imported in the console: sys, os, wx, log (from logHandler), api, queueHandler, speech, braille
 +
 
 +
====Snapshot Variables====
 +
 
 +
Whenever NVDA+control+z is pressed, certain variables available in the console will be assigned according to the current state of NVDA. These variables are:
  
<!-- html code generated by txt2tags 2.5 (http://txt2tags.sf.net) -->
+
* focus: The current focus object
<!-- cmdline: txt2tags developerGuide.t2t -->
+
* focusAnc: The ancestors of the current focus object
</BODY>
+
* fdl: Focus difference level; i.e. the level at which the ancestors for the current and previous focus differ
</HTML>
+
* fg: The current foreground object
 +
* nav: The current navigator object
 +
* mouse: The current mouse object
 +
* brlRegions: The braille regions from the active braille buffer
 +
</div>

Dernière version du 31 mai 2016 à 11:33


Introduction[modifier]

Ce guide fournit des informations pour les nouveaux développeurs qui souhaitent développer des composants pour NVDA. Notez que ce n'est qu'une introduction. Les développeurs devraient consulter la documentation du code pour avoir une information plus complète.

À propos de Python[modifier]

NVDA et ses composants sont principalement écrits en langage de programmation Python. Le but de ce guide n'est pas de vous apprendre Python, bien que des exemples soient fournis tout au long de ce guide, qui vous aideront à vous familiariser avec la syntaxe de Python. La documentation et d'autres ressources liées au langage Python se trouvent sur le site http://www.python.org/

Translation[modifier]

In order to support multiple languages/locales, NVDA must be translated and data specific to the locale must be provided.

Character Descriptions[modifier]

Sometimes, it can be very difficult or even impossible to distinguish one character from another. For example, two characters might be pronounced the same way, even though they are actually different characters. To help users when this occurs, character descriptions can be provided which describe the character in a unique way.

Character descriptions can be provided for a locale in a file named characterDescriptions.dic in the directory for the locale. This is a UTF-8 encoded text file. Blank lines and lines beginning with a "#" character are ignored. All other lines should contain a character, followed by a tab, then one or more descriptions separated by tabs.

For example:

# This is a comment.
a	alpha
b	bravo

See the file locale\en\characterDescriptions.dic for a full example.

Symbol Pronunciation[modifier]

It is often useful to hear punctuation and other symbols pronounced as words when reading text, particularly when moving by character. Unfortunately, the pronunciation of symbols is inconsistent between speech synthesisers and many synthesisers do not speak many symbols and/or do not allow control over what symbols are spoken. Therefore, NVDA allows information about symbol pronunciation to be provided.

This is done for a locale by providing a file named symbols.dic in the directory for the locale. This is a UTF-8 encoded text file. Blank lines and lines beginning with a "#" character are ignored. All locales implicitly inherit the symbol information for English, though any of this information can be overridden.

The file contains two sections.

Defining Complex Symbols[modifier]

The first section is optional and defines regular expression patterns for complex symbols. Complex symbols are symbols which aren't simply a character or sequence of characters, but instead require a more complicated match. An example is the full stop (.) sentence ending in English. The "." is used for multiple purposes, so a more complicated check is required to determine whether this refers to the end of a sentence.

The complex symbols section begins with the line:

complexSymbols :

Subsequent lines contain a textual identifier used to identify the symbol, a tab and the regular expression pattern for that symbol. For example:

. sentence ending	(?<=[^\s.])\.(?=[\"')\s]|$)

Again, the English symbols are inherited by all other locales, so you need not include any complex symbols already defined for English.

Defining Symbol Information[modifier]

The second section provides information about when and how to pronounce all symbols. It begins with the line:

symbols:

Subsequent lines should contain several fields separated by tabs. The only mandatory fields are the identifier and replacement. The default will be used for omitted fields. The fields are as follows:

   identifier: The identifier of the symbol. In most cases, this is just the character or characters of the symbol. However, it can also be the identifier of a complex symbol. Certain characters cannot be typed into the file, so the following special sequences can be used:
       \0: null
       \t: tab
       \n: line feed
       \r: carriage return
       \f: form feed
       \#: # character (needed because # at the start of a line denotes a comment) 
   replacement: The text which should be spoken for the symbol.
   level: The symbol level at which the symbol should be spoken. The symbol level is configured by the user and specifies the amount of symbols that should be spoken. This field should contain one of the levels "none", "some", "most", "all" or "char", or "-" to use the default. "char" means that the symbol should only be pronounced when moving by character. The default is to inherit the value or "all" if there is nothing to inherit.
   preserve: Whether the symbol itself should be preserved to facilitate correct pronunciation by the synthesiser. For example, symbols which cause pauses or inflection (such as the comma in English) should be preserved. This field should be one of the following:
       never: Never preserve the symbol.
       always: Always preserve the symbol.
       norep: Only preserve the symbol if it is not being replaced; i.e. the user has set symbol level lower than the level of this symbol.
       -: Use the default. 
   The default is to inherit the value or "never" if there is nothing to inherit. 

Finally, a display name for the symbol can be provided in a comment after a tab at the end of the line. This will be shown to users when editing the symbol information and is especially useful for translators to define translated names for English complex symbols.

Here are some examples:

(	left paren	most

This means that the "(" character should be spoken as "left paren" only when the symbol level is set to most or higher; i.e. most or all.

,	comma	all	always

This means that the "," character should be spoken as "comma" when the symbol level is set to all and that the character itself should always be preserved so that the synthesiser will pause appropriately.

. sentence ending	point	# . fin de phrase

This line appears in the French symbols.dic file. It means that the ". sentence ending" complex symbol should be spoken as "point". Level and preserve are not specified, so they will be taken from English. A display name is provided so that French users will know what the symbol represents.

Please see the file locale\en\symbols.dic for the English definitions which are inherited for all locales. This is also a good full example.

Greffons logiciels[modifier]

Aperçu[modifier]

Les greffons vous permettent de personnaliser la façon dont se comporte NVDA en général ou dans une application particulière. Ils sont capables de :

  • Répondre à des évènements particuliers tels que la prise de focus ou les changements dans les propriétés des objets, par exemple quand un contrôle change de nom.
  • Mettre en œuvre les commandes qui sont liées à des touches spécifiques ou d'autres entrées.
  • Personnaliser le comportement ou mettre en œuvre des fonctionnalités supplémentaires pour des contrôles spécifiques.
  • Personnaliser ou ajouter un nouveau support pour le contenu textuel et les documents complexes.
=== Types de greffons ===

Il existe deux types de greffons :

  • Les Modules App : code spécifique à une application particulière,

le module App reçoit tous les événements d'une application précise, même si ce n'est pas l'application courante. Lorsque l'application est active, toutes les commandes que le module App a associé aux touches ou à une autre entrée peuvent être exécutées par l'utilisateur.

  • Plugins Globaux : le code Global de NVDA, C'est à dire utilisé dans toutes les applications.

Les greffons Globaux contiennent tous les événements liés à tous les contrôles du système d'exploitation. Toutes les commandes associées à un Plugin global peuvent être exécutées par l'utilisateur, où qu'elles soient dans le système d'exploitation, indépendamment de l'application.


Si vous souhaitez améliorer l'accès de NVDA à une application donnée, il est plus probable que vous vouliez écrire un module App. En revanche, si vous souhaitez ajouter des fonctionnalités à NVDA en général (par exemple un script donnant la puissance instantanée du réseau sans fil quelle que soit l'application), un greffon global est ce qu'il vous faut.

Modules et Plugins App Globaux se présentent de la même manière. Ce sont des fichiers source Python (avec une extension .Py), ils définissent tous deux une classe spéciale contenant tous les événements, les scripts et les bindings, et ils peuvent définir des classes personnalisées pour les accès, le contenu du texte et les documents complexes. Cependant, ils diffèrent à certains égards.

Les quelques sections suivantes traitent séparément les modules App et les greffons globaux. Après cela, la discussion est à nouveau plus générale.

Les bases d'un module App[modifier]

Les fichiers des modules App ont l'extension .Py, et portent le même nom que l'exécutable principal de l'application pour laquelle vous souhaitez les utiliser. Par exemple, un module d'application pour Notepad seraient appelés notepad.py, puisque l'exécutable principal de Notepad est appelé notepad.exe.

Les fichiers du module App doivent être placés dans le sous-répertoire appModules du répertoire configuration de NVDA de l'utilisateur. Pour plus d'informations sur la localisation du répertoire de configuration de l'utilisateur, consultez, s'il-vous-plaît, le guide utilisateur de NVDA.

Les Modules App doivent définir une classe appelée AppModule, qui hérite de appModuleHandler.AppModule. Cette classe peut alors définir des événements et des méthodes pour les scripts, des gesture bindings et d'autres codes. Tout cela sera abordé en profondeur plus tard.

NVDA charge un module App pour une application dès qu'il détecte que l'application est exécutée. Le module App est déchargé une fois l'application fermée ou lorsqu'on quitte NVDA.

Exemple 1: Un module App qui génère un Bip lors des événements de changement du Focus[modifier]

L'exemple suivant de module App, fait biper NVDA chaque fois que le focus change dans l'application Notepad. Cet exemple vous montre le schéma de base d'un module app.

Dans un nouveau fichier texte appelé notepad.py, qui doit être sauvegardé dans le répertoire AppModules, copiez et collez le code entre les marqueurs de début et de fin, sans les inclure. Faites très attention de garder toutes les tabulations et les espaces intactes.

Une fois enregistré à l'emplacement correct, vous pouvez redémarrer NVDA ou choisir de recharger les greffons. Vous trouverez ceci dans le sous-menu Outils du menu NVDA.

Pour finir, ouvrez le bloc-notes et placer le focus dans l'application. Par exemple, déplacer-vous le long de la barre de menu, ouvrez certaines boîtes de dialogue, etc. Vous devriez entendre des bips chaque fois que le focus change. Notez cependant que si vous vous déplacez en dehors de Notepad — par exemple, dans l'Explorateur Windows — vous ne devriez pas entendre de bips.

--- start ---
# Notepad App Module for NVDA
# Developer guide example 1

import appModuleHandler

class AppModule(appModuleHandler.AppModule):

	def event_gainFocus(self, obj, nextHandler):
		import tones
		tones.beep(550, 50)
		nextHandler()

--- end ---


Le fichier de ce Module App commence par deux lignes de commentaires, qui décrivent à quoi le fichier est destiné.

Il importe alors le module appModuleHandler, de sorte que le module App a alors accès à la classe AppModule base.

Ensuite, il définit une classe appelée AppModule, qui est héritée de appModuleHandler.AppModule.

À l'intérieur de cette classe, il définit un ou plusieurs événements, des scripts ou des gesture bindings. Dans cet exemple, il définit une méthode pour l’événement recevoir le focus (event_gainFocus), qui émet un bip court à chaque fois qu'il est exécuté. La mise en œuvre de cet événement n'est pas ce qui importe pour cet exemple ; la partie la plus importante est la classe elle-même. Les événements seront traités plus en détail ultérieurement.

De la même façon que pour d'autres exemples de ce guide, n'oubliez pas de supprimer le module Application créé lorsque vous avez terminé les essais ; puis redémarrez NVDA ou bien recharger les greffons, afin que la fonctionnalité d'origine soit restaurée.

Les bases d'un greffon global[modifier]

Les fichiers de greffons globaux ont une extension .Py, et devraient avoir un nom court et unique identifiant ce qu'ils font.

Les fichiers de greffons globaux doivent être placés dans le sous-répertoire globalPlugins du répertoire configuration de NVDA de l'utilisateur. Pour plus d'informations sur la localisation du répertoire de configuration de l'utilisateur, consultez, s'il-vous-plaît, le guide utilisateur de NVDA.

Les greffons globaux doivent définir une classe appelée GlobalPlugin, qui hérite de globalPluginHandler.GlobalPlugin. Cette classe peut alors définir des événements et des méthodes de script, des gesture bindings et d'autres codes. Tout cela sera abordé plus précisément par la suite.

NVDA charge tous les greffons globaux au démarrage, et les décharge à la fermeture.

Exemple 2: un Plugin global qui Fourni un script annonçant la version de NVDA[modifier]

L'exemple suivant de greffon global vous permet d'appuyer sur NVDA + Maj + V depuis n'importe où dans le système d'exploitation pour connaître la version de NVDA. Cet exemple est seulement là pour vous montrer la structure de base d'un greffon global.

Dans un nouveau fichier texte nommé example2.py, qui doit être sauvegardé dans le répertoire globalPlugins, copiez et collez le code entre les marqueurs de début et de fin, sans les inclure. Faites très attention de garder toutes les tabulations et les espaces intactes.

Une fois enregistré à l'emplacement correct, vous pouvez redémarrer NVDA ou choisir de recharger les greffons. Vous trouverez ceci dans le sous-menu Outils du menu NVDA.

Vous pouvez maintenant, de n'importe où, appuyer sur les touches NVDA + Maj + V pour entendre ou lire en braille la version de NVDA.

--- start ---
# Version announcement greffon for NVDA
# Developer guide example 2

import globalPluginHandler
import ui
import versionInfo

class GlobalPlugin(globalPluginHandler.GlobalPlugin):

	def script_announceNVDAVersion(self, gesture):
		ui.message(versionInfo.version)

	__gestures={
		"kb:NVDA+shift+v": "announceNVDAVersion",
	}

--- end ---

Le fichier de ce greffon global commence par deux lignes de commentaires, qui décrivent à quoi ce fichier doit servir.

Il importe alors le module globalPluginHandler, afin que le greffon global ait accès à la classe GlobalPlugin de base.

Il importe également quelques autres modules, à savoir UI et VERSIONINFO, dont un de ces greffons spécifiques est nécessaire pour effectuer l'ensemble des actions requises afin d'annoncer la version.

Puis il définit une classe appelée GlobalPlugin, qui est héritée de globalPluginHandler.GlobalPlugin.

x À l'intérieur de cette classe, il définit un ou plusieurs événements, des scripts ou des gesture bindings. Dans cet exemple, il définit une méthode de script qui effectue l'annonce de version, et lie NVDA + Maj + V à ce script. Toutefois, les détails du script et de son affectation importent peu dans cet exemple. La partie la plus importante est la classe elle-même.

De la même façon que pour d'autres exemples de ce guide, quand vous aurez terminé les essais n'oubliez pas de supprimer le greffon global que vous avez créé ; puis redémarrez NVDA ou bien recharger les greffons, afin que la fonctionnalité d'origine soit restaurée.

Objets NVDA[modifier]

NVDA représente les contrôles et d'autres éléments d'interface graphique sous forme d'objets NVDA. Ces objets contiennent des propriétés NVDA standardisées, comme le nom, le rôle, la valeur, les états et la description, ce qui permet à d'autres parties de NVDA de demander ou d'afficher des informations à propos d'un contrôle d'une manière générale. Par exemple, le bouton OK d'une boîte de dialogue serait représenté par un objet NVDA avec un nom « OK » et un rôle de bouton. De même, une case à cocher avec une étiquette J'accepte aurait le nom « J'accepte », un rôle de case à cocher et si elle est cochée, un état coché.

Comme il existe de nombreux toolkits graphiques, de plateformes et API d'accessibilités, les objets NVDA font abstraction de ces différences dans un formulaire standard, utilisable par NVDA, indépendamment du tooltip ou de l'API avec lequel le contrôle est effectué. Par exemple, le bouton Ok, dont nous venons de discuter, pourrait être un widget dans une application Java, un objet MSAA, un objet ou un élément IAccessible2 UI Automation.

Les objets NVDA ont de nombreuses propriétés, parmi les plus utiles on a :

  • name (nom) : l'étiquette du contrôle.
  • rôle (rôle) : l'une des constantes ROLE_* du module controlTypes de NVDA.

Button, dialog, editableText, window et checkbox sont des exemples de rôles.

  • states (états): une série de 0 ou plusieurs des constantes STATE_* à du module NVDA controlTypes.

Focusable, focused, selected, selectable, expanded, collapsed et checked sont quelques exemples d'états.

  • value (valeur) : la valeur du contrôle ; par exemple le pourcentage d'une barre de défilement ou l'item sélectionné pour une liste déroulante.
  • description (Description) : une phrase ou deux décrivant ce que le contrôle fait (en générale identique à son info-bulle).
  • location (Emplacement): la position de l'objet en coordonnées écran (gauche, en haut, la largeur et la hauteur).
  • parent (parent) : l'objet parent de cet objet.

Par exemple, le parent de l'objet élément de liste serait la liste qui le contient.

  • next (suivant) : l'objet juste après celui-ci au même niveau d'un ordre logique.

Par exemple, l'objet le plus susceptible de suivre un objet item du menu NVDA est un autre item du même menu.

  • previous (précédent) : comme next, mais dans l'ordre inverse.
  • firstChild (premier enfant) : l'objet premier enfant direct de cet objet.

Par exemple, le premier enfant d'une liste serait le premier élément de la liste.

  • lastChild (dernier enfant) : le dernier enfant direct de cet objet.
  • children (enfants): une liste de tous les enfants directs de cet objet ; par exemple tous les items du menu dans un menu.

Il y a aussi quelques propriétés de navigation simplifiée tels que simpleParent, simpleNext, simpleFirstChild et simpleLastChild. Ce sont respectivement les mêmes propriétés de navigation que celles décrites ci-dessus, mais NVDA filtre les objets inutiles. Ces propriétés sont utilisées lorsque NVDA est en mode navigation simplifiée, ce qui est le mode par défaut. Ces propriétés simples peuvent être plus faciles à utiliser, mais les propriétés de navigation réelles reflètent mieux la structure sous-jacente du système d'exploitation.

Lors du développement de greffons, généralement, le toolkit ou l'API qui renvoie un objet NVDA importe peu, puisque le greffon va, la plupart du temps, n’accéder qu'aux propriétés standards, telles que le nom, le rôle et la valeur. Cependant, pour les greffons plus avancés, il est certainement possible de creuser davantage sur les objets NVDA pour trouver des informations sur les boîtes à outils ou API spécifiques si nécessaire.

Les greffons utilisent des objets NVDA pour trois raisons précises :

  • La plupart des événements que les greffons reçoivent prennent en argument l'objet NVDA sur lequel l'événement s'est produit.

Par exemple, event_gainFocus prend l'objet NVDA qui représente le contrôle recevant le focus.

  • Les scripts, les événements ou d'autres codes peuvent aller chercher des objets d'intérêt tels que les objets NVDA en focus, les objets de navigation courante de NVDA, ou peut-être l'objet NVDA du bureau.

Le code peut alors récupérer des informations de cet objet ou peut-être même d'un objet lié à celui-ci (par exemple, son parent, le premier enfant, etc.).

  • Le greffon peut définir ses propres classes d'objets NVDA, elles seront utilisées pour contenir un contrôle spécifique afin de lui donner des fonctionnalités supplémentaires, muter ses propriétés, etc.

Tout comme les modules et greffons App globaux, les objets NVDA peuvent également définir des événements, des scripts et des gesture bindings.

Scripts et Gesture Bindings[modifier]

Les Modules App, les Plugins globaux et les Objets NVDA peuvent définir des méthodes spéciales qui peuvent être liées à un raccourci spécifique, ainsi, une touche NVDA se réfère à ces méthodes de scripts.

Un script est une méthode standard d'instance de Python possédant un nom commençant par "script_", par exemple "script_sayDateTime".

Une méthode de script prend deux arguments :

  • self (auto) : une référence au module App, au greffon global ou a une instance de l'objet NVDA du script qui a été appelé.
  • gesture : un objet Input Gesture, qui représente l'entrée qui a déclenché le script à exécuter.

De même que la méthode de script, une certaine forme de gesture binding doit être définie, de sorte que NVDA sait quelle entrée doit exécuter le script.

Pour affecter la gesture à un script, un dictionnaire Python spécial "__gestures" peut être défini comme une variable de classe dans le module App, le greffon global ou l'objet NVDA. Ces dictionnaires doivent contenir des chaînes d'identification de gesture pointant vers le nom du script demandé, sans le préfixe

Il y a des manières plus avancées de faire des gestures binding dans un mode plus dynamique, même si le dictionnaire __gestures est le plus simple.

Une chaîne d'identification de gesture est une chaîne simple représentant un raccourci. Il se compose d'un code de deux lettres correspondant à la source d'entrée, une partie facultative entre parenthèses, deux points (:) et un ou plusieurs noms séparés par un signe plus (+) désignant des touches réelles ou valeurs d'entrée.

Quelques exemples de chaînes d'identification de gesture sont :

  • "kb:NVDA+shift+v" ;
  • "br(freedomScientific):leftWizWheelUp" ;
  • "kb(laptop):NVDA+t".

Actuellement, les seules sources d'entrée de NVDA sont :

  • kb: keyboard input (saisie au clavier) ;
  • br: braille input (entrée braille).

Quand NVDA reçoit une entrée, il cherche les gestures bindings correspondantes dans un ordre précis. Une fois qu'une gesture binding est trouvée, le script est exécuté et aucune des bindings supplémentaires ne sont utilisées, Nore est gesture particulière transmise automatiquement au système d'exploitation. (nore is that particular gesture passed on automatically to the Operating System.)

L'ordre de recherche des gestures bindings est le suivant :

  • les greffons globaux chargés ;
  • les Module App de l'application active ;
  • l'arborescence d'interception de l'objet NVDA sous le focus le cas échéant, par exemple un virtualBuffer ;
  • l'objet NVDA sous le focus ;
  • les commandes globales (intégrées dans les commandes comme quitter NVDA, les commandes d'objets de navigation, etc.).

Exemple 3: un Plugin global pour trouver la classe de fenêtre et le contrôle d'ID[modifier]

Le greffon global ci-dessous, vous permet d'annoncer la classe de fenêtre du focus actuel en appuyant sur touche NVDA + flèche gauche et l'ID du contrôle sous le focus dans la fenêtre avec touche NVDA + flèche droite. Cet exemple vous montre comment définir un ou plusieurs scripts avec gesture bindings dans une classe comme un module App, un greffon global ou un objet NVDA.

Dans un nouveau fichier texte nommé example3.py, qui doit être sauvegardé dans le répertoire globalPlugins, copiez et collez le code entre les marqueurs de début et de fin, sans les inclure. Faites très attention de garder toutes les tabulations et les espaces intactes.

Une fois enregistré à l'emplacement correct, vous pouvez redémarrer NVDA ou choisir de recharger les greffons. Vous trouverez ceci dans le sous-menu Outils du menu NVDA.

--- start ---
#Window utility scripts for NVDA
#Developer guide example 3

import globalPluginHandler
import ui
import api

class GlobalPlugin(globalPluginHandler.GlobalPlugin):

	def script_announceWindowClassName(self, gesture):
		focusObj = api.getFocusObject()
		name = focusObj.name
		windowClassName = focusObj.windowClassName
		ui.message("class for %s window: %s" % (name, windowClassName))

	def script_announceWindowControlID(self, gesture):
		focusObj = api.getFocusObject()
		name = focusObj.name
		windowControlID = focusObj.windowControlID
		ui.message("Control ID for %s window: %d" % (name, windowControlID))

	__gestures = {
		"kb:NVDA+leftArrow": "announceWindowClassName",
		"kb:NVDA+rightArrow": "announceWindowControlID",
	}

--- end ---

Événements[modifier]

Quand NVDA détecte des toolkits particuliers, l'API ou les événements du système d'exploitation, it abstracts these et appelle ses propres événements internes sur les greffons et les objets NVDA.

Bien que la plupart des événements soient liés à un objet NVDA spécifique (par exemple changement de nom, gain du focus, changement d'état, etc.), ces événements peuvent être traités à différents niveaux. Quand un événement est géré, il est empêché d'aller plus loin dans la chaîne. Toutefois, le code dans l'événement peut choisir de se propager davantage si nécessaire.

L'ordre des niveaux par lequel passe l'événement jusqu'à ce qu'une méthode d'événement soit trouvée est le suivant :

  • les greffons globaux chargés ;
  • les modules App associés à l'objet NVDA pour lesquels l'événement a été appelé ;
  • l'arborescence d'interception (s'il existe) de l'objet NVDA pour lequel l'événement a été appelé ;
  • l'objet NVDA lui-même.

Les événements sont des méthodes d'instance Python, possédant un nom commençant par "event_" suivi par le nom de l'événement (par exemple gainFocus).

Ces méthodes d'événement prennent des arguments légèrement différents selon le niveau auquel ils sont définis.

Si un événement d'un objet NVDA est défini pour lui-même, la méthode prend un seul argument obligatoire, le self argument : à savoir l'instance d'objet NVDA). Certains événements peuvent prendre des arguments supplémentaires, mais cela est assez rare.

Si un événement d'un objet NVDA est défini sur un greffon global, un module App ou l'arborescence d'interception, l'événement prend les arguments suivants :

  • self (auto): l'instance du greffon global, du Module App ou de l'arborescence d'interception ;
  • obj (objet): objet NVDA sur lequel l'événement a été appelé ;
  • nextHandler: une fonction qui propagera l'événement dans la chaîne lorsqu’elle est appelée.

Certains événements communs aux objets NVDA sont :

  • foreground (avant-plan): cet objet NVDA est passé en avant-plan, c'est à dire l'objet actif de plus haut niveau ;
  • gainFocus (obtention du focus) ;
  • loseFocus (perte du focus) ;
  • nameChange (changement du nom) ;
  • valueChange (changement de la valeur) ;
  • stateChange (changement de l'état) ;
  • caret (curseur): lorsque le curseur (point d'insertion) se déplace au sein de cet objet NVDA ;
  • locationChange (changement de l'emplacement): changements physiques de l'emplacement à l'écran.

Il existe beaucoup d'autres événements, bien que ceux énumérés ci-dessus sont généralement les plus utiles.

Pour voir un exemple d'événement géré par un module App, référez-vous à l'exemple 1.

La variable SleepMode des modules App[modifier]

Les modules App ont une propriété très utile appelée "sleepMode", qui, si elle est à "true", désactive presque complètement NVDA au sein de cette application. Le mode veille est très utile pour les applications auto-vocalisée qui possèdent leurs propres fonctionnalités de lecture d'écran, ou peut-être même certains jeux qui ont besoin d'utiliser pleinement le clavier.

Bien que le mode veille puisse être activé et désactivé par l'utilisateur avec la combinaison clavier NVDA + MAJ + S, un développeur peut choisir d'activé le mode veille par défaut pour une application donnée. Ceci est fait en fournissant un module App pour cette application, dans la classe AppModule sleepMode est simplement à "true".

Exemple 4 : Un module App mode veille[modifier]

Vous pouvez copier-coller le code suivant dans un fichier texte, puis l'enregistrer dans le répertoire appModules en lui donnant le nom de l'application pour laquelle vous souhaitez activer le mode veille. Le fichier doit avoir l'extension .Py, comme d'habitude.

--- start ---
import appModuleHandler

class AppModule(appModuleHandler.AppModule):

	sleepMode = True

--- end ---

Fourniture de classes d'objets NVDA personnalisées[modifier]

Fournir des classes d'objet NVDA à l'intérieur d'un greffon NVDA est probablement le moyen le plus puissant et le plus utile pour améliorer l'utilisation d'une application. Cette méthode vous permet de placer l'ensemble de tout ce qui est nécessaire pour un contrôle précis dans une classe d'objet NVDA, plutôt que de disperser le code des contrôles dans les événements de nombreux greffons.

Il y a deux étapes pour créer une classe d'objet NVDA personnalisée :

  • Définir la classe d'objet NVDA et ses événements, scripts, gesture bindings et propriétés de remplacement ;
  • Dire à NVDA d'utiliser cette classe d'objets NVDA pour des situations spécifiques en le définissant dans la méthode chooseNVDAObjectOverlayClasses du greffon.

Lors de la définition d'une classe d'objets NVDA personnalisée, vous pouvez choisir parmi les nombreuses classes de NVDAObjec de base. Ces classes de base contiennent le support de base, notamment pour l'accessibilité ou une OS API sous-jacente au contrôle, tels que Win32, MSAA ou Java access Bridge. Vous devriez normalement hériter vos classes personnalisées NVDAObject de la classe de base la plus élevée dont vous avez besoin pour que votre classe soit choisi en premier. Par exemple, si vous choisissez d'utiliser votre classe NVDAObject personnalisée lorsque le nom de la classe window est "Edit" (Edition) et l'ID du window contrôle est de 15, vous devriez probablement hériter de NVDAObjects.window.Window, aussi clairement que vous êtes conscient que c'est un objet fenêtre. De même, si vous lui associez la propriété accRole de MSAA, vous aurez probablement besoin d'hériter de NVDAObjects.IAccessible.IAccessible. Vous devriez également songer aux propriétés que vous allez substituer dans les objets personnalisés NVDA. Par exemple, si vous substituez une propriété IAccessible spécifiques tels que shouldAllowIAccessibleFocusEvent, alors vous aurez besoin d'hériter de NVDAObjects.IAccessible.IAccessible.

La méthode chooseNVDAObjectOverlayClasses peut être implémentée dans des modules App ou des classes de greffons globaux.

Elle prend 3 arguments :

  • self (auto) : l'instance du module app ou du greffon global ;
  • obj (objet) : le NVDAObject pour lequel les classes sont choisies ;
  • clsList : une liste de classes Python de NVDAObject qui sera utilisées pour obj.

À l'intérieur de cette méthode, vous devez décider de l'usage des classes d'objets NVDA (le cas échéant) si cet objet NVDA doit être utilisé en vérifiant ses propriétés, etc. Si une classe personnalisée doit être utilisée, elle doit être insérée dans la liste de classes, généralement au début. Vous pouvez également supprimer de la liste de classes des classes choisies par NVDA, bien que cela soit rarement nécessaire.

Exemple 5 : étiquetage du champ d'édition de Notepad à l'aide d'un objet NDVA personnalisé[modifier]

Ce module app pour Notepad fait renvoyer par NVDA le nom de la zone d'édition principale du bloc-notes comme étant "Content". Autrement dit, lorsqu'il reçoit le focus, NVDA dira "Content edit" (éditer le contenu).

Le code suivant peut être copié et collé dans un fichier texte, puis enregistré dans le répertoire appModules en le nommant notepad.py.

--- start ---
import appModuleHandler
from NVDAObjects.window import Window

class AppModule(appModuleHandler.AppModule):

	def chooseNVDAObjectOverlayClasses(self, obj, clsList):
		if isinstance(obj, Window) and obj.windowClassName == "Edit" and obj.windowControlID == 15:
			clsList.insert(0, LabelledEditField)

class LabelledEditField(Window):

	name="Content"

--- end ---

NVDA Python Console[modifier]

The NVDA Python console emulates the interactive Python interpreter from within NVDA. It is a development tool which is useful for debugging, general inspection of NVDA internals or inspection of the accessibility hierarchy of an application.

Usage[modifier]

The console can be activated in two ways:

  • By pressing NVDA+control+z. If activated in this fashion, a snapshot of the current state of NVDA at the time the key was pressed will be taken and saved in certain variables available in the console. See Snapshot Variables for more details.
  • By selecting Tools -> Python console from the NVDA system tray menu.

The console is similar to the standard interactive Python interpreter. Input is accepted one line at a time. The current line is processed when enter is pressed. You can navigate through the history of previously entered lines using the up and down arrow keys.

Output (responses from the interpreter) will be spoken when enter is pressed. The f6 key toggles between the input and output controls.

Closing the console window simply hides it. This allows the user to return to the session as it was left when it was closed, including history and variables.

Namespace[modifier]

Automatic Imports[modifier]

For convenience, the following modules and variables are automatically imported in the console: sys, os, wx, log (from logHandler), api, queueHandler, speech, braille

Snapshot Variables[modifier]

Whenever NVDA+control+z is pressed, certain variables available in the console will be assigned according to the current state of NVDA. These variables are:

  • focus: The current focus object
  • focusAnc: The ancestors of the current focus object
  • fdl: Focus difference level; i.e. the level at which the ancestors for the current and previous focus differ
  • fg: The current foreground object
  • nav: The current navigator object
  • mouse: The current mouse object
  • brlRegions: The braille regions from the active braille buffer