From e94c6fd9d1d8827f535a8ae8faa2d230e961ae9d Mon Sep 17 00:00:00 2001
From: Dan <danrosenshain@gmail.com>
Date: Fri, 3 May 2024 11:18:47 +0300
Subject: [PATCH] fix(core): pound symbol being replaced outside plural and
 selectordinal (#1928)

---
 packages/core/src/interpolate.test.ts |  7 +++++++
 packages/core/src/interpolate.ts      | 12 +++++++++---
 2 files changed, 16 insertions(+), 3 deletions(-)

diff --git a/packages/core/src/interpolate.test.ts b/packages/core/src/interpolate.test.ts
index 7b385f8fb..b0501cdfe 100644
--- a/packages/core/src/interpolate.test.ts
+++ b/packages/core/src/interpolate.test.ts
@@ -71,6 +71,13 @@ describe("interpolate", () => {
     )
   })
 
+  it("should not replace `#` symbol outside plural and selectordinal", () => {
+    const cache = compile("#{place} in best seller list")
+    expect(interpolate(cache, "en", [])({ place: 7 })).toEqual(
+      "#7 in best seller list"
+    )
+  })
+
   it("should replace more than one octothorpe symbols in message", () => {
     const plural = prepare("{value, plural, one {} other {# and #}}")
 
diff --git a/packages/core/src/interpolate.ts b/packages/core/src/interpolate.ts
index ef58ed0a5..921a48202 100644
--- a/packages/core/src/interpolate.ts
+++ b/packages/core/src/interpolate.ts
@@ -77,11 +77,14 @@ export function interpolate(
   return (values: Values = {}, formats?: Formats): string => {
     const formatters = getDefaultFormats(locale, locales, formats)
 
-    const formatMessage = (tokens: CompiledMessage | number | undefined) => {
+    const formatMessage = (
+      tokens: CompiledMessage | number | undefined,
+      replaceOctothorpe: boolean = false
+    ) => {
       if (!Array.isArray(tokens)) return tokens
 
       return tokens.reduce<string>((message, token) => {
-        if (token === "#") {
+        if (token === "#" && replaceOctothorpe) {
           return message + OCTOTHORPE_PH
         }
 
@@ -100,7 +103,10 @@ export function interpolate(
         ) {
           Object.entries(format as CompiledIcuChoices).forEach(
             ([key, value]) => {
-              interpolatedFormat[key] = formatMessage(value)
+              interpolatedFormat[key] = formatMessage(
+                value,
+                type === "plural" || type === "selectordinal"
+              )
             }
           )
         } else {