#编译时 #本地化 #fluent #检查 # #系统

i18n-embed-fl

宏,用于在使用 i18n-embed crate 和 fluent 本地化系统时进行编译时检查

22 个版本

0.9.1 2024 年 8 月 8 日
0.8.0 2024 年 2 月 1 日
0.7.0 2023 年 9 月 10 日
0.6.7 2023 年 5 月 16 日
0.2.0 2020 年 10 月 17 日

#61 in 国际化(i18n)

Download history 10927/week @ 2024-05-03 10904/week @ 2024-05-10 7776/week @ 2024-05-17 7561/week @ 2024-05-24 6463/week @ 2024-05-31 6405/week @ 2024-06-07 6009/week @ 2024-06-14 6725/week @ 2024-06-21 6644/week @ 2024-06-28 8849/week @ 2024-07-05 12276/week @ 2024-07-12 12540/week @ 2024-07-19 9034/week @ 2024-07-26 10428/week @ 2024-08-02 14020/week @ 2024-08-09 8385/week @ 2024-08-16

43,637 个月下载量
55 个 crate(16 个直接使用) 中使用

MIT 许可证

150KB
2.5K SLoC

i18n-embed-fl crates.io 徽章 docs.rs 徽章 许可证徽章 github actions 徽章

此 crate 提供了一个宏,用于在使用 i18n-embed crate 和 fluent 本地化系统时进行编译时检查。

请参阅 文档i18n-embed 了解更多信息。

变更日志

示例

在 crate 根目录中设置一个最小的 i18n.toml,以配合 cargo-i18n 使用(有关配置文件格式的更多信息,请参阅 cargo i18n

# (Required) The language identifier of the language used in the
# source code for gettext system, and the primary fallback language
# (for which all strings must be present) when using the fluent
# system.
fallback_language = "en-GB"

# Use the fluent localization system.
[fluent]
# (Required) The path to the assets directory.
# The paths inside the assets directory should be structured like so:
# `assets_dir/{language}/{domain}.ftl`
assets_dir = "i18n"

i18n/en-GB/{domain}.ftl中创建一个针对en-GB语言的流畅本地化文件,其中domain是您的crate的Rust路径(使用_代替-

hello-arg = Hello {$name}!

简单设置FluentLanguageLoader,并获得带有参数的消息格式

use i18n_embed::{
    fluent::{fluent_language_loader, FluentLanguageLoader},
    LanguageLoader,
};
use i18n_embed_fl::fl;
use rust_embed::RustEmbed;

#[derive(RustEmbed)]
#[folder = "i18n/"]
struct Localizations;

let loader: FluentLanguageLoader = fluent_language_loader!();
loader
    .load_languages(&Localizations, &[loader.fallback_language().clone()])
    .unwrap();

assert_eq!(
    "Hello \u{2068}Bob 23\u{2069}!",
    // Compile time check for message id, and the `name` argument,
    // to ensure it matches what is specified in the `fallback_language`'s
    // fluent resource file.
    fl!(loader, "hello-arg", name = format!("Bob {}", 23))
)

便利宏

您会注意到这个宏需要在每次调用中指定loader。对于您的项目,您可能可以访问一个静态定义的加载器,并且您可以创建一个便利宏包装器,这样就不需要每次都导入和指定。

macro_rules! fl {
    ($message_id:literal) => {{
        i18n_embed_fl::fl!($crate::YOUR_STATIC_LOADER, $message_id)
    }};

    ($message_id:literal, $($args:expr),*) => {{
        i18n_embed_fl::fl!($crate::YOUR_STATIC_LOADER, $message_id, $($args), *)
    }};
}

现在可以这样调用:fl!("message-id")fl!("message-id", args)fl!("message-id", arg = "value")

依赖项

约5–13MB
约130K SLoC