bevy_fluent/resources/
locale.rs

1use bevy::prelude::*;
2use fluent_langneg::{negotiate_languages, NegotiationStrategy};
3use std::slice::from_ref;
4use unic_langid::LanguageIdentifier;
5
6/// Locale
7#[derive(Clone, Debug, Default, Resource)]
8pub struct Locale {
9    pub requested: LanguageIdentifier,
10    pub default: Option<LanguageIdentifier>,
11}
12
13impl Locale {
14    pub fn new(locale: LanguageIdentifier) -> Self {
15        Self {
16            requested: locale,
17            default: None,
18        }
19    }
20
21    pub fn with_default(mut self, locale: LanguageIdentifier) -> Self {
22        self.default = Some(locale);
23        self
24    }
25
26    pub fn fallback_chain<'a, I>(&'a self, locales: I) -> Vec<&'a LanguageIdentifier>
27    where
28        I: Iterator<Item = &'a LanguageIdentifier>,
29    {
30        let available = &locales.collect::<Vec<_>>();
31        let default = self.default.as_ref();
32        let requested = from_ref(&self.requested);
33        let supported = negotiate_languages(
34            requested,
35            available,
36            default.as_ref(),
37            NegotiationStrategy::Filtering,
38        );
39        debug!(
40            requested = ?requested.iter().map(|locale| format!("{locale}")).collect::<Vec<_>>(),
41            available = ?available.iter().map(|locale| format!("{locale}")).collect::<Vec<_>>(),
42            default = ?default.map(|locale| format!("{locale}")),
43            supported = ?supported.iter().map(|locale| format!("{locale}")).collect::<Vec<_>>(),
44        );
45        supported.into_iter().copied().collect()
46    }
47}