From d5e5722dc85ccc3cce04eac3da6e927caee7d9fb Mon Sep 17 00:00:00 2001 From: Damien Elmes Date: Sat, 27 Mar 2021 09:09:13 +1000 Subject: [PATCH] preserve variable order when extracting from ftl files --- rslib/i18n/build/extract.rs | 26 +++++++++++++++++++------- 1 file changed, 19 insertions(+), 7 deletions(-) diff --git a/rslib/i18n/build/extract.rs b/rslib/i18n/build/extract.rs index e10edb667..7d9549e42 100644 --- a/rslib/i18n/build/extract.rs +++ b/rslib/i18n/build/extract.rs @@ -72,10 +72,10 @@ fn extract_metadata(ftl_text: &str) -> Vec { // special case translations that were ported from gettext, and use embedded // terms that reference other variables that aren't visible to our visitor if key == "statistics-studied-today" { - visitor.variables.insert("amount".to_string()); - visitor.variables.insert("cards".to_string()); + visitor.variables.push("amount".to_string()); + visitor.variables.push("cards".to_string()); } else if key == "statistics-average-answer-time" { - visitor.variables.insert("cards-per-minute".to_string()); + visitor.variables.push("cards-per-minute".to_string()); } let (text, variables) = visitor.into_output(); @@ -99,13 +99,25 @@ fn extract_metadata(ftl_text: &str) -> Vec { #[derive(Default)] struct Visitor { text: String, - variables: HashSet, + variables: Vec, } impl Visitor { fn into_output(self) -> (String, Vec) { - let mut vars: Vec<_> = self.variables.into_iter().map(Into::into).collect(); - vars.sort_unstable(); + // make unique, preserving order + let mut seen = HashSet::new(); + let vars: Vec<_> = self + .variables + .into_iter() + .filter(|v| { + if seen.contains(v) { + false + } else { + seen.insert(v.clone()) + } + }) + .map(Into::into) + .collect(); (self.text, vars) } @@ -124,7 +136,7 @@ impl Visitor { if !in_select { write!(self.text, "{{${}}}", id.name).unwrap(); } - self.variables.insert(id.name.to_string()); + self.variables.push(id.name.to_string()); } InlineExpression::Placeable { expression } => { self.visit_expression(expression);