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 @@
@@ -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 @@
{#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")}