From d720fb8c70f42244efec6d3bc5f0e181320210ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E8=BF=90=E5=AE=B6?= Date: Thu, 31 Oct 2024 19:53:30 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96i18n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- i18n/src/lib.rs | 25 +++++++++++++------------ library/src/middleware/req_ctx.rs | 1 + server/src/lib.rs | 9 ++++++++- 3 files changed, 22 insertions(+), 13 deletions(-) diff --git a/i18n/src/lib.rs b/i18n/src/lib.rs index 61f54d0..646eb88 100644 --- a/i18n/src/lib.rs +++ b/i18n/src/lib.rs @@ -60,16 +60,20 @@ pub fn lang(lang_id: &str, message_id: MessageId) -> &'static str { /// 将模板消息转换为最终消息,支持模板占位符 pub fn convert_message_with_params(message_template: &'static str, args: Vec<&str>) -> String { + if message_template.is_empty() { + return String::new(); + } + if message_template.contains("{}") { let message_split_array: Vec<&str> = message_template.split("{}").collect(); - // tracing::info!("message_template: {:?}, args: {:?}", message_split_array, args); - let mut message = String::new(); - for (index, message_ele) in message_split_array.iter().enumerate() { - message += message_ele; - if index < args.len() && index != message_split_array.len() - 1 { - message += args[index]; - } - } + let capacity = message_template.len() + args.iter().map(|s| s.len()).sum::(); + let mut message = String::with_capacity(capacity); + + message_split_array.iter().zip(args.iter().chain(std::iter::once(&""))).for_each(|(part, arg)| { + message.push_str(part); + message.push_str(arg); + }); + message } else { String::from(message_template) @@ -86,10 +90,7 @@ macro_rules! message { ($lang_id:expr, $message_id:expr, $($arg:expr),*) => { { let message_template: &'static str = i18n::lang($lang_id, $message_id); - let mut args: Vec<&str> = vec![]; - $( - args.push($arg); - )* + let args = vec![$($arg),*]; i18n::convert_message_with_params(message_template, args) } }; diff --git a/library/src/middleware/req_ctx.rs b/library/src/middleware/req_ctx.rs index 1031b5c..1c7c641 100644 --- a/library/src/middleware/req_ctx.rs +++ b/library/src/middleware/req_ctx.rs @@ -8,6 +8,7 @@ use jsonwebtoken::{decode, DecodingKey, Validation}; use crate::{cache::inner_cache::LOGIN_ACCOUNT_CACHE, config, context::Context, model::response::ResErr, token::Claims, utils::request_util}; const WHITE_LIST: &[(&str, &str)] = &[ + ("GET", "/"), ("POST", "/account/sys"), ("POST", "/account/google"), ("GET", "/wechat/access_token"), diff --git a/server/src/lib.rs b/server/src/lib.rs index e605cdc..48a6477 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -2,6 +2,9 @@ use axum::{body::Body, extract::Request, http, routing::get, Router}; use library::{config, task}; use tower::ServiceBuilder; use tower_http::trace::TraceLayer; +use i18n::message; +use i18n::message_ids::MessageId; +use library::context::Context; mod controller; mod service; @@ -44,7 +47,7 @@ fn init() -> Router { // layer之间存在顺序依赖,勿改。layer执行顺序和配置顺序一致 // fallback路由放到最后,如果无匹配的路由,则不会执行layer,直接返回404 Router::new() - .route("/", get(|| async { "hello" })) + .route("/", get(hello)) .nest(&config!().server.prefix_url, auth) .layer( ServiceBuilder::new() @@ -63,4 +66,8 @@ fn init() -> Router { )) ) .fallback(|| async { (http::status::StatusCode::NOT_FOUND, "Not Found") }) +} + +pub async fn hello(context: Context) -> String { + message!(context.get_lang_tag(), MessageId::Hello, "川岳").to_string() } \ No newline at end of file