use std::process::exit; use mingling::macros::{gen_program, help}; pub mod res; pub mod tokio_wrapper; mod bucket_mgr; use bucket_mgr::*; mod error; use error::*; #[help] fn handle_error_dispatch_not_found(_err: ErrorDispatcherNotFound) { let help = locale::helps::Basic::help().trim(); // Print directly to stderr and exit with code 0 eprintln!("{}", help); exit(0) } gen_program!(); pub mod locale { shakehand::locale!("locales"); /// Determines the current locale string used by the application. /// /// The locale is resolved by checking environment variables in the following /// priority order: /// 1. `JV_LANG` — application-specific variable. /// 2. `APP_LANG` — general application language override. /// 3. `LANG` — system locale (e.g. `en_US.UTF-8`). If this variable contains a /// character encoding suffix (e.g. `.UTF-8`), only the base part is kept, /// and underscores (`_`) are replaced with hyphens (`-`) to form a /// language tag (e.g. `en-US`). /// 4. Falls back to `"en"` if none of the above are set. pub fn current_locales() -> String { if let Ok(lang) = std::env::var("JV_LANG") { return lang; } if let Ok(lang) = std::env::var("APP_LANG") { return lang; } if let Ok(lang) = std::env::var("LANG") { if let Some(base_lang) = lang.split('.').next() { return base_lang.replace('_', "-"); } return lang; } "en".to_string() } }