|
|
|
@ -15,7 +15,7 @@ You should have received a copy of the GNU General Public License along with Lum
|
|
|
|
|
//! The Fluent class makes it easier to load translation bundles with language fallbacks and to go
|
|
|
|
|
//! through the most common steps of translating a message.
|
|
|
|
|
//!
|
|
|
|
|
use fluent::{FluentArgs, FluentBundle, FluentError, FluentResource};
|
|
|
|
|
use fluent_bundle::{bundle::FluentBundle, FluentArgs, FluentError, FluentResource};
|
|
|
|
|
use fluent_syntax::parser::ParserError;
|
|
|
|
|
use std::collections::hash_map::Entry;
|
|
|
|
|
use std::collections::HashMap;
|
|
|
|
@ -103,7 +103,14 @@ impl From<FromUtf8Error> for Error {
|
|
|
|
|
#[derive(Clone, Default)]
|
|
|
|
|
pub struct FluentErgo {
|
|
|
|
|
languages: Vec<LanguageIdentifier>,
|
|
|
|
|
bundles: Arc<RwLock<HashMap<LanguageIdentifier, FluentBundle<FluentResource>>>>,
|
|
|
|
|
bundles: Arc<
|
|
|
|
|
RwLock<
|
|
|
|
|
HashMap<
|
|
|
|
|
LanguageIdentifier,
|
|
|
|
|
FluentBundle<FluentResource, intl_memoizer::concurrent::IntlLangMemoizer>,
|
|
|
|
|
>,
|
|
|
|
|
>,
|
|
|
|
|
>,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl fmt::Debug for FluentErgo {
|
|
|
|
@ -167,7 +174,10 @@ impl FluentErgo {
|
|
|
|
|
bundle.add_resource(res).map_err(|err| Error::from(err))
|
|
|
|
|
}
|
|
|
|
|
Entry::Vacant(e) => {
|
|
|
|
|
let mut bundle = FluentBundle::new(vec![lang]);
|
|
|
|
|
let mut bundle: FluentBundle<
|
|
|
|
|
FluentResource,
|
|
|
|
|
intl_memoizer::concurrent::IntlLangMemoizer,
|
|
|
|
|
> = FluentBundle::new_concurrent(vec![lang]);
|
|
|
|
|
bundle.add_resource(res).map_err(|err| Error::from(err))?;
|
|
|
|
|
e.insert(bundle);
|
|
|
|
|
Ok(())
|
|
|
|
@ -220,14 +230,14 @@ impl FluentErgo {
|
|
|
|
|
/// A typical call with arguments would look like this:
|
|
|
|
|
///
|
|
|
|
|
/// ```
|
|
|
|
|
/// use fluent::{FluentArgs, FluentValue};
|
|
|
|
|
/// use fluent_bundle::{FluentArgs, FluentValue};
|
|
|
|
|
///
|
|
|
|
|
/// let eo_id = "eo".parse::<unic_langid::LanguageIdentifier>().unwrap();
|
|
|
|
|
/// let en_id = "en-US".parse::<unic_langid::LanguageIdentifier>().unwrap();
|
|
|
|
|
///
|
|
|
|
|
/// let mut fluent = fluent_ergonomics::FluentErgo::new(&[eo_id, en_id]);
|
|
|
|
|
/// let mut args = FluentArgs::new();
|
|
|
|
|
/// args.insert("value", FluentValue::from("15"));
|
|
|
|
|
/// args.set("value", FluentValue::from("15"));
|
|
|
|
|
/// let r = fluent.tr("length-without-label", Some(&args));
|
|
|
|
|
/// ```
|
|
|
|
|
///
|
|
|
|
@ -257,7 +267,7 @@ impl FluentErgo {
|
|
|
|
|
|
|
|
|
|
fn tr_(
|
|
|
|
|
&self,
|
|
|
|
|
bundle: &FluentBundle<FluentResource>,
|
|
|
|
|
bundle: &FluentBundle<FluentResource, intl_memoizer::concurrent::IntlLangMemoizer>,
|
|
|
|
|
msgid: &str,
|
|
|
|
|
args: Option<&FluentArgs>,
|
|
|
|
|
) -> Option<String> {
|
|
|
|
@ -287,7 +297,7 @@ impl FluentErgo {
|
|
|
|
|
#[cfg(test)]
|
|
|
|
|
mod tests {
|
|
|
|
|
use super::FluentErgo;
|
|
|
|
|
use fluent::{FluentArgs, FluentValue};
|
|
|
|
|
use fluent_bundle::{FluentArgs, FluentValue};
|
|
|
|
|
use unic_langid::LanguageIdentifier;
|
|
|
|
|
|
|
|
|
|
const EN_TRANSLATIONS: &'static str = "
|
|
|
|
|