// Portuguese translations
window.LANG_PT = {
  // Common
  common: {
    save: "Salvar",
    cancel: "Cancelar",
    confirm: "Confirmar",
    loading: "Carregando...",
    success: "Sucesso",
    failed: "Falhou",
    delete: "Excluir",
    edit: "Editar",
    add: "Adicionar",
    enable: "Ativar",
    disable: "Desativar",
    enabled: "Ativado",
    disabled: "Desativado",
    yes: "Sim",
    no: "Não",
    on: "Ligado",
    off: "Desligado",
    apply: "Aplicar",
    reset: "Redefinir",
    refresh: "Atualizar",
    close: "Fechar",
    back: "Voltar",
    next: "Próximo",
    previous: "Anterior",
    submit: "Enviar",
    action: "Ação",
    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: "Continuar",
    copy: "Copiar",
    copied: "Copiado"
  },

  preview: {
    flvRequired: "Ative o fluxo FLV.",
    flvOrHlsRequired: "Ative pelo menos um fluxo ao vivo: FLV ou HLS.",
    hlsUnsupportedEnableFlv: "A pré-visualização HLS não é suportada neste navegador. Ative FLV."
  },

  play: {
    mainFlvRequired: "É necessário ativar o fluxo FLV principal",
    browserFlvUnsupported: "Este navegador não suporta reprodução FLV. Use um navegador moderno como Chrome, Edge ou Firefox"
  },

  // Page titles
  title: {
    encoder: "Codificador H.265/H.264",
    status: "Status",
    mainStream: "Stream Principal",
    subStream1: "Stream Secundário 1",
    subStream2: "Stream Secundário 2",
    subStream3: "Stream Secundário 3",
    videoSettings: "Configurações de Vídeo",
    audioSettings: "Configurações de Áudio",
    advancedSettings: "Configurações Avançadas",
    osdMain: "OSD - Stream Principal",
    osdSub1: "OSD - Stream Secundário 1",
    osdSub2: "OSD - Stream Secundário 2",
    osdSub3: "OSD - Stream Secundário 3",
    logoUpload: "Upload de Logo",
    network: "Configurações de Rede",
    record: "Configurações de Gravação",
    gb28181: "GB28181",
    wifi: "Configurações WiFi",
    password: "Configurações de Senha",
    serial: "Transporte Serial",
    update: "Atualização e Backup",
    reboot: "Reiniciar Dispositivo",
    timedReboot: "Reinício Programado",
    factoryReset: "Restauração de Fábrica",
    recordFiles: "Arquivos de Gravação",
    netTest: "Teste de Rede",
    recordSet: "Configurações de Gravação",
    alirtcTokenPage: "AliRTC Token"
  },

  // Menu
  menu: {
    status: "Status",
    encoder: "Codificador",
    mainStream: "Stream Principal",
    subStream1: "Stream Secundário 1",
    subStream2: "Stream Secundário 2",
    subStream3: "Stream Secundário 3",
    videoSettings: "Configurações de Vídeo",
    audioSettings: "Configurações de Áudio",
    advancedSettings: "Configurações Avançadas",
    osd: "OSD",
    logoUpload: "Upload de Logo",
    system: "Sistema",
    scheduleRecord: "Gravação programada",
    network: "Rede",
    record: "Gravação",
    gb28181: "GB28181",
    wifi: "WiFi",
    password: "Senha",
    serial: "Transporte Serial",
    update: "Atualização e Backup",
    reboot: "Reiniciar",
    timedReboot: "Reinício Programado",
    factoryReset: "Restauração de Fábrica"
  },

  // Status page
  status: {
    // Device status
    deviceStatus: "Status do Dispositivo",
    runningTime: "Tempo de Execução: ",
    runtimeDayWithTime: "{0}d {1}",
    deviceTime: "Hora do Dispositivo: ",
    syncTime: " (Sincronizar hora com dispositivo)",
    cpuUsage: "Uso de CPU: ",
    cpuTemp: "Temperatura da CPU: ",
    memoryUsage: "Uso de Memória: ",
    encPpsUsage: "Uso de Recursos de Codificação: ",
    memoryWarning: " (Se o uso de memória estiver muito alto após 1 minuto de inicialização, desative alguns streams HLS ou reduza a taxa de bits)",
    cpuWarning: " (Se o uso da CPU permanecer acima de 85%, desative alguns streams ou reduza a resolução dos streams secundários)",
    networkStatus: "Status da Rede: ",
    inputVideo: "Vídeo de Entrada: ",
    vgaAutoAdjust: " (Ajuste Automático VGA)",
    capturedFrames: "Quadros de Vídeo Capturados: ",
    lostFrames: "Quadros de Vídeo Perdidos: ",
    audioSampleRate: "Taxa de Amostragem de Áudio de Entrada: ",
    capturedAudioFrames: "Quadros de Áudio Capturados: ",
    packetsSent: "Pacotes Enviados: ",
    netTestLink: " (Teste de Rede e Log do Sistema)",
    packetsDropped: "Pacotes Descartados: ",
    canAccessInternet: "Acesso à Internet",
    canAccessInternetIP: "Acesso IP à Internet",
    lanOnly: "Apenas LAN",
    localNetwork: "Rede Local",

    // Recording status
    recordStatus: "Status de Gravação",
    recordType: "Tipo de Gravação: ",
    diskStatus: "Status do Disco: ",
    diskNotExist: "Não Encontrado",
    mountStatus: "Status de Montagem: ",
    notMounted: "Não Montado",
    mounted: "Montado",
    totalSpace: "Espaço Total: ",
    freeSpace: "Espaço Livre: ",
    recordingStatus: "Status de Gravação: ",
    diskFull: "Disco Cheio",
    diskSlow: "Disco Muito Lento",
    recordFileList: "Lista de Arquivos de Gravação",
    notRecording: "Não Gravando",
    recording: "Gravando",
    recordingNoVideo: " (Arquivos podem não ser salvos sem entrada de vídeo)",
    startRecord: "(Iniciar Gravação)",
    stopRecord: "(Parar Gravação)",
    usbTfCard: "USB/Cartão TF",

    // DHCP status
    dhcpStatus: "Status DHCP",
    ip: "IP: ",
    subnetMask: "Máscara de Sub-rede: ",
    gateway: "Gateway: ",

    // WIFI status
    wifiStatus: "Status WiFi",
    wifiDisabled: "WiFi: Desativado",
    wifiState: "Estado WiFi: ",
    wifiSSID: "SSID WiFi: ",
    wifiIP: "IP WiFi: ",
    wifiMAC: "MAC WiFi: ",
    wifiRSSI: "Sinal WiFi (RSSI): ",
    wifiFreq: "Frequência WiFi: ",
    wifiConnected: "Conectado",
    wifiDisconnected: "Desconectado",
    wifiConnecting: "Conectando (Se a conexão demorar muito, verifique as configurações WiFi)",

    timeHour: "h",
    timeMinute: "m",
    timeSecond: "s",

    // Streams
    mainStream: "Stream Principal",
    subStream1: "Stream Secundário 1",
    subStream2: "Stream Secundário 2",
    subStream3: "Stream Secundário 3",
    streamDisabled: "Desativado (este fluxo secundário é desligado automaticamente quando a capacidade de codificação é insuficiente)",
    codecType: "Codec: ",
    encodeResolution: "Resolução de Codificação: ",
    videoBitrate: "Taxa de Bits de Vídeo: ",
    realTimeBitrate: "Taxa de Bits em Tempo Real: ",
    realTimeFps: "FPS em Tempo Real: ",
    videoEncoded: "Vídeo Codificado: ",
    reconnect: " (Reconectar)",
	    previewWebRTC: "Prévia de Vídeo (WebRTC)",
	    previewHTML5: "Prévia de Vídeo (HTML5)",

    // URL related
    disabled: "Desativado",
    connected: "Conectado",
    disconnected: "Desconectado",
    bufferPackets: "Pacotes em Buffer",
    bufferPacketsLabel: "Pacotes em Buffer: ",
    pushSpeed: "Velocidade de Push",
    pushSpeedLabel: "Velocidade de Push: ",
    pushed: "Enviado",
    pushedLabel: "Enviado: ",
    memoryUsed: "Memória Usada",
    memoryUsedLabel: "Memória Usada: ",
    cacheFiles: "Arquivos em Cache",
    cacheFilesLabel: "Arquivos em Cache: ",
    multicastUrl: "URL Multicast: ",
    mjpgUrl: "URL do Stream MJPG: ",
    jpgUrl: "URL do Stream JPG: ",
    tsUrl: "URL do Stream TS: ",
    flvUrl: "URL do Stream FLV: ",
    hlsTsUrl: "URL do Stream HLS TS: ",
    hlsMp4Url: "URL do Stream HLS MP4: ",
    mp4Url: "URL do Stream MP4: ",
    rtspUrl: "URL do Stream RTSP: ",
    rtmpUrl: "URL do Stream RTMP: ",
    srtListenerUrl: "URL do Listener SRT: ",
    webrtcP2pUrl: "URL do Stream WebRTC P2P: ",
    rtmpPushUrlAny: "URL de Publicação RTMP(S)/RTSP {0}: ",
    rtmpPushUrlAny0: "URL de Publicação RTMP(S)/RTSP 0: ",
    rtmpPushUrlAny1: "URL de Publicação RTMP(S)/RTSP 1: ",
    rtmpPushUrlAny2: "URL de Publicação RTMP(S)/RTSP 2: ",
    rtmpPushUrl: "URL de Publicação RTMP(S) {0}: ",
    rtspPushUrl: "URL de Publicação RTSP {0}: ",
    srtCallerUrl: "URL do Caller SRT: ",
    hlsPushUrl: "URL PUSH HLS: ",
    icecastPushUrl: "URL PUSH ICECAST: ",
    shoutcastPushUrl: "URL PUSH Shoutcast: ",
    whipLabel: "WHIP: ",
    viewers: "Visualizadores",
    viewersLabel: "Visualizadores: ",

    // TRTC status
    trtcRoomId: "ID da Sala TRTC: ",
    inRoom: "Na Sala",
    notInRoom: "Fora da Sala",
    initializingServer: "Inicializando conexão com servidor",
    serverDisconnected: "Servidor desconectado",
    connectingServer: "Conectando ao servidor",
    serverConnected: "Conectado ao servidor",
    networkUnknown: "Status de rede desconhecido",
    networkExcellent: "Rede excelente",
    networkGood: "Rede boa",
    networkNormal: "Rede normal",
    networkPoor: "Rede fraca",
    networkBad: "Rede ruim",
    networkNotMeet: "Rede não atende aos requisitos mínimos do TRTC",
    errorCode: "Código de Erro",
    errorCodeLabel: "Código de Erro: ",
    trtcError1: "Erro geral, verifique os arquivos de log",
    trtcError100: "Erro de lógica de negócio: chamada ilegal",
    trtcError101: "Erro de lógica de negócio: parâmetro ilegal",
    trtcError102: "Não é possível ler no momento, tente novamente",
    trtcError103: "Não é possível conectar à rede",
    trtcError200: "Falha ao entrar na sala",
    trtcError201: "Parâmetro user_sig inválido",
    trtcError202: "Formato de ID da sala inválido",
    trtcError203: "sdk_app_id inválido",
    trtcError204: "Serviço indisponível. Verifique se os minutos do pacote > 0 e se a conta Tencent Cloud não está vencida",
    trtcError205: "Usuário foi removido da sala pelo servidor",

    // WHIP status
    whipInitializing: "Inicializando",
    whipConnected: "Conectado",
    whipDisconnected: "Desconectado",
    whipUnknown: "Status Desconhecido",
    alirtcLabel: "AliRTC: ",
    alirtcConnecting: "Conectando",
    alirtcConnected: "Conectado",
    alirtcDisconnected: "Desconectado",
    alirtcUnknown: "Status Desconhecido",
    alirtcRoomId: "ID da Sala AliRTC: ",
    alirtcRoomIdLabel: "ID da Sala: ",
    alirtcUserIdLabel: "ID do Usuário: ",
    alirtcUserNameLabel: "Nome do Usuário: ",
    alirtcVideoBitrateLabel: "Vídeo: ",
    alirtcAudioBitrateLabel: "Áudio: ",
    alirtcRttLabel: "RTT: ",

    // GB28181
    gb28181: "GB28181: ",
    gb28181Online: "Online",
    gb28181Offline: "Offline"
  },

  // Reboot page
  reboot: {
    title: "Reiniciar Dispositivo",
    description: "Clique neste botão para reiniciar o codificador.",
    button: "Reiniciar",
    success: "Comando de reinício enviado!",
    failed: "Falha ao reiniciar!",
    confirm: "Tem certeza de que deseja reiniciar o dispositivo?"
  },

  // Factory reset page
  reset: {
    title: "Restauração de Fábrica",
    description: "Clique neste botão para restaurar todas as configurações do codificador para o padrão de fábrica.",
    button: "Restaurar",
    success: "Restauração de fábrica bem-sucedida! O sistema reiniciará automaticamente, aguarde.",
    failed: "Falha na restauração de fábrica!",
    confirm: "Tem certeza de que deseja restaurar as configurações de fábrica?"
  },

  // Scheduled reboot page
  scheduleRecord: {
    title: "Gravação programada",
    allDay: "Dia todo",
    timeRange: "Intervalo",
    segment: "Segmento",
    to: "a",
    monday: "Seg",
    tuesday: "Ter",
    wednesday: "Qua",
    thursday: "Qui",
    friday: "Sex",
    saturday: "Sáb",
    sunday: "Dom",
    nextDay: "(dia seg.)",
    hint: "Cada segmento pode ser Dia todo ou um Intervalo, com seus próprios dias ativos; num intervalo, um fim anterior ao início significa noturno (grava no dia seguinte, pelo dia de início). Sincronize a hora (NTP) em Rede, ou não será acionado.",
    saveSuccess: "Salvo com sucesso!",
    saveFailed: "Falha ao salvar!",
    invalidTime: "Hora inválida!",
    needWeekday: "Selecione pelo menos um dia!",
  },
  timedReboot: {
    title: "Reinício Programado",
    enable: "Reinício Programado",
    enableLabel: "Reinício Programado:",
    timeLabel: "Hora do Reinício:",
    enabled: "Ativar",
    disabled: "Desativar",
    time: "Hora do Reinício",
    weekdays: "Dias de Reinício",
    everyday: "Todos os dias",
    monday: "Segunda-feira",
    tuesday: "Terça-feira",
    wednesday: "Quarta-feira",
    thursday: "Quinta-feira",
    friday: "Sexta-feira",
    saturday: "Sábado",
    sunday: "Domingo",
    save: "Salvar",
    saveSuccess: "Configurações salvas!",
    saveFailed: "Falha nas configurações!",
    invalidTime: "Valor de hora inválido!"
  },

  // Network test page
  netTest: {
    title: "Teste de Rede e Log do Sistema",
    command: "Comando:",
    run: "Executar",
    address: "Endereço:",
    result: "Resultado:",
    invalidAddr: "Por favor, insira um endereço válido!"
  },

  // Record files page
  recordFiles: {
    title: "Lista de Arquivos",
    fileName: "Nome do Arquivo",
    time: "Hora",
    fileSize: "Tamanho do Arquivo",
    action: "Ação",
    delete: "Excluir",
    confirmDelete: "Tem certeza de que deseja excluir",
    deleteSuccess: "Comando de exclusão enviado com sucesso!",
    deleteFailed: "Falha ao excluir!",
    noFiles: "Nenhum arquivo de gravação",
    loadError: "Falha ao carregar"
  },

  // Password settings page
  password: {
    title: "Configurações de Senha",
    oldPassword: "Senha Antiga",
    oldPasswordLabel: "Senha Antiga:",
    newPassword: "Nova Senha",
    newPasswordLabel: "Nova Senha:",
    confirmPassword: "Confirmar Senha",
    confirmPasswordLabel: "Confirmar Senha:",
    save: "Salvar",
    success: "Configurações salvas!",
    failed: "Falha na configuração de senha, verifique se a senha antiga está correta!",
    mismatch: "As novas senhas não coincidem!",
    empty: "A senha não pode estar vazia!"
  },

  // Encoding common (only actually used keys)
  encoding: {
    sameAsInput: "Igual à resolução de entrada",
    mp3Required: "Por favor, defina a codificação de áudio para MP3!",
    choosePrimaryColor: "Escolher cor principal",
    toggleTheme: "Alternar tema"
  },

  // OSD settings
  osd: {
    title: "Configurações OSD",
    mainStream: "OSD Stream Principal",
    subStream1: "OSD Stream Secundário 1",
    subStream2: "OSD Stream Secundário 2",
    subStream3: "OSD Stream Secundário 3",
    alpha: "Transparência",
    alphaLabel: "Transparência:",
    alphaRange: "[0-255]",
    alphaError: "Transparência deve ser um inteiro entre 0-255!",
    region: "Região",
    regionLabel: "Região:",
    region1: "Região 1",
    region2: "Região 2",
    region3: "Região 3",
    region4: "Região 4",
    type: "Tipo",
    typeLabel: "Tipo:",
    typeText: "Texto",
    typeImage: "Imagem",
    typeScroll: "Texto Rolante",
    typeTime: "Hora",
    typeAudioStatus: "Estado do audio",
    typeVolumeMeter: "Medidor de volume",
    typeMosaic: "Mosaico",
    position: "Posição",
    positionLabel: "Posição:",
    speed: "Velocidade",
    speedLabel: "Velocidade:",
    xLabel: "X:",
    yLabel: "Y:",
    textLabel: "Texto:",
    fontSize: "Tamanho da Fonte",
    fontSizeLabel: "Tamanho da Fonte:",
    fontSizeRange: "[8-72]",
    backgroundColor: "Cor de Fundo",
    backgroundLabel: "Cor de Fundo:",
    sizeLabel: "Tamanho (L×A):",
    sizeHint: "[px]",
    blkSizeLabel: "Tamanho do bloco:",
    sizeError: "{0}: o tamanho (L×A) deve ser inteiros positivos válidos",
    bgTransparent: "Transparente",
    bgWhite: "Branco",
    bgBlack: "Preto",
    fontColor: "Cor da Fonte",
    fontColorLabel: "Cor da Fonte:",
    pickColor: "Escolher Cor",
    closeColor: "Fechar",
    logoLabel: "LOGO:",
    success: "Configurações salvas com sucesso!",
    failed: "Falha nas configurações!",
    xRangeError: "{0} O valor X deve ser um inteiro entre 0-{1}!",
    yRangeError: "{0} O valor Y deve ser um inteiro entre 0-{1}!",
    textEmpty: "{0} O texto não pode estar vazio!",
    fontSizeError: "{0} O tamanho da fonte deve ser um inteiro entre 8-72!",
    speedRangeError: "{0} O valor de velocidade deve ser um inteiro entre 0-30!",
    positionRangeError: "{0} O valor de posição deve ser um inteiro entre 0-{1}!",
    selectLogo: "Por favor, selecione um LOGO para {0}!",
    webrtcPreview: "Pré-visualização de vídeo"
  },

  // LOGO upload
  logo: {
    title: "Upload de Logo",
    logoLabel: "LOGO:",
    upload: "Enviar",
    hint: "Envie uma imagem com menos de 500 KB. Formatos suportados: PNG / JPG / BMP (para transparência use um PNG ou BMP de 32 bits com canal alfa).",
    hint2: "O nome do arquivo deve ser logo1 / logo2 / logo3 / logo4, extensão .png / .jpg / .jpeg / .bmp.",
    hint3: "ex.: logo1.png, logo1.jpg, logo1.jpeg, logo1.bmp",
    noFileSelected: "Por favor, selecione um arquivo para enviar!",
    invalidFile: "Por favor, envie imagens conforme solicitado!",
    uploadSuccess: "Upload bem-sucedido!",
    uploadFailed: "Falha no upload!",
    imageSizeExceeded: "Tamanho do arquivo de imagem excedeu o limite!",
    imageResolutionExceeded: "Resolução do arquivo de imagem excedeu o limite!",
    storageInsufficient: "Arquivo de atualização muito grande, espaço de armazenamento insuficiente!",
    listTitle: "LOGO enviado",
    refresh: "Atualizar",
    preview: "Pré-visualização",
    logoFile: "Arquivo LOGO",
    fileType: "Tipo",
    fileSize: "Tamanho",
    operation: "Operação",
    loading: "Carregando...",
    emptyList: "Nenhum LOGO enviado",
    loadListFailed: "Falha ao carregar a lista de LOGO",
    confirmDelete: "Excluir {0}?\nOs arquivos PNG/BMP com o mesmo nome também serão excluídos. Se este LOGO estiver em uso, o OSD de imagem relacionado será limpo.",
    deleteSuccess: "Excluído com sucesso!",
    deleteFailed: "Falha ao excluir!"
  },

  // WIFI settings
  wifi: {
    title: "Configurações WiFi",
    mode: "Modo",
    ap: "Ponto de Acesso",
    sta: "Modo Cliente",
    ssid: "SSID",
    password: "Senha",
    security: "Segurança",
    channel: "Canal",
    scan: "Escanear",
    connect: "Conectar",
    disconnect: "Desconectar",
    status: "Status",
    connected: "Conectado",
    disconnected: "Desconectado",
    signalStrength: "Intensidade do Sinal",
    basicSettings: "Configurações Básicas",
    wifiModule: "Módulo WiFi:",
    wifiMode: "Modo WiFi:",
    staMode: "Modo STA",
    apMode: "Modo AP",
    mainConfig: "Config Principal WiFi",
    backupConfig1: "Config Backup WiFi 1",
    backupConfig2: "Config Backup WiFi 2",
    apModeSettings: "Modo AP",
    wifiList: "Lista WiFi:",
    wifiEssid: "ESSID WiFi:",
    wifiPassword: "Senha WiFi:",
    wifiDhcp: "DHCP WiFi:",
    wifiIp: "IP WiFi:",
    wifiNetmask: "Máscara de Rede WiFi:",
    wifiGateway: "Gateway WiFi:",
    backupEnable1: "Config Backup 1:",
    backupEnable2: "Config Backup 2:",
    wifiBand: "Banda WiFi:",
    wifiChannel: "Canal WiFi:",
    refresh: "Atualizar",
    success: "Configurações salvas com sucesso!",
    failed: "Falha ao salvar configurações!",
    mainConfigEmpty: "Config Principal WiFi: {0} não pode estar vazio!",
    mainConfigInvalid: "Config Principal WiFi: formato de {0} é inválido!",
    backupConfigEmpty: "WiFi {0}: {1} não pode estar vazio!",
    backupConfigInvalid: "WiFi {0}: formato de {1} é inválido!",
    ipAddr: "Endereço IP",
    netmask: "Máscara de Rede",
    gateway: "Gateway",
    essidEmpty: "O nome do WiFi não pode estar vazio!",
    passwordTooShort: "A senha do WiFi deve ter pelo menos 8 caracteres!"
  },


  // Upgrade and backup
  updateBackup: {
    title: "Atualização do Sistema",
    uploadTitle: "Enviar Firmware e Configuração",
    backupTitle: "Backup de Firmware e Configuração",
    systemVersion: "Versão do Sistema",
    systemVersionLabel: "Versão do Sistema: ",
    hardware: "Hardware",
    hardwareLabel: "Hardware: ",
    selectFile: "Selecionar Arquivo",
    selectFileLabel: "Selecionar Arquivo:",
    uploadHint: "Nome do arquivo de upload: up.rar ou box.ini",
    uploadWarning: "Não envie simultaneamente. Não desligue durante o upload.",
    upload: "Enviar",
    backupFirmware: "Backup do Firmware",
    backupConfig: "Backup da Configuração",
    noFileSelected: "Por favor, selecione um arquivo para enviar!",
    uploadSuccess: "Upload bem-sucedido, por favor reinicie o sistema!",
    uploadFailed: "Falha no upload!",
    kernelUpdating: "A atualização do kernel leva alguns minutos; não desligue o dispositivo. O dispositivo reiniciará automaticamente ao concluir — não é necessário reiniciar manualmente.",
    kernelUpdatingBin: "A atualização do kernel leva alguns minutos; não desligue o dispositivo. O dispositivo reiniciará automaticamente ao concluir — não é necessário reiniciar manualmente!",
    imageSizeExceeded: "Tamanho do arquivo de imagem excedeu o limite!",
    imageResolutionExceeded: "Resolução do arquivo de imagem excedeu o limite!",
    storageInsufficient: "Arquivo de atualização muito grande, espaço de armazenamento insuficiente!"
  },

  // Serial transport settings
  serial: {
    title: "Transporte Serial",
    frpTitle: "Configurações do Cliente FRP",
    serialTitle: "Passagem de Porta Serial",
    enable: "Ativar",
    disable: "Desativar",
    enableLabel: "Ativar:",
    serverAddr: "Endereço do Servidor",
    serverAddrLabel: "Endereço do Servidor:",
    serverPort: "Porta do Servidor",
    serverPortLabel: "Porta do Servidor:",
    serverToken: "Token do Servidor",
    serverTokenLabel: "Token do Servidor:",
    channel: "Canal",
    channel1: "Canal 1",
    channel2: "Canal 2",
    channel3: "Canal 3",
    channel4: "Canal 4",
    protocolLabel: "Protocolo:",
    localPort: "Porta Local",
    localPortLabel: "Porta Local:",
    remotePort: "Porta Remota",
    remotePortLabel: "Porta Remota:",
    serialMode: "Modo Serial",
    serialModeLabel: "Modo:",
    server: "Servidor",
    client: "Cliente",
    baudRate: "Taxa de Transmissão",
    baudRateLabel: "Taxa de Transmissão:",
    listenPort: "Porta de Escuta",
    listenPortLabel: "Porta de Escuta:",
    save: "Salvar",
    success: "Configurações salvas, por favor reinicie o dispositivo!",
    failed: "Falha nas configurações!",
    emptyError: "As configurações não podem estar vazias!",
    remoteAddrError: "Endereço do servidor remoto inválido (insira um IP ou nome de host válido)!",
    portRangeError: "A porta de escuta TCP deve ser um inteiro entre 1-65535!",
    frpAddrEmpty: "O endereço do servidor FRP não pode estar vazio!",
    frpPortError: "A porta do servidor FRP deve ser um inteiro entre 1-65535!"
  },

  // Advanced Settings
  advanced: {
    title: "Configurações Avançadas",
    // Section titles
    videoInput: "Entrada de Vídeo",
    avTransmission: "Transmissão A/V",
    recordSettings: "Configurações de Gravação",
    hlsSettings: "Configurações HLS",
    networkTransmission: "Transmissão de Stream",
    serviceSettings: "Configurações de Serviço",
    logSettings: "Configurações de Log",
    encoderParams: "Parâmetros do Codificador",
    imageEnhancement: "Melhoria de Imagem",
    autoRestart: "Reinício Automático",
    // Video Input
    edidSelect: "Seleção EDID:",
    colorGamut: "Gama de Cores:",
    colorRange: "Faixa de Cores:",
    interlaceMode: "Modo Entrelaçado:",
    noSignal: "Sem Sinal:",
    vgaAutoAdjust: "Ajuste Automático VGA na Inicialização:",
    interlaceWeaving: "Entrelaçamento (mesclar campos)",
    interlaceBottom: "Apenas campo inferior",
    interlaceTop: "Apenas campo superior",
    interlaceBobbing: "Bobbing (campo para quadro)",
    noSignalHide: "Ocultar",
    noSignalImage: "Mostrar imagem",
    noSignalColor: "Mostrar cor sólida",
    noVideoRestartStream: "Reiniciar stream sem sinal:",
    // A/V Transmission
    videoOnly: "Apenas Vídeo:",
    audioOnly: "Apenas Áudio:",
    avSync: "Sincronia A/V:",
    audioDelay: "Atraso de Áudio (ms):",
    syncAuto: "Auto",
    syncResample: "Reamostrar",
    audioDelayHint: "Valores negativos adiantam o áudio, positivos atrasam. Use apenas para ajuste de sincronia A/V.",
    // Recording Settings
    recordType: "Tipo de Gravação:",
    cycleRecord: "Gravação Cíclica:",
    diskOverwriteOldest: "Excluir os mais antigos quando cheio:",
    noRecordNoSig: "Sem gravação sem sinal:",
    recordSplitTime: "Tempo de Divisão de Gravação (seg):",
    // HLS Settings
    hlsSplitTime: "Tempo de Segmento HLS (seg):",
    hlsBufferNum: "Contagem de Segmentos HLS:",
    hlsIndexUri: "URI de Índice Global HLS:",
    // Network Transmission
    tsMuxer: "Muxer TS:",
    netDropThreshold: "Limite de Descarte de Pacotes:",
    tsOnce: "Pacotes TS por Envio:",
    rtspPackType: "Encapsulamento RTSP:",
    multicastType: "Tipo Multicast:",
    enableSap: "Ativar SAP:",
    mtuSize: "Tamanho MTU:",
    udpTtl: "TTL UDP:",
    udpSockBuf: "UDP SOCKET_BUF_SIZE:",
    rtpH264PacketMode: "Empacotamento RTP H264:",
    packetizeByAccessUnit: "packetize_by_access_unit",
    packetizeByNalu: "packetize_by_nalu",
    vlcCompat: "Compatível com VLC",
    ffmpegCompat: "Compatível com FFMPEG",
    esStream: "Stream ES",
    tsStream: "Stream TS",
    // Service Settings
    tsRtspAuth: "Autenticação TS/RTSP Necessária:",
    httpNoAuth: "Acesso Web Sem Autenticação:",
    netCheck: "Verificação de Status de Rede:",
    telnetService: "Serviço Telnet:",
    sshService: "Serviço SSH:",
    sambaService: "Serviço Samba:",
    onvifService: "Serviço ONVIF:",
    onvifLocation: "ONVIF Location:",
    onvifMode: "Modo ONVIF:",
    onvifModeLegacy: "Legacy XML (porta HTTP/ONVIF compartilhada)",
    onvifModeProfileST: "Profile S/T (porta ONVIF dedicada)",
    onvifModeProfileSCompat: "Profile S compatível com Hikvision (porta ONVIF dedicada)",
    rtspDefaultStream: "Stream Padrão RTSP:",
    vmixCompat: "Compatível com VMix:",
    telnetLan: "Apenas LAN",
    // Log Settings
    localLog: "Serviço de Log Local:",
    trtcLogLevel: "Nível de log do SDK TRTC:",
    alirtcLogLevel: "Nível de log do SDK AliRTC:",
    sdkLogDebug: "Depuração",
    sdkLogInfo: "Informação",
    sdkLogWarning: "Aviso",
    sdkLogError: "Erro",
    sdkLogFatal: "Fatal",
    sdkLogNone: "Nenhum",
    lokiAddr: "Endereço do Servidor Loki:",
    lokiPort: "Porta do Servidor Loki:",
    // Encoder Parameters
    sliceSplit: "Divisão SLICE:",
    sliceBytes: "Bytes SLICE:",
    minQp: "MIN_QP:",
    maxQp: "MAX_QP:",
    debreath: "Debreathing:",
    sar: "SAR:",
    cbrOnlyHint: "Efetivo apenas quando o modo de controle de taxa está definido como CBR",
    // Image Enhancement
    contrastEnhance: "Melhoria de Contraste:",
    sharpnessEnhance: "Melhoria de Nitidez:",
    lumaSfStrength: "Redução de Ruído Espacial Luma:",
    lumaTfStrength: "Redução de Ruído Temporal Luma:",
    chromaSfStrength: "Redução de Ruído Espacial Chroma:",
    chromaTfStrength: "Redução de Ruído Temporal Chroma:",
    // Auto Restart
    kickAllOnChange: "Desconectar Usuários na Mudança de Entrada:",
    noVideoReboot: "Reinício Automático Sem Vídeo:",
    noAudioReboot: "Reinício Automático Sem Áudio:",
    // Button
    save: "Salvar",
    // Messages
    success: "Configurações salvas, por favor reinicie o dispositivo!",
    failed: "Falha nas configurações!",
    emptyError: "As configurações não podem estar vazias!",
    netDropError: "O limite de descarte de pacotes deve ser um inteiro entre 50-50000!",
    tsOnceError: "Pacotes TS por envio deve ser um inteiro entre 1-128!",
    sliceError: "Bytes SLICE deve ser um inteiro entre 128-65535!",
    minQpError: "MIN_QP deve ser um inteiro entre 1-35!",
    maxQpError: "MAX_QP deve ser maior que MIN_QP e no máximo 50!",
    udpTtlError: "TTL UDP deve ser um inteiro entre 1-254!",
    contrastError: "Melhoria de contraste deve ser um inteiro entre 0-63!",
    sharpnessError: "Melhoria de nitidez deve ser um inteiro entre 0-16!",
    lumaSfError: "Redução de ruído espacial luma deve ser um inteiro entre 0-255!",
    lumaTfError: "Redução de ruído temporal luma deve ser um inteiro entre 0-63!",
    chromaSfError: "Redução de ruído espacial chroma deve ser um inteiro entre 0-255!",
    chromaTfError: "Redução de ruído temporal chroma deve ser um inteiro entre 0-32!",
    hlsSplitError: "Tempo de segmento HLS deve ser um inteiro entre 3-20!",
    hlsBufferError: "Contagem de segmentos HLS deve ser um inteiro entre 3-20!",
    hlsUriError: "Formato de URI de índice global HLS é inválido!",
    udpSockBufError: "UDP SOCKET_BUF_SIZE deve ser um inteiro entre 0-20971520!",
    mtuError: "Tamanho MTU deve ser um inteiro entre 500-1500!",
    audioCacheError: "Atraso de áudio deve ser um inteiro entre -2000 e 2000!",
    recordSplitError: "Tempo de divisão de gravação deve ser um inteiro entre 60-7200!",
    lokiPortError: "Porta do servidor Loki deve estar entre 1-65535"
  },

  // Audio Encoding Settings
  audioEnc: {
    blkInput: "Entrada",
    blkEncode: "Codificação",
    blkVolume: "Volume",
    blkVolumeNote: "Ganho fixo manual",
    blkAgc: "Ganho automático",
    blkAgcNote: "Nivela automaticamente o volume variável ao alvo",
    blkDenoise: "Redução de ruído",
    blkDenoiseNote: "Suprime o ruído de fundo; uso alto de CPU, normalmente desativado",
    mute: "Mudo",
    gain0: "0 dB (inalterado)",
    title: "Configurações de Áudio",
    // Tabs
    tabAudio: "Configurações de Áudio",
    tabOnvif: "Áudio ONVIF",
    // Tips
    tipAudio: "Não defina o ganho de volume digital muito alto, pois pode causar distorção ou introduzir ruído.<br>Na maioria dos casos, defina o ganho como 0.<br>Ajuste o volume geral usando os controles frontais.",
    tipVolVsAgc: "<b>Ganho de volume vs ganho automático (AGC)</b><br>O ganho de volume é um ganho fixo definido manualmente: valores positivos amplificam e negativos atenuam. Não varia com o sinal de entrada, sendo adequado para fontes com nível estável e previsível.<br>O ganho automático (AGC) ajusta o ganho conforme o nível em tempo real do sinal de entrada, mantém a saída perto do nível-alvo e suaviza o áudio que varia entre alto e baixo.<br>Com o AGC ativado, mantenha o ganho de volume em 0 dB para que o AGC controle o nível sozinho e evite sobrepor dois controles.",
    tipAgcLevel: "<b>Nível-alvo do AGC (dBFS)</b><br>Define a referência de nível final. Quanto mais próximo o alvo estiver de 0 dBFS, mais alta será a saída, mas menor será a margem para picos transitórios e mais facilmente ocorrerá clipping.<br>• -18 dBFS (recomendado): equilíbrio entre volume e margem, adequado para a maioria dos casos.<br>• -12 dBFS: a opção mais alta, ideal para transmissões ao vivo e outros cenários de alto volume; mas com apenas 12 dB de margem, sons altos repentinos sofrem clipping facilmente.<br>• -20 ~ -24 dBFS: adequado para voz, apresentações ao vivo e outras entradas com grandes variações de pico.<br>• -30 ~ -42 dBFS: adequado para entradas de microfone de alto ganho ou ambientes ruidosos.",
    tipOnvif: "Para conectar ao NVR, defina a codificação RTSP G711 como 'Ativar e reamostrar para 8K'",
    // Audio Settings
    audioInput: "Entrada de Áudio:",
    sampleRate: "Taxa de Amostragem:",
    codec: "Codec:",
    channel: "Canais:",
    bitrate: "Taxa de Bits:",
    digitalGain: "Ganho de Volume Digital:",
    analogGain: "Ganho de Volume Analógico:",
    denoise: "Redução de Ruído:",
    denoiseStrength: "Força da Redução de Ruído (dB):",
    agc: "Controle automático de ganho:",
    agcLevel: "Nível alvo AGC (dBFS):",
    pteG711: "Stream PTE G711:",
    // Audio Input Options
    inputDigital: "Digital",
    inputAnalog: "Analógico",
    inputMixed: "Misto",
    // Sample Rate Options
    sampleSameAsInput: "Igual à entrada",
    // ONVIF Audio
    rtspG711: "Codificação RTSP G711:",
    rtspG711Resample: "Ativar e reamostrar para 8K",
    g711Codec: "Codec G711:",
    // Buttons and Messages
    save: "Salvar",
    success: "Configurações salvas!",
    failed: "Falha nas configurações!",
    emptyError: "As configurações não podem estar vazias!",
    bitrateError: "Taxa de bits deve ser um inteiro entre {0}-{1}!",
    gainError: "Ganho de volume digital deve ser um inteiro entre -50 e 50!",
    denoiseError: "Força da redução de ruído deve ser um inteiro entre 1-100!",
    agcLevelError: "O nível alvo do AGC deve estar entre -42 e -12 dBFS!",
    analogVolEmpty: "Ganho de volume analógico não pode estar vazio!",
    analogVolError: "Ganho de volume analógico deve ser um inteiro entre {0} e {1}!"
  },

  // Recording Settings Page
  recordSet: {
    title: "Configurações de Gravação",
    // Card Titles
    statusTitle: "Status de Gravação",
    settingsTitle: "Configurações de Gravação",
    // Status
    recordType: "Tipo de Gravação:",
    diskStatus: "Status do Disco:",
    currentAddr: "Endereço Atual:",
    mountDevice: "Dispositivo de Montagem:",
    mountStatus: "Status de Montagem:",
    totalSpace: "Espaço Total:",
    freeSpace: "Espaço Livre:",
    recordStatus: "Status de Gravação:",
    recordFiles: "Arquivos de Gravação:",
    fileList: "Lista de Arquivos",
    // Disk Status
    diskNotExist: "Não Presente",
    diskFull: "Disco Cheio",
    diskSlow: "Disco Muito Lento",
    mounted: "Montado",
    unmounted: "Desmontado",
    notRecording: "Não Gravando",
    recording: "Gravando",
    noVideoWarning: " (Arquivos podem não ser salvos sem entrada de vídeo)",
    // Action Links
    startRecord: "(Iniciar Gravação)",
    stopRecord: "(Parar Gravação)",
    mountDisk: "(Montar Disco)",
    unmountDisk: "(Desmontar Disco)",
    deleteAll: "(Excluir Todas as Gravações)",
    // Settings
    storageType: "Tipo de Armazenamento:",
    partition: "Partição:",
    partitionInfo: "Info da Partição:",
    diskInfo: "Info do Disco:",
    formatDisk: "(Reformatar Disco)",
    exampleAddr: "Endereço de Exemplo:",
    storageAddr: "Endereço de Armazenamento:",
    username: "Nome de Usuário:",
    password: "Senha:",
    // Storage Type Options
    storageDisabled: "Desativado",
    storageUsb: "USB/Cartão TF",
    storageNfs: "NFS",
    storageSamba: "SAMBA/CIFS",
    // Format Dialog
    formatTitle: "Informação do Disco",
    formatDevice: "Dispositivo:",
    formatType: "Tipo:",
    formatModel: "Modelo:",
    formatRemovable: "Removível:",
    formatPartTable: "Tabela de Partição:",
    formatCapacity: "Capacidade:",
    formatPartitions: "Informação de Partições",
    formatPartition: "Partição",
    formatAvailable: "(disponível)",
    formatTotal: "(total)",
    formatConfirm: "Continuar com a formatação do disco?",
    formatDanger: "Aviso: A formatação irá reparticionar e todos os dados serão perdidos. Continuar?",
    formatContinue: "Continuar",
    formatCancel: "Cancelar",
    formatConfirmBtn: "Confirmar",
    formatting: "Formatando...",
    // Buttons and Messages
    save: "Salvar",
    yes: "Sim",
    no: "Não",
    success: "Configurações salvas!",
    failed: "Falha nas configurações!",
    formatSuccess: "Formatação bem-sucedida!",
    formatFailed: "Falha na formatação!",
    deleteSuccess: "Comando de exclusão enviado!",
    deleteFailed: "Falha na exclusão!",
    confirmDeleteAll: "Excluir todos os arquivos de gravação?",
    recordingWarning: "Gravação em andamento. Pare a gravação antes de desmontar.",
    diskMountedWarning: "O disco está montado. Desmonte antes de formatar.",
    diskMountedSettingWarning: "O disco está montado. Desmonte antes de alterar as configurações.",
    storageLockedHint: "Bloqueado enquanto montado; desmonte o disco para alterar.",
    partitionNotExist: "A partição não existe",
    partitionRemoved: " (Removida)",
    unpartitioned: " (sem partições)",
    unpartitionedHint: "O disco não tem partições, reparticione e formate o disco primeiro",
    // Address Validation
    addrEmpty: "O endereço de armazenamento não pode estar vazio!",
    addrNfsFormat: "Formato de endereço inválido, deve conter o separador ':'",
    addrIpError: "Formato de endereço IP inválido",
    addrPathSlash: "O caminho deve começar com '/'",
    addrPathInvalid: "O caminho contém caracteres inválidos",
    addrSambaStart: "O endereço deve começar com '\\\\'",
    addrSambaFormat: "Endereço inválido, deve conter IP e caminho separados por '\\'",
    addrPathEmpty: "O caminho não pode estar vazio",
    addrPathChars: "O caminho contém caracteres inválidos, apenas letras, números, sublinhados e hifens são permitidos",
    // Disk size info "{available} / {total}"
    diskSizeInfo: "{0} (disponível) / {1} (total)"
  },
  // GB28181 Settings
  gb28181: {
    title: "Configurações GB28181",
    basicSettings: "Configurações Básicas",
    heartbeatSettings: "Configurações de Heartbeat",
    sipServerSettings: "Configurações do Servidor SIP",
    authSettings: "Configurações de Autenticação",
    enable: "Ativar:",
    disabled: "Desativado",
    enabled: "Ativado",
    localSipPort: "Porta SIP Local:",
    videoChannelId: "ID do Canal de Vídeo:",
    streamSelect: "Seleção de Stream:",
    mainStream: "Stream Principal",
    subStream1: "Stream Secundário 1",
    subStream2: "Stream Secundário 2",
    subStream3: "Stream Secundário 3",
    regExpiry: "Expiração de Registro:",
    heartbeatCycle: "Ciclo de Heartbeat:",
    maxHeartbeatTimeout: "Timeout Máximo de Heartbeat:",
    sipServerId: "ID do Servidor SIP:",
    sipServerDomain: "Domínio do Servidor SIP:",
    sipServerAddr: "Endereço do Servidor SIP:",
    sipServerPort: "Porta do Servidor SIP:",
    sipUserId: "ID de Usuário SIP:",
    sipPassword: "Senha SIP:",
    emptyError: "As configurações não podem estar vazias!",
    localPortError: "A porta SIP local deve ser um inteiro entre 1-65535!",
    serverPortError: "A porta do servidor SIP deve ser um inteiro entre 1-65535!",
    regExpiryError: "A expiração de registro deve ser um inteiro entre 100-100000!",
    heartbeatError: "O ciclo de heartbeat deve ser um inteiro entre 5-3600!",
    maxTimeoutError: "O timeout máximo de heartbeat deve ser um inteiro entre 3-255!",
    success: "Configurações salvas com sucesso!",
    failed: "Falha nas configurações!"
  },
  // Video Source Settings
  videoSource: {
    title: "Configurações de Fonte de Vídeo",
    videoInput: "Configurações de Entrada de Vídeo",
    brightAdjust: "Ajuste de Brilho de Entrada",
    videoOutput: "Configurações de Saída de Vídeo",
    inputFormat: "Formato de Entrada de Vídeo:",
    yuv422: "YUV422",
    yuv420: "YUV420 (Rotação Suportada)",
    rotation: "Ângulo de Rotação:",
    flipMirror: "Inverter/Espelhar:",
    flipDisable: "Desativado",
    mirror: "Espelhar",
    flip: "Inverter",
    flipAndMirror: "Espelhar e Inverter",
    cropEnable: "Recorte de Vídeo:",
    cropLeft: "Ponto Inicial do Recorte (Esquerda):",
    cropTop: "Ponto Inicial do Recorte (Topo):",
    cropWidth: "Largura do Recorte:",
    cropHeight: "Altura do Recorte:",
    colorMode: "Modo de Cor de Entrada:",
    unknown: "Desconhecido",
    brightEnable: "Ajuste de Brilho:",
    gain: "Ganho:",
    gainHint: "[10-1000], padrão 100",
    offset: "Deslocamento:",
    offsetHint: "[0-100], padrão 0",
    note: "Nota:",
    brightNote1: "1. Brilho = (Brilho Original * Ganho / 100) + Deslocamento",
    brightNote2: "2. O ajuste de brilho só funciona no modo de cor de entrada RGB",
    outputRes: "Resolução de Saída de Vídeo:",
    auto: "Auto",
    cscEnable: "Ajuste CSC:",
    luminance: "Luminância:",
    contrast: "Contraste:",
    hue: "Matiz:",
    saturation: "Saturação:",
    cscHint: "[0-100], padrão 50",
    rotateHint: "A rotação só é suportada quando o formato de entrada de vídeo é YUV420.",
    emptyError: "As configurações não podem estar vazias!",
    gainError: "O ganho deve ser um inteiro entre 10-1000!",
    offsetError: "O deslocamento deve ser um inteiro entre 0-100!",
    leftError: "O valor da esquerda deve ser um inteiro entre 0-{0}!",
    topError: "O valor do topo deve ser um inteiro entre 0-{0}!",
    widthError: "O valor da largura deve ser um inteiro entre 400-{0}!",
    heightError: "O valor da altura deve ser um inteiro entre 400-{0}!",
    luminanceError: "A luminância deve ser um inteiro entre 0-100!",
    contrastError: "O contraste deve ser um inteiro entre 0-100!",
    hueError: "O matiz deve ser um inteiro entre 0-100!",
    saturationError: "A saturação deve ser um inteiro entre 0-100!",
    success: "Configurações salvas com sucesso!",
    failed: "Falha nas configurações!"
  },
  // Network Settings
  network: {
    title: "Configurações de Rede",
    ipv4Title: "Configurações IPv4",
    ipv6Status: "Status IPv6",
    ipv6Title: "Configurações IPv6",
    ipv6TypeGlobal: "IP Global",
    ipv6TypeLinkLocal: "IP Local de Link",
    ipv6TypeUniqueLocal: "IP Local",
    ipv6TypeMulticast: "IP Multicast",
    ipv6TypeGeneric: "IP",
    ipv6StatusGateway: "Gateway",
    dnsTitle: "Configurações DNS",
    ntpTitle: "Configurações NTP",
    portTitle: "Configurações de Porta",
    httpsTitle: "Configurações HTTPS",
    hostnameTitle: "Configurações de HOSTNAME",
    dhcp: "DHCP:",
    dhcpHint: "Após ativar o DHCP, o dispositivo pode ser encontrado por ferramentas de busca compatíveis com ONVIF.",
    ipAddr: "Endereço IP:",
    netmask: "Máscara de Sub-rede:",
    gateway: "Gateway com Fio:",
    macAddr: "Endereço MAC:",
    defaultGateway: "Gateway Padrão:",
    lanFirst: "Com Fio Primeiro",
    wifiFirst: "WiFi Primeiro",
    g4First: "4G/5G Primeiro",
    ipv6Mode: "Modo:",
    ipv6Disable: "Desativado",
    ipv6Auto: "Configuração Automática",
    ipv6Manual: "Configuração Manual",
    ipv6Addr: "Endereço IPv6:",
    ipv6Prefix: "Comprimento do Prefixo IPv6:",
    ipv6Gateway: "Gateway Padrão IPv6:",
    dns1: "DNS1:",
    dns2: "DNS2:",
    ntpSync: "Sincronização NTP:",
    ntpServer: "Servidor:",
    timezone: "Fuso Horário:",
    httpPort1: "Porta HTTP 1:",
    httpPort2: "Porta HTTP 2:",
    rtspPort1: "Porta RTSP 1:",
    rtspPort2: "Porta RTSP 2:",
    onvifPort: "Porta ONVIF:",
    sadpProtocol: "Porta SADP:",
    httpsService: "Serviço HTTPS:",
    httpsPort1: "Porta HTTPS 1:",
    httpsPort2: "Porta HTTPS 2:",
    httpsPrivatePass: "Senha da Chave Privada 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: "(Deixe vazio se não houver senha)",
    uploadCert: "Enviar Certificado:",
    uploadCertHint: "(O nome do arquivo deve ser private.key ou public.crt. Não envie simultaneamente ou desligue durante o upload)",
    uploadBtn: "Enviar Certificado",
    deleteCert: "Excluir Certificado",
    hostname: "HOSTNAME:",
    mdnsService: "Serviço mDNS:",
    mdnsAddr: "Endereço de Acesso mDNS:",
    portRange: "[1-65535]",
    prefixRange: "[0-128]",
    emptyError: "As configurações não podem estar vazias!",
    ipError: "Formato de endereço IP inválido!",
    netmaskError: "Formato de máscara de sub-rede inválido!",
    gatewayError: "Formato de gateway inválido!",
    dns1Error: "Formato de DNS primário inválido!",
    dns2Error: "Formato de DNS secundário inválido!",
    macError: "Formato de endereço MAC inválido!",
    ipv6Error: "Formato de endereço IPv6 inválido!",
    ipv6PrefixError: "Comprimento de prefixo IPv6 inválido (1-128)!",
    ipv6GatewayError: "Formato de gateway IPv6 inválido!",
    httpPort1Error: "A porta HTTP 1 deve ser um inteiro entre 1-65535!",
    httpPort2Error: "A porta HTTP 2 deve ser um inteiro entre 1-65535!",
    rtspPort1Error: "A porta RTSP 1 deve ser um inteiro entre 1-65535!",
    rtspPort2Error: "A porta RTSP 2 deve ser um inteiro entre 1-65535!",
    httpsPort1Error: "A porta HTTPS 1 deve ser um inteiro entre 1-65535!",
    httpsPort2Error: "A porta HTTPS 2 deve ser um inteiro entre 1-65535!",
    onvifPortError: "A porta ONVIF deve ser um inteiro entre 1-65535!",
    sadpPortError: "A porta SADP deve ser um inteiro entre 1-65535!",
    httpBothDisableError: "A porta HTTP 1 e a porta 2 não podem estar ambas desativadas!",
    httpsBothDisableError: "Quando HTTPS está ativado, a porta 1 e a porta 2 não podem estar ambas desativadas!",
    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: "O servidor NTP não pode estar vazio!",
    ntpFormatError: "Endereço do servidor NTP inválido!",
    hostnameEmptyError: "HOSTNAME não pode estar vazio!",
    hostnameFormatError: "HOSTNAME inválido!\n\n1. HOSTNAME não pode exceder 63 caracteres!\n2. Apenas letras (a-z), números (0-9), hifens (-) e sublinhados (_) são permitidos!\n3. '-' e '_' não podem aparecer consecutivamente, sozinhos, ou no início/fim!",
    deleteCertConfirm: "Tem certeza de que deseja excluir o certificado HTTPS enviado?",
    selectFile: "Por favor, selecione um arquivo para enviar!",
    uploadSuccess: "Upload bem-sucedido!",
    uploadFailed: "Falha no upload!",
    fileSizeError: "O tamanho do arquivo de imagem excede o limite!",
    fileResError: "A resolução da imagem excede o limite!",
    spaceError: "Arquivo de atualização muito grande, espaço de armazenamento insuficiente!",
    deleteSuccess: "Excluído com sucesso!",
    deleteFailed: "Falha ao excluir!",
    successReboot: "Configurações salvas, por favor reinicie o dispositivo!",
    failed: "Falha nas configurações!"
  },

  // Output Settings Page (Stream Settings)
  output: {
    // Tab names
    tabs: {
      encode: "Codificação",
      ts: "TS/Multicast",
      rtsp: "RTSP",
      rtmp: "RTMP",
      srt: "SRT",
      webrtc: "WebRTC",
      trtc: "TRTC",
      alirtc: "AliRTC",
      hls: "HLS",
      other: "MP4/FLV/Outro"
    },

    // Encoding settings
    encode: {
      codecType: "Tipo de Codec:",
      frameRate: "Taxa de Quadros:",
      sameAsInput: "Igual à entrada",
      auto: "Auto",
      customFrameRate: "Taxa de quadros personalizada",
      customFrameRateLabel: "Taxa de Quadros Personalizada:",
      gopInterval: "Intervalo GOP (quadros):",
      bitrate: "Taxa de Bits (kbit):",
      qualityRange: "Faixa de Qualidade:",
      qualityStrict: "Estrito (Alto)",
      qualityTight: "Apertado (Quase-Alto~Alto)",
      qualityNormal: "Normal (Médio~Alto)",
      qualityLoose: "Solto (Quase-Baixo~Alto)",
      qualityWide: "Amplo (Baixo~Alto)",
      mjpegQuality: "Qualidade MJPEG:",
      outputResolution: "Resolução de Saída:",
      h264Profile: "Perfil H.264:",
      bitrateControl: "Controle de Taxa de Bits:",
      // Tips
      tipCodec: "H.265 oferece melhor qualidade de vídeo que H.264. Use H.265 se seu decodificador suportar.",
      tipVbr: "No modo VBR, a taxa de bits é regulada por \"Faixa de Qualidade\"; Faixa de Qualidade limita valores QP;<br>Selecionar \"Quase-Alto~Alto\" ou \"Alto\" resulta em taxa de bits real muito alta, tornando a taxa de bits definida sem significado;<br>Apenas quando a Faixa de Qualidade é \"Quase-Baixo~Alto\" a taxa de bits tem valor de referência;",
      tipCbr: "\"CBR Forte\" é usado para sistemas CATV para garantir taxa de bits TS estável. Com \"CBR Forte\" em 1080P, a taxa de bits não deve ser inferior a 5000kbit/s, 8000kbit/s recomendado.",
      tipGop: "Assumindo que a taxa de quadros de vídeo de entrada é n, valores comuns são 60, 50, 30, 25;<br>O intervalo GOP é tipicamente definido como n * 2, valores comuns são 120, 100, 60, 50;<br>Quando a taxa de quadros está definida como Auto, se n > 30, a taxa de quadros de codificação é n / 2, caso contrário é igual a n"
    },

    // TS/Multicast settings
    ts: {
      tsUri: "URL do Stream TS:",
      multicastIp: "IP Multicast:",
      multicastPort: "Porta Multicast:",
      sapName: "Nome SAP:",
      tsVideoPid: "PID de Vídeo TS:",
      tsAudioPid: "PID de Áudio TS:",
      tsTransportStreamId: "ID do Stream de Transporte TS:",
      tsOriginalNetworkId: "ID da Rede Original TS:",
      tsPmtStartPid: "PID Inicial PMT TS:",
      tsStartPid: "PID Inicial TS:",
      tsTablesVersion: "Versão das Tabelas TS:",
      tsServiceId: "ID do Serviço TS:",
      tsServiceName: "Nome do Serviço TS:",
      tsProviderName: "Nome do Provedor TS:",
      tsPcrPeriod: "Período PCR TS (ms):",
      conformSystemB: "Conforme Sistema B (DVB):",
      tsNullPacket: "Pacotes Nulos TS:",
      noInsert: "Não inserir",
      insert12: "Inserir (1.2x)",
      insert13: "Inserir (1.3x)",
      insert15: "Inserir (1.5x)",
      insert20: "Inserir (2x)",
      insert25: "Inserir (2.5x)",
      tsTdt: "TS TDT:",
      // Tips
      tipMulticast: "O endereço multicast também pode aceitar endereços broadcast ou unicast, o sistema detectará automaticamente.",
      tipVlc: "Se o VLC não conseguir reproduzir multicast, verifique se seu computador tem vários adaptadores de rede, tente alternar para outro adaptador.",
      tipSap: "O nome SAP pode ser visualizado em dispositivos suportados, como a playlist do VLC -> Rede Local.",
      tipAdvanced: "Configurações avançadas TS geralmente não precisam de ajuste.",
      tipIptv: "Ao conectar a sistemas IPTV, pacotes nulos TS devem ser ajustados para 1.3x, o dispositivo irá inserir automaticamente pacotes nulos para garantir taxa de bits estável;<br>Esta configuração só se aplica ao modo \"CBR Forte\"."
    },

    // RTSP settings
    rtsp: {
      rtspUri: "URL do Stream RTSP:",
      enableMulticast: "Ativar (Multicast)",
      enableTcpOnly: "Ativar (Apenas TCP)",
      multicastIp: "IP Multicast RTSP:",
      multicastPort: "Porta Multicast RTSP:",
      // Tips
      tipEnable: "Se Ativar for selecionado, o transporte real (UDP ou TCP) é determinado pelo cliente. Por exemplo, no VLC você pode marcar \"RTP over RTSP(TCP)\" para usar TCP.",
      tipTcpOnly: "Selecionar Ativar (Apenas TCP) força o dispositivo a usar TCP.",
      tipUdp: "UDP pode ocasionalmente perder pacotes devido a problemas de rede. Se todos os clientes suportarem, TCP é recomendado.",
      tipMulticast: "Selecionar Ativar (Multicast) usará 4 portas consecutivas a partir da \"Porta Multicast RTSP\"."
    },

    // RTMP settings
    rtmp: {
      rtmpUri: "URL do Stream RTMP:",
      publishUri0: "URL de Publicação RTMP(S)/RTSP 0:",
      publishUri1: "URL de Publicação RTMP(S)/RTSP 1:",
      publishUri2: "URL de Publicação RTMP(S)/RTSP 2:",
      mode: "Modo de transmissão RTMP:",
      modeStandard: "Standard (Enhanced RTMP)",
      modeLegacy: "Legacy (CodecID 12)",
      // Tips
      tipPublish: "URLs de Publicação 0-2 são para enviar streams para outros servidores RTMP/RTSP de LAN ou públicos, suportando H.265/H.264.",
      tipBuiltin: "Este dispositivo tem um servidor RTMP embutido com suporte a pull em H.264/H.265;<br>Se a URL do fluxo RTMP for definida como \"/live/0\", o PotPlayer pode reproduzir via http://IP-do-dispositivo/live/0.",
      tipMode: "O modo de transmissão RTMP só tem efeito para H.265 e também afeta o fluxo FLV;"
    },

    // SRT settings
    srt: {
      listenerUri: "URL do Listener SRT:",
      callerUri: "URL do Caller SRT:",
      // Tips
      tipListener: "O modo Listener SRT escuta em uma porta local para que reprodutores puxem o stream.<br>Por exemplo, defina srt://0.0.0.0:9000;<br>VLC pode então reproduzir \"srt://IP-do-dispositivo:9000\".<br>Adicionando streamid exemplo:<br>srt://0.0.0.0:9000?streamid=channel100<br>Adicionando senha exemplo (mínimo 10 caracteres):<br>srt://0.0.0.0:9000?passphrase=0123456789<br>Adicionando streamid e senha:<br>srt://0.0.0.0:9000?streamid=channel100&passphrase=0123456789",
      tipCaller: "O modo Caller SRT envia o stream para outro servidor, ex.:<br>srt://live.example.com:9000?streamid=channel100&latency=120&maxbw=8000000",
      tipParams: "Parâmetros SRT suportados (veja protocolo SRT para detalhes):<br>streamid - identificador de stream para multiplexação<br>passphrase - senha de criptografia, SRT requer 10-79 caracteres<br>pbkeylen - comprimento da chave: 16 (AES-128), 24 (AES-192), 32 (AES-256)<br>latency - latência em ms (20-8000ms)<br>maxbw - largura de banda máxima em bytes/seg<br>rcvbuf - tamanho do buffer de recepção<br>sndbuf - tamanho do buffer de envio<br>ipttl - valor IP TTL<br>conntimeo - timeout de conexão em ms"
    },

    // WebRTC settings
    webrtc: {
      previewTitle: "Pré-visualização web",
      previewNote: "(pré-visualização de baixa latência na página de estado)",
      whipTitle: "Publicação WHIP",
      whipNote: "(enviar para um servidor, para muitos espectadores)",
      p2pTitle: "P2P remoto",
      p2pNote: "(NAT traversal, para poucos espectadores remotos)",
      optional: "opcional",
      preview: "Pré-visualização web",
      whipServer: "URL de envio",
      whipToken: "Token Bearer",
      p2pServer: "URL do servidor de sinalização",
      p2pUuid: "UUID do dispositivo",
      p2pToken: "Token de Auth P2P:",
      p2pAuthToken: "Token de autorização",
      regenerate: "Regenerar",
      // Tips
      tipPreview: "A prévia WebRTC em navegadores convencionais suporta codificação de vídeo H.264 e áudio Opus/G.711.<br>Definir áudio como Opus oferece melhores resultados. Se não estiver definido como Opus, o padrão é G.711 8K.",
      tipWhip: "O streaming WHIP conecta a servidores WHIP padrão. Copie o endereço do seu servidor.<br>O token Bearer pode estar vazio.",
      tipP2p: "Após ativar o servidor P2P, a URL de visualização é mostrada na página de status.<br>O token de auth P2P pode estar vazio.",
      tipP2pNote: "P2P pode não conectar em ambientes de intranet complexos."
    },

    // TRTC settings
    trtc: {
      roomId: "ID da Sala TRTC:",
      userId: "Nome de Usuário TRTC:",
      roomKey: "Chave da Sala TRTC:",
      userSig: "UserSig TRTC:",
      sdkAppId: "SDKAppID TRTC:",
      roomIdType: "Tipo de ID da Sala TRTC:",
      roomIdNumber: "Número",
      roomIdString: "String",
      // Short enum labels for template use
      number: "Número",
      string: "String",
      // Tips
      tipTrtc: "Envie streams para o servidor Tencent TRTC. Copie o endereço do servidor.<br>Tencent TRTC atualmente só suporta H.264."
    },

    alirtc: {
      roomId: "ID da Sala AliRTC:",
      userId: "ID do Usuário AliRTC:",
      userName: "Nome do Usuário AliRTC:",
      region: "Região AliRTC:",
      token: "AliRTC Token:",
      tipAliRtc: "Envia streams para o Alibaba Cloud RTC com suporte a H.265/H.264.<br>Você pode inserir diretamente o Token fornecido pelo serviço ou clicar em AliRTC Token para gerar um Token com AppID/AppKey na página separada.<br>Se o Token estiver vazio, o dispositivo tentará gerá-lo automaticamente na inicialização usando o AppID/AppKey salvos na página separada.<br>Se o ID da sala, o ID do usuário ou o nome do usuário mudarem, talvez seja necessário gerar o token novamente."
    },


    alirtcTokenPage: {
      title: "AliRTC Token",
      roomId: "ID da Sala AliRTC:",
      userId: "ID do Usuário AliRTC:",
      userName: "Nome do Usuário AliRTC:",
      appId: "AliRTC AppID:",
      appKey: "AliRTC AppKey:",
      token: "AliRTC Token:",
      generate: "Gerar e salvar token",
      appFieldsRequired: "AliRTC AppID e AppKey são obrigatórios.",
      identityRequired: "O ID da sala, o ID do usuário e o nome do usuário do AliRTC são obrigatórios nas configurações de saída do stream atual.",
      generateSuccess: "O token do AliRTC foi gerado e salvo.",
      generateFailed: "Falha ao gerar o token do AliRTC.",
      unavailable: "AliRTC não está disponível neste dispositivo."
    },

    // HLS settings
    hls: {
      hlsTsUri: "URL do Stream HLS TS:",
      hlsMp4Uri: "URL do Stream HLS MP4:",
      hlsPushUri: "URL PUSH HLS:",
      hlsPushUrl: "URL PUSH HLS:",
      // Tips
      tipHls: "Quando HLS TS/MP4 está ativado, o dispositivo armazena dados em buffer na memória com base no tempo e contagem de segmentos nas configurações avançadas.<br>Definir tempo e contagem de segmentos como 3 reduz o uso de memória.",
      tipPush: "A URL de publicação HLS é para enviar para servidores como YouTube."
    },

    // MP4/FLV/Other settings
    other: {
      mp4Uri: "URL do Stream MP4:",
      flvUri: "URL do Stream FLV:",
      icecastUri: "URL PUSH ICECAST:",
      icecastPushUrl: "URL PUSH ICECAST:",
      shoutcastUri: "URL PUSH Shoutcast:",
      shoutcastPushUrl: "URL PUSH Shoutcast:",
      // Tips
      tipMp4: "Quando o stream MP4 está ativado, pode ser reproduzido diretamente no navegador.<br>O stream FLV suporta H.265/H.264 neste dispositivo, mas VLC e outros reprodutores atualmente só suportam H.264.<br>ICECAST/Shoutcast só suporta MP3, para enviar para servidores de áudio.",
      tipShoutcast: "Shoutcast suporta v1 e v2;<br>Exemplos:<br>http://senha@servidor_shoutcast:8000<br>http://senha@servidor_shoutcast:8000?sid=100<br>http://senha@servidor_shoutcast:8000?icy-name=Stream&icy-genre=Pop<br>Formato:<br>http://senha@IP-do-servidor:porta-de-escuta[?params...]; nome de usuário pode ser omitido (padrão \"source\").<br>Use a \"porta de escuta\" do servidor, o dispositivo irá conectar automaticamente à porta de origem (porta de escuta + 1).<br>Parâmetros suportados:<br>sid: ID de stream Shoutcast v2 (padrão 1)<br>icy-name: nome do stream (opcional)<br>icy-genre: gênero (opcional)<br>icy-url: URL do site (opcional)<br>icy-pub: público 0/1 (opcional)"
    },

    // Common
    common: {
      save: "Salvar",
      disabled: "Desativado",
      enabled: "Ativado"
    },

    // Error and success messages
    messages: {
      success: "Configurações salvas!",
      failed: "Falha nas configurações!",
      emptyError: "As configurações não podem estar vazias!",
      trtcH264Only: "Quando TRTC está ativado, apenas codificação H.264 é suportada. Alterado automaticamente.",
      alirtcIdentityRequired: "Quando o AliRTC está habilitado, o ID da sala, o ID do usuário e o nome do usuário não podem ficar vazios.",
      mp3Required: "Por favor, defina a codificação de áudio para MP3!",
      // Encoding validation
      frameRateError: "A taxa de quadros deve ser um inteiro entre 5-60!",
      gopError: "O intervalo GOP deve ser um inteiro entre 5-300!",
      mjpegQualityError: "A qualidade MJPEG deve ser um inteiro entre 10-99!",
      hlsBitrateWarning: "Taxa de bits não está no intervalo 32~8000, streams HLS TS/MP4/PUSH desativados.",
      trtcCodecWarning: "Codec não é H.264, TRTC desativado.",
      hlsBitrateError: "Taxa de bits não está no intervalo 32~8000, não é possível ativar streams HLS TS/MP4/PUSH",
      // SRT validation
      srtListenerPortError: "A porta do Listener SRT deve ser um inteiro entre 1-65535!",
      srtListenerFormatError: "Formato de URL do Listener SRT inválido!",
      srtCallerFormatError: "Formato de URL do Caller SRT inválido!",
      srtPasswordLengthError: "O comprimento da senha SRT deve estar entre 10-32!",
      srtLatencyError: "A latência SRT deve ser um inteiro entre 1-10000!",
      srtBandwidthError: "A largura de banda SRT deve ser um inteiro entre 0-102400!",
      // RTMP validation
      rtmpFormatError: "A URL de publicação RTMP(S)/RTSP deve começar com rtmp://, rtmps:// ou rtsp://",
      // HLS validation
      hlsFormatError: "Formato de URL de publicação HLS inválido!",
      // RTSP validation
      rtspMulticastIpError: "Formato de IP multicast RTSP inválido!",
      rtspMulticastPortError: "A porta multicast RTSP deve ser um inteiro entre 1-65535!",
      // TS validation
      multicastIpError: "Formato de IP multicast inválido!",
      multicastPortError: "A porta multicast deve ser um inteiro entre 1-65535!",
      tsTransportIdError: "O ID do Stream de Transporte TS deve ser um inteiro entre 1-65535!",
      tsNetworkIdError: "O ID da Rede Original TS deve ser um inteiro entre 1-65535!",
      tsPmtPidError: "O PID Inicial PMT TS deve ser um inteiro entre 32-8186!",
      tsStartPidError: "O PID Inicial TS deve ser um inteiro entre 32-3840!",
      tsPidConflict: "O PID Inicial TS e o PID Inicial PMT TS devem ser diferentes!",
      tsVersionError: "A Versão das Tabelas TS deve ser um inteiro entre 0-31!",
      tsServiceIdError: "O ID do Serviço TS deve ser um inteiro entre 1-65535!",
      tsVideoPidError: "O PID de Vídeo TS deve ser um inteiro entre 16-8190!",
      tsAudioPidError: "O PID de Áudio TS deve ser um inteiro entre 16-8190!",
      tsPcrPeriodError: "O período PCR TS deve ser um inteiro entre 0-100 (0=automático)!",
      tsVideoPidConflict: "O PID de Vídeo TS e o PID de Áudio TS devem ser diferentes!",
      tsAudioPmtConflict: "O PID de Áudio TS e o PID Inicial PMT TS devem ser diferentes!",
      tsVideoPmtConflict: "O PID de Vídeo TS e o PID Inicial PMT TS devem ser diferentes!",
      // Other validation
      icecastFormatError: "Formato de URL de publicação Icecast inválido!",
      shoutcastFormatError: "Formato de URL de publicação Shoutcast inválido!"
    }
  }
};
