diff --git a/src/common/translationCatalogue.unit.spec.ts b/src/common/translationCatalogue.unit.spec.ts
new file mode 100644
index 00000000..04c081ab
--- /dev/null
+++ b/src/common/translationCatalogue.unit.spec.ts
@@ -0,0 +1,57 @@
+import { afterEach, describe, expect, it } from "vitest";
+import { allMessages } from "./messages/combinedMessages.prod";
+import { $msg, setLang } from "./translation";
+
+function interpolationNames(message: string): string[] {
+ return [...message.matchAll(/\$\{([^}]+)\}/g)].map((match) => match[1]).sort();
+}
+
+describe("Russian catalogue interpolation", () => {
+ afterEach(() => setLang("def"));
+
+ it("retains the English interpolation values in each translated message", () => {
+ const mismatches = Object.entries(allMessages).flatMap(([key, messages]) => {
+ if (!messages.def || !messages.ru) return [];
+ const expected = interpolationNames(messages.def);
+ const actual = interpolationNames(messages.ru);
+ return JSON.stringify(actual) === JSON.stringify(expected) ? [] : [{ key, expected, actual }];
+ });
+
+ expect(mismatches).toEqual([]);
+ });
+
+ it("renders the generated QR image inside its display container", () => {
+ setLang("ru");
+ const qrImage = '';
+
+ const message = $msg("Setup.QRCode", { qr_image: qrImage });
+
+ expect(message).toContain(`