Rust
Rust 국제화
Better I18N 크레이트는 없습니다. Rust 서비스는 모든 SDK와 동일한 CDN JSON을 읽습니다. reqwest와 serde_json이면 충분하며, 새 문구는 재빌드 없이 반영됩니다.
Setup
Rust에서 Better I18N 사용하기
HTTP와 JSON 크레이트 추가
reqwest와 serde_json이면 됩니다 — 설치할 Better I18N 크레이트는 없습니다.
Cargo.toml
[dependencies]
reqwest = { version = "0.12", features = ["json"] }
serde_json = "1"
tokio = { version = "1", features = ["full"] }네임스페이스 가져오기
CDN은 네임스페이스와 로케일마다 JSON 파일 하나를 제공하며 항상 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
}백그라운드에서 갱신
맵을 프로세스 내에 캡시하고 CDN의 max-age에 맞춰 60초마다 다시 읽으세요.
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
Rust 서비스가 얻는 것
SDK가 필요 없습니다 — Rust 크레이트도 없으므로 기다릴 것도 없습니다
HTTPS로 전송되는 순수 JSON, serde_json으로 파싱
axum, actix-web, Rocket 또는 일반 바이너리에서 동작
새 문구는 재빌드 없이 약 60초 안에 도착합니다
CDN이 담지 못하는 부분은 REST API가 채웁니다
로컬 카탈로그에 rust-i18n을 이미 쓰고 있다면 나란히 함께 쓸 수 있습니다
Example
CDN 메시지를 읽는 axum 핸들러
메시지는 RwLock 뒤에 저장되며 타이머로 갱신됩니다.
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();
}다른 프레임워크
Get started
Rust 서비스를 현지화하세요
프로젝트를 만들고 첫 로케일을 발행한 뒤 Rust에서 HTTPS로 읽으세요.