i18n-runtime

Crates.ioi18n-runtime
lib.rsi18n-runtime
version0.1.0
created_at2025-09-22 10:25:07.94802+00
updated_at2025-09-22 10:25:07.94802+00
descriptionFast i18n runtime for Rust (phf-backed generated support)
homepage
repositoryhttps://github.com/sumitsharansatsangi/i18n-runtime
max_upload_size
id1849776
size18,686
Sumit Kumar (sumitsharansatsangi)

documentation

README

i18n-runtime** ๐ŸŽ‰


๐ŸŒ i18n-runtime

Effortless, fast, and type-safe internationalization (i18n) for Rust apps.
Supports both runtime JSON loading and compile-time PHF maps (when used with i18n-codegen).


โœจ Features

  • โœ… Runtime JSON mode โ€” load translations directly from locales/*.json
  • โšก Compile-time PHF mode โ€” use generated Rust maps for O(1) lookups
  • ๐Ÿ”„ Fallback logic โ€” handles tags like en-IN-BR โ†’ en-IN โ†’ en
  • ๐Ÿ” Type-safe keys โ€” auto-generated MessageKey enum
  • ๐Ÿš€ Zero-cost lookups โ€” powered by phf

๐Ÿ“ฆ Installation

Add to your Cargo.toml:

[dependencies]
i18n-runtime = "0.1"

# Only required if you use generated PHF mode
phf = "0.11"

๐Ÿš€ Quick Start

Runtime JSON mode

  1. Define messages.schema.json:
{
  "keys": ["welcome", "login_success", "login_failed"]
}
  1. Add a locale file locales/en.json:
{
  "welcome": "Welcome!",
  "login_success": "You have logged in successfully.",
  "login_failed": "Login failed. Please try again."
}
  1. Use it in code:
use i18n_runtime::{I18n, Locale};

fn main() -> anyhow::Result<()> {
    let i18n = I18n::from_json_dir("./locales", "en")?;

    let tags = ["en", "hi-IN", "fr"];
    for tag in &tags {
        let loc = Locale::new(tag);
        let msg = i18n.get_owned(&loc, "welcome").unwrap_or("<missing>".into());
        println!("{:<6} => {}", tag, msg);
    }

    Ok(())
}

Output:

en     => Welcome!
hi-IN  => เคธเฅเคตเคพเค—เคค เคนเฅˆ!
fr     => Welcome!

Generated PHF mode

  1. Install i18n-codegen:
cargo install i18n-codegen
  1. Run the generator:
i18n-codegen ./ ./src/generated_i18n

This creates:

src/generated_i18n/generated_keys.rs   # MessageKey enum
src/generated_i18n/locales/EN.rs       # en.json โ†’ phf::Map
src/generated_i18n/locales/HI_IN.rs    # hi-IN.json โ†’ phf::Map
src/generated_i18n/mod.rs              # registry
  1. Use in code:
// include generated files
include!("generated_i18n/generated_keys.rs");
mod generated_i18n { include!("generated_i18n/mod.rs"); }

use i18n_runtime::{I18n, Locale};

fn main() {
    let registry = generated_i18n::get_generated_registry();
    let i18n = I18n::from_generated_registry(registry, "en");

    let msg = i18n
        .get_by_str_key(&Locale::new("hi-IN"), MessageKey::Welcome.as_str())
        .unwrap();
    println!("{}", msg); // เคธเฅเคตเคพเค—เคค เคนเฅˆ!
}

๐Ÿ”„ Fallback Logic

en-IN-BR โ†’ en-IN โ†’ en โ†’ fallback locale.


๐Ÿงฉ Ecosystem


๐Ÿ“œ License

MIT


Commit count: 3

cargo fmt