blob: cf340fcfdf065fd07e6be4d80ee2aace897bb700 (
plain)
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
|
//! Traits required to provide environment driven data for [`Localization`](crate::Localization).
//!
//! Since [`Localization`](crate::Localization) is a long-lived structure,
//! the model in which the user provides ability for the system to react to changes
//! is by implementing the given environmental trait and triggering
//! [`Localization::on_change`](crate::Localization::on_change) method.
//!
//! At the moment just a single trait is provided, which allows the
//! environment to feed a selection of locales to be provided to the instance.
//!
//! The locales provided to [`Localization`](crate::Localization) should be
//! already negotiated to ensure that the resources in those locales
//! are available. The list should also be sorted according to the user
//! preference, as the order is significant for how [`Localization`](crate::Localization) performs
//! fallbacking.
use unic_langid::LanguageIdentifier;
/// A trait used to provide a selection of locales to be used by the
/// [`Localization`](crate::Localization) instance for runtime
/// locale fallbacking.
///
/// # Example
/// ```
/// use fluent_fallback::{Localization, env::LocalesProvider};
/// use fluent_resmgr::ResourceManager;
/// use unic_langid::LanguageIdentifier;
/// use std::{
/// rc::Rc,
/// cell::RefCell
/// };
///
/// #[derive(Clone)]
/// struct Env {
/// locales: Rc<RefCell<Vec<LanguageIdentifier>>>,
/// }
///
/// impl Env {
/// pub fn new(locales: Vec<LanguageIdentifier>) -> Self {
/// Self { locales: Rc::new(RefCell::new(locales)) }
/// }
///
/// pub fn set_locales(&mut self, new_locales: Vec<LanguageIdentifier>) {
/// let mut locales = self.locales.borrow_mut();
/// locales.clear();
/// locales.extend(new_locales);
/// }
/// }
///
/// impl LocalesProvider for Env {
/// type Iter = <Vec<LanguageIdentifier> as IntoIterator>::IntoIter;
/// fn locales(&self) -> Self::Iter {
/// self.locales.borrow().clone().into_iter()
/// }
/// }
///
/// let res_mgr = ResourceManager::new("./path/{locale}/".to_string());
///
/// let mut env = Env::new(vec![
/// "en-GB".parse().unwrap()
/// ]);
///
/// let mut loc = Localization::with_env(vec![], true, env.clone(), res_mgr);
///
/// env.set_locales(vec![
/// "de".parse().unwrap(),
/// "en-GB".parse().unwrap(),
/// ]);
///
/// loc.on_change();
///
/// // The next format call will attempt to localize to `de` first and
/// // fallback on `en-GB`.
/// ```
pub trait LocalesProvider {
type Iter: Iterator<Item = LanguageIdentifier>;
fn locales(&self) -> Self::Iter;
}
impl LocalesProvider for Vec<LanguageIdentifier> {
type Iter = <Vec<LanguageIdentifier> as IntoIterator>::IntoIter;
fn locales(&self) -> Self::Iter {
self.clone().into_iter()
}
}
|