// Russian translations
window.LANG_RU = {
  // Common
  common: {
    save: "Сохранить",
    cancel: "Отмена",
    confirm: "Подтвердить",
    loading: "Загрузка...",
    success: "Успешно",
    failed: "Ошибка",
    delete: "Удалить",
    edit: "Редактировать",
    add: "Добавить",
    enable: "Включить",
    disable: "Отключить",
    enabled: "Включено",
    disabled: "Отключено",
    yes: "Да",
    no: "Нет",
    on: "Вкл",
    off: "Выкл",
    apply: "Применить",
    reset: "Сбросить",
    refresh: "Обновить",
    close: "Закрыть",
    back: "Назад",
    next: "Далее",
    previous: "Назад",
    submit: "Отправить",
    action: "Действие",
    chinese: "中文",
    traditionalChinese: "繁體中文",
    english: "English",
    spanish: "Español",
    japanese: "日本語",
    korean: "한국어",
    german: "Deutsch",
    french: "Français",
    portuguese: "Português",
    russian: "Русский",
    italian: "Italiano",
    turkish: "Türkçe",
    continue: "Продолжить",
    copy: "Копировать",
    copied: "Скопировано"
  },

  preview: {
    flvRequired: "Включите поток FLV.",
    flvOrHlsRequired: "Включите хотя бы один поток для прямого эфира: FLV или HLS.",
    hlsUnsupportedEnableFlv: "Предпросмотр HLS не поддерживается в этом браузере. Включите FLV."
  },

  play: {
    mainFlvRequired: "Необходимо включить основной FLV-поток",
    browserFlvUnsupported: "Этот браузер не поддерживает воспроизведение FLV. Используйте современный браузер, например Chrome, Edge или Firefox"
  },

  // Page titles
  title: {
    encoder: "Кодировщик H.265/H.264",
    status: "Статус",
    mainStream: "Основной поток",
    subStream1: "Дополнительный поток 1",
    subStream2: "Дополнительный поток 2",
    subStream3: "Дополнительный поток 3",
    videoSettings: "Настройки видео",
    audioSettings: "Настройки аудио",
    advancedSettings: "Расширенные настройки",
    osdMain: "OSD - Основной поток",
    osdSub1: "OSD - Дополнительный поток 1",
    osdSub2: "OSD - Дополнительный поток 2",
    osdSub3: "OSD - Дополнительный поток 3",
    logoUpload: "Загрузка логотипа",
    network: "Сетевые настройки",
    record: "Настройки записи",
    gb28181: "GB28181",
    wifi: "Настройки WiFi",
    password: "Настройки пароля",
    serial: "Последовательная передача",
    update: "Обновление и резервное копирование",
    reboot: "Перезагрузка устройства",
    timedReboot: "Плановая перезагрузка",
    factoryReset: "Сброс до заводских настроек",
    recordFiles: "Файлы записи",
    netTest: "Тест сети",
    recordSet: "Настройки записи",
    alirtcTokenPage: "AliRTC Token"
  },

  // Menu
  menu: {
    status: "Статус",
    encoder: "Кодировщик",
    mainStream: "Основной поток",
    subStream1: "Дополнительный поток 1",
    subStream2: "Дополнительный поток 2",
    subStream3: "Дополнительный поток 3",
    videoSettings: "Настройки видео",
    audioSettings: "Настройки аудио",
    advancedSettings: "Расширенные настройки",
    osd: "OSD",
    logoUpload: "Загрузка логотипа",
    system: "Система",
    scheduleRecord: "Запись по расписанию",
    network: "Сеть",
    record: "Запись",
    gb28181: "GB28181",
    wifi: "WiFi",
    password: "Пароль",
    serial: "Последовательная передача",
    update: "Обновление и резервное копирование",
    reboot: "Перезагрузка",
    timedReboot: "Плановая перезагрузка",
    factoryReset: "Сброс до заводских настроек"
  },

  // Status page
  status: {
    // Device status
    deviceStatus: "Статус устройства",
    runningTime: "Время работы: ",
    runtimeDayWithTime: "{0}д {1}",
    deviceTime: "Время устройства: ",
    syncTime: " (Синхронизировать время с устройством)",
    cpuUsage: "Загрузка ЦП: ",
    cpuTemp: "Температура ЦП: ",
    memoryUsage: "Использование памяти: ",
    encPpsUsage: "Использование ресурсов кодирования: ",
    memoryWarning: " (Если использование памяти слишком высокое после 1 минуты загрузки, отключите некоторые HLS потоки или уменьшите битрейт)",
    cpuWarning: " (Если загрузка ЦП остается выше 85%, отключите некоторые потоки или уменьшите разрешение дополнительных потоков)",
    networkStatus: "Состояние сети: ",
    inputVideo: "Входное видео: ",
    vgaAutoAdjust: " (Автонастройка VGA)",
    capturedFrames: "Захваченные видеокадры: ",
    lostFrames: "Потерянные видеокадры: ",
    audioSampleRate: "Частота дискретизации входного аудио: ",
    capturedAudioFrames: "Захваченные аудиокадры: ",
    packetsSent: "Отправлено пакетов: ",
    netTestLink: " (Тест сети и системный журнал)",
    packetsDropped: "Потеряно пакетов: ",
    canAccessInternet: "Доступ в Интернет",
    canAccessInternetIP: "Доступ к IP в Интернете",
    lanOnly: "Только LAN",
    localNetwork: "Локальная сеть",

    // Recording status
    recordStatus: "Статус записи",
    recordType: "Тип записи: ",
    diskStatus: "Статус диска: ",
    diskNotExist: "Не найден",
    mountStatus: "Статус монтирования: ",
    notMounted: "Не смонтирован",
    mounted: "Смонтирован",
    totalSpace: "Всего места: ",
    freeSpace: "Свободно: ",
    recordingStatus: "Статус записи: ",
    diskFull: "Диск заполнен",
    diskSlow: "Диск слишком медленный",
    recordFileList: "Список файлов записи",
    notRecording: "Не записывается",
    recording: "Запись",
    recordingNoVideo: " (Файлы могут не сохраняться без видеовхода)",
    startRecord: "(Начать запись)",
    stopRecord: "(Остановить запись)",
    usbTfCard: "USB/TF карта",

    // DHCP status
    dhcpStatus: "Статус DHCP",
    ip: "IP: ",
    subnetMask: "Маска подсети: ",
    gateway: "Шлюз: ",

    // WIFI status
    wifiStatus: "Статус WiFi",
    wifiDisabled: "WiFi: Отключен",
    wifiState: "Состояние WiFi: ",
    wifiSSID: "SSID WiFi: ",
    wifiIP: "IP WiFi: ",
    wifiMAC: "MAC WiFi: ",
    wifiRSSI: "Сигнал WiFi (RSSI): ",
    wifiFreq: "Частота WiFi: ",
    wifiConnected: "Подключен",
    wifiDisconnected: "Отключен",
    wifiConnecting: "Подключение (Если подключение занимает слишком много времени, проверьте настройки WiFi)",

    timeHour: "ч",
    timeMinute: "м",
    timeSecond: "с",

    // Streams
    mainStream: "Основной поток",
    subStream1: "Дополнительный поток 1",
    subStream2: "Дополнительный поток 2",
    subStream3: "Дополнительный поток 3",
    streamDisabled: "Отключен (этот дополнительный поток автоматически отключается при нехватке ресурсов кодирования)",
    codecType: "Кодек: ",
    encodeResolution: "Разрешение кодирования: ",
    videoBitrate: "Битрейт видео: ",
    realTimeBitrate: "Битрейт в реальном времени: ",
    realTimeFps: "FPS в реальном времени: ",
    videoEncoded: "Видео закодировано: ",
    reconnect: " (Переподключить)",
	    previewWebRTC: "Предпросмотр видео (WebRTC)",
	    previewHTML5: "Предпросмотр видео (HTML5)",

    // URL related
    disabled: "Отключен",
    connected: "Подключен",
    disconnected: "Отключен",
    bufferPackets: "Пакеты в буфере",
    bufferPacketsLabel: "Пакеты в буфере: ",
    pushSpeed: "Скорость отправки",
    pushSpeedLabel: "Скорость отправки: ",
    pushed: "Отправлено",
    pushedLabel: "Отправлено: ",
    memoryUsed: "Использовано памяти",
    memoryUsedLabel: "Использовано памяти: ",
    cacheFiles: "Кэшированные файлы",
    cacheFilesLabel: "Кэшированные файлы: ",
    multicastUrl: "URL мультикаста: ",
    mjpgUrl: "URL потока MJPG: ",
    jpgUrl: "URL потока JPG: ",
    tsUrl: "URL потока TS: ",
    flvUrl: "URL потока FLV: ",
    hlsTsUrl: "URL потока HLS TS: ",
    hlsMp4Url: "URL потока HLS MP4: ",
    mp4Url: "URL потока MP4: ",
    rtspUrl: "URL потока RTSP: ",
    rtmpUrl: "URL потока RTMP: ",
    srtListenerUrl: "URL слушателя SRT: ",
    webrtcP2pUrl: "URL потока WebRTC P2P: ",
    rtmpPushUrlAny: "URL публикации RTMP(S)/RTSP {0}: ",
    rtmpPushUrlAny0: "URL публикации RTMP(S)/RTSP 0: ",
    rtmpPushUrlAny1: "URL публикации RTMP(S)/RTSP 1: ",
    rtmpPushUrlAny2: "URL публикации RTMP(S)/RTSP 2: ",
    rtmpPushUrl: "URL публикации RTMP(S) {0}: ",
    rtspPushUrl: "URL публикации RTSP {0}: ",
    srtCallerUrl: "URL вызывающего SRT: ",
    hlsPushUrl: "URL PUSH HLS: ",
    icecastPushUrl: "URL PUSH ICECAST: ",
    shoutcastPushUrl: "URL PUSH Shoutcast: ",
    whipLabel: "WHIP: ",
    viewers: "Зрители",
    viewersLabel: "Зрители: ",

    // TRTC status
    trtcRoomId: "ID комнаты TRTC: ",
    inRoom: "В комнате",
    notInRoom: "Не в комнате",
    initializingServer: "Инициализация подключения к серверу",
    serverDisconnected: "Сервер отключен",
    connectingServer: "Подключение к серверу",
    serverConnected: "Подключен к серверу",
    networkUnknown: "Состояние сети неизвестно",
    networkExcellent: "Отличная сеть",
    networkGood: "Хорошая сеть",
    networkNormal: "Нормальная сеть",
    networkPoor: "Слабая сеть",
    networkBad: "Плохая сеть",
    networkNotMeet: "Сеть не соответствует минимальным требованиям TRTC",
    errorCode: "Код ошибки",
    errorCodeLabel: "Код ошибки: ",
    trtcError1: "Общая ошибка, проверьте файлы журнала",
    trtcError100: "Ошибка бизнес-логики: недопустимый вызов",
    trtcError101: "Ошибка бизнес-логики: недопустимый параметр",
    trtcError102: "Невозможно прочитать сейчас, попробуйте снова",
    trtcError103: "Невозможно подключиться к сети",
    trtcError200: "Не удалось войти в комнату",
    trtcError201: "Недействительный параметр user_sig",
    trtcError202: "Недействительный формат ID комнаты",
    trtcError203: "Недействительный sdk_app_id",
    trtcError204: "Сервис недоступен. Проверьте, что минуты пакета > 0 и аккаунт Tencent Cloud не просрочен",
    trtcError205: "Пользователь был удален из комнаты сервером",

    // WHIP status
    whipInitializing: "Инициализация",
    whipConnected: "Подключен",
    whipDisconnected: "Отключен",
    whipUnknown: "Неизвестный статус",
    alirtcLabel: "AliRTC: ",
    alirtcConnecting: "Подключение",
    alirtcConnected: "Подключен",
    alirtcDisconnected: "Отключен",
    alirtcUnknown: "Неизвестный статус",
    alirtcRoomId: "ID комнаты AliRTC: ",
    alirtcRoomIdLabel: "ID комнаты: ",
    alirtcUserIdLabel: "ID пользователя: ",
    alirtcUserNameLabel: "Имя пользователя: ",
    alirtcVideoBitrateLabel: "Видео: ",
    alirtcAudioBitrateLabel: "Аудио: ",
    alirtcRttLabel: "RTT: ",

    // GB28181
    gb28181: "GB28181: ",
    gb28181Online: "Онлайн",
    gb28181Offline: "Оффлайн"
  },

  // Reboot page
  reboot: {
    title: "Перезагрузка устройства",
    description: "Нажмите эту кнопку для перезагрузки кодировщика.",
    button: "Перезагрузить",
    success: "Команда перезагрузки отправлена!",
    failed: "Ошибка перезагрузки!",
    confirm: "Вы уверены, что хотите перезагрузить устройство?"
  },

  // Factory reset page
  reset: {
    title: "Сброс до заводских настроек",
    description: "Нажмите эту кнопку для восстановления всех настроек кодировщика до заводских.",
    button: "Сбросить",
    success: "Сброс до заводских настроек выполнен! Система автоматически перезагрузится, подождите.",
    failed: "Ошибка сброса до заводских настроек!",
    confirm: "Вы уверены, что хотите восстановить заводские настройки?"
  },

  // Scheduled reboot page
  scheduleRecord: {
    title: "Запись по расписанию",
    allDay: "Весь день",
    timeRange: "Интервал",
    segment: "Интервал",
    to: "до",
    monday: "Пн",
    tuesday: "Вт",
    wednesday: "Ср",
    thursday: "Чт",
    friday: "Пт",
    saturday: "Сб",
    sunday: "Вс",
    nextDay: "(след. день)",
    hint: "Каждый сегмент может быть Весь день или Интервал, со своими активными днями; в интервале конец раньше начала означает ночь (запись на следующий день, по дню начала). Сначала синхронизируйте время (NTP) в Сети, иначе не сработает.",
    saveSuccess: "Успешно сохранено!",
    saveFailed: "Ошибка сохранения!",
    invalidTime: "Неверное время!",
    needWeekday: "Выберите хотя бы один день!",
  },
  timedReboot: {
    title: "Плановая перезагрузка",
    enable: "Плановая перезагрузка",
    enableLabel: "Плановая перезагрузка:",
    timeLabel: "Время перезагрузки:",
    enabled: "Включить",
    disabled: "Отключить",
    time: "Время перезагрузки",
    weekdays: "Дни перезагрузки",
    everyday: "Каждый день",
    monday: "Понедельник",
    tuesday: "Вторник",
    wednesday: "Среда",
    thursday: "Четверг",
    friday: "Пятница",
    saturday: "Суббота",
    sunday: "Воскресенье",
    save: "Сохранить",
    saveSuccess: "Настройки сохранены!",
    saveFailed: "Ошибка сохранения настроек!",
    invalidTime: "Недопустимое значение времени!"
  },

  // Network test page
  netTest: {
    title: "Тест сети и системный журнал",
    command: "Команда:",
    run: "Выполнить",
    address: "Адрес:",
    result: "Результат:",
    invalidAddr: "Пожалуйста, введите действительный адрес!"
  },

  // Record files page
  recordFiles: {
    title: "Список файлов",
    fileName: "Имя файла",
    time: "Время",
    fileSize: "Размер файла",
    action: "Действие",
    delete: "Удалить",
    confirmDelete: "Вы уверены, что хотите удалить",
    deleteSuccess: "Команда удаления успешно отправлена!",
    deleteFailed: "Ошибка удаления!",
    noFiles: "Нет файлов записи",
    loadError: "Ошибка загрузки"
  },

  // Password settings page
  password: {
    title: "Настройки пароля",
    oldPassword: "Старый пароль",
    oldPasswordLabel: "Старый пароль:",
    newPassword: "Новый пароль",
    newPasswordLabel: "Новый пароль:",
    confirmPassword: "Подтвердите пароль",
    confirmPasswordLabel: "Подтвердите пароль:",
    save: "Сохранить",
    success: "Настройки сохранены!",
    failed: "Ошибка настройки пароля, проверьте правильность старого пароля!",
    mismatch: "Новые пароли не совпадают!",
    empty: "Пароль не может быть пустым!"
  },

  // Encoding common (only actually used keys)
  encoding: {
    sameAsInput: "Как входное разрешение",
    mp3Required: "Пожалуйста, установите аудиокодирование на MP3!",
    choosePrimaryColor: "Выбрать основной цвет",
    toggleTheme: "Переключить тему"
  },

  // OSD settings
  osd: {
    title: "Настройки OSD",
    mainStream: "OSD основного потока",
    subStream1: "OSD дополнительного потока 1",
    subStream2: "OSD дополнительного потока 2",
    subStream3: "OSD дополнительного потока 3",
    alpha: "Прозрачность",
    alphaLabel: "Прозрачность:",
    alphaRange: "[0-255]",
    alphaError: "Прозрачность должна быть целым числом от 0 до 255!",
    region: "Область",
    regionLabel: "Область:",
    region1: "Область 1",
    region2: "Область 2",
    region3: "Область 3",
    region4: "Область 4",
    type: "Тип",
    typeLabel: "Тип:",
    typeText: "Текст",
    typeImage: "Изображение",
    typeScroll: "Бегущая строка",
    typeTime: "Время",
    typeAudioStatus: "Состояние аудио",
    typeVolumeMeter: "Индикатор громкости",
    typeMosaic: "Мозаика",
    position: "Позиция",
    positionLabel: "Позиция:",
    speed: "Скорость",
    speedLabel: "Скорость:",
    xLabel: "X:",
    yLabel: "Y:",
    textLabel: "Текст:",
    fontSize: "Размер шрифта",
    fontSizeLabel: "Размер шрифта:",
    fontSizeRange: "[8-72]",
    backgroundColor: "Цвет фона",
    backgroundLabel: "Цвет фона:",
    sizeLabel: "Размер (Ш×В):",
    sizeHint: "[пикс]",
    blkSizeLabel: "Размер блока:",
    sizeError: "{0}: размер (Ш×В) должен быть корректными положительными целыми",
    bgTransparent: "Прозрачный",
    bgWhite: "Белый",
    bgBlack: "Черный",
    fontColor: "Цвет шрифта",
    fontColorLabel: "Цвет шрифта:",
    pickColor: "Выбрать цвет",
    closeColor: "Закрыть",
    logoLabel: "ЛОГОТИП:",
    success: "Настройки успешно сохранены!",
    failed: "Ошибка сохранения настроек!",
    xRangeError: "{0} Значение X должно быть целым числом от 0 до {1}!",
    yRangeError: "{0} Значение Y должно быть целым числом от 0 до {1}!",
    textEmpty: "{0} Текст не может быть пустым!",
    fontSizeError: "{0} Размер шрифта должен быть целым числом от 8 до 72!",
    speedRangeError: "{0} Значение скорости должно быть целым числом от 0 до 30!",
    positionRangeError: "{0} Значение позиции должно быть целым числом от 0 до {1}!",
    selectLogo: "Пожалуйста, выберите ЛОГОТИП для {0}!",
    webrtcPreview: "Предварительный просмотр видео"
  },

  // LOGO upload
  logo: {
    title: "Загрузка логотипа",
    logoLabel: "ЛОГОТИП:",
    upload: "Загрузить",
    hint: "Загрузите изображение размером менее 500 КБ. Поддерживаемые форматы: PNG / JPG / BMP (для прозрачности используйте PNG или 32-битный BMP с альфа-каналом).",
    hint2: "Имя файла должно быть logo1 / logo2 / logo3 / logo4, расширение .png / .jpg / .jpeg / .bmp.",
    hint3: "например logo1.png, logo1.jpg, logo1.jpeg, logo1.bmp",
    noFileSelected: "Пожалуйста, выберите файл для загрузки!",
    invalidFile: "Пожалуйста, загрузите изображения согласно требованиям!",
    uploadSuccess: "Загрузка успешна!",
    uploadFailed: "Ошибка загрузки!",
    imageSizeExceeded: "Размер файла изображения превышает лимит!",
    imageResolutionExceeded: "Разрешение файла изображения превышает лимит!",
    storageInsufficient: "Файл обновления слишком большой, недостаточно места для хранения!",
    listTitle: "Загруженный логотип",
    refresh: "Обновить",
    preview: "Предпросмотр",
    logoFile: "Файл LOGO",
    fileType: "Тип",
    fileSize: "Размер",
    operation: "Операция",
    loading: "Загрузка...",
    emptyList: "Нет загруженных LOGO",
    loadListFailed: "Не удалось загрузить список LOGO",
    confirmDelete: "Удалить {0}?\nФайлы PNG/BMP с тем же именем также будут удалены. Если этот LOGO используется, связанный графический OSD будет очищен.",
    deleteSuccess: "Удалено успешно!",
    deleteFailed: "Ошибка удаления!"
  },

  // WIFI settings
  wifi: {
    title: "Настройки WiFi",
    mode: "Режим",
    ap: "Точка доступа",
    sta: "Режим клиента",
    ssid: "SSID",
    password: "Пароль",
    security: "Безопасность",
    channel: "Канал",
    scan: "Сканировать",
    connect: "Подключить",
    disconnect: "Отключить",
    status: "Статус",
    connected: "Подключен",
    disconnected: "Отключен",
    signalStrength: "Уровень сигнала",
    basicSettings: "Основные настройки",
    wifiModule: "Модуль WiFi:",
    wifiMode: "Режим WiFi:",
    staMode: "Режим STA",
    apMode: "Режим AP",
    mainConfig: "Основная конфигурация WiFi",
    backupConfig1: "Резервная конфигурация WiFi 1",
    backupConfig2: "Резервная конфигурация WiFi 2",
    apModeSettings: "Режим AP",
    wifiList: "Список WiFi:",
    wifiEssid: "ESSID WiFi:",
    wifiPassword: "Пароль WiFi:",
    wifiDhcp: "DHCP WiFi:",
    wifiIp: "IP WiFi:",
    wifiNetmask: "Маска сети WiFi:",
    wifiGateway: "Шлюз WiFi:",
    backupEnable1: "Резервная конфигурация 1:",
    backupEnable2: "Резервная конфигурация 2:",
    wifiBand: "Диапазон WiFi:",
    wifiChannel: "Канал WiFi:",
    refresh: "Обновить",
    success: "Настройки успешно сохранены!",
    failed: "Ошибка сохранения настроек!",
    mainConfigEmpty: "Основная конфигурация WiFi: {0} не может быть пустым!",
    mainConfigInvalid: "Основная конфигурация WiFi: недопустимый формат {0}!",
    backupConfigEmpty: "WiFi {0}: {1} не может быть пустым!",
    backupConfigInvalid: "WiFi {0}: недопустимый формат {1}!",
    ipAddr: "IP-адрес",
    netmask: "Маска сети",
    gateway: "Шлюз",
    essidEmpty: "Имя WiFi не может быть пустым!",
    passwordTooShort: "Пароль WiFi должен содержать не менее 8 символов!"
  },


  // Upgrade and backup
  updateBackup: {
    title: "Обновление системы",
    uploadTitle: "Загрузка прошивки и конфигурации",
    backupTitle: "Резервное копирование прошивки и конфигурации",
    systemVersion: "Версия системы",
    systemVersionLabel: "Версия системы: ",
    hardware: "Оборудование",
    hardwareLabel: "Оборудование: ",
    selectFile: "Выбрать файл",
    selectFileLabel: "Выбрать файл:",
    uploadHint: "Имя файла для загрузки: up.rar или box.ini",
    uploadWarning: "Не загружайте одновременно. Не выключайте питание во время загрузки.",
    upload: "Загрузить",
    backupFirmware: "Резервное копирование прошивки",
    backupConfig: "Резервное копирование конфигурации",
    noFileSelected: "Пожалуйста, выберите файл для загрузки!",
    uploadSuccess: "Загрузка успешна, пожалуйста, перезагрузите систему!",
    uploadFailed: "Ошибка загрузки!",
    kernelUpdating: "Обновление ядра займёт несколько минут; не выключайте устройство. После завершения устройство перезагрузится автоматически — перезагружать вручную не нужно.",
    kernelUpdatingBin: "Обновление ядра займёт несколько минут; не выключайте устройство. После завершения устройство перезагрузится автоматически — перезагружать вручную не нужно!",
    imageSizeExceeded: "Размер файла изображения превышает лимит!",
    imageResolutionExceeded: "Разрешение файла изображения превышает лимит!",
    storageInsufficient: "Файл обновления слишком большой, недостаточно места для хранения!"
  },

  // Serial transport settings
  serial: {
    title: "Последовательная передача",
    frpTitle: "Настройки клиента FRP",
    serialTitle: "Проброс последовательного порта",
    enable: "Включить",
    disable: "Отключить",
    enableLabel: "Включить:",
    serverAddr: "Адрес сервера",
    serverAddrLabel: "Адрес сервера:",
    serverPort: "Порт сервера",
    serverPortLabel: "Порт сервера:",
    serverToken: "Токен сервера",
    serverTokenLabel: "Токен сервера:",
    channel: "Канал",
    channel1: "Канал 1",
    channel2: "Канал 2",
    channel3: "Канал 3",
    channel4: "Канал 4",
    protocolLabel: "Протокол:",
    localPort: "Локальный порт",
    localPortLabel: "Локальный порт:",
    remotePort: "Удаленный порт",
    remotePortLabel: "Удаленный порт:",
    serialMode: "Режим последовательного порта",
    serialModeLabel: "Режим:",
    server: "Сервер",
    client: "Клиент",
    baudRate: "Скорость передачи",
    baudRateLabel: "Скорость передачи:",
    listenPort: "Порт прослушивания",
    listenPortLabel: "Порт прослушивания:",
    save: "Сохранить",
    success: "Настройки сохранены, пожалуйста, перезагрузите устройство!",
    failed: "Ошибка сохранения настроек!",
    emptyError: "Настройки не могут быть пустыми!",
    remoteAddrError: "Адрес удалённого сервера недействителен (введите корректный IP или имя хоста)!",
    portRangeError: "Порт прослушивания TCP должен быть целым числом от 1 до 65535!",
    frpAddrEmpty: "Адрес сервера FRP не может быть пустым!",
    frpPortError: "Порт сервера FRP должен быть целым числом от 1 до 65535!"
  },

  // Advanced Settings
  advanced: {
    title: "Расширенные настройки",
    // Section titles
    videoInput: "Видеовход",
    avTransmission: "Передача A/V",
    recordSettings: "Настройки записи",
    hlsSettings: "Настройки HLS",
    networkTransmission: "Передача потока",
    serviceSettings: "Настройки сервисов",
    logSettings: "Настройки журнала",
    encoderParams: "Параметры кодировщика",
    imageEnhancement: "Улучшение изображения",
    autoRestart: "Автоперезагрузка",
    // Video Input
    edidSelect: "Выбор EDID:",
    colorGamut: "Цветовая гамма:",
    colorRange: "Диапазон цветов:",
    interlaceMode: "Режим чересстрочной развертки:",
    noSignal: "Нет сигнала:",
    vgaAutoAdjust: "Автонастройка VGA при запуске:",
    interlaceWeaving: "Переплетение (объединение полей)",
    interlaceBottom: "Только нижнее поле",
    interlaceTop: "Только верхнее поле",
    interlaceBobbing: "Боббинг (поле в кадр)",
    noSignalHide: "Скрыть",
    noSignalImage: "Показать изображение",
    noSignalColor: "Показать сплошной цвет",
    noVideoRestartStream: "Перезапуск потока при отсутствии сигнала:",
    // A/V Transmission
    videoOnly: "Только видео:",
    audioOnly: "Только аудио:",
    avSync: "Синхронизация A/V:",
    audioDelay: "Задержка аудио (мс):",
    syncAuto: "Авто",
    syncResample: "Ресемплинг",
    audioDelayHint: "Отрицательные значения ускоряют аудио, положительные замедляют. Используйте только для настройки синхронизации A/V.",
    // Recording Settings
    recordType: "Тип записи:",
    cycleRecord: "Циклическая запись:",
    diskOverwriteOldest: "Удалять старые при заполнении:",
    noRecordNoSig: "Не записывать без сигнала:",
    recordSplitTime: "Время разделения записи (сек):",
    // HLS Settings
    hlsSplitTime: "Время сегмента HLS (сек):",
    hlsBufferNum: "Количество сегментов HLS:",
    hlsIndexUri: "Глобальный URI индекса HLS:",
    // Network Transmission
    tsMuxer: "Мультиплексор TS:",
    netDropThreshold: "Порог потери пакетов:",
    tsOnce: "Пакетов TS за отправку:",
    rtspPackType: "Инкапсуляция RTSP:",
    multicastType: "Тип мультикаста:",
    enableSap: "Включить SAP:",
    mtuSize: "Размер MTU:",
    udpTtl: "TTL UDP:",
    udpSockBuf: "UDP SOCKET_BUF_SIZE:",
    rtpH264PacketMode: "Пакетизация RTP H264:",
    packetizeByAccessUnit: "packetize_by_access_unit",
    packetizeByNalu: "packetize_by_nalu",
    vlcCompat: "Совместимость с VLC",
    ffmpegCompat: "Совместимость с FFMPEG",
    esStream: "Поток ES",
    tsStream: "Поток TS",
    // Service Settings
    tsRtspAuth: "Требуется аутентификация TS/RTSP:",
    httpNoAuth: "Веб-доступ без аутентификации:",
    netCheck: "Проверка состояния сети:",
    telnetService: "Сервис Telnet:",
    sshService: "Сервис SSH:",
    sambaService: "Сервис Samba:",
    onvifService: "Сервис ONVIF:",
    onvifLocation: "ONVIF Location:",
    onvifMode: "Режим ONVIF:",
    onvifModeLegacy: "Legacy XML (общий порт HTTP/ONVIF)",
    onvifModeProfileST: "Profile S/T (выделенный порт ONVIF)",
    onvifModeProfileSCompat: "Profile S совместим с Hikvision (выделенный порт ONVIF)",
    rtspDefaultStream: "Поток RTSP по умолчанию:",
    vmixCompat: "Совместимость с VMix:",
    telnetLan: "Только LAN",
    // Log Settings
    localLog: "Локальный сервис журнала:",
    trtcLogLevel: "Уровень журнала SDK TRTC:",
    alirtcLogLevel: "Уровень журнала SDK AliRTC:",
    sdkLogDebug: "Отладка",
    sdkLogInfo: "Информация",
    sdkLogWarning: "Предупреждение",
    sdkLogError: "Ошибка",
    sdkLogFatal: "Критическая",
    sdkLogNone: "Нет",
    lokiAddr: "Адрес сервера Loki:",
    lokiPort: "Порт сервера Loki:",
    // Encoder Parameters
    sliceSplit: "Разделение SLICE:",
    sliceBytes: "Байт SLICE:",
    minQp: "MIN_QP:",
    maxQp: "MAX_QP:",
    debreath: "Debreathing:",
    sar: "SAR:",
    cbrOnlyHint: "Действует только когда режим управления битрейтом установлен на CBR",
    // Image Enhancement
    contrastEnhance: "Улучшение контраста:",
    sharpnessEnhance: "Улучшение резкости:",
    lumaSfStrength: "Пространственное шумоподавление яркости:",
    lumaTfStrength: "Временное шумоподавление яркости:",
    chromaSfStrength: "Пространственное шумоподавление цветности:",
    chromaTfStrength: "Временное шумоподавление цветности:",
    // Auto Restart
    kickAllOnChange: "Отключить пользователей при смене входа:",
    noVideoReboot: "Автоперезагрузка при отсутствии видео:",
    noAudioReboot: "Автоперезагрузка при отсутствии аудио:",
    // Button
    save: "Сохранить",
    // Messages
    success: "Настройки сохранены, пожалуйста, перезагрузите устройство!",
    failed: "Ошибка сохранения настроек!",
    emptyError: "Настройки не могут быть пустыми!",
    netDropError: "Порог потери пакетов должен быть целым числом от 50 до 50000!",
    tsOnceError: "Пакетов TS за отправку должно быть целым числом от 1 до 128!",
    sliceError: "Байт SLICE должно быть целым числом от 128 до 65535!",
    minQpError: "MIN_QP должен быть целым числом от 1 до 35!",
    maxQpError: "MAX_QP должен быть больше MIN_QP и не более 50!",
    udpTtlError: "TTL UDP должен быть целым числом от 1 до 254!",
    contrastError: "Улучшение контраста должно быть целым числом от 0 до 63!",
    sharpnessError: "Улучшение резкости должно быть целым числом от 0 до 16!",
    lumaSfError: "Пространственное шумоподавление яркости должно быть целым числом от 0 до 255!",
    lumaTfError: "Временное шумоподавление яркости должно быть целым числом от 0 до 63!",
    chromaSfError: "Пространственное шумоподавление цветности должно быть целым числом от 0 до 255!",
    chromaTfError: "Временное шумоподавление цветности должно быть целым числом от 0 до 32!",
    hlsSplitError: "Время сегмента HLS должно быть целым числом от 3 до 20!",
    hlsBufferError: "Количество сегментов HLS должно быть целым числом от 3 до 20!",
    hlsUriError: "Недопустимый формат глобального URI индекса HLS!",
    udpSockBufError: "UDP SOCKET_BUF_SIZE должен быть целым числом от 0 до 20971520!",
    mtuError: "Размер MTU должен быть целым числом от 500 до 1500!",
    audioCacheError: "Задержка аудио должна быть целым числом от -2000 до 2000!",
    recordSplitError: "Время разделения записи должно быть целым числом от 60 до 7200!",
    lokiPortError: "Порт сервера Loki должен быть от 1 до 65535"
  },

  // Audio Encoding Settings
  audioEnc: {
    blkInput: "Вход",
    blkEncode: "Кодирование",
    blkVolume: "Громкость",
    blkVolumeNote: "Ручное фиксированное усиление",
    blkAgc: "Авторегулировка усиления",
    blkAgcNote: "Автоматически выравнивает громкость до целевого уровня",
    blkDenoise: "Шумоподавление",
    blkDenoiseNote: "Подавляет фоновый шум; высокая нагрузка на ЦП, обычно выключено",
    mute: "Без звука",
    gain0: "0 dB (без изменений)",
    title: "Настройки аудио",
    // Tabs
    tabAudio: "Настройки аудио",
    tabOnvif: "Аудио ONVIF",
    // Tips
    tipAudio: "Не устанавливайте цифровое усиление громкости слишком высоким, это может вызвать искажения или шум.<br>В большинстве случаев установите усиление на 0.<br>Регулируйте общую громкость с помощью передних элементов управления.",
    tipVolVsAgc: "<b>Усиление громкости и автоусиление (AGC)</b><br>Усиление громкости — это фиксированное усиление, задаваемое вручную: положительные значения усиливают, отрицательные ослабляют. Оно не меняется в зависимости от входного сигнала и подходит для источников со стабильным, предсказуемым уровнем.<br>Автоусиление (AGC) автоматически регулирует усиление в соответствии с текущим уровнем входного сигнала, удерживает выход около целевого уровня и сглаживает звук, колеблющийся от громкого к тихому.<br>При включённом AGC держите усиление громкости на уровне 0 дБ, чтобы AGC управлял уровнем самостоятельно и не накладывались две регулировки.",
    tipAgcLevel: "<b>Целевой уровень AGC (dBFS)</b><br>Задаёт итоговый опорный уровень. Чем ближе цель к 0 dBFS, тем громче выход, но тем меньше запас для кратковременных пиков и тем легче возникает клиппинг.<br>• -18 dBFS (рекомендуется): баланс между громкостью и запасом, подходит для большинства случаев.<br>• -12 dBFS: самый громкий вариант, подходит для прямых трансляций и других сценариев с высокой громкостью; но при запасе всего 12 дБ внезапные громкие звуки легко перегружаются.<br>• -20 ~ -24 dBFS: подходит для голоса, живых выступлений и других входов с большими перепадами пиков.<br>• -30 ~ -42 dBFS: подходит для микрофонных входов с высоким усилением или шумной обстановки.",
    tipOnvif: "Для подключения к NVR установите кодирование RTSP G711 на 'Включить и ресемплировать до 8K'",
    // Audio Settings
    audioInput: "Аудиовход:",
    sampleRate: "Частота дискретизации:",
    codec: "Кодек:",
    channel: "Каналы:",
    bitrate: "Битрейт:",
    digitalGain: "Цифровое усиление громкости:",
    analogGain: "Аналоговое усиление громкости:",
    denoise: "Шумоподавление:",
    denoiseStrength: "Сила шумоподавления (дБ):",
    agc: "Автоматическая регулировка усиления:",
    agcLevel: "Целевой уровень AGC (dBFS):",
    pteG711: "Поток PTE G711:",
    // Audio Input Options
    inputDigital: "Цифровой",
    inputAnalog: "Аналоговый",
    inputMixed: "Смешанный",
    // Sample Rate Options
    sampleSameAsInput: "Как на входе",
    // ONVIF Audio
    rtspG711: "Кодирование RTSP G711:",
    rtspG711Resample: "Включить и ресемплировать до 8K",
    g711Codec: "Кодек G711:",
    // Buttons and Messages
    save: "Сохранить",
    success: "Настройки сохранены!",
    failed: "Ошибка сохранения настроек!",
    emptyError: "Настройки не могут быть пустыми!",
    bitrateError: "Битрейт должен быть целым числом от {0} до {1}!",
    gainError: "Цифровое усиление громкости должно быть целым числом от -50 до 50!",
    denoiseError: "Сила шумоподавления должна быть целым числом от 1 до 100!",
    agcLevelError: "Целевой уровень AGC должен быть от -42 до -12 dBFS!",
    analogVolEmpty: "Аналоговое усиление громкости не может быть пустым!",
    analogVolError: "Аналоговое усиление громкости должно быть целым числом от {0} до {1}!"
  },

  // Recording Settings Page
  recordSet: {
    title: "Настройки записи",
    // Card Titles
    statusTitle: "Статус записи",
    settingsTitle: "Настройки записи",
    // Status
    recordType: "Тип записи:",
    diskStatus: "Статус диска:",
    currentAddr: "Текущий адрес:",
    mountDevice: "Устройство монтирования:",
    mountStatus: "Статус монтирования:",
    totalSpace: "Всего места:",
    freeSpace: "Свободно:",
    recordStatus: "Статус записи:",
    recordFiles: "Файлы записи:",
    fileList: "Список файлов",
    // Disk Status
    diskNotExist: "Не найден",
    diskFull: "Диск заполнен",
    diskSlow: "Диск слишком медленный",
    mounted: "Смонтирован",
    unmounted: "Не смонтирован",
    notRecording: "Не записывается",
    recording: "Запись",
    noVideoWarning: " (Файлы могут не сохраняться без видеовхода)",
    // Action Links
    startRecord: "(Начать запись)",
    stopRecord: "(Остановить запись)",
    mountDisk: "(Смонтировать диск)",
    unmountDisk: "(Отмонтировать диск)",
    deleteAll: "(Удалить все записи)",
    // Settings
    storageType: "Тип хранилища:",
    partition: "Раздел:",
    partitionInfo: "Информация о разделе:",
    diskInfo: "Информация о диске:",
    formatDisk: "(Переформатировать диск)",
    exampleAddr: "Пример адреса:",
    storageAddr: "Адрес хранилища:",
    username: "Имя пользователя:",
    password: "Пароль:",
    // Storage Type Options
    storageDisabled: "Отключено",
    storageUsb: "USB/TF карта",
    storageNfs: "NFS",
    storageSamba: "SAMBA/CIFS",
    // Format Dialog
    formatTitle: "Информация о диске",
    formatDevice: "Устройство:",
    formatType: "Тип:",
    formatModel: "Модель:",
    formatRemovable: "Съемный:",
    formatPartTable: "Таблица разделов:",
    formatCapacity: "Емкость:",
    formatPartitions: "Информация о разделах",
    formatPartition: "Раздел",
    formatAvailable: "(доступно)",
    formatTotal: "(всего)",
    formatConfirm: "Продолжить форматирование диска?",
    formatDanger: "Внимание: Форматирование приведет к переразметке и все данные будут потеряны. Продолжить?",
    formatContinue: "Продолжить",
    formatCancel: "Отмена",
    formatConfirmBtn: "Подтвердить",
    formatting: "Форматирование...",
    // Buttons and Messages
    save: "Сохранить",
    yes: "Да",
    no: "Нет",
    success: "Настройки сохранены!",
    failed: "Ошибка сохранения настроек!",
    formatSuccess: "Форматирование успешно!",
    formatFailed: "Ошибка форматирования!",
    deleteSuccess: "Команда удаления отправлена!",
    deleteFailed: "Ошибка удаления!",
    confirmDeleteAll: "Удалить все файлы записи?",
    recordingWarning: "Идет запись. Остановите запись перед отмонтированием.",
    diskMountedWarning: "Диск смонтирован. Отмонтируйте перед форматированием.",
    diskMountedSettingWarning: "Диск смонтирован. Отмонтируйте перед изменением настроек.",
    storageLockedHint: "Заблокировано, пока диск смонтирован; отключите его для изменения.",
    partitionNotExist: "Раздел не существует",
    partitionRemoved: " (Удален)",
    unpartitioned: " (без разделов)",
    unpartitionedHint: "На диске нет разделов, сначала переразбейте и отформатируйте диск",
    // Address Validation
    addrEmpty: "Адрес хранилища не может быть пустым!",
    addrNfsFormat: "Недопустимый формат адреса, должен содержать разделитель ':'",
    addrIpError: "Недопустимый формат IP-адреса",
    addrPathSlash: "Путь должен начинаться с '/'",
    addrPathInvalid: "Путь содержит недопустимые символы",
    addrSambaStart: "Адрес должен начинаться с '\\\\'",
    addrSambaFormat: "Недопустимый адрес, должен содержать IP и путь, разделенные '\\'",
    addrPathEmpty: "Путь не может быть пустым",
    addrPathChars: "Путь содержит недопустимые символы, разрешены только буквы, цифры, подчеркивания и дефисы",
    // Disk size info "{available} / {total}"
    diskSizeInfo: "{0} (доступно) / {1} (всего)"
  },
  // GB28181 Settings
  gb28181: {
    title: "Настройки GB28181",
    basicSettings: "Основные настройки",
    heartbeatSettings: "Настройки heartbeat",
    sipServerSettings: "Настройки сервера SIP",
    authSettings: "Настройки аутентификации",
    enable: "Включить:",
    disabled: "Отключено",
    enabled: "Включено",
    localSipPort: "Локальный порт SIP:",
    videoChannelId: "ID видеоканала:",
    streamSelect: "Выбор потока:",
    mainStream: "Основной поток",
    subStream1: "Дополнительный поток 1",
    subStream2: "Дополнительный поток 2",
    subStream3: "Дополнительный поток 3",
    regExpiry: "Срок действия регистрации:",
    heartbeatCycle: "Цикл heartbeat:",
    maxHeartbeatTimeout: "Макс. таймаут heartbeat:",
    sipServerId: "ID сервера SIP:",
    sipServerDomain: "Домен сервера SIP:",
    sipServerAddr: "Адрес сервера SIP:",
    sipServerPort: "Порт сервера SIP:",
    sipUserId: "ID пользователя SIP:",
    sipPassword: "Пароль SIP:",
    emptyError: "Настройки не могут быть пустыми!",
    localPortError: "Локальный порт SIP должен быть целым числом от 1 до 65535!",
    serverPortError: "Порт сервера SIP должен быть целым числом от 1 до 65535!",
    regExpiryError: "Срок действия регистрации должен быть целым числом от 100 до 100000!",
    heartbeatError: "Цикл heartbeat должен быть целым числом от 5 до 3600!",
    maxTimeoutError: "Макс. таймаут heartbeat должен быть целым числом от 3 до 255!",
    success: "Настройки успешно сохранены!",
    failed: "Ошибка сохранения настроек!"
  },
  // Video Source Settings
  videoSource: {
    title: "Настройки источника видео",
    videoInput: "Настройки видеовхода",
    brightAdjust: "Настройка яркости входа",
    videoOutput: "Настройки видеовыхода",
    inputFormat: "Формат видеовхода:",
    yuv422: "YUV422",
    yuv420: "YUV420 (Поддерживается поворот)",
    rotation: "Угол поворота:",
    flipMirror: "Отражение/Зеркало:",
    flipDisable: "Отключено",
    mirror: "Зеркало",
    flip: "Отражение",
    flipAndMirror: "Зеркало и отражение",
    cropEnable: "Обрезка видео:",
    cropLeft: "Начальная точка обрезки (Слева):",
    cropTop: "Начальная точка обрезки (Сверху):",
    cropWidth: "Ширина обрезки:",
    cropHeight: "Высота обрезки:",
    colorMode: "Цветовой режим входа:",
    unknown: "Неизвестно",
    brightEnable: "Настройка яркости:",
    gain: "Усиление:",
    gainHint: "[10-1000], по умолчанию 100",
    offset: "Смещение:",
    offsetHint: "[0-100], по умолчанию 0",
    note: "Примечание:",
    brightNote1: "1. Яркость = (Исходная яркость * Усиление / 100) + Смещение",
    brightNote2: "2. Настройка яркости работает только в цветовом режиме входа RGB",
    outputRes: "Разрешение видеовыхода:",
    auto: "Авто",
    cscEnable: "Настройка CSC:",
    luminance: "Яркость:",
    contrast: "Контраст:",
    hue: "Оттенок:",
    saturation: "Насыщенность:",
    cscHint: "[0-100], по умолчанию 50",
    rotateHint: "Поворот поддерживается только когда формат видеовхода YUV420.",
    emptyError: "Настройки не могут быть пустыми!",
    gainError: "Усиление должно быть целым числом от 10 до 1000!",
    offsetError: "Смещение должно быть целым числом от 0 до 100!",
    leftError: "Значение слева должно быть целым числом от 0 до {0}!",
    topError: "Значение сверху должно быть целым числом от 0 до {0}!",
    widthError: "Значение ширины должно быть целым числом от 400 до {0}!",
    heightError: "Значение высоты должно быть целым числом от 400 до {0}!",
    luminanceError: "Яркость должна быть целым числом от 0 до 100!",
    contrastError: "Контраст должен быть целым числом от 0 до 100!",
    hueError: "Оттенок должен быть целым числом от 0 до 100!",
    saturationError: "Насыщенность должна быть целым числом от 0 до 100!",
    success: "Настройки успешно сохранены!",
    failed: "Ошибка сохранения настроек!"
  },
  // Network Settings
  network: {
    title: "Сетевые настройки",
    ipv4Title: "Настройки IPv4",
    ipv6Status: "Статус IPv6",
    ipv6Title: "Настройки IPv6",
    ipv6TypeGlobal: "Глобальный IP",
    ipv6TypeLinkLocal: "Локальный IP канала",
    ipv6TypeUniqueLocal: "Локальный IP",
    ipv6TypeMulticast: "Мультикаст IP",
    ipv6TypeGeneric: "IP",
    ipv6StatusGateway: "Шлюз",
    dnsTitle: "Настройки DNS",
    ntpTitle: "Настройки NTP",
    portTitle: "Настройки портов",
    httpsTitle: "Настройки HTTPS",
    hostnameTitle: "Настройки HOSTNAME",
    dhcp: "DHCP:",
    dhcpHint: "После включения DHCP устройство может быть найдено инструментами поиска, совместимыми с ONVIF.",
    ipAddr: "IP-адрес:",
    netmask: "Маска подсети:",
    gateway: "Проводной шлюз:",
    macAddr: "MAC-адрес:",
    defaultGateway: "Шлюз по умолчанию:",
    lanFirst: "Сначала проводной",
    wifiFirst: "Сначала WiFi",
    g4First: "Сначала 4G/5G",
    ipv6Mode: "Режим:",
    ipv6Disable: "Отключено",
    ipv6Auto: "Автоконфигурация",
    ipv6Manual: "Ручная настройка",
    ipv6Addr: "Адрес IPv6:",
    ipv6Prefix: "Длина префикса IPv6:",
    ipv6Gateway: "Шлюз IPv6 по умолчанию:",
    dns1: "DNS1:",
    dns2: "DNS2:",
    ntpSync: "Синхронизация NTP:",
    ntpServer: "Сервер:",
    timezone: "Часовой пояс:",
    httpPort1: "HTTP порт 1:",
    httpPort2: "HTTP порт 2:",
    rtspPort1: "RTSP порт 1:",
    rtspPort2: "RTSP порт 2:",
    onvifPort: "ONVIF порт:",
    sadpProtocol: "SADP порт:",
    httpsService: "Сервис HTTPS:",
    httpsPort1: "HTTPS порт 1:",
    httpsPort2: "HTTPS порт 2:",
    httpsPrivatePass: "Пароль приватного ключа HTTPS:",
    socks5Title: "SOCKS5 Proxy",
    socks5Enable: "SOCKS5 Proxy:",
    socks5Host: "Proxy Host:",
    socks5Port: "Proxy Port:",
    socks5User: "Username:",
    socks5Pass: "Password:",
    socks5AuthHint: "(Optional authentication, username and password must both be set)",
    privatePassHint: "(Оставьте пустым, если нет пароля)",
    uploadCert: "Загрузить сертификат:",
    uploadCertHint: "(Имя файла должно быть private.key или public.crt. Не загружайте одновременно и не выключайте питание во время загрузки)",
    uploadBtn: "Загрузить сертификат",
    deleteCert: "Удалить сертификат",
    hostname: "HOSTNAME:",
    mdnsService: "Сервис mDNS:",
    mdnsAddr: "Адрес доступа mDNS:",
    portRange: "[1-65535]",
    prefixRange: "[0-128]",
    emptyError: "Настройки не могут быть пустыми!",
    ipError: "Недопустимый формат IP-адреса!",
    netmaskError: "Недопустимый формат маски подсети!",
    gatewayError: "Недопустимый формат шлюза!",
    dns1Error: "Недопустимый формат основного DNS!",
    dns2Error: "Недопустимый формат дополнительного DNS!",
    macError: "Недопустимый формат MAC-адреса!",
    ipv6Error: "Неверный формат адреса IPv6!",
    ipv6PrefixError: "Неверная длина префикса IPv6 (1-128)!",
    ipv6GatewayError: "Неверный формат шлюза IPv6!",
    httpPort1Error: "HTTP порт 1 должен быть целым числом от 1 до 65535!",
    httpPort2Error: "HTTP порт 2 должен быть целым числом от 1 до 65535!",
    rtspPort1Error: "RTSP порт 1 должен быть целым числом от 1 до 65535!",
    rtspPort2Error: "RTSP порт 2 должен быть целым числом от 1 до 65535!",
    httpsPort1Error: "HTTPS порт 1 должен быть целым числом от 1 до 65535!",
    httpsPort2Error: "HTTPS порт 2 должен быть целым числом от 1 до 65535!",
    onvifPortError: "ONVIF порт должен быть целым числом от 1 до 65535!",
    sadpPortError: "Порт SADP должен быть целым числом от 1 до 65535!",
    httpBothDisableError: "HTTP порт 1 и порт 2 не могут быть оба отключены!",
    httpsBothDisableError: "Когда HTTPS включен, порт 1 и порт 2 не могут быть оба отключены!",
    socks5HostError: "Invalid SOCKS5 proxy host!",
    socks5PortError: "SOCKS5 proxy port must be an integer between 1-65535!",
    socks5AuthPairError: "SOCKS5 username and password must both be set or both be empty!",
    socks5AuthLengthError: "SOCKS5 username and password must not exceed 255 characters!",
    ntpEmptyError: "Сервер NTP не может быть пустым!",
    ntpFormatError: "Недопустимый адрес сервера NTP!",
    hostnameEmptyError: "HOSTNAME не может быть пустым!",
    hostnameFormatError: "Недопустимый HOSTNAME!\n\n1. HOSTNAME не может превышать 63 символа!\n2. Допускаются только буквы (a-z), цифры (0-9), дефисы (-) и подчеркивания (_)!\n3. '-' и '_' не могут идти подряд, использоваться отдельно или в начале/конце!",
    deleteCertConfirm: "Вы уверены, что хотите удалить загруженный сертификат HTTPS?",
    selectFile: "Пожалуйста, выберите файл для загрузки!",
    uploadSuccess: "Загрузка успешна!",
    uploadFailed: "Ошибка загрузки!",
    fileSizeError: "Размер файла изображения превышает лимит!",
    fileResError: "Разрешение изображения превышает лимит!",
    spaceError: "Файл обновления слишком большой, недостаточно места для хранения!",
    deleteSuccess: "Успешно удалено!",
    deleteFailed: "Ошибка удаления!",
    successReboot: "Настройки сохранены, пожалуйста, перезагрузите устройство!",
    failed: "Ошибка сохранения настроек!"
  },

  // Output Settings Page (Stream Settings)
  output: {
    // Tab names
    tabs: {
      encode: "Кодирование",
      ts: "TS/Мультикаст",
      rtsp: "RTSP",
      rtmp: "RTMP",
      srt: "SRT",
      webrtc: "WebRTC",
      trtc: "TRTC",
      alirtc: "AliRTC",
      hls: "HLS",
      other: "MP4/FLV/Другое"
    },

    // Encoding settings
    encode: {
      codecType: "Тип кодека:",
      frameRate: "Частота кадров:",
      sameAsInput: "Как на входе",
      auto: "Авто",
      customFrameRate: "Пользовательская частота кадров",
      customFrameRateLabel: "Пользовательская частота кадров:",
      gopInterval: "Интервал GOP (кадры):",
      bitrate: "Битрейт (кбит):",
      qualityRange: "Диапазон качества:",
      qualityStrict: "Строгий (Высокий)",
      qualityTight: "Плотный (Почти высокий~Высокий)",
      qualityNormal: "Нормальный (Средний~Высокий)",
      qualityLoose: "Свободный (Почти низкий~Высокий)",
      qualityWide: "Широкий (Низкий~Высокий)",
      mjpegQuality: "Качество MJPEG:",
      outputResolution: "Разрешение выхода:",
      h264Profile: "Профиль H.264:",
      bitrateControl: "Управление битрейтом:",
      // Tips
      tipCodec: "H.265 обеспечивает лучшее качество видео, чем H.264. Используйте H.265, если ваш декодер это поддерживает.",
      tipVbr: "В режиме VBR битрейт регулируется \"Диапазоном качества\"; Диапазон качества ограничивает значения QP;<br>Выбор \"Почти высокий~Высокий\" или \"Высокий\" приводит к очень высокому фактическому битрейту, делая установленный битрейт бессмысленным;<br>Только когда Диапазон качества \"Почти низкий~Высокий\" битрейт имеет справочное значение;",
      tipCbr: "\"Сильный CBR\" используется для систем CATV для обеспечения стабильного битрейта TS. При \"Сильном CBR\" на 1080P битрейт не должен быть ниже 5000кбит/с, рекомендуется 8000кбит/с.",
      tipGop: "Предполагая, что входная частота кадров видео равна n, типичные значения 60, 50, 30, 25;<br>Интервал GOP обычно устанавливается на n * 2, типичные значения 120, 100, 60, 50;<br>Когда частота кадров установлена на Авто, если n > 30, частота кадров кодирования n / 2, иначе равна n"
    },

    // TS/Multicast settings
    ts: {
      tsUri: "URL потока TS:",
      multicastIp: "IP мультикаста:",
      multicastPort: "Порт мультикаста:",
      sapName: "Имя SAP:",
      tsVideoPid: "PID видео TS:",
      tsAudioPid: "PID аудио TS:",
      tsTransportStreamId: "ID транспортного потока TS:",
      tsOriginalNetworkId: "ID исходной сети TS:",
      tsPmtStartPid: "Начальный PID PMT TS:",
      tsStartPid: "Начальный PID TS:",
      tsTablesVersion: "Версия таблиц TS:",
      tsServiceId: "ID сервиса TS:",
      tsServiceName: "Имя сервиса TS:",
      tsProviderName: "Имя провайдера TS:",
      tsPcrPeriod: "Период PCR TS (мс):",
      conformSystemB: "Соответствие системе B (DVB):",
      tsNullPacket: "Пустые пакеты TS:",
      noInsert: "Не вставлять",
      insert12: "Вставлять (1.2x)",
      insert13: "Вставлять (1.3x)",
      insert15: "Вставлять (1.5x)",
      insert20: "Вставлять (2x)",
      insert25: "Вставлять (2.5x)",
      tsTdt: "TS TDT:",
      // Tips
      tipMulticast: "Адрес мультикаста также может принимать широковещательные или одноадресные адреса, система определит автоматически.",
      tipVlc: "Если VLC не может воспроизвести мультикаст, проверьте, есть ли у вашего компьютера несколько сетевых адаптеров, попробуйте переключиться на другой адаптер.",
      tipSap: "Имя SAP можно просматривать на поддерживаемых устройствах, например, в плейлисте VLC -> Локальная сеть.",
      tipAdvanced: "Расширенные настройки TS обычно не требуют настройки.",
      tipIptv: "При подключении к системам IPTV пустые пакеты TS должны быть установлены на 1.3x, устройство автоматически вставит пустые пакеты для обеспечения стабильного битрейта;<br>Эта настройка применяется только в режиме \"Сильный CBR\"."
    },

    // RTSP settings
    rtsp: {
      rtspUri: "URL потока RTSP:",
      enableMulticast: "Включить (Мультикаст)",
      enableTcpOnly: "Включить (Только TCP)",
      multicastIp: "IP мультикаста RTSP:",
      multicastPort: "Порт мультикаста RTSP:",
      // Tips
      tipEnable: "При выборе Включить фактический транспорт (UDP или TCP) определяется клиентом. Например, в VLC вы можете отметить \"RTP over RTSP(TCP)\" для использования TCP.",
      tipTcpOnly: "Выбор Включить (Только TCP) заставляет устройство использовать TCP.",
      tipUdp: "UDP может иногда терять пакеты из-за проблем с сетью. Если все клиенты поддерживают, рекомендуется TCP.",
      tipMulticast: "Выбор Включить (Мультикаст) будет использовать 4 последовательных порта, начиная с \"Порта мультикаста RTSP\"."
    },

    // RTMP settings
    rtmp: {
      rtmpUri: "URL потока RTMP:",
      publishUri0: "URL публикации RTMP(S)/RTSP 0:",
      publishUri1: "URL публикации RTMP(S)/RTSP 1:",
      publishUri2: "URL публикации RTMP(S)/RTSP 2:",
      mode: "Режим RTMP-потока:",
      modeStandard: "Standard (Enhanced RTMP)",
      modeLegacy: "Legacy (CodecID 12)",
      // Tips
      tipPublish: "URL публикации 0-2 предназначены для отправки потоков на другие LAN или публичные серверы RTMP/RTSP, поддерживая H.265/H.264.",
      tipBuiltin: "Это устройство имеет встроенный RTMP-сервер с поддержкой pull-потока H.264/H.265;<br>Если URL RTMP-потока установлен в \"/live/0\", PotPlayer может воспроизводить через http://IP-устройства/live/0.",
      tipMode: "Режим RTMP-потока действует только для H.265 и также влияет на FLV-поток;"
    },

    // SRT settings
    srt: {
      listenerUri: "URL слушателя SRT:",
      callerUri: "URL вызывающего SRT:",
      // Tips
      tipListener: "Режим слушателя SRT прослушивает локальный порт для получения потока плеерами.<br>Например, установите srt://0.0.0.0:9000;<br>VLC затем может воспроизвести \"srt://IP-устройства:9000\".<br>Добавление streamid пример:<br>srt://0.0.0.0:9000?streamid=channel100<br>Добавление пароля пример (минимум 10 символов):<br>srt://0.0.0.0:9000?passphrase=0123456789<br>Добавление streamid и пароля:<br>srt://0.0.0.0:9000?streamid=channel100&passphrase=0123456789",
      tipCaller: "Режим вызывающего SRT отправляет поток на другой сервер, например:<br>srt://live.example.com:9000?streamid=channel100&latency=120&maxbw=8000000",
      tipParams: "Поддерживаемые параметры SRT (см. протокол SRT для деталей):<br>streamid - идентификатор потока для мультиплексирования<br>passphrase - пароль шифрования, SRT требует 10-79 символов<br>pbkeylen - длина ключа: 16 (AES-128), 24 (AES-192), 32 (AES-256)<br>latency - задержка в мс (20-8000мс)<br>maxbw - макс. пропускная способность в байтах/сек<br>rcvbuf - размер буфера приема<br>sndbuf - размер буфера отправки<br>ipttl - значение IP TTL<br>conntimeo - таймаут подключения в мс"
    },

    // WebRTC settings
    webrtc: {
      previewTitle: "Веб-просмотр",
      previewNote: "(просмотр с низкой задержкой на странице состояния)",
      whipTitle: "Публикация WHIP",
      whipNote: "(отправка на сервер, для многих зрителей)",
      p2pTitle: "P2P удалённо",
      p2pNote: "(обход NAT, для нескольких удалённых зрителей)",
      optional: "можно оставить пустым",
      preview: "Веб-просмотр",
      whipServer: "URL публикации",
      whipToken: "Токен Bearer",
      p2pServer: "URL сервера сигнализации",
      p2pUuid: "UUID устройства",
      p2pToken: "Токен аутентификации P2P:",
      p2pAuthToken: "Токен авторизации",
      regenerate: "Сгенерировать заново",
      // Tips
      tipPreview: "Предпросмотр WebRTC в основных браузерах поддерживает видеокодирование H.264 и аудиокодирование Opus/G.711.<br>Установка аудио на Opus дает лучшие результаты. Если не установлено на Opus, по умолчанию G.711 8K.",
      tipWhip: "Потоковое вещание WHIP подключается к стандартным серверам WHIP. Скопируйте адрес с вашего сервера.<br>Токен Bearer может быть пустым.",
      tipP2p: "После включения сервера P2P URL просмотра отображается на странице статуса.<br>Токен аутентификации P2P может быть пустым.",
      tipP2pNote: "P2P может не подключаться в сложных интранет-средах."
    },

    // TRTC settings
    trtc: {
      roomId: "ID комнаты TRTC:",
      userId: "Имя пользователя TRTC:",
      roomKey: "Ключ комнаты TRTC:",
      userSig: "UserSig TRTC:",
      sdkAppId: "SDKAppID TRTC:",
      roomIdType: "Тип ID комнаты TRTC:",
      roomIdNumber: "Число",
      roomIdString: "Строка",
      // Short enum labels for template use
      number: "Число",
      string: "Строка",
      // Tips
      tipTrtc: "Отправка потоков на сервер Tencent TRTC. Скопируйте адрес с сервера.<br>Tencent TRTC в настоящее время поддерживает только H.264."
    },

    alirtc: {
      roomId: "ID комнаты AliRTC:",
      userId: "ID пользователя AliRTC:",
      userName: "Имя пользователя AliRTC:",
      region: "Регион AliRTC:",
      token: "AliRTC Token:",
      tipAliRtc: "Отправляет потоки на сервер Alibaba Cloud RTC с поддержкой H.265/H.264.<br>Можно напрямую указать Token, выданный сервисом, либо нажать AliRTC Token и сгенерировать Token с помощью AppID/AppKey на отдельной странице.<br>Если Token пустой, устройство при запуске попытается автоматически сгенерировать его с помощью AppID/AppKey, сохранённых на отдельной странице.<br>Если изменились ID комнаты, ID пользователя или имя пользователя, может потребоваться заново сгенерировать token."
    },


    alirtcTokenPage: {
      title: "AliRTC Token",
      roomId: "ID комнаты AliRTC:",
      userId: "ID пользователя AliRTC:",
      userName: "Имя пользователя AliRTC:",
      appId: "AliRTC AppID:",
      appKey: "AliRTC AppKey:",
      token: "AliRTC Token:",
      generate: "Сгенерировать и сохранить token",
      appFieldsRequired: "AliRTC AppID и AppKey обязательны.",
      identityRequired: "ID комнаты, ID пользователя и имя пользователя AliRTC обязательны в настройках вывода текущего потока.",
      generateSuccess: "AliRTC token был сгенерирован и сохранён.",
      generateFailed: "Не удалось сгенерировать AliRTC token.",
      unavailable: "AliRTC недоступен на этом устройстве."
    },

    // HLS settings
    hls: {
      hlsTsUri: "URL потока HLS TS:",
      hlsMp4Uri: "URL потока HLS MP4:",
      hlsPushUri: "URL PUSH HLS:",
      hlsPushUrl: "URL PUSH HLS:",
      // Tips
      tipHls: "Когда HLS TS/MP4 включен, устройство буферизует данные в памяти на основе времени и количества сегментов в расширенных настройках.<br>Установка времени и количества сегментов на 3 снижает использование памяти.",
      tipPush: "URL публикации HLS предназначен для отправки на серверы типа YouTube."
    },

    // MP4/FLV/Other settings
    other: {
      mp4Uri: "URL потока MP4:",
      flvUri: "URL потока FLV:",
      icecastUri: "URL PUSH ICECAST:",
      icecastPushUrl: "URL PUSH ICECAST:",
      shoutcastUri: "URL PUSH Shoutcast:",
      shoutcastPushUrl: "URL PUSH Shoutcast:",
      // Tips
      tipMp4: "Когда поток MP4 включен, его можно воспроизводить непосредственно в браузере.<br>Поток FLV поддерживает H.265/H.264 на этом устройстве, но VLC и другие плееры в настоящее время поддерживают только H.264.<br>ICECAST/Shoutcast поддерживает только MP3, для отправки на аудиосерверы.",
      tipShoutcast: "Shoutcast поддерживает v1 и v2;<br>Примеры:<br>http://пароль@shoutcast_server:8000<br>http://пароль@shoutcast_server:8000?sid=100<br>http://пароль@shoutcast_server:8000?icy-name=Stream&icy-genre=Pop<br>Формат:<br>http://пароль@IP-сервера:порт-прослушивания[?параметры...]; имя пользователя можно опустить (по умолчанию \"source\").<br>Используйте \"порт прослушивания\" сервера, устройство автоматически подключится к порту источника (порт прослушивания + 1).<br>Поддерживаемые параметры:<br>sid: ID потока Shoutcast v2 (по умолчанию 1)<br>icy-name: имя потока (опционально)<br>icy-genre: жанр (опционально)<br>icy-url: URL сайта (опционально)<br>icy-pub: публичный 0/1 (опционально)"
    },

    // Common
    common: {
      save: "Сохранить",
      disabled: "Отключено",
      enabled: "Включено"
    },

    // Error and success messages
    messages: {
      success: "Настройки сохранены!",
      failed: "Ошибка сохранения настроек!",
      emptyError: "Настройки не могут быть пустыми!",
      trtcH264Only: "Когда TRTC включен, поддерживается только кодирование H.264. Изменено автоматически.",
      alirtcIdentityRequired: "Когда AliRTC включен, ID комнаты, ID пользователя и имя пользователя не могут быть пустыми.",
      mp3Required: "Пожалуйста, установите аудиокодирование на MP3!",
      // Encoding validation
      frameRateError: "Частота кадров должна быть целым числом от 5 до 60!",
      gopError: "Интервал GOP должен быть целым числом от 5 до 300!",
      mjpegQualityError: "Качество MJPEG должно быть целым числом от 10 до 99!",
      hlsBitrateWarning: "Битрейт не в диапазоне 32~8000, потоки HLS TS/MP4/PUSH отключены.",
      trtcCodecWarning: "Кодек не H.264, TRTC отключен.",
      hlsBitrateError: "Битрейт не в диапазоне 32~8000, невозможно включить потоки HLS TS/MP4/PUSH",
      // SRT validation
      srtListenerPortError: "Порт слушателя SRT должен быть целым числом от 1 до 65535!",
      srtListenerFormatError: "Недопустимый формат URL слушателя SRT!",
      srtCallerFormatError: "Недопустимый формат URL вызывающего SRT!",
      srtPasswordLengthError: "Длина пароля SRT должна быть от 10 до 32!",
      srtLatencyError: "Задержка SRT должна быть целым числом от 1 до 10000!",
      srtBandwidthError: "Пропускная способность SRT должна быть целым числом от 0 до 102400!",
      // RTMP validation
      rtmpFormatError: "URL публикации RTMP(S)/RTSP должен начинаться с rtmp://, rtmps:// или rtsp://",
      // HLS validation
      hlsFormatError: "Недопустимый формат URL публикации HLS!",
      // RTSP validation
      rtspMulticastIpError: "Недопустимый формат IP мультикаста RTSP!",
      rtspMulticastPortError: "Порт мультикаста RTSP должен быть целым числом от 1 до 65535!",
      // TS validation
      multicastIpError: "Недопустимый формат IP мультикаста!",
      multicastPortError: "Порт мультикаста должен быть целым числом от 1 до 65535!",
      tsTransportIdError: "ID транспортного потока TS должен быть целым числом от 1 до 65535!",
      tsNetworkIdError: "ID исходной сети TS должен быть целым числом от 1 до 65535!",
      tsPmtPidError: "Начальный PID PMT TS должен быть целым числом от 32 до 8186!",
      tsStartPidError: "Начальный PID TS должен быть целым числом от 32 до 3840!",
      tsPidConflict: "Начальный PID TS и Начальный PID PMT TS должны быть разными!",
      tsVersionError: "Версия таблиц TS должна быть целым числом от 0 до 31!",
      tsServiceIdError: "ID сервиса TS должен быть целым числом от 1 до 65535!",
      tsVideoPidError: "PID видео TS должен быть целым числом от 16 до 8190!",
      tsAudioPidError: "PID аудио TS должен быть целым числом от 16 до 8190!",
      tsPcrPeriodError: "Период PCR TS должен быть целым числом от 0 до 100 (0=автоматически)!",
      tsVideoPidConflict: "PID видео TS и PID аудио TS должны быть разными!",
      tsAudioPmtConflict: "PID аудио TS и Начальный PID PMT TS должны быть разными!",
      tsVideoPmtConflict: "PID видео TS и Начальный PID PMT TS должны быть разными!",
      // Other validation
      icecastFormatError: "Недопустимый формат URL публикации Icecast!",
      shoutcastFormatError: "Недопустимый формат URL публикации Shoutcast!"
    }
  }
};
