Merge pull request #546 from psychosomat/feature/add-russian-localization

Add Russian localization
This commit is contained in:
Sid
2026-05-09 08:57:12 -07:00
committed by GitHub
9 changed files with 505 additions and 0 deletions
@@ -6,6 +6,7 @@ import esDialogs from "@/i18n/locales/es/dialogs.json";
import frDialogs from "@/i18n/locales/fr/dialogs.json";
import jaJPDialogs from "@/i18n/locales/ja-JP/dialogs.json";
import koKRDialogs from "@/i18n/locales/ko-KR/dialogs.json";
import ruDialogs from "@/i18n/locales/ru/dialogs.json";
import trDialogs from "@/i18n/locales/tr/dialogs.json";
import zhCNDialogs from "@/i18n/locales/zh-CN/dialogs.json";
import zhTWDialogs from "@/i18n/locales/zh-TW/dialogs.json";
@@ -43,6 +44,7 @@ const dialogsByLocale = {
fr: frDialogs,
tr: trDialogs,
"ko-KR": koKRDialogs,
ru: ruDialogs,
"ja-JP": jaJPDialogs,
ar: arDialogs,
} satisfies Record<Locale, { tutorial: Record<string, unknown> }>;
+1
View File
@@ -9,6 +9,7 @@ export const SUPPORTED_LOCALES = [
"ko-KR",
"ja-JP",
"ar",
"ru",
] as const;
export const I18N_NAMESPACES = [
"common",
+50
View File
@@ -0,0 +1,50 @@
{
"actions": {
"cancel": "Отмена",
"save": "Сохранить",
"delete": "Удалить",
"close": "Закрыть",
"share": "Поделиться",
"done": "Готово",
"open": "Открыть",
"upload": "Загрузить",
"export": "Экспорт",
"showInFolder": "Показать в папке",
"file": "Файл",
"edit": "Редактировать",
"view": "Вид",
"window": "Окно",
"quit": "Выход",
"stopRecording": "Остановить запись",
"undo": "Отменить",
"redo": "Повторить",
"cut": "Вырезать",
"copy": "Копировать",
"paste": "Вставить",
"selectAll": "Выделить всё",
"minimize": "Свернуть",
"reload": "Перезагрузить",
"forceReload": "Принудительная перезагрузка",
"toggleDevTools": "Переключить инструменты разработчика",
"actualSize": "Реальный размер",
"zoomIn": "Увеличить",
"zoomOut": "Уменьшить",
"toggleFullScreen": "Полноэкранный режим",
"recordingStatus": "Запись: {{source}}",
"about": "О OpenScreen",
"services": "Сервисы",
"hide": "Скрыть OpenScreen",
"hideOthers": "Скрыть остальные",
"unhide": "Показать все"
},
"playback": {
"play": "Воспроизвести",
"pause": "Пауза",
"fullscreen": "Полный экран",
"exitFullscreen": "Выход из полного экрана"
},
"locale": {
"name": "Русский",
"short": "RU"
}
}
+70
View File
@@ -0,0 +1,70 @@
{
"export": {
"complete": "Экспорт завершён",
"yourFormatReady": "Ваш {{format}} готов",
"showInFolder": "Показать в папке",
"finalizingVideo": "Завершение экспорта видео...",
"compilingGifProgress": "Сборка GIF... {{progress}}%",
"compilingGifWait": "Сборка GIF... Это может занять некоторое время",
"takeMoment": "Это может занять некоторое время...",
"failed": "Экспорт не удался",
"tryAgain": "Пожалуйста, попробуйте снова",
"finalizingVideoTitle": "Завершение видео",
"compilingGif": "Сборка GIF",
"exportingFormat": "Экспорт {{format}}",
"compiling": "Сборка",
"renderingFrames": "Рендеринг кадров",
"processing": "Обработка...",
"finalizing": "Завершение...",
"compilingStatus": "Сборка...",
"status": "Статус",
"format": "Формат",
"frames": "Кадры",
"cancelExport": "Отменить экспорт",
"savedSuccessfully": "{{format}} успешно сохранён!"
},
"tutorial": {
"triggerLabel": "Как работает обрезка",
"title": "Как работает обрезка",
"description": "Как вырезать ненужные части видео.",
"explanationBefore": "Инструмент обрезки работает путём определения сегментов, которые вы хотите",
"remove": "удалить",
"explanationMiddle": " — всё, что",
"covered": "покрыто",
"explanationAfter": "красным сегментом обрезки, будет вырезано при экспорте.",
"visualExample": "Визуальный пример",
"removed": "УДАЛЕНО",
"kept": "Сохранено",
"part1": "Часть 1",
"part2": "Часть 2",
"part3": "Часть 3",
"finalVideo": "Итоговое видео",
"step1Title": "1. Добавить обрезку",
"step1DescriptionBefore": "Нажмите ",
"step1DescriptionAfter": " или нажмите на значок ножниц, чтобы отметить секцию для удаления.",
"step2Title": "2. Настроить",
"step2Description": "Перетащите края красной области, чтобы точно покрыть то, что вы хотите вырезать."
},
"unsavedChanges": {
"title": "Несохранённые изменения",
"message": "У вас есть несохранённые изменения.",
"detail": "Хотите сохранить проект перед закрытием?",
"saveAndClose": "Сохранить и закрыть",
"discardAndClose": "Отменить и закрыть",
"loadProject": "Загрузить проект…",
"saveProject": "Сохранить проект…",
"saveProjectAs": "Сохранить проект как…"
},
"fileDialogs": {
"saveGif": "Сохранить экспортированный GIF",
"saveVideo": "Сохранить экспортированное видео",
"selectVideo": "Выбрать видеофайл",
"saveProject": "Сохранить проект OpenScreen",
"openProject": "Открыть проект OpenScreen",
"gifImage": "GIF изображение",
"mp4Video": "MP4 видео",
"videoFiles": "Видеофайлы",
"openscreenProject": "Проект OpenScreen",
"allFiles": "Все файлы"
}
}
+45
View File
@@ -0,0 +1,45 @@
{
"newRecording": {
"title": "Вернуться к записи",
"description": "Ваша текущая сессия была сохранена.",
"cancel": "Отмена",
"confirm": "Подтвердить"
},
"loadingVideo": "Загрузка видео...",
"errors": {
"noVideoLoaded": "Видео не загружено",
"videoNotReady": "Видео не готово",
"unableToDetermineSourcePath": "Не удалось определить путь к исходному видео",
"failedToSaveGif": "Не удалось сохранить GIF",
"gifExportFailed": "Экспорт GIF не удался",
"failedToSaveVideo": "Не удалось сохранить видео",
"exportFailed": "Экспорт не удался",
"exportFailedWithError": "Экспорт не удался: {{error}}",
"exportBackgroundLoadFailed": "Экспорт не удался: не удалось загрузить фоновое изображение ({{url}})",
"failedToSaveExport": "Не удалось сохранить экспорт",
"failedToSaveExportedVideo": "Не удалось сохранить экспортированное видео",
"failedToRevealInFolder": "Ошибка при показе в папке: {{error}}"
},
"export": {
"canceled": "Экспорт отменён",
"exportedSuccessfully": "{{format}} успешно экспортирован"
},
"project": {
"saveCanceled": "Сохранение проекта отменено",
"failedToSave": "Не удалось сохранить проект",
"savedTo": "Проект сохранён в {{path}}",
"failedToLoad": "Не удалось загрузить проект",
"invalidFormat": "Неверный формат файла проекта",
"loadedFrom": "Проект загружен из {{path}}"
},
"recording": {
"failedCameraAccess": "Не удалось запросить доступ к камере.",
"cameraBlocked": "Доступ к камере заблокирован. Включите его в системных настройках для использования веб-камеры.",
"systemAudioUnavailable": "Системное аудио недоступно. Запись без системного аудио.",
"microphoneDenied": "Доступ к микрофону запрещён. Запись продолжится без аудио.",
"cameraDenied": "Доступ к камере запрещён. Запись продолжится без веб-камеры.",
"cameraDisconnected": "Веб-камера отключена.",
"cameraNotFound": "Камера не найдена.",
"permissionDenied": "Разрешение на запись запрещено. Пожалуйста, разрешите запись экрана."
}
}
+43
View File
@@ -0,0 +1,43 @@
{
"tooltips": {
"hideHUD": "Скрыть HUD",
"closeApp": "Закрыть приложение",
"restartRecording": "Перезапустить запись",
"cancelRecording": "Отменить запись",
"pauseRecording": "Приостановить запись",
"resumeRecording": "Возобновить запись",
"openVideoFile": "Открыть видеофайл",
"openProject": "Открыть проект"
},
"audio": {
"enableSystemAudio": "Включить системное аудио",
"disableSystemAudio": "Отключить системное аудио",
"enableMicrophone": "Включить микрофон",
"disableMicrophone": "Отключить микрофон",
"defaultMicrophone": "Микрофон по умолчанию"
},
"webcam": {
"enableWebcam": "Включить веб-камеру",
"disableWebcam": "Отключить веб-камеру",
"defaultCamera": "Камера по умолчанию",
"searching": "Поиск...",
"noneFound": "Камера не найдена",
"unavailable": "Камера недоступна"
},
"sourceSelector": {
"loading": "Загрузка источников...",
"screens": "Экраны ({{count}})",
"windows": "Окна ({{count}})",
"defaultSourceName": "Экран"
},
"recording": {
"selectSource": "Пожалуйста, выберите источник для записи"
},
"language": "Язык",
"systemLanguagePrompt": {
"title": "Использовать системный язык?",
"description": "Мы обнаружили {{language}} как системный язык. Хотите переключить OpenScreen на {{language}}?",
"switch": "Переключить на {{language}}",
"keepDefault": "Оставить текущий язык"
}
}
+202
View File
@@ -0,0 +1,202 @@
{
"zoom": {
"level": "Уровень масштабирования",
"selectRegion": "Выберите область масштабирования для настройки",
"deleteZoom": "Удалить масштабирование",
"focusMode": {
"title": "Режим фокуса",
"manual": "Ручной",
"auto": "Авто",
"autoDescription": "Камера следует за записанной позицией курсора"
},
"threeD": {
"title": "3D вращение",
"preset": {
"iso": "Изометрия",
"left": "Слева",
"right": "Справа"
}
}
},
"speed": {
"playbackSpeed": "Скорость воспроизведения",
"selectRegion": "Выберите область скорости для настройки",
"deleteRegion": "Удалить область скорости",
"customPlaybackSpeed": "Пользовательская скорость воспроизведения",
"maxSpeedError": "Скорость не может быть выше 16×"
},
"trim": {
"deleteRegion": "Удалить область обрезки"
},
"layout": {
"title": "Макет",
"preset": "Пресет",
"selectPreset": "Выбрать пресет",
"pictureInPicture": "Картинка в картинке",
"verticalStack": "Вертикальный стек",
"dualFrame": "Двойной кадр",
"webcamShape": "Форма камеры",
"webcamSize": "Размер веб-камеры"
},
"effects": {
"title": "Видеоэффекты",
"blurBg": "Размытие фона",
"motionBlur": "Размытие движения",
"off": "выкл",
"on": "вкл",
"shadow": "Тень",
"roundness": "Скругление",
"padding": "Отступ",
"cursorHighlight": {
"title": "Подсветка курсора",
"style": "Стиль",
"dot": "Точка",
"ring": "Кольцо",
"size": "Размер",
"onlyOnClicks": "Только при кликах",
"color": "Цвет",
"offsetX": "Смещение X (записи окон)",
"offsetY": "Смещение Y",
"accessibilityPermissionTitle": "Требуется разрешение на доступность",
"accessibilityPermissionDescription": "Откройте Системные настройки → Конфиденциальность и безопасность → Универсальный доступ, включите Openscreen, затем перезапустите приложение."
}
},
"background": {
"title": "Фон",
"image": "Изображение",
"color": "Цвет",
"gradient": "Градиент",
"uploadCustom": "Загрузить свой",
"gradientLabel": "Градиент {{index}}",
"colorWheel": "Цветовой круг",
"colorPalette": "Палитра цветов"
},
"crop": {
"title": "Обрезка",
"cropVideo": "Обрезать видео",
"dragInstruction": "Перетащите каждую сторону для настройки области обрезки",
"ratio": "Соотношение сторон",
"free": "Свободно",
"done": "Готово",
"lockAspectRatio": "Заблокировать соотношение сторон",
"unlockAspectRatio": "Разблокировать соотношение сторон"
},
"exportFormat": {
"mp4": "MP4",
"gif": "GIF",
"mp4Video": "MP4 видео",
"mp4Description": "Видеофайл высокого качества",
"gifAnimation": "GIF анимация",
"gifDescription": "Анимированное изображение для обмена"
},
"exportQuality": {
"title": "Качество экспорта",
"low": "Низкое",
"medium": "Среднее",
"high": "Высокое"
},
"gifSettings": {
"frameRate": "Частота кадров GIF",
"size": "Размер GIF",
"loop": "Зациклить GIF"
},
"project": {
"save": "Сохранить проект",
"load": "Загрузить проект"
},
"export": {
"videoButton": "Экспорт видео",
"gifButton": "Экспорт GIF",
"chooseSaveLocation": "Выбрать место сохранения"
},
"links": {
"reportBug": "Сообщить об ошибке",
"starOnGithub": "Звезда на GitHub"
},
"imageUpload": {
"invalidFileType": "Неверный тип файла",
"jpgOnly": "Пожалуйста, загрузите изображение JPG или JPEG.",
"uploadSuccess": "Пользовательское изображение успешно загружено!",
"failedToUpload": "Не удалось загрузить изображение",
"errorReading": "Произошла ошибка при чтении файла."
},
"annotation": {
"title": "Настройки аннотаций",
"active": "Активно",
"typeText": "Текст",
"typeImage": "Изображение",
"typeArrow": "Стрелка",
"typeBlur": "Размытие",
"textContent": "Содержание текста",
"textPlaceholder": "Введите ваш текст...",
"fontStyle": "Стиль шрифта",
"selectStyle": "Выбрать стиль",
"size": "Размер",
"customFonts": "Пользовательские шрифты",
"textColor": "Цвет текста",
"background": "Фон",
"none": "Нет",
"color": "Цвет",
"colorWheel": "Цветовой круг",
"colorPalette": "Палитра цветов",
"clearBackground": "Очистить фон",
"uploadImage": "Загрузить изображение",
"supportedFormats": "Поддерживаемые форматы: JPG, PNG, GIF, WebP",
"arrowDirection": "Направление стрелки",
"strokeWidth": "Толщина линии: {{width}}px",
"arrowColor": "Цвет стрелки",
"blurType": "Тип размытия",
"blurTypeBlur": "Размытие",
"blurTypeMosaic": "Мозаичное размытие",
"blurColor": "Цвет размытия",
"blurColorWhite": "Белый",
"blurColorBlack": "Чёрный",
"blurShape": "Форма размытия",
"blurIntensity": "Интенсивность размытия",
"mosaicBlockSize": "Размер блока мозаики",
"blurShapeRectangle": "Прямоугольник",
"blurShapeOval": "Овал",
"blurShapeFreehand": "От руки",
"deleteAnnotation": "Удалить аннотацию",
"shortcutsAndTips": "Горячие клавиши и советы",
"tipMovePlayhead": "Переместите курсор воспроизведения к перекрывающейся секции аннотации и выберите элемент.",
"tipTabCycle": "Используйте Tab для циклического переключения между перекрывающимися элементами.",
"tipShiftTabCycle": "Используйте Shift+Tab для циклического переключения в обратном направлении.",
"invalidImageType": "Неверный тип файла",
"imageFormatsOnly": "Пожалуйста, загрузите изображение JPG, PNG, GIF или WebP.",
"imageUploadSuccess": "Изображение успешно загружено!",
"failedImageUpload": "Не удалось загрузить изображение"
},
"fontStyles": {
"classic": "Классический",
"editor": "Редактор",
"strong": "Жирный",
"typewriter": "Пишущая машинка",
"deco": "Декоративный",
"simple": "Простой",
"modern": "Современный",
"clean": "Чистый"
},
"customFont": {
"dialogTitle": "Добавить шрифт Google",
"urlLabel": "URL импорта Google Fonts",
"urlPlaceholder": "https://fonts.googleapis.com/css2?family=Roboto&display=swap",
"urlHelp": "Возьмите его из Google Fonts: Выберите шрифт → Нажмите \"Get font\" → Скопируйте URL @import",
"nameLabel": "Отображаемое имя",
"namePlaceholder": "Мой пользовательский шрифт",
"nameHelp": "Так шрифт будет отображаться в селекторе шрифтов",
"addButton": "Добавить шрифт",
"addingButton": "Добавление...",
"errorEmptyUrl": "Пожалуйста, введите URL импорта Google Fonts",
"errorInvalidUrl": "Пожалуйста, введите корректный URL Google Fonts",
"errorEmptyName": "Пожалуйста, введите имя шрифта",
"errorExtractFailed": "Не удалось извлечь семейство шрифтов из URL",
"successMessage": "Шрифт \"{{fontName}}\" успешно добавлен",
"failedToAdd": "Не удалось добавить шрифт",
"errorTimeout": "Загрузка шрифта заняла слишком много времени. Пожалуйста, проверьте URL и попробуйте снова.",
"errorLoadFailed": "Не удалось загрузить шрифт. Пожалуйста, проверьте правильность URL Google Fonts."
},
"language": {
"title": "Язык"
}
}
+37
View File
@@ -0,0 +1,37 @@
{
"title": "Горячие клавиши",
"customize": "Настроить",
"configurable": "Настраиваемые",
"fixed": "Фиксированные",
"pressKey": "Нажмите клавишу…",
"clickToChange": "Нажмите для изменения",
"pressEscToCancel": "Нажмите Esc для отмены",
"helpText": "Нажмите на горячую клавишу, затем нажмите новую комбинацию клавиш. Нажмите Esc для отмены.",
"resetToDefaults": "Сбросить по умолчанию",
"alreadyUsedBy": "Уже используется для {{action}}",
"swap": "Поменять",
"reservedShortcut": "Эта горячая клавиша зарезервирована для \"{{label}}\" и не может быть переназначена.",
"savedToast": "Горячие клавиши сохранены",
"resetToast": "Сброс к горячим клавишам по умолчанию — нажмите Сохранить для применения",
"actions": {
"addZoom": "Добавить масштабирование",
"addTrim": "Добавить обрезку",
"addSpeed": "Изменить скорость",
"addAnnotation": "Добавить аннотацию",
"addBlur": "Добавить размытие",
"addKeyframe": "Добавить ключевой кадр",
"deleteSelected": "Удалить выбранное",
"playPause": "Воспроизведение / Пауза"
},
"fixedActions": {
"undo": "Отменить",
"redo": "Повторить",
"cycleAnnotationsForward": "Циклически переключить аннотации вперёд",
"cycleAnnotationsBackward": "Циклически переключить аннотации назад",
"deleteSelectedAlt": "Удалить выбранное (альт)",
"panTimeline": "Панорамирование таймлайна",
"zoomTimeline": "Масштабирование таймлайна",
"frameBack": "Кадр назад",
"frameForward": "Кадр вперёд"
}
}
+55
View File
@@ -0,0 +1,55 @@
{
"buttons": {
"addZoom": "Добавить масштабирование (Z)",
"suggestZooms": "Предложить масштабирование на основе курсора",
"addTrim": "Добавить обрезку (T)",
"addAnnotation": "Добавить аннотацию (A)",
"addBlur": "Добавить размытие (B)",
"addSpeed": "Изменить скорость (S)"
},
"hints": {
"pressZoom": "Нажмите Z для добавления масштабирования",
"pressTrim": "Нажмите T для добавления обрезки",
"pressAnnotation": "Нажмите A для добавления аннотации",
"pressBlur": "Нажмите B для добавления области размытия",
"pressSpeed": "Нажмите S для изменения скорости"
},
"labels": {
"pan": "Панорамирование",
"zoom": "Масштабирование",
"trim": "Обрезка",
"speed": "Скорость воспроизведения",
"zoomItem": "Масштабирование {{index}}",
"trimItem": "Обрезка {{index}}",
"speedItem": "Скорость воспроизведения {{index}}",
"annotationItem": "Аннотация",
"blurItem": "Размытие {{index}}",
"imageItem": "Изображение",
"emptyText": "Пустой текст"
},
"emptyState": {
"noVideo": "Видео не загружено",
"dragAndDrop": "Перетащите видео для начала редактирования"
},
"errors": {
"cannotPlaceZoom": "Невозможно разместить масштабирование здесь",
"zoomExistsAtLocation": "Масштабирование уже существует в этом месте или недостаточно свободного места.",
"zoomSuggestionUnavailable": "Обработчик предложений масштабирования недоступен",
"noCursorTelemetry": "Нет данных телеметрии курсора",
"noCursorTelemetryDescription": "Сначала запишите screencast для генерации предложений на основе курсора.",
"noUsableTelemetry": "Нет пригодной телеметрии курсора",
"noUsableTelemetryDescription": "Запись не содержит достаточно данных о движении курсора.",
"noDwellMoments": "Не найдено чётких моментов задержки курсора",
"noDwellMomentsDescription": "Попробуйте запись с более медленными паузами курсора на важных действиях.",
"noAutoZoomSlots": "Нет доступных слотов авто-масштабирования",
"noAutoZoomSlotsDescription": "Обнаруженные точки задержки перекрывают существующие области масштабирования.",
"cannotPlaceTrim": "Невозможно разместить обрезку здесь",
"trimExistsAtLocation": "Обрезка уже существует в этом месте или недостаточно свободного места.",
"cannotPlaceSpeed": "Невозможно разместить изменение скорости здесь",
"speedExistsAtLocation": "Область изменения скорости уже существует в этом месте или недостаточно свободного места."
},
"success": {
"addedZoomSuggestions": "Добавлено {{count}} предложение масштабирования на основе курсора",
"addedZoomSuggestionsPlural": "Добавлено {{count}} предложений масштабирования на основе курсора"
}
}