feat: add Russian localization and independent STT languages
CI / Typecheck, tests, lint (push) Canceled after 0s
CI / Standalone (mac-arm64) (push) Canceled after 0s
CI / Standalone (linux-x64) (push) Canceled after 0s
CI / Standalone (windows-x64) (push) Canceled after 0s

This commit is contained in:
2026-10-25 17:18:44 +03:00
parent b277ee3e0f
commit a50ca4b867
93 changed files with 3261 additions and 904 deletions
+13 -12
View File
@@ -1,4 +1,6 @@
"use client";
import { useI18n } from "@/components/i18n";
import { useContext, useState } from "react";
import { ChatActionsContext } from "@/components/chat";
@@ -61,6 +63,7 @@ export function VisualOutputCard({
messageId?: string;
initialInverted?: boolean;
}) {
const { t } = useI18n();
const result = output as VisualResult | undefined;
const overlay = useSessionMermaid();
const actions = useContext(ChatActionsContext);
@@ -83,8 +86,7 @@ export function VisualOutputCard({
if (!result || typeof result.svg !== "string") {
return (
<div className="rounded-xl border bg-card p-4 text-sm text-muted-foreground">
Figure completed, but the result could not be displayed.
</div>
{t("Figure completed, but the result could not be displayed.")}</div>
);
}
const failed = result.svg.length === 0;
@@ -92,10 +94,9 @@ export function VisualOutputCard({
return (
<div className="rounded-xl border bg-card p-4 text-card-foreground" data-testid="visual-card-failed">
<div className="flex items-center gap-2 text-xs font-medium uppercase tracking-wide text-muted-foreground">
Figure
<span className="rounded bg-red-500/15 px-1.5 py-0.5 text-red-500">failed</span>
{t("Figure")}<span className="rounded bg-red-500/15 px-1.5 py-0.5 text-red-500">{t("failed")}</span>
</div>
<p className="mt-2 text-sm text-muted-foreground">{result.notes ?? "The figure could not be drawn."}</p>
<p className="mt-2 text-sm text-muted-foreground">{result.notes ?? t("The figure could not be drawn.")}</p>
</div>
);
}
@@ -130,21 +131,21 @@ export function VisualOutputCard({
data-testid="visual-svg"
/>
<div className="mt-2 flex items-center justify-between gap-2">
<div className="text-xs font-medium uppercase tracking-wide text-muted-foreground">Figure</div>
<div className="text-xs font-medium uppercase tracking-wide text-muted-foreground">{t("Figure")}</div>
<div className="flex items-center gap-1.5">
{/* The invert affordance (owner round, 2026-10-07): the disc IS
the half-filled contrast circle; the tooltip names it. */}
<Toggle
checked={inverted}
onChange={toggleInverted}
label="Invert figure brightness"
title="Invert colors"
label={t("Invert figure brightness")}
title={t("Invert colors")}
discIcon={<InvertDiscIcon className="size-3" />}
/>
<button
type="button"
aria-label="Download figure as SVG"
title="Download as SVG"
aria-label={t("Download figure as SVG")}
title={t("Download as SVG")}
onClick={() => downloadFile("figure.svg", result.svg, "image/svg+xml")}
data-testid="visual-download"
className="rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-accent hover:text-foreground"
@@ -154,8 +155,8 @@ export function VisualOutputCard({
{overlay && (
<button
type="button"
aria-label="Open figure fullscreen"
title="Open fullscreen"
aria-label={t("Open figure fullscreen")}
title={t("Open fullscreen")}
onClick={() => overlay.openFigure(result.svg, inverted)}
data-testid="visual-open"
className="rounded-md p-1.5 text-muted-foreground transition-colors hover:bg-accent hover:text-foreground"