nresx 1.0.0

dotnet tool install --global nresx --version 1.0.0
                    
This package contains a .NET tool you can call from the shell/command line.
dotnet new tool-manifest
                    
if you are setting up this repo
dotnet tool install --local nresx --version 1.0.0
                    
This package contains a .NET tool you can call from the shell/command line.
#tool dotnet:?package=nresx&version=1.0.0
                    
nuke :add-package nresx --version 1.0.0
                    

nresx

CI NuGet: nresx CLI NuGet: nresx.Core License: MIT

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, validate as a drop-in pipeline gate.
  • Batch-first. Every command accepts wildcards and -r to 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 single netstandard2.0 build 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

Feedback and contributing

License

MIT

Product 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

This package has no dependencies.

Version Downloads Last Updated
1.0.0 105 7/7/2026