To support multiple languages, NVDA must be translated and locale-specific data must be provided. This guide will walk you through the entire process.
Getting Started
Join the Translation Community
Subscribe to these mailing lists:- NVDA localisation mailing list (read-only)
- Monitors changes to symbols and character description files
- Low traffic, only important updates
- NVDA translations mailing list
- General conversations regarding translations
- Ask questions and connect with other translators
- Receive reminders before releases
Important Dates
A reminder will be posted on the translation mailing list giving two weeks notice of the translation string freeze. Work submitted after this date will not be included in the upcoming release. For more information, see the Release Process page.Check Translation Status
View Crowdin for an up-to-date report on translation status for all languages.Translation Workflows
NVDA translation is split between two platforms:Crowdin
For NVDA interface and user documentation:
- nvda.po (interface messages)
- userGuide.xliff (User Guide)
- changes.xliff (What’s New document)
GitHub
For locale-specific data:
- characterDescriptions.dic
- symbols.dic
- gestures.ini
Starting a New Localization
Subscribe to mailing lists
Subscribe to both mailing lists mentioned above to get help and advice from experienced translators.
Request translator access
Message the translators mailing list or [email protected] to request being added as a translator. Include:
- Your Crowdin username
- The languages you wish to translate
Set up translation tools
Choose your translation workflow:
- Crowdin web interface (for quick translations)
- Poedit desktop application (recommended for screen reader users)
Improving an Existing Localization
If you want to help with an existing translation:- Contact the existing maintainer - Discuss your suggestions and changes
- Agree on translations - Work together on the best terms and translations to use
- Request maintainer status - If a language is no longer maintained, you can request to become the new maintainer via the mailing list
Files to be Localized
| File | Description | Platform | Required |
|---|---|---|---|
| nvda.po | NVDA’s interface messages | Crowdin | Yes |
| characterDescriptions.dic | Names of characters in your language | GitHub | Yes |
| symbols.dic | Names of symbols and punctuation | GitHub | Yes |
| userGuide.xliff | The User Guide | Crowdin | Recommended |
| gestures.ini | Remapping of gestures for your language | GitHub | Optional |
| changes.xliff | List of changes between releases | Crowdin | Optional |
| Add-ons | Optional features users can install | External | Optional |
Translating with Crowdin
Crowdin is used for the main NVDA interface and user documentation.Creating a Crowdin Account
- Create a Crowdin account
- Message the translators mailing list or [email protected] to request translator access
- Include your Crowdin username and languages you wish to translate
Two Crowdin Workflows
- Crowdin Web Interface
- Poedit Desktop App
Translate strings directly in your browser.Pros:
- Quick and convenient
- No software to install
- Real-time collaboration
- May be inefficient for screen reader users
- Accessibility limitations
Due to accessibility issues, the translation approvals feature has been disabled in the NVDA project on Crowdin. All new strings are essentially auto-approved, but only translators specifically added to the project can add or change strings.
Translating with Poedit
Poedit is a desktop application commonly used for translations. It’s fairly accessible and used by many blind and vision impaired translators.Setting Up Poedit
Download Poedit
Download the latest Windows version from poedit.net/download.
Workflow
Download translation file
Use NVDA’s l10n utility to download the translation file:Example:The first time, you’ll be asked for an authorization token:
- Visit your Crowdin settings API page
- Create a Personal Access Token with at least the translations scope
- Paste it into the prompt
- It will be saved in
~/.nvda_crowdinfor future use
Translate with Poedit
Open the downloaded .po or .xliff file in Poedit:
- You’ll see a list of all strings to translate
- Status bar shows: translated, untranslated, and fuzzy strings
- Fuzzy strings are auto-translated and may be wrong
- NVDA beeps on untranslated or fuzzy messages
- Braille displays show a star for untranslatable messages
control+b- Copy original string to translation fieldcontrol+s- Save your workcontrol+shift+a- View automatic comments (translator context)
Translating the NVDA Interface
Download the Interface File
- Crowdin web interface: Find “NVDA interface messages” file
- Poedit workflow: Download as
nvda.po
Understanding Message Formatting
Messages may contain formatting strings:| Format | Meaning | Example |
|---|---|---|
%d | Digit | %d percent → “25 percent” |
%s | String | subject: %s → “subject: Important” |
%.2f | Float | %.2f seconds → “5.25 seconds” |
{keyword} | Variable | {color} on {backgroundColor} |
Shortcut Keys with Ampersands
Example:&Rate
The letter following & becomes a shortcut key. You can place the ampersand anywhere in your translation:
- English:
&Rate(shortcut: R) - French:
&Vitesse(shortcut: V)
Plural Forms
Languages have different plural forms: English (2 forms):- Singular: “with %s item”
- Plural: “with %s items”
- Zero, One, Two, Few, Many, Other
- Move to previous object from edit box:
NVDA+numpad4(desktop) orNVDA+shift+leftArrow(laptop) - Activate tab:
NVDA+numpadEnter(desktop) orNVDA+enter(laptop)
Testing Interface Translation
Copy the .mo file
After saving in Poedit, copy Where:
nvda.mo to:nvdadir= NVDA installation directorylangcode= ISO 639-1 language code (e.g.,en,es,fr)
Change NVDA language
- Restart NVDA
- Go to NVDA menu → Preferences → General Settings (or
NVDA+control+g) - Select your language from the list
- Restart when prompted
Corrupted Translations
Incorrect formatting strings can cause NVDA to misbehave or crash. Protection measures:- Poedit + l10n utility: Validates translations before upload
- Crowdin web interface: Detects some problems (shows as QA issues)
- Pre-merge validation: Translations are checked before inclusion in NVDA builds
Subscribe to the NVDA localisation mailing list to be notified about errors in interface translations. Error messages start with affected languages, e.g., “[ab, cd_EF]: Errors in interface translations”.
Translating User Documentation
Documentation available for translation:- userGuide.xliff - The NVDA User Guide
- changes.xliff - The What’s New document
- Crowdin web interface (locate the file and translate directly), or
- Poedit workflow (download, translate, upload)
Understanding Markdown in Documentation
The English documentation is written in markdown. The xliff file contains translatable content from that markdown file. What’s excluded:- Blank lines
- Hidden table header rows
- Structural lines without translatable content
- Line: Original line number in markdown
- Prefix: Structural markdown before content
- Suffix: Structural markdown after content
- Links:
[link text](url) - Code:
`code`or`` - Table columns:
|
Verifying Documentation Translation
Generate HTML from your xliff file to verify formatting:Translating on GitHub
Symbols, character descriptions, and gestures are translated via GitHub pull requests.Staying Updated
- gestures.ini
- symbols.dic and characterDescriptions.dic
Check the latest beta’s changes for any new gestures added.
Translation Process
Be notified of changes
Receive notification via:
- Mailing list (for symbols and character descriptions)
- Beta release notes (for gestures)
- Lines prefixed with
+are additions - Lines prefixed with
-are removals - Lines prefixed with
@@show location of changes
Find the file on GitHub
Navigate to your language’s directory:Replace
{lang} with your language code (e.g., en, fr, es).Find the file you need to edit:symbols.diccharacterDescriptions.dicgestures.ini
Create file if needed
If the file doesn’t exist, create it using the “add file” button:
- characterDescriptions.dic: Copy desired contents from English example
- symbols.dic: Copy desired contents from English example
- gestures.ini: Start with an empty file, add gestures as needed
Edit the file
- Tab to the “edit file” button
- First time: GitHub will ask you to fork the repository - click “Fork this repository”
- Important: Ensure indentation uses tabs, not spaces
- Press
NVDA+spaceto switch to browse mode - Press
shift+cuntil you reach the “Indent mode” combo-box - Press
enterto activate - Press
downArrowto select “Tabs” - Press
NVDA+spacefor browse mode, theneto return to editor - Press
enterto focus the editor
Submit your changes
- Press
control+sor click “commit changes” button - Update commit message: “Update [filename] for [language]”
- Press “Propose changes”
- New window opens with your proposal
- Feel free to ignore or delete the large template description
- Press “Create pull request”
Await feedback
NV Access will:
- Review your changes
- Provide feedback if needed
- Merge when approved
- Notify you when merged
File Format Details
For detailed technical information about each file format:- characterDescriptions.dic: Developer Guide - Character Descriptions
- symbols.dic: Developer Guide - Symbol Pronunciation
- gestures.ini: Developer Guide - Translating Gestures
Getting Help
If you need assistance with translation:- Email: NVDA translations mailing list
- Technical issues: [email protected]
- General questions: Ask on the mailing list - experienced translators are happy to help!
