1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
/// Translate and content formatting.
///
/// ## Example
///
/// Assume that translate file are as follows:
///
/// ```json
/// {
/// "Hello, {}": "Hello, {}",
/// "birthday": {
/// "Hello, {}": "Happy birthday, {}"
/// }
/// }
/// ```
///
/// [`tr`] will work like:
///
/// ```ignore
/// let name = "ho-229";
/// assert_eq!("Hello, ho-229", r18::tr!("Hello, {}", name));
/// assert_eq!("Hello, ho-229", r18::tr!([""] "Hello, {}", name));
/// assert_eq!("Happy birthday, ho-229", r18::tr!([".birthday"] "Hello, {}", name));
/// ```
#[macro_export]
macro_rules! tr {
($content:expr) => {
r18::translate("", $content)
};
($content:expr, $($arg:expr),+) => {{
use r18::{Format, SimpleCurlyFormat};
SimpleCurlyFormat.format(r18::translate("", $content), &[$($arg),+])
.unwrap_or_default()
}};
([$prefix:expr] $content:expr) => {
r18::translate($prefix, $content)
};
([$prefix:expr] $content:expr, $($arg:expr),+) => {{
use r18::{Format, SimpleCurlyFormat};
SimpleCurlyFormat.format(r18::translate($prefix, $content), &[$($arg),+])
.unwrap_or_default()
}};
}
/// Sets the current locale.
///
/// If the input language tag is invalid or not translated,
/// the translation will be disabled.
///
/// ## Example
///
/// ```ignore
/// r18::set_locale!("zh-CN"); // assume the zh-CN has been translated
/// assert_eq!(Some("zh-CN"), r18::locale!());
/// r18::set_locale!("");
/// assert_eq!(None, r18::locale!());
/// ```
#[macro_export]
#[allow(clippy::crate_in_macro_def)]
macro_rules! set_locale {
($locale:expr) => {
// this function is generated by r18::init
crate::__r18_gen::set_locale($locale)
};
}
/// Returns the current locale.
#[macro_export]
macro_rules! locale {
() => {
$crate::CURRENT_LOCALE
.lock()
.unwrap()
.as_ref()
.map(|l| l.name)
};
}
/// Automatically sets the current locale.
#[macro_export]
macro_rules! auto_detect {
() => {
r18::get_locale().map(|l| r18::set_locale!(l))
};
}