{
  "time": {
    "current_time_label": "Текущее время:",
    "input_label": "Ввод (Unix мс/с или дата)",
    "input_placeholder": "1690000000 / 1690000000000 / 2026-04-22T00:00:00Z​",
    "convert": "Преобразовать",
    "copy_output": "Копировать вывод",
    "output": "Вывод",
    "err_parse_timestamp": "Не удалось проанализировать временную метку.",
    "err_parse_date": "Не удалось проанализировать дату. string.",
    "copied": "Скопировано."
  },
  "json_diff": {
    "intro": "Разница на уровне объекта, созданная с помощью jsondiffpatch (а не разница в простой строке). Массивы поддерживают обнаружение перемещения; delta — это структура исправлений для полей добавления/удаления/обновления.",
    "left_json": "Левый JSON",
    "right_json": "Правый JSON",
    "compute": "Вычислить разницу",
    "delta_title": "Дельта (формат jsondiffpatch)",
    "no_diff_comment": "// Никакой разницы (та же структура JSON)",
    "parse_failed": "Анализ не выполнен"
  },
  "ascii": {
    "th_dec": "Дес",
    "th_hex": "Hex​",
    "th_char": "Символ",
    "th_note": "Примечание",
    "note_control": "Контроль",
    "note_printable": "Для печати"
  },
  "uuid": {
    "count_label": "Счет (1–200)",
    "generate_uuid_v4": "Создать UUID v4",
    "copy_all": "Скопируйте все",
    "please_generate_first": "Сначала сгенерируйте.",
    "copied_all": "Скопировано все.",
    "output": "Вывод",
    "output_placeholder": "Нажмите «Создать»."
  },
  "ulid": {
    "count_label": "Счетчик (1–100)",
    "generate": "Сгенерировать ULID",
    "copy": "Скопировать",
    "placeholder": "26-символьные идентификаторы с сортировкой по времени"
  },
  "nanoid": {
    "length_label": "Длина (4–64)",
    "alphabet_hint": "Пользовательский алфавит (пустой = nanoid URL-безопасный по умолчанию)",
    "generate": "Создать",
    "copy": "Скопировать"
  },
  "units": {
    "css_title": "CSS: px ↔ rem​",
    "root_px": "Размер корневого шрифта (пикселей)",
    "check_line": "Проверьте: {px}px ÷ {root} = {rem} rem",
    "storage_title": "Размер данных",
    "iec_toggle": "Шаги IEC (1024): KiB/MiB/GiB",
    "bytes_label": "Количество байтов (целое число)"
  },
  "color": {
    "picker": "Палитра цвета",
    "css": "CSS​",
    "hex": "HEX​",
    "rgb_title": "RGB (0–255)​",
    "hsl_title": "HSL​",
    "h_label": "H (°)​",
    "s_label": "S (%)​",
    "l_label": "L (%)​",
    "copy_all_formats": "Копировать все форматы",
    "copied_line": "Скопировать строку HEX/RGB/HSL."
  },
  "contrast": {
    "fg": "Передний план (текст)",
    "bg": "Фон",
    "large_text_toggle": "Использовать порог для крупного текста (жирный шрифт ≥18pt или обычный ≥24pt)",
    "sample_text": "Пример Aa 中文 123",
    "invalid_hex": "Использовать #RRGGBB или #RGB.",
    "ratio_label": "Контраст",
    "wcag_prefix": "WCAG 2.1:​"
  },
  "url_parse": {
    "parse": "Разобрать",
    "err_invalid": "Неверный URL-адрес",
    "url_object_fields": "Поля объекта URL",
    "search_params": "Запрос (searchParams)",
    "key": "Ключ",
    "value": "Значение",
    "port_default": "(по умолчанию)",
    "page_intro": "Использует собственные <api>URL</api> и <usp>URLSearchParams</usp>; нет сетевых запросов."
  },
  "punycode": {
    "unicode_label": "Домен/метки Unicode (строки или разделенные точками)",
    "to_punycode": "→ Punycode / ASCII​",
    "puny_label": "Punycode (xn--…)​",
    "to_unicode": "→ Unicode​",
    "fail": "Ошибка"
  },
  "data_url": {
    "drop_label": "Файл → URL-адрес данных",
    "drop_title": "Выберите или перетащите файл",
    "drop_desc": "Использует FileReader.readAsDataURL; не загружено.",
    "data_url": "URL-адрес данных",
    "copy": "Скопировать",
    "decode_download": "Раскодировать и скачать",
    "err_format": "Ожидаемые данные:[mime][;base64],полезная нагрузка",
    "decode_failed": "Декодирование не удалось"
  },
  "mime_sniff": {
    "drop_label": "Прочитать заголовок файла",
    "drop_title": "Выберите или перетащите файл",
    "drop_desc": "Считывает первые 64 байта для магического анализа; не загружено.",
    "guess_type": "Предполагаемый тип",
    "first_64_hex": "Первые 64 байта (шестнадцатеричные)"
  },
  "mime_types": {
    "search_ph": "Расширение поиска или MIME…",
    "col_ext": "Расширение",
    "col_mime": "MIME​",
    "col_note": "Примечание"
  },
  "html_format": {
    "format": "Формат",
    "minify_simple": "Простое минимизация (удаление пробелов в комментариях)",
    "output": "Вывод",
    "copy": "Скопировать",
    "fail": "Ошибка"
  },
  "svg_format": {
    "source": "Источник SVG",
    "validate_indent": "Проверка и отступ",
    "xml_parse_err": "Ошибка анализа XML; проверьте теги.",
    "fail": "Ошибка"
  },
  "markdown": {
    "render_failed": "Ошибка рендеринга",
    "label": "Источник Markdown",
    "export_html": "Экспортировать HTML",
    "copy_md": "Копировать Markdown",
    "preview": "Предварительный просмотр в реальном времени"
  },
  "http_codes": {
    "search_ph": "Искать код, имя или описание…",
    "col_code": "Код",
    "col_name": "Имя",
    "col_desc": "Описание"
  },
  "ua_parse": {
    "fill_ua": "Заполните это устройство UA",
    "hint": "Легкий анализ регулярных выражений, а не полная база данных устройств; сканеры/WebViews могут отображаться как «Другое».",
    "browser": "Браузер",
    "engine": "Ядро (грубо)",
    "os": "ОС",
    "mobile": "Мобильный",
    "yes": "Да",
    "no": "Нет"
  },
  "keycode": {
    "instructions": "Щелкните область ниже, затем нажмите клавиши (некоторые сочетания клавиш блокируются браузером).",
    "capture_aria": "Область захвата клавиш",
    "focus_hint": "Сфокусируйтесь здесь, затем нажмите клавиши…",
    "which_keycode": "который / keyCode (устаревший)",
    "modifiers": "Модификаторы"
  },
  "yaml_json": {
    "warning": "js-yaml запускает анализ тегов; не вставляйте ненадежные большие файлы YAML. Только локально.",
    "yaml_to_json": "YAML → JSON​",
    "json_to_yaml": "JSON → YAML​",
    "parse_failed": "Анализ не выполнен"
  },
  "toml_json": {
    "warning": "TOML типы дат сопоставляются с формами, совместимыми с JSON; не вставляйте ненадежные большие конфигурации.",
    "toml_to_json": "TOML → JSON​",
    "json_to_toml": "JSON → TOML​",
    "parse_failed": "Анализ не выполнен"
  },
  "json_csv": {
    "json_label": "JSON (массив объектов)",
    "csv_label": "CSV (строка заголовка)",
    "json_to_csv": "JSON → CSV​",
    "csv_to_json": "CSV → JSON​",
    "need_object_array": "JSON должен быть массивом объектов.",
    "parse_failed": "Анализ не выполнен"
  },
  "jsonpath": {
    "expr_label": "Выражение JSONPath",
    "hint": "На основе jsonpath-plus (частично похоже на jq).",
    "query": "Запрос",
    "result_array": "Результат (массив)",
    "fail": "Ошибка"
  },
  "json_to_ts": {
    "root_name": "Имя корневого интерфейса",
    "generate": "Генерация типов",
    "typescript": "TypeScript​",
    "fail": "Ошибка"
  },
  "jmespath": {
    "expr_label": "Выражение JMESPath",
    "hint": "Тот же JMESPath, что и в AWS CLI/некоторые SDK; заключите литералы JSON в обратные кавычки, например",
    "query": "Запрос",
    "result": "Результат",
    "fail": "Ошибка"
  },
  "sql_format": {
    "dialect": "Диалект",
    "dialect_sql": "Стандартный SQL",
    "beautify": "Украсить",
    "compress": "Сжать",
    "output": "Вывод",
    "format_failed": "Ошибка форматирования"
  },
  "gitignore": {
    "templates": "Шаблоны",
    "merge": "Объединить",
    "placeholder": "Объединить .gitignore",
    "copy": "Скопировать"
  },
  "compress": {
    "warn": "Использует CompressionStream; Brotli зависит от браузера. Вывод — байты Base64.",
    "algo": "Алгоритм",
    "mode_compress": "Сжать",
    "mode_decompress": "Распаковка",
    "utf8_text": "Текст UTF-8",
    "run_text_compress": "Сжать текст",
    "run_text_decompress": "Распаковать (ожидается текст UTF-8)",
    "file_label": "Или файл (необработанные байты)",
    "file_title": "Выберите файл",
    "file_desc": "Двоичное сжатие/распаковка.",
    "b64_label": "Результат/вход Base64",
    "copy_b64": "Копировать Base64",
    "from_b64_compress": "Из Base64 → сжать",
    "from_b64_decompress": "Из Base64 → распаковать",
    "unsupported_algo": "Этот алгоритм не поддерживается; попробуйте Chrome/Edge или gzip/deflate.",
    "done_bytes": "Готово ({n} байт)",
    "fail": "Ошибка",
    "b64_invalid": "Неверный Base64"
  },
  "cron": {
    "label": "Cron (мин час день месяц dow)",
    "hint": "Человеческий текст через cronstrue; комплексное выражение следует за библиотекой.",
    "natural_language": "Естественный язык",
    "cannot_parse": "Не удалось проанализировать это выражение."
  },
  "chmod": {
    "oct_label": "Восьмеричное число (например, 644, 755)",
    "to_rwx": "→ rwx​",
    "rwx_label": "rwxrwxrwx​",
    "to_octal": "→ восьмеричное",
    "err_oct_range": "Восьмеричное число должно быть 0–777.",
    "err_rwx": "rwx должно состоять из 9 символов r w x - (упрощенный setuid)."
  },
  "cidr": {
    "label": "IPv4 / ЦИДР",
    "calc": "Вычислить",
    "err": "Ошибка",
    "network": "Сеть",
    "broadcast": "Рассылка",
    "mask": "Маска подсети",
    "first_host": "Первый хост",
    "last_host": "Последний хост",
    "total_addrs": "Всего адресов",
    "usable_hosts": "Используемые хосты (/31,/32 упрощенно)"
  },
  "ipv6": {
    "label": "IPv6-адрес или CIDR",
    "parse": "Разобрать",
    "err": "Ошибка",
    "correct_form": "Нормализованный (correctForm)",
    "canonical_form": "Полное раскрытие (canonicalForm)",
    "prefix_len": "Длина префикса",
    "subnet_start": "Начало подсети",
    "subnet_end": "Конец подсети",
    "addr_count": "Счетчик адресов"
  },
  "ieee754": {
    "label": "Число (десятичное)",
    "need_finite": "Введите конечное число.",
    "float64": "Float64​",
    "float32": "Float32​",
    "hex_be": "Hex (обратный порядок байтов)",
    "detail_64": "sign {sign} · exp {exp} (смещение 1023) · frac {frac}",
    "detail_32": "sign {sign} · exp {exp} (смещение 127) · frac {frac}"
  },
  "num_base": {
    "from_radix": "Исходное основание (2–36)",
    "digits": "Цифры",
    "convert": "Преобразовать",
    "common_bases": "Общие основания",
    "parse_err": "Не удалось проанализировать целое число для этого основания."
  },
  "iban": {
    "label": "IBAN (пробелы в порядке)",
    "check": "Проверьте мод 97",
    "ok": "Контрольная сумма в порядке (мод 97 = 1). Нормализовано: {n}",
    "bad": "Ошибка контрольной суммы (остаток {r}). Нормализовано: {n}"
  },
  "luhn": {
    "label": "Цифры (пробелы допустимы)",
    "check": "Проверка Luhn",
    "pass": "Проходит проверку Luhn (mod 10)",
    "fail": "Ошибка"
  },
  "phone": {
    "default_country": "Страна по умолчанию (ISO 3166-1 альфа-2; используется без +)",
    "number": "Номер телефона",
    "parse": "Разобрать",
    "unparsed": "Не удалось выполнить анализ (попробуйте изменить страну по умолчанию).",
    "err": "Ошибка",
    "line_e164": "E.164: {v}​",
    "line_intl": "Международный: {v}",
    "line_nat": "Национальный: {v}",
    "line_country": "Страна: {c} (по умолчанию {d})",
    "line_type": "Тип: {v}",
    "line_valid": "Действительно: {v}",
    "yes": "Да",
    "no": "Нет",
    "dash": "—​"
  },
  "letter_codes": {
    "input": "Ввод (A–Z, 0–9; используйте / для пробела в азбуке Морзе)",
    "nato": "Алфавит НАТО",
    "morse": "Морзе код",
    "braille": "Брайль (A–Z, цифры)"
  },
  "barcode": {
    "format": "Формат",
    "content": "Содержимое (действительная длина/кодировка для каждого символа)",
    "download_png": "Скачать PNG",
    "cannot_generate": "Не удалось создать"
  },
  "video_common": {
    "intro": "Ядро ffmpeg (~30 МБ) загружается после выбора медиафайла. Обработка происходит в вашем браузере; ничего не загружается. Рекомендуемый максимум {mb} МБ на файл.",
    "core_loading": "Загрузка видеопроцессора…",
    "core_reload": "Перезагрузить компонент",
    "load_btn_loading": "Загрузка…",
    "load_btn_ready": "Ядро готово",
    "load_btn_idle": "Загрузить ядро ​​ffmpeg",
    "media_file": "Видео или аудио файл",
    "no_file": "Файл не выбран.",
    "converting": "Обработка…",
    "download": "Скачать {name}",
    "log": "Бревно",
    "load_failed": "Не удалось загрузить ядро ​​ffmpeg. Проверьте свою сеть и повторите попытку.",
    "load_failed_wasm": "ffmpeg-core.wasm (~32 МБ) не загрузился. Попробуйте отключить прокси/VPN или переключить сеть.",
    "ffmpeg_exit": "ffmpeg завершился с кодом {c}. Сначала попробуйте другой формат вывода или сжатие видео.",
    "convert_failed": "Обработка не удалась",
    "progress": "Около {n}%",
    "err_file_too_large": "Файл превышает ограничение {mb} МБ. Сначала обрежьте или сожмите его."
  },
  "video_convert": {
    "page_intro": "Конвертируйте между MP4, WebM, MKV, GIF, M4A, WAV и другими форматами. Некоторые кодеки ограничены в Wasm; попробуйте другой выход или сначала используйте Video Compress.",
    "out_ext": "Выходной формат",
    "convert_go": "Начать преобразование"
  },
  "video_to_mp4": {
    "page_intro": "Экспорт в MP4 (H.264/AAC, выбранный ffmpeg). Лучше всего подходит для совместного использования и воспроизведения на мобильных устройствах. Если это не помогло, сначала попробуйте Video Compress перекодировать."
  },
  "video_mov_to_mp4": {
    "page_intro": "Конвертируйте QuickTime / iPhone MOV в MP4. Другие видеовходы также принимаются; вывод всегда в формате MP4."
  },
  "video_mkv_to_mp4": {
    "page_intro": "Конвертируйте Matroska (.mkv) в MP4 для проигрывателей, не поддерживающих MKV. Выход всегда в формате MP4."
  },
  "video_webm_to_mp4": {
    "page_intro": "Конвертируйте записи экрана WebM или загрузки в MP4. Выход всегда в формате MP4."
  },
  "video_avi_to_mp4": {
    "page_intro": "Конвертируйте устаревший AVI в MP4. Выход всегда в формате MP4; очень старым кодекам может потребоваться сначала сжать/перекодировать."
  },
  "video_to_webm": {
    "page_intro": "Экспортировать WebM (VP8/VP9 + Opus/Vorbis). Хорошо подходит для веб-встраивания; Поддержка воспроизведения зависит от устройства."
  },
  "video_to_mkv": {
    "page_intro": "Экспортный контейнер MKV. Полезно для архивирования; MP4 обычно лучше подходит для обмена."
  },
  "video_trim": {
    "page_intro": "Вырезать по времени начала/окончания в секундах. Fast = копирование потока (быстрое, с выравниванием по ключевым кадрам); Точность = перекодирование (более медленные и более плотные сокращения).",
    "duration_label": "Длительность ≈ {sec} сек.",
    "start_sec": "Старт(ы)",
    "end_sec": "Конец(а)",
    "mode_label": "Режим",
    "mode_copy": "Быстро (потоковое копирование)",
    "mode_encode": "Точное (перекодирование)",
    "trim_go": "Обрезать и загрузить"
  },
  "video_compress": {
    "page_intro": "Уменьшить размер файла за счет снижения разрешения и увеличения CRF (выше = меньше, ниже качество; обычно 23–32).",
    "height_label": "Максимальная высота",
    "height_option": "{h}p​",
    "crf_label": "CRF (теперь {crf})",
    "crf_hint": "Более высокий CRF = более сильное сжатие.",
    "compress_go": "Сжать и загрузить"
  },
  "video_to_gif": {
    "page_intro": "Конвертировать видео в GIF. Более высокий FPS/ширина = файлы большего размера и более медленная работа.",
    "fps_label": "FPS​",
    "width_label": "Ширина (пикселей)",
    "convert_go": "Создать GIF"
  },
  "video_extract_audio": {
    "page_intro": "Отделить звуковую дорожку от видео. M4A меньше; WAV не сжат.",
    "format_label": "Выходной формат",
    "format_m4a": "М4А (ААС)",
    "format_wav": "WAV (ПКМ)",
    "format_hint": "Кодирование MP3 может быть недоступно в Wasm; предпочитаю М4А.",
    "extract_go": "Извлечь аудио"
  },
  "x509_view": {
    "intro": "Вставьте PEM (с BEGIN/END) или DER Base64; Отпечаток SHA-256 через Web Crypto, только локально.",
    "cert": "Сертификат",
    "parse": "Разобрать",
    "parsing": "Разбор…",
    "fingerprint": "Отпечаток пальца SHA-256 (шестнадцатеричный)",
    "structured": "Структурированная информация",
    "parse_failed": "Анализ не выполнен"
  },
  "jwt": {
    "warning": "Декодирует Base64URL и форматирует только JSON. <strong>Подпись не проверена</strong> — не для решений об аутентификации. Не вставляйте конфиденциальные токены в ненадежные среды.",
    "input_label": "JWT-строка",
    "decode": "Декодирование",
    "err_empty": "Введите JWT.",
    "err_parts": "Требуется как минимум header.payload.",
    "err_header_json": "Недопустимый заголовок JSON.",
    "err_payload_json": "Полезная нагрузка недопустима в формате JSON."
  },
  "base64": {
    "text_label": "Текст",
    "text_to_base64": "Текст → Base64",
    "base64_to_text": "Base64 → Текст",
    "base64_field": "Base64​",
    "base64_from_file": "Base64 из файла",
    "select_or_drop_file": "Выберите или удалите файл",
    "base64_from_file_desc": "Закодированные необработанные байты; не загружено.",
    "url_safe": "URL-безопасный (Base64URL)",
    "data_url": "Вывод как URL-адрес данных",
    "encoded_file": "Закодировано: {name}",
    "copy": "Скопировать",
    "copied": "Скопировано.",
    "base64_to_download": "Раскодируйте, чтобы скачать",
    "decode_failed": "Декодирование не удалось"
  },
  "base32": {
    "original_utf8": "Исходный (UTF-8)",
    "text_to_base32": "Текст → Base32",
    "base32_to_text": "Base32 → Текст",
    "base32_rfc4648": "Base32 (RFC 4648, без заполнения)",
    "copy": "Скопировать",
    "copied_base32": "Скопировал Base32.",
    "decode_failed": "Декодирование не удалось"
  },
  "base58": {
    "text_utf8": "Текст (UTF-8)",
    "text_to_base58": "Текст → Base58",
    "base58_to_text": "Base58 → Текст",
    "base58_field": "База58",
    "decode_failed": "Декодирование не удалось"
  },
  "url_encode": {
    "input": "Вход",
    "output": "Вывод",
    "encode": "Кодировать",
    "decode": "Декодирование",
    "copy_output": "Копировать вывод",
    "copied": "Скопировано.",
    "decode_failed": "Декодирование не удалось"
  },
  "hex": {
    "text_utf8": "Текст (UTF-8)",
    "text_to_hex": "Текст → Шестнадцатеричный",
    "hex_to_text": "Шестнадцатеричный → Текст",
    "hex_field": "Hex (пробелы, символы новой строки и 0x удаляются при декодировании)",
    "copy": "Скопировать",
    "copied_hex": "Скопировано шестнадцатеричное число.",
    "err_hex_odd_length": "Длина шестнадцатеричного значения должна быть четной (пробелы и 0x игнорируются).",
    "err_utf8_decode": "Не удалось декодировать как UTF-8."
  },
  "escape": {
    "mode": "Режим",
    "html_entity_mode": "HTML-объекты",
    "json_string_mode": "Экранирование строки JSON",
    "input": "Вход",
    "encode_or_escape": "Кодировать/побег",
    "decode_or_restore": "Декодирование/восстановление",
    "json_decode_not_string": "Значение JSON не является строкой.",
    "decode_failed": "Декодирование не удалось",
    "output": "Вывод",
    "copied_output": "Скопированный вывод.",
    "copy_output": "Копировать вывод",
    "failed": "Ошибка",
    "page_intro": "Как и обычные инструменты Escape/Entity: HTML использует основные символьные сущности; Режим JSON экранирует строки, анализируемые с помощью <jp>JSON.parse</jp>."
  },
  "hash": {
    "select_file": "Выберите файл",
    "select_or_drop_file": "Выберите или удалите файл",
    "hash_local_desc": "Дайджест вычисляется локально; не загружен.",
    "please_select_file": "Сначала выберите файл.",
    "computing": "Вычисление…",
    "compute_digest": "Вычисление дайджеста",
    "copy": "Скопировать",
    "computed_file": "Вычислено: {name} ({size} байт)",
    "compute_failed": "Ошибка вычисления",
    "md5_label": "MD5​",
    "sha256_label": "SHA-256​",
    "dash": "—​"
  },
  "hmac": {
    "hash_algorithm": "Алгоритм хэширования",
    "secret_key": "Секретный ключ",
    "message": "Сообщение",
    "compute_hmac_hex": "Вычислить HMAC (шестнадцатеричный)",
    "output": "Вывод",
    "copy": "Скопировать",
    "failed": "Ошибка",
    "dash": "—​"
  },
  "aes": {
    "aes_pbkdf2_note": "AES-256-GCM: случайная соль + PBKDF2 (итерации {iter}, SHA-256) извлекает ключ только в вашем браузере.",
    "passphrase": "Парольная фраза",
    "plaintext": "Открытый текст",
    "encrypt": "Шифрование",
    "decrypt": "Расшифруйте",
    "processing": "Обработка…",
    "please_input_passphrase": "Пожалуйста, введите парольная фраза.",
    "encrypt_success": "Зашифровано.",
    "encrypt_failed": "Не удалось зашифровать ",
    "cipher_base64": "Зашифрованный текст (Base64: соль ∥ IV ∥ данные)",
    "cipher_too_short": "Зашифрованный текст слишком короткий или поврежден.",
    "decrypt_success": "Расшифровано.",
    "decrypt_failed_bad_key": "Не удалось расшифровать (неверная парольная фраза или неверные данные).",
    "copied_cipher": "Скопирован зашифрованный текст.",
    "copy_cipher": "Копировать зашифрованный текст"
  },
  "password": {
    "select_charset": "Выберите хотя бы один набор символов.",
    "length_4_to_256": "Длина (4–256)",
    "upper_az": "Прописные буквы A–Z",
    "lower_az": "Строчные a–z",
    "digits": "Цифры",
    "symbols": "Символы",
    "generate": "Создать",
    "copy": "Скопировать",
    "copied": "Скопировано.",
    "result": "Результат",
    "placeholder_click_generate": "Нажмите «Создать».",
    "footnote": "Использует crypto.getRandomValues; набор символов — это небольшой набор символов, удобный для клавиатуры: при необходимости отрегулируйте флажки."
  },
  "crc32": {
    "text_utf8": "Текст (UTF-8)",
    "compute_crc32": "Вычислить CRC32",
    "label_from_file": "Или из файла",
    "title_drop": "Выберите или удалите файл",
    "desc_local": "IEEE CRC-32 для необработанных байтов; не загружено.",
    "crc32_title": "CRC32​",
    "label_current_text": "текущий текст",
    "copy_hex": "Копировать шестнадцатеричный код",
    "copied_hex_value": "Скопировано шестнадцатеричное значение.",
    "msg_computed": "Вычислено: {label} ({bytes} байт)",
    "read_failed": "Чтение не удалось",
    "decode_failed": "Ошибка",
    "dash": "—​"
  },
  "xor": {
    "warning": "XOR симметричен и не требует аутентификации — не используйте для обеспечения реальной секретности; подходит для CTF, демонстраций или легкой запутывания.",
    "encrypt_section": "Шифрование",
    "decrypt_section": "Расшифруйте",
    "plaintext_utf8": "Открытый текст (UTF-8)",
    "key_utf8_cyclic": "Ключ (UTF-8, повторяющийся)",
    "output_format": "Выходной формат",
    "opt_hex": "Hex​",
    "opt_b64": "Base64​",
    "xor_to_cipher": "XOR → зашифрованный текст",
    "cipher_label": "Зашифрованный текст",
    "cipher_input_label": "Зашифрованный текст ({mode})",
    "xor_to_plain": "XOR → открытый текст",
    "plaintext_result": "Открытый текст",
    "err_key_empty": "Ключ не может быть пустым",
    "err_hex_odd": "Шестнадцатеричная длина должна быть четной",
    "failed": "Ошибка"
  },
  "vigenere": {
    "intro": "Виженер: преобразуются только A–Z / a–z; остальные персонажи сохранены. Небуквы в ключе игнорируются.",
    "text": "Текст",
    "key_english": "Ключ (буквы)",
    "encrypt": "Шифрование",
    "decrypt": "Расшифруйте",
    "result": "Результат",
    "err_key_letters": "Ключ должен содержать хотя бы одну букву A–Z",
    "error_generic": "Ошибка"
  },
  "rsa": {
    "intro": "Используется браузер <link>Web Crypto</link> RSA-OAEP; только для коротких сообщений или упаковки симметричных ключей. Требуется безопасный контекст (HTTPS или локальный хост).",
    "generate_keypair": "Создать пару ключей",
    "pub_pem": "Открытый ключ (СПКИ PEM)",
    "priv_pem": "Закрытый ключ (PKCS#8 PEM)",
    "encrypt_section": "Шифрование",
    "plaintext_utf8": "Открытый текст (UTF-8)",
    "encrypt_public": "Зашифровать открытым ключом",
    "cipher_section": "Зашифрованный текст и расшифровка",
    "cipher_b64": "Зашифрованный текст (Base64)",
    "decrypt_private": "Расшифровать приватным ключом",
    "decrypted": "Расшифрованный",
    "msg_generated": "Сгенерирован 2048-битный RSA-OAEP (SHA-256); закрытый ключ остается только в памяти — не делитесь им.",
    "msg_generate_fail": "Генерация не удалась (некоторым средам требуется безопасный контекст: HTTPS или локальный хост).",
    "err_need_public_pem": "Сначала сгенерируйте или вставьте открытый ключ PEM.",
    "err_plain_too_long": "Открытый текст слишком длинный: RSA-OAEP (2048 / SHA-256) обычно до {max} байт; текущий {current}. Используйте симметричное шифрование (например, AES-256-GCM) для обёртки ключей.",
    "encrypt_failed": "Не удалось зашифровать ",
    "err_need_private_pem": "Сначала сгенерируйте или вставьте закрытый ключ PEM.",
    "decrypt_failed": "Не удалось расшифровать",
    "err_pem_parse": "Не удалось проанализировать PEM; отметьте блоки BEGIN/END."
  },
  "qr_generate": {
    "content_label": "Содержимое (текст/URL/Wi‑Fi)",
    "size_px": "Размер (px)",
    "margin": "Поля",
    "foreground": "Передний план",
    "background": "Фон",
    "generate_preview": "Создать предварительный просмотр",
    "busy": "Генерация…",
    "download_png": "Скачать PNG",
    "preview": "Предварительный просмотр",
    "qr_alt": "QR-код",
    "err_empty": "Содержимое не может быть пустым",
    "err_generate": "Создать не удалось",
    "error_correction": "Исправление ошибок",
    "low_contrast": "Низкий контраст между передним и задним планом; некоторые сканеры могут не распознать код.",
    "live_preview": "Живой просмотр",
    "templates": "Шаблоны",
    "template_url": "URL-адрес",
    "template_wifi": "Wi-Fi",
    "template_email": "Электронная почта",
    "template_tel": "Телефон",
    "scan_hint": "Текущая полезная нагрузка: {length} символов. Более короткий контент сканируется более надежно."
  },
  "qr_decode": {
    "drop_label": "Изображение с QR-кодом",
    "drop_title": "Выберите или перетащите PNG/JPG…",
    "drop_desc": "Декодируется локально с помощью jsQR; не загружено.",
    "empty_hint": "Изображение пока не выбрано.",
    "parse_result": "Результат",
    "copy": "Скопировать",
    "err_canvas": "Холст недоступен",
    "err_not_found": "QR не найден (попробуйте более четкое и более контрастное изображение).",
    "err_decode": "Декодирование не удалось",
    "err_load_image": "Не удалось загрузить изображение",
    "dash": "—​"
  },
  "text_case": {
    "mode_label": "Преобразовать",
    "mode_upper": "ПРОПИСНЫМ РЕГИСТРОМ",
    "mode_lower": "строчным регистром",
    "mode_title": "Регистр заголовка (слова)",
    "mode_sentence": "Регистр предложения (эвристика)",
    "mode_camel": "camelCase​",
    "mode_constant": "CONSTANT_CASE​",
    "mode_kebab": "kebab-case​",
    "mode_snake": "Snake_case",
    "source": "Источник",
    "result": "Результат",
    "copy_result": "Копировать результат",
    "placeholder_source": "Вставить или ввести…"
  },
  "text_lines": {
    "sort_asc": "Сортировать строки (↑)",
    "sort_desc": "Сортировать строки (↓)",
    "dedupe": "Дедублировать строки",
    "remove_empty": "Удалить пустые строки",
    "trim_lines": "Обрезать каждую строку",
    "reverse": "Изменить порядок строк",
    "input": "Вход",
    "result": "Результат",
    "copy_result": "Копировать результат",
    "placeholder_input": "По одному элементу в строке или вставить список…",
    "placeholder_result": "Используйте кнопки выше…"
  },
  "text_stats": {
    "label": "Текст",
    "placeholder": "Вставить контент; статистика обновляется в реальном времени…",
    "lines": "Строки",
    "chars_code_units": "Символы (кодовые единицы)",
    "chars_no_ws": "Символы (без пробелов)",
    "words_ws": "Слова (разделение пробелов)",
    "graphemes": "Кластеры графем (международный, прим. «символы»)",
    "bytes_utf8": "UTF-8 байтов",
    "footnote": " «Слова» разделяются на пробелы; для CJK и т. д. предпочитают графемы. Вся статистика запускается локально."
  },
  "text_replace": {
    "find": "Найти",
    "replace_with": "Заменить на",
    "use_regex": "Использовать регулярное выражение",
    "flags": "Флаги",
    "source": "Источник",
    "result": "Результат",
    "copy": "Скопировать",
    "footnote": "Буквальный режим заменяет все совпадения глобально; Режим регулярных выражений следует за String.replace — экранирование разума и флаги (общие: g, i, m)."
  },
  "text_split_join": {
    "delimiter": "Разделитель",
    "placeholder_delimiter": "например , или | или на заказ",
    "split_lines": "Разделить → по одному элементу в строке",
    "join_lines": "Объединить строки ← с помощью разделителя",
    "copy_result": "Копировать результат",
    "help": "Разделить: разрезать текст по разделителям на строки. Присоединиться: прочитать входные данные построчно и вставить разделитель между строками.",
    "placeholder_input": "Разделить: вставить одну строку, разделенную запятыми; Присоединиться: по одному элементу в строке…",
    "placeholder_output": "Нажмите «Разделить или присоединиться…»",
    "input": "Вход",
    "output": "Вывод"
  },
  "text_regex": {
    "warn_truncated": "Только первые символы ({max}) сопоставляются и выделяются.",
    "pattern": "Шаблон",
    "flags": "Флаги",
    "flags_ph": "Гимсуй",
    "invalid": "Недопустимое регулярное выражение",
    "text": "Текст",
    "match_count": "{count} совпадений",
    "list_omitted": "… дальнейшие совпадения опущены"
  },
  "text_diff": {
    "text_a": "Текст A",
    "text_b": "Текст B",
    "line_diff": "Разница в строке"
  },
  "text_lorem": {
    "paragraphs": "Абзацы (1–50)",
    "generate": "Создать",
    "copy": "Скопировать",
    "placeholder": "Нажмите «Создать»."
  },
  "text_rot13": {
    "label": "Текст (A–Z поворачивается на 13; запустите еще раз, чтобы отменить)",
    "action": "ROT13​"
  },
  "text_strip_html": {
    "warning": "Использует DOMParser для текстовых узлов; сценарии не выполняются — по-прежнему избегайте вставки огромного количества ненадежного HTML.",
    "html": "HTML​",
    "plain": "Обычный текст",
    "extract": "Извлечь простой текст",
    "placeholder_out": "Используйте кнопку слева"
  },
  "text_slug": {
    "input": "Вход",
    "generate": "Создать фрагмент",
    "hint": "Удалить диакритические знаки, сохранить a–z и 0–9, превратить пробелы/символы в дефисы (помощник URL-адреса, а не полное SEO).",
    "result": "Результат",
    "copy": "Скопировать",
    "dash": "—​"
  },
  "text_indent": {
    "text": "Текст",
    "use_tab": "Отступ с помощью табуляции",
    "spaces_per_level": "Пробелов на уровень",
    "dedent_times": "Отступы проходов",
    "indent_once": "Отступы всего блока",
    "dedent_tab": "Удалить до {n} ведущих табуляций в каждой строке",
    "dedent_space": "Удалить до {n} ведущих пробелов в каждой строке",
    "skip_blank": "Пропустить пустые строки",
    "copy": "Копировать результат",
    "example": "Пример",
    "clear": "Очистить",
    "copied": "Скопировано в буфер обмена."
  },
  "text_sort_lines": {
    "label": "Сортировка строк",
    "desc": "По убыванию",
    "natural": "Естественная сортировка (числовая)",
    "trim_end": "Обрезать конец строки перед сортировкой",
    "sort": "Сортировка",
    "page_intro": "Дополняет сортировку при очистке строк: переключение по возрастанию/убыванию и включение <lc>localeCompare</lc>-дружественного числового режима — отлично подходит для номеров версий и списков файлов."
  },
  "text_line_numbers": {
    "text": "Текст",
    "start": "Начальный номер",
    "pad_width": "Мин ширина",
    "separator": "Разделитель",
    "add": "Добавить номера строк",
    "strip": "Удалить простой префикс «число |»",
    "footnote": "Strip использует простое регулярное выражение для начальных цифр и «|»; редактируйте вручную в сложных случаях."
  },
  "text_wrap": {
    "note": "Ширина учитывает единицы кода UTF-16, а не терминальные столбцы или CJK полной ширины; переключить жесткий разрыв для длинных непрерывных строк.",
    "text": "Текст",
    "max_width": "Максимальное количество символов в строке",
    "break_long": "Жесткий разрыв длинных строк без пробелов",
    "rewrap": "Перенос на месте"
  },
  "csv_markdown": {
    "csv_to_md": "CSV → Markdown​",
    "to_markdown": "В таблицу Markdown",
    "md_to_csv": "Таблица Markdown → CSV",
    "to_csv": "В CSV",
    "failed": "Ошибка"
  },
  "fullwidth": {
    "source": "Текст",
    "to_full": "В полную ширину",
    "to_half": "В половинную ширину",
    "footnote": "Охватывает печатный ASCII и пробел; CJK и т. д. без изменений."
  },
  "rmb_daxie": {
    "convert": "Преобразовать",
    "placeholder": "1234.56​",
    "error": "Ошибка"
  },
  "ics": {
    "raw_label": "Текст iCalendar",
    "parse": "Разобрать",
    "no_events": "Нет анализа VEVENT",
    "parse_failed": "Анализ не выполнен",
    "no_title": "(Нет заголовка)",
    "start": "Начало",
    "end": "Конец",
    "location": "Местоположение",
    "dash": "—​"
  },
  "vcard": {
    "raw_label": "текст vCard",
    "th_field": "Поле",
    "th_value": "Значение",
    "empty": "Нет допустимых строк"
  },
  "email_headers": {
    "raw_label": "Необработанные заголовки (до первой пустой строки)",
    "th_name": "Имя",
    "th_value": "Значение",
    "empty": "Ничего не анализируется"
  },
  "docmind": {
    "privacy_title": "Уведомление о преобразовании в облако",
    "privacy_body": "Файлы отправляются через конвертер этого сайта в Alibaba Cloud Document Mind (материковый Китай). Не загружайте конфиденциальные личные данные. Ссылки для скачивания с Alibaba обычно действительны в течение примерно 24 часов.",
    "err_no_file": "Сначала выберите PDF-файл.",
    "err_file_too_large": "Файл не должен превышать {max}MB.",
    "err_too_many_files": "Только один PDF-файл для каждого преобразования.",
    "err_failed": "Не удалось преобразовать",
    "err_no_download_url": "Преобразование завершено, но URL-адрес загрузки не возвращен. Попробуйте еще раз.",
    "err_proxy_unreachable": "Невозможно связаться со службой конвертации ({base}). Запустите прокси-сервер docmind и установите NEXT_PUBLIC_DOCMIND_API_URL.",
    "msg_submitting": "Отправка задания на преобразование…",
    "msg_processing": "Обработка в облаке; это может занять от десятков секунд до нескольких минут…",
    "msg_done": "Преобразование завершено. Загрузите из списка ниже.",
    "result_title": "Результаты конвертации",
    "download_hint": "Ссылки предоставляются Alibaba Cloud и обычно действительны в течение 24 часов. Если сохранить не удалось, откройте ссылку в новой вкладке.",
    "selected_file": "Выбрано: {name} (~{size} МБ)",
    "poll_hint": "Опрошено {count} раз, проверка примерно каждые 10 секунд",
    "limits_note": "Ограничения: один PDF-файл на задание, максимум 5 МБ, максимум 10 страниц"
  },
  "pdf_to_word": {
    "drop_label": "Выберите PDF",
    "drop_desc": "Один PDF-файл на задание, максимум 5 МБ; преобразуется в Word (.docx) через Alibaba Document Mind.",
    "empty_hint": "Файл еще не выбран.",
    "btn_convert": "Преобразовать",
    "before_title": "Проверьте соответствие преобразования перед загрузкой",
    "before_body": "PDF в Word загружает файл в службу анализа документов для распознавания макета. Лучше всего подходит для редактируемых контрактов, отчетов, офисных документов и четких сканирований. Прежде чем загружать конфиденциальные файлы, подтвердите свои правила соответствия.",
    "good_for": "Подходит для",
    "good_contract": "Контрактов, уведомлений, руководств и документов, требующих редактирования",
    "good_report": "Отчеты с заголовками, абзацами, изображениями и простыми таблицами",
    "good_scan": "Четкие отсканированные PDF-файлы или PDF-файлы с фотографиями, требующие оптического распознавания символов.",
    "not_for": "Не идеально подходит для",
    "not_sensitive": "удостоверений личности, банковских карт, конфиденциальных контрактов или файлов, которые не следует загружать",
    "not_large": "PDF-файлы размером более 5 МБ или слишком много страниц",
    "not_table": "PDF-файлы с большим количеством таблиц; вместо этого используйте PDF в Excel",
    "fail_title": "Не удалось или низкое качество?",
    "try_compress": "Сначала сжать",
    "try_split": "Сначала разделить",
    "try_excel": "В Excel"
  },
  "pdf_to_excel": {
    "drop_label": "Выберите PDF",
    "drop_desc": "Один PDF-файл на задание, максимум 5 МБ; преобразуется в Excel (.xlsx) через Alibaba Document Mind.",
    "empty_hint": "Файл еще не выбран.",
    "btn_convert": "Преобразовать"
  },
  "pdf_merge": {
    "drop_label": "Выберите PDF-файлы (объединены в порядке списка; добавьте несколько раз)",
    "drop_desc": "Поддерживается множественный выбор; порядок следует списку ниже; перетащите еще раз, чтобы добавить.",
    "err_need_two": "Выберите не менее 2 PDF-файлов.",
    "msg_done": "Загрузка завершена.",
    "err_failed": "Ошибка слияния",
    "empty_hint": "Файлы еще не выбраны.",
    "btn_merge_download": "Объединить и скачать",
    "download_name": "merged.pdf​",
    "move_up": "Переместить вверх",
    "move_down": "Переместить вниз"
  },
  "pdf_batch": {
    "phase2_title": "Фаза 2: пакетная очередь + рендеринг Worker (если поддерживается)",
    "phase2_body": "Если поддерживается OffscreenCanvas, растеризация запускается в Worker, чтобы уменьшить количество задержек пользовательского интерфейса; в противном случае он возвращается к основному потоку с разделением на фрагменты.",
    "drop_label": "Добавить PDF-файлы в очередь (выбрать несколько раз, перетащить несколько раз)",
    "drop_desc": "Файлы, отличные от PDF, фильтруются. Задачи появятся в списке ниже.",
    "err_no_pdf": "PDF-файлы не обнаружены.",
    "err_no_pending": "Нет ожидающих задач (завершенные элементы не экспортируются повторно).",
    "log_started": "Начало пакетного экспорта…",
    "err_cancelled": "Отменено",
    "err_failed_msg": "Ошибка пакета",
    "log_done_zip": "Загрузка упакованного ZIP завершена.",
    "scale_label": "Масштаб экспорта (пакет предлагает 1,4–2,2)",
    "fmt_label": "Формат экспорта",
    "quality_label": "Качество (0,1–1,0)",
    "status_prefix": "Статус:",
    "status_pending": "ожидает",
    "status_running": "выполнение",
    "status_done": "сделанный",
    "status_error": "ошибка",
    "btn_remove": "Удалять",
    "queue_empty": "Очередь пуста.",
    "btn_export_all": "Экспортировать все (ожидается {n})",
    "btn_processing": "Работающий…",
    "btn_cancel": "Отмена",
    "btn_clear_queue": "Очистить очередь",
    "log_page_progress": "{file}: {current}/{total}​"
  },
  "pdf_compress": {
    "notice_title": "Стратегия сжатия (прозрачная)",
    "notice_body": "Растровое сжатие: каждая страница преобразуется в JPG и перестраивается в PDF. Лучше всего работает при сканировании; текстовые PDF-файлы могут увеличиться или выглядеть мягче.",
    "drop_label": "Выберите PDF",
    "drop_desc": "Переупакуйте локально в браузере, чтобы уменьшить размер; ничего не загружается.",
    "compress_desc": "Репак локальной потоковой передачи для уменьшения размера; не загружено.",
    "empty_pdf": "PDF-файл еще не выбран.",
    "download_name": "сжатый.pdf",
    "scale_label": "Масштаб рендеринга (выше = резче, но больше)",
    "quality_label": "Качество JPG (0,1–1,0)",
    "btn_compress": "Начать сжатие",
    "msg_select_first": "Сначала выберите PDF.",
    "msg_done_hint": "Загрузка завершена (примечание: сканы сжимаются сильнее, чем текстовые PDF-файлы).",
    "err_failed": "Сжатие не удалось",
    "preset": "Предустановка сжатия",
    "preset_strong": "Сильный (меньше, меньшая четкость)",
    "preset_balanced": "Сбалансированный (рекомендуется)",
    "preset_quality": "Высокое качество (файл большего размера)",
    "before": "До",
    "after": "После",
    "change": "Изменение размера",
    "smaller": "Сжатие завершено. Перед загрузкой проверьте четкость.",
    "larger": "Результат больше оригинала. Сохраните оригинал или попробуйте более строгие настройки.",
    "preset_card_strong": "Самый маленький файл",
    "preset_card_strong_desc": "Оптимально подходит для сканирования, PDF-файлов с фотографиями и публикации только для чтения.",
    "preset_card_balanced": "Сбалансированный",
    "preset_card_balanced_desc": "Хороший вариант по умолчанию для большинства вложений.",
    "preset_card_quality": "Высокое качество",
    "preset_card_quality_desc": "Лучше подходит для небольшого текста, диаграмм или печати.",
    "raster_warning": "Примечание. Этот инструмент растрирует страницы и перестраивает PDF-файл. Текст больше не может быть выбран после сжатия. Используйте PDF в Word или извлечение текста, если вам нужен редактируемый контент.",
    "saved": "Сохранено",
    "output_size": "Выходной размер",
    "check_quality": "Откройте результат и проверьте четкость текста/изображения.",
    "next_actions": "Продолжить после сжатия",
    "next_split": "Разделить страницы",
    "next_merge": "Объединить PDF-файл",
    "next_images": "Преобразовать в изображения"
  },
  "pdf_crop": {
    "intro": "Отрегулируйте поля CropBox/MediaBox (пт). Это изменяет видимую область и границы страницы без удаления векторного содержимого.",
    "drop_label": "Выберите PDF",
    "drop_desc": "Обрезка происходит локально. Страницы настроены ниже.",
    "empty_pdf": "PDF-файл еще не выбран.",
    "left": "Левое поле (пт)",
    "right": "Правое поле (пт)",
    "top": "Верхнее поле (пт)",
    "bottom": "Нижнее поле (пт)",
    "mode_label": "Режим обрезки",
    "mode_crop_media": "CropBox + MediaBox (более общий)",
    "mode_crop_only": "Только CropBox (консервативный)",
    "btn_crop": "Обрезка и загрузка",
    "msg_select_pdf": "Сначала выберите PDF.",
    "msg_pick_pages": "Выберите страницы для обрезки.",
    "msg_done": "Загрузка завершена.",
    "err_failed": "Не удалось обрезать",
    "download_name": "cropped.pdf​"
  },
  "pdf_decrypt": {
    "notice_title": "Уведомление о соответствии",
    "notice_body": "Только для PDF-файлов, пароль которых вы знаете. Страницы растрируются и перестраиваются, поэтому выбираемый текст и ссылки теряются.",
    "drop_encrypt_label": "Выберите зашифрованный PDF-файл.",
    "drop_desc": "Расшифровать локально с помощью пароля; файлы не загружаются.",
    "empty_pdf": "PDF-файл еще не выбран.",
    "password_label": "Открыть пароль",
    "scale_label": "Масштаб рендеринга",
    "quality_label": "Качество JPG (0,1–1,0)",
    "btn_decrypt": "Расшифровать и скачать",
    "msg_select_first": "Сначала выберите PDF.",
    "msg_done": "Загрузка завершена.",
    "err_failed": "Не удалось расшифровать",
    "download_name": "decrypted.pdf​"
  },
  "pdf_delete_pages": {
    "drop_label": "Выберите PDF",
    "drop_desc": "Нажмите миниатюры для удаления; невыделенные страницы остаются и экспортируются в новый файл.",
    "hint_short": "Нажмите страницы, чтобы удалить; невыбранные страницы остаются в экспортированном PDF-файле.",
    "btn_delete": "Удалить выбранные страницы и загрузить",
    "empty_pdf": "PDF-файл еще не выбран.",
    "msg_select_pdf": "Сначала выберите PDF.",
    "msg_pick_delete": "Выберите страницы для удаления.",
    "msg_done": "Загрузка завершена.",
    "err_failed": "Удалить неудачные",
    "thumb_title": "Страницы для удаления",
    "download_name": "deleted-pages.pdf​"
  },
  "pdf_extract_text": {
    "drop_label": "Выберите PDF",
    "drop_desc": "Извлечение текста на странице локально; сканы могут не иметь текстового слоя.",
    "empty_pdf": "PDF-файл еще не выбран.",
    "btn_extract": "Извлечь текст (txt)",
    "msg_select_pdf": "Сначала выберите PDF.",
    "progress_page": "Извлечение страницы {current} / {total}…",
    "msg_done_hint": "Экспортированный текстовый файл. Примечание. Отсканированные файлы PDF или изображения могут не содержать текста.",
    "err_failed": "Извлечь не удалось"
  },
  "pdf_header_footer": {
    "intro": "Этап 2: шаблоны левого/центрального/правого верхнего и нижнего колонтитула; заполнители '{'n'}' и '{'total'}' заменяются при экспорте. В китайском тексте используется подмножество Source Han Sans из OSS; ошибки выборки корректно отступают.",
    "presets_heading": "Быстрые пресеты",
    "drop_label": "Выберите PDF",
    "drop_desc": "Применять текст верхнего/нижнего колонтитула на странице локально; поддерживает '{'n'}'/'{'total'}' и т. д.",
    "empty_pdf": "PDF-файл еще не выбран.",
    "header_left": "Заголовок слева",
    "header_center": "Центр заголовка",
    "header_right": "Заголовок справа",
    "footer_left": "Нижний колонтитул слева",
    "footer_center": "Нижний колонтитул в центре",
    "footer_right": "Нижний колонтитул справа",
    "ph_company": "например. название компании",
    "ph_title": "напр. название документа",
    "ph_version": "например. версия",
    "footer_center_ph": "Рекомендуется: '{'n'}' / '{'total'}'",
    "font_size": "Размер шрифта",
    "margin_pt": "Поля (пт)",
    "btn_apply": "Применить и скачать",
    "msg_select_pdf": "Сначала выберите PDF.",
    "msg_need_field": "Заполните хотя бы один слот верхнего или нижнего колонтитула.",
    "msg_pick_pages": "Выберите страницы для шаблона.",
    "msg_done": "Загрузка завершена.",
    "err_failed": "Ошибка",
    "preset_minimal_name": "Минимальный нижний колонтитул (n/всего)",
    "preset_internal_name": "Внутреннее использование + нижний колонтитул",
    "preset_dual_name": "Двойной верхний колонтитул + центрированный нижний колонтитул",
    "preset_internal_header": "Внутренний · Не распространять",
    "preset_internal_footer": "Страницы «{'n'}» / «{'total'}»",
    "preset_dual_footer": "Конфиденциально",
    "download_name": "header-footer.pdf​"
  },
  "images_to_pdf": {
    "intro": "Поддерживается формат PNG/JPEG. Одно изображение на страницу PDF; размер страницы соответствует размеру в пикселях.",
    "drop_label": "Выберите изображения (порядок страниц соответствует списку; добавьте несколько раз)",
    "drop_desc": "Только PNG и JPEG; Порядок списка соответствует порядку страниц.",
    "empty_hint": "Файлы еще не выбраны.",
    "btn_generate": "Создать PDF",
    "msg_need_image": "Выберите хотя бы одно изображение.",
    "msg_done": "Загрузка завершена.",
    "err_failed": "Не удалось создать",
    "download_name": "изображения-объединены.pdf"
  },
  "pdf_metadata": {
    "drop_label": "Выберите PDF",
    "drop_desc": "Чтение общих свойств документа; редактировать и экспортировать как новый файл.",
    "empty_pdf": "PDF-файл еще не выбран.",
    "label_title": "Заголовок",
    "label_author": "Автор",
    "label_subject": "Предмет",
    "label_keywords": "Ключевые слова",
    "keywords_ph": "Разделять запятыми",
    "label_creator": "Создатель",
    "label_producer": "Продюсер (необязательно)",
    "producer_ph": "Оставьте пустым, чтобы сохранить существующего производителя.",
    "label_language": "Язык (необязательно)",
    "language_ph": "например ж-CN, en-US; оставьте пустым, чтобы пропустить язык в структуре",
    "checkbox_viewer_prefs": "Предпочитать заголовок документа в заголовке окна просмотра (pdf-lib ViewerPreferences)",
    "btn_apply": "Применить и скачать",
    "msg_loaded": "Метаданные загружены; редактировать и экспортировать.",
    "msg_read_failed": "Чтение не удалось",
    "msg_select_pdf": "Сначала выберите PDF.",
    "msg_done_verify": "Метаданные записываются и загружаются (некоторые зрители кэшируют старые метаданные — переименуйте для проверки).",
    "err_export_failed": "Экспорт не удался",
    "download_suffix": "-метаданные",
    "page_intro": "Охватывает общие поля, отображаемые в разделе «Свойства документа» средства чтения. Изменения записывают новый файл локально — на наши серверы ничего не загружается. Создано <pdflib>Hopding/pdf-lib</pdflib>."
  },
  "pdf_page_numbers": {
    "intro": "Заполнители: текущая страница '{'n'}', общее количество страниц '{'total'}'. Китайские строки подходят (например, «Страница '{'n'}'»); шрифт загружается из подмножества OSS с резервным вариантом.",
    "drop_label": "Выберите PDF",
    "drop_desc": "Добавьте локальную нумерацию нижнего колонтитула/края страницы.",
    "empty_pdf": "PDF-файл еще не выбран.",
    "start_number": "Начальный номер",
    "align_label": "Выравнивание",
    "align_left": "Левый",
    "align_center": "Центр",
    "align_right": "Верно",
    "format_string": "Строка формата",
    "font_size": "Размер шрифта",
    "margin_x": "Горизонтальное поле (пт)",
    "margin_y_footer": "Подъем нижнего колонтитула (пт, больше = выше на странице)",
    "btn_add": "Добавьте номера страниц и загрузите",
    "msg_select_pdf": "Сначала выберите PDF.",
    "msg_pick_pages": "Выберите страницы для нумерации.",
    "msg_done": "Загрузка завершена.",
    "err_failed": "Ошибка",
    "download_name": "page-numbers.pdf​"
  },
  "pdf_reverse": {
    "drop_label": "Выберите PDF",
    "drop_desc": "Измените весь порядок страниц на обратный; содержимое не изменилось.",
    "empty_pdf": "PDF-файл еще не выбран.",
    "btn_reverse": "Обратный порядок и загрузка",
    "msg_select_pdf": "Сначала выберите PDF.",
    "msg_done": "Загрузка готова.",
    "err_failed": "Обработка не удалась",
    "download_suffix": "-обратный",
    "page_intro": "Полезно, когда привязка или порядок чтения требуют, чтобы весь PDF-файл переворачивался от начала до конца; реализовано посредством копирования страниц <pdflib>pdf-lib</pdflib> без повторной визуализации векторного содержимого."
  },
  "pdf_rotate": {
    "drop_label": "Выберите PDF",
    "drop_desc": "Выберите миниатюры, затем добавьте относительное вращение для каждой выбранной страницы; обрабатывается локально.",
    "empty_pdf": "PDF-файл еще не выбран.",
    "angle_label": "Поворот для применения (относительный)",
    "btn_rotate": "Применить поворот",
    "msg_select_pdf": "Сначала выберите PDF.",
    "msg_pick_page": "Выберите хотя бы одну страницу.",
    "msg_rotate_done": "Поворот завершен. Вы можете скачать сейчас.",
    "msg_download_done": "Загрузка началась.",
    "err_failed": "Не удалось повернуть",
    "thumb_title": "Страницы для поворота",
    "thumb_preview_hint": "В предварительном просмотре представлены только миниатюры; качество экспорта не пострадает.",
    "download_name": "rotated.pdf​"
  },
  "pdf_split": {
    "drop_label": "Выберите PDF",
    "drop_desc": "Разделить на несколько PDF-файлов по каждой странице или фиксированному размеру фрагмента (загрузка ZIP).",
    "empty_pdf": "PDF-файл еще не выбран.",
    "legend_mode": "Режим разделения",
    "mode_each": "Один файл на страницу",
    "mode_chunk": "Фиксированные группы страниц",
    "chunk_size_label": "Страниц в группе",
    "hint_each": "Каждая страница экспортируется в отдельный PDF-файл.",
    "hint_chunk": "Групповой экспорт каждой страницы {chunk}.",
    "btn_split": "Разделить и скачать ZIP",
    "msg_select_pdf": "Сначала выберите PDF.",
    "msg_done_zip": "Генерация ZIP началась.",
    "err_failed": "Разделить не удалось",
    "thumb_preview_title": "Preview (browse only; split follows options above)",
    "mode_selected": "Извлечь выбранные страницы в один PDF-файл",
    "hint_selected": "Нажмите на миниатюры ниже, чтобы выбрать страницы. Выбранные страницы ({count}) будут экспортированы как один PDF-файл в исходном порядке.",
    "msg_pick_pages": "Выберите хотя бы одну страницу из миниатюр ниже.",
    "msg_done_pdf": "PDF-файл с выбранной страницей создан и началась загрузка.",
    "selected_download_name": "выбранные-страницы.pdf",
    "selected_count": "Выбрано {count} страниц",
    "first_page": "Выбрать страницу 1",
    "first_three": "Выбрать первые 3",
    "clear_selected": "Очистить выбор"
  },
  "pdf_stamp": {
    "drop_pdf_label": "Выберите PDF",
    "drop_pdf_desc": "Базовый документ; выберите страницы для штампа.",
    "drop_stamp_label": "Изображение штампа (рекомендуется PNG)",
    "drop_stamp_desc": "PNG или JPEG; прозрачный PNG обычно выглядит лучше.",
    "empty_pdf": "PDF-файл еще не выбран.",
    "empty_stamp": "Изображение штампа ещё не выбрано.",
    "position_label": "Позиция",
    "scale_label": "Масштаб (относительно ширины изображения)",
    "margin_label": "Поля (пт)",
    "pos_center": "Центр",
    "pos_br": "Нижний правый",
    "pos_bl": "Нижний левый",
    "pos_tr": "Верхний правый",
    "pos_tl": "Верхний левый",
    "btn_apply": "Наложить штамп и скачать",
    "msg_need_both": "Выберите PDF и изображение штампа (PNG/JPG).",
    "msg_pick_pages": "Выберите страницы для штампа.",
    "msg_done": "Загрузка завершена.",
    "err_failed": "Ошибка",
    "download_name": "stamped.pdf​"
  },
  "pdf_to_images": {
    "hint_base": "Экспорт как изображения. Чёткость зависит от масштаба: выше — чётче, но медленнее и требует больше памяти.",
    "hint_fallback": " Внеэкранный рендеринг не поддерживается; некоторые форматы переключаются на PNG.",
    "drop_label": "Выберите PDF",
    "drop_desc": "Множественный выбор или перетаскивание пакетами; каждая страница становится изображением в одном ZIP; только локально.",
    "empty_pdf": "PDF-файл еще не выбран.",
    "err_no_pdf": "PDF-файлы не распознаны.",
    "scale_label": "Масштаб рендеринга (рекомендуется 1,5–3)",
    "fmt_label": "Формат экспорта",
    "opt_png": "PNG (без потерь)",
    "opt_jpeg": "JPG (меньше)",
    "opt_webp": "WebP (меньше)",
    "quality_label": "Качество (0,1–1,0)",
    "btn_export": "Экспорт (ZIP)",
    "msg_select_pdf": "Сначала выберите PDF.",
    "progress_export": "Экспорт страницы {current} / {total}…",
    "progress_export_multi": "Файл {fileIndex}/{fileTotal}: {fileName} — страница {current}/{total}…",
    "msg_zip_done": "ZIP упакован; загрузка началась.",
    "err_failed": "Экспорт не удался",
    "err_cancelled": "Отменено",
    "page_range": "Диапазон страниц (все / нечётные / чётные / 1,3-5)",
    "page_range_invalid": "Недопустимый диапазон страниц. Используйте all, odd, even или диапазон, например 1,3-5."
  },
  "pdf_watermark": {
    "intro": "Китайские текстовые водяные знаки через подмножество OSS Source Han Sans. Если загрузка шрифта не удалась, используются встроенные шрифты, и китайский текст может отображаться квадратами.",
    "drop_label": "Выберите PDF",
    "drop_desc": "Добавьте текстовый водяной знак на выбранные страницы локально.",
    "empty_pdf": "PDF-файл еще не выбран.",
    "page_range_hint": "Подсказка: all / odd / even / 1,3-5",
    "label_text": "Текст водяного знака",
    "label_color": "Цвет (#RRGGBB)",
    "label_font_size": "Размер шрифта",
    "label_opacity": "Непрозрачность (0–1)",
    "label_angle": "Поворот (градусы)",
    "btn_generate": "Создать и скачать",
    "msg_select_pdf": "Сначала выберите PDF.",
    "msg_pick_pages": "Выберите страницы для водяного знака.",
    "msg_done": "Загрузка завершена.",
    "err_failed": "Ошибка",
    "download_name": "watermarked.pdf​"
  },
  "json_format": {
    "indent_label": "Отступ",
    "indent_2": "2 пробела",
    "indent_4": "4 пробела",
    "indent_tab": "Табуляция",
    "font_size_label": "Размер шрифта",
    "valid_ok": "✓ Допустимый",
    "valid_bad": "✗ Недопустимый",
    "btn_escape": "Экранировать / Деэкранировать",
    "btn_json_xml": "JSON ↔ XML​",
    "btn_fold": "Свернуть / Развернуть",
    "hdr_src": "Источник",
    "hdr_result": "Результат (редактируемый)",
    "ph_src": "Вставьте или введите JSON здесь…",
    "ph_result": "Отформатированный JSON появится здесь…",
    "flash_unescape_fmt_ok": "Деэкранировано и отформатировано",
    "flash_unescape_ok_maybe": "Деэкранировано (может быть недопустимым JSON)",
    "flash_unescape_fail": "Ошибка деэкранирования",
    "flash_escape_ok": "Экранировано успешно",
    "flash_escape_ok_maybe": "Экранировано успешно (источник может быть недопустимым JSON)",
    "flash_escape_fail": "Ошибка экранирования",
    "flash_please_data": "Пожалуйста, сначала введите данные",
    "flash_xml_bad": "Ошибка преобразования: недопустимый XML",
    "flash_json_bad": "Ошибка преобразования: недопустимый JSON",
    "hint_xml_done": "Преобразовано в XML",
    "hint_json_done": "Преобразовано в JSON",
    "flash_need_json_src": "Пожалуйста, сначала введите JSON в исходную панель",
    "flash_need_valid_json": "Пожалуйста, сначала отформатируйте или введите допустимый JSON",
    "hint_all_fold": "Всё свёрнуто",
    "hint_all_unfold": "Всё развёрнуто",
    "flash_result_empty": "Результат пуст",
    "flash_clipboard_ok": "Скопировано в буфер обмена",
    "flash_no_download": "Нечего скачивать",
    "confirm_plain_download": "Содержимое не является допустимым JSON. Всё равно скачать?",
    "suffix_json_invalid": "Недопустимый JSON",
    "btn_copy_result": "Копировать результат"
  },
  "og_preview": {
    "mock_card_title": "Симулированная карточка (не реальный предпросмотр краулера)",
    "tag_snippet_title": "Мета-фрагмент",
    "demo_title": "Tools Ku | Пример",
    "demo_desc": "Пример описания для локально смоделированной карточки общего доступа."
  },
  "robots": {
    "chk_allow_site": "Allow: / (разрешить сканирование всего сайта)",
    "lbl_disallow_paths": "Запрещённые пути (по одному на строку)",
    "lbl_sitemap_urls": "URL-адреса Sitemap (по одному на строку)",
    "hdr_preview": "robots.txt​"
  },
  "sitemap": {
    "lbl_site_root": "Корневой URL сайта",
    "lbl_paths": "Пути или полные URL (по одному на строку)",
    "hdr_preview": "sitemap.xml​"
  },
  "csp": {
    "opt_default": "default-src 'self'​",
    "opt_script": "script-src 'self'​",
    "opt_unsafe_inline": "Разрешить встроенные скрипты (слабее)",
    "opt_style": "style-src 'self' 'unsafe-inline'​",
    "opt_img": "img-src * data:​",
    "opt_font": "font-src 'self'​",
    "opt_connect": "connect-src 'self'​",
    "opt_frame": "frame-ancestors 'none'​",
    "opt_base": "base-uri 'self'​",
    "opt_form": "form-action 'self'​",
    "opt_upgrade": "upgrade-insecure-requests​",
    "lbl_extra_directives": "Дополнительные директивы (по одной на строку; объединяются точкой с запятой)",
    "hdr_preview": "Content-Security-Policy​",
    "placeholder_extra": "report-uri https://...​"
  },
  "permissions_policy": {
    "lbl_extra": "Дополнительные записи (через запятую)",
    "hdr_preview": "Permissions-Policy​",
    "placeholder_extra": "interest-cohort=()​"
  },
  "env_parse": {
    "chk_mask": "Маскировать значения (только отображение; исходный текст не изменяется)",
    "lbl_raw": "Содержимое .env",
    "th_key": "Ключ",
    "th_value": "Значение",
    "empty_rows": "Нет строк ключ=значение"
  },
  "http_headers": {
    "intro": "Примеры распространённых заголовков безопасности; настройте один стек (Nginx / CDN / фреймворк).",
    "hsts_title": "HSTS​",
    "hsts_desc": "Принудительный HTTPS (max-age один год)",
    "xcto_title": "X-Content-Type-Options​",
    "xcto_desc": "Отключить MIME-сниффинг",
    "xfo_title": "X-Frame-Options​",
    "xfo_desc": "Запретить встраивание (эквивалент DENY)",
    "ref_title": "Referrer-Policy​",
    "ref_desc": "Ограничить Referer",
    "pp_title": "Permissions-Policy (пример)",
    "pp_desc": "Отключить некоторые чувствительные API"
  },
  "graphql_format": {
    "lbl_input": "GraphQL​",
    "syntax_error": "Синтаксическая ошибка"
  },
  "openapi_view": {
    "lbl_input": "OpenAPI (JSON)​",
    "err_invalid_json": "Не удалось разобрать JSON",
    "root_label": "корень"
  },
  "properties_json": {
    "lbl_properties": ".properties​",
    "lbl_json": "JSON (строковые значения → properties)",
    "btn_to_json": "→ JSON​",
    "btn_to_properties": "→ Properties​",
    "footnote_flat": "Вложенные объекты не выравниваются; только плоские строковые карты.",
    "err_failed": "Ошибка"
  },
  "xml_format": {
    "lbl_xml": "XML​",
    "btn_validate_indent": "Проверка и отступ",
    "err_parse_failed": "Ошибка разбора XML",
    "err_failed": "Ошибка"
  },
  "semver": {
    "lbl_a": "Версия A",
    "lbl_b": "Версия B",
    "btn_compare": "Сравнить",
    "invalid": "недопустимо",
    "err_parse_line": "Ошибка разбора: A={a}  B={b}",
    "cmp_before": "A предшествует B",
    "cmp_after": "A следует после B",
    "cmp_equal": "Равны",
    "line_norm": "Нормализовано: A={a}  B={b}",
    "line_cmp": "Сравнение: {rel}",
    "line_diff": "semver.diff: {diff}​",
    "diff_same": "diff: (та же версия)"
  },
  "mermaid": {
    "lbl_source": "Исходный код Mermaid",
    "btn_render": "Отрисовать",
    "btn_rendering": "Отрисовка…",
    "err_render": "Ошибка рендеринга"
  },
  "editorconfig": {
    "preset_web": "Веб-стандарт (2 пробела)",
    "preset_py": "Python (4 пробела)",
    "preset_go": "Go (табуляция)"
  },
  "image_compress": {
    "intro_note": "Изображения обрабатываются локально в вашем браузере и никогда не загружаются. Сжатие выполняется параллельно в зависимости от возможностей устройства с контролем использования памяти. PNG поддерживает визуально безпотерьное интеллектуальное квантование или строго попиксельное сжатие без потерь. Оригинал сохраняется, если результат не меньше.",
    "drop_desc": "Поддерживается пакетная обработка. Компоненты сжатия прогреваются после выбора, а размеры изображений остаются без изменений.",
    "fmt_auto": "Как в источнике",
    "fmt_jpeg": "Унифицировать как JPG",
    "fmt_webp": "Унифицировать как WebP",
    "fmt_png": "Унифицировать как PNG",
    "quality_label": "Качество сжатия",
    "quality_high": "Высокое качество",
    "quality_balanced": "Рекомендуемое (сбалансированное)",
    "quality_strong": "Сильное сжатие",
    "png_mode_label": "Режим сжатия PNG",
    "png_mode_smart": "Интеллектуальное сжатие (рекомендуется)",
    "png_mode_lossless": "Строго без потерь",
    "png_smart_hint": "Интеллектуальный режим объединяет похожие цвета и может значительно уменьшить размер PNG почти без видимых изменений, но не является попиксельно безпотерьным.",
    "png_lossless_hint": "Строгий режим без потерь сохраняет каждый пиксель и только оптимизирует кодирование PNG, поэтому экономия обычно меньше, чем в интеллектуальном режиме.",
    "progress": "Завершено {completed} / {total}",
    "worker_hint": "Параллельная обработка с {count} фоновыми воркерами",
    "preparing_hint": "Подготовка компонентов сжатия изображений…",
    "fallback_hint": "Фоновая обработка изображений недоступна в этом браузере; активен режим совместимости",
    "cancel": "Отменить сжатие",
    "cancelling": "Отмена…",
    "cancelled": "Сжатие отменено. Завершённые результаты остаются доступными.",
    "completed": "Обработано {count} изображений.",
    "size_change": "Общий размер: {before} → {after}",
    "saved": "Сэкономлено: {size} ({percent}%)",
    "original_kept": "Оригиналов сохранено: {count}"
  },
  "image_exif": {
    "intro_note": "Просмотр/удаление происходит локально. Удаление повторно экспортирует изображение (более универсально) и может изменить размер/формат.",
    "drop_desc": "Анализ EXIF локально; файлы не загружаются.",
    "empty_hint": "Изображение не выбрано.",
    "lbl_export_after_strip": "Формат после удаления",
    "opt_jpeg_rec": "JPG (рекомендуется)",
    "opt_png": "PNG​",
    "opt_webp": "WebP​",
    "btn_strip": "Удалить EXIF и скачать",
    "details_raw": "RAW EXIF JSON",
    "msg_no_exif": "EXIF не обнаружен (или формат не содержит EXIF).",
    "msg_read_fail": "Чтение не удалось",
    "msg_exported_clean": "Экспортирована версия без метаданных.",
    "msg_strip_fail": "Обработка не удалась"
  },
  "image_crop": {
    "intro_note": "Перетащите на предпросмотре, чтобы выбрать область обрезки, или введите пиксели ниже. Обработка локальная.",
    "drop_desc": "Обрезка одного изображения; экспорт PNG / JPG / WebP.",
    "empty_hint": "Изображение не выбрано.",
    "hint_canvas": "Источник {w}×{h} px — перетащите на изображении для выделения",
    "lbl_left_x": "Левый X",
    "lbl_top_y": "Верхний Y",
    "lbl_width": "Ширина",
    "lbl_height": "Высота",
    "btn_reset_full": "Сбросить до полного изображения",
    "lbl_quality_short": "Качество",
    "btn_export": "Экспортировать обрезку",
    "msg_pick_area": "Пожалуйста, выберите изображение и область обрезки.",
    "msg_exported": "Обрезка экспортирована.",
    "msg_export_fail": "Экспорт не удался"
  },
  "image_resize": {
    "intro_note": "Изменение размера выполняется локально. contain = вписать с полями; cover = заполнить и обрезать.",
    "drop_desc": "Укажите размер и формат ниже, затем нажмите «Начать обработку» для пакетного экспорта."
  },
  "image_scale": {
    "intro_note": "Пропорциональное масштабирование по длинной стороне, фиксированной ширине или фиксированной высоте; соотношение сторон сохраняется. Режим длинной стороны оставляет оригиналы меньше целевого; режимы ширины/высоты могут увеличивать. Локальная обработка.",
    "drop_desc": "Укажите режим масштабирования и целевые пиксели, затем пакетный экспорт.",
    "lbl_scale_by": "Масштабирование по",
    "mode_long_edge": "Длинная сторона (только уменьшение до лимита)",
    "mode_width": "Ширина (фиксированная ширина, пропорциональная высота)",
    "mode_height": "Высота (фиксированная высота, пропорциональная ширина)",
    "dim_long_edge": "Лимит длинной стороны (px)",
    "dim_width": "Целевая ширина (px)",
    "dim_height": "Целевая высота (px)",
    "lbl_quality_01": "Качество (0,1–1)"
  },
  "image_transform": {
    "intro_note": "Canvas + CSS-фильтры (оттенки серого/инверсия) локально; при экспорте в JPEG прозрачность заменяется на белый фон.",
    "drop_desc": "Обычные растровые форматы; настройте преобразования, затем пакетный экспорт.",
    "lbl_rotate": "Поворот",
    "rot_0": "Без поворота",
    "rot_90": "90° по часовой",
    "rot_180": "180°​",
    "rot_270": "270° по часовой",
    "lbl_export_fmt": "Формат экспорта",
    "lbl_quality_short": "Качество",
    "flip_h": "Отразить по горизонтали",
    "flip_v": "Отразить по вертикали",
    "filter_gray": "Оттенки серого",
    "filter_invert": "Инверсия",
    "msg_need_transform": "Выберите хотя бы одно преобразование (поворот, отражение или фильтр).",
    "msg_summary": "Готово: {ok}/{total} успешно.",
    "btn_zip": "Скачать ZIP-архив"
  },
  "image_watermark": {
    "intro_note": "Водяные знаки создаются локально; ничего не загружается.",
    "drop_desc": "Настройте текстовый водяной знак, затем пакетный экспорт.",
    "lbl_text": "Текст водяного знака",
    "lbl_position": "Позиция",
    "pos_tl": "Верхний левый",
    "pos_tr": "Верхний правый",
    "pos_bl": "Нижний левый",
    "pos_br": "Нижний правый",
    "pos_center": "Центр",
    "lbl_color": "Цвет",
    "lbl_font_size": "Размер шрифта",
    "lbl_opacity": "Непрозрачность (0–1)",
    "lbl_padding": "Отступ (px)",
    "msg_empty_text": "Текст водяного знака не может быть пустым."
  },
  "image_collage": {
    "intro_note": "Склейка выполняется локально; избегайте слишком большого количества изображений (очень высокий/широкий результат).",
    "drop_label": "Выберите изображения (порядок = порядок склейки)",
    "drop_desc": "Поддерживается множественный выбор; порядок списка — порядок склейки, удалите элементы для изменения.",
    "empty_hint": "Изображений пока нет. Порядок здесь определяет порядок склейки.",
    "lbl_direction": "Направление",
    "dir_vertical": "Вертикально (длинная полоса)",
    "dir_horizontal": "Горизонтально",
    "lbl_gap": "Зазор (px)",
    "msg_started": "Загрузка началась."
  },
  "image_convert": {
    "page_intro": "Обычные растровые форматы (включая <fmt>PNG, JPEG, WebP, GIF, BMP, ICO, AVIF</fmt>, в зависимости от декодирования браузером) и <svg>SVG</svg> конвертируются локально. Анимированный GIF экспортирует только первый кадр; прозрачные области заливаются белым при экспорте в JPEG; HEIC и подобные форматы часто не могут быть декодированы в браузере.",
    "common_uses_title": "Частые случаи использования",
    "common_use_li1": "Унификация веб-ресурсов в WebP или PNG; рабочие процессы печати/архивации в JPEG.",
    "common_use_li2": "Растеризация SVG в растровое изображение для инструментов, работающих только с растром."
  },
  "image_convert_to_png": {
    "page_intro": "Экспорт обычных форматов изображений в PNG локально на вашем устройстве — ничего не покидает ваш компьютер. Полезно, когда вам нужен рабочий процесс только с PNG или下游 принимает только PNG. Анимированные изображения экспортируют первый кадр.",
    "common_notes_title": "Примечания",
    "common_notes_li1": "HEIC и некоторые фирменные форматы могут не декодироваться в браузере — сначала конвертируйте в JPG в вашей ОС.",
    "common_notes_li2": "Очень большие изображения используют больше памяти; если конвертация не удалась, уменьшите размер или разделите.",
    "drop_subline": "Многоформатный ввод; вывод всегда PNG."
  },
  "image_gif_to_png": {
    "drop_subline": "Фокус на GIF; экспорт однослойного PNG."
  },
  "image_jpg_to_png": {
    "page_intro": "<jpeg>JPEG</jpeg> — формат с потерями; конвертация в PNG не восстановит утраченные детали, но предотвратит дальнейшее сжатие с потерями — удобно, когда ваш конвейер редактирования или пакетные задачи стандартизированы на PNG. Поддерживается множественный выбор и перетаскивание.",
    "notes_title": "Примечания",
    "notes_body": "Обычные JPEG-фотографии непрозрачны; после конвертации в PNG они обычно остаются полностью непрозрачными, если только источник уже не имел прозрачности (редко).",
    "drop_subline": "Фокус на JPG/JPEG; другие растры допустимы. Вывод — PNG."
  },
  "image_jpg_to_webp": {
    "drop_subline": "Фокус на JPG/JPEG; другие растры в WebP также поддерживаются."
  },
  "image_png_to_jpg": {
    "drop_subline": "Фокус на PNG; другие растры в JPG также поддерживаются."
  },
  "image_png_to_webp": {
    "drop_subline": "Фокус на PNG; другие растры в WebP также поддерживаются."
  },
  "image_svg_to_png": {
    "drop_subline": "Выберите .svg файлы; вывод — PNG."
  },
  "image_webp_to_jpg": {
    "drop_subline": "Фокус на WebP; другие растры в JPG также поддерживаются."
  },
  "image_webp_to_png": {
    "page_intro": "Многие сайты поставляют ресурсы в <webp>WebP</webp>; когда ваш целевой инструментарий принимает только PNG, пакетная конвертация здесь локально перед импортом в другое место. Поддерживается множественный выбор файлов.",
    "tips_title": "Совет",
    "tips_body": "WebP с потерями, без потерь и с прозрачностью — все растеризуются в браузере перед сохранением как PNG — аналогично экспорту из настольных графических приложений в большинстве случаев.",
    "drop_subline": "Фокус на WebP; другие растры допустимы; вывод всегда PNG."
  },
  "image_ico": {
    "intro_note": "Создание favicon.ico из одного изображения локально: выберите квадратный размер и скачайте (PNG внутри ICO для современных браузеров и Windows).",
    "drop_desc": "Выберите размер, затем скачайте favicon.ico.",
    "pick_label": "Выберите изображение (рекомендуется 512×512 или больше)",
    "empty_hint": "Изображение не выбрано.",
    "lbl_side": "Сторона вывода (квадрат)",
    "hint_one_size": "ICO содержит только выбранный размер.",
    "err_pick_first": "Пожалуйста, сначала выберите изображение.",
    "err_canvas": "Не удалось создать контекст canvas",
    "msg_download_started": "Начата загрузка favicon.ico.",
    "msg_generate_fail": "Ошибка генерации",
    "page_intro": "Выберите одно большое изображение (рекомендуется 512×512 или больше), выберите длину стороны вывода, затем скачайте <favicon>favicon.ico</favicon>."
  },
  "image_ocr": {
    "intro_note": "Воркер Tesseract, ядро и языковые пакеты загружаются из CDN (первый запуск медленнее). Изображения остаются в вашем браузере.",
    "lbl_langs": "Языки (коды Tesseract, например eng, chi_sim, eng+chi_sim)",
    "lbl_image": "Изображение",
    "hdr_result": "Распознанный текст",
    "prog_initializing": "Инициализация…",
    "prog_recognizing": "Распознавание {pct}%",
    "empty_result": "(Текст не распознан)",
    "err_failed": "Ошибка распознавания",
    "lang_zh_en": "Упрощённый китайский + английский",
    "lang_zh": "Упрощённый китайский",
    "lang_ja_en": "Японский + английский",
    "lang_zh_tw_en": "Традиционный китайский + английский",
    "copy": "Копировать текст",
    "download_txt": "Скачать TXT"
  },
  "bcrypt": {
    "text_label": "Текст",
    "rounds_label": "Раунды (4-31)",
    "generate": "Создать хеш",
    "copy": "Скопировать",
    "verify_hash_label": "Хеш для проверки",
    "verify": "Проверить",
    "match": "Совпадает",
    "not_match": "Не совпадает"
  },
  "sm3": {
    "text_label": "Входной текст",
    "compute": "Вычислить",
    "copy": "Скопировать"
  },
  "sm4": {
    "key_label": "Ключ (32 шестнадцатеричных символа)",
    "text_label": "Входной текст",
    "encrypt": "Шифрование",
    "decrypt": "Расшифруйте",
    "process": "Обработать",
    "copy": "Скопировать",
    "error": "Ошибка"
  },
  "sm2": {
    "generate_keypair": "Создать пару ключей",
    "public_key": "Открытый ключ",
    "private_key": "Закрытый ключ",
    "text_label": "Входной текст",
    "encrypt": "Шифрование",
    "decrypt": "Расшифруйте",
    "copy": "Скопировать",
    "error": "Ошибка"
  },
  "password_strength": {
    "password_label": "Пароль",
    "level_0": "Слабый",
    "level_1": "Средний",
    "level_2": "Надёжный",
    "level_3": "Очень надёжный",
    "length": "Длина",
    "crack_time": "Время взлома",
    "lower": "Строчные",
    "upper": "Прописные",
    "digit": "Цифры",
    "special": "Спецсимволы"
  },
  "wifi_qr": {
    "ssid": "SSID​",
    "password": "Пароль",
    "encryption": "Шифрование",
    "none": "Нет",
    "generate": "Создать QR"
  },
  "json_to_go": {
    "struct_name": "Имя структуры",
    "json_label": "Входной JSON",
    "convert": "Преобразовать",
    "copy": "Скопировать",
    "parse_error": "Ошибка разбора JSON"
  },
  "json_to_java": {
    "class_name": "Имя класса",
    "json_label": "Входной JSON",
    "convert": "Преобразовать",
    "copy": "Скопировать",
    "parse_error": "Ошибка разбора JSON"
  },
  "json_to_sql": {
    "table_name": "Имя таблицы",
    "json_label": "Входной массив JSON",
    "convert": "Преобразовать",
    "copy": "Скопировать",
    "parse_error": "Ошибка разбора JSON",
    "not_array": "Входные данные не являются массивом JSON"
  },
  "json_merge": {
    "json_a": "JSON A​",
    "json_b": "JSON B​",
    "merge": "Объединить",
    "copy": "Скопировать",
    "parse_error": "Ошибка разбора JSON"
  },
  "nginx_format": {
    "input_label": "Входной конфиг Nginx",
    "format": "Формат",
    "copy": "Скопировать"
  },
  "docker_to_compose": {
    "cmd_label": "Входная команда docker run",
    "convert": "Преобразовать",
    "copy": "Скопировать"
  },
  "regex_cheatsheet": {
    "copy": "Скопировать",
    "copied": "Скопировано"
  },
  "faker": {
    "generate": "Создать фейковые данные"
  },
  "deobfuscate": {
    "input_label": "Входной JS-код",
    "format": "Формат",
    "copy": "Скопировать"
  },
  "text_pinyin": {
    "input_label": "Введите китайский текст",
    "copy": "Скопировать"
  },
  "text_zh_convert": {
    "s2t": "Упр.→Трад.",
    "t2s": "Трад.→Упр.",
    "input_label": "Входной текст",
    "copy": "Скопировать"
  },
  "text_mask": {
    "input_label": "Входной текст",
    "keep_first": "Сохранить первые N",
    "keep_last": "Сохранить последние N",
    "mask_char": "Символ маски",
    "copy": "Скопировать"
  },
  "text_emoji": {
    "search_placeholder": "Поиск эмодзи…",
    "copied": "Скопировано"
  },
  "text_synonym": {
    "input_label": "Введите слово",
    "synonyms": "Синонимы",
    "antonyms": "Антонимы",
    "not_found": "Не найдено в словаре"
  },
  "totp": {
    "secret_label": "Секрет (Base32)",
    "remaining": "{sec}с осталось"
  },
  "basic_auth": {
    "username": "Имя пользователя",
    "password": "Пароль",
    "copy": "Скопировать"
  },
  "cookie_parse": {
    "input_label": "Входная строка Cookie",
    "key": "Ключ",
    "value": "Значение"
  },
  "jwt_generate": {
    "header": "Заголовок (JSON)",
    "payload": "Полезная нагрузка (JSON)",
    "secret": "Секрет",
    "generate": "Создать JWT",
    "copy": "Скопировать",
    "error": "Ошибка генерации"
  },
  "svg_placeholder": {
    "width": "Ширина",
    "height": "Высота",
    "text": "Текст",
    "fg": "Передний план",
    "bg": "Фон",
    "copy_svg": "Копировать SVG",
    "copy_data_url": "Копировать Data URL"
  },
  "stopwatch": {
    "start": "Начало",
    "pause": "Пауза",
    "resume": "Продолжить",
    "lap": "Круг",
    "reset": "Сброс",
    "lap_n": "Круг {n}"
  },
  "date_calc": {
    "add_days": "Добавить/вычесть дни",
    "date_diff": "Разница между датами",
    "date1": "Дата",
    "date2": "Дата 2",
    "days": "Дни",
    "calc": "Вычислить"
  },
  "percentage": {
    "mode_of": "X% от Y",
    "mode_is": "X — сколько % от Y",
    "mode_change": "Темп изменения",
    "percent": "Процент",
    "of_value": "Значение",
    "value": "Значение",
    "total": "Итого",
    "from": "От",
    "to": "До"
  },
  "temperature": {
    "value": "Температура"
  },
  "roman_numeral": {
    "to_roman": "→ Римские",
    "from_roman": "→ Арабские",
    "arabic": "Арабские",
    "roman": "Римские"
  },
  "image_greyscale": {
    "process": "В оттенки серого",
    "download": "Скачать"
  },
  "image_nine_grid": {
    "process": "Нарезка 9-сетка"
  },
  "mac_lookup": {
    "input_label": "Введите MAC-адрес",
    "not_found": "Производитель не найден"
  },
  "ipv4_range": {
    "start": "Начальный IP",
    "end": "Конечный IP"
  },
  "port_reference": {
    "port": "Порт",
    "proto": "Протокол",
    "name": "Имя"
  },
  "math_eval": {
    "placeholder": "Введите выражение, например 2^10 + sqrt(16)",
    "calc": "Вычислить",
    "preview": "Предварительный просмотр",
    "supported": "Поддерживаемые операции",
    "history": "История",
    "clear": "Очистить",
    "copy_result": "Копировать результат",
    "copied": "Результат скопирован.",
    "radian_note": "Тригонометрические функции используют радианы, например sin(pi/2) = 1."
  },
  "eta_calc": {
    "total": "Всего",
    "done": "Выполнено",
    "elapsed": "Прошло",
    "elapsed_unit": "секунд",
    "speed": "Скорость",
    "speed_unit": "/с",
    "remaining": "Осталось",
    "total_time": "Общее время"
  },
  "mac_gen": {
    "count": "Количество",
    "separator": "Разделитель",
    "prefix": "Префикс (необязательно)",
    "uppercase": "Верхний регистр",
    "generate": "Создать",
    "results": "Результаты",
    "copy_all": "Копировать все"
  },
  "device_info": {
    "note": "Определить информацию о текущей среде браузера.",
    "property": "Свойство",
    "value": "Значение"
  },
  "bip39": {
    "strength": "Биты энтропии",
    "generate": "Создать",
    "loading": "Загрузка…",
    "mnemonic": "Мнемоника",
    "copy": "Скопировать",
    "error": "Ошибка генерации"
  },
  "rsa_keygen": {
    "key_size": "Размер ключа",
    "generate": "Создать пару ключей",
    "generating": "Генерация…",
    "public_key": "Открытый ключ (PEM)",
    "private_key": "Закрытый ключ (PEM)",
    "copy": "Скопировать"
  },
  "xml_json": {
    "input": "Вход",
    "output": "Вывод",
    "convert": "Преобразовать",
    "copy": "Скопировать"
  },
  "json_minify": {
    "input": "Входной JSON",
    "minify": "Минифицировать",
    "output": "Вывод",
    "copy": "Скопировать",
    "original": "Оригинал",
    "minified_size": "Минифицированный",
    "saved": "Сохранено"
  },
  "numeronym": {
    "encode": "Кодировать",
    "decode": "Декодирование",
    "examples": "Частые примеры"
  },
  "ascii_art": {
    "text": "Текст",
    "char_set": "Символ заполнения",
    "result": "Результат",
    "copy": "Скопировать",
    "hint": "Поддерживает английские буквы, цифры и некоторую пунктуацию, до 30 символов."
  },
  "idcard": {
    "input_label": "Введите номер удостоверения",
    "valid": "Действителен",
    "invalid": "Недействителен",
    "province": "Провинция",
    "birthday": "Дата рождения",
    "gender": "Пол",
    "male": "Мужской",
    "female": "Женский",
    "unknown": "Неизвестно"
  },
  "chinese_colors": {
    "copied": "Скопировано"
  },
  "relationship": {
    "input_label": "Введите цепочку родства (например, отец,мать)",
    "placeholder": "отец,мать",
    "unknown": "Неизвестно"
  },
  "curl_to_code": {
    "input_label": "Команда cURL",
    "lang_label": "Целевой язык",
    "convert": "Преобразовать",
    "output": "Выходной код",
    "copy": "Скопировать",
    "copied": "Скопировано",
    "err_parse": "Не удалось разобрать команду cURL"
  },
  "box_shadow": {
    "layer": "Слой",
    "remove": "Удалять",
    "offsetX": "Смещение X",
    "offsetY": "Смещение Y",
    "blur": "Размытие",
    "spread": "Распространение",
    "color": "Цвет",
    "add_layer": "Добавить слой",
    "preview": "Предварительный просмотр",
    "copy": "Скопировать",
    "copied": "Скопировано"
  },
  "border_radius": {
    "top_left": "Верхний левый",
    "top_right": "Верхний правый",
    "bottom_right": "Нижний правый",
    "bottom_left": "Нижний левый",
    "preview": "Предварительный просмотр",
    "copy": "Скопировать",
    "copied": "Скопировано"
  },
  "flexbox": {
    "direction": "flex-direction​",
    "justify_content": "justify-content​",
    "align_items": "align-items​",
    "flex_wrap": "flex-wrap​",
    "gap": "gap​",
    "add_child": "Добавить элемент",
    "remove_child": "Удалить элемент",
    "preview": "Предварительный просмотр",
    "copy": "Скопировать",
    "copied": "Скопировано"
  },
  "gradient": {
    "type": "Тип",
    "angle": "Угол",
    "color_stops": "Цветовые остановки",
    "remove": "Удалять",
    "add_stop": "Добавить остановку",
    "preview": "Предварительный просмотр",
    "copy": "Скопировать",
    "copied": "Скопировано"
  },
  "css_animation": {
    "preset": "Пресет",
    "duration": "Длительность(с)",
    "timing": "Тайминг",
    "iteration": "Повторение",
    "keyframes": "Ключевые кадры",
    "preview": "Предварительный просмотр",
    "copy": "Скопировать",
    "copied": "Скопировано"
  },
  "color_blindness": {
    "input_color": "Входной цвет",
    "original": "Оригинал",
    "palette": "Предпросмотр палитры"
  },
  "token_count": {
    "input_label": "Входной текст",
    "placeholder": "Введите текст для оценки количества токенов…",
    "chars": "символов",
    "words": "слов",
    "lines": "строк",
    "estimate": "Оценка токенов",
    "tokens": "токенов",
    "of_context": "из контекста",
    "disclaimer": "※ Приблизительная оценка. Фактическое количество зависит от конкретного токенизатора.",
    "model": "Эталонная модель",
    "output_tokens": "Ожидаемые выходные токены",
    "input_estimate": "Оценка входных токенов",
    "context_usage": "Использование контекста",
    "estimated_cost": "Ориентировочная стоимость (USD)",
    "disclaimer_extended": "Это приближение на основе символов, а не точный результат официального токенизатора. Цены и лимиты контекста могут меняться; проверьте актуальные цены у провайдера перед отправкой запроса."
  },
  "screenshot_beautify": {
    "upload": "Загрузить скриншот",
    "bg_color": "Фон",
    "padding": "Отступ",
    "border_radius": "Скругление углов",
    "shadow_blur": "Размытие тени",
    "shadow_color": "Цвет тени",
    "preview": "Предварительный просмотр",
    "no_image": "Пожалуйста, сначала загрузите скриншот",
    "export_png": "Экспорт PNG"
  },
  "pangu_spacing": {
    "input_label": "Входной текст",
    "placeholder": "Hello世界，这是123test文本​",
    "output": "Результат",
    "copy": "Скопировать",
    "copied": "Скопировано"
  },
  "aspect_ratio": {
    "width": "Ширина",
    "height": "Высота",
    "calc_ratio": "Вычислить соотношение",
    "common_ratios": "Частые соотношения",
    "reverse_calc": "Обратный расчёт",
    "ratio_w": "Соотношение Ш",
    "ratio_h": "Соотношение В",
    "known_side": "Известная сторона",
    "known_value": "Известное значение",
    "result": "Результат"
  },
  "loan_calc": {
    "principal": "Сумма кредита",
    "annual_rate": "Годовая ставка (%)",
    "term": "Срок кредита (лет)",
    "term_half_year": "6 месяцев ({months} периодов)",
    "term_years": "{years, plural, one {1 год} few {# года} other {# лет}} ({months} периодов)",
    "method": "Метод",
    "equal_installment": "Равными платежами",
    "equal_principal": "Равный основной долг",
    "monthly_payment": "Ежемесячный платёж",
    "total_interest": "Общие проценты",
    "total_payment": "Общая сумма выплат",
    "schedule": "График платежей",
    "month": "Месяц",
    "payment": "Платёж",
    "principal_part": "Основной долг",
    "interest_part": "Проценты",
    "remaining": "Остаток"
  },
  "bmi": {
    "height": "Рост",
    "weight": "Вес",
    "underweight": "Недостаточный вес",
    "normal": "Норма",
    "overweight": "Избыточный вес",
    "obese": "Ожирение",
    "range_chart": "Таблица диапазонов ИМТ"
  },
  "work_hours": {
    "summary_title": "Сводка часов",
    "auto_calculate": "Пересчитывается автоматически при изменении любой смены",
    "shifts_unit": "смен",
    "total_work": "Всего работы",
    "regular_hours": "Обычные часы",
    "overtime": "Сверхурочные",
    "estimated_pay": "Ориентировочная оплата",
    "enter_hourly_rate": "Введите часовую ставку для расчёта",
    "total_span": "Время на месте",
    "total_break": "Всего перерывов",
    "rules_title": "Правила расчёта и оплаты",
    "rules_hint": "Сверхурочные рассчитываются за каждую смену сверх дневной нормы. Суммы оплаты — только оценки.",
    "standard_hours_day": "Норма часов / день",
    "rounding": "Округление времени",
    "no_rounding": "Без округления (точные минуты)",
    "nearest_minutes": "До ближайших {minutes} минут",
    "hourly_rate": "Часовая ставка",
    "overtime_multiplier": "Коэффициент сверхурочных",
    "currency": "Валюта",
    "timesheet_title": "Детали смен",
    "overnight_hint": "Время окончания раньше начала считается ночной сменой.",
    "fill_week": "Заполнить эту рабочую неделю",
    "add_shift": "Добавить смену",
    "quick_shift": "Быстрое добавление",
    "shift": "Смена",
    "date": "Дата",
    "start_time": "Время начала",
    "end_time": "Время окончания",
    "break_minutes": "Перерыв (минуты)",
    "note": "Примечание",
    "note_placeholder": "Проект, место и т.д. (необязательно)",
    "duplicate": "Дублировать",
    "remove": "Удалять",
    "overnight": "Ночная",
    "break_too_long": "Перерыв длиннее продолжительности смены. Рабочее время для этой смены считается нулевым.",
    "work_time": "Рабочее время",
    "break_short": "Перерыв",
    "hour_short": "ч",
    "minute_short": "м",
    "work_minutes": "Рабочие минуты",
    "regular_minutes": "Обычные минуты",
    "overtime_minutes": "Сверхурочные минуты",
    "total_pay": "Итого оплата",
    "report_title": "Отчёт по табелю",
    "report_hint": "Скопируйте читаемый отчёт или экспортируйте CSV для дальнейшего редактирования.",
    "copy_report": "Копировать отчёт",
    "export_csv": "Экспорт CSV",
    "reset": "Сбросить смены",
    "copied": "Отчёт по табелю скопирован.",
    "exported": "CSV экспортирован.",
    "week_filled": "Смены с понедельника по пятницу на эту неделю добавлены."
  },
  "template_filler": {
    "template_label": "Текст шаблона",
    "template_placeholder": "Введите шаблон, например: Привет, '{' '{' 'имя' '}' '}'!",
    "variables": "Переменные",
    "fill_data": "Заполнить данные",
    "add_row": "Добавить строку",
    "row": "Строка",
    "remove_row": "Удалять",
    "result": "Результат",
    "copy": "Скопировать",
    "copied": "Скопировано"
  },
  "url_defang": {
    "defang": "Defang​",
    "refang": "Refang​",
    "input_label": "Входной URL",
    "output": "Вывод",
    "copy": "Скопировать",
    "copied": "Скопировано",
    "rules": "Правила",
    "rule1": ":// → [://]​",
    "rule2": ". → [.]​",
    "rule3": "Refang — обратная операция"
  },
  "protobuf_decode": {
    "decode": "Декодирование",
    "invalid_hex": "Недопустимый шестнадцатеричный ввод",
    "result": "Результат",
    "field": "Поле",
    "wire_type": "Тип провода",
    "value": "Значение",
    "unknown_wire": "Неизвестный тип провода"
  },
  "pdf_signature": {
    "upload": "Загрузить PDF",
    "checking": "Проверка…",
    "signed": "Подписан",
    "not_signed": "Не подписан",
    "file": "Файл",
    "pages": "Страницы",
    "parse_error": "Ошибка разбора PDF"
  },
  "dev_string_obfuscator": {
    "input_label": "Входной код",
    "input_placeholder": "Вставьте JavaScript-код со строковыми литералами…",
    "method_label": "Метод обфускации",
    "method_base64": "Base64​",
    "method_hex": "Шестигранник",
    "method_unicode": "Unicode​",
    "method_charcode": "CharCode​",
    "method_reverse": "Реверс",
    "obfuscate": "Обфусцировать",
    "output": "Результат обфускации",
    "copy": "Скопировать",
    "copied": "Скопировано"
  },
  "dev_git_cheatsheet": {
    "category_basic": "Основные операции",
    "category_branch": "Управление ветками",
    "category_remote": "Удалённый репозиторий",
    "category_undo": "Отмена и откат",
    "category_stash": "Stash​",
    "category_log": "Лог и история",
    "copy": "Скопировать",
    "copied": "Скопировано",
    "click_copy": "Нажмите, чтобы скопировать"
  },
  "html_wysiwyg": {
    "bold": "Жирный",
    "italic": "Курсив",
    "underline": "Подчёркнутый",
    "strikethrough": "Зачёркнутый",
    "ordered_list": "Нумерованный список",
    "unordered_list": "Маркированный список",
    "mode_edit": "Визуальный",
    "source_view": "Исходный код",
    "preview": "Предварительный просмотр",
    "copy_html": "Копировать HTML",
    "copied": "Скопировано",
    "prompt_url": "URL ссылки",
    "prompt_img_url": "URL изображения"
  },
  "dev_css_unit_converter": {
    "context_title": "Справочник px",
    "input_title": "Вход",
    "value_label": "Значение",
    "from_unit": "Исходная единица",
    "results_title": "Преобразования",
    "col_unit": "Единица",
    "col_value": "Значение",
    "base_size_label": "Базовый размер шрифта (px)",
    "viewport_width": "Ширина области просмотра (px)",
    "viewport_height": "Высота области просмотра (px)",
    "result": "Результат преобразования",
    "copy": "Скопировать",
    "copied": "Скопировано"
  },
  "web_meta_tag_generator": {
    "general": "Основные мета",
    "title_label": "Заголовок",
    "description_label": "Описание",
    "viewport_label": "Viewport​",
    "charset_label": "Кодировка",
    "author_label": "Автор",
    "keywords_label": "Ключевые слова",
    "robots_label": "Robots​",
    "og_title": "OG Заголовок",
    "og_description": "OG Описание",
    "og_image": "OG URL изображения",
    "og_url": "OG URL​",
    "twitter_card": "Тип Twitter Card",
    "generate": "Создать",
    "output": "Код мета-тегов",
    "preview": "Предварительный просмотр",
    "copy": "Скопировать",
    "copied": "Скопировано"
  },
  "encode_unicode": {
    "input_label": "Входной текст",
    "output_label": "Вывод",
    "encode": "Кодировать",
    "decode": "Декодирование",
    "format_label": "Формат",
    "format_backslash_u": "\\uXXXX​",
    "format_html_entity": "&#xXXXX;​",
    "copy": "Скопировать",
    "copied": "Скопировано",
    "decode_failed": "Декодирование не удалось"
  },
  "encode_quoted_printable": {
    "input_label": "Вход",
    "output_label": "Вывод",
    "line_len": "Макс. длина строки",
    "encode": "Кодировать",
    "decode": "Декодирование",
    "copy": "Скопировать",
    "copied": "Скопировано",
    "encode_failed": "Ошибка кодирования",
    "decode_failed": "Декодирование не удалось",
    "err_decode": "Ошибка декодирования Quoted-Printable"
  },
  "encode_uuencode": {
    "input_label": "Вход",
    "output_label": "Вывод",
    "encode": "UUEncode​",
    "decode": "UUDecode​",
    "filename_label": "Имя файла",
    "mode": "Файловый режим (например, 644)",
    "copy": "Скопировать",
    "copied": "Скопировано",
    "encode_failed": "Ошибка кодирования",
    "decode_failed": "Декодирование не удалось",
    "err_decode": "Ошибка UUDecode"
  },
  "encode_base85": {
    "input_label": "Вход",
    "input_mode": "Режим ввода",
    "mode_text": "Текст (UTF-8)",
    "mode_hex": "Hex-байты",
    "delimiters": "обернуть в <~ ~>",
    "output_label": "Вывод",
    "encode": "Кодировать",
    "decode": "Декодирование",
    "copy": "Скопировать",
    "copied": "Скопировано",
    "invalid_hex": "Недопустимый шестнадцатеричный ввод",
    "encode_failed": "Ошибка кодирования",
    "decode_failed": "Декодирование не удалось",
    "err_decode": "Ошибка декодирования Base85"
  },
  "camera_recorder": {
    "select_device": "Устройство камеры",
    "default": "По умолчанию",
    "start_camera": "Включить камеру",
    "stop_camera": "Выключить камеру",
    "take_photo": "Сделать фото",
    "start_record": "Начать запись",
    "stop_record": "Остановить запись",
    "pause": "Пауза",
    "resume": "Продолжить",
    "recording": "Запись…",
    "paused": "На паузе",
    "photo_result": "Фото",
    "video_result": "Видео",
    "export_photo": "Экспорт PNG",
    "export_video": "Экспорт WebM",
    "no_camera": "Не удалось получить доступ к камере"
  },
  "text_regex_memo": {
    "category_chars": "Классы символов",
    "category_quantifiers": "Квантификаторы",
    "category_anchors": "Якоря",
    "category_groups": "Группы и ссылки",
    "category_lookaround": "Опережающие/ретроспективные проверки",
    "category_flags": "Флаги",
    "copy": "Скопировать",
    "click_copy": "Нажмите, чтобы скопировать",
    "copied": "Скопировано"
  },
  "dev_git_diff_viewer": {
    "input_label": "Вставьте вывод Diff",
    "input_placeholder": "Вставьте текст вывода git diff…",
    "parse": "Разобрать",
    "files_changed": "Изменённые файлы",
    "additions": "Добавления",
    "deletions": "Удаления",
    "changes": "Изменения",
    "err_parse": "Не удалось разобрать вывод diff"
  },
  "web_url_query_editor": {
    "url_label": "Входной URL",
    "url_placeholder": "https://example.com?key=value&foo=bar​",
    "parse": "Разобрать",
    "url_encode": "URL-кодирование при сборке",
    "params": "Параметры запроса",
    "result": "Собранный URL",
    "key": "Ключ",
    "value": "Значение",
    "add_param": "Добавить параметр",
    "remove_param": "Удалять",
    "preview": "Предпросмотр URL",
    "copy": "Скопировать",
    "copied": "Скопировано",
    "err_invalid_url": "Неверный URL-адрес"
  },
  "tax_calc": {
    "income_label": "Месячная зарплата (CNY)",
    "social_label": "Социальное страхование (в месяц, CNY)",
    "special_label": "Специальные вычеты (в месяц, CNY)",
    "calc": "Вычислить",
    "taxable": "Месячный налогооблагаемый доход: ",
    "annual_taxable": "Годовой налогооблагаемый доход: ",
    "rate": "Ставка налога: ",
    "monthly_tax": "Месячный налог: ",
    "annual_tax": "Годовой налог: ",
    "after_tax": "Доход после налога",
    "assumption": "Оценка кумулятивного удержания для резидентов материкового Китая при условии одинакового ежемесячного дохода и вычетов в течение года.",
    "schedule": "Ежемесячное кумулятивное удержание",
    "month": "Месяц",
    "monthly_taxable": "Месячный налогооблагаемый",
    "cumulative_taxable": "Кумулятивный налогооблагаемый",
    "cumulative_tax": "Кумулятивный налог",
    "disclaimer": "Только оценка; не учитывает особые случаи, такие как годовые бонусы, доход от услуг и разницу в предыдущих удержаниях."
  },
  "coord_convert": {
    "lng_label": "Долгота (lng)",
    "lat_label": "Широта (lat)",
    "from_label": "Из",
    "to_label": "В",
    "convert": "Преобразовать",
    "result_label": "Результат",
    "copy": "Скопировать"
  },
  "sensitive_words": {
    "placeholder": "Вставьте официальные документы, пресс-релизы, уведомления и т.д.",
    "check": "Строгая проверка",
    "found_prefix": "Найдены чувствительные термины ({count} типов): ",
    "col_word": "Термин",
    "col_count": "Количество",
    "no_found": "Совпадений в словаре не найдено, но перед публикацией всё равно необходима ручная проверка.",
    "bank_count": "Строгий правительственный словарь: {count} терминов",
    "mode_hint": "Обнаружение обхода включено: пробелы и символы нулевой ширины удалены; полноширинные нормализованы.",
    "disclaimer": "Этот инструмент не заменяет конфиденциальную проверку или окончательное человеческое утверждение. Отсутствие совпадений не означает, что можно публиковать.",
    "custom_dict_title": "Пользовательский список слов",
    "custom_dict_hint": "Текст UTF-8, один термин на строку; строки, начинающиеся с #, — комментарии. Хранится локально в вашем браузере.",
    "upload_dict": "Загрузить словарь (.txt)",
    "upload_txt": "Загрузить текст для проверки (.txt)",
    "clear_custom": "Очистить пользовательский список",
    "custom_bank_count": "Пользовательских {count}",
    "active_bank_count": "Активных {count}",
    "source_file": "Исходный файл",
    "highlight_title": "Подсвеченный предпросмотр",
    "col_position": "Позиции",
    "dict_imported": "Импортировано {count} пользовательских терминов",
    "dict_cleared": "Пользовательский список очищен",
    "err_dict_empty": "Файл словаря пуст или недопустим",
    "err_dict_parse": "Не удалось прочитать файл словаря",
    "err_txt_read": "Не удалось прочитать текстовый файл"
  },
  "signature": {
    "color_label": "Цвет росчерка",
    "width_label": "Толщина росчерка",
    "export": "Экспорт PNG",
    "clear": "Очистить"
  },
  "subtitle_convert": {
    "from_fmt": "Из формата",
    "to_fmt": "В формат",
    "input_placeholder": "Вставьте содержимое субтитров…",
    "convert": "Преобразовать",
    "output": "Вывод",
    "copy": "Скопировать"
  },
  "htpasswd": {
    "username_label": "Имя пользователя",
    "password_label": "Пароль",
    "algorithm_label": "Алгоритм",
    "add": "Добавить",
    "copy": "Копировать все"
  },
  "gcd_lcm": {
    "input_label": "Числа (через запятую)",
    "input_placeholder": "например 12, 18, 24",
    "calc": "Вычислить"
  },
  "periodic_table": {
    "atomic_number": "Атомный номер: ",
    "atomic_mass": "Атомная масса: ",
    "category": "Категория: "
  },
  "danmaku": {
    "text_label": "Текст данмаку",
    "color_label": "Цвет",
    "speed_label": "Скорость",
    "send": "Отправить"
  },
  "teleprompter": {
    "placeholder": "Введите текст сценария…",
    "speed_label": "Скорость",
    "font_size_label": "Размер шрифта",
    "mirror_label": "Зеркало",
    "play": "Воспроизвести",
    "stop": "Остановить",
    "pause": "Пауза"
  },
  "batch_rename": {
    "add_files": "Добавить файлы",
    "prefix_label": "Префикс",
    "start_num_label": "Начальный номер",
    "pad_len_label": "Дополнение нулями",
    "ext_label": "Расширение",
    "col_original": "Оригинал",
    "col_renamed": "Переименованный",
    "copy": "Копировать список"
  },
  "bankcard_bin": {
    "lookup_title": "Анализ BIN / IIN карты",
    "lookup_hint": "Определяет платежную сеть, сначала использует локальную базу с {count} крупными китайскими эмитентами и проверяет полный номер карты.",
    "mode_single": "Одиночный запрос",
    "mode_batch": "Пакетный запрос",
    "card_label": "BIN, IIN или полный номер карты",
    "placeholder": "Введите 6–19 цифр; пробелы допустимы",
    "clear": "Очистить",
    "examples": "Примеры",
    "privacy_note": "Вся проверка и валидация выполняется в этом браузере. Номера карт не загружаются, а результаты показывают только маскированные номера.",
    "empty_title": "Введите первые 6 цифр для начала",
    "empty_hint": "Введите полный номер карты, чтобы также выполнить проверку Luhn.",
    "masked_number": "Маскированный номер",
    "bank": "Эмитент",
    "network": "Платёжная сеть",
    "card_type": "Тип карты",
    "bin6": "6-значный BIN",
    "iin8": "8-значный IIN",
    "checksum": "Проверка Luhn",
    "need_8_digits": "Отображается после 8 цифр",
    "issuer_matched": "Эмитент найден",
    "issuer_not_matched": "Эмитент не найден",
    "issuer_unknown": "Эмитент не найден",
    "digit_unit": "цифр",
    "digits": "Длина",
    "copy_result": "Копировать результат",
    "copied": "Результаты скопированы.",
    "exported": "CSV экспортирован.",
    "checksum_not_run": "Введите минимум 13 цифр для проверки полного номера",
    "checksum_valid": "Пройдена",
    "checksum_invalid": "Не пройдена",
    "checksum_warning": "Этот номер не прошёл проверку Luhn и может содержать опечатку. Алгоритм Luhn проверяет только структуру номера; это не доказывает, что карта существует или активна.",
    "data_disclaimer": "Эмитент, страна и тип карты определяются по офлайн-данным BIN и локальным правилам. Данные могут меняться из-за новых диапазонов или изменений продуктов. Для платежей, риск-решений и других критичных задач проверяйте актуальные данные эмитента или платежной сети. Глобальная база основана на iannuttall/binlist-data (CC BY 4.0), архивном наборе данных, который не является официальным реестром IIN.",
    "type_credit": "Кредитная",
    "type_debit": "Дебетовая",
    "type_prepaid": "Предоплаченная",
    "type_unknown": "Неизвестно",
    "network_unionpay": "UnionPay​",
    "network_visa": "Visa​",
    "network_mastercard": "Mastercard​",
    "network_amex": "American Express​",
    "network_jcb": "JCB​",
    "network_discover": "Discover​",
    "network_diners": "Diners Club​",
    "network_maestro": "Maestro​",
    "network_unknown": "Неизвестно / другое",
    "batch_label": "Номера карт или BIN",
    "batch_placeholder": "По одному на строку или через запятую / точку с запятой\n622202\n621700\n4111 1111 1111 1111",
    "batch_hint": "До 100 записей за раз. Дубликаты удаляются, экспорт никогда не содержит немаскированных полных номеров карт.",
    "run_batch": "Выполнить пакетный запрос",
    "batch_empty": "Введите хотя бы одно значение.",
    "batch_complete": "Обработано {count} записей.",
    "batch_results": "Пакетные результаты",
    "batch_summary": "{total} всего · {matched} эмитентов найдено · {valid} прошли проверку Luhn",
    "copy_table": "Копировать таблицу",
    "export_csv": "Экспорт CSV",
    "feature_local": "Локальная обработка в браузере",
    "feature_local_desc": "Загружает только нужный фрагмент BIN на 6 / 8 цифр и не вызывает внешние Live BIN API.",
    "feature_validation": "Обнаружение и валидация",
    "feature_validation_desc": "Платёжная сеть определяется по диапазонам номеров; полные номера отдельно проверяются по алгоритму Luhn.",
    "feature_iin": "Поддержка 6- и 8-значных",
    "feature_iin_desc": "Показывает как традиционный 6-значный BIN, так и современный 8-значный IIN для сравнения.",
    "global_hint": "Глобальная дополнительная база покрывает текущие языковые регионы, Латинскую Америку, Бразилию, Германию, Россию и Францию. Используются только первые 6 / 8 цифр BIN.",
    "global_loading": "Загрузка глобальной дополнительной базы BIN…",
    "country": "Страна / регион",
    "country_unknown": "Нет данных",
    "card_category": "Уровень / продукт карты",
    "category_unknown": "Нет данных",
    "data_source": "Источник данных",
    "source_china_local": "Локальная база Китая",
    "source_binlist_data": "Публичный набор binlist-data",
    "source_rules": "Правила диапазонов",
    "source_unknown": "Нет совпадения",
    "batch_loading": "Загрузка BIN-данных и обработка {count} записей…",
    "type_charge": "Платёжная карта",
    "network_elo": "Elo​",
    "network_laser": "Laser​",
    "network_solo": "Solo​",
    "network_atm": "ATM​",
    "network_other": "Другое",
    "input_kind": "Тип ввода",
    "input_kind_bin6": "6-значный BIN",
    "input_kind_iin8": "8-значный IIN / префикс",
    "input_kind_card": "Полный номер карты",
    "input_kind_partial": "Менее 6 цифр",
    "confidence": "Достоверность",
    "confidence_high": "Высокая: совпадение по префиксу 8+ цифр",
    "confidence_medium": "Средняя: совпадение по 6-значному BIN",
    "confidence_low": "Низкая: только по правилам или не найдено",
    "result_note": "Примечание",
    "note_exact_or_iin": "Совпадение по префиксу 8+ цифр для более точной идентификации.",
    "note_bin6_match": "Совпадение по 6-значному BIN; более новый 8-значный IIN может быть более точным.",
    "note_network_only": "Обнаружена только платёжная сеть; эмитент не найден.",
    "note_not_found": "Эмитент и сеть не найдены. Проверьте ввод или используйте официальные данные.",
    "filter_all": "Все",
    "filter_matched": "Эмитент найден",
    "filter_unmatched": "Не найдено",
    "filter_luhn_failed": "Luhn не пройден"
  },
  "gif_frames": {
    "hint": "Загрузите GIF-файл для извлечения кадров",
    "frame_count": "Кадры: "
  },
  "code_screenshot": {
    "lang_label": "Язык",
    "bg_label": "Фон",
    "export": "Экспорт PNG"
  },
  "grid_paper": {
    "type_label": "Тип сетки",
    "type_tian": "Тянь",
    "type_mi": "Ми",
    "type_fang": "Квадрат",
    "type_dot": "Точки",
    "cell_size_label": "Размер ячейки (px)",
    "rows_label": "Строки",
    "cols_label": "Столбцы",
    "generate": "Создать",
    "export": "Экспорт PNG"
  },
  "exchange_rate": {
    "amount_label": "Сумма",
    "from_label": "Из",
    "to_label": "В",
    "convert": "Преобразовать",
    "disclaimer": "Курсы обмена колеблются и приведены только для справки. Используйте котировку вашего банка или платёжного провайдера для расчётов.",
    "swap": "Поменять валюты",
    "refresh": "Обновить курсы",
    "refreshing": "Обновление…",
    "live_source": "Справочные курсы ExchangeRate-API",
    "offline_source": "Оффлайн резервные курсы",
    "live_failed": "Не удалось загрузить актуальные курсы. Используются устаревшие оффлайн курсы."
  },
  "hanzi_decompose": {
    "placeholder": "Введите китайские иероглифы…",
    "decompose": "Разобрать",
    "unknown": "Н/Д",
    "done": "Разобрано {count} иероглифов.",
    "no_hanzi": "Китайские иероглифы не найдены.",
    "copied": "Результаты скопированы.",
    "exported": "CSV экспортирован.",
    "example": "Пример использования",
    "results_title": "Результаты разложения",
    "copy": "Копировать результаты",
    "export_csv": "Экспорт CSV",
    "col_char": "Иероглиф",
    "col_parts": "Составные части",
    "col_structure": "Структура",
    "structure_unknown": "Неизвестно",
    "structure_single": "Одиночный компонент",
    "structure_pair": "Двухчастная структура",
    "structure_multi": "Многочастная структура"
  },
  "audio_editor": {
    "start_label": "Начало (сек)",
    "end_label": "Конец (сек)",
    "duration": "Длительность: ",
    "clip": "Обрезать и экспортировать WAV"
  },
  "csr_generate": {
    "key_size": "Размер ключа",
    "generate": "Создать",
    "private_key": "Закрытый ключ"
  },
  "torrent_analyze": {
    "parse_error": "Ошибка разбора. Убедитесь, что это допустимый .torrent файл.",
    "name_label": "Имя: ",
    "total_size": "Общий размер: ",
    "piece_length": "Длина части: ",
    "info_hash": "Info Hash: ​",
    "files_label": "Файлы: ",
    "trackers": "Трекеры: ",
    "magnet_link": "Magnet-ссылка: ",
    "copy": "Скопировать"
  },
  "pdf_encrypt": {
    "drop_label": "Выберите PDF",
    "drop_desc": "Добавить пароль открытия к незашифрованному PDF",
    "empty_pdf": "PDF не выбран",
    "password_label": "Открыть пароль",
    "confirm_label": "Подтвердите пароль",
    "btn_encrypt": "Зашифровать и скачать",
    "msg_select_first": "Пожалуйста, сначала выберите PDF-файл.",
    "msg_password_required": "Пожалуйста, введите пароль.",
    "msg_password_mismatch": "Пароли не совпадают.",
    "msg_done": "Зашифрованный PDF создан; загрузка началась.",
    "err_encrypted_or_invalid": "Не удалось прочитать PDF (зашифрован, повреждён или не поддерживается). Если у него есть пароль, сначала используйте расшифровку PDF.",
    "err_failed": "Ошибка шифрования. Попробуйте Chrome или Edge."
  },
  "heic_to_jpg": {
    "hint": "HEIC/HEIF декодируется в JPG в вашем браузере; файлы не загружаются.",
    "drop_label": "Изображения HEIC / HEIF",
    "drop_desc": ".heic, .heif — несколько файлов допустимо",
    "empty": "HEIC-файлы не выбраны",
    "quality_label": "Качество JPG (0,5–1)",
    "btn_convert": "Конвертировать в JPG",
    "msg_select": "Пожалуйста, сначала выберите изображения HEIC/HEIF.",
    "msg_done": "Готово. Загрузка началась.",
    "err_convert": "Не удалось декодировать этот HEIC-файл.",
    "err_failed": "Ошибка конвертации. Попробуйте Chrome или Edge."
  },
  "word_count": {
    "hint": "Введите или вставьте текст для локального подсчёта — ничего не отправляется на сервер."
  },
  "age_calc": {
    "birth_label": "Дата рождения",
    "ref_label": "На дату (необязательно)",
    "ref_hint": "Оставьте пустым для использования сегодняшней даты",
    "years": "Лет",
    "months": "Месяцев",
    "days": "Дней",
    "total_days": "Всего дней",
    "err_invalid_birth": "Недопустимая дата рождения",
    "err_ref_before_birth": "Дата отсчёта не может быть раньше даты рождения"
  },
  "random_number": {
    "min": "Минимум",
    "max": "Максимум",
    "count": "Количество (1–500)",
    "integer": "Только целые",
    "generate": "Создать",
    "copy": "Скопируйте все",
    "output": "Результаты",
    "err_range": "Для целых чисел минимум не может быть больше максимума",
    "copied": "Скопировано в буфер обмена."
  },
  "caesar": {
    "input_text": "Входной текст",
    "shift": "Сдвиг (1-25)",
    "mode": "Режим",
    "encrypt": "Шифрование",
    "decrypt": "Расшифруйте",
    "run": "Выполнить",
    "result": "Результат"
  },
  "des": {
    "input_text": "Входной текст / hex",
    "key": "Ключ (≥8 байт)",
    "mode": "Режим",
    "action": "Действие",
    "encrypt": "Шифрование",
    "decrypt": "Расшифруйте",
    "run": "Выполнить",
    "result": "Результат",
    "key_too_short": "Ключ должен быть не менее 8 байт",
    "invalid_hex": "Длина hex не кратна 16"
  },
  "ripemd": {
    "input_text": "Входной текст",
    "compute": "Вычислить",
    "result": "Хеш RIPEMD-160"
  },
  "bcc_lrc": {
    "input_hex": "Hex-данные (через пробел)",
    "mode": "Режим проверки",
    "compute": "Вычислить",
    "result": "Результат",
    "invalid_hex": "Недопустимый hex-байт",
    "no_data": "Пожалуйста, введите данные"
  },
  "iso_garble": {
    "input": "Искажённый текст",
    "fix": "Исправить",
    "result": "Исправленный текст",
    "not_iso": "Содержит символы, отличные от ISO-8859-1",
    "decode_failed": "Ошибка декодирования UTF-8"
  },
  "emoji_encode": {
    "input": "Входной текст",
    "mode": "Режим кодирования",
    "core_values": "Основные ценности",
    "action": "Действие",
    "encode": "Кодировать",
    "decode": "Декодирование",
    "run": "Выполнить",
    "result": "Результат",
    "decode_failed": "Декодирование не удалось"
  },
  "code_playground": {
    "preview": "Предварительный просмотр"
  },
  "dir_tree": {
    "input": "Пути каталогов (по одному на строку)",
    "generate": "Создать",
    "result": "Дерево каталогов"
  },
  "kv_to_code": {
    "input": "Пары ключ-значение (ключ=значение, по одному на строку)",
    "language": "Целевой язык",
    "convert": "Преобразовать",
    "result": "Код"
  },
  "file_hash": {
    "algorithm": "Алгоритм хэширования",
    "drop_here": "Перетащите файл сюда",
    "browse": "Выбрать файл"
  },
  "endianness": {
    "input_hex": "Входные hex-байты",
    "from": "Из порядка байтов",
    "to": "В порядок байтов",
    "convert": "Преобразовать",
    "result": "Результат"
  },
  "ones_complement": {
    "decimal": "Десятичное целое",
    "bits": "Разрядность",
    "compute": "Вычислить",
    "original": "Исходное",
    "ones": "Обратный код",
    "twos": "Дополнительный код"
  },
  "ssl_generate": {
    "key_type": "Тип ключа",
    "generate": "Создать",
    "public_key": "Открытый ключ",
    "private_key": "Закрытый ключ",
    "fingerprint": "Отпечаток SHA-256"
  },
  "url_batch": {
    "template": "Шаблон URL (заполнитель {id} или {param})",
    "params": "Параметры (по одному на строку)",
    "generate": "Создать",
    "result": "Результат"
  },
  "line_filter": {
    "input": "Входной текст",
    "min_len": "Мин. длина",
    "max_len": "Макс. длина",
    "action": "Действие",
    "filter": "Фильтр",
    "truncate": "Обрезать",
    "pad": "Дополнить",
    "run": "Выполнить",
    "result": "Результат"
  },
  "tts": {
    "input": "Входной текст",
    "voice": "Голос",
    "rate": "Скорость",
    "volume": "Громкость",
    "play": "Воспроизвести",
    "pause": "Пауза",
    "stop": "Остановить",
    "speaking": "Воспроизведение..."
  },
  "whois": {
    "domain": "Домен",
    "query": "Запрос",
    "querying": "Запрос...",
    "result": "Результат"
  },
  "dns_query": {
    "domain": "Домен",
    "record_type": "Тип записи",
    "query": "Запрос",
    "querying": "Запрос...",
    "result": "Результат"
  },
  "icp_query": {
    "domain": "Домен",
    "query": "Запрос",
    "querying": "Запрос...",
    "result": "Результат",
    "api_error": "Ошибка API-запроса"
  },
  "my_ip": {
    "query": "Узнать мой IP",
    "querying": "Запрос..."
  },
  "browser_fingerprint": {
    "ua": "User-Agent​",
    "language": "Язык",
    "languages": "Языки",
    "platform": "Платформа",
    "cookies": "Куки",
    "do_not_track": "Do Not Track​",
    "screen_res": "Разрешение экрана",
    "avail_res": "Доступное разрешение",
    "color_depth": "Глубина цвета",
    "pixel_depth": "Глубина пикселя",
    "device_pixel_ratio": "Соотношение пикселей устройства",
    "timezone": "Часовой пояс",
    "timezone_offset": "Смещение часового пояса",
    "max_touch": "Макс. точек касания",
    "hardware_concurrency": "Ядра CPU",
    "memory": "Память",
    "canvas": "Отпечаток Canvas"
  },
  "doh": {
    "domain": "Домен",
    "server": "DoH-сервер",
    "query": "Запрос",
    "querying": "Запрос...",
    "result": "Результат"
  },
  "placeholder_img": {
    "width": "Ширина",
    "height": "Высота",
    "bg": "Фон",
    "fg": "Передний план",
    "text": "Текст",
    "generate": "Создать",
    "download": "Скачать"
  },
  "privacy_policy": {
    "app_name": "Название приложения",
    "developer": "Разработчик",
    "collect_types": "Типы собираемых данных",
    "generate": "Создать",
    "result": "Политика конфиденциальности",
    "title": "Политика конфиденциальности",
    "default_types": "Информация об устройстве, местоположение, журналы использования",
    "section1_title": "1. Сбор информации",
    "section1_body": "{appName} разработано {developer}. Мы собираем следующую информацию для предоставления и улучшения услуг.",
    "section2_title": "2. Использование информации",
    "section2_body": "{appName} собирает {types} исключительно для работы приложения и улучшения опыта и не будет продавать третьим лицам.",
    "section3_title": "3. Безопасность информации",
    "section3_body": "Мы принимаем разумные меры для защиты вашей личной информации.",
    "section4_title": "4. Ваши права",
    "section4_body": "Вы имеете право на доступ, исправление и удаление вашей личной информации.",
    "section5_title": "5. Контакты",
    "section5_body": "По вопросам обращайтесь к {developer}."
  },
  "pomodoro": {
    "work": "Работа",
    "break": "Перерыв",
    "start": "Начало",
    "pause": "Пауза",
    "reset": "Сброс",
    "work_min": "Работа(мин)",
    "break_min": "Перерыв(мин)",
    "completed": "Завершено"
  },
  "art_qr": {
    "text": "Текст/URL",
    "fg": "Передний план",
    "bg": "Фон",
    "style": "Стиль точек",
    "square": "Квадрат",
    "circle": "Круг",
    "generate": "Создать",
    "download": "Скачать"
  },
  "ppi_calc": {
    "diagonal": "Диагональ(дюймы)",
    "horizontal": "Горизонтально px",
    "vertical": "Вертикально px",
    "compute": "Вычислить",
    "result": "PPI​"
  },
  "mortgage_calc": {
    "principal": "Основной долг",
    "rate": "Годовая ставка(%)",
    "years": "Лет",
    "method": "Метод",
    "equal_payment": "Равными платежами",
    "equal_principal": "Равный основной долг",
    "compute": "Вычислить",
    "monthly": "Ежемесячно",
    "total": "Итого",
    "interest": "Общие проценты",
    "first_month": "Первый месяц",
    "schedule": "Полный график платежей",
    "period": "Период",
    "payment": "Платёж",
    "principal_part": "Основной долг",
    "interest_part": "Проценты",
    "remaining": "Остаток",
    "export_csv": "Экспорт CSV",
    "invalid": "Введите допустимый основной долг, ставку и срок.",
    "disclaimer": "Рассчитано по фиксированной годовой ставке только для планирования. Ваш договор и выписка от кредитора имеют приоритет."
  },
  "gb_code": {
    "search": "Поиск иероглифа или кода"
  },
  "solar_lunar": {
    "year": "Год",
    "month": "Месяц",
    "day": "День",
    "convert": "Преобразовать"
  },
  "world_clock": {},
  "chem_balance": {
    "input": "Химическое уравнение (например, H2+O2=H2O)",
    "balance": "Уравнять"
  },
  "mic_test": {
    "enumerate": "Перечислить устройства",
    "default": "Устройство по умолчанию",
    "device": "Устройство",
    "status_label": "Статус",
    "status_idle": "Ожидание",
    "status_granted": "Разрешено",
    "status_denied": "Запрещено",
    "status_recording": "Запись",
    "status_playing": "Воспроизведение",
    "record": "Начать запись",
    "stop": "Остановить запись",
    "play": "Воспроизвести запись",
    "download": "Скачать запись",
    "duration": "Длительность",
    "volume": "Громкость"
  },
  "keyboard_test": {
    "hint": "Нажмите любую клавишу на клавиатуре для проверки",
    "current": "Текущая клавиша",
    "history": "История клавиш"
  },
  "screen_test": {
    "color_red": "Красный",
    "color_green": "Зелёный",
    "color_blue": "Синий",
    "color_white": "Белый",
    "color_black": "Чёрный",
    "click_exit": "Нажмите или ESC для выхода из полноэкранного режима",
    "screen_info": "Информация об экране",
    "resolution": "Разрешение",
    "available": "Доступное",
    "pixel_ratio": "Соотношение пикселей",
    "esc_hint": "Нажмите ESC для выхода из полноэкранного режима"
  },
  "pfx_to_pem": {
    "select_file": "Выбрать PFX/P12 файл",
    "password": "Пароль",
    "parse": "Разобрать",
    "parsing": "Разбор...",
    "cert_pem": "PEM сертификата",
    "key_pem": "PEM закрытого ключа",
    "download": "Скачать",
    "parse_error": "Анализ не выполнен",
    "no_content": "Сертификат или закрытый ключ не найдены",
    "forge_required": "Требуется библиотека node-forge"
  },
  "http_request": {
    "headers": "Заголовки",
    "add_header": "Добавить заголовок",
    "body": "Тело",
    "send": "Отправить",
    "sending": "Отправка...",
    "cors_warning": "Примечание: политика CORS браузера может ограничить некоторые запросы; поддерживаются только конечные точки с включённым CORS",
    "status": "Статус",
    "status_text": "Текст статуса",
    "time": "Время",
    "response_headers": "Заголовки ответа",
    "response_body": "Тело ответа"
  },
  "doodle": {
    "color": "Цвет",
    "size": "Размер кисти",
    "eraser": "Ластик",
    "undo": "Отменить",
    "clear": "Очистить",
    "download": "Скачать PNG",
    "reset": "Очистить холст"
  },
  "modpow": {
    "base": "Основание",
    "exponent": "Показатель",
    "modulus": "Модуль",
    "calc": "Вычислить",
    "result": "Результат:",
    "err_modulus_zero": "Модуль не может быть 0",
    "err_negative_exp": "Показатель не может быть отрицательным",
    "err_invalid": "Недопустимый ввод, введите целые числа",
    "note": "Модульное возведение в степень широко используется в шифровании RSA, обмене ключами Диффи-Хеллмана, криптографии на эллиптических кривых и т.д. Этот инструмент использует BigInt с алгоритмом возведения в степень умножением, поддерживая произвольно большие целые числа."
  },
  "bit_reverse": {
    "input_label": "Введите положительное целое число",
    "width_label": "Разрядность",
    "calc": "Вычислить",
    "step_original": "Исходный двоичный:",
    "step_reversed": "Реверсированный двоичный:",
    "result_dec": "Результат (десятичный):",
    "result_hex": "Результат (hex):",
    "err_negative": "Пожалуйста, введите неотрицательное целое число",
    "err_invalid": "Недопустимый ввод"
  },
  "punctuation": {
    "cn2en": "КН → АН",
    "en2cn": "АН → КН",
    "input_label": "Входной текст",
    "convert": "Преобразовать",
    "output_label": "Вывод",
    "copy": "Скопировать",
    "copied": "Скопировано"
  },
  "leap_year": {
    "mode_single": "Одиночный год",
    "mode_range": "Диапазон",
    "year_label": "Год",
    "start_label": "Начальный год",
    "end_label": "Конечный год",
    "check": "Проверить",
    "is_leap": "Год {year} — високосный",
    "not_leap": "Год {year} — не високосный",
    "range_result": "{count} високосных лет между {start} и {end}:",
    "err_invalid": "Пожалуйста, введите допустимый год",
    "err_range": "Пожалуйста, введите допустимые начальный и конечный годы",
    "rule": "Правило високосного года: год, кратный 4, является високосным, если он не кратен 100, но не кратен 400. Например: 2000 — високосный, 1900 — нет, 2024 — високосный."
  },
  "reverse": {
    "mode_char": "Реверс символов",
    "mode_line": "Реверс строк",
    "input_label": "Входной текст",
    "action": "Реверс",
    "output_label": "Вывод",
    "copy": "Скопировать",
    "copied": "Скопировано"
  },
  "reaction_test": {
    "click_start": "Нажмите, чтобы начать",
    "wait_green": "Ждите зелёный…",
    "click_now": "Нажмите сейчас!",
    "your_time": "Ваше время реакции: {ms} мс",
    "too_early": "Слишком рано! Дождитесь зелёного сигнала.",
    "try_again": "Попробовать снова",
    "stats_title": "Статистика",
    "avg": "Среднее",
    "best": "Лучшее",
    "worst": "Худшее",
    "history_title": "История (последние 10)"
  },
  "ipv4_ipv6": {
    "input_label": "Введите адрес",
    "mode_auto": "Авто",
    "mode_ipv4": "IPv4​",
    "mode_ipv6": "IPv6​",
    "invalid_ipv4": "Недопустимый IPv4-адрес",
    "invalid_ipv6": "Недопустимый IPv6-адрес",
    "invalid_input": "Недопустимый ввод адреса",
    "mapped": "IPv6-отображённый",
    "mapped_hex": "IPv6-отображённый (Hex)",
    "compatible": "IPv4-совместимый",
    "compatible_hex": "IPv4-совместимый (Hex)",
    "six_to_four": "Адрес 6to4",
    "expanded": "Полное раскрытие",
    "compressed": "Сжатый",
    "extracted_ipv4": "Извлечённый IPv4",
    "no_ipv4_mapping": "Этот IPv6-адрес не содержит IPv4-отображения",
    "batch_placeholder": "По одному IPv4 или IPv6 на строку\n192.168.1.1\n::ffff:192.168.1.1\n2002:c0a8:0101::",
    "first_line_hint": "Первая строка показывает подробную конвертацию; несколько строк генерируют пакетную таблицу ниже.",
    "batch_results": "Результаты пакетного разбора",
    "copy_batch": "Копировать пакетные результаты",
    "col_input": "Вход",
    "col_type": "Тип",
    "col_output": "Результат конвертации/извлечения",
    "col_note": "Примечание",
    "invalid": "Недопустимо",
    "batch_note_ipv4": "Сгенерирован IPv4-mapped IPv6 для двухстековых логов и конфигурации.",
    "batch_note_extractable": "Этот IPv6 содержит извлекаемую информацию IPv4.",
    "batch_note_no_mapping": "Обычный IPv6 не содержит IPv4 и не может быть напрямую конвертирован обратно."
  },
  "code_formatter": {
    "language": "Язык",
    "indent_size": "Размер отступа",
    "wrap_length": "Длина переноса",
    "input_label": "Входной код",
    "input_placeholder": "Вставьте код…",
    "format": "Формат",
    "output_label": "Отформатированный вывод",
    "copy": "Скопировать",
    "copied": "Скопировано"
  },
  "port_check": {
    "host_label": "Хост / IP",
    "port_label": "Порт",
    "check": "Проверить",
    "check_common": "Проверить частые порты",
    "th_port": "Порт",
    "th_service": "Сервис",
    "th_status": "Статус",
    "status_checking": "Проверка…",
    "status_open": "Открыт",
    "status_closed": "Закрыт",
    "status_timeout": "Таймаут",
    "status_error": "Ошибка",
    "limitation_note": "Примечание: из-за ограничений безопасности CORS браузера результаты проверки портов приведены только для справки. Используется fetch в режиме no-cors; непрозрачный ответ предполагает, что служба может отвечать, но не может быть подтверждена. Более точное обнаружение требует серверных инструментов."
  },
  "auto_refresh": {
    "url_label": "Целевой URL",
    "interval_label": "Интервал обновления",
    "seconds": "секунд (мин. 5с)",
    "start": "Начало",
    "stop": "Остановить",
    "countdown": "Обратный отсчёт",
    "total_refreshes": "Обновлений",
    "last_refresh": "Последнее обновление",
    "preview": "Предпросмотр страницы",
    "bookmarklet_title": "Букмарклет",
    "bookmarklet_desc": "Перетащите кнопку ниже на панель закладок для использования автообновления на любой странице.",
    "bookmarklet_btn": "Букмарклет автообновления"
  },
  "text_to_html_table": {
    "inputLabel": "Входной текст (CSV/TSV)",
    "placeholder": "Имя,Возраст,Город\nАнна,25,Москва\nИван,30,Санкт-Петербург",
    "delimiter": "Разделитель",
    "hasHeader": "Строка заголовка",
    "border": "Рамка",
    "padding": "Отступ ячеек",
    "className": "Имя CSS-класса",
    "htmlCode": "HTML-код",
    "copy": "Копировать код",
    "copied": "Скопировано",
    "preview": "Предварительный просмотр"
  },
  "font_preview": {
    "textLabel": "Текст предпросмотра",
    "fontSize": "Размер шрифта",
    "customFont": "Пользовательский шрифт"
  },
  "symbols": {
    "search": "Поиск",
    "searchPlaceholder": "Поиск символа или названия…"
  },
  "rc4": {
    "key": "Ключ",
    "mode": "Режим",
    "encrypt": "Шифрование",
    "decrypt": "Расшифруйте",
    "plaintext": "Открытый текст",
    "ciphertext": "Зашифрованный текст",
    "inputEnc": "Кодировка ввода",
    "outputEnc": "Кодировка вывода",
    "result": "Результат",
    "keyRequired": "Ключ обязателен",
    "inputRequired": "Ввод обязателен"
  },
  "clipboard_viewer": {
    "read": "Прочитать буфер обмена",
    "hint": "Требуется разрешение браузера. Если отказано, используйте область вставки ниже.",
    "pasteArea": "Область вставки (Ctrl+V)",
    "pasteItems": "Вставленное содержимое"
  },
  "svg_editor": {
    "tool": "Инструмент",
    "add": "Добавить фигуру",
    "properties": "Свойства",
    "delete": "Удалить выбранное",
    "svgCode": "SVG-код",
    "copy": "Скопировать",
    "copied": "Скопировано"
  }
}
