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 -3
View File
@@ -1,4 +1,6 @@
"use client";
import { useI18n } from "@/components/i18n";
import { Button } from "@/components/ui/button";
import {
@@ -31,6 +33,8 @@ import {
import remarkBreaks from "remark-breaks";
import {
Streamdown,
defaultTranslations,
type StreamdownTranslations,
type PluginConfig,
} from "streamdown";
import { mdComponents } from "@/components/md-blocks";
@@ -264,11 +268,12 @@ export const MessageBranchPrevious = ({
children,
...props
}: MessageBranchPreviousProps) => {
const { t } = useI18n();
const { goToPrevious, totalBranches } = useMessageBranch();
return (
<Button
aria-label="Previous branch"
aria-label={t("Previous branch")}
disabled={totalBranches <= 1}
onClick={goToPrevious}
size="icon-sm"
@@ -287,11 +292,12 @@ export const MessageBranchNext = ({
children,
...props
}: MessageBranchNextProps) => {
const { t } = useI18n();
const { goToNext, totalBranches } = useMessageBranch();
return (
<Button
aria-label="Next branch"
aria-label={t("Next branch")}
disabled={totalBranches <= 1}
onClick={goToNext}
size="icon-sm"
@@ -310,6 +316,7 @@ export const MessageBranchPage = ({
className,
...props
}: MessageBranchPageProps) => {
const { t } = useI18n();
const { currentBranch, totalBranches } = useMessageBranch();
return (
@@ -320,7 +327,7 @@ export const MessageBranchPage = ({
)}
{...props}
>
{currentBranch + 1} of {totalBranches}
{currentBranch + 1}{" "}{t("of")}{" "}{totalBranches}
</ButtonGroupText>
);
};
@@ -357,6 +364,8 @@ export const streamdownPlugins = {
export const MessageResponse = memo(
({ className, children, ...props }: MessageResponseProps) => {
const { t } = useI18n();
const translations = Object.fromEntries(Object.entries(defaultTranslations).map(([key, text]) => [key, t(text)])) as Partial<StreamdownTranslations>;
// Legacy backslash delimiters are converted in a single linear scan;
// native dollar math passes through to Streamdown unchanged. Incomplete
// legacy spans are left for a later render when their closer arrives.
@@ -373,6 +382,7 @@ export const MessageResponse = memo(
"lh-prose size-full [&>*:first-child]:mt-0 [&>*:last-child]:mb-0",
className
)}
translations={translations}
components={mdComponents}
plugins={streamdownPlugins}
{...props}