use std::borrow::Cow; use std::iter::FromIterator;
usecrate::types::FluentValue;
/// Fluent messages can use arguments in order to programmatically add values to a /// translated string. For instance, in a localized application you may wish to display /// a user's email count. This could be done with the following message. /// /// `msg-key = Hello, { $user }. You have { $emailCount } messages.` /// /// Here `$user` and `$emailCount` are the arguments, which can be filled with values. /// /// The [`FluentArgs`] struct is the map from the argument name (for example `$user`) to /// the argument value (for example "John".) The logic to apply these to write these /// to messages is elsewhere, this struct just stores the value. /// /// # Example /// /// ``` /// use fluent_bundle::{FluentArgs, FluentBundle, FluentResource}; /// /// let mut args = FluentArgs::new(); /// args.set("user", "John"); /// args.set("emailCount", 5); /// /// let res = FluentResource::try_new(r#" /// /// msg-key = Hello, { $user }. You have { $emailCount } messages. /// /// "#.to_string()) /// .expect("Failed to parse FTL."); /// /// let mut bundle = FluentBundle::default(); /// /// // For this example, we'll turn on BiDi support. /// // Please, be careful when doing it, it's a risky move. /// bundle.set_use_isolating(false); /// /// bundle.add_resource(res) /// .expect("Failed to add a resource."); /// /// let mut err = vec![]; /// /// let msg = bundle.get_message("msg-key") /// .expect("Failed to retrieve a message."); /// let value = msg.value() /// .expect("Failed to retrieve a value."); /// /// assert_eq!( /// bundle.format_pattern(value, Some(&args), &mut err), /// "Hello, John. You have 5 messages." /// ); /// ``` #[derive(Debug, Default)] pubstruct FluentArgs<'args>(Vec<(Cow<'args, str>, FluentValue<'args>)>);
impl<'args> FluentArgs<'args> { /// Creates a new empty argument map. pubfn new() -> Self { Self::default()
}
/// Iterate over a tuple of the key an [`FluentValue`]. pubfn iter(&self) -> impl Iterator<Item = (&str, &FluentValue)> { self.0.iter().map(|(k, v)| (k.as_ref(), v))
}
}
impl<'args, K, V> FromIterator<(K, V)> for FluentArgs<'args> where
K: Into<Cow<'args, str>>,
V: Into<FluentValue<'args>>,
{ fn from_iter<I>(iter: I) -> Self where
I: IntoIterator<Item = (K, V)>,
{ let iter = iter.into_iter(); letmut args = iflet Some(size) = iter.size_hint().1 {
FluentArgs::with_capacity(size)
} else {
FluentArgs::new()
};
for (k, v) in iter {
args.set(k, v);
}
args
}
}
impl<'args> IntoIterator for FluentArgs<'args> { type Item = (Cow<'args, str>, FluentValue<'args>); type IntoIter = std::vec::IntoIter<Self::Item>;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.