Files
todo-baggins/dioxus-i18n/src/i18n_macro.rs
2026-01-28 23:07:07 +01:00

102 lines
3.0 KiB
Rust

//! Key translation macros.
//!
//! Using file:
//!
//! ```ftl
//! # en-US.ftl
//! #
//! hello = Hello, {$name}!
//! ```
/// Translate message from key, returning [`crate::prelude::DioxusI18nError`] if id not found...
///
/// ```rust
/// # use dioxus::prelude::*;
/// # use dioxus_i18n::{te, prelude::*};
/// # use unic_langid::langid;
/// # #[component]
/// # fn Example() -> Element {
/// # let lang = langid!("en-US");
/// # let config = I18nConfig::new(lang.clone()).with_locale((lang.clone(), "hello = Hello, {$name}")).with_fallback(lang.clone());
/// # let mut i18n = use_init_i18n(|| config);
/// let name = "Avery Gigglesworth";
/// let hi = te!("hello", name: {name}).expect("message id 'name' should be present");
/// assert_eq!(hi, "Hello, Avery Gigglesworth");
/// # rsx! { "" }
/// # }
/// ```
///
#[macro_export]
macro_rules! te {
($id:expr, $( $name:ident : $value:expr ),* ) => {
{
let mut params_map = $crate::fluent::FluentArgs::new();
$(
params_map.set(stringify!($name), $value);
)*
$crate::prelude::i18n().try_translate_with_args($id, Some(&params_map))
}
};
($id:expr ) => {{
$crate::prelude::i18n().try_translate($id)
}};
}
/// Translate message from key, panic! if id not found...
///
/// ```rust
/// # use dioxus::prelude::*;
/// # use dioxus_i18n::{t, prelude::*};
/// # use unic_langid::langid;
/// # #[component]
/// # fn Example() -> Element {
/// # let lang = langid!("en-US");
/// # let config = I18nConfig::new(lang.clone()).with_locale((lang.clone(), "hello = Hello, {$name}")).with_fallback(lang.clone());
/// # let mut i18n = use_init_i18n(|| config);
/// let name = "Avery Gigglesworth";
/// let hi = t!("hello", name: {name});
/// assert_eq!(hi, "Hello, Avery Gigglesworth");
/// # rsx! { "" }
/// # }
/// ```
///
#[macro_export]
macro_rules! t {
($id:expr, $( $name:ident : $value:expr ),* ) => {
$crate::te!($id, $( $name : $value ),*).unwrap_or_else(|e| panic!("{}", e.to_string()))
};
($id:expr ) => {{
$crate::te!($id).unwrap_or_else(|e| panic!("{}", e.to_string()))
}};
}
/// Translate message from key, return id if no translation found...
///
/// ```rust
/// # use dioxus::prelude::*;
/// # use dioxus_i18n::{tid, prelude::*};
/// # use unic_langid::langid;
/// # #[component]
/// # fn Example() -> Element {
/// # let lang = langid!("en-US");
/// # let config = I18nConfig::new(lang.clone()).with_locale((lang.clone(), "hello = Hello, {$name}")).with_fallback(lang.clone());
/// # let mut i18n = use_init_i18n(|| config);
/// let message = tid!("no-key");
/// assert_eq!(message, "message-id: no-key should be translated");
/// # rsx! { "" }
/// # }
/// ```
///
#[macro_export]
macro_rules! tid {
($id:expr, $( $name:ident : $value:expr ),* ) => {
$crate::te!($id, $( $name : $value ),*).unwrap_or_else(|e| e.to_string())
};
($id:expr ) => {{
$crate::te!($id).unwrap_or_else(|e| e.to_string())
}};
}