feat(frontend): storage, trash, policy, stories, shares, jobs, bots, media, login and notes speak russian and english

This commit is contained in:
hh committed 2026-10-19 03:53:08 +00:00
1 parent e5a5edcaae
commit 4a5c92f0e9
51 files changed
+1504 -588

No files matched your search

@@ -24,9 +24,11 @@
sameToggles,
summary,
TOGGLE_KEYS,
TOGGLE_LABELS,
type ToggleKey,
toggleLabel,
} from "#lib/format/policy.js";
import { locale, t } from "#lib/i18n/locale.svelte.js";
import type { MessageKey } from "#lib/i18n/messages.js";
interface Props {
onchange?: () => void;
@@ -44,17 +46,17 @@
onchange,
}: Props = $props();
const PRESETS: { label: string; toggles: CaptureToggles }[] = [
{ label: "Всё", toggles: preset("all") },
{ label: "Только сообщения", toggles: preset(["messages"]) },
{ label: "Ничего", toggles: preset([]) },
const PRESETS: { label: MessageKey; toggles: CaptureToggles }[] = [
{ label: "policy.summary.all", toggles: preset("all") },
{ label: "policy.summary.messagesOnly", toggles: preset(["messages"]) },
{ label: "policy.summary.none", toggles: preset([]) },
];
let rule = $state<PolicyRecord | null>(null);
let parent = $state<PolicyParent | null>(null);
let loading = $state(false);
let saving = $state(false);
let problem = $state<string | null>(null);
let problem = $state<MessageKey | null>(null);
let removing = $state(false);
const isChat = $derived(scopeType === "chat");
@@ -79,13 +81,14 @@
if (isChat && parent) {
const from = parentLabel(parent.scope_type, parent.title);
return rule
? `Без правила было бы как ${from}: ${summary(parent.toggles).toLowerCase()}.`
: `Сейчас как ${from}. Измени что-нибудь, и у чата появится своё правило.`;
? t("policy.hint.chatRule", {
from,
summary: summary(parent.toggles).toLocaleLowerCase(locale.tag),
})
: t("policy.hint.chatInherit", { from });
}
if (isFolder) {
return rule
? "Действует на чаты папки, у которых нет своего правила."
: "У папки нет правила, чаты идут по умолчаниям. Выбери набор, чтобы его создать.";
return rule ? t("policy.hint.folderRule") : t("policy.hint.folderNone");
}
return "";
}
@@ -112,7 +115,7 @@
});
onchange?.();
} catch {
problem = "Не удалось сохранить правило";
problem = "policy.rule.saveFailed";
} finally {
saving = false;
}
@@ -136,7 +139,7 @@
removing = false;
onchange?.();
} catch {
problem = "Не удалось удалить правило";
problem = "policy.rule.deleteFailed";
} finally {
saving = false;
}
@@ -153,7 +156,7 @@
try {
({ rule, parent } = await getPolicyScope(target));
} catch {
problem = "Не удалось загрузить правило";
problem = "policy.rule.loadFailed";
} finally {
loading = false;
}
@@ -179,7 +182,7 @@
type="button"
class:on={shown !== null && sameToggles(shown, item.toggles)}
>
{item.label}
{t(item.label)}
</button>
{/each}
</div>
@@ -196,7 +199,7 @@
type="button"
class:changed={differs(key)}
>
<span class="label">{TOGGLE_LABELS[key]}</span>
<span class="label">{toggleLabel(key)}</span>
<span class="switch" class:on={shown[key]}>
<span class="knob"></span>
</span>
@@ -206,7 +209,7 @@
{/if}
{#if problem}
<p class="problem">{problem}</p>
<p class="problem">{t(problem)}</p>
{/if}
{#if target}
@@ -216,7 +219,7 @@
{#if rule && (isChat || isFolder)}
{#if removing}
<div class="removal">
<span>Удалить правило?</span>
<span>{t("policy.rule.removeConfirm")}</span>
<Button
onclick={() => {
removing = false;
@@ -224,7 +227,7 @@
smaller
variant="text"
>
Отмена
{t("common.cancel")}
</Button>
<Button
disabled={saving}
@@ -233,7 +236,7 @@
smaller
variant="danger"
>
Удалить
{t("common.delete")}
</Button>
</div>
{:else}
@@ -244,7 +247,7 @@
}}
type="button"
>
Удалить правило
{t("policy.rule.remove")}
</button>
{/if}
{/if}