6 个版本
0.2.0 | 2022 年 7 月 12 日 |
---|---|
0.1.2 | 2022 年 5 月 25 日 |
0.0.2 | 2022 年 3 月 16 日 |
#21 in #multi-language
30KB
579 代码行数(不含注释)
火箭语言
rocket_lang 为多语言火箭应用提供可配置的枚举类型。
LangCode
与 ISO 639-1 代码标准对应的请求守卫。使用示例
#[get("/some-path/")]
fn some_path(lang: LangCode) -> Template {
// we can now choose which template to display
// based of the user's language preference
let path = format!("home/{}", LangCode);
Template::render(path, json!({}))
}
Config
可以使用 Config
结构来配置枚举的行为,该结构可以附加到火箭实例上。如果不使用它,守卫默认为英语。
accept_language
如果语言解析的首选方法是 HTTP accept-language 标头,则可以设置每个语言的品质如下
let config = Config::new();
let config[Es] = 1.0;
let config[En] = 0.5;
url
守卫也可以配置为从路径中的固定位置提取语言代码
/// takes the language code from the last path segment:
let config = Config::new().url(-1);
这样可以从位置 URL 段中检索语言代码。
#[get("see-lang/<_>")]
fn see_lang(lang: LangCode) -> &'static str {
lang.as_str()
}
custom
如果前面的任何方法都不适合您的需求,您还可以使用闭包从请求中创建语言代码
let config = Config::custom(|req: &Request|{
let lang = from_url(req)?;
Ok(lang)
});
可组合
其他请求守卫可以消费其 API 中的结构。最值得注意的是,它可以通过外国结构返回多语言错误消息。
use rocket_lang::Error;
// here the error message displayed by
// `Unauthorized` will automatically suit the callers configuration.
#[get("/unauthorized")]
fn unauthorized() -> Unauthorized {
Unauthorized
}
// A possible implementation of `Unauthorized`
impl<'r, 'o: 'r> Responder<'r, 'o> for Unauthorized {
fn respond_to(self, request: &'r Request<'_>) -> rocket::response::Result<'o> {
let lang: LangCode = request
.try_into()
.map_err(|x: Error| x.status())?;
let msg = match lang {
LangCode::Es => "No autorizado",
LangCode::Fr => "Non autorisé",
LangCode::Ge => "Nicht autorisiert",
_ => "Unauthorized",
};
msg.respond_to(request)
}
}
依赖
~18–52MB
~840K SLoC