#编译时 #地区 #语言 #github #com

i18n-find-locale

一个简单的Rust编译时国际化实现

1 个不稳定版本

0.1.0 2021年6月3日

#195国际化(i18n)


2 个包 使用

MIT 许可协议

3KB

i18n-rs

Crates.io Lines Crates.io docs.rs rust-reportcard dependency status

一个简单的Rust编译时国际化实现。

这是一个个人项目。如果您需要稳定且功能强大的国际化库,您可能需要 fluent

如果您认为这个包不好用,我找到了另一个类似的包: https://github.com/terry90/internationalization-rs

使用

在crates.io上,这个包的名字是 simple-i18n,因为 i18n-rs 的名字已被一个空包占用。...

simple-i18n = "0.1" 添加到 Cargo.toml

示例

查看 i18n-example

cd examples/i18n-example
LOCALE_PATH=locale cargo run --package i18n-example --bin i18n-example

文档

docs.rs

仓库

i18n-rs 将在编译期间将您的地区文件(toml、json或yaml)加载到代码中。然后您可以使用 lang!(切换地区)并使用 i18n 来获取文本。

LOCALE_PATH

使用 LOCALE_PATH 环境变量来查找您的地区文件。

请注意,由于依赖库在编译时无法获取您实际运行构建命令的当前路径,因此实际上最安全的方法是使用绝对路径。

通常我们会将地区文件存储在项目根目录下的 locale 目录中,并将 LOCALE_PATH 设置为 locale

当前行为是

i18n-rs 将在 OUT_DIR./ 中查找 ${workspace_root}/$LOCALE_PATH,使用 cargo metadata

换句话说,如果 LOCALE_PATH 是相对路径,它应该基于项目的 workspace_root,而不是用户的当前路径。

最好在项目根目录下运行构建命令。

区域文件

区域文件支持 jsontomlyaml

可以使用单个文件或使用文件夹。如果是单个文件,语言代码是文件名。

如果是文件夹,文件夹名是语言代码,子文件夹和文件名将用作字段名。

可以在文件名前添加 . 以避免成为字段名。

内容将被展平,键将与 . 连接起来成为字段名。

示例

{
    "words": {
        "greetings": {
            "hi": "Hi!"
        }
    }
}

相等

{
    "words.greetings.hi": "Hi!"
}

严格和宽松

默认情况下,将使用严格检查。

在宽松模式下,如果您尝试获取不存在的字段或不存在区域,将返回该字段本身。

但严格模式将检查您的输入是否在 lang!i18n! 中,以确保您正在使用所有区域中存在的现有区域和字段。

如果出现错误,将会 panic!

不用担心,所有这些都将在编译时进行检查,因此严格检查几乎不会影响运行时性能,并且在运行时不会发生panic。

注意:因为它需要在编译时进行检查,所以在严格模式下必须使用字符串字面量。

幸运的是,我们可以自由地在宽松模式和严格模式之间切换。例如 i18n!("xxx.x"; loose)

基准测试

strict contrast/no strict
                        time:   [29.048 ns 29.387 ns 29.736 ns]
                        change: [-15.897% -13.053% -10.253%] (p = 0.00 < 0.05)
                        Performance has improved.
Found 1 outliers among 100 measurements (1.00%)
  1 (1.00%) high mild
  
strict contrast/strict  time:   [29.108 ns 29.431 ns 29.776 ns]
                        change: [-2.6412% -0.8426% +1.0984%] (p = 0.38 > 0.05)
                        No change in performance detected.
Found 4 outliers among 100 measurements (4.00%)
  2 (2.00%) high mild
  2 (2.00%) high severe

change_lang             time:   [148.38 ns 159.76 ns 178.01 ns]
                        change: [+0.4039% +4.5240% +10.326%] (p = 0.05 > 0.05)
                        No change in performance detected.
Found 5 outliers among 100 measurements (5.00%)
  3 (3.00%) high mild
  2 (2.00%) high severe

无运行时依赖