Fix i18n::list_localization scanning the filesystem on each call

This commit is contained in:
Benoît du Garreau 2021-01-03 19:19:28 +01:00
parent 1358a5d40c
commit 09e38e085c

View File

@ -247,24 +247,38 @@ impl assets::Compound for Localization {
}
}
/// Load all the available languages located in the voxygen asset directory
pub fn list_localizations() -> Vec<LanguageMetadata> {
let mut languages = vec![];
// List language directories
let i18n_root = assets::path_of("voxygen.i18n", "");
for i18n_directory in std::fs::read_dir(&i18n_root).unwrap() {
if let Ok(i18n_entry) = i18n_directory {
if let Some(i18n_key) = i18n_entry.file_name().to_str() {
// load the root file of all the subdirectories
if let Ok(localization) = RawLocalization::load(
&("voxygen.i18n.".to_string() + i18n_key + "." + LANG_MANIFEST_FILE),
) {
languages.push(localization.read().metadata.clone());
#[derive(Clone, Debug)]
struct LocalizationList(Vec<LanguageMetadata>);
impl assets::Compound for LocalizationList {
fn load<S: assets::source::Source>(
cache: &assets::AssetCache<S>,
specifier: &str,
) -> Result<Self, assets::Error> {
// List language directories
let mut languages = vec![];
let i18n_root = assets::path_of(specifier, "");
for i18n_directory in std::fs::read_dir(&i18n_root)? {
if let Ok(i18n_entry) = i18n_directory {
if let Some(i18n_key) = i18n_entry.file_name().to_str() {
// load the root file of all the subdirectories
if let Ok(localization) = cache.load::<RawLocalization>(
&(specifier.to_string() + "." + i18n_key + "." + LANG_MANIFEST_FILE),
) {
languages.push(localization.read().metadata.clone());
}
}
}
}
Ok(LocalizationList(languages))
}
languages
}
/// Load all the available languages located in the voxygen asset directory
pub fn list_localizations() -> Vec<LanguageMetadata> {
LocalizationList::load_expect_cloned("voxygen.i18n").0
}
/// Return the asset associated with the language_id