2 个不稳定版本
0.2.0 | 2020 年 6 月 1 日 |
---|---|
0.1.0 | 2020 年 2 月 11 日 |
#190 在 国际化(i18n) 中
每月 120 次下载
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