#[macro_export]
macro_rules! t {
($key:expr) => {{
$crate::__t_inner!($key, None, &[], None)
}};
($key:expr, locale = $locale:expr) => {{
$crate::__t_inner!($key, Some($locale), &[], None)
}};
($key:expr, count = $count:expr) => {{
$crate::__t_inner!($key, None, &[], Some($count))
}};
($key:expr, locale = $locale:expr, count = $count:expr) => {{
$crate::__t_inner!($key, Some($locale), &[], Some($count))
}};
($key:expr, $($name:ident = $value:expr),+ $(,)?) => {{
let args: Vec<(&str, String)> = vec![
$((stringify!($name), ($value).to_string())),+
];
let mut locale_opt: Option<&str> = None;
let mut count_opt: Option<i64> = None;
let mut filtered: Vec<(&str, &str)> = Vec::new();
for (k, v) in &args {
match *k {
"locale" => locale_opt = Some(v.as_str()),
"count" => count_opt = Some(v.parse::<i64>().unwrap_or(0)),
_ => filtered.push((*k, v.as_str())),
}
}
$crate::__t_inner!(
$key,
locale_opt,
&filtered,
count_opt
)
}};
}
#[macro_export]
macro_rules! __t_inner {
($key:expr, $locale:expr, $args:expr, $count:expr) => {{
let i18n = $crate::global();
match i18n {
Some(i18n) => {
let locale = $locale
.map(|l: &str| l.to_string())
.or_else(|| $crate::task_locale())
.unwrap_or_else(|| i18n.default_locale().to_string());
i18n.translate($key, &locale, $args, $count)
}
None => $key.to_string(),
}
}};
}