From 1082181a6f789b73fbc64c4ff5bc1401ad081e76 Mon Sep 17 00:00:00 2001 From: Malo <57839069+MDLC01@users.noreply.github.com> Date: Mon, 31 Mar 2025 11:01:01 +0200 Subject: [PATCH] Improve french smartquotes (#5976) --- crates/typst-library/src/text/smartquote.rs | 2 +- tests/ref/smartquote-disabled-temporarily.png | Bin 2781 -> 2782 bytes tests/ref/smartquote-fr.png | Bin 2344 -> 2334 bytes tests/ref/smartquote-with-embedding-chars.png | Bin 573 -> 568 bytes tests/suite/text/smartquote.typ | 2 +- 5 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/typst-library/src/text/smartquote.rs b/crates/typst-library/src/text/smartquote.rs index f457a6371..4dda689df 100644 --- a/crates/typst-library/src/text/smartquote.rs +++ b/crates/typst-library/src/text/smartquote.rs @@ -238,7 +238,7 @@ impl<'s> SmartQuotes<'s> { "cs" | "de" | "et" | "is" | "lt" | "lv" | "sk" | "sl" => low_high, "da" => ("‘", "’", "“", "”"), "fr" | "ru" if alternative => default, - "fr" => ("‹\u{00A0}", "\u{00A0}›", "«\u{00A0}", "\u{00A0}»"), + "fr" => ("“", "”", "«\u{202F}", "\u{202F}»"), "fi" | "sv" if alternative => ("’", "’", "»", "»"), "bs" | "fi" | "sv" => ("’", "’", "”", "”"), "it" if alternative => default, diff --git a/tests/ref/smartquote-disabled-temporarily.png b/tests/ref/smartquote-disabled-temporarily.png index 4c565c01ce1d91bfbd8b443f410c56e0b9b55360..f4d08c4d12fd5a8ecbc19d2d3d5bb252b2011386 100644 GIT binary patch delta 2774 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 delta 2773 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 b{6PN!WoyUfJv0%b00000NkvXXu0mjf8my2m diff --git a/tests/ref/smartquote-fr.png b/tests/ref/smartquote-fr.png index e28184226ac174455d34de80f4ab329c305b7bfa..6b7de7abeecd29b66aaad7467f6a787d7fb7d7a7 100644 GIT binary patch delta 2323 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 t&81yhJU5m3P_CFiB(~{ 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 diff --git a/tests/suite/text/smartquote.typ b/tests/suite/text/smartquote.typ index 4940d11b2..f2af93ceb 100644 --- a/tests/suite/text/smartquote.typ +++ b/tests/suite/text/smartquote.typ @@ -99,7 +99,7 @@ He's told some books contain questionable "example text". --- smartquote-disabled-temporarily --- // Test changing properties within text. -"She suddenly started speaking french: #text(lang: "fr")['Je suis une banane.']" Roman told me. +"She suddenly started speaking french: #text(lang: "fr", region: "CH")['Je suis une banane.']" Roman told me. Some people's thought on this would be #[#set smartquote(enabled: false); "strange."]