From 904b15d4d3d228f05d0e3170c51ea44a29b195d3 Mon Sep 17 00:00:00 2001 From: Mangalushka Date: Fri, 25 Sep 2026 11:10:57 +0500 Subject: [PATCH] Enable Russian localization The ru/ locale files have shipped since #446, but "ru" was never added to SUPPORTED_LOCALES, so the bundle was never imported and Russian never showed up in the language picker. Register the locale, wire its namespaces into I18nContext, add the label, and translate the 22 strings added to settings after the original contribution (click effects and the caption editor rows). npm run i18n:check passes. Co-Authored-By: Claude Opus 5 --- src/components/video-editor/SettingsPanel.tsx | 1 + src/contexts/I18nContext.tsx | 16 +++++++ src/i18n/config.ts | 1 + src/i18n/locales/ru/settings.json | 44 +++++++++---------- 4 files changed, 40 insertions(+), 22 deletions(-) diff --git a/src/components/video-editor/SettingsPanel.tsx b/src/components/video-editor/SettingsPanel.tsx index 9ea6279d1..f2ea2af4e 100644 --- a/src/components/video-editor/SettingsPanel.tsx +++ b/src/components/video-editor/SettingsPanel.tsx @@ -622,6 +622,7 @@ const APP_LANGUAGE_LABELS: Record = { nl: "Nederlands", ko: "한국어", "pt-BR": "Português", + ru: "Русский", "zh-CN": "簡體中文", "zh-TW": "繁體中文", }; diff --git a/src/contexts/I18nContext.tsx b/src/contexts/I18nContext.tsx index da831a168..44b03fbbf 100644 --- a/src/contexts/I18nContext.tsx +++ b/src/contexts/I18nContext.tsx @@ -70,6 +70,13 @@ import ptBRLaunch from "@/i18n/locales/pt-BR/launch.json"; import ptBRSettings from "@/i18n/locales/pt-BR/settings.json"; import ptBRShortcuts from "@/i18n/locales/pt-BR/shortcuts.json"; import ptBRTimeline from "@/i18n/locales/pt-BR/timeline.json"; +import ruCommon from "@/i18n/locales/ru/common.json"; +import ruDialogs from "@/i18n/locales/ru/dialogs.json"; +import ruEditor from "@/i18n/locales/ru/editor.json"; +import ruLaunch from "@/i18n/locales/ru/launch.json"; +import ruSettings from "@/i18n/locales/ru/settings.json"; +import ruShortcuts from "@/i18n/locales/ru/shortcuts.json"; +import ruTimeline from "@/i18n/locales/ru/timeline.json"; import zhCNCommon from "@/i18n/locales/zh-CN/common.json"; import zhCNDialogs from "@/i18n/locales/zh-CN/dialogs.json"; import zhCNEditor from "@/i18n/locales/zh-CN/editor.json"; @@ -162,6 +169,15 @@ const messages: Record = { dialogs: ptBRDialogs, shortcuts: ptBRShortcuts, }, + ru: { + common: ruCommon, + launch: ruLaunch, + editor: ruEditor, + timeline: ruTimeline, + settings: ruSettings, + dialogs: ruDialogs, + shortcuts: ruShortcuts, + }, "zh-CN": { common: zhCNCommon, launch: zhCNLaunch, diff --git a/src/i18n/config.ts b/src/i18n/config.ts index 567d72efe..00f12d07f 100644 --- a/src/i18n/config.ts +++ b/src/i18n/config.ts @@ -9,6 +9,7 @@ export const SUPPORTED_LOCALES = [ "nl", "ko", "pt-BR", + "ru", "zh-CN", "zh-TW", ] as const; diff --git a/src/i18n/locales/ru/settings.json b/src/i18n/locales/ru/settings.json index aadb70e02..bfcb35f5d 100644 --- a/src/i18n/locales/ru/settings.json +++ b/src/i18n/locales/ru/settings.json @@ -96,29 +96,29 @@ "cursorSpringMass": "Масса (инерция)", "off": "Выкл.", "cursorClickEffects": { - "title": "Click Effects", - "advanced": "Advanced", - "advancedShow": "Show advanced click effect controls", - "advancedHide": "Hide advanced click effect controls", - "color": "Effect Color", - "size": "Effect Size", - "opacity": "Effect Opacity", - "duration": "Effect Duration", + "title": "Эффекты клика", + "advanced": "Дополнительно", + "advancedShow": "Показать дополнительные настройки эффекта клика", + "advancedHide": "Скрыть дополнительные настройки эффекта клика", + "color": "Цвет эффекта", + "size": "Размер эффекта", + "opacity": "Прозрачность эффекта", + "duration": "Длительность эффекта", "none": { - "label": "Off", - "description": "No click graphic. Only the cursor motion changes when you click." + "label": "Выкл.", + "description": "Без графики при клике — меняется только движение курсора." }, "ripple": { - "label": "Ripple", - "description": "Expanding rings radiate from each click so taps read clearly in motion." + "label": "Волны", + "description": "От каждого клика расходятся круги, поэтому нажатия хорошо читаются в движении." }, "spotlight": { - "label": "Spotlight", - "description": "A soft halo flashes around the pointer to emphasize the clicked area." + "label": "Подсветка", + "description": "Вокруг курсора вспыхивает мягкий ореол и подчёркивает место клика." }, "echo": { - "label": "Echo", - "description": "A pair of soft rings that spread outward with a cleaner pulse." + "label": "Эхо", + "description": "Пара мягких колец расходится наружу более чётким импульсом." } }, "cursorMotionBlur": "Размытие в движении", @@ -192,12 +192,12 @@ "backgroundOpacity": "Прозрачность фона", "textColor": "Цвет текста", "editor": { - "text": "Text", - "start": "Start", - "end": "End", - "split": "Split", - "merge": "Merge", - "delete": "Delete" + "text": "Текст", + "start": "Начало", + "end": "Конец", + "split": "Разделить", + "merge": "Объединить", + "delete": "Удалить" } }, "crop": {