Keep Google updated when content changes To make sure that Google finds your new or updated pages quickly: Submit sitemaps. Ask Google to recrawl your URLs. Use the Indexing API when applicable. If you're still having trouble getting your page indexed, check your server logs for errors. Don't forget about the words on the page Googlebot can only find content that is textually visible.
Find how-to content, sample code, SDK and API documentation, VBA references, training, and technical articles for developing solutions and customizing Access. Access VBA reference. Access forum on Office Dev Center. Welcome to the Accessibility Developer Guide! If you want to learn about accessible website development, you are at the right place.
To make sure that Google Search understands what your page is about: Make sure that your visual content is expressed in text form. For example, a product category page that contains a list of images of shirts with no textual context about each image is suboptimal. The product category page should include some textual explanation for each image. Make sure that every page has a descriptive title and meta description. Unique titles and meta descriptions help Google show how your pages are relevant to users, which in turn can increase your search traffic.
Use semantic HTML. Instead of using a plugin, use semantic HTML markup for your content whenever possible. Tell Google about other versions of your content Googlebot doesn't automatically know that there are multiple versions of your site or content. Tell Google about localized versions of your site.
Make your AMP pages discoverable. Control what content Google sees There are several ways to block Googlebot: To block Googlebot from finding your page, restrict access to your content to logged in users for example, use a login page or password-protect your page. To block Googlebot from crawling your page, create a robots.
To block Googlebot from indexing your page, allow crawling and add a noindex meta tag. Therefore, NVDA allows information about symbol pronunciation to be provided. This is done for a locale by providing a file named symbols. All locales implicitly inherit the symbol information for English, though any of this information can be overridden. 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. The ". Subsequent lines contain a textual identifier used to identify the symbol, a tab and the regular expression pattern for that symbol. For example:.
Again, the English symbols are inherited by all other locales, so you need not include any complex symbols already defined for English. The second section provides information about when and how to pronounce all symbols. It begins with the line:. 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:. 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.
This means that the " " character should be spoken as "left paren" only when the symbol level is set to most or higher; i. 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.
This line appears in the French symbols. It means that the ". 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.
This is also a good full example. Plugins allow you to customize the way NVDA behaves overall or within a particular application. They are able to:. This section provides an introduction to developing plugins. Developers should consult the code documentation for a complete reference. If you wish to improve NVDA's access to a particular application, it is most likely you will want to write an App Module. In contrast, if you wish to add some overall functionality to NVDA e. Both App Modules and Global Plugins share a common look and feel.
They are both Python source files with a. However, they do differ in some ways. This allows easy distribution, and provides a safe way for the user to install and uninstall the custom code. Please refer to the Add-ons section later on in this document. In order to test the code while developing, you can place it in a special 'scratchpad' directory in your NVDA user configuration directory.
The Advanced category also contains a button to easily open the Developer Scratchpad directory if enabled. The following few sections will talk separately about App Modules and Global Plugins. After this point, discussion is again more general.
App Module files have a. For example, an App Module for notepad would be called notepad. App Module files must be placed in the appModules subdirectory of an add-on, or of the scratchpad directory of the NVDA user configuration directory. This class can then define event and script methods, gesture bindings and other code. This will all be covered in depth later. This example shows you the basic layout of an App Module. Copy and paste the code between but not including the start and end markers into a new text file called notepad.
Be very careful to keep all tabs and spaces intact. Finally, open Notepad and move the focus around the application; e. You should hear beeps each time the focus changes. Note though that if you move outside of Notepad - for instance, to Windows Explorer - you do not hear beeps.
Inside this class, it defines 1 or more events, scripts or gesture bindings. The implementation of this event is not important for the purposes of this example. The most important part is the class itself. Events will be covered in greater detail later. As with other examples in this guide, remember to delete the created app module when you are finished testing and then restart NVDA or reload plugins, so that original functionality is restored.
Global Plugin files have a. Global plugin files must be placed in the globalPlugins subdirectory of an add-on, or of the scratchpad directory of the NVDA user configuration directory. This example is only to show you the basic layout of a Global Plugin. Copy and paste the code between but not including the start and end markers into a new text file with a name of example2. It also imports a few other modules, namely ui, versionInfo and scriptHandler, which this specific plugin needs in order for it to perform the necessary actions to announce the version.
Next, it defines a class called GlobalPlugin, which is inherited from globalPluginHandler. In this example, it defines a script method that performs the version announcement. However, the details of the script and its binding are not important for the purposes of this example. More information about scripts and the script decorator can be found in the Defining script properties section of this guide. As with other examples in this guide, remember to delete the created Global Plugin when finished testing and then restart NVDA or reload plugins, so that original functionality is restored.
These NVDA Objects contain standardised properties, such as name, role, value, states and description, which allow other parts of NVDA to query or present information about a control in a generalised way. Similarly, a checkbox with a label of "I agree" would have a name of "I agree", a role of checkbox, and if currently checked, a state of checked.
There are also a few simplified navigation properties such as simpleParent, simpleNext, simpleFirstChild and simpleLastChild. These are like their respective navigation properties described above, but NVDA filters out unuseful objects. These properties are used when NVDA's simple review mode is turned on, which is the default.
These simple properties may be easier to use, but the real navigation properties more closely reflect the underlying Operating System structure. Also, these may change in future versions of NVDA as improvements are made to simple review, so they should generally be avoided when programmatically locating specific objects. 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.
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. NVDA refers to these methods as scripts. As well as the actual script method, some form of gesture binding must be defined, so that NVDA knows what input should execute the script.
A gesture identifier string is a simple string representation of a piece of input. When NVDA receives input, it looks for a matching gesture binding in a particular order.
Some applications want to integrate with social providers like Facebook, but do not want to provide an option to login via these social providers. Adding Authenticator to a Flow Adding an Authenticator to a flow must be done in the admin console. The UserModel delegate parameter is the UserModel instance returned by your provider. The browser logs in at the external provider and is redirected back to the server. Google Play Billing. The Keycloak datasource is not an XA datasource.
Once a gesture binding is found, the script is executed and no further bindings are used, nore is that particular gesture passed on automatically to the Operating System. For NVDA In short, a decorator is a function that modifies the behavior of a particular function. The script decorator modifies the script in such a way that it will be properly bound to the desired gestures.
Furthermore, it ensures that the script is listed with the description you specify, and that it is categorised under the desired category in the input gestures dialog. In order for you to use the script decorator, you will have to import it from the scriptHandler module. After that, just above your script definition, add the script decorator, providing it the desired arguments. In this example, your script will be listed in the input gestures dialog under the "Miscellaneous" category.
Though the script decorator makes the script definition process a lot easier, there are more ways of binding gestures and setting script properties. You can also specify a description of the script in the function's docstring. Furthermore, an alternative way of specifying the script's category is by means of setting a "category" attribute on the script function to a string containing the name of the category.
Copy and paste the code between but not including the start and end markers into a new text file with a name of example3. When an event is handled, it is stopped from going further down the chain. However, code inside the event can choose to propagate it further if needed. These event methods take slightly different arguments depending at what level they are defined. Some events may take extra arguments, though this is quite rare. For an example of an event handled by an App Module, please refer to example 1 focus beeps in notepad.
App Modules have one very useful property called "sleepMode", which if set to true almost completely disables NVDA within that application. Sleep Mode is very useful for self voicing applications that have their own screen reading functionality, or perhaps even some games that need full use of the keyboard.
This is done by providing an App Module for that application which simply sets sleepMode to True in the AppModule class.
The following code can be copied and pasted in to a text file, then saved in the appModules directory with the name of the application you wish to enable sleep mode for. As always, the file must have a. This method allows you to place all the needed logic for a particular control altogether in one NVDA Object class for that control, rather than scattering code for many controls across a plugin's events.