While we are working on NZBGet project all the time, we still would really like and need help on many areas:
- Major - code contributions on features and bugs
- Improvements in tests
- Improvements on documentation
We entice our users to participate in the project, please don't hesitate to get involved - create a new issue or pull request - that would also greatly help if you'll share your usage experience.
Main documentation is available on the NZBGet.com website - https://nzbget.com/documentation/
NZBGet natively supports for multiple platforms and build options, so each platform has their own development documenation, including:
mainis a protected branch that contains only release codedevelopis a protected branch for development- new branches should follow the following convention:
hotfix/brief-descriptionfor any small hotfixesfeature/brief-descriptionfor any new developmentsbugfix/brief-descriptionfor bugs
- For PRs targeting
developbranchSquash and mergemode must be used. - After merging branch to
develop, branch must be deleted. - For release PR (
develop->main)Create a merge commitmode must be used. - After merging
develop->main, must be back mergemain->developbefore any changes indevelopbranch.
This flow results to the fact that in the PR to master branch we see only the squashed commits that correspond to the PRs in the develop branch in current release cycle.
After the release has been published (from the main branch), the minor version in the develop branch should be increased so that subsequent test builds are a higher version than the release.
List of files to change version:
- CMakeLists.txt -
projectblock - osx/NZBGet-Info.plist -
CFBundleShortVersionStringblock
The WebUI uses a client-side i18n system with JSON translation files.
webui/
locales.source.json — Source of truth: all translation keys with English text and translator descriptions
i18n.js — Runtime engine: loads translations, applies them via data-i18n attributes
_locales/
de/messages.json — Per-language translation files
fr/messages.json
...
> **Note:** Files under `_locales/` are auto-generated by the translation
> management process. Do **not** edit them manually — any changes will be
> overwritten. All translation work should be done in `locales.source.json`
> (new keys) or through the translation platform (existing keys).
-
Add a
data-i18nattribute to the HTML element:<span data-i18n="my_new_key"></span>
For titles, placeholders, values, or HTML content:
<input data-i18n-title="my_tooltip_key"> <input data-i18n-placeholder="my_placeholder_key"> <div data-i18n-html="my_html_key"></div>
-
If the message has dynamic parts, use
$1,$2placeholders:<span data-i18n="my_key" data-i18n-arg-1="42"></span>
-
Add the key to
webui/locales.source.json:"my_new_key": { "message": "Default English text with $1 placeholder", "description": "Brief description for translators" }
-
If the key describes a configuration option (e.g.,
MainDir), rungenerate_conf_locales.pyto regenerateconfig_desc_*entries:python3 scripts/generate_conf_locales.py nzbget.conf webui/locales.source.json -
Translations for non-English languages are managed through an external platform/process and stored in
webui/_locales/<code>/messages.json. These files are auto-generated — never edit them directly. Missing keys fall back to English automatically.
| Prefix | Used for |
|---|---|
col_ |
Table column headers |
btn_ |
Button labels |
status_ |
Status labels |
label_ |
General labels and badges |
desc_ |
Descriptions and tooltips |
config_desc_ |
Auto-generated config option descriptions |
Use snake_case and keep keys short but descriptive.
i18n.jsloadslocales.source.json— English becomes the base translation.- Detects the browser language or reads a saved preference from
localStorage. - If non-English, fetches
_locales/<code>/messages.jsonand merges it on top of English. - Calls
I18n.translatePage()which scans the DOM fordata-i18nattributes and replaces content accordingly.