From 6ee1b0f7a1b58dd7ae113fc4268067e0ac1e0b3c Mon Sep 17 00:00:00 2001 From: SnapOtter Date: Mon, 22 Jun 2026 16:43:49 +0800 Subject: [PATCH] fix(i18n): translate Ukrainian (uk) UI strings (#313) Translate the ~950 previously-untranslated Ukrainian UI strings (tool names, descriptions, settings labels, dialogs) that were still showing English, and restore the {size} placeholder dropped from settings.aiFeatures.diskUsage. Machine-translated and verified: full key parity with en.ts, all {placeholders} preserved, passes tsc and Biome. Native-speaker review welcome. --- packages/shared/src/i18n/uk.ts | 1971 ++++++++++++++++---------------- 1 file changed, 989 insertions(+), 982 deletions(-) diff --git a/packages/shared/src/i18n/uk.ts b/packages/shared/src/i18n/uk.ts index 1628d77c..d44c4f59 100644 --- a/packages/shared/src/i18n/uk.ts +++ b/packages/shared/src/i18n/uk.ts @@ -12,7 +12,7 @@ export const uk: TranslationKeys = { search: "Пошук інструментів...", dropFiles: "Перетягніть файли сюди або натисніть кнопку завантаження", loading: "Завантаження...", - saving: "Saving...", + saving: "Збереження...", error: "Сталася помилка", confirm: "Підтвердити", close: "Закрити", @@ -37,40 +37,40 @@ export const uk: TranslationKeys = { unexpectedError: "Сталася неочікувана помилка.", retry: "Повторити", privacyPolicy: "Політика конфіденційності", - pageNotFound: "Page not found", - pageNotFoundDescription: "The page you are looking for does not exist or has been moved.", + pageNotFound: "Сторінку не знайдено", + pageNotFoundDescription: "Сторінка, яку ви шукаєте, не існує або була переміщена.", }, categories: { essentials: "Основні", adjustments: "Корекція", - enhance: "Enhance & AI", + enhance: "Покращення та AI", watermark: "Водяний знак і накладання", layout: "Компонування та композиція", utilities: "Утиліти", optimization: "Оптимізація", format: "Формат і конвертація", "video-edit": "Video", - "video-convert": "Convert", - "video-effects": "Effects & Compose", - "video-subtitles": "Subtitles", - "video-metadata": "Metadata", - "audio-edit": "Edit", - "audio-convert": "Convert", - "audio-effects": "Effects & Compose", - "audio-metadata": "Metadata", - "pdf-organize": "Organize", - "pdf-edit": "Edit & Annotate", - "pdf-security": "Security", - "pdf-optimize": "Optimize", - "doc-convert": "Convert", - data: "Files", - archives: "Archives", + "video-convert": "Конвертація", + "video-effects": "Ефекти та композиція", + "video-subtitles": "Субтитри", + "video-metadata": "Метадані", + "audio-edit": "Редагування", + "audio-convert": "Конвертація", + "audio-effects": "Ефекти та композиція", + "audio-metadata": "Метадані", + "pdf-organize": "Впорядкування", + "pdf-edit": "Редагування та анотації", + "pdf-security": "Безпека", + "pdf-optimize": "Оптимізація", + "doc-convert": "Конвертація", + data: "Файли", + archives: "Архіви", }, modalities: { - image: "Image", + image: "Зображення", video: "Video", audio: "Audio", - documentsAndFiles: "PDF & Files", + documentsAndFiles: "PDF та файли", }, tools: { resize: { @@ -266,8 +266,8 @@ export const uk: TranslationKeys = { "Генерація стилізованих QR-кодів з налаштовуваними кольорами, візерунками та логотипами", }, "html-to-image": { - name: "HTML to Image", - description: "Capture webpages as high-quality images", + name: "HTML у зображення", + description: "Захоплення вебсторінок як якісних зображень", }, "barcode-read": { name: "Сканер штрихкодів", @@ -297,40 +297,41 @@ export const uk: TranslationKeys = { "Додавання градієнтних фонів, рамок пристроїв, тіней та розмірів для соцмереж до знімків екрана", }, "circle-crop": { - name: "Circle Crop", - description: "Crop image to a centered circle with transparent corners", + name: "Кругове обрізання", + description: "Обрізати зображення до кола по центру з прозорими кутами", }, duotone: { - name: "Duotone", - description: "Apply a two-color duotone effect with custom shadow and highlight colors", + name: "Дуотон", + description: "Двоколірний ефект дуотону з налаштуванням кольорів тіней та світла", }, "image-pad": { - name: "Image Pad", - description: "Pad image to a target aspect ratio with a solid color background", + name: "Відступи зображення", + description: + "Додати відступи до цільового співвідношення сторін із суцільним кольоровим фоном", }, pixelate: { - name: "Pixelate", - description: "Apply a pixelation effect to the full image or a specific region", + name: "Піксилізація", + description: "Ефект піксилізації на все зображення або окрему ділянку", }, vignette: { - name: "Vignette", - description: "Add a vignette effect with adjustable strength and color", + name: "Віньєтка", + description: "Додати ефект віньєтки з регульованою інтенсивністю та кольором", }, "gif-webp": { - name: "GIF/WebP Converter", - description: "Convert animated GIF to WebP and vice versa, preserving all frames", + name: "Конвертер GIF/WebP", + description: "Конвертувати анімований GIF у WebP і навпаки зі збереженням усіх кадрів", }, histogram: { - name: "Histogram", - description: "Generate an RGB histogram chart from an image", + name: "Гістограма", + description: "Створити діаграму RGB-гістограми із зображення", }, "lqip-placeholder": { - name: "LQIP Placeholder", - description: "Generate a tiny low-quality image placeholder with base64 data URI", + name: "LQIP-заповнювач", + description: "Створити мініатюрний заповнювач низької якості з base64 data URI", }, "sprite-sheet": { - name: "Sprite Sheet", - description: "Combine multiple images into a single sprite sheet grid", + name: "Спрайт-аркуш", + description: "Об'єднати кілька зображень в один спрайт-аркуш", }, "svg-to-raster": { name: "SVG у растр", @@ -351,383 +352,385 @@ export const uk: TranslationKeys = { description: "Конвертація зображень у рядки Base64 для вбудовування у HTML, CSS та інше", }, "barcode-generate": { - name: "Barcode Generator", - description: "Generate barcodes in Code 128, EAN-13, UPC-A, Code 39, ITF-14, and Data Matrix", + name: "Генератор штрихкодів", + description: + "Створити штрихкоди у форматах Code 128, EAN-13, UPC-A, Code 39, ITF-14 та Data Matrix", }, "chart-maker": { - name: "Chart Maker", - description: "Create bar, line, or pie charts from CSV or JSON data", + name: "Створення діаграм", + description: "Створити стовпчикові, лінійні або кругові діаграми з даних CSV або JSON", }, "convert-video": { - name: "Convert Video", - description: "Convert videos between MP4, MOV, and WebM", + name: "Конвертація відео", + description: "Конвертувати відео між форматами MP4, MOV та WebM", }, "compress-video": { - name: "Compress Video", - description: "Shrink video file size with quality control", + name: "Стиснення відео", + description: "Зменшити розмір відеофайлу з контролем якості", }, "trim-video": { - name: "Trim Video", - description: "Cut a clip out of a video", + name: "Обрізка відео", + description: "Вирізати фрагмент із відео", }, "mute-video": { - name: "Mute Video", - description: "Remove the audio track from a video", + name: "Вимкнення звуку відео", + description: "Видалити аудіодоріжку з відео", }, "video-to-gif": { - name: "Video to GIF", - description: "Turn a video clip into an animated GIF", + name: "Відео у GIF", + description: "Перетворити відеокліп на анімований GIF", }, "resize-video": { - name: "Resize Video", - description: "Scale a video to a new resolution or preset size", + name: "Зміна розміру відео", + description: "Масштабувати відео до нової роздільності або стандартного розміру", }, "crop-video": { - name: "Crop Video", - description: "Crop a region out of a video", + name: "Кадрування відео", + description: "Обрізати область відеокадру", }, "rotate-video": { - name: "Rotate Video", - description: "Rotate or flip a video", + name: "Обертання відео", + description: "Обернути або відзеркалити відео", }, "change-fps": { - name: "Change FPS", - description: "Change the frame rate of a video", + name: "Зміна FPS", + description: "Змінити частоту кадрів відео", }, "video-color": { - name: "Video Color", - description: "Adjust brightness, contrast, saturation, and gamma", + name: "Колір відео", + description: "Налаштувати яскравість, контраст, насиченість та гамму", }, "video-speed": { - name: "Video Speed", - description: "Speed up or slow down a video", + name: "Швидкість відео", + description: "Прискорити або сповільнити відтворення відео", }, "reverse-video": { - name: "Reverse Video", - description: "Play a video clip backwards", + name: "Реверс відео", + description: "Відтворити відеокліп у зворотному порядку", }, "video-loudnorm": { - name: "Normalize Audio", - description: "Normalize video audio volume to broadcast standard", + name: "Нормалізація звуку", + description: "Нормалізувати гучність аудіо відео до ефірного стандарту", }, "aspect-pad": { - name: "Aspect Pad", - description: "Add solid-color bars to fit a target aspect ratio", + name: "Відступи за пропорціями", + description: "Додати суцільні смуги для цільового співвідношення сторін", }, "blur-pad": { - name: "Blur Pad", - description: "Fill bars with a blurred copy of the video", + name: "Розмиті відступи", + description: "Заповнити смуги розмитою копією відео", }, "watermark-video": { - name: "Watermark Video", - description: "Burn a text watermark onto video frames", + name: "Водяний знак на відео", + description: "Накласти текстовий водяний знак на кадри відео", }, "stabilize-video": { - name: "Stabilize Video", - description: "Reduce camera shake with two-pass stabilization", + name: "Стабілізація відео", + description: "Зменшити тремтіння камери двопрохідною стабілізацією", }, "gif-to-video": { - name: "GIF to Video", - description: "Convert an animated GIF into an MP4 or WebM video", + name: "GIF у відео", + description: "Конвертувати анімований GIF у відео MP4 або WebM", }, "video-to-webp": { - name: "Video to WebP", - description: "Convert a video clip into an animated WebP image", + name: "Відео у WebP", + description: "Конвертувати відеокліп в анімоване зображення WebP", }, "video-to-frames": { - name: "Video to Frames", - description: "Extract frames from a video as a ZIP of images", + name: "Відео у кадри", + description: "Витягти кадри з відео як ZIP-архів зображень", }, "merge-videos": { - name: "Merge Videos", - description: "Join multiple video clips into one file", + name: "Об'єднання відео", + description: "З'єднати кілька відеокліпів в один файл", }, "replace-audio": { - name: "Replace Audio", - description: "Swap the audio track of a video with another file", + name: "Заміна аудіо", + description: "Замінити аудіодоріжку відео іншим файлом", }, "burn-subtitles": { - name: "Burn Subtitles", - description: "Permanently render subtitles onto video frames", + name: "Вшивання субтитрів", + description: "Назавжди накласти субтитри на кадри відео", }, "embed-subtitles": { - name: "Embed Subtitles", - description: "Mux a subtitle track into the video container", + name: "Вбудовування субтитрів", + description: "Додати доріжку субтитрів у контейнер відео", }, "extract-subtitles": { - name: "Extract Subtitles", - description: "Pull the subtitle track out of a video as an SRT file", + name: "Витягнення субтитрів", + description: "Витягти доріжку субтитрів з відео як файл SRT", }, "images-to-video": { - name: "Images to Video", - description: "Turn a set of images into a slideshow video", + name: "Зображення у відео", + description: "Перетворити набір зображень на слайд-шоу відео", }, "video-metadata": { - name: "Clean Video Metadata", - description: "Strip metadata from a video and report what was found", + name: "Очищення метаданих відео", + description: "Видалити метадані з відео та показати знайдене", }, "convert-audio": { - name: "Convert Audio", - description: "Convert audio between MP3, WAV, OGG, and more", + name: "Конвертація аудіо", + description: "Конвертувати аудіо між форматами MP3, WAV, OGG та іншими", }, "trim-audio": { - name: "Trim Audio", - description: "Cut a section out of an audio file", + name: "Обрізка аудіо", + description: "Вирізати фрагмент з аудіофайлу", }, "extract-audio": { - name: "Extract Audio", - description: "Pull the audio track out of a video", + name: "Витягнення аудіо", + description: "Витягти аудіодоріжку з відео", }, "volume-adjust": { - name: "Volume Adjust", - description: "Increase or decrease audio volume by a fixed gain", + name: "Регулювання гучності", + description: "Збільшити або зменшити гучність аудіо на фіксоване значення", }, "normalize-audio": { - name: "Normalize Audio", - description: "Even out loudness to broadcast standard levels", + name: "Нормалізація аудіо", + description: "Вирівняти гучність до ефірного стандарту", }, "fade-audio": { - name: "Fade Audio", - description: "Add fade-in and fade-out effects to audio", + name: "Затухання аудіо", + description: "Додати ефекти наростання та затухання до аудіо", }, "reverse-audio": { - name: "Reverse Audio", - description: "Play audio backwards", + name: "Реверс аудіо", + description: "Відтворити аудіо у зворотному порядку", }, "audio-speed": { - name: "Audio Speed", - description: "Speed up or slow down audio playback", + name: "Швидкість аудіо", + description: "Прискорити або сповільнити відтворення аудіо", }, "pitch-shift": { - name: "Pitch Shift", - description: "Raise or lower pitch by semitones without changing speed", + name: "Зміна тону", + description: "Підвищити або понизити тон на півтони без зміни швидкості", }, "audio-channels": { - name: "Audio Channels", - description: "Convert between mono, stereo, or swap left and right channels", + name: "Аудіоканали", + description: "Конвертувати між моно, стерео або поміняти лівий та правий канали", }, "silence-removal": { - name: "Silence Removal", - description: "Strip silent sections from audio", + name: "Видалення тиші", + description: "Видалити тихі ділянки з аудіо", }, "noise-reduction": { - name: "Noise Reduction", - description: "Reduce background noise with FFT-based denoising", + name: "Зменшення шуму", + description: "Зменшити фоновий шум за допомогою FFT-шумозаглушення", }, "merge-audio": { - name: "Merge Audio", - description: "Combine multiple audio files into one", + name: "Об'єднання аудіо", + description: "Об'єднати кілька аудіофайлів в один", }, "split-audio": { - name: "Split Audio", - description: "Split audio by time, equal parts, or silence detection", + name: "Розділення аудіо", + description: "Розділити аудіо за часом, на рівні частини або за виявленням тиші", }, "ringtone-maker": { - name: "Ringtone Maker", - description: "Create a ringtone clip from any audio file", + name: "Створення рингтону", + description: "Створити рингтон з будь-якого аудіофайлу", }, "waveform-image": { - name: "Waveform Image", - description: "Generate a waveform visualization as a PNG image", + name: "Зображення хвильової форми", + description: "Створити візуалізацію хвильової форми як зображення PNG", }, "audio-metadata": { - name: "Audio Metadata", - description: "View, edit, or strip audio tags (ID3)", + name: "Метадані аудіо", + description: "Переглянути, змінити або видалити теги аудіо (ID3)", }, "merge-pdf": { - name: "Merge PDFs", - description: "Combine multiple PDFs into one", + name: "Об'єднання PDF", + description: "Об'єднати кілька PDF в один", }, "split-pdf": { - name: "Split PDF", - description: "Extract pages or split into parts", + name: "Розділення PDF", + description: "Витягти сторінки або розділити на частини", }, "compress-pdf": { - name: "Compress PDF", - description: "Shrink PDF file size", + name: "Стиснення PDF", + description: "Зменшити розмір файлу PDF", }, "rotate-pdf": { - name: "Rotate PDF", - description: "Rotate pages in a PDF", + name: "Обертання PDF", + description: "Обернути сторінки в PDF", }, "convert-document": { - name: "Convert Document", - description: "Convert between Word, OpenDocument, RTF, and plain text formats", + name: "Конвертація документа", + description: "Конвертувати між форматами Word, OpenDocument, RTF та простим текстом", }, "convert-presentation": { - name: "Convert Presentation", - description: "Convert between PowerPoint and OpenDocument presentation formats", + name: "Конвертація презентації", + description: "Конвертувати між форматами PowerPoint та OpenDocument для презентацій", }, "convert-spreadsheet": { - name: "Convert Spreadsheet", + name: "Конвертація таблиці", description: - "Convert between Excel, OpenDocument, and CSV formats. Multi-sheet workbooks export the first sheet to CSV.", + "Конвертувати між форматами Excel, OpenDocument та CSV. Для книг з кількома аркушами в CSV експортується перший аркуш.", }, "excel-to-pdf": { - name: "Excel to PDF", - description: "Convert spreadsheets to PDF. Wide sheets may paginate across multiple pages.", + name: "Excel у PDF", + description: + "Конвертувати таблиці у PDF. Широкі аркуші можуть розбиватися на кілька сторінок.", }, "word-to-pdf": { - name: "Word to PDF", - description: "Convert Word documents to PDF", + name: "Word у PDF", + description: "Конвертувати документи Word у PDF", }, "extract-pages": { - name: "Extract Pages", - description: "Pull selected pages into a new PDF", + name: "Витягнення сторінок", + description: "Витягти вибрані сторінки в новий PDF", }, "remove-pages": { - name: "Remove Pages", - description: "Delete specific pages from a PDF", + name: "Видалення сторінок", + description: "Видалити певні сторінки з PDF", }, "organize-pdf": { - name: "Organize PDF", - description: "Reorder pages with an explicit page order", + name: "Впорядкування PDF", + description: "Змінити порядок сторінок за вказаною послідовністю", }, "protect-pdf": { - name: "Protect PDF", - description: "Add password protection (AES-256 encryption)", + name: "Захист PDF", + description: "Додати захист паролем (шифрування AES-256)", }, "unlock-pdf": { - name: "Unlock PDF", - description: "Remove password protection from a PDF", + name: "Розблокування PDF", + description: "Зняти захист паролем із PDF", }, "repair-pdf": { - name: "Repair PDF", - description: "Attempt to repair a damaged or corrupted PDF", + name: "Відновлення PDF", + description: "Спробувати відновити пошкоджений PDF", }, "linearize-pdf": { - name: "Web-Optimize PDF", - description: "Linearize a PDF for fast web viewing", + name: "Оптимізація PDF для вебу", + description: "Лінеаризувати PDF для швидкого перегляду в інтернеті", }, "grayscale-pdf": { - name: "Grayscale PDF", - description: "Convert all colors to grayscale", + name: "PDF у відтінках сірого", + description: "Перетворити всі кольори на відтінки сірого", }, "pdfa-convert": { - name: "PDF/A Convert", - description: "Convert to archival PDF/A-2", + name: "Конвертація у PDF/A", + description: "Конвертувати в архівний формат PDF/A-2", }, "crop-pdf": { - name: "Crop PDF", - description: "Crop all pages with a uniform margin", + name: "Обрізання PDF", + description: "Обрізати всі сторінки з однаковими полями", }, "nup-pdf": { name: "N-up PDF", - description: "Arrange multiple pages per sheet", + description: "Розмістити кілька сторінок на одному аркуші", }, "booklet-pdf": { - name: "Booklet PDF", - description: "Arrange pages for folding into a booklet", + name: "Буклет PDF", + description: "Розмістити сторінки для згортання в буклет", }, "watermark-pdf": { - name: "Watermark PDF", - description: "Add a text watermark to every page", + name: "Водяний знак PDF", + description: "Додати текстовий водяний знак на кожну сторінку", }, "pdf-page-numbers": { - name: "PDF Page Numbers", - description: "Add page numbers to every page", + name: "Нумерація сторінок PDF", + description: "Додати номери сторінок на кожну сторінку", }, "flatten-pdf": { - name: "Flatten PDF", - description: "Bake forms and annotations into page content", + name: "Зведення PDF", + description: "Вбудувати форми та анотації у вміст сторінок", }, "redact-pdf": { - name: "Redact PDF", - description: "Permanently remove text occurrences (verified true redaction)", + name: "Затирання PDF", + description: "Назавжди видалити входження тексту (перевірене справжнє затирання)", }, "pdf-to-text": { - name: "PDF to Text", - description: "Extract plain text from a PDF", + name: "PDF у текст", + description: "Витягти простий текст з PDF", }, "pdf-to-word": { - name: "PDF to Word", - description: "Best for text-based PDFs; scanned pages need OCR", + name: "PDF у Word", + description: "Найкраще для текстових PDF; скановані сторінки потребують OCR", }, "pdf-metadata": { - name: "PDF Metadata", - description: "Read and write PDF document metadata", + name: "Метадані PDF", + description: "Читати та записувати метадані документа PDF", }, "powerpoint-to-pdf": { - name: "PowerPoint to PDF", - description: "Convert presentations to PDF", + name: "PowerPoint у PDF", + description: "Конвертувати презентації у PDF", }, "html-to-pdf": { - name: "HTML to PDF", - description: "Convert an HTML file to PDF. Remote resources are disabled for privacy.", + name: "HTML у PDF", + description: "Конвертувати HTML-файл у PDF. Зовнішні ресурси вимкнені для конфіденційності.", }, "markdown-to-docx": { - name: "Markdown to Word", - description: "Convert a Markdown file to a Word document (DOCX)", + name: "Markdown у Word", + description: "Конвертувати файл Markdown у документ Word (DOCX)", }, "markdown-to-html": { - name: "Markdown to HTML", + name: "Markdown у HTML", description: - "Convert a Markdown file to a standalone HTML page. Remote images in the source are left as-is in the output.", + "Конвертувати файл Markdown у самостійну HTML-сторінку. Зовнішні зображення залишаються без змін.", }, "markdown-to-pdf": { - name: "Markdown to PDF", + name: "Markdown у PDF", description: - "Convert a Markdown file to a styled PDF. Remote resources are disabled for privacy.", + "Конвертувати файл Markdown у стилізований PDF. Зовнішні ресурси вимкнені для конфіденційності.", }, "epub-convert": { - name: "Convert EPUB", + name: "Конвертація EPUB", description: - "Convert an EPUB to PDF, DOCX, HTML, or Markdown. Remote resources inside the book are not fetched.", + "Конвертувати EPUB у PDF, DOCX, HTML або Markdown. Зовнішні ресурси книги не завантажуються.", }, "to-epub": { - name: "Convert to EPUB", - description: "Convert Word, Markdown, HTML, or plain text files to EPUB", + name: "Конвертація в EPUB", + description: "Конвертувати файли Word, Markdown, HTML або простий текст в EPUB", }, "csv-excel": { - name: "CSV to Excel", - description: "Convert between CSV and Excel (XLSX), both directions", + name: "CSV у Excel", + description: "Конвертувати між CSV та Excel (XLSX) в обох напрямках", }, "csv-json": { - name: "CSV to JSON", - description: "Convert between CSV and JSON, both directions", + name: "CSV у JSON", + description: "Конвертувати між CSV та JSON в обох напрямках", }, "json-xml": { - name: "JSON to XML", - description: "Convert between JSON and XML, both directions", + name: "JSON у XML", + description: "Конвертувати між JSON та XML в обох напрямках", }, "split-csv": { - name: "Split CSV", - description: "Split a CSV into smaller files by row count", + name: "Розділення CSV", + description: "Розділити CSV на менші файли за кількістю рядків", }, "merge-csvs": { - name: "Merge CSVs", - description: "Combine multiple CSV or TSV files with matching columns into one", + name: "Об'єднання CSV", + description: "Об'єднати кілька файлів CSV або TSV з відповідними стовпцями в один", }, "yaml-json": { name: "YAML / JSON", - description: "Convert between YAML and JSON, both directions", + description: "Конвертувати між YAML та JSON в обох напрямках", }, "xml-to-csv": { - name: "XML to CSV", - description: "Extract repeating elements from XML into a CSV table", + name: "XML у CSV", + description: "Витягти повторювані елементи з XML у таблицю CSV", }, "create-zip": { - name: "Create ZIP", - description: "Bundle multiple files into a single ZIP archive", + name: "Створення ZIP", + description: "Запакувати кілька файлів в один архів ZIP", }, "extract-zip": { - name: "Extract ZIP", + name: "Розпакування ZIP", description: - "Safely extract files from a ZIP archive with bomb protection. Single-file archives return the file directly.", + "Безпечно розпакувати файли з архіву ZIP із захистом від ZIP-бомб. Архіви з одним файлом повертають файл напряму.", }, pipeline: { name: "Конструктор Pipeline", description: "Об'єднання кількох інструментів у робочий процес", }, - processing: { canceled: "Processing canceled" }, + processing: { canceled: "Обробку скасовано" }, mediaPlayer: { - unsupported: "Your browser does not support this media format.", + unsupported: "Ваш браузер не підтримує цей медіаформат.", }, documentView: { - loadFailed: "Failed to load document.", - previousPage: "Previous page", - nextPage: "Next page", - inputNotPreviewable: "Preview not available for this file type", + loadFailed: "Не вдалося завантажити документ.", + previousPage: "Попередня сторінка", + nextPage: "Наступна сторінка", + inputNotPreviewable: "Попередній перегляд недоступний для цього типу файлу", }, }, toolSettings: { @@ -1054,13 +1057,13 @@ export const uk: TranslationKeys = { intensity: "Інтенсивність", addShadow: "Додати тінь", opacity: "Непрозорість", - outputFormat: "Output Format", - edgeSmoothing: "Edge Smoothing", - edgeSmoothingOff: "Off", - edgeSmoothingLight: "Light", - edgeSmoothingMedium: "Medium", - edgeSmoothingStrong: "Strong", - colorDecontamination: "Color Decontamination", + outputFormat: "Формат виводу", + edgeSmoothing: "Згладжування країв", + edgeSmoothingOff: "Вимкнено", + edgeSmoothingLight: "Легке", + edgeSmoothingMedium: "Середнє", + edgeSmoothingStrong: "Сильне", + colorDecontamination: "Очищення кольору", rendering: "Рендеринг...", submit: "Видалити фон", submitBatch: "Видалити фон ({count} файлів)", @@ -1111,7 +1114,7 @@ export const uk: TranslationKeys = { language: "Мова", autoDetect: "Автовизначення", pages: "Сторiнки", - pagesPlaceholder: "all, 1-3, 5", + pagesPlaceholder: "всі, 1-3, 5", pagesHint: "Введiть номери сторiнок або дiапазони (напр. 1-3, 5, 8-10). Макс. 50 сторiнок.", submit: "Витягнути текст", submitBatch: "Витягнути текст ({count} файлiв)", @@ -1422,8 +1425,8 @@ export const uk: TranslationKeys = { submit: "Додати текст", submitBatch: "Додати текст ({count} файлів)", progressLabel: "Додавання тексту", - download: "Download", - defaultText: "Your Text Here", + download: "Завантажити", + defaultText: "Ваш текст тут", }, compose: { uploadOverlay: "Завантажити зображення для накладання", @@ -1465,13 +1468,13 @@ export const uk: TranslationKeys = { hasExif: "EXIF", hasIcc: "ICC", hasXmp: "XMP", - readInfo: "Read Info", - reading: "Reading...", - channelStats: "Channel Stats", - yes: "Yes", - no: "No", - na: "N/A", - failedToRead: "Failed to read info", + readInfo: "Прочитати інформацію", + reading: "Зчитування...", + channelStats: "Статистика каналів", + yes: "Так", + no: "Ні", + na: "Н/Д", + failedToRead: "Не вдалося прочитати інформацію", }, compare: { uploadSecondImage: "Завантажити друге зображення", @@ -1519,29 +1522,29 @@ export const uk: TranslationKeys = { }, "html-to-image": { modeUrl: "URL", - modeHtml: "HTML File", - htmlFile: "HTML File", + modeHtml: "HTML-файл", + htmlFile: "HTML-файл", url: "URL", urlPlaceholder: "https://snapotter.com", - format: "Output Format", - quality: "Quality", - devicePreset: "Device", - viewportWidth: "Width", - viewportHeight: "Height", - fullPage: "Full Page", - submit: "Capture", - download: "Download Screenshot", - capturing: "Capturing webpage...", - errorTimeout: "Page took too long to load", - errorBlocked: "This URL cannot be captured", - errorUnavailable: "Screenshot service is not available", - errorFailed: "Failed to capture the page", - placeholder: "Enter a URL and click Capture", + format: "Формат виводу", + quality: "Якість", + devicePreset: "Пристрій", + viewportWidth: "Ширина", + viewportHeight: "Висота", + fullPage: "Вся сторінка", + submit: "Захопити", + download: "Завантажити знімок", + capturing: "Захоплення сторінки...", + errorTimeout: "Сторінка завантажувалась занадто довго", + errorBlocked: "Цей URL неможливо захопити", + errorUnavailable: "Сервіс знімків екрана недоступний", + errorFailed: "Не вдалося захопити сторінку", + placeholder: "Введіть URL і натисніть Захопити", presets: { desktop: "Desktop", tablet: "Tablet", mobile: "Mobile", - custom: "Custom", + custom: "Довільний", }, }, "barcode-read": { @@ -1633,61 +1636,61 @@ export const uk: TranslationKeys = { progressLabel: "Прикрашання знімку екрана", }, "circle-crop": { - submit: "Circle Crop", - submitBatch: "Circle Crop ({count} files)", - progressLabel: "Cropping to circle", + submit: "Кругове обрізання", + submitBatch: "Кругове обрізання ({count} файлів)", + progressLabel: "Обрізання по колу", }, duotone: { - shadow: "Shadow Color", - highlight: "Highlight Color", - submit: "Apply Duotone", - submitBatch: "Apply Duotone ({count} files)", - progressLabel: "Applying duotone", + shadow: "Колір тіні", + highlight: "Колір світла", + submit: "Застосувати двотон", + submitBatch: "Застосувати двотон ({count} файлів)", + progressLabel: "Застосування двотону", }, "image-pad": { - target: "Target Ratio", - color: "Background Color", - submit: "Pad Image", - submitBatch: "Pad Image ({count} files)", - progressLabel: "Padding image", + target: "Цільове співвідношення", + color: "Колір фону", + submit: "Додати поля", + submitBatch: "Додати поля ({count} файлів)", + progressLabel: "Додавання полів", }, pixelate: { - blockSize: "Block Size", - submit: "Pixelate", - submitBatch: "Pixelate ({count} files)", - progressLabel: "Pixelating", + blockSize: "Розмір блоку", + submit: "Пікселізувати", + submitBatch: "Пікселізувати ({count} файлів)", + progressLabel: "Пікселізація", }, vignette: { - strength: "Strength", - color: "Vignette Color", - submit: "Apply Vignette", - submitBatch: "Apply Vignette ({count} files)", - progressLabel: "Applying vignette", + strength: "Інтенсивність", + color: "Колір віньєтки", + submit: "Застосувати віньєтку", + submitBatch: "Застосувати віньєтку ({count} файлів)", + progressLabel: "Застосування віньєтки", }, "gif-webp": { - submit: "Convert", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting animation", + submit: "Конвертувати", + submitBatch: "Конвертувати ({count} файлів)", + progressLabel: "Конвертація анімації", }, histogram: { - submit: "Generate Histogram", - submitBatch: "Generate Histogram ({count} files)", - progressLabel: "Generating histogram", + submit: "Створити гістограму", + submitBatch: "Створити гістограму ({count} файлів)", + progressLabel: "Створення гістограми", }, "lqip-placeholder": { - width: "Width", - blur: "Blur", - submit: "Generate Placeholder", - submitBatch: "Generate Placeholder ({count} files)", - progressLabel: "Generating placeholder", + width: "Ширина", + blur: "Розмиття", + submit: "Створити заповнювач", + submitBatch: "Створити заповнювач ({count} файлів)", + progressLabel: "Створення заповнювача", }, "sprite-sheet": { - columns: "Columns", - padding: "Padding", - background: "Background Color", - submit: "Create Sprite Sheet", - submitBatch: "Create Sprite Sheet", - progressLabel: "Creating sprite sheet", + columns: "Стовпці", + padding: "Відступ", + background: "Колір фону", + submit: "Створити спрайт-лист", + submitBatch: "Створити спрайт-лист", + progressLabel: "Створення спрайт-листа", }, "svg-to-raster": { outputFormat: "Формат виводу", @@ -1771,21 +1774,21 @@ export const uk: TranslationKeys = { copyCssUrl: "Копіювати CSS url()", }, "barcode-generate": { - text: "Text", - type: "Barcode Type", - scale: "Scale", - includeText: "Include Text", - submit: "Generate Barcode", - download: "Download Barcode", + text: "Текст", + type: "Тип штрихкоду", + scale: "Масштаб", + includeText: "Додати текст", + submit: "Створити штрихкод", + download: "Завантажити штрихкод", }, "chart-maker": { - kind: "Chart Type", - title: "Title", - width: "Width", - height: "Height", - submit: "Create Chart", - submitBatch: "Create Chart ({count} files)", - progressLabel: "Creating chart", + kind: "Тип діаграми", + title: "Заголовок", + width: "Ширина", + height: "Висота", + submit: "Створити діаграму", + submitBatch: "Створити діаграму ({count} файлів)", + progressLabel: "Створення діаграми", }, "enhance-faces-standalone": { model: "Модель", @@ -1794,623 +1797,623 @@ export const uk: TranslationKeys = { best: "Найкраща", }, "convert-video": { - format: "Output format", - quality: "Quality", - high: "High", - balanced: "Balanced", - small: "Smallest", - submit: "Convert", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + format: "Вихідний формат", + quality: "Якість", + high: "Висока", + balanced: "Збалансована", + small: "Найменший", + submit: "Конвертувати", + submitBatch: "Конвертувати ({count} файлів)", + progressLabel: "Конвертація", }, "compress-video": { - quality: "Compression", - light: "Light", - balanced: "Balanced", - strong: "Strong", - resolution: "Resolution", - original: "Original", - submit: "Compress", - submitBatch: "Compress ({count} files)", - progressLabel: "Compressing", + quality: "Стиснення", + light: "Легке", + balanced: "Збалансоване", + strong: "Сильне", + resolution: "Роздільна здатність", + original: "Оригінальна", + submit: "Стиснути", + submitBatch: "Стиснути ({count} файлів)", + progressLabel: "Стиснення", }, "trim-video": { - start: "Start (seconds)", - end: "End (seconds)", - precise: "Frame-accurate (re-encodes)", - submit: "Trim", - submitBatch: "Trim ({count} files)", - progressLabel: "Trimming", + start: "Початок (секунди)", + end: "Кінець (секунди)", + precise: "Покадрова точність (перекодування)", + submit: "Обрізати", + submitBatch: "Обрізати ({count} файлів)", + progressLabel: "Обрізання", }, "mute-video": { - submit: "Remove audio", - submitBatch: "Remove audio ({count} files)", - progressLabel: "Muting", + submit: "Видалити аудіо", + submitBatch: "Видалити аудіо ({count} файлів)", + progressLabel: "Вимкнення звуку", }, "video-to-gif": { - fps: "Frames per second", - width: "Width (px)", - start: "Start (seconds)", - duration: "Duration (seconds)", - submit: "Create GIF", - submitBatch: "Create GIFs ({count} files)", - progressLabel: "Creating GIF", + fps: "Кадрів на секунду", + width: "Ширина (px)", + start: "Початок (секунди)", + duration: "Тривалість (секунди)", + submit: "Створити GIF", + submitBatch: "Створити GIF ({count} файлів)", + progressLabel: "Створення GIF", }, "resize-video": { preset: "Preset", - width: "Width (px)", - height: "Height (px)", - hint: "Leave one dimension empty to keep aspect ratio", - submit: "Resize", - submitBatch: "Resize ({count} files)", - progressLabel: "Resizing", + width: "Ширина (px)", + height: "Висота (px)", + hint: "Залиште одне поле порожнім, щоб зберегти пропорції", + submit: "Змінити розмір", + submitBatch: "Змінити розмір ({count} файлів)", + progressLabel: "Зміна розміру", }, "crop-video": { - width: "Width (px)", - height: "Height (px)", - x: "X offset", - y: "Y offset", - submit: "Crop", - submitBatch: "Crop ({count} files)", - progressLabel: "Cropping", + width: "Ширина (px)", + height: "Висота (px)", + x: "Зміщення X", + y: "Зміщення Y", + submit: "Обрізати", + submitBatch: "Обрізати ({count} файлів)", + progressLabel: "Обрізання", }, "rotate-video": { - transform: "Transform", - cw90: "Rotate 90 clockwise", - ccw90: "Rotate 90 counter-clockwise", - rotate180: "Rotate 180", - hflip: "Flip horizontal", - vflip: "Flip vertical", - submit: "Rotate", - submitBatch: "Rotate ({count} files)", - progressLabel: "Rotating", + transform: "Трансформація", + cw90: "Повернути на 90° за годинниковою стрілкою", + ccw90: "Повернути на 90° проти годинникової стрілки", + rotate180: "Повернути на 180°", + hflip: "Відобразити горизонтально", + vflip: "Відобразити вертикально", + submit: "Повернути", + submitBatch: "Повернути ({count} файлів)", + progressLabel: "Обертання", }, "change-fps": { - fps: "Frames per second", - submit: "Change FPS", - submitBatch: "Change FPS ({count} files)", - progressLabel: "Changing FPS", + fps: "Кадрів на секунду", + submit: "Змінити FPS", + submitBatch: "Змінити FPS ({count} файлів)", + progressLabel: "Зміна FPS", }, "video-color": { - brightness: "Brightness", - contrast: "Contrast", - saturation: "Saturation", + brightness: "Яскравість", + contrast: "Контраст", + saturation: "Насиченість", gamma: "Gamma", - submit: "Apply", - submitBatch: "Apply ({count} files)", - progressLabel: "Adjusting color", + submit: "Застосувати", + submitBatch: "Застосувати ({count} файлів)", + progressLabel: "Налаштування кольору", }, "video-speed": { - factor: "Speed factor", - keepPitch: "Keep original pitch", - submit: "Change speed", - submitBatch: "Change speed ({count} files)", - progressLabel: "Changing speed", + factor: "Множник швидкості", + keepPitch: "Зберегти оригінальну висоту тону", + submit: "Змінити швидкість", + submitBatch: "Змінити швидкість ({count} файлів)", + progressLabel: "Зміна швидкості", }, "reverse-video": { - hint: "Limited to clips up to 5 minutes", - submit: "Reverse", - submitBatch: "Reverse ({count} files)", - progressLabel: "Reversing", + hint: "Обмежено кліпами до 5 хвилин", + submit: "Реверс", + submitBatch: "Реверс ({count} файлів)", + progressLabel: "Реверсування", }, "video-loudnorm": { - hint: "Normalizes audio to EBU R128 broadcast standard", - submit: "Normalize", - submitBatch: "Normalize ({count} files)", - progressLabel: "Normalizing", + hint: "Нормалізує аудіо до стандарту мовлення EBU R128", + submit: "Нормалізувати", + submitBatch: "Нормалізувати ({count} файлів)", + progressLabel: "Нормалізація", }, "aspect-pad": { - target: "Target ratio", - color: "Background color", - colorHint: "Hex color, e.g. #000000", - submit: "Pad", - submitBatch: "Pad ({count} files)", - progressLabel: "Padding", + target: "Цільове співвідношення", + color: "Колір фону", + colorHint: "HEX-колір, напр. #000000", + submit: "Додати поля", + submitBatch: "Додати поля ({count} файлів)", + progressLabel: "Додавання полів", }, "blur-pad": { - target: "Target ratio", - blur: "Blur strength", - submit: "Pad", - submitBatch: "Pad ({count} files)", - progressLabel: "Padding", + target: "Цільове співвідношення", + blur: "Сила розмиття", + submit: "Додати поля", + submitBatch: "Додати поля ({count} файлів)", + progressLabel: "Додавання полів", }, "watermark-video": { - text: "Watermark text", - position: "Position", - fontSize: "Font size", - opacity: "Opacity", - color: "Color", - colorHint: "Hex color, e.g. #ffffff", - submit: "Watermark", - submitBatch: "Watermark ({count} files)", - progressLabel: "Watermarking", + text: "Текст водяного знаку", + position: "Позиція", + fontSize: "Розмір шрифту", + opacity: "Прозорість", + color: "Колір", + colorHint: "HEX-колір, напр. #ffffff", + submit: "Водяний знак", + submitBatch: "Водяний знак ({count} файлів)", + progressLabel: "Нанесення водяного знаку", }, "stabilize-video": { - smoothing: "Smoothing", - hint: "Runs two passes and takes longer than most tools", - submit: "Stabilize", - submitBatch: "Stabilize ({count} files)", - progressLabel: "Stabilizing", + smoothing: "Згладжування", + hint: "Виконує два проходи і працює довше за більшість інструментів", + submit: "Стабілізувати", + submitBatch: "Стабілізувати ({count} файлів)", + progressLabel: "Стабілізація", }, "gif-to-video": { - format: "Output format", - submit: "Convert", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + format: "Вихідний формат", + submit: "Конвертувати", + submitBatch: "Конвертувати ({count} файлів)", + progressLabel: "Конвертація", }, "video-to-webp": { - fps: "Frames per second", - width: "Width (px)", - quality: "Quality", - loop: "Loop animation", - submit: "Convert", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + fps: "Кадрів на секунду", + width: "Ширина (px)", + quality: "Якість", + loop: "Зациклити анімацію", + submit: "Конвертувати", + submitBatch: "Конвертувати ({count} файлів)", + progressLabel: "Конвертація", }, "video-to-frames": { - mode: "Extraction mode", - modeAll: "All frames", - modeNth: "Every Nth frame", - modeTimestamps: "Specific timestamps", - n: "Take every Nth frame", - timestamps: "Timestamps (seconds)", - timestampsHint: "Comma-separated, e.g. 0.5, 2, 4.5", - format: "Image format", - submit: "Extract Frames", - submitBatch: "Extract Frames ({count} files)", - progressLabel: "Extracting frames", + mode: "Режим видобування", + modeAll: "Усі кадри", + modeNth: "Кожен N-й кадр", + modeTimestamps: "Конкретні мітки часу", + n: "Брати кожен N-й кадр", + timestamps: "Мітки часу (секунди)", + timestampsHint: "Через кому, напр. 0.5, 2, 4.5", + format: "Формат зображення", + submit: "Видобути кадри", + submitBatch: "Видобути кадри ({count} файлів)", + progressLabel: "Видобування кадрів", }, "merge-videos": { - hint: "Files are joined in upload order", - submit: "Merge", - submitBatch: "Merge ({count} files)", - progressLabel: "Merging", + hint: "Файли об'єднуються в порядку завантаження", + submit: "Об'єднати", + submitBatch: "Об'єднати ({count} файлів)", + progressLabel: "Об'єднання", }, "replace-audio": { - hint: "Upload the video first, then the audio", - submit: "Replace Audio", - submitBatch: "Replace Audio ({count} files)", - progressLabel: "Replacing audio", + hint: "Спочатку завантажте відео, потім аудіо", + submit: "Замінити аудіо", + submitBatch: "Замінити аудіо ({count} файлів)", + progressLabel: "Заміна аудіо", }, "burn-subtitles": { - fontSize: "Font size", - hint: "Upload a video and a subtitle file (.srt or .vtt)", - submit: "Burn Subtitles", - submitBatch: "Burn Subtitles ({count} files)", - progressLabel: "Burning subtitles", + fontSize: "Розмір шрифту", + hint: "Завантажте відео та файл субтитрів (.srt або .vtt)", + submit: "Вшити субтитри", + submitBatch: "Вшити субтитри ({count} файлів)", + progressLabel: "Вшивання субтитрів", }, "embed-subtitles": { - language: "Language code", - languageHint: "Three-letter ISO 639-2 code, e.g. eng, spa, fra", - submit: "Embed Subtitles", - submitBatch: "Embed Subtitles ({count} files)", - progressLabel: "Embedding subtitles", + language: "Код мови", + languageHint: "Трилітерний код ISO 639-2, напр. eng, spa, fra", + submit: "Вбудувати субтитри", + submitBatch: "Вбудувати субтитри ({count} файлів)", + progressLabel: "Вбудовування субтитрів", }, "extract-subtitles": { - submit: "Extract Subtitles", - submitBatch: "Extract Subtitles ({count} files)", - progressLabel: "Extracting subtitles", + submit: "Видобути субтитри", + submitBatch: "Видобути субтитри ({count} файлів)", + progressLabel: "Видобування субтитрів", }, "images-to-video": { - secondsPerImage: "Seconds per image", - resolution: "Resolution", - fps: "Frames per second", - submit: "Create Video", - submitBatch: "Create Video ({count} files)", - progressLabel: "Creating slideshow", + secondsPerImage: "Секунд на зображення", + resolution: "Роздільна здатність", + fps: "Кадрів на секунду", + submit: "Створити відео", + submitBatch: "Створити відео ({count} файлів)", + progressLabel: "Створення слайд-шоу", }, "video-metadata": { - hint: "Metadata report appears in the result", - submit: "Strip Metadata", - submitBatch: "Strip Metadata ({count} files)", - progressLabel: "Stripping metadata", + hint: "Звіт метаданих з'явиться у результаті", + submit: "Видалити метадані", + submitBatch: "Видалити метадані ({count} файлів)", + progressLabel: "Видалення метаданих", }, "convert-audio": { - format: "Output format", - bitrate: "Bitrate (kbps)", - submit: "Convert", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + format: "Вихідний формат", + bitrate: "Бітрейт (kbps)", + submit: "Конвертувати", + submitBatch: "Конвертувати ({count} файлів)", + progressLabel: "Конвертація", }, "trim-audio": { - start: "Start (seconds)", - end: "End (seconds)", - submit: "Trim", - submitBatch: "Trim ({count} files)", - progressLabel: "Trimming", + start: "Початок (секунди)", + end: "Кінець (секунди)", + submit: "Обрізати", + submitBatch: "Обрізати ({count} файлів)", + progressLabel: "Обрізання", }, "extract-audio": { - format: "Output format", - submit: "Extract", - submitBatch: "Extract ({count} files)", - progressLabel: "Extracting", + format: "Вихідний формат", + submit: "Видобути", + submitBatch: "Видобути ({count} файлів)", + progressLabel: "Видобування", }, "volume-adjust": { - "gain-db": "Gain (dB)", - submit: "Adjust Volume", - submitBatch: "Adjust Volume ({count} files)", - progressLabel: "Adjusting volume", + "gain-db": "Підсилення (dB)", + submit: "Налаштувати гучність", + submitBatch: "Налаштувати гучність ({count} файлів)", + progressLabel: "Налаштування гучності", }, "normalize-audio": { - hint: "EBU R128 loudness normalization", - submit: "Normalize", - submitBatch: "Normalize ({count} files)", - progressLabel: "Normalizing", + hint: "Нормалізація гучності EBU R128", + submit: "Нормалізувати", + submitBatch: "Нормалізувати ({count} файлів)", + progressLabel: "Нормалізація", }, "fade-audio": { - "fade-in-s": "Fade in (seconds)", - "fade-out-s": "Fade out (seconds)", - submit: "Apply Fade", - submitBatch: "Apply Fade ({count} files)", - progressLabel: "Applying fade", + "fade-in-s": "Наростання (секунди)", + "fade-out-s": "Затухання (секунди)", + submit: "Застосувати затухання", + submitBatch: "Застосувати затухання ({count} файлів)", + progressLabel: "Застосування затухання", }, "reverse-audio": { - submit: "Reverse", - submitBatch: "Reverse ({count} files)", - progressLabel: "Reversing", + submit: "Реверс", + submitBatch: "Реверс ({count} файлів)", + progressLabel: "Реверсування", }, "audio-speed": { - factor: "Speed factor", - submit: "Change Speed", - submitBatch: "Change Speed ({count} files)", - progressLabel: "Changing speed", + factor: "Коефіцієнт швидкості", + submit: "Змінити швидкість", + submitBatch: "Змінити швидкість ({count} файлів)", + progressLabel: "Зміна швидкості", }, "pitch-shift": { - semitones: "Semitones", - hint: "0 semitones is not allowed", - submit: "Shift Pitch", - submitBatch: "Shift Pitch ({count} files)", - progressLabel: "Shifting pitch", + semitones: "Напівтони", + hint: "0 напівтонів не дозволено", + submit: "Змінити тон", + submitBatch: "Змінити тон ({count} файлів)", + progressLabel: "Зміна тону", }, "audio-channels": { - mode: "Channel mode", - "stereo-to-mono": "Stereo to mono", - "mono-to-stereo": "Mono to stereo", - swap: "Swap left/right", - submit: "Convert Channels", - submitBatch: "Convert Channels ({count} files)", - progressLabel: "Converting channels", + mode: "Режим каналів", + "stereo-to-mono": "Стерео в моно", + "mono-to-stereo": "Моно в стерео", + swap: "Поміняти лівий/правий", + submit: "Конвертувати канали", + submitBatch: "Конвертувати канали ({count} файлів)", + progressLabel: "Конвертація каналів", }, "silence-removal": { - "threshold-db": "Silence threshold (dB)", - "min-silence-s": "Minimum silence duration (seconds)", - submit: "Remove Silence", - submitBatch: "Remove Silence ({count} files)", - progressLabel: "Removing silence", + "threshold-db": "Поріг тиші (dB)", + "min-silence-s": "Мінімальна тривалість тиші (секунди)", + submit: "Видалити тишу", + submitBatch: "Видалити тишу ({count} файлів)", + progressLabel: "Видалення тиші", }, "noise-reduction": { - strength: "Strength", - light: "Light", - medium: "Medium", - strong: "Strong", - submit: "Reduce Noise", - submitBatch: "Reduce Noise ({count} files)", - progressLabel: "Reducing noise", + strength: "Інтенсивність", + light: "Легка", + medium: "Середня", + strong: "Сильна", + submit: "Зменшити шум", + submitBatch: "Зменшити шум ({count} файлів)", + progressLabel: "Зменшення шуму", }, "merge-audio": { - format: "Output format", + format: "Вихідний формат", mp3: "MP3", wav: "WAV", flac: "FLAC", m4a: "M4A", - "order-hint": "Files will be joined in upload order", - submit: "Merge Audio", - submitBatch: "Merge Audio ({count} files)", - progressLabel: "Merging audio", + "order-hint": "Файли буде об'єднано в порядку завантаження", + submit: "Об'єднати аудіо", + submitBatch: "Об'єднати аудіо ({count} файлів)", + progressLabel: "Об'єднання аудіо", }, "split-audio": { - mode: "Split mode", - time: "By time", - parts: "Equal parts", - silence: "By silence", - "segment-s": "Segment length (seconds)", - "num-parts": "Number of parts", - "threshold-db": "Silence threshold (dB)", - "min-silence-s": "Minimum silence duration (seconds)", - submit: "Split Audio", - submitBatch: "Split Audio ({count} files)", - progressLabel: "Splitting audio", + mode: "Режим розділення", + time: "За часом", + parts: "Рівні частини", + silence: "За тишею", + "segment-s": "Довжина сегмента (секунди)", + "num-parts": "Кількість частин", + "threshold-db": "Поріг тиші (dB)", + "min-silence-s": "Мінімальна тривалість тиші (секунди)", + submit: "Розділити аудіо", + submitBatch: "Розділити аудіо ({count} файлів)", + progressLabel: "Розділення аудіо", }, "ringtone-maker": { - "start-s": "Start time (seconds)", - "duration-s": "Duration (seconds)", - "max-hint": "Maximum 30 seconds", - submit: "Create Ringtone", - submitBatch: "Create Ringtone ({count} files)", - progressLabel: "Creating ringtone", + "start-s": "Час початку (секунди)", + "duration-s": "Тривалість (секунди)", + "max-hint": "Максимум 30 секунд", + submit: "Створити рингтон", + submitBatch: "Створити рингтон ({count} файлів)", + progressLabel: "Створення рингтону", }, "waveform-image": { - width: "Width (px)", - height: "Height (px)", - color: "Waveform color", - submit: "Generate Waveform", - submitBatch: "Generate Waveform ({count} files)", - progressLabel: "Generating waveform", + width: "Ширина (px)", + height: "Висота (px)", + color: "Колір хвильової форми", + submit: "Створити хвильову форму", + submitBatch: "Створити хвильову форму ({count} файлів)", + progressLabel: "Створення хвильової форми", }, "audio-metadata": { - strip: "Strip all metadata", - title: "Title", - artist: "Artist", + strip: "Видалити всі метадані", + title: "Назва", + artist: "Виконавець", album: "Album", - submit: "Apply Metadata", - submitBatch: "Apply Metadata ({count} files)", - progressLabel: "Applying metadata", + submit: "Застосувати метадані", + submitBatch: "Застосувати метадані ({count} файлів)", + progressLabel: "Застосування метаданих", }, "merge-pdf": { - addFiles: "Add PDFs to merge", - needTwo: "At least two PDFs are required", - orderHint: "{count} PDFs will merge in this order", - submit: "Merge", - submitBatch: "Merge ({count} files)", - progressLabel: "Merging", + addFiles: "Додайте PDF для об'єднання", + needTwo: "Потрібно щонайменше два PDF", + orderHint: "{count} PDF буде об'єднано в цьому порядку", + submit: "Об'єднати", + submitBatch: "Об'єднати ({count} файлів)", + progressLabel: "Об'єднання", }, "split-pdf": { - mode: "Split mode", - range: "Page range", - rangeHint: "e.g. 1-3, 5, 7-z", - everyN: "Pages per part", - submit: "Split", - submitBatch: "Split ({count} files)", - progressLabel: "Splitting", + mode: "Режим розділення", + range: "Діапазон сторінок", + rangeHint: "напр. 1-3, 5, 7-z", + everyN: "Сторінок на частину", + submit: "Розділити", + submitBatch: "Розділити ({count} файлів)", + progressLabel: "Розділення", }, "compress-pdf": { - preset: "Quality preset", - screen: "Screen (smallest)", - ebook: "Ebook (balanced)", - printer: "Printer (best quality)", - submit: "Compress", - submitBatch: "Compress ({count} files)", - progressLabel: "Compressing", + preset: "Шаблон якості", + screen: "Екран (найменший)", + ebook: "Електронна книга (збалансований)", + printer: "Друк (найкраща якість)", + submit: "Стиснути", + submitBatch: "Стиснути ({count} файлів)", + progressLabel: "Стиснення", }, "rotate-pdf": { - angle: "Rotation angle", - range: "Page range", - rangeHint: "e.g. 1-3, 5, 1-z (all pages)", - submit: "Rotate", - submitBatch: "Rotate ({count} files)", - progressLabel: "Rotating", + angle: "Кут повороту", + range: "Діапазон сторінок", + rangeHint: "напр. 1-3, 5, 1-z (усі сторінки)", + submit: "Повернути", + submitBatch: "Повернути ({count} файлів)", + progressLabel: "Поворот", }, "convert-document": { - format: "Output format", - submit: "Convert", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + format: "Вихідний формат", + submit: "Конвертувати", + submitBatch: "Конвертувати ({count} файлів)", + progressLabel: "Конвертація", }, "convert-presentation": { - format: "Output format", - submit: "Convert", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + format: "Вихідний формат", + submit: "Конвертувати", + submitBatch: "Конвертувати ({count} файлів)", + progressLabel: "Конвертація", }, "convert-spreadsheet": { - format: "Output format", - hint: "Multi-sheet workbooks export the first sheet to CSV.", - submit: "Convert", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + format: "Вихідний формат", + hint: "Книги з кількома аркушами експортують перший аркуш у CSV.", + submit: "Конвертувати", + submitBatch: "Конвертувати ({count} файлів)", + progressLabel: "Конвертація", }, "excel-to-pdf": { - submit: "Convert to PDF", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + submit: "Конвертувати у PDF", + submitBatch: "Конвертувати ({count} файлів)", + progressLabel: "Конвертація", }, "powerpoint-to-pdf": { - submit: "Convert to PDF", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + submit: "Конвертувати у PDF", + submitBatch: "Конвертувати ({count} файлів)", + progressLabel: "Конвертація", }, "word-to-pdf": { - submit: "Convert to PDF", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + submit: "Конвертувати у PDF", + submitBatch: "Конвертувати ({count} файлів)", + progressLabel: "Конвертація", }, "extract-pages": { - range: "Page range", - rangeHint: "e.g. 1-3, 5, 7-z", - submit: "Extract", - submitBatch: "Extract ({count} files)", - progressLabel: "Extracting", + range: "Діапазон сторінок", + rangeHint: "напр. 1-3, 5, 7-z", + submit: "Витягти", + submitBatch: "Витягти ({count} файлів)", + progressLabel: "Витягнення", }, "remove-pages": { - pages: "Pages to remove", - pagesHint: "e.g. 2, 4-6, z (last page)", - submit: "Remove", - submitBatch: "Remove ({count} files)", - progressLabel: "Removing", + pages: "Сторінки для видалення", + pagesHint: "напр. 2, 4-6, z (остання сторінка)", + submit: "Видалити", + submitBatch: "Видалити ({count} файлів)", + progressLabel: "Видалення", }, "organize-pdf": { - order: "Page order", - orderHint: "e.g. 3,1,2 or 1-z (identity)", - submit: "Reorder", - submitBatch: "Reorder ({count} files)", - progressLabel: "Reordering", + order: "Порядок сторінок", + orderHint: "напр. 3,1,2 або 1-z (без змін)", + submit: "Переупорядкувати", + submitBatch: "Переупорядкувати ({count} файлів)", + progressLabel: "Переупорядкування", }, "protect-pdf": { - userPassword: "User password", - ownerPassword: "Owner password (optional)", - ownerPasswordHint: "Defaults to user password if empty", - submit: "Protect", - submitBatch: "Protect ({count} files)", - progressLabel: "Encrypting", + userPassword: "Пароль користувача", + ownerPassword: "Пароль власника (необов'язково)", + ownerPasswordHint: "За замовчуванням використовується пароль користувача", + submit: "Захистити", + submitBatch: "Захистити ({count} файлів)", + progressLabel: "Шифрування", }, "unlock-pdf": { password: "Password", - submit: "Unlock", - submitBatch: "Unlock ({count} files)", - progressLabel: "Decrypting", + submit: "Розблокувати", + submitBatch: "Розблокувати ({count} файлів)", + progressLabel: "Дешифрування", }, "repair-pdf": { - submit: "Repair", - submitBatch: "Repair ({count} files)", - progressLabel: "Repairing", + submit: "Відновити", + submitBatch: "Відновити ({count} файлів)", + progressLabel: "Відновлення", }, "linearize-pdf": { - submit: "Optimize", - submitBatch: "Optimize ({count} files)", - progressLabel: "Linearizing", + submit: "Оптимізувати", + submitBatch: "Оптимізувати ({count} файлів)", + progressLabel: "Лінеаризація", }, "grayscale-pdf": { - submit: "Convert", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + submit: "Конвертувати", + submitBatch: "Конвертувати ({count} файлів)", + progressLabel: "Конвертація", }, "pdfa-convert": { - submit: "Convert", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + submit: "Конвертувати", + submitBatch: "Конвертувати ({count} файлів)", + progressLabel: "Конвертація", }, "crop-pdf": { - margin: "Margin (points)", - submit: "Crop", - submitBatch: "Crop ({count} files)", - progressLabel: "Cropping", + margin: "Поля (пункти)", + submit: "Обрізати", + submitBatch: "Обрізати ({count} файлів)", + progressLabel: "Обрізання", }, "nup-pdf": { - perSheet: "Pages per sheet", - submit: "Arrange", - submitBatch: "Arrange ({count} files)", - progressLabel: "Arranging", + perSheet: "Сторінок на аркуш", + submit: "Розмістити", + submitBatch: "Розмістити ({count} файлів)", + progressLabel: "Розміщення", }, "booklet-pdf": { - perSheet: "Pages per sheet", - submit: "Create Booklet", - submitBatch: "Create Booklet ({count} files)", - progressLabel: "Creating booklet", + perSheet: "Сторінок на аркуш", + submit: "Створити буклет", + submitBatch: "Створити буклет ({count} файлів)", + progressLabel: "Створення буклета", }, "watermark-pdf": { - text: "Watermark text", - position: "Position", - fontSize: "Font size", - opacity: "Opacity", - rotation: "Rotation", - submit: "Watermark", - submitBatch: "Watermark ({count} files)", - progressLabel: "Watermarking", + text: "Текст водяного знака", + position: "Позиція", + fontSize: "Розмір шрифту", + opacity: "Непрозорість", + rotation: "Обертання", + submit: "Додати водяний знак", + submitBatch: "Додати водяний знак ({count} файлів)", + progressLabel: "Додавання водяного знака", }, "pdf-page-numbers": { - position: "Position", - fontSize: "Font size", - submit: "Add Numbers", - submitBatch: "Add Numbers ({count} files)", - progressLabel: "Numbering", + position: "Позиція", + fontSize: "Розмір шрифту", + submit: "Додати номери", + submitBatch: "Додати номери ({count} файлів)", + progressLabel: "Нумерація", }, "flatten-pdf": { - submit: "Flatten", - submitBatch: "Flatten ({count} files)", - progressLabel: "Flattening", + submit: "Звести", + submitBatch: "Звести ({count} файлів)", + progressLabel: "Зведення", }, "redact-pdf": { - terms: "Terms to redact", - termsHint: "One term per line (max 50)", - caseSensitive: "Case sensitive", - submit: "Redact", - submitBatch: "Redact ({count} files)", - progressLabel: "Redacting", + terms: "Терміни для зачернення", + termsHint: "Один термін на рядок (макс. 50)", + caseSensitive: "Враховувати регістр", + submit: "Зачернити", + submitBatch: "Зачернити ({count} файлів)", + progressLabel: "Зачернення", }, "pdf-to-text": { - submit: "Extract Text", - submitBatch: "Extract Text ({count} files)", - progressLabel: "Extracting", + submit: "Витягти текст", + submitBatch: "Витягти текст ({count} файлів)", + progressLabel: "Витягнення", }, "pdf-to-word": { - hint: "Best for text-based PDFs; scanned pages need OCR", - submit: "Convert to Word", - submitBatch: "Convert to Word ({count} files)", - progressLabel: "Converting", + hint: "Найкраще для текстових PDF; скановані сторінки потребують OCR", + submit: "Конвертувати у Word", + submitBatch: "Конвертувати у Word ({count} файлів)", + progressLabel: "Конвертація", }, "pdf-metadata": { - title: "Title", - author: "Author", - subject: "Subject", - keywords: "Keywords", - submit: "Set Metadata", - submitBatch: "Set Metadata ({count} files)", - progressLabel: "Setting metadata", + title: "Назва", + author: "Автор", + subject: "Тема", + keywords: "Ключові слова", + submit: "Встановити метадані", + submitBatch: "Встановити метадані ({count} файлів)", + progressLabel: "Встановлення метаданих", }, "html-to-pdf": { - hint: "Remote resources are disabled for privacy.", - submit: "Convert to PDF", - submitBatch: "Convert to PDF ({count} files)", - progressLabel: "Converting", + hint: "Віддалені ресурси вимкнено для конфіденційності.", + submit: "Конвертувати у PDF", + submitBatch: "Конвертувати у PDF ({count} файлів)", + progressLabel: "Конвертація", }, "markdown-to-docx": { - submit: "Convert to DOCX", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + submit: "Конвертувати у DOCX", + submitBatch: "Конвертувати ({count} файлів)", + progressLabel: "Конвертація", }, "markdown-to-html": { - hint: "Remote images in the source are left as-is in the output.", - submit: "Convert to HTML", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + hint: "Віддалені зображення у вихідному файлі залишаються без змін.", + submit: "Конвертувати у HTML", + submitBatch: "Конвертувати ({count} файлів)", + progressLabel: "Конвертація", }, "markdown-to-pdf": { - hint: "Remote resources are disabled for privacy.", - submit: "Convert to PDF", - submitBatch: "Convert to PDF ({count} files)", - progressLabel: "Converting", + hint: "Віддалені ресурси вимкнено для конфіденційності.", + submit: "Конвертувати у PDF", + submitBatch: "Конвертувати у PDF ({count} файлів)", + progressLabel: "Конвертація", }, "epub-convert": { - format: "Output format", - hint: "Remote resources inside the book are not fetched.", - submit: "Convert", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + format: "Вихідний формат", + hint: "Віддалені ресурси з книги не завантажуються.", + submit: "Конвертувати", + submitBatch: "Конвертувати ({count} файлів)", + progressLabel: "Конвертація", }, "to-epub": { - submit: "Convert to EPUB", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + submit: "Конвертувати у EPUB", + submitBatch: "Конвертувати ({count} файлів)", + progressLabel: "Конвертація", }, "csv-excel": { - sheet: "Worksheet number", - submit: "Convert", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + sheet: "Номер аркуша", + submit: "Конвертувати", + submitBatch: "Конвертувати ({count} файлів)", + progressLabel: "Конвертація", }, "csv-json": { - pretty: "Pretty print", - submit: "Convert", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + pretty: "Форматований вивід", + submit: "Конвертувати", + submitBatch: "Конвертувати ({count} файлів)", + progressLabel: "Конвертація", }, "json-xml": { - pretty: "Pretty print", - submit: "Convert", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + pretty: "Форматований вивід", + submit: "Конвертувати", + submitBatch: "Конвертувати ({count} файлів)", + progressLabel: "Конвертація", }, "split-csv": { - rowsPerFile: "Rows per file", - keepHeader: "Keep header in each file", - submit: "Split", - submitBatch: "Split ({count} files)", - progressLabel: "Splitting", + rowsPerFile: "Рядків на файл", + keepHeader: "Зберігати заголовок у кожному файлі", + submit: "Розділити", + submitBatch: "Розділити ({count} файлів)", + progressLabel: "Розділення", }, "merge-csvs": { - submit: "Merge", - submitBatch: "Merge ({count} files)", - progressLabel: "Merging", + submit: "Об'єднати", + submitBatch: "Об'єднати ({count} файлів)", + progressLabel: "Об'єднання", }, "yaml-json": { - submit: "Convert", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + submit: "Конвертувати", + submitBatch: "Конвертувати ({count} файлів)", + progressLabel: "Конвертація", }, "xml-to-csv": { - submit: "Convert", - submitBatch: "Convert ({count} files)", - progressLabel: "Converting", + submit: "Конвертувати", + submitBatch: "Конвертувати ({count} файлів)", + progressLabel: "Конвертація", }, "create-zip": { - submit: "Create ZIP", - submitBatch: "Create ZIP ({count} files)", - progressLabel: "Zipping", + submit: "Створити ZIP", + submitBatch: "Створити ZIP ({count} файлів)", + progressLabel: "Архівація", }, "extract-zip": { - submit: "Extract", - submitBatch: "Extract ({count} files)", - progressLabel: "Extracting", + submit: "Витягти", + submitBatch: "Витягти ({count} файлів)", + progressLabel: "Витягнення", }, }, urlImport: { @@ -2453,35 +2456,36 @@ export const uk: TranslationKeys = { downloadAllZip: "Завантажити все (ZIP)", hideSettings: "Сховати налаштування", imageArea: "Область попереднього перегляду", - disabledByAdmin: "This tool has been disabled by your administrator", - browseOtherTools: "Browse other tools", - privacyNote: "Files are processed on your server and never leave your network", + disabledByAdmin: "Цей інструмент було вимкнено адміністратором", + browseOtherTools: "Переглянути інші інструменти", + privacyNote: "Файли обробляються на вашому сервері й ніколи не залишають вашу мережу", applyAndDownload: "Застосувати та завантажити", - andMore: "and {count} more", - importFromFiles: "Import from Files", - saveToFiles: "Save to Files", - savedToFiles: "Saved to Files", - adjustSettings: "Adjust settings", - startOver: "Start over with a new file", - newFile: "New file", - previewUnavailable: "Preview will be available after processing", - generatePreview: "Generate Preview", - previewFailed: "Preview generation failed", - backToTools: "Back to Tools", - original: "Original", - processed: "Processed", - saved: "Saved", - noChange: "no change", - download: "Download", + andMore: "та ще {count}", + importFromFiles: "Імпортувати з файлів", + saveToFiles: "Зберегти у файли", + savedToFiles: "Збережено у файли", + adjustSettings: "Налаштувати параметри", + startOver: "Почати спочатку з новим файлом", + newFile: "Новий файл", + previewUnavailable: "Попередній перегляд буде доступний після обробки", + generatePreview: "Створити попередній перегляд", + previewFailed: "Не вдалося створити попередній перегляд", + backToTools: "Назад до інструментів", + original: "Оригінал", + processed: "Оброблено", + saved: "Збережено", + noChange: "без змін", + download: "Завантажити", settingsSaved: "Ваші налаштування збережено.", tryAgain: "Спробувати знову", tryDifferentFile: "Спробувати інший файл", - batchPartialSuccess: "{success} of {total} processed. {failed} failed.", - dataResultsHint: "Results shown above. Use the copy button in the results panel.", - downloadAsFile: "Download as file", - downloadAll: "Download All", - downloadFiles: "Download {count} files", - audioDecodeUnsupported: "This audio format cannot be previewed in the browser", + batchPartialSuccess: "{success} з {total} оброблено. {failed} не вдалося.", + dataResultsHint: + "Результати показано вище. Використовуйте кнопку копіювання на панелі результатів.", + downloadAsFile: "Завантажити як файл", + downloadAll: "Завантажити все", + downloadFiles: "Завантажити {count} файлів", + audioDecodeUnsupported: "Цей аудіоформат не можна переглянути у браузері", }, homePage: { generatingPreview: "Генерація попереднього перегляду...", @@ -2489,20 +2493,20 @@ export const uk: TranslationKeys = { changeFile: "Змінити файл", quickActions: "Швидкі дії", allTools: "Усі інструменти", - searchPlaceholder: "Search {count} tools...", - recent: "Recent", - popular: "Popular", - browseByCategory: "Browse by Category", - gettingStarted: "Getting Started", - noToolsMatch: "No tools match '{query}'", - clearSearch: "Clear search", - all: "All", + searchPlaceholder: "Пошук серед {count} інструментів...", + recent: "Нещодавні", + popular: "Популярні", + browseByCategory: "Перегляд за категорією", + gettingStarted: "Початок роботи", + noToolsMatch: 'Інструментів за запитом "{query}" не знайдено', + clearSearch: "Очистити пошук", + all: "Усі", documents: "PDF", - data: "Files", + data: "Файли", pdf: "PDF", - files: "Files", - toolCount: "{count} tools", - heading: "SnapOtter Tools", + files: "Файли", + toolCount: "{count} інструментів", + heading: "Інструменти SnapOtter", }, fullscreenGrid: { searchPlaceholder: "Пошук інструментів...", @@ -2655,25 +2659,25 @@ export const uk: TranslationKeys = { serverDecodeFailed: "Помилка декодування на сервері", }, shapes: { - shape: "Shape", - fill: "Fill", - stroke: "Stroke", - strokeWidth: "Width", - cornerRadius: "Radius", - sides: "Sides", - points: "Points", - dashStyle: "Dash", - solid: "Solid", - dashed: "Dashed", - dotted: "Dotted", - none: "None", - opacity: "Opacity", - rectangle: "Rectangle", - ellipse: "Ellipse", - line: "Line", - arrow: "Arrow", - polygon: "Polygon", - star: "Star", + shape: "Фігура", + fill: "Заливка", + stroke: "Обведення", + strokeWidth: "Ширина", + cornerRadius: "Радіус", + sides: "Сторони", + points: "Точки", + dashStyle: "Штрих", + solid: "Суцільна", + dashed: "Штрихова", + dotted: "Пунктирна", + none: "Немає", + opacity: "Прозорість", + rectangle: "Прямокутник", + ellipse: "Еліпс", + line: "Лінія", + arrow: "Стрілка", + polygon: "Багатокутник", + star: "Зірка", }, }, settings: { @@ -2686,7 +2690,7 @@ export const uk: TranslationKeys = { teams: "Команди", roles: "Ролі", auditLog: "Журнал аудиту", - usage: "Usage", + usage: "Використання", apiKeys: "API-ключі", aiFeatures: "AI-функції", tools: "Інструменти", @@ -2746,10 +2750,10 @@ export const uk: TranslationKeys = { maxSplitGrid: "Макс. сітка розділення", maxPdfPages: "Макс. сторінок PDF", sessionDuration: "Тривалість сесії", - supportBundleButton: "Download Support Bundle", + supportBundleButton: "Завантажити пакет підтримки", supportBundleDescription: - "Download a diagnostic zip with redacted config, logs, and job data for troubleshooting.", - supportBundleFailed: "Failed to download support bundle.", + "Завантажте діагностичний архів із відредагованими конфігурацією, журналами та даними завдань для усунення неполадок.", + supportBundleFailed: "Не вдалося завантажити пакет підтримки.", }, security: { heading: "Безпека", @@ -2765,33 +2769,34 @@ export const uk: TranslationKeys = { currentPasswordIncorrect: "Поточний пароль невірний", changePasswordButton: "Змінити пароль", loginAttemptLimitNote: "Ліміти спроб входу можна налаштувати в Системних налаштуваннях.", - adminHeading: "Admin Security Settings", - adminDescription: "Enterprise security policy settings. These apply to all users.", - sessionIdleTimeout: "Session Idle Timeout (minutes)", - sessionIdleTimeoutDesc: "Automatically log out idle sessions. 0 = disabled.", - maxSessionsPerUser: "Max Sessions Per User", - maxSessionsPerUserDesc: "Limit concurrent sessions per user. 0 = unlimited.", - mfaPolicy: "MFA Policy", - mfaPolicyDesc: "Require multi-factor authentication for users.", - mfaPolicyOptional: "Optional", - mfaPolicyAdminsOnly: "Required for admins", - mfaPolicyRequired: "Required for all users", - ssoEnforcement: "SSO Enforcement", - ssoEnforcementDesc: "Require SSO login for all non-break-glass users.", - ssoBreakGlassUsername: "Break Glass Admin Username", + adminHeading: "Налаштування безпеки адміністратора", + adminDescription: + "Корпоративні налаштування політики безпеки. Застосовуються до всіх користувачів.", + sessionIdleTimeout: "Тайм-аут неактивної сесії (хвилини)", + sessionIdleTimeoutDesc: "Автоматичний вихід із неактивних сесій. 0 = вимкнено.", + maxSessionsPerUser: "Максимум сесій на користувача", + maxSessionsPerUserDesc: "Обмеження одночасних сесій на користувача. 0 = необмежено.", + mfaPolicy: "Політика MFA", + mfaPolicyDesc: "Вимагати багатофакторну автентифікацію для користувачів.", + mfaPolicyOptional: "Необов'язково", + mfaPolicyAdminsOnly: "Обов'язково для адміністраторів", + mfaPolicyRequired: "Обов'язково для всіх користувачів", + ssoEnforcement: "Примусове SSO", + ssoEnforcementDesc: "Вимагати вхід через SSO для всіх звичайних користувачів.", + ssoBreakGlassUsername: "Ім'я аварійного адміністратора", ssoBreakGlassUsernameDesc: - "This admin can still log in with local credentials when SSO is enforced.", - passwordMinLength: "Minimum Password Length", - passwordMinLengthDesc: "Minimum number of characters required for passwords.", - passwordRequireUppercase: "Require Uppercase", - passwordRequireUppercaseDesc: "Require at least one uppercase letter.", - passwordRequireNumber: "Require Number", - passwordRequireNumberDesc: "Require at least one number.", - passwordRequireSpecial: "Require Special Character", - passwordRequireSpecialDesc: "Require at least one special character.", - passwordPolicyHeading: "Password Policy", - securitySettingsSaved: "Security settings saved", - securitySettingsFailed: "Failed to save security settings", + "Цей адміністратор може входити з локальними обліковими даними, коли SSO примусове.", + passwordMinLength: "Мінімальна довжина пароля", + passwordMinLengthDesc: "Мінімальна кількість символів для паролів.", + passwordRequireUppercase: "Вимагати великі літери", + passwordRequireUppercaseDesc: "Вимагати принаймні одну велику літеру.", + passwordRequireNumber: "Вимагати цифру", + passwordRequireNumberDesc: "Вимагати принаймні одну цифру.", + passwordRequireSpecial: "Вимагати спеціальний символ", + passwordRequireSpecialDesc: "Вимагати принаймні один спеціальний символ.", + passwordPolicyHeading: "Політика паролів", + securitySettingsSaved: "Налаштування безпеки збережено", + securitySettingsFailed: "Не вдалося зберегти налаштування безпеки", }, people: { heading: "Користувачі", @@ -2873,12 +2878,13 @@ export const uk: TranslationKeys = { nameRequired: "Назва команди обов'язкова", nameTooLong: "Назва команди не може перевищувати 50 символів", duplicateName: "Команда з такою назвою вже існує", - teamStorageQuota: "Storage Quota (MB)", - teamStorageQuotaDesc: "Maximum storage for this team in MB. Leave empty for no limit.", - teamRetentionHours: "Retention (hours)", + teamStorageQuota: "Квота сховища (MB)", + teamStorageQuotaDesc: + "Максимальний обсяг сховища для цієї команди в MB. Залиште порожнім для необмеженого обсягу.", + teamRetentionHours: "Зберігання (години)", teamRetentionHoursDesc: - "Processing file retention for this team. Leave empty to use global default.", - quotaSaved: "Team settings saved", + "Час зберігання файлів обробки для цієї команди. Залиште порожнім для глобального значення.", + quotaSaved: "Налаштування команди збережено", }, roles: { heading: "Ролі", @@ -2935,35 +2941,35 @@ export const uk: TranslationKeys = { daysAgo: "{days} дн. тому", }, usage: { - heading: "Usage", - description: "Local usage statistics from jobs and file storage.", - periodLabel: "Period", - days7: "7 days", - days30: "30 days", - days90: "90 days", - jobsPerDayHeading: "Jobs per day", - topToolsHeading: "Top tools", - perUserHeading: "Per-user volume", - durationsHeading: "Duration percentiles", - noData: "No data for this period.", - dayColumn: "Day", - totalColumn: "Total", - completedColumn: "Completed", - failedColumn: "Failed", - toolColumn: "Tool", - runsColumn: "Runs", - userColumn: "User", - bytesInColumn: "Bytes in", + heading: "Використання", + description: "Локальна статистика використання завдань та сховища файлів.", + periodLabel: "Період", + days7: "7 днів", + days30: "30 днів", + days90: "90 днів", + jobsPerDayHeading: "Завдань на день", + topToolsHeading: "Найпопулярніші інструменти", + perUserHeading: "Обсяг на користувача", + durationsHeading: "Перцентилі тривалості", + noData: "Немає даних за цей період.", + dayColumn: "День", + totalColumn: "Всього", + completedColumn: "Завершено", + failedColumn: "Невдалі", + toolColumn: "Інструмент", + runsColumn: "Запуски", + userColumn: "Користувач", + bytesInColumn: "Вхідні байти", poolColumn: "Pool", p50Column: "p50", p95Column: "p95", - storageHeading: "Library storage", - storageFiles: "{count} files", - unknownUser: "(unknown)", - storageByTeam: "Storage by Team", - teamColumn: "Team", - storageColumn: "Storage", - usersColumn: "Users", + storageHeading: "Сховище бібліотеки", + storageFiles: "{count} файлів", + unknownUser: "(невідомий)", + storageByTeam: "Сховище за командою", + teamColumn: "Команда", + storageColumn: "Сховище", + usersColumn: "Користувачі", }, apiKeys: { heading: "API-ключі", @@ -3010,14 +3016,14 @@ export const uk: TranslationKeys = { startupCleanupDescription: "Видаляти старі тимчасові файли при запуску сервера", }, dataRetention: { - title: "Data Retention", - fileMaxAgeHours: "Processing file retention (hours)", - fileMaxAgeHoursDesc: "How long to keep uploaded and processed files. Default: 72 hours.", - jobsRetentionDays: "Job record retention (days)", - jobsRetentionDaysDesc: "How long to keep job metadata. 0 = keep forever. Default: 30 days.", - auditRetentionDays: "Audit log retention (days)", + title: "Зберігання даних", + fileMaxAgeHours: "Зберігання файлів обробки (години)", + fileMaxAgeHoursDesc: "Як довго зберігати завантажені та оброблені файли. Типово: 72 години.", + jobsRetentionDays: "Зберігання записів завдань (дні)", + jobsRetentionDaysDesc: "Як довго зберігати метадані завдань. 0 = назавжди. Типово: 30 днів.", + auditRetentionDays: "Зберігання журналу аудиту (дні)", auditRetentionDaysDesc: - "How long to keep audit log entries. 0 = keep forever. Default: forever.", + "Як довго зберігати записи журналу аудиту. 0 = назавжди. Типово: назавжди.", }, analytics: { heading: "Аналітика", @@ -3029,23 +3035,23 @@ export const uk: TranslationKeys = { learnMore: "Дізнатися більше", }, aiFeatures: { - title: "AI Features", + title: "AI-функції", description: "Керування пакетами AI-моделей для розширеної обробки файлів.", - installAll: "Install All", - diskUsage: "Disk usage:", - installed: "Installed", - notInstalled: "Not installed", - queued: "Queued", - install: "Install", - repair: "Repair", - uninstall: "Uninstall", - installing: "Installing...", - importBundle: "Import Bundle", - importDescription: "Upload a .tar.gz bundle archive exported from another installation.", - importButton: "Import from file", - importing: "Importing...", - importSuccess: "Bundle imported successfully.", - importError: "Bundle import failed: {error}", + installAll: "Встановити все", + diskUsage: "Використання диска: {size}", + installed: "Встановлено", + notInstalled: "Не встановлено", + queued: "У черзі", + install: "Встановити", + repair: "Відновити", + uninstall: "Видалити", + installing: "Встановлення...", + importBundle: "Імпортувати пакет", + importDescription: "Завантажте архів пакету .tar.gz, експортований з іншої інсталяції.", + importButton: "Імпортувати з файлу", + importing: "Імпортування...", + importSuccess: "Пакет успішно імпортовано.", + importError: "Не вдалося імпортувати пакет: {error}", }, about: { heading: "Про програму", @@ -3057,9 +3063,9 @@ export const uk: TranslationKeys = { githubLink: "Репозиторій GitHub", docsLink: "Документація", apiRefLink: "Довідник API (Swagger)", - licenseLabel: "License:", + licenseLabel: "Ліцензія:", licenseDescription: - "SnapOtter is open-source software licensed under the GNU Affero General Public License v3 (AGPLv3).", + "SnapOtter — програмне забезпечення з відкритим кодом, ліцензоване за GNU Affero General Public License v3 (AGPLv3).", }, }, auth: { @@ -3085,18 +3091,18 @@ export const uk: TranslationKeys = { "Ваш обліковий запис не має доступу до цього застосунку. Зверніться до адміністратора.", oidcUserLimitReached: "Досягнуто ліміту користувачів. Зверніться до адміністратора.", oidcGenericError: "Помилка автентифікації. Спробуйте знову.", - samlAuthFailed: "SAML authentication failed. Please try again.", + samlAuthFailed: "Автентифікація SAML не вдалася. Спробуйте ще раз.", samlUserNotAuthorized: - "Your account is not authorized to access this application. Contact your administrator.", - samlUserLimitReached: "User limit reached. Contact your administrator.", - ssoEnforcedLocalRestricted: "Local login is restricted to authorized administrators.", - mfaRequired: "Enter your authentication code", - mfaRecoveryHint: "You can also use a recovery code", - verify: "Verify", - verifying: "Verifying...", - mfaInvalidCode: "Invalid code. Please try again.", + "Ваш обліковий запис не має доступу до цього застосунку. Зверніться до адміністратора.", + samlUserLimitReached: "Ліміт користувачів досягнуто. Зверніться до адміністратора.", + ssoEnforcedLocalRestricted: "Локальний вхід доступний лише авторизованим адміністраторам.", + mfaRequired: "Введіть код автентифікації", + mfaRecoveryHint: "Також можна використати код відновлення", + verify: "Перевірити", + verifying: "Перевірка...", + mfaInvalidCode: "Невірний код. Спробуйте ще раз.", mfaEnrollmentRequired: - "Your organization requires multi-factor authentication. Please set up MFA in your account settings.", + "Ваша організація вимагає багатофакторну автентифікацію. Налаштуйте MFA в параметрах облікового запису.", methodSaml: "SAML", passwordManagedByProvider: "Керування паролем здійснюється Вашим постачальником ідентифікації.", enterUsername: "Введіть ім'я користувача", @@ -3216,8 +3222,8 @@ export const uk: TranslationKeys = { pipelineName: "Назва Pipeline", pipelineDescription: "Опис (необов'язково)", noStepsPrompt: "Додайте кроки для побудови автоматизації", - noStepsHeading: "No steps yet", - searchToolsPlaceholder: "Search tools...", + noStepsHeading: "Кроків поки немає", + searchToolsPlaceholder: "Пошук інструментів...", step: "Крок", }, nav: { @@ -3231,32 +3237,32 @@ export const uk: TranslationKeys = { grid: "Сітка", }, files: { - myFiles: "My Files", - recentTab: "Recent", - uploadTab: "Upload Files", - fileDetailsAriaLabel: "File Details", - fileDetailsHeading: "File Details", - searchPlaceholder: "Search files...", - selectedCount: "{count} selected", - fileCount: "{count} files", - fileCountSingular: "{count} file", - noFilesFound: "No files found", - selectFilePrompt: "Select a file to view details", - openFile: "Open File", - selectFile: "Select File", - openInPipeline: "Open in Pipeline", - dropFilesHere: "Drop files here", - orClickToSelect: "or click to select files", - name: "Name", - format: "Format", - size: "Size", - dimensions: "Dimensions", - version: "Version", - toolsUsed: "Tools Used", - none: "None", - delete: "Delete", + myFiles: "Мої файли", + recentTab: "Нещодавні", + uploadTab: "Завантажити файли", + fileDetailsAriaLabel: "Деталі файлу", + fileDetailsHeading: "Деталі файлу", + searchPlaceholder: "Пошук файлів...", + selectedCount: "{count} вибрано", + fileCount: "{count} файлів", + fileCountSingular: "{count} файл", + noFilesFound: "Файлів не знайдено", + selectFilePrompt: "Виберіть файл для перегляду деталей", + openFile: "Відкрити файл", + selectFile: "Вибрати файл", + openInPipeline: "Відкрити в конвеєрі", + dropFilesHere: "Перетягніть файли сюди", + orClickToSelect: "або натисніть, щоб вибрати файли", + name: "Назва", + format: "Формат", + size: "Розмір", + dimensions: "Розміри", + version: "Версія", + toolsUsed: "Використані інструменти", + none: "Немає", + delete: "Видалити", pipeline: "Pipeline", - download: "Download", + download: "Завантажити", }, dropzone: { unsupportedFileType: "Цей тип файлу не підтримується цим інструментом", @@ -3294,9 +3300,10 @@ export const uk: TranslationKeys = { retryButton: "Повторити", queued: "У черзі на встановлення...", enableButton: "Увімкнути {name}", - repairRequired: "Repair Required", - repairDescription: "Some model files are missing or corrupted. Repair will re-download them.", - repairButton: "Repair {name}", + repairRequired: "Потрібне відновлення", + repairDescription: + "Деякі файли моделей відсутні або пошкоджені. Відновлення завантажить їх повторно.", + repairButton: "Відновити {name}", lessThanMinute: "Залишилось менше хвилини", oneMinuteLeft: "Залишилась ~1 хвилина", minutesLeft: "Залишилось ~{mins} хвилин", @@ -3409,65 +3416,65 @@ export const uk: TranslationKeys = { mobileNavSettings: "Налаштування", }, a11y: { - skipToContent: "Skip to main content", - openSidebar: "Open sidebar", - closeSidebar: "Close sidebar", - closeSettings: "Close settings", - closeHelp: "Close help", - closeDialog: "Close dialog", - zoomIn: "Zoom in", - zoomOut: "Zoom out", - fitToView: "Fit to view", - actualSize: "Actual size", + skipToContent: "Перейти до основного вмісту", + openSidebar: "Відкрити бічну панель", + closeSidebar: "Закрити бічну панель", + closeSettings: "Закрити налаштування", + closeHelp: "Закрити довідку", + closeDialog: "Закрити діалог", + zoomIn: "Збільшити", + zoomOut: "Зменшити", + fitToView: "Вписати у вікно", + actualSize: "Справжній розмір", previousImage: "Попередній файл", nextImage: "Наступний файл", imageArea: "Область попереднього перегляду", imageViewer: "Переглядач файлів", - fileDropZone: "File drop zone", + fileDropZone: "Зона перетягування файлів", imageDropZone: "Зона перетягування файлів", - beforeAfterSlider: "Before/after comparison slider", + beforeAfterSlider: "Повзунок порівняння до/після", imageControls: "Елементи керування переглядом", - zoomControls: "Zoom controls", - dragToReorder: "Drag to reorder", - whiteBackground: "White background", - blackBackground: "Black background", - expandPanel: "Expand panel", - collapsePanel: "Collapse panel", - swapDimensions: "Swap dimensions", - applyCrop: "Apply crop", - cancelCrop: "Cancel crop", - fontFamily: "Font family", - textColor: "Text color", - flipHorizontal: "Flip horizontal", - flipVertical: "Flip vertical", - hexColorValue: "Hex color value", - backgroundColor: "Background color", - foregroundColor: "Foreground color", - swapColors: "Swap foreground and background colors", - resetColors: "Reset to default black and white", - foregroundHex: "Foreground color hex value", - undo: "Undo", - redo: "Redo", - layers: "Layers", - addLayer: "Add layer", - deleteLayer: "Delete layer", - cancelOperation: "Cancel operation", - fill: "Fill", - fileDetails: "File details", - language: "Language", - selected: "Selected", - deleteKey: "Delete key", - editRole: "Edit role", - deleteRole: "Delete role", - notInstalled: "Not installed", - queued: "Queued for install", - installing: "Installing", - imageNOfTotal: "Image {n} of {total}", - processingComplete: "Image processed successfully", - processingFailed: "Processing failed", - settingsDialog: "Settings", - helpDialog: "Help", - navigationMenu: "Navigation", - homeLink: "SnapOtter home", + zoomControls: "Керування масштабом", + dragToReorder: "Перетягніть для зміни порядку", + whiteBackground: "Біле тло", + blackBackground: "Чорне тло", + expandPanel: "Розгорнути панель", + collapsePanel: "Згорнути панель", + swapDimensions: "Поміняти розміри місцями", + applyCrop: "Застосувати обрізання", + cancelCrop: "Скасувати обрізання", + fontFamily: "Шрифт", + textColor: "Колір тексту", + flipHorizontal: "Віддзеркалити горизонтально", + flipVertical: "Віддзеркалити вертикально", + hexColorValue: "Значення кольору HEX", + backgroundColor: "Колір тла", + foregroundColor: "Колір переднього плану", + swapColors: "Поміняти кольори переднього плану та тла", + resetColors: "Скинути до чорного та білого", + foregroundHex: "HEX-значення кольору переднього плану", + undo: "Скасувати", + redo: "Повторити", + layers: "Шари", + addLayer: "Додати шар", + deleteLayer: "Видалити шар", + cancelOperation: "Скасувати операцію", + fill: "Заливка", + fileDetails: "Деталі файлу", + language: "Мова", + selected: "Вибрано", + deleteKey: "Видалити ключ", + editRole: "Редагувати роль", + deleteRole: "Видалити роль", + notInstalled: "Не встановлено", + queued: "У черзі на встановлення", + installing: "Встановлення", + imageNOfTotal: "Зображення {n} з {total}", + processingComplete: "Зображення успішно оброблено", + processingFailed: "Обробка не вдалася", + settingsDialog: "Налаштування", + helpDialog: "Довідка", + navigationMenu: "Навігація", + homeLink: "Головна SnapOtter", }, } as const;