#rocket-web #language #rocket #multi-language #web #web-apps

rocket_lang

rocket_lang 为多语言火箭应用提供可配置的枚举类型

6 个版本

0.2.0 2022 年 7 月 12 日
0.1.2 2022 年 5 月 25 日
0.0.2 2022 年 3 月 16 日

#21 in #multi-language

Apache-2.0

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