bevy_fluent/systems/parameters/
mod.rs1use crate::{exts::fluent::BundleExt, BundleAsset, Locale, Localization, ResourceAsset};
7use bevy::{asset::LoadedFolder, ecs::system::SystemParam, prelude::*};
8use std::{any::TypeId, collections::HashMap};
9
10#[derive(SystemParam)]
12pub struct LocalizationBuilder<'w> {
13 loaded_folders: Res<'w, Assets<LoadedFolder>>,
14 assets: Res<'w, Assets<BundleAsset>>,
15 locale: Res<'w, Locale>,
16}
17
18impl LocalizationBuilder<'_> {
19 pub fn build(&self, handle: &Handle<LoadedFolder>) -> Localization {
20 let mut localization = Localization::new();
21 if let Some(loaded_folder) = self.loaded_folders.get(handle) {
22 let locale_entries: HashMap<_, _> = loaded_folder
23 .handles
24 .iter()
25 .filter_map(|untyped_handle| {
26 if untyped_handle.type_id() != TypeId::of::<BundleAsset>() {
27 if untyped_handle.type_id() != TypeId::of::<ResourceAsset>() {
28 warn!(
29 r#""{:?}" locale folder contains not only `BundleAsset` or `ResourceAsset` "{:?}"."#,
30 handle.path(), untyped_handle.path()
31 );
32 }
33 return None;
34 }
35 let typed_handle = untyped_handle.clone().typed();
37 if let Some(asset) = self.assets.get(&typed_handle) {
38 Some((asset.locale(), Entry { handle: typed_handle, asset }))
39 } else {
40 error!(
41 "{:?} `BundleAsset` didn't receive.",
42 typed_handle.path(),
43 );
44 None
45 }
46 })
47 .collect();
48 let locales = self.locale.fallback_chain(locale_entries.keys().cloned());
49 for locale in locales {
50 localization.insert(&locale_entries[locale].handle, locale_entries[locale].asset);
51 }
52 } else {
53 error!("{:?} locale folder didn't load.", handle.path());
54 }
55 localization
56 }
57}
58
59struct Entry<'a> {
60 handle: Handle<BundleAsset>,
61 asset: &'a BundleAsset,
62}