#rocket #static #multi-language #json-text #json

json-gettext

一个用于从JSON获取文本的库,通常用于国际化。

58个稳定版本

4.0.10 2023年12月10日
4.0.8 2023年11月3日
4.0.6 2023年9月9日
4.0.5 2022年11月2日
1.7.0 2018年10月15日

#21国际化(i18n)

Download history 3/week @ 2024-04-14 17/week @ 2024-04-21 5/week @ 2024-04-28 16/week @ 2024-05-19 1/week @ 2024-05-26 10/week @ 2024-06-02 152/week @ 2024-06-09 119/week @ 2024-06-16 163/week @ 2024-06-23 91/week @ 2024-06-30 178/week @ 2024-07-07 227/week @ 2024-07-14 79/week @ 2024-07-21 49/week @ 2024-07-28

533 每月下载量
3 个crates(2个直接) 中使用

MIT 许可证

79KB
2K SLoC

JSON Get Text

CI

这是一个用于从JSON获取文本的库,通常用于国际化。

示例

#[macro_use] extern crate json_gettext;

let ctx = static_json_gettext_build!(
    "en_US";
    "en_US" => "langs/en_US.json",
    "zh_TW" => "langs/zh_TW.json"
).unwrap();

assert_eq!("Hello, world!", get_text!(ctx, "hello").unwrap());
assert_eq!("哈囉,世界!", get_text!(ctx, "zh_TW", "hello").unwrap());

Rocket支持

这个crate支持Rocket框架。为了重新加载更改的json文件而不是重新编译程序,您必须为此crate启用rocket功能。

[dependencies.json-gettext]
version = "*"
features = ["rocket"]

然后,使用static_json_gettext_build_for_rocket宏代替static_json_gettext_build宏来构建一个JSONGetText(JSONGetTextManager)。

#[macro_use] extern crate json_gettext;

#[macro_use] extern crate rocket;

use rocket::State;
use rocket::response::Redirect;

use json_gettext::JSONGetTextManager;

#[get("/")]
fn index(ctx: &State<JSONGetTextManager>) -> Redirect {
    Redirect::temporary(uri!(hello(lang = ctx.get_default_key())))
}

#[get("/<lang>")]
fn hello(ctx: &State<JSONGetTextManager>, lang: String) -> String {
    format!("Ron: {}", get_text!(ctx, lang, "hello").unwrap().as_str().unwrap())
}

#[launch]
fn rocket() -> _ {
    rocket::build()
        .attach(static_json_gettext_build_for_rocket!(
            "en_US";
            "en_US" => "langs/en_US.json",
            "zh_TW" => "langs/zh_TW.json"
        ))
        .mount("/", routes![index, hello])
}

如果您不使用release配置文件,JSONGetTextManager可以在需要时自动重新加载json文件。

unic-langid 支持

由于字符串比较可能较慢,可以启用language_region_pair功能、language功能或region功能,将键的类型分别更改为(Language, Option<Region>)LanguageRegion,其中LanguageRegion结构体位于unic-langid crate中。

在这种情况下,key!宏将用于从字符串字面量生成Key实例。

例如,

[dependencies.json-gettext]
version = "*"
features = ["language_region_pair", "rocket"]
#[macro_use]
extern crate rocket;

#[macro_use]
extern crate rocket_accept_language;

#[macro_use]
extern crate json_gettext;

use rocket::State;

use rocket_accept_language::unic_langid::subtags::Language;
use rocket_accept_language::AcceptLanguage;

use json_gettext::{JSONGetTextManager, Key};

const LANGUAGE_EN: Language = language!("en");

#[get("/")]
fn index(ctx: &State<JSONGetTextManager>, accept_language: &AcceptLanguage) -> String {
    let (language, region) = accept_language.get_first_language_region().unwrap_or((LANGUAGE_EN, None));

    format!("Ron: {}", get_text!(ctx, Key(language, region), "hello").unwrap().as_str().unwrap())
}

#[launch]
fn rocket() -> _ {
    rocket::build()
        .attach(static_json_gettext_build_for_rocket!(
            key!("en");
            key!("en") => "langs/en_US.json",
            key!("zh_TW") => "langs/zh_TW.json",
        ))
        .mount("/", routes![index])
}

Crates.io

https://crates.io/crates/json-gettext

文档

https://docs.rs/json-gettext

许可证

MIT

依赖

~3–35MB
~535K SLoC