#[macro_export]
macro_rules! te {
($id:expr $(,)?) => {{
let __i18n = $crate::use_i18n();
__i18n.try_translate($id)
}};
($id:expr, locale = $locale:expr $(,)?) => {{
let __i18n = $crate::use_i18n();
__i18n.try_translate_in($locale, $id)
}};
($id:expr, locale = $locale:expr, $($name:ident = $value:expr),+ $(,)?) => {{
let __i18n = $crate::use_i18n();
let __args = [$( (stringify!($name), ::std::string::ToString::to_string(&$value)) ),+];
__i18n.try_translate_kv_args_in($locale, $id, &__args)
}};
($id:expr, $($name:ident = $value:expr),+ $(,)?) => {{
let __i18n = $crate::use_i18n();
let __args = [$( (stringify!($name), ::std::string::ToString::to_string(&$value)) ),+];
__i18n.try_translate_kv_args($id, &__args)
}};
}
#[macro_export]
macro_rules! t {
($($all:tt)*) => {{
$crate::te!($($all)*).unwrap()
}};
}
#[macro_export]
macro_rules! tid {
($id:expr $(,)?) => {{
$crate::te!($id).unwrap_or_else(|_| ::std::string::ToString::to_string(&$id))
}};
($id:expr, locale = $locale:expr $(,)?) => {{
$crate::te!($id, locale = $locale)
.unwrap_or_else(|_| ::std::string::ToString::to_string(&$id))
}};
($id:expr, locale = $locale:expr, $($name:ident = $value:expr),+ $(,)?) => {{
$crate::te!($id, locale = $locale, $($name = $value),+)
.unwrap_or_else(|_| ::std::string::ToString::to_string(&$id))
}};
($id:expr, $($name:ident = $value:expr),+ $(,)?) => {{
$crate::te!($id, $($name = $value),+)
.unwrap_or_else(|_| ::std::string::ToString::to_string(&$id))
}};
}
#[cfg(test)]
mod tests {
use dioxus::dioxus_core::Runtime;
use dioxus::prelude::*;
use crate::I18nSession;
use crate::runtime::test_runtime;
#[test]
fn t_macro_reads_context_and_interpolates_named_arguments() {
let runtime = test_runtime();
let mut dom = VirtualDom::new(|| rsx! { div {} });
let _ = dom.rebuild_to_vec();
dom.in_scope(ScopeId::APP, || {
let i18n = I18nSession::new(runtime);
Runtime::current().provide_context(ScopeId::APP, i18n);
assert_eq!(crate::t!("welcome", name = "Dioxus"), "Hello, Dioxus!");
});
}
}