feat: pipeline templates, analytics opt-out, 83 conversion presets, positioning + e2e modernization

Lands five integrated branches: pipeline templates (#355), analytics opt-out (#354), 83 conversion presets bringing the catalog to 240 tools (#356), self-hosted positioning (#353), and e2e modernization (#351).

Integration fixes: aligned stale web analytics tests with the opt-out/allow-list model, closed 3 CodeQL incomplete-sanitization alerts in the i18n generator, resolved settings/index/docs/format-matrix conflicts, and corrected tool counts to 240.
This commit is contained in:
SnapOtter
2026-06-28 18:57:53 +08:00
committed by GitHub
parent 88af8d46fb
commit 63a03d26f2
421 changed files with 17308 additions and 2540 deletions
+386 -3
View File
@@ -73,6 +73,340 @@ export const ru: TranslationKeys = {
documentsAndFiles: "PDF и файлы",
},
tools: {
// BEGIN conversion-presets (generated by scripts/generate-conversion-i18n.mjs)
"jpg-to-png": {
name: "JPG в PNG",
description: "Конвертируйте JPG в PNG онлайн. Быстро, бесплатно и приватно.",
},
"png-to-jpg": {
name: "PNG в JPG",
description: "Конвертируйте PNG в JPG онлайн. Быстро, бесплатно и приватно.",
},
"jpg-to-webp": {
name: "JPG в WebP",
description: "Конвертируйте JPG в WebP онлайн. Быстро, бесплатно и приватно.",
},
"png-to-webp": {
name: "PNG в WebP",
description: "Конвертируйте PNG в WebP онлайн. Быстро, бесплатно и приватно.",
},
"webp-to-jpg": {
name: "WebP в JPG",
description: "Конвертируйте WebP в JPG онлайн. Быстро, бесплатно и приватно.",
},
"webp-to-png": {
name: "WebP в PNG",
description: "Конвертируйте WebP в PNG онлайн. Быстро, бесплатно и приватно.",
},
"jpg-to-avif": {
name: "JPG в AVIF",
description: "Конвертируйте JPG в AVIF онлайн. Быстро, бесплатно и приватно.",
},
"png-to-avif": {
name: "PNG в AVIF",
description: "Конвертируйте PNG в AVIF онлайн. Быстро, бесплатно и приватно.",
},
"webp-to-avif": {
name: "WebP в AVIF",
description: "Конвертируйте WebP в AVIF онлайн. Быстро, бесплатно и приватно.",
},
"heic-to-jpg": {
name: "HEIC в JPG",
description: "Конвертируйте HEIC в JPG онлайн. Быстро, бесплатно и приватно.",
},
"heic-to-png": {
name: "HEIC в PNG",
description: "Конвертируйте HEIC в PNG онлайн. Быстро, бесплатно и приватно.",
},
"heic-to-avif": {
name: "HEIC в AVIF",
description: "Конвертируйте HEIC в AVIF онлайн. Быстро, бесплатно и приватно.",
},
"jpg-to-gif": {
name: "JPG в GIF",
description: "Конвертируйте JPG в GIF онлайн. Быстро, бесплатно и приватно.",
},
"png-to-gif": {
name: "PNG в GIF",
description: "Конвертируйте PNG в GIF онлайн. Быстро, бесплатно и приватно.",
},
"gif-to-jpg": {
name: "GIF в JPG",
description: "Конвертируйте GIF в JPG онлайн. Быстро, бесплатно и приватно.",
},
"gif-to-png": {
name: "GIF в PNG",
description: "Конвертируйте GIF в PNG онлайн. Быстро, бесплатно и приватно.",
},
"webp-to-gif": {
name: "WebP в GIF",
description: "Конвертируйте WebP в GIF онлайн. Быстро, бесплатно и приватно.",
},
"jpg-to-tiff": {
name: "JPG в TIFF",
description: "Конвертируйте JPG в TIFF онлайн. Быстро, бесплатно и приватно.",
},
"png-to-tiff": {
name: "PNG в TIFF",
description: "Конвертируйте PNG в TIFF онлайн. Быстро, бесплатно и приватно.",
},
"tiff-to-jpg": {
name: "TIFF в JPG",
description: "Конвертируйте TIFF в JPG онлайн. Быстро, бесплатно и приватно.",
},
"tiff-to-png": {
name: "TIFF в PNG",
description: "Конвертируйте TIFF в PNG онлайн. Быстро, бесплатно и приватно.",
},
"psd-to-jpg": {
name: "PSD в JPG",
description: "Конвертируйте PSD в JPG онлайн. Быстро, бесплатно и приватно.",
},
"psd-to-png": {
name: "PSD в PNG",
description: "Конвертируйте PSD в PNG онлайн. Быстро, бесплатно и приватно.",
},
"png-to-eps": {
name: "PNG в EPS",
description: "Конвертируйте PNG в EPS онлайн. Быстро, бесплатно и приватно.",
},
"jpg-to-eps": {
name: "JPG в EPS",
description: "Конвертируйте JPG в EPS онлайн. Быстро, бесплатно и приватно.",
},
"eps-to-png": {
name: "EPS в PNG",
description: "Конвертируйте EPS в PNG онлайн. Быстро, бесплатно и приватно.",
},
"eps-to-jpg": {
name: "EPS в JPG",
description: "Конвертируйте EPS в JPG онлайн. Быстро, бесплатно и приватно.",
},
"png-to-svg": {
name: "PNG в SVG",
description: "Конвертируйте PNG в SVG онлайн. Быстро, бесплатно и приватно.",
},
"jpg-to-svg": {
name: "JPG в SVG",
description: "Конвертируйте JPG в SVG онлайн. Быстро, бесплатно и приватно.",
},
"tiff-to-svg": {
name: "TIFF в SVG",
description: "Конвертируйте TIFF в SVG онлайн. Быстро, бесплатно и приватно.",
},
"psd-to-svg": {
name: "PSD в SVG",
description: "Конвертируйте PSD в SVG онлайн. Быстро, бесплатно и приватно.",
},
"eps-to-svg": {
name: "EPS в SVG",
description: "Конвертируйте EPS в SVG онлайн. Быстро, бесплатно и приватно.",
},
"svg-to-png": {
name: "SVG в PNG",
description: "Конвертируйте SVG в PNG онлайн. Быстро, бесплатно и приватно.",
},
"svg-to-jpg": {
name: "SVG в JPG",
description: "Конвертируйте SVG в JPG онлайн. Быстро, бесплатно и приватно.",
},
"jpg-to-pdf": {
name: "JPG в PDF",
description: "Конвертируйте JPG в PDF онлайн. Быстро, бесплатно и приватно.",
},
"png-to-pdf": {
name: "PNG в PDF",
description: "Конвертируйте PNG в PDF онлайн. Быстро, бесплатно и приватно.",
},
"heic-to-pdf": {
name: "HEIC в PDF",
description: "Конвертируйте HEIC в PDF онлайн. Быстро, бесплатно и приватно.",
},
"tiff-to-pdf": {
name: "TIFF в PDF",
description: "Конвертируйте TIFF в PDF онлайн. Быстро, бесплатно и приватно.",
},
"webp-to-pdf": {
name: "WebP в PDF",
description: "Конвертируйте WebP в PDF онлайн. Быстро, бесплатно и приватно.",
},
"gif-to-pdf": {
name: "GIF в PDF",
description: "Конвертируйте GIF в PDF онлайн. Быстро, бесплатно и приватно.",
},
"eps-to-pdf": {
name: "EPS в PDF",
description: "Конвертируйте EPS в PDF онлайн. Быстро, бесплатно и приватно.",
},
"pdf-to-jpg": {
name: "PDF в JPG",
description: "Конвертируйте PDF в JPG онлайн. Быстро, бесплатно и приватно.",
},
"pdf-to-png": {
name: "PDF в PNG",
description: "Конвертируйте PDF в PNG онлайн. Быстро, бесплатно и приватно.",
},
"pdf-to-tiff": {
name: "PDF в TIFF",
description: "Конвертируйте PDF в TIFF онлайн. Быстро, бесплатно и приватно.",
},
"mov-to-mp4": {
name: "MOV в MP4",
description: "Конвертируйте MOV в MP4 онлайн. Быстро, бесплатно и приватно.",
},
"webm-to-mp4": {
name: "WEBM в MP4",
description: "Конвертируйте WEBM в MP4 онлайн. Быстро, бесплатно и приватно.",
},
"mkv-to-mp4": {
name: "MKV в MP4",
description: "Конвертируйте MKV в MP4 онлайн. Быстро, бесплатно и приватно.",
},
"avi-to-mp4": {
name: "AVI в MP4",
description: "Конвертируйте AVI в MP4 онлайн. Быстро, бесплатно и приватно.",
},
"mp4-to-mov": {
name: "MP4 в MOV",
description: "Конвертируйте MP4 в MOV онлайн. Быстро, бесплатно и приватно.",
},
"mp4-to-webm": {
name: "MP4 в WEBM",
description: "Конвертируйте MP4 в WEBM онлайн. Быстро, бесплатно и приватно.",
},
"webm-to-mov": {
name: "WEBM в MOV",
description: "Конвертируйте WEBM в MOV онлайн. Быстро, бесплатно и приватно.",
},
"mkv-to-mov": {
name: "MKV в MOV",
description: "Конвертируйте MKV в MOV онлайн. Быстро, бесплатно и приватно.",
},
"avi-to-mov": {
name: "AVI в MOV",
description: "Конвертируйте AVI в MOV онлайн. Быстро, бесплатно и приватно.",
},
"mp4-to-avi": {
name: "MP4 в AVI",
description: "Конвертируйте MP4 в AVI онлайн. Быстро, бесплатно и приватно.",
},
"mov-to-avi": {
name: "MOV в AVI",
description: "Конвертируйте MOV в AVI онлайн. Быстро, бесплатно и приватно.",
},
"mkv-to-avi": {
name: "MKV в AVI",
description: "Конвертируйте MKV в AVI онлайн. Быстро, бесплатно и приватно.",
},
"avi-to-mkv": {
name: "AVI в MKV",
description: "Конвертируйте AVI в MKV онлайн. Быстро, бесплатно и приватно.",
},
"mp4-to-gif": {
name: "MP4 в GIF",
description: "Конвертируйте MP4 в GIF онлайн. Быстро, бесплатно и приватно.",
},
"mov-to-gif": {
name: "MOV в GIF",
description: "Конвертируйте MOV в GIF онлайн. Быстро, бесплатно и приватно.",
},
"mkv-to-gif": {
name: "MKV в GIF",
description: "Конвертируйте MKV в GIF онлайн. Быстро, бесплатно и приватно.",
},
"avi-to-gif": {
name: "AVI в GIF",
description: "Конвертируйте AVI в GIF онлайн. Быстро, бесплатно и приватно.",
},
"gif-to-mp4": {
name: "GIF в MP4",
description: "Конвертируйте GIF в MP4 онлайн. Быстро, бесплатно и приватно.",
},
"gif-to-webm": {
name: "GIF в WEBM",
description: "Конвертируйте GIF в WEBM онлайн. Быстро, бесплатно и приватно.",
},
"gif-to-mov": {
name: "GIF в MOV",
description: "Конвертируйте GIF в MOV онлайн. Быстро, бесплатно и приватно.",
},
"mp4-to-mp3": {
name: "MP4 в MP3",
description: "Конвертируйте MP4 в MP3 онлайн. Быстро, бесплатно и приватно.",
},
"mov-to-mp3": {
name: "MOV в MP3",
description: "Конвертируйте MOV в MP3 онлайн. Быстро, бесплатно и приватно.",
},
"mkv-to-mp3": {
name: "MKV в MP3",
description: "Конвертируйте MKV в MP3 онлайн. Быстро, бесплатно и приватно.",
},
"webm-to-mp3": {
name: "WEBM в MP3",
description: "Конвертируйте WEBM в MP3 онлайн. Быстро, бесплатно и приватно.",
},
"avi-to-mp3": {
name: "AVI в MP3",
description: "Конвертируйте AVI в MP3 онлайн. Быстро, бесплатно и приватно.",
},
"mp4-to-wav": {
name: "MP4 в WAV",
description: "Конвертируйте MP4 в WAV онлайн. Быстро, бесплатно и приватно.",
},
"mov-to-wav": {
name: "MOV в WAV",
description: "Конвертируйте MOV в WAV онлайн. Быстро, бесплатно и приватно.",
},
"mp4-to-ogg": {
name: "MP4 в OGG",
description: "Конвертируйте MP4 в OGG онлайн. Быстро, бесплатно и приватно.",
},
"m4a-to-mp3": {
name: "M4A в MP3",
description: "Конвертируйте M4A в MP3 онлайн. Быстро, бесплатно и приватно.",
},
"m4a-to-wav": {
name: "M4A в WAV",
description: "Конвертируйте M4A в WAV онлайн. Быстро, бесплатно и приватно.",
},
"aac-to-mp3": {
name: "AAC в MP3",
description: "Конвертируйте AAC в MP3 онлайн. Быстро, бесплатно и приватно.",
},
"aac-to-wav": {
name: "AAC в WAV",
description: "Конвертируйте AAC в WAV онлайн. Быстро, бесплатно и приватно.",
},
"aac-to-flac": {
name: "AAC в FLAC",
description: "Конвертируйте AAC в FLAC онлайн. Быстро, бесплатно и приватно.",
},
"ogg-to-mp3": {
name: "OGG в MP3",
description: "Конвертируйте OGG в MP3 онлайн. Быстро, бесплатно и приватно.",
},
"ogg-to-wav": {
name: "OGG в WAV",
description: "Конвертируйте OGG в WAV онлайн. Быстро, бесплатно и приватно.",
},
"wav-to-mp3": {
name: "WAV в MP3",
description: "Конвертируйте WAV в MP3 онлайн. Быстро, бесплатно и приватно.",
},
"mp3-to-wav": {
name: "MP3 в WAV",
description: "Конвертируйте MP3 в WAV онлайн. Быстро, бесплатно и приватно.",
},
"flac-to-mp3": {
name: "FLAC в MP3",
description: "Конвертируйте FLAC в MP3 онлайн. Быстро, бесплатно и приватно.",
},
"excel-to-csv": {
name: "Excel в CSV",
description: "Конвертируйте Excel в CSV онлайн. Быстро, бесплатно и приватно.",
},
// END conversion-presets
resize: {
name: "Изменение размера",
description: "Изменение размера в пикселях, процентах или по шаблонам соцсетей",
@@ -150,7 +484,7 @@ export const ru: TranslationKeys = {
description: "Удаление нежелательных объектов с помощью AI",
},
ocr: {
name: "OCR / Извлечение текста",
name: "Извлечь текст из изображения (OCR)",
description: "Извлечение текста из изображений с точностью AI",
},
"ocr-pdf": {
@@ -2751,6 +3085,14 @@ export const ru: TranslationKeys = {
"Скачать архив с обезличенной конфигурацией, логами и данными задач для диагностики.",
supportBundleFailed: "Не удалось скачать диагностический архив.",
},
privacy: {
title: "Конфиденциальность",
description:
"Анонимная продуктовая аналитика помогает улучшать SnapOtter. Она включена по умолчанию и настраивается для всего экземпляра администратором.",
analyticsLabel: "Анонимная продуктовая аналитика",
analyticsDescription:
"Делитесь анонимными данными об использовании (какие инструменты запускаются, длительность, коды ошибок) и отчётами о сбоях. Без IP-адреса и без идентификации аккаунта. Мы никогда не собираем имена ваших файлов, их содержимое, результаты OCR, метаданные изображений или текст документов. Отключите это, чтобы остановить всё.",
},
security: {
heading: "Безопасность",
description: "Настройки пароля и аутентификации.",
@@ -3046,7 +3388,7 @@ export const ru: TranslationKeys = {
heading: "О программе",
appName: "SnapOtter",
appDescription:
"Самостоятельно размещаемый набор инструментов для обработки файлов с приоритетом конфиденциальности. 157 инструментов. Конвертация, сжатие, редактирование, транскрипция, OCR и автоматизация рабочих процессов с изображениями, видео, аудио, документами и данными без отправки данных в облако.",
"Самостоятельно размещаемый набор инструментов для обработки файлов с приоритетом конфиденциальности. 240 инструментов. Конвертация, сжатие, редактирование, транскрипция, OCR и автоматизация рабочих процессов с изображениями, видео, аудио, документами и данными без отправки данных в облако.",
versionLabel: "Версия:",
linksHeading: "Ссылки",
githubLink: "Репозиторий GitHub",
@@ -3105,7 +3447,7 @@ export const ru: TranslationKeys = {
"Без ограничений. Без скрытых лимитов.",
"Работает полностью офлайн.",
"Пакетная обработка без ограничений.",
"157 инструментов.",
"240 инструментов.",
"16 AI-моделей. На Вашем оборудовании.",
"Молниеносная скорость. На базе Sharp.",
"Готов к изолированным сетям.",
@@ -3170,6 +3512,7 @@ export const ru: TranslationKeys = {
toolPalette: "Палитра инструментов",
clickToAdd: "Нажмите для добавления в Pipeline",
savedLabel: "Сохранённые",
templatesLabel: "Шаблоны",
importButton: "Импорт",
noSavedPipelines: "Нет сохранённых Pipeline",
stepCount: "({count} шаг)",
@@ -3456,4 +3799,44 @@ export const ru: TranslationKeys = {
navigationMenu: "Навигация",
homeLink: "Главная SnapOtter",
},
pipelineTemplates: {
"web-optimize": {
name: "Оптимизация для веба",
description:
"Измените размер, преобразуйте в WebP и сожмите изображение для быстрой загрузки в вебе.",
},
"email-friendly": {
name: "Для электронной почты",
description: "Уменьшите изображение, чтобы его можно было прикрепить к электронному письму.",
},
"privacy-scrub": {
name: "Очистка конфиденциальности",
description: "Удалите EXIF, GPS и другие метаданные, затем сожмите.",
},
"social-square": {
name: "Квадрат для соцсетей",
description: "Обрежьте до квадрата 1:1 и сожмите для публикаций в соцсетях.",
},
"watermark-batch": {
name: "Водяной знак пакетно",
description: "Нанесите текстовый водяной знак на изображения, затем сожмите.",
},
"shrink-pdf-email": {
name: "Уменьшить PDF для почты",
description: "Сведите и сильно сожмите PDF, чтобы он уложился в лимиты электронной почты.",
},
"podcast-polish": {
name: "Шлифовка подкаста",
description: "Удалите тишину, нормализуйте громкость и добавьте плавные переходы к записи.",
},
"cut-out-subject": {
name: "Вырезать объект",
description: "Удалите фон с помощью ИИ и сожмите прозрачную вырезку.",
},
"restore-old-photo": {
name: "Восстановить старое фото",
description:
"Восстановите, раскрасьте и увеличьте старое или повреждённое фото с помощью ИИ.",
},
},
} as const;