nresx 1.0.0
dotnet tool install --global nresx --version 1.0.0
dotnet new tool-manifest
dotnet tool install --local nresx --version 1.0.0
#tool dotnet:?package=nresx&version=1.0.0
nuke :add-package nresx --version 1.0.0
nresx
One command-line tool for every localization file format. Read, write, convert, and validate translation resources across 13 formats, on Windows / Linux / macOS, from any shell.
# a translator sent back a .po - fold it into your app's locale files
nresx convert strings.uk.po -f json
# gate CI on localization health: drift, duplicates, untranslated entries
nresx validate "locales/strings.*.json" -r --warnings-as-errors
Why nresx
- Format-agnostic. po, json, yaml, Android, iOS, resx, xliff and more - one model, one command set, any-to-any conversion.
- CI-friendly by design. Deterministic output, documented
exit codes, errors on stderr,
validateas a drop-in pipeline gate. - Batch-first. Every command accepts wildcards and
-rto sweep whole directory trees in one call. - Scriptable and embeddable. The same operations from any shell (Windows /
Linux / macOS, no .NET visible once installed) or from C# via
nresx.Core- a singlenetstandard2.0build that runs everywhere from .NET Framework 4.6.1 to the latest .NET, Unity included.
Install
Standalone CLI binary
The nresx command-line tool as a single self-contained executable - nothing
to install first, no .NET required. Download, unzip, run. Grab it from the
latest release:
| Platform | Download |
|---|---|
| Windows (x64) | nresx-win-x64.zip |
| Linux (x64) | nresx-linux-x64.zip |
| macOS (Apple Silicon) | nresx-osx-arm64.zip |
After extracting, add the directory to your PATH so nresx is callable from any shell:
<details><summary>Windows</summary>
# Extract to C:\Tools\nresx, then:
[Environment]::SetEnvironmentVariable("Path", $env:Path + ";C:\Tools\nresx", "User")
# Restart your shell. Confirm:
nresx --version
</details>
<details><summary>Linux / macOS</summary>
# Extract to ~/.local/bin (already on PATH on most distros) or /usr/local/bin
unzip nresx-linux-x64.zip -d ~/.local/bin/
chmod +x ~/.local/bin/nresx
nresx --version
Linux runtime dependency: requires libicu (standard .NET globalization library). Most desktop distros (Ubuntu, Debian, Fedora) include it by default. On minimal containers / slim server images, install it:
# Debian / Ubuntu
sudo apt-get install -y libicu-dev
# Fedora / RHEL / Rocky
sudo dnf install -y libicu
# Alpine is not supported - the binary needs glibc, not musl
On macOS, Gatekeeper may quarantine the binary on first run. Remove the quarantine flag:
xattr -d com.apple.quarantine ~/.local/bin/nresx
</details>
CLI via dotnet tool
If you already have the .NET SDK:
dotnet tool install -g nresx
nresx --help
.NET library
The same engine as a package, for use from C# code:
dotnet add package nresx.Core
Planned channels
Coming with the 1.0 release: Chocolatey (choco install nresx) and
Scoop (scoop install nresx). Homebrew is planned for a later release.
Supported formats
Ordered roughly by ecosystem reach. Click the heading above for per-format details: what's preserved, what's lossy, and format-specific quirks. More formats are on the roadmap.
| Format | Extensions | Typical use |
|---|---|---|
| JSON | .json |
Web apps (i18next, vue-i18n) |
| .NET resx / resw | .resx .resw |
.NET / Windows apps |
| YAML | .yaml .yml |
Rails, config-style locales |
| Gettext PO | .po |
The classic translator format |
| Android strings | .xml |
Android apps |
| iOS strings | .strings |
iOS / macOS apps |
| Java properties | .properties |
Java apps |
| XLIFF 1.2 | .xlf .xliff |
Translation interchange standard |
| CSV / TSV | .csv .tsv |
Spreadsheets, translator exchange |
| Excel | .xlsx |
Translator-friendly handoff |
| Flutter ARB | .arb |
Flutter apps |
| INI | .ini |
Desktop / legacy config |
| Plain text | .txt |
Simple key=value lists |
Quick start
CLI
# Convert a single file into another format (placed next to the source)
nresx convert strings.po -f json
# Convert every .resx in the current directory tree into a .yaml sibling
nresx convert *.resx -f yaml -r
# Show format, culture, and element count for a file
nresx info strings.json
# Print every key=value pair (use -t to customize the row template)
nresx list strings.json
# Surface drift, duplicates, and empty entries across language siblings
# (non-zero exit on errors; --warnings-as-errors makes it strict)
nresx validate strings.*.json -r
Full command reference.
.NET library
using nresx.Core;
// Load
var file = new ResourceFile("strings.resx");
foreach (var element in file.Elements)
Console.WriteLine($"{element.Key} = {element.Value}");
// Mutate
file.Elements.Add("hello", "Hello, world!");
// Save as a different format
file.Save("strings.po", ResourceFormatType.Po);
Async overloads are available: ResourceFile.LoadAsync and file.SaveAsync
both accept a CancellationToken.
Docs
- Getting started - install, first conversions, library walkthrough.
- Command reference - every CLI command, flags, exit codes.
- Format reference - per-format roundtrip and quirks.
- API reference - full
nresx.CoreAPI. - Recipes - translator handoff, CI validation, batch ops.
- Worked examples - WinForms, web, and CI project shapes.
Feedback and contributing
- Found a bug? Open an issue.
- Question or idea? Start a discussion.
- Want to contribute a fix or feature? See CONTRIBUTING.md -
good first issuelabels mark approachable entry points.
License
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
This package has no dependencies.
| Version | Downloads | Last Updated |
|---|---|---|
| 1.0.0 | 105 | 7/7/2026 |