diff --git a/apps/web/astro.config.mjs b/apps/web/astro.config.mjs index b84a4bf..af1fcd3 100644 --- a/apps/web/astro.config.mjs +++ b/apps/web/astro.config.mjs @@ -9,5 +9,62 @@ export default defineConfig({ site: "https://ephemask.com", output: "server", adapter: vercel(), - integrations: [svelte(), react(), tailwind(), sitemap()], + i18n: { + defaultLocale: "en", + locales: [ + "en", + { path: "pt-br", codes: ["pt-BR", "pt"] }, + "es", + "fr", + ], + routing: { + prefixDefaultLocale: false, + fallbackType: "rewrite", + }, + fallback: { + "pt-br": "en", + es: "en", + fr: "en", + }, + }, + integrations: [ + svelte(), + react(), + tailwind(), + sitemap({ + i18n: { + defaultLocale: "en", + locales: { + en: "en", + "pt-br": "pt-BR", + es: "es", + fr: "fr", + }, + }, + filter: (page) => + !page.includes("/admin") && + !page.includes("/auth/") && + !page.includes("/inbox"), + customPages: [ + "https://ephemask.com/pt-br/", + "https://ephemask.com/pt-br/account/", + "https://ephemask.com/pt-br/login/", + "https://ephemask.com/pt-br/docs/", + "https://ephemask.com/pt-br/privacy/", + "https://ephemask.com/pt-br/terms/", + "https://ephemask.com/es/", + "https://ephemask.com/es/account/", + "https://ephemask.com/es/login/", + "https://ephemask.com/es/docs/", + "https://ephemask.com/es/privacy/", + "https://ephemask.com/es/terms/", + "https://ephemask.com/fr/", + "https://ephemask.com/fr/account/", + "https://ephemask.com/fr/login/", + "https://ephemask.com/fr/docs/", + "https://ephemask.com/fr/privacy/", + "https://ephemask.com/fr/terms/", + ], + }), + ], }); diff --git a/apps/web/src/app.d.ts b/apps/web/src/app.d.ts index d95cd9e..040c0ac 100644 --- a/apps/web/src/app.d.ts +++ b/apps/web/src/app.d.ts @@ -1,5 +1,11 @@ /// +declare namespace App { + interface Locals { + locale: import("@ephemask/shared").Locale; + } +} + declare namespace svelteHTML { interface HTMLAttributes { onclick?: (event: MouseEvent) => void; diff --git a/apps/web/src/components/AccountView.svelte b/apps/web/src/components/AccountView.svelte index bbed7f9..8762dfa 100644 --- a/apps/web/src/components/AccountView.svelte +++ b/apps/web/src/components/AccountView.svelte @@ -1,7 +1,7 @@ @@ -123,13 +121,13 @@
- +
ephemask
@@ -318,7 +316,7 @@ {apiKeyCopied ? "✓" : t("copy")}
- + API Documentation → @@ -347,6 +345,29 @@ {/if} + + +
+

{t("dangerZone")}

+ {#if user.isPremium} +

{t("cancelSubscriptionFirst")}

+ {/if} + +
{/if} diff --git a/apps/web/src/components/AdminView.svelte b/apps/web/src/components/AdminView.svelte index 46efa98..c8d17fc 100644 --- a/apps/web/src/components/AdminView.svelte +++ b/apps/web/src/components/AdminView.svelte @@ -6,7 +6,7 @@ type MessageDetail as MessageDetailType, getLocale, } from "@ephemask/shared"; - import { initLocale } from "../lib/i18n.svelte"; + import { initLocale, localizePath } from "../lib/i18n.svelte"; import { useUser, initUser } from "../lib/user.svelte"; const api = createApiClient(import.meta.env.PUBLIC_API_URL || ""); @@ -139,7 +139,7 @@ await initUser(); if (!user.isAdmin) { - window.location.href = "/"; + window.location.href = localizePath("/"); return; } @@ -156,13 +156,13 @@
- Account + Account
{#if loading} diff --git a/apps/web/src/components/DomainManager.svelte b/apps/web/src/components/DomainManager.svelte index d970d07..0b32964 100644 --- a/apps/web/src/components/DomainManager.svelte +++ b/apps/web/src/components/DomainManager.svelte @@ -52,6 +52,17 @@ } } + async function deleteDomain(domainName: string) { + if (!user.apiKey) return; + if (!confirm(t("deleteDomainConfirm", { domain: domainName }))) return; + try { + await api.deleteDomain(domainName, user.apiKey); + domains = domains.filter((d) => d.domain !== domainName); + } catch { + // silent + } + } + async function checkDomain(domainName: string) { if (!user.apiKey) return; try { @@ -124,6 +135,12 @@ {t("checkVerification")} {/if} + diff --git a/apps/web/src/components/InboxView.svelte b/apps/web/src/components/InboxView.svelte index 946f1ad..9008d43 100644 --- a/apps/web/src/components/InboxView.svelte +++ b/apps/web/src/components/InboxView.svelte @@ -9,7 +9,7 @@ type MessageSummary, type MessageDetail as MessageDetailType, } from "@ephemask/shared"; - import { initLocale, useLocale } from "../lib/i18n.svelte"; + import { initLocale, useLocale, localizePath } from "../lib/i18n.svelte"; import { useUser, initUser, ensureUser } from "../lib/user.svelte"; const loc = useLocale(); @@ -280,7 +280,7 @@ {/if} @@ -309,7 +309,7 @@ {t("inboxExpired")} — {t("dataDestroyed")} diff --git a/apps/web/src/components/LandingPage.svelte b/apps/web/src/components/LandingPage.svelte index 16e5c48..39c3ab2 100644 --- a/apps/web/src/components/LandingPage.svelte +++ b/apps/web/src/components/LandingPage.svelte @@ -1,7 +1,7 @@ </> diff --git a/apps/web/src/components/LocaleToggle.svelte b/apps/web/src/components/LocaleToggle.svelte index 5fe131e..8d39fd6 100644 --- a/apps/web/src/components/LocaleToggle.svelte +++ b/apps/web/src/components/LocaleToggle.svelte @@ -1,6 +1,6 @@ diff --git a/apps/web/src/components/LoginView.svelte b/apps/web/src/components/LoginView.svelte index 88985cb..deb2c8e 100644 --- a/apps/web/src/components/LoginView.svelte +++ b/apps/web/src/components/LoginView.svelte @@ -1,7 +1,7 @@ + - +