Rust I18n 使用教程
rust-i18nA better and simply I18n crate for Rust.项目地址:https://gitcode.com/gh_mirrors/ru/rust-i18n
项目介绍
Rust I18n 是一个用于 Rust 项目的国际化(i18n)库。它允许开发者通过 YAML、JSON 或 TOML 文件加载本地化文本,并在编译时将这些映射转换为 Rust 程序可读的数据。Rust I18n 的目标是提供一个简单易用的 API,其设计灵感来源于 ruby-i18n 和 Rails I18n。
项目快速启动
安装
首先,在 Cargo.toml
文件中添加 Rust I18n 依赖:
[dependencies]
rust_i18n = "3.1.1"
配置
在项目根目录下创建一个 locales
目录,并添加一些 YAML 文件,例如 en.yml
和 zh.yml
:
# en.yml
hello: "Hello, world!"
# zh.yml
hello: "你好,世界!"
初始化
在 main.rs
或 lib.rs
中初始化 Rust I18n:
use rust_i18n::{i18n, t};
i18n!("locales");
fn main() {
rust_i18n::set_locale("en");
println!("{}", t!("hello")); // 输出: Hello, world!
rust_i18n::set_locale("zh");
println!("{}", t!("hello")); // 输出: 你好,世界!
}
应用案例和最佳实践
动态加载翻译
Rust I18n 支持从远程 URL 动态加载翻译文件:
use std::collections::HashMap;
use rust_i18n::Backend;
pub struct RemoteI18n {
trs: HashMap<String, HashMap<String, String>>,
}
impl RemoteI18n {
fn new() -> Self {
// 从远程 URL 获取翻译
let response = reqwest::blocking::get("https://your-host.com/assets/locales.yml").unwrap();
let trs = serde_yaml::from_str::<HashMap<String, HashMap<String, String>>>(&response.text().unwrap()).unwrap();
Self { trs }
}
}
impl Backend for RemoteI18n {
fn available_locales(&self) -> Vec<&str> {
self.trs.keys().map(|k| k.as_str()).collect()
}
fn translate(&self, locale: &str, key: &str) -> Option<&str> {
self.trs.get(locale)?.get(key).map(|s| s.as_str())
}
}
使用命令行工具
Rust I18n 提供了一个命令行工具 cargo i18n
,用于检查和提取未翻译的文本到 YAML 文件中:
cargo i18n --translate "Hello world"
典型生态项目
Rust I18n 可以与其他 Rust 生态项目结合使用,例如:
- Actix-web: 在 Actix-web 项目中使用 Rust I18n 进行国际化处理。
- Rocket: 在 Rocket 框架中集成 Rust I18n 以支持多语言。
- Serde: 使用 Serde 进行序列化和反序列化,与 Rust I18n 结合处理复杂的数据结构。
通过这些生态项目的结合,可以构建出功能丰富且易于维护的国际化 Rust 应用。
rust-i18nA better and simply I18n crate for Rust.项目地址:https://gitcode.com/gh_mirrors/ru/rust-i18n