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
1
Subscribe to mailing lists
Subscribe to both mailing lists mentioned above to get help and advice from experienced translators.
2
Request translator access
Message the translators mailing list or info@nvaccess.org to request being added as a translator. Include:
- Your Crowdin username
- The languages you wish to translate
3
Set up translation tools
Choose your translation workflow:
- Crowdin web interface (for quick translations)
- Poedit desktop application (recommended for screen reader users)
4
Begin translating
Start with the NVDA interface messages (nvda.po), then move on to documentation and locale-specific files.
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
For detailed information on each file format:
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 info@nvaccess.org 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
1
Download Poedit
Download the latest Windows version from poedit.net/download.
2
Install Poedit
Follow the on-screen instructions. Default options are sufficient.
3
Locate NVDA l10n utility
The NVDA l10n utility is required for safely downloading and uploading translation files.Included with NVDA from 2025.1beta1 onwards:
- Installed copies:
c:\Program Files (x86)\nvda\l10nUtil.exe - Portable copies:
l10nUtil.exein the root directory
Workflow
1
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
2
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)
3
Upload translation file
After translating, upload the file back to Crowdin:Example:If you saved the original file:This uploads only your changes, preventing conflicts with other translators.
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: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
1
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)
2
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
3
Verify translations
Your translated messages should now be heard or brailled in your native language (if your synthesizer/braille display supports it).
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
1
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
2
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
3
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
4
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
5
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”
6
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: info@nvaccess.org
- General questions: Ask on the mailing list - experienced translators are happy to help!
