#本地化 #fluent #生成静态

fluent-static

自动从 Fluent 消息文件生成 Rust 函数,以实现 Rust 应用程序中的流畅本地化

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)

Download history 72/week @ 2024-05-18 299/week @ 2024-05-25 368/week @ 2024-06-01 47/week @ 2024-06-08 4/week @ 2024-06-15 6/week @ 2024-07-27 568/week @ 2024-08-03 109/week @ 2024-08-10

683 每月下载

MIT 许可证

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