2 个不稳定版本

0.2.0 2020 年 6 月 1 日
0.1.0 2020 年 2 月 11 日

#190国际化(i18n)

Download history 29/week @ 2024-03-12 17/week @ 2024-03-19 15/week @ 2024-03-26 54/week @ 2024-04-02 48/week @ 2024-04-09 5/week @ 2024-04-16 40/week @ 2024-04-23 49/week @ 2024-05-07 1/week @ 2024-05-14 1/week @ 2024-05-21 2/week @ 2024-05-28 45/week @ 2024-06-04 38/week @ 2024-06-11 13/week @ 2024-06-18 22/week @ 2024-06-25

每月 120 次下载

MIT 许可证

11KB
113

ctl10n

ctl10n(编译时本地化)提供了一种简单的方法,可以将消息嵌入到二进制文件中,而无需将它们嵌入到源代码中。内部,ctl10n 从提供的包含字符串的 TOML 文件生成一个简单的 macro_rules!tr!()

基本用法

将 ctl10n 添加到您的 build-dependencies 中的 Cargo.toml。如果您想使用 include_strings,则需要将其添加到 dependencies 中。

[package]
name = "example"
version = "0.1"
edition = "2018"

[build-dependencies]
ctl10n = "0.1.0"

[dependencies]
ctl10n = "0.1.0"

将以下内容添加到您的 build.rs

use ctl10n;

fn main() {
    println!("cargo:rerun-if-changed=build.rs");
    println!("cargo:rerun-if-changed=strings.toml");
    if let Err(err) = ctl10n::convert_default_strings_file() {
        panic!("{}", err);
    }
}

这将从 strings.toml 生成文件 $OUT_DIR/strings.rs。包含字符串的 TOML 文件必须是一个表,其中所有值都是字符串。例如 strings.toml

message = "Some message"
message-with-args = "Some message with {arg}"

您应该在某个地方(例如,在 lib.rs)包含 strings.rs 以使用生成的宏。您可以通过调用宏 ctl10n::include_strings!() 或手动,使用 include!() 来做这件事。包含宏后,可以使用它,如下所示

use ctl10n;

ctl10n::include_strings!();

fn main() {
    // `tr!()` with one argument will be translated to string literal
    println!(tr!("message"));
    println!(tr!("message-with-args"), arg = "foobar");
    // `tr!()` with multiple arguments will be translated to formatted `&String`
    println!("{}", tr!("message-with-args", arg = "foobaz"))
}

此代码的输出(假设 strings.toml 如上所示)

Some message
Some message with foobar
Some message with foobaz

尝试使用未知密钥或格式错误的参数会导致编译时错误。

多语言环境

您可以使用环境变量在编译时提供不同的语言环境

use ctl10n;
use std::env;

fn main() {
    println!("cargo:rerun-if-changed=build.rs");
    println!("cargo:rerun-if-changed=locales/*.toml");
    if let Err(err) = ctl10n::convert_strings_file(
        format!(
            "locales/{}.toml",
            &env::var("LOCALE").unwrap_or("en".to_string())
        ),
        "strings.rs",
    ) {
        panic!("{}", err);
    }
}

LOCALE=de cargo build

依赖关系

~255–560KB
~12K SLoC