Prevented i18n package from escaping text (#704)

* fix: prevented i18n package from escaping text

* Update packages/web/vite.config.ts

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

* fix: stupid copilot

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
This commit is contained in:
Dan Ditomaso
2025-07-11 08:23:47 -04:00
committed by GitHub
co-authored by Copilot
parent f010365151
commit 5efa1d1795
9 changed files with 22 additions and 12 deletions
+7 -5
View File
@@ -8,16 +8,18 @@
<link rel="manifest" href="site.webmanifest" /> <link rel="manifest" href="site.webmanifest" />
<link rel="mask-icon" href="logo_black.svg" color="#67ea94" /> <link rel="mask-icon" href="logo_black.svg" color="#67ea94" />
<link rel="stylesheet" href="https://rsms.me/inter/inter.css" /> <link
rel="stylesheet"
href="https://rsms.me/inter/inter.css"
crossorigin="anonymous"
/>
<link <link
rel="stylesheet" rel="stylesheet"
href="https://cdn.jsdelivr.net/npm/@xz/fonts@1/serve/cascadia-code.min.css" href="https://cdn.jsdelivr.net/npm/@xz/fonts@1/serve/cascadia-code.min.css"
crossorigin="anonymous"
/> />
<meta name="theme-color" content="#67ea94" /> <meta name="theme-color" content="#67ea94" />
<meta <meta name="viewport" content="width=device-width, initial-scale=1" />
name="viewport"
content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=0"
/>
<meta name="description" content="Meshtastic Web Client" /> <meta name="description" content="Meshtastic Web Client" />
<title>Meshtastic Web</title> <title>Meshtastic Web</title>
</head> </head>
@@ -178,6 +178,6 @@
"managedMode": { "managedMode": {
"confirmUnderstanding": "Yes, I know what I'm doing", "confirmUnderstanding": "Yes, I know what I'm doing",
"title": "Are you sure?", "title": "Are you sure?",
"description": "Enabling Managed Mode blocks client applications (including the web client) from writing configurations to a radio. Once enabled, radio configurations can <bold>only</bold> be changed through Remote Admin messages. This setting is not required for remote node administration." "description": "Enabling Managed Mode blocks client applications (including the web client) from writing configurations to a radio. Once enabled, radio configurations can only be changed through Remote Admin messages. This setting is not required for remote node administration."
} }
} }
@@ -47,6 +47,7 @@ export const LocationResponseDialog = ({
<DialogHeader> <DialogHeader>
<DialogTitle> <DialogTitle>
{t("locationResponse.title", { {t("locationResponse.title", {
interpolation: { escapeValue: false },
identifier: `${longName} (${shortName})`, identifier: `${longName} (${shortName})`,
})} })}
</DialogTitle> </DialogTitle>
@@ -169,6 +169,7 @@ export const NodeDetailsDialog = ({
<DialogHeader> <DialogHeader>
<DialogTitle> <DialogTitle>
{t("nodeDetails.title", { {t("nodeDetails.title", {
interpolation: { escapeValue: false },
identifier: `${node.user?.longName ?? t("unknown.shortName")} (${ identifier: `${node.user?.longName ?? t("unknown.shortName")} (${
node.user?.shortName ?? t("unknown.shortName") node.user?.shortName ?? t("unknown.shortName")
})`, })`,
@@ -50,6 +50,7 @@ export const PkiBackupDialog = ({
<head> <head>
<title>${ <title>${
t("pkiBackup.header", { t("pkiBackup.header", {
interpolation: { escapeValue: false },
shortName: getMyNode()?.user?.shortName ?? t("unknown.shortName"), shortName: getMyNode()?.user?.shortName ?? t("unknown.shortName"),
longName: getMyNode()?.user?.longName ?? t("unknown.longName"), longName: getMyNode()?.user?.longName ?? t("unknown.longName"),
}) })
@@ -63,6 +64,7 @@ export const PkiBackupDialog = ({
<body> <body>
<h1>${ <h1>${
t("pkiBackup.header", { t("pkiBackup.header", {
interpolation: { escapeValue: false },
shortName: getMyNode()?.user?.shortName ?? t("unknown.shortName"), shortName: getMyNode()?.user?.shortName ?? t("unknown.shortName"),
longName: getMyNode()?.user?.longName ?? t("unknown.longName"), longName: getMyNode()?.user?.longName ?? t("unknown.longName"),
}) })
@@ -103,6 +105,7 @@ export const PkiBackupDialog = ({
const link = document.createElement("a"); const link = document.createElement("a");
link.href = url; link.href = url;
link.download = t("pkiBackup.fileName", { link.download = t("pkiBackup.fileName", {
interpolation: { escapeValue: false },
shortName: getMyNode()?.user?.shortName ?? t("unknown.shortName"), shortName: getMyNode()?.user?.shortName ?? t("unknown.shortName"),
longName: getMyNode()?.user?.longName ?? t("unknown.longName"), longName: getMyNode()?.user?.longName ?? t("unknown.longName"),
}); });
@@ -10,7 +10,7 @@ import { LockKeyholeOpenIcon } from "lucide-react";
import { useRefreshKeysDialog } from "./useRefreshKeysDialog.ts"; import { useRefreshKeysDialog } from "./useRefreshKeysDialog.ts";
import { useDevice } from "@core/stores/deviceStore.ts"; import { useDevice } from "@core/stores/deviceStore.ts";
import { useTranslation } from "react-i18next"; import { useTranslation } from "react-i18next";
import { useMessageStore } from "../../../core/stores/messageStore/index.ts"; import { useMessageStore } from "@core/stores/messageStore/index.ts";
export interface RefreshKeysDialogProps { export interface RefreshKeysDialogProps {
open: boolean; open: boolean;
@@ -35,6 +35,7 @@ export const RefreshKeysDialog = (
const text = { const text = {
title: t("refreshKeys.title", { title: t("refreshKeys.title", {
interpolation: { escapeValue: false },
identifier: nodeWithError?.user?.longName ?? "", identifier: nodeWithError?.user?.longName ?? "",
}), }),
description: `${t("refreshKeys.description.unableToSendDmPrefix")}${ description: `${t("refreshKeys.description.unableToSendDmPrefix")}${
@@ -8,14 +8,11 @@ class NodeInfoFactory {
const last4 = userIdHex.slice(-4); const last4 = userIdHex.slice(-4);
const longName = `Meshtastic ${last4}`; const longName = `Meshtastic ${last4}`;
const shortName = last4; const shortName = last4;
const hwModel = Protobuf.Mesh.HardwareModel.UNSET;
return create(Protobuf.Mesh.UserSchema, { return create(Protobuf.Mesh.UserSchema, {
id: userId, id: userId,
longName: longName, longName: longName.toString(),
shortName: shortName, shortName: shortName.toString(),
hwModel: hwModel,
isLicensed: false,
}); });
} }
+1
View File
@@ -308,6 +308,7 @@ export const MessagesPage = () => {
<PageLayout <PageLayout
label={`${ label={`${
t("page.title", { t("page.title", {
interpolation: { escapeValue: false },
chatName: isBroadcast && currentChannel chatName: isBroadcast && currentChannel
? getChannelName(currentChannel) ? getChannelName(currentChannel)
: isDirect && otherNode : isDirect && otherNode
+4
View File
@@ -12,6 +12,9 @@ try {
hash = "DEV"; hash = "DEV";
} }
const CONTENT_SECURITY_POLICY =
"script-src 'self' 'unsafe-inline' https://cdn.jsdelivr.net; style-src 'self' 'unsafe-inline' data: https://rsms.me https://cdn.jsdelivr.net; img-src 'self' data:; font-src 'self' data: https://rsms.me https://cdn.jsdelivr.net; worker-src 'self' blob:; object-src 'none'; base-uri 'self';";
export default defineConfig({ export default defineConfig({
plugins: [ plugins: [
react(), react(),
@@ -49,6 +52,7 @@ export default defineConfig({
server: { server: {
port: 3000, port: 3000,
headers: { headers: {
"content-security-policy": CONTENT_SECURITY_POLICY,
"Cross-Origin-Opener-Policy": "same-origin", "Cross-Origin-Opener-Policy": "same-origin",
"Cross-Origin-Embedder-Policy": "require-corp", "Cross-Origin-Embedder-Policy": "require-corp",
}, },