From 3b9d0a8744449b13ef5d693c6a9b412b2c8cab01 Mon Sep 17 00:00:00 2001 From: Sylvestre Ledru Date: Wed, 24 Sep 2025 20:31:39 +0200 Subject: [PATCH] l10n: replace the hash table by a long match per file to faciliate the lookup --- src/uucore/build.rs | 43 ++++++++++++++----------------- src/uucore/src/lib/mods/locale.rs | 6 ++--- 2 files changed, 21 insertions(+), 28 deletions(-) diff --git a/src/uucore/build.rs b/src/uucore/build.rs index a5a544fcb..c49f1bd56 100644 --- a/src/uucore/build.rs +++ b/src/uucore/build.rs @@ -18,16 +18,15 @@ pub fn main() -> Result<(), Box> { "// This file contains embedded English locale files" )?; writeln!(embedded_file)?; - writeln!(embedded_file, "use std::collections::HashMap;")?; + // No imports needed for match-based lookup writeln!(embedded_file)?; - // Start the function that returns embedded locales + // Generate optimized lookup function instead of HashMap writeln!( embedded_file, - "pub fn get_embedded_locales() -> HashMap<&'static str, &'static str> {{" + "pub fn get_embedded_locale(key: &str) -> Option<&'static str> {{" )?; - writeln!(embedded_file, " let mut locales = HashMap::new();")?; - writeln!(embedded_file)?; + writeln!(embedded_file, " match key {{")?; // Try to detect if we're building for a specific utility by checking build configuration // This attempts to identify individual utility builds vs multicall binary builds @@ -44,8 +43,8 @@ pub fn main() -> Result<(), Box> { } } - writeln!(embedded_file)?; - writeln!(embedded_file, " locales")?; + writeln!(embedded_file, " _ => None,")?; + writeln!(embedded_file, " }}")?; writeln!(embedded_file, "}}")?; embedded_file.flush()?; @@ -127,12 +126,11 @@ fn embed_single_utility_locale( if locale_path.exists() { let content = fs::read_to_string(&locale_path)?; - writeln!(embedded_file, " // Locale for {util_name}")?; + writeln!(embedded_file, " // Locale for {util_name}")?; writeln!( embedded_file, - " locales.insert(\"{util_name}/en-US.ftl\", r###\"{content}\"###);" + " \"{util_name}/en-US.ftl\" => Some(r###\"{content}\"###)," )?; - writeln!(embedded_file)?; // Tell Cargo to rerun if this file changes println!("cargo:rerun-if-changed={}", locale_path.display()); @@ -142,10 +140,10 @@ fn embed_single_utility_locale( let uucore_locale_path = project_root.join("src/uucore/locales/en-US.ftl"); if uucore_locale_path.exists() { let content = fs::read_to_string(&uucore_locale_path)?; - writeln!(embedded_file, " // Common uucore locale")?; + writeln!(embedded_file, " // Common uucore locale")?; writeln!( embedded_file, - " locales.insert(\"uucore/en-US.ftl\", r###\"{content}\"###);" + " \"uucore/en-US.ftl\" => Some(r###\"{content}\"###)," )?; println!("cargo:rerun-if-changed={}", uucore_locale_path.display()); } @@ -185,12 +183,11 @@ fn embed_all_utility_locales( let locale_path = src_uu_dir.join(util_name).join("locales/en-US.ftl"); if locale_path.exists() { let content = fs::read_to_string(&locale_path)?; - writeln!(embedded_file, " // Locale for {util_name}")?; + writeln!(embedded_file, " // Locale for {util_name}")?; writeln!( embedded_file, - " locales.insert(\"{util_name}/en-US.ftl\", r###\"{content}\"###);" + " \"{util_name}/en-US.ftl\" => Some(r###\"{content}\"###)," )?; - writeln!(embedded_file)?; // Tell Cargo to rerun if this file changes println!("cargo:rerun-if-changed={}", locale_path.display()); @@ -201,10 +198,10 @@ fn embed_all_utility_locales( let uucore_locale_path = project_root.join("src/uucore/locales/en-US.ftl"); if uucore_locale_path.exists() { let content = fs::read_to_string(&uucore_locale_path)?; - writeln!(embedded_file, " // Common uucore locale")?; + writeln!(embedded_file, " // Common uucore locale")?; writeln!( embedded_file, - " locales.insert(\"uucore/en-US.ftl\", r###\"{content}\"###);" + " \"uucore/en-US.ftl\" => Some(r###\"{content}\"###)," )?; println!("cargo:rerun-if-changed={}", uucore_locale_path.display()); } @@ -220,7 +217,7 @@ fn embed_static_utility_locales( writeln!( embedded_file, - " // Static utility locales for crates.io builds" + " // Static utility locales for crates.io builds" )?; let manifest_dir = env::var("CARGO_MANIFEST_DIR").unwrap_or_default(); @@ -232,12 +229,11 @@ fn embed_static_utility_locales( let uucore_locale_file = Path::new(&manifest_dir).join("locales/en-US.ftl"); if uucore_locale_file.is_file() { let content = std::fs::read_to_string(&uucore_locale_file)?; - writeln!(embedded_file, " // Common uucore locale")?; + writeln!(embedded_file, " // Common uucore locale")?; writeln!( embedded_file, - " locales.insert(\"uucore/en-US.ftl\", r###\"{content}\"###);" + " \"uucore/en-US.ftl\" => Some(r###\"{content}\"###)," )?; - writeln!(embedded_file)?; } // Collect and sort for deterministic builds @@ -255,12 +251,11 @@ fn embed_static_utility_locales( let locale_file = entry.path().join("locales/en-US.ftl"); if locale_file.is_file() { let content = std::fs::read_to_string(&locale_file)?; - writeln!(embedded_file, " // Locale for {util_name}")?; + writeln!(embedded_file, " // Locale for {util_name}")?; writeln!( embedded_file, - " locales.insert(\"{util_name}/en-US.ftl\", r###\"{content}\"###);" + " \"{util_name}/en-US.ftl\" => Some(r###\"{content}\"###)," )?; - writeln!(embedded_file)?; } } } diff --git a/src/uucore/src/lib/mods/locale.rs b/src/uucore/src/lib/mods/locale.rs index 38f09e873..09b5bbf33 100644 --- a/src/uucore/src/lib/mods/locale.rs +++ b/src/uucore/src/lib/mods/locale.rs @@ -235,20 +235,18 @@ fn create_english_bundle_from_embedded( )); } - let embedded_locales = get_embedded_locales(); let mut bundle = FluentBundle::new(vec![locale.clone()]); bundle.set_use_isolating(false); // First, try to load common uucore strings - let uucore_key = "uucore/en-US.ftl"; - if let Some(uucore_content) = embedded_locales.get(uucore_key) { + if let Some(uucore_content) = get_embedded_locale("uucore/en-US.ftl") { let uucore_resource = parse_fluent_resource(uucore_content)?; bundle.add_resource_overriding(uucore_resource); } // Then, try to load utility-specific strings let locale_key = format!("{util_name}/en-US.ftl"); - if let Some(ftl_content) = embedded_locales.get(locale_key.as_str()) { + if let Some(ftl_content) = get_embedded_locale(&locale_key) { let resource = parse_fluent_resource(ftl_content)?; bundle.add_resource_overriding(resource); }