From 26143cad5461fc6855e1164aac86dde797f8f748 Mon Sep 17 00:00:00 2001 From: William Casarin Date: Tue, 22 Jul 2025 13:24:43 -0700 Subject: [PATCH] i18n: disable bidi for tests > This is important for cases such as when a right-to-left user name is presented in the left-to-right message. > In some cases, such as testing, the user may want to disable the isolating. See: https://docs.rs/fluent/latest/fluent/bundle/struct.FluentBundle.html#method.set_use_isolating Signed-off-by: William Casarin --- crates/notedeck/src/i18n/manager.rs | 19 +++++++++++++++++-- crates/notedeck/src/time.rs | 20 ++++++++++---------- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/crates/notedeck/src/i18n/manager.rs b/crates/notedeck/src/i18n/manager.rs index f85eb7d8..122240f6 100644 --- a/crates/notedeck/src/i18n/manager.rs +++ b/crates/notedeck/src/i18n/manager.rs @@ -62,6 +62,8 @@ pub struct Localization { normalized_key_cache: HashMap, /// Bundles bundles: HashMap, + + use_isolating: bool, } impl Default for Localization { @@ -84,6 +86,7 @@ impl Default for Localization { current_locale: default_locale.to_owned(), available_locales, fallback_locale, + use_isolating: true, normalized_key_cache: HashMap::new(), string_cache: HashMap::new(), bundles: HashMap::new(), @@ -97,6 +100,14 @@ impl Localization { Localization::default() } + /// Disable bidirectional isolation markers. mostly useful for tests + pub fn no_bidi() -> Self { + Localization { + use_isolating: false, + ..Localization::default() + } + } + /// Gets a localized string by its ID pub fn get_string(&mut self, id: IntlKey<'_>) -> Result { self.get_cached_string(id, None) @@ -152,8 +163,11 @@ impl Localization { } fn try_load_bundle(&mut self, lang: &LanguageIdentifier) -> Result<(), IntlError> { - self.bundles - .insert(lang.to_owned(), Self::load_bundle(lang)?); + let mut bundle = Self::load_bundle(lang)?; + if !self.use_isolating { + bundle.set_use_isolating(false); + } + self.bundles.insert(lang.to_owned(), bundle); Ok(()) } @@ -228,6 +242,7 @@ impl Localization { ); self.try_load_bundle(&locale) .expect("failed to load fallback bundle!?"); + Ok(()) } diff --git a/crates/notedeck/src/time.rs b/crates/notedeck/src/time.rs index 5545d455..fa5e15c4 100644 --- a/crates/notedeck/src/time.rs +++ b/crates/notedeck/src/time.rs @@ -107,7 +107,7 @@ mod tests { #[test] fn test_now_condition() { let now = get_current_timestamp(); - let mut intl = Localization::default(); + let mut intl = Localization::no_bidi(); // Test 0 seconds ago let result = time_ago_between(&mut intl, now, now); @@ -137,7 +137,7 @@ mod tests { #[test] fn test_seconds_condition() { let now = get_current_timestamp(); - let mut i18n = Localization::default(); + let mut i18n = Localization::no_bidi(); // Test 3 seconds ago let result = time_ago_between(&mut i18n, now - 3, now); @@ -163,7 +163,7 @@ mod tests { #[test] fn test_minutes_condition() { let now = get_current_timestamp(); - let mut i18n = Localization::default(); + let mut i18n = Localization::no_bidi(); // Test 1 minute ago let result = time_ago_between(&mut i18n, now - ONE_MINUTE_IN_SECONDS, now); @@ -189,7 +189,7 @@ mod tests { #[test] fn test_hours_condition() { let now = get_current_timestamp(); - let mut i18n = Localization::default(); + let mut i18n = Localization::no_bidi(); // Test 1 hour ago let result = time_ago_between(&mut i18n, now - ONE_HOUR_IN_SECONDS, now); @@ -215,7 +215,7 @@ mod tests { #[test] fn test_days_condition() { let now = get_current_timestamp(); - let mut i18n = Localization::default(); + let mut i18n = Localization::no_bidi(); // Test 1 day ago let result = time_ago_between(&mut i18n, now - ONE_DAY_IN_SECONDS, now); @@ -233,7 +233,7 @@ mod tests { #[test] fn test_weeks_condition() { let now = get_current_timestamp(); - let mut i18n = Localization::default(); + let mut i18n = Localization::no_bidi(); // Test 1 week ago let result = time_ago_between(&mut i18n, now - ONE_WEEK_IN_SECONDS, now); @@ -247,7 +247,7 @@ mod tests { #[test] fn test_months_condition() { let now = get_current_timestamp(); - let mut i18n = Localization::default(); + let mut i18n = Localization::no_bidi(); // Test 1 month ago let result = time_ago_between(&mut i18n, now - ONE_MONTH_IN_SECONDS, now); @@ -265,7 +265,7 @@ mod tests { #[test] fn test_years_condition() { let now = get_current_timestamp(); - let mut i18n = Localization::default(); + let mut i18n = Localization::no_bidi(); // Test 1 year ago let result = time_ago_between(&mut i18n, now - ONE_YEAR_IN_SECONDS, now); @@ -287,7 +287,7 @@ mod tests { #[test] fn test_future_timestamps() { let now = get_current_timestamp(); - let mut i18n = Localization::default(); + let mut i18n = Localization::no_bidi(); // Test 1 minute in the future let result = time_ago_between(&mut i18n, now + ONE_MINUTE_IN_SECONDS, now); @@ -317,7 +317,7 @@ mod tests { #[test] fn test_boundary_conditions() { let now = get_current_timestamp(); - let mut i18n = Localization::default(); + let mut i18n = Localization::no_bidi(); // Test boundary between seconds and minutes let result = time_ago_between(&mut i18n, now - 60, now);