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();
}Subiecte conexe
Alte framework-uri
Get started
Localizează-ți serviciul Rust
Creează un proiect, publică prima limbă și citește-o din Rust prin HTTPS.