bevy_fluent/resources/
locale.rs1use bevy::prelude::*;
2use fluent_langneg::{negotiate_languages, NegotiationStrategy};
3use std::slice::from_ref;
4use unic_langid::LanguageIdentifier;
5
6#[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}