From 21fd1ebf5358a03a00d5fafeb3e4d6f6b82f2248 Mon Sep 17 00:00:00 2001 From: mgros Date: Tue, 22 Sep 2026 02:03:52 +0200 Subject: [PATCH 1/3] Add German localization for currency symbol placement and corresponding tests --- Rules/Languages/de/SharedRules/general.yaml | 18 +++++++++++++++++- tests/Languages/de/units.rs | 9 +++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/Rules/Languages/de/SharedRules/general.yaml b/Rules/Languages/de/SharedRules/general.yaml index a5792c745..4c0f252fb 100644 --- a/Rules/Languages/de/SharedRules/general.yaml +++ b/Rules/Languages/de/SharedRules/general.yaml @@ -317,7 +317,23 @@ then: [x: "concat('\uF8FE', DefinitionValue($Word, 'Speech', 'PluralForms'))", ct: " "] else: [x: "concat('\uF8FE', $Word)", ct: "s"] - +# Currency symbols precede amounts in MathML but are spoken after them in German: $ 3 -> 3 dollar. +- name: currency + tag: mrow + match: "count(*)=3 and DefinitionValue(*[1], 'Speech', 'CurrencySymbols') != ''" + variables: + - IsSingular: "*[3][self::m:mn and .=1] and *[2]='\u2062'" + - CurrencyWord: "DefinitionValue(*[1], 'Speech', 'CurrencySymbols')" + replace: + - bookmark: "*[3]/@id" + - x: "*[3]" + - test: + - if: "$IsSingular" + then: [x: "$CurrencyWord"] + - else_if: "DefinitionValue($CurrencyWord, 'Speech', 'PluralForms') != ''" + then: [x: "DefinitionValue($CurrencyWord, 'Speech', 'PluralForms')"] + else: [x: "$CurrencyWord"] + - name: sin tag: mi match: ".='sin'" diff --git a/tests/Languages/de/units.rs b/tests/Languages/de/units.rs index fffd6ac5a..81467b92f 100644 --- a/tests/Languages/de/units.rs +++ b/tests/Languages/de/units.rs @@ -103,6 +103,15 @@ fn non_si_unit_plural_regression() -> Result<()> { Ok(()) } +#[test] +fn currency_symbol_precedes_amount() -> Result<()> { + // German speaks a prefixed currency symbol after its amount. + let expr = r#"$3"#; + test("de", "ClearSpeak", expr, "3 dollar")?; + test("de", "SimpleSpeak", expr, "3 dollar")?; + Ok(()) +} + /* #[test] fn si_base_with_prefixes() -> Result<()> { From 327d988b3dfc7d0e7f4b6f51601b5a0d940e723e Mon Sep 17 00:00:00 2001 From: mgros Date: Tue, 22 Sep 2026 02:05:57 +0200 Subject: [PATCH 2/3] add another test for euro --- tests/Languages/de/units.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/Languages/de/units.rs b/tests/Languages/de/units.rs index 81467b92f..1c932ae1c 100644 --- a/tests/Languages/de/units.rs +++ b/tests/Languages/de/units.rs @@ -109,6 +109,10 @@ fn currency_symbol_precedes_amount() -> Result<()> { let expr = r#"$3"#; test("de", "ClearSpeak", expr, "3 dollar")?; test("de", "SimpleSpeak", expr, "3 dollar")?; + + let expr = r#"€1"#; + test("de", "ClearSpeak", expr, "1 euro")?; + test("de", "SimpleSpeak", expr, "1 euro")?; Ok(()) } From a4083cef4adf0dd8c73b1b04c3f46a4c5517458e Mon Sep 17 00:00:00 2001 From: mgros Date: Tue, 22 Sep 2026 02:07:32 +0200 Subject: [PATCH 3/3] add another test for pound/pfund --- tests/Languages/de/units.rs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/tests/Languages/de/units.rs b/tests/Languages/de/units.rs index 1c932ae1c..605ac2ed1 100644 --- a/tests/Languages/de/units.rs +++ b/tests/Languages/de/units.rs @@ -113,6 +113,10 @@ fn currency_symbol_precedes_amount() -> Result<()> { let expr = r#"€1"#; test("de", "ClearSpeak", expr, "1 euro")?; test("de", "SimpleSpeak", expr, "1 euro")?; + + let expr = r#"£4,7"#; + test("de", "ClearSpeak", expr, "4,7 pfund")?; + test("de", "SimpleSpeak", expr, "4,7 pfund")?; Ok(()) }