Skip to content

Rust-native localization toolkit

Your localization layer shouldn't be the bottleneck.

Ferrocat brings Gettext PO workflows, ICU MessageFormat semantics, and JSON delivery into one Rust-native toolkit — with conformance evidence, benchmark discipline, and explicit architecture boundaries.

cargo add ferrocat

Why it's fast

Speed from structure, not shortcuts.

Every hot path in Ferrocat is Rust-native, byte-oriented, and shaped by profiling — not by porting legacy abstractions into a faster language.

Byte-oriented scanning

PO parsing operates directly on byte sequences. No intermediate string allocations on the critical path.

Borrowed & owned APIs

Zero-copy borrowed access for read-heavy workloads. Owned structures when you need to mutate.

Profiling-driven iteration

Performance claims backed by real profiling sessions and published benchmark fixtures — not guesswork.

Read the benchmark methodology

Three catalog modes

Storage and semantics stay explicit.

Classic Gettext

Storage
Gettext PO
Semantics
Gettext-compatible plurals

Stay close to traditional gettext catalogs and familiar msgid_plural workflows.

ICU-native PO

Storage
Gettext PO
Semantics
ICU MessageFormat

Keep translator-facing PO files while authoring richer ICU plural, select, and formatting messages.

ICU-native NDJSON

Storage
NDJSON
Semantics
ICU MessageFormat

JSON-friendly line-oriented storage for external systems and modern toolchains.

Proof, not vibes

Conformance and performance are part of the product surface.

55conformance casesupstream-derived
442assertionschecked by harness
3catalog modesexplicit combinations

Start here

Pick the path that matches your question.

Get started

Install, parse, serialize. Learn where the high-level catalog APIs fit.

Open

API surface

Choose between PO core, catalog workflows, and ICU helpers.

Open

Performance

Benchmark methodology, fixtures, and performance history.

Open

Architecture

ADRs and engineering notes behind semantic choices and hot paths.

Open

Ready to dig in?