#编译时 #地域 #语言 #加载 #i18n-rs

i18n-macro

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

4个版本

0.1.3 2021年6月10日
0.1.2 2021年6月7日
0.1.1 2021年6月5日
0.1.0 2021年6月3日

#地域标签下排名第65

每月下载26
用于simple-i18n

MIT许可证

15KB
344

i18n-rs

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

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

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

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

使用

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

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 将在 ${workspace_root}/$LOCALE_PATH 中查找 OUT_DIR./,使用 cargo metadata 来完成。

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

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

区域文件

区域文件支持 jsontomlyaml

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

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

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

内容将被扁平化,键将与 . 一起链接,成为字段名。

示例

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

equal

{
    "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

依赖项

~4MB
~89K SLoC