优化i18n

This commit is contained in:
李运家 2024-10-31 19:53:30 +08:00
parent baccd91c50
commit d720fb8c70
3 changed files with 22 additions and 13 deletions

View File

@ -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 { 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("{}") { if message_template.contains("{}") {
let message_split_array: Vec<&str> = message_template.split("{}").collect(); let message_split_array: Vec<&str> = message_template.split("{}").collect();
// tracing::info!("message_template: {:?}, args: {:?}", message_split_array, args); let capacity = message_template.len() + args.iter().map(|s| s.len()).sum::<usize>();
let mut message = String::new(); let mut message = String::with_capacity(capacity);
for (index, message_ele) in message_split_array.iter().enumerate() {
message += message_ele; message_split_array.iter().zip(args.iter().chain(std::iter::once(&""))).for_each(|(part, arg)| {
if index < args.len() && index != message_split_array.len() - 1 { message.push_str(part);
message += args[index]; message.push_str(arg);
} });
}
message message
} else { } else {
String::from(message_template) String::from(message_template)
@ -86,10 +90,7 @@ macro_rules! message {
($lang_id:expr, $message_id:expr, $($arg:expr),*) => { ($lang_id:expr, $message_id:expr, $($arg:expr),*) => {
{ {
let message_template: &'static str = i18n::lang($lang_id, $message_id); let message_template: &'static str = i18n::lang($lang_id, $message_id);
let mut args: Vec<&str> = vec![]; let args = vec![$($arg),*];
$(
args.push($arg);
)*
i18n::convert_message_with_params(message_template, args) i18n::convert_message_with_params(message_template, args)
} }
}; };

View File

@ -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}; use crate::{cache::inner_cache::LOGIN_ACCOUNT_CACHE, config, context::Context, model::response::ResErr, token::Claims, utils::request_util};
const WHITE_LIST: &[(&str, &str)] = &[ const WHITE_LIST: &[(&str, &str)] = &[
("GET", "/"),
("POST", "/account/sys"), ("POST", "/account/sys"),
("POST", "/account/google"), ("POST", "/account/google"),
("GET", "/wechat/access_token"), ("GET", "/wechat/access_token"),

View File

@ -2,6 +2,9 @@ use axum::{body::Body, extract::Request, http, routing::get, Router};
use library::{config, task}; use library::{config, task};
use tower::ServiceBuilder; use tower::ServiceBuilder;
use tower_http::trace::TraceLayer; use tower_http::trace::TraceLayer;
use i18n::message;
use i18n::message_ids::MessageId;
use library::context::Context;
mod controller; mod controller;
mod service; mod service;
@ -44,7 +47,7 @@ fn init() -> Router {
// layer之间存在顺序依赖勿改。layer执行顺序和配置顺序一致 // layer之间存在顺序依赖勿改。layer执行顺序和配置顺序一致
// fallback路由放到最后如果无匹配的路由则不会执行layer直接返回404 // fallback路由放到最后如果无匹配的路由则不会执行layer直接返回404
Router::new() Router::new()
.route("/", get(|| async { "hello" })) .route("/", get(hello))
.nest(&config!().server.prefix_url, auth) .nest(&config!().server.prefix_url, auth)
.layer( .layer(
ServiceBuilder::new() ServiceBuilder::new()
@ -63,4 +66,8 @@ fn init() -> Router {
)) ))
) )
.fallback(|| async { (http::status::StatusCode::NOT_FOUND, "Not Found") }) .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()
} }