Treceți la conținut
Rust

Rust i18n

Nu există un crate Better I18N. Un serviciu Rust citește același JSON din CDN pe care îl citește orice SDK — reqwest și serde_json sunt suficiente, iar textele noi apar fără rebuild.

Setup

Folosește Better I18N din Rust

Adaugă crate-urile HTTP și JSON

reqwest și serde_json sunt suficiente — nu există niciun crate Better I18N de instalat.

Cargo.toml
[dependencies]
reqwest = { version = "0.12", features = ["json"] }
serde_json = "1"
tokio = { version = "1", features = ["full"] }

Preia un namespace

CDN-ul servește un fișier JSON per namespace și limbă și răspunde întotdeauna 200.

src/i18n.rs
use std::collections::HashMap;

/// The CDN serves one JSON file per namespace, per locale:
///   https://cdn.better-i18n.com/{org}/{project}/{locale}/{namespace}.json
/// It always answers 200 — an unknown locale returns `{}` rather than an error.
pub async fn fetch_messages(
    locale: &str,
    namespace: &str,
) -> reqwest::Result<HashMap<String, serde_json::Value>> {
    let url = format!(
        "https://cdn.better-i18n.com/your-org/your-project/{locale}/{namespace}.json"
    );

    reqwest::get(&url).await?.json().await
}

Împrospătează în fundal

Păstrează harta în cache în proces și recitește-o la fiecare 60 de secunde, ca max-age-ul CDN-ului.

src/main.rs
use std::time::Duration;

// Cache in process and re-read on an interval: the CDN sets
// `Cache-Control: max-age=60`, so a 60s refresh matches it exactly.
tokio::spawn(async move {
    let mut ticker = tokio::time::interval(Duration::from_secs(60));
    loop {
        ticker.tick().await;
        if let Ok(next) = fetch_messages("en", "common").await {
            *messages.write().await = next;
        }
    }
});
Capabilities

Ce obțin serviciile Rust

Niciun SDK necesar — și nu există niciun crate Rust, deci nu ai ce aștepta
JSON simplu prin HTTPS, parsat cu serde_json
Funcționează cu axum, actix-web, Rocket sau un binar simplu
Textele noi ajung în aproximativ 60 de secunde, fără rebuild
API-ul REST acoperă tot ce nu acoperă CDN-ul
Stă alături de rust-i18n dacă îl folosești deja pentru cataloage locale
Example

Un handler axum care citește mesaje din CDN

Mesajele stau în spatele unui RwLock și sunt împrospătate pe un timer.

use axum::{extract::State, routing::get, Json, Router};
use std::{collections::HashMap, sync::Arc};
use tokio::sync::RwLock;

type Messages = Arc<RwLock<HashMap<String, serde_json::Value>>>;

async fn greeting(State(messages): State<Messages>) -> Json<serde_json::Value> {
    let messages = messages.read().await;

    let hello = messages
        .get("greeting.hello")
        .and_then(|v| v.as_str())
        .unwrap_or("Hello");

    Json(serde_json::json!({ "message": hello }))
}

#[tokio::main]
async fn main() {
    let messages: Messages = Arc::new(RwLock::new(
        fetch_messages("en", "common").await.unwrap_or_default(),
    ));

    let app = Router::new()
        .route("/greeting", get(greeting))
        .with_state(messages);

    let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
    axum::serve(listener, app).await.unwrap();
}

Alte framework-uri

Get started

Localizează-ți serviciul Rust

Creează un proiect, publică prima limbă și citește-o din Rust prin HTTPS.