Skip to content

Latest commit

 

History

History
124 lines (89 loc) · 3.03 KB

README_CN.md

File metadata and controls

124 lines (89 loc) · 3.03 KB

简体中文| English

crates.io Documentation

i18nify 是一款基于代码生成的 Rust 国际化库。

原仓库 https://github.com/davidpdrsn/i18n_codegenDavid Pedersen 实现的。然而它有一些老旧的依赖,并且已经长达 5 年不维护。

通过利用代码生成,我们能够防止代码中的拼写错误、缺少插值或各语言环境之间各种错误的常见问题。

添加

cargo add i18nify #default features=['json']

or add Cargo.toml:

i18nify = { version = "0.3", features = ["json"] } #json
i18nify = { version = "0.3", features = ["toml"] } #toml

使用方式

它需要一个目录(目录基于CARGO_MANIFEST_DIR),其中每个语言环境有一个 JSON 文件。以下是一个包含英语和汉语翻译的例子:

// tests/doc_locales/en.json
{
    "hello_world": "Hello, World!",
    "greeting": "Hello {name}"
}

// tests/doc_locales/da.json
{
    "hello_world": "你好,世界!",
    "greeting": "你好, {name}"
}

Rust 中:

use demo::Internationalize;

mod demo {
    use i18nify::I18N;
    #[derive(I18N)]
    #[i18n(folder = "tests/locales")]
    pub struct DocLocale;

}

fn main() {
    // 基于 Locale 枚举类型获取国际化文本
    let hello = demo::Locale::En.hello();
    assert_eq!("Hello, World!",hello);
    println!("{}",hello);

    // 基于 `DocLocale` 实现的`Internationalize` trait 获取国际化文本
    let hello = demo::DocLocale.da().hello();
    println!("{}",hello);
}

folder 路径可以使用环境变量,比如:

use demo::Internationalize;

mod demo {
    use i18nify::I18N;
    #[derive(I18N)]
    #[i18n(folder = "$CARGO_MANIFEST_DIR/tests/doc_locales")]
    pub struct DocLocale;
}

Axum 框架中使用

先定义一个 Internationalization trait 实现

use i18nify::{Internationalization, I18N};

    #[derive(I18N,Clone)]
    #[i18n(folder = "$CARGO_MANIFEST_DIR/tests/zh_locales")]
    pub struct DocLocale;

    impl Internationalization for DocLocale {
        type Item = Locale;

        fn i(&self,lang:&str)->Self::Item {
            match lang.to_lowercase().as_str() {
                "en"=> Locale::En,
                "zh-cn"=> Locale::ZhCn,
                _=> Locale::En,
            }
        }
    }

然后添加中间件I18nifyLayer

let app = Router::new()
        .route("/", get(root))
        .layer(I18nifyLayer::new(DocLocale, "en"));

最后在 handler 中就可以使用 Locale 获取国际化文本

async fn root(Extension(locale):Extension<Locale>) -> impl IntoResponse {
    locale.greeting() // 你好,世界
}

你可以在 <文档> 获取更多细节。