10 个不稳定版本 (3 个破坏性更新)
0.4.0 | 2024年8月8日 |
---|---|
0.3.2 | 2024年8月8日 |
0.2.4 | 2024年6月6日 |
0.2.1 | 2024年5月28日 |
0.1.0 | 2024年5月24日 |
50 在 国际化(i18n)
683 每月下载
14KB
193 行
fluent-static
Fluent-static 是一个 Rust 库,旨在从 Fluent 本地化捆绑包中生成静态类型函数绑定。这允许在编译时验证本地化消息的使用,从而提高国际化代码库的可靠性和可维护性。
功能
- 编译时验证:在编译时捕获本地化消息使用错误,促进多语言项目中的可靠性。
- 自动函数生成:动态地将 Fluent 消息转换为 Rust 函数,无需在本地化文件更改时手动更新。
- 易于集成:在标准 Rust 构建环境中无缝工作,配置简单。
先决条件
在开始之前,请确保您的计算机上已安装最新的稳定版本的 Rust。此项目使用需要 Rust 2021 版本或更高版本的特性。
安装
将以下内容添加到您的 Cargo.toml
文件中
[dependencies]
fluent-static = "*"
[build-dependencies]
fluent-static-codegen = "*"
使用方法
要将 fluent-static
集成到您的 Rust 项目中,请按照以下步骤操作
步骤 1:Fluent 资源
Fluent 资源应遵循命名约定:<resources_root>/<language_id>/<bundle_name>.ftl
,例如 l10n/en-US/messages.ftl
步骤 2:配置代码生成器
如果您的项目根目录中没有 build.rs
文件,请创建一个,并使用以下模板生成您的 Fluent 资源的 Rust 绑定
use fluent_static_codegen::{generate, FunctionPerMessageCodeGenerator};
use std::{env, fs, path::Path};
pub fn main() {
let src = generate("./l10n/", FunctionPerMessageCodeGenerator::new("en-US"))
.expect("Error generating message bindings");
let out_dir = env::var("OUT_DIR").expect("OUT_DIR not set");
let destination = Path::new(&out_dir).join("l10n.rs");
fs::write(destination, src).expect("Error writing generated sources");
}
有关 fluent-static-codegen
中代码生成的更多详细信息 README
步骤 3:访问生成的函数
您现在可以在主应用程序或其他模块中使用生成的函数
fn main() {
println!("{}", l10n::messages::hello("en", "World!").unwrap());
}
mod l10n {
include!(concat!(env!("OUT_DIR"), "/l10n.rs"));
}
集成
Axum
启用 axum
功能,并在任何 Axum 处理器中使用 fluent_static::axum::RequestLanguage
提取器访问 l10n 消息,以最少的样板代码
fluent-static = { version = "*", features = [ "axum" ] }
use axum::{routing::get, Router};
use fluent_static::axum::RequestLanguage;
use maud::{html, Markup};
#[tokio::main]
async fn main() {
let app = Router::new().route("/", get(hello_l10n));
let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
axum::serve(listener, app).await.unwrap();
}
async fn hello_l10n(RequestLanguage(msgs): RequestLanguage<l10n::messages::MessagesBundle>) -> String {
let name = "Guest";
format!("l10n: {}", msgs.hello(name).unwrap())
}
mod l10n {
include!(concat!(env!("OUT_DIR"), "/l10n.rs"));
}
贡献
欢迎贡献!请随时提交拉取请求、报告错误和建议功能,通过问题跟踪器进行。
许可协议
本项目采用MIT许可协议。请按照许可协议条件自由使用、修改和分发。
依赖项
约1.5–2.8MB
约55K SLoC