Fluent Templates 使用教程
项目介绍
Fluent Templates 是一个 Rust 库,旨在简化 Rust 应用程序或库中的本地化集成。它通过提供一个高层次的“加载器”API,使得加载和管理本地化资源变得非常容易。Fluent Templates 支持多种模板引擎,如 Tera 和 Handlebars,并且可以自动处理语言标识符和资源映射。
项目快速启动
安装
首先,在 Cargo.toml
文件中添加 Fluent Templates 依赖:
[dependencies]
fluent-templates = "*"
基本使用
以下是一个简单的示例,展示如何在 Rust 项目中使用 Fluent Templates:
use fluent_templates::{static_loader, FluentLoader};
use once_cell::sync::Lazy;
static_loader! {
static LOCALES = {
locales: "/tests/locales",
fallback_language: "en-US",
// 移除参数周围的 Unicode 隔离标记
customize: |bundle| bundle.set_use_isolating(false),
};
}
fn main() {
let mut tera = tera::Tera::default();
let ctx = tera::Context::default();
tera.register_function("fluent", FluentLoader::new(&*LOCALES));
assert_eq!(
"Hello World",
tera.render_str(r#"[[ fluent(key="hello-world", lang="en-US") ]]"#, &ctx).unwrap()
);
assert_eq!(
"Hello Alice",
tera.render_str(r#"[[ fluent(key="greeting", lang="en-US", name="Alice") ]]"#, &ctx).unwrap()
);
}
应用案例和最佳实践
多语言支持
Fluent Templates 支持多语言环境,可以轻松管理不同语言的本地化资源。以下是一个多语言支持的示例:
static_loader! {
static LOCALES = {
locales: "/tests/locales",
fallback_language: "en-US",
customize: |bundle| bundle.set_use_isolating(false),
};
}
fn main() {
let mut tera = tera::Tera::default();
let ctx = tera::Context::default();
tera.register_function("fluent", FluentLoader::new(&*LOCALES));
// 英语
assert_eq!(
"Hello World",
tera.render_str(r#"[[ fluent(key="hello-world", lang="en-US") ]]"#, &ctx).unwrap()
);
// 法语
assert_eq!(
"Bonjour le monde",
tera.render_str(r#"[[ fluent(key="hello-world", lang="fr") ]]"#, &ctx).unwrap()
);
}
动态资源加载
Fluent Templates 支持动态加载本地化资源,可以在运行时根据需要加载不同的资源文件:
use fluent_bundle::FluentResource;
use fluent_templates::static_loader;
use once_cell::sync::Lazy;
static_loader! {
static LOCALES = {
locales: "/tests/locales",
fallback_language: "en-US",
customize: |bundle| {
// 动态加载资源
let ftl_string = String::from("-crate-version = 1.0.0");
let resource = FluentResource::try_new(ftl_string).unwrap();
bundle.add_resource(&resource);
},
};
}
fn main() {
let mut tera = tera::Tera::default();
let ctx = tera::Context::default();
tera.register_function("fluent", FluentLoader::new(&*LOCALES));
assert_eq!(
"1.0.0",
tera.render_str(r#"[[ fluent(key="-crate-version", lang="en-US") ]]"#, &ctx).unwrap()
);
}