export default {
  // Navigation
  nav: {
    printers: 'Impressoras',
    archives: 'Arquivos',
    queue: 'Fila de impressão',
    stats: 'Estatísticas',
    profiles: 'Perfis',
    maintenance: 'Manutenção',
    projects: 'Projetos',
    inventory: 'Inventário',
    files: 'Gerenciador de Arquivos',
    makerworld: 'MakerWorld',
    notifications: 'Notificações',
    settings: 'Configurações',
    system: 'Sistema',
    collapseSidebar: 'Recolher barra lateral',
    expandSidebar: 'Expandir barra lateral',
    update: 'Atualizar',
    updateAvailable: 'Atualização disponível: v{{version}}',
    updateAvailableBanner: 'Versão {{version}} está disponível!',
    viewUpdate: 'Ver atualização',
    viewOnGithub: 'Ver no GitHub',
    keyboardShortcuts: 'Atalhos de teclado (?)',
    switchToLight: 'Mudar para modo claro',
    switchToDark: 'Mudar para modo escuro',
    smartSwitches: 'Interruptores inteligentes',
    logout: 'Sair',
  },

  // Common
  common: {
    save: 'Salvar',
    saving: 'Salvando...',
    cancel: 'Cancelar',
    delete: 'Excluir',
    edit: 'Editar',
    add: 'Adicionar',
    close: 'Fechar',
    confirm: 'Confirmar',
    loading: 'Carregando...',
    error: 'Erro',
    errorLoading: 'Erro ao carregar',
    retry: 'Tentar novamente',
    success: 'Sucesso',
    warning: 'Aviso',
    enabled: 'Ativado',
    disabled: 'Desativado',
    yes: 'Sim',
    no: 'Não',
    on: 'Ligado',
    off: 'Desligado',
    all: 'Todos',
    none: 'Nenhum',
    search: 'Pesquisar',
    filter: 'Filtrar',
    sort: 'Ordenar',
    refresh: 'Atualizar',
    download: 'Baixar',
    upload: 'Enviar',
    uploading: 'Enviando...',
    uploadFailed: 'Falha no envio',
    actions: 'Ações',
    status: 'Status',
    name: 'Nome',
    description: 'Descrição',
    date: 'Data',
    time: 'Hora',
    hours: 'Horas',
    minutes: 'Minutos',
    seconds: 'Segundos',
    days: 'Dias',
    enable: 'Ativar',
    disable: 'Desativar',
    permissions: 'Permissões',
    noPrinters: 'Nenhuma impressora configurada',
    noData: 'Nenhum dado disponível',
    linkNotFound: 'Link não encontrado',
    required: 'Obrigatório',
    optional: 'Opcional',
    dismiss: 'Dispensar',
    apply: 'Aplicar',
    reset: 'Redefinir',
    export: 'Exportar',
    import: 'Importar',
    clear: 'Limpar',
    selectAll: 'Selecionar tudo',
    deselectAll: 'Desmarcar tudo',
    noChange: '— Sem alterações —',
    unchanged: 'Inalterado',
    unassigned: 'Não atribuído',
    unknown: 'Desconhecido',
    unknownError: 'Erro desconhecido',
    today: 'Hoje',
    tomorrow: 'Amanhã',
    asap: 'O mais rápido possível',
    overdue: 'Atrasado',
    now: 'Agora',
    collapse: 'Recolher',
    expand: 'Expandir',
    viewArchive: 'Ver arquivo',
    viewInFileManager: 'Ver no Gerenciador de Arquivos',
    addedBy: 'Adicionado por {{username}}',
    prints: 'impressões',
    more: '+{{count}} mais',
    ascending: 'Crescente',
    descending: 'Decrescente',
    back: 'Voltar',
    copy: 'Copiar',
    copied: 'Copiado!',
    printer: 'Impressora',
    remove: 'Remover',
    type: 'Tipo',
    print: 'Imprimir',
    rename: 'Renomear',
    move: 'Mover',
    create: 'Criar',
    duplicate: 'Duplicar',
    left: 'Esquerda',
    right: 'Direita',
  },

  // Printers page
  printers: {
    title: 'Impressoras',
    addPrinter: 'Adicionar Impressora',
    editPrinter: 'Editar Impressora',
    deletePrinter: 'Excluir Impressora',
    printerName: 'Nome da Impressora',
    serialNumber: 'Número de Série',
    ipAddress: 'Endereço IP / Nome do Host',
    accessCode: 'Código de Acesso',
    model: 'Modelo',
    nozzleCount: 'Número de Bicos',
    autoArchive: 'Arquivamento Automático',
    status: {
      available: 'Disponível',
      idle: 'Ocioso',
      printing: 'Imprimindo',
      paused: 'Pausado',
      offline: 'Offline',
      problem: 'Problema',
      error: 'Erro',
      finished: 'Concluído',
      unknown: 'Desconhecido',
    },
    temperatures: {
      nozzle: 'Bico',
      bed: 'Cama',
      chamber: 'Câmara',
    },
    progress: '{{percent}}% concluído',
    timeRemaining: '{{time}} restante',
    deleteConfirm: 'Tem certeza de que deseja excluir "{{name}}"?',
    maintenanceOk: 'Manutenção OK',
    maintenanceWarning: '{{count}} aviso',
    maintenanceWarning_plural: '{{count}} avisos',
    maintenanceDue: '{{count}} devido',
    maintenanceDue_plural: '{{count}} devido',
    // Sort options
    sort: {
      name: 'Nome',
      status: 'Status',
      model: 'Modelo',
      location: 'Localização',
      ascending: 'Ordem crescente',
      descending: 'Ordem decrescente',
    },
    // Card size
    cardSize: {
      small: 'Cartões pequenos',
      medium: 'Cartões médios',
      large: 'Cartões grandes',
      extraLarge: 'Cartões extra grandes',
    },
    // Controls
    hideOffline: 'Ocultar offline',
    nextAvailable: 'Próximo disponível',
    powerOn: 'Ligar',
    offlinePrintersWithPlugs: 'Impressoras offline com tomadas inteligentes',
    noPrintersConfigured: 'Nenhuma impressora configurada ainda',
    search: 'Pesquisar impressoras...',
    noSearchResults: 'Nenhuma impressora corresponde à sua pesquisa ou filtros',
    filter: {
      allStatuses: 'Todos os status',
      allLocations: 'Todos os locais',
    },
    toolbar: {
      filters: 'Filtros',
      view: 'Visualização',
      actions: 'Ações',
    },
    // Printer card
    readyToPrint: 'Pronto para imprimir',
    external: 'Externo',
    extL: 'Ext-L',
    extR: 'Ext-R',
    deleteArchives: 'Excluir arquivos de impressão',
    noLabel: 'Sem etiqueta',
    printPreview: 'Pré-visualização de impressão',
    width: 'Largura',
    height: 'Altura',
    noObjectsFound: 'Nenhum objeto encontrado',
    objectsLoadedOnPrintStart: 'Objetos são carregados quando uma impressão começa',
    willBeSkipped: 'Será ignorado',
    name: 'Nome',
    serialCannotBeChanged: 'Número de série não pode ser alterado',
    locationHelp: 'Usado para agrupar impressoras e filtrar trabalhos na fila',
    // WiFi signal strength
    wifiSignal: {
      veryWeak: 'Muito fraco',
      weak: 'Fraco',
      fair: 'Regular',
      good: 'Bom',
      excellent: 'Excelente',
    },
    // Maintenance
    maintenanceUpToDate: 'Toda a manutenção está em dia - Clique para ver',
    // Chamber light
    chamberLightOn: 'Ligar luz da câmara',
    chamberLightOff: 'Desligar luz da câmara',
    // Files
    files: 'Arquivos',
    browseFiles: 'Procurar arquivos da impressora',
    // Smart plug
    autoOffAfterPrint: 'Desligamento automático após impressão',
    autoOffExecuted: 'Desligamento automático executado - ligue a impressora para reiniciar',
    // HMS errors
    hmsErrors: 'Erros HMS',
    viewHmsErrors: 'Ver {{count}} erro(s) HMS',
    // Actions
    resume: 'Retomar',
    pause: 'Pausar',
    stop: 'Parar',
    camera: 'âmera',
    skipObject: 'Ignorar objeto',
    reconnect: 'Reconectar',
    forceRefresh: 'Forçar atualização',
    forceRefreshSuccess: 'Atualização solicitada',
    mqttDebug: 'Depuração MQTT',
    printerInformation: 'Informações da impressora',
    copyToClipboard: 'Copiar',
    copied: 'Copiado!',
    state: 'Estado',
    wifiSignalLabel: 'Sinal WiFi',
    developerMode: 'Modo desenvolvedor',
    enabled: 'Ativado',
    disabled: 'Desativado',
    addedOn: 'Adicionada em',
    sdCard: 'Cartão SD',
    inserted: 'Inserido',
    notInserted: 'Não inserido',
    totalPrintHours: 'Horas de impressão',
    activeNozzle: 'Ativo: {{nozzle}} bico',
    nozzleRack: 'Suporte de bicos',
    nozzleDocked: 'Acoplado',
    nozzleMounted: 'Montado',
    nozzleActive: 'Ativo',
    nozzleIdle: 'Ocioso',
    nozzleDiameter: 'Diâmetro',
    nozzleType: 'Tipo',
    nozzleStatus: 'Status',
    nozzleFilament: 'Filamento',
    nozzleWear: 'Desgaste',
    nozzleMaxTemp: 'Temp Máx',
    nozzleSerial: 'Número de série',
    nozzleHardenedSteel: 'Aço Endurecido',
    nozzleStainlessSteel: 'Aço Inoxidável',
    nozzleTungstenCarbide: 'Carboneto de Tungstênio',
    nozzleFlow: 'Fluxo',
    nozzleHighFlow: 'Alto Fluxo',
    nozzleStandardFlow: 'Fluxo Padrão',
    // Firmware
    firmwareUpdate: 'Atualização de Firmware',
    firmwareInstructions: 'No visor da impressora, vá para',
    firmwareNav: 'Navegar para',
    settings: 'Configurações',
    firmware: 'Firmware',
    // Discovery
    discoverPrinters: 'Descobrir Impressoras',
    searching: 'Procurando...',
    manualEntry: 'Entrada Manual',
    addFromCloud: 'Adicionar da Nuvem',
    // Toast messages
    toast: {
      printerDeleted: 'Impressora excluída',
      missingSpoolAssignment: 'Impressão iniciada em {{printer}}. Atribuição de bobina ausente para: {{slots}}',
      printerAdded: 'Impressora adicionada',
      printerUpdated: 'Impressora atualizada',
      failedToDelete: 'Falha ao excluir impressora',
      failedToAdd: 'Falha ao adicionar impressora',
      connectionFailedNotAdded: 'Não foi possível conectar à impressora. Verifique o IP, o número de série e o código de acesso, e confirme que o modo somente LAN está ativado. A impressora não foi adicionada.',
      failedToUpdate: 'Falha ao atualizar impressora',
      commandSent: 'Comando enviado',
      failedToSendCommand: 'Falha ao enviar comando',
      turnedOn: '{{name}} ligado',
      failedToPowerOn: 'Falha ao ligar {{name}}',
      scriptTriggered: 'Script acionado',
      printStopped: 'Impressão parada',
      printPaused: 'Impressão pausada',
      printResumed: 'Impressão retomada',
      referenceDeleted: 'Referência excluída',
      detectionAreaSaved: 'Área de detecção salva',
      failedToRunScript: 'Falha ao executar script',
      failedToStopPrint: 'Falha ao parar impressão',
      failedToPausePrint: 'Falha ao pausar impressão',
      failedToResumePrint: 'Falha ao retomar impressão',
      failedToControlChamberLight: 'Falha ao controlar a luz da câmara',
      failedToSetSpeed: 'Falha ao definir a velocidade de impressão',
      failedToUpdateSetting: 'Falha ao atualizar configuração',
      failedToSkipObjects: 'Falha ao ignorar objetos',
      failedToRereadRfid: 'Falha ao reler RFID',
      failedToCheckPlate: 'Falha ao verificar a placa',
      failedToUpdateLabel: 'Falha ao atualizar etiqueta',
      failedToDeleteReference: 'Falha ao excluir referência',
      failedToSaveDetectionArea: 'Falha ao salvar área de detecção',
      plateCheckEnabled: 'Verificação da placa ativada',
      plateCheckDisabled: 'Verificação da placa desativada',
      calibrationSaved: 'Calibração salva!',
      calibrationFailed: 'Falha na calibração',
      rfidRereadInitiated: 'Releitura de RFID iniciada',
      loadInitiated: 'Carregando filamento…',
      unloadInitiated: 'Descarregando filamento…',
      failedToLoad: 'Falha ao carregar filamento',
      failedToUnload: 'Falha ao descarregar filamento',
    },
    // Connection status
    connection: {
      connected: 'Conectado',
      offline: 'Offline',
    },
    plateStatus: {
      markCleared: 'Marcar placa como liberada',
      cleared: 'Placa liberada',
      notCleared: 'Placa não liberada',
      inUse: 'Placa em uso',
    },
    // Queue info
    queue: {
      inQueue: '{{count}} impressão na fila',
      inQueue_plural: '{{count}} impressões na fila',
    },
    // Controls section
    controls: 'Controles',
    // RFID
    rfid: {
      reread: 'Releitura de RFID',
    },
    // AMS load/unload (#891)
    ams: {
      load: 'Carregar',
      unload: 'Descarregar',
    },
    bedJog: {
      title: 'Mover a mesa de impressão',
      bed: 'Mesa',
      step: 'Passo (mm)',
      up: 'Mover mesa para cima',
      down: 'Mover mesa para baixo',
      disabledWhilePrinting: 'Desativado durante a impressão',
      notHomedTitle: 'Impressora não referenciada',
      notHomedMessage: 'A impressora não foi referenciada desde a última impressão. Execute a referência automática primeiro para um posicionamento seguro (estaciona o cabeçote, depois referencia X, Y e Z), ou mova assim mesmo — os fins de curso de software serão ignorados.',
      homeZ: 'Referência automática',
      moveAnyway: 'Mover assim mesmo',
      homingStarted: 'Referenciando impressora automaticamente…',
    },
    // Permissions
    permission: {
      noAdd: 'Você não tem permissão para adicionar impressoras',
      noEdit: 'Você não tem permissão para editar impressoras',
      noDelete: 'Você não tem permissão para excluir impressoras',
      noControl: 'Você não tem permissão para controlar impressoras',
      noFiles: 'Você não tem permissão para acessar arquivos de impressora',
      noAmsRfid: 'Você não tem permissão para reler RFID AMS',
      noSmartPlugControl: 'Você não tem permissão para controlar tomadas inteligentes',
      noCamera: 'Você não tem permissão para visualizar câmeras',
    },
    // Add/Edit modal
    modal: {
      addTitle: 'Adicionar Impressora',
      editTitle: 'Editar Impressora',
      myPrinter: 'Minha Impressora',
      selectModel: 'Selecionar modelo...',
      locationGroup: 'Localização / Grupo (opcional)',
      locationPlaceholder: 'ex.: Oficina, Escritório, Porão',
      autoArchiveLabel: 'Arquivar automaticamente impressões concluídas',
      fromPrinterSettings: 'A partir das configurações da impressora',
      modelOptional: 'Modelo (opcional)',
      saveChanges: 'Salvar alterações',
    },
    // Skip objects
    skipObjects: {
      tooltip: 'Ignorar objetos',
      onlyWhilePrinting: 'Ignorar objetos (apenas durante a impressão)',
      requiresMultiple: 'Ignorar objetos (requer 2+ objetos)',
      title: 'Ignorar Objetos',
      matchIdsInfo: 'Correspondência de IDs com o display da sua impressora',
      printerShowsIds: 'A tela da impressora mostra os IDs dos objetos na placa de construção',
      skipSelected: 'Ignorar Selecionados',
      skipping: 'Ignorando...',
      noObjectsSelected: 'Nenhum objeto selecionado',
      selectObjectsToSkip: 'Selecione os objetos que deseja ignorar na impressão atual',
      skipped: 'Ignorado',
      objectsSkipped: 'Objetos ignorados',
      activeCount: '{{count}} ativo',
      waitForLayer: 'Aguarde a camada 2+ para ignorar objetos (atualmente na camada {{layer}})',
      skip: 'Ignorar',
      confirmTitle: 'Ignorar Objeto?',
      confirmMessage: 'Tem certeza de que deseja ignorar "{{name}}"? Isso não pode ser desfeito.',
    },
    // Confirm modals
    confirm: {
      deleteTitle: 'Excluir Impressora',
      deleteMessage: 'Tem certeza de que deseja excluir "{{name}}"? Isso removerá todas as configurações de conexão.',
      deleteArchivesNote: 'Todo o histórico de impressão desta impressora será permanentemente excluído.',
      keepArchivesNote: 'O histórico de impressão será mantido, mas não estará mais associado a esta impressora.',
      stopTitle: 'Parar Impressão',
      stopMessage: 'Tem certeza de que deseja parar a impressão atual em "{{name}}"? Isso cancelará o trabalho de impressão.',
      stopButton: 'Parar Impressão',
      pauseTitle: 'Pausar Impressão',
      pauseMessage: 'Tem certeza de que deseja pausar a impressão atual em "{{name}}"?',
      pauseButton: 'Pausar Impressão',
      resumeTitle: 'Retomar Impressão',
      resumeMessage: 'Tem certeza de que deseja retomar a impressão em "{{name}}"?',
      resumeButton: 'Retomar Impressão',
      powerOnTitle: 'Ligar Impressora',
      powerOnMessage: 'Tem certeza de que deseja ligar a impressora "{{name}}"?',
      powerOnButton: 'Ligar',
      powerOffTitle: 'Desligar Impressora',
      powerOffMessage: 'Tem certeza de que deseja desligar a impressora "{{name}}"?',
      powerOffWarning: 'AVISO: "{{name}}" está imprimindo no momento! Tem certeza de que deseja desligar a impressora? Isso interromperá a impressão e pode danificar a impressora.',
      powerOffButton: 'Desligar',
      haToggleTitle: 'Alternar "{{name}}"',
      haToggleMessage: 'Alternar a entidade Home Assistant {{entity}}? Isso pode desligar a energia se estiver ligada no momento.',
      haToggleWarning: 'AVISO: "{{name}}" está imprimindo no momento! Alternar {{entity}} pode cortar a energia e interromper a impressão. Continuar?',
      haToggleButton: 'Alternar',
    },
    // Bulk actions
    bulk: {
      select: 'Selecionar',
      selectAll: 'Selecionar tudo',
      selectByLocation: 'Selecionar por local',
      selected: '{{count}} selecionado(s)',
      actions: {
        stop: 'Parar',
        pause: 'Pausar',
        resume: 'Retomar',
        clearPlate: 'Limpar mesa',
        clearHMS: 'Limpar notificações',
      },
      confirm: {
        stopTitle: 'Parar {{count}} impressões',
        stopMessage: 'Isso cancelará as impressões ativas em {{count}} impressora(s). Esta ação não pode ser desfeita.',
        stopButton: 'Parar todas',
        pauseTitle: 'Pausar {{count}} impressões',
        pauseMessage: 'Isso pausará as impressões ativas em {{count}} impressora(s).',
        pauseButton: 'Pausar todas',
        clearPlateTitle: 'Limpar {{count}} mesas de impressão',
        clearPlateMessage: 'Isso limpará a mesa de impressão em {{count}} impressora(s) e pode iniciar trabalhos na fila.',
        clearPlateButton: 'Limpar todas',
      },
      success: '{{action}} concluído em {{count}} impressora(s)',
      partial: '{{succeeded}} bem-sucedido(s), {{failed}} falhou/falharam',
      noneApplicable: 'Nenhuma impressora selecionada está no estado correto para esta ação',
      selectByState: 'Selecionar por estado',
    },
    // Discovery
    discovery: {
      title: 'Descobrir Impressoras',
      searching: 'Procurando...',
      scanning: 'Escaneando...',
      scanProgress: 'Escaneando... {{scanned}}/{{total}}',
      foundPrinters: '{{count}} impressora(s) encontrada(s)',
      noPrintersFound: 'Nenhuma impressora encontrada',
      noPrintersFoundSubnet: 'Nenhuma impressora encontrada na sub-rede especificada.',
      noPrintersFoundNetwork: 'Nenhuma impressora encontrada na rede.',
      allConfigured: 'Todas as impressoras descobertas já estão configuradas.',
      alreadyAdded: 'Já adicionada',
      select: 'Selecionar',
      manualEntry: 'Entrada Manual',
      addFromCloud: 'Adicionar da Nuvem',
      subnetToScan: 'Sub-rede para escanear',
      dockerNote: 'Docker detectado. Insira a sub-rede da sua impressora em notação CIDR. Requer network_mode: host no docker-compose.yml.',
      scanSubnet: 'Escanear Sub-rede para Impressoras',
      discoverNetwork: 'Descobrir Impressoras na Rede',
      scanningSubnet: 'Escaneando sub-rede para impressoras Bambu...',
      scanningNetwork: 'Escaneando rede...',
      serialRequired: 'Serial necessário',
      unknown: 'Desconhecido',
      failedToStart: 'Falha ao iniciar a descoberta',
    },
    // AMS Drying
    drying: {
      start: 'Iniciar secagem',
      stop: 'Parar secagem',
      temperature: 'Temperatura',
      duration: 'Duração',
      hours: 'horas',
      timeRemaining: '{{time}} restante',
      active: 'Secagem',
      notSupported: 'Secagem não suportada',
      powerRequired: 'Conecte o adaptador de energia AMS para ativar a secagem',
      startingDrying: 'Iniciando secagem...',
      stoppingDrying: 'Parando secagem...',
      rotateTray: 'Girar o carretel durante a secagem',
    },
    // Filaments section
    filaments: 'Filamentos',
    // Camera
    openCameraOverlay: 'Abrir sobreposição da câmera',
    openCameraWindow: 'Abrir câmera em nova janela',
    // Firmware
    firmwareUpdateAvailable: 'Atualização de firmware disponível: {{current}} → {{latest}}',
    firmwareUpToDate: 'Firmware {{version}} — Atualizado',
    firmwareUpdateButton: 'Atualizar',
    // Plate detection
    plateDetection: {
      noPermission: 'Você não tem permissão para atualizar impressoras',
      enabledClick: 'Verificação da placa ativada - Clique para desativar',
      disabledClick: 'Verificação da placa desativada - Clique para ativar',
      manageCalibration: 'Gerenciar calibração da detecção da placa',
      calibrationRequired: 'Calibração necessária',
      calibrationInstructions: 'Certifique-se de que a placa de construção esteja <strong>completamente vazia</strong>, em seguida clique em Calibrar.',
      calibrationDescription: 'A calibração captura uma imagem de referência da placa vazia. Verificações futuras compararão com esta referência para detectar objetos.',
      calibrationTip: '<strong>Dica:</strong> Você pode armazenar até 5 calibrações para diferentes placas. O sistema usa automaticamente a melhor correspondência ao verificar.',
      plateEmpty: 'A placa parece vazia',
      objectsDetected: 'Objetos detectados na placa',
      confidence: 'Confiança',
      difference: 'Diferença',
      analysisPreview: 'Pré-visualização da análise:',
      analysisLegend: 'Caixa verde = área de detecção, Sobreposição vermelha = diferenças em relação à calibração',
      savedReferences: 'Referências salvas ({{count}}/{{max}})',
      deleteReference: 'Excluir referência',
      labelPlaceholder: 'Etiqueta...',
      clickToEdit: '{{label}} - Clique para editar',
      clickToAddLabel: 'Clique para adicionar etiqueta',
    },
    // Speed
    speed: {
      title: 'Velocidade de impressão',
      silent: 'Silencioso (50%)',
      standard: 'Padrão (100%)',
      sport: 'Sport (124%)',
      ludicrous: 'Ludicrous (166%)',
    },
    airduct: {
      title: 'Modo do duto de ar',
      cooling: 'Resfriamento',
      heating: 'Aquecimento',
    },
    noSdCard: 'Sem SD',
    door: {
      open: 'Aberta',
      closed: 'Fechada',
    },
    // Fans
    fans: {
      partCooling: 'Ventilador de resfriamento da peça',
      auxiliary: 'Ventilador auxiliar',
      chamber: 'Ventilador da câmara',
    },
    // HMS errors
    clickToViewHmsErrors: 'Clique para ver erros do HMS',
    estimatedCompletion: 'Tempo estimado de conclusão',
    plateNumber: 'Placa {{number}}',
    slotOptions: 'Opções de slot',
    // AMS hover popup
    amsPopup: {
      friendlyName: 'Nome do AMS',
      friendlyNamePlaceholder: 'ex.: Nome amigável do AMS',
      serialNumber: 'Número de série',
      firmwareVersion: 'Firmware',
      save: 'Salvar',
      clear: 'Limpar',
      noEditPermission: 'Você não tem permissão para renomear unidades AMS',
    },
    // Firmware modal
    firmwareModal: {
      title: 'Atualização de Firmware',
      titleUpToDate: 'Informações do Firmware',
      currentVersion: 'Atual:',
      latestVersion: 'Última:',
      releaseNotes: 'Notas de Lançamento',
      checkingPrereqs: 'Verificando pré-requisitos...',
      sdCardReady: 'Cartão SD pronto. Clique abaixo para enviar o firmware.',
      uploadedSuccess: 'Firmware enviado para o cartão SD!',
      applyInstructions: 'Para aplicar a atualização na sua impressora:',
      step1: 'Na tela sensível ao toque da impressora, vá para <strong>Configurações</strong>',
      step2: 'Navegue até <strong>Firmware</strong>',
      step3: 'Selecione <strong>Atualizar a partir do cartão SD</strong>',
      step4: 'A atualização levará de 10 a 20 minutos',
      done: 'Concluído',
      starting: 'Iniciando...',
      uploadFirmware: 'Enviar Firmware',
      uploadFailed: 'Falha ao iniciar o envio: {{error}}',
      uploadedToast: 'Firmware enviado! Inicie a atualização na tela da impressora.',
      availableVersions: 'Versões disponíveis',
      usable: 'Utilizável',
      unavailable: 'Indisponível',
      installed: 'Instalada',
      newerBadge: 'mais recente',
      olderBadge: 'mais antiga',
      currentBadge: 'atual',
    },
    accessCodePlaceholder: 'Deixe vazio para manter o atual',
    // ROI editor
    roi: {
      title: 'Área de Detecção (ROI)',
      xStart: 'Início X',
      yStart: 'Início Y',
      width: 'Largura',
      height: 'Altura',
      instruction: 'Ajuste a área de detecção para focar na placa de construção. A caixa verde na pré-visualização mostra a área atual.',
    },
    developerModeWarning: 'O modo desenvolvedor LAN não está ativado em: {{names}}. Alguns recursos podem não funcionar.',
    howToEnable: 'Como ativar',
    incompatibleFile: 'Este arquivo foi fatiado para {{slicedFor}}, mas esta impressora é uma {{printerModel}}',
    dropNotPrintable: 'Apenas arquivos .gcode e .gcode.3mf podem ser impressos',
    dropToPrint: 'Solte para imprimir',
    cannotPrint: 'Impressora ocupada',
  },

  // Archives page
  archives: {
    title: 'Arquivos de Impressão',
    searchPlaceholder: 'Pesquisar arquivos...',
    filterByPrinter: 'Filtrar por impressora',
    filterByStatus: 'Filtrar por status',
    sortBy: 'Ordenar por',
    sortNewest: 'Mais recentes primeiro',
    sortOldest: 'Mais antigos primeiro',
    sortName: 'Nome',
    sortDuration: 'Duração',
    sortLargest: 'Maiores primeiro',
    sortSmallest: 'Menores primeiro',
    sortSize: 'Tamanho',
    noArchives: 'Nenhum arquivo encontrado',
    noArchivesSearch: 'Nenhum arquivo corresponde à sua pesquisa',
    originalPrintNotVisible: 'Impressão original não visível - tente limpar os filtros',
    noArchivesYet: 'Ainda não há arquivos',
    prints: 'impressões',
    pagination: {
      showing: 'Mostrando',
      to: 'a',
      of: 'de',
      show: 'Mostrar',
      page: 'Página',
      all: 'Todos',
    },
    loadingArchives: 'Carregando arquivos...',
    releaseToUpload: 'Solte para enviar',
    showAll: 'Mostrar todos',
    showFavoritesOnly: 'Mostrar apenas favoritos',
    gridView: 'Visualização em grade',
    listView: 'Visualização em lista',
    calendarView: 'Visualização em calendário',
    logView: 'Registro de impressão',
    manageTags: 'Gerenciar etiquetas',
    showFailedPrints: 'Mostrar impressões falhas',
    hideFailedPrints: 'Ocultar impressões falhas',
    hideDuplicates: 'Ocultar duplicados',
    viewOriginalPrint: 'Clique para visualizar a impressão original (#{{id}})',
    printTime: 'Tempo de impressão',
    filamentUsed: 'Filamento usado',
    cost: 'Custo',
    reprint: 'Reimprimir',
    preview: 'Pré-visualizar',
    deleteArchive: 'Excluir arquivo',
    deleteConfirm: 'Tem certeza de que deseja excluir este arquivo?',
    favorite: 'Favorito',
    unfavorite: 'Remover dos favoritos',
    viewDetails: 'Ver detalhes',
    status: {
      completed: 'Concluído',
      failed: 'Falhou',
      stopped: 'Parado',
    },
    toast: {
      source3mfAttached: 'Arquivo de origem 3MF anexado: {{filename}}',
      failedUploadSource3mf: 'Falha ao enviar arquivo de origem 3MF',
      source3mfRemoved: 'Arquivo de origem 3MF removido',
      failedRemoveSource3mf: 'Falha ao remover arquivo de origem 3MF',
      f3dAttached: 'F3D anexado: {{filename}}',
      failedUploadF3d: 'Falha ao enviar F3D',
      f3dRemoved: 'F3D removido',
      failedRemoveF3d: 'Falha ao remover F3D',
      timelapseAttached: 'Timelapse anexado: {{filename}}',
      timelapseAlreadyAttached: 'Timelapse já anexado',
      noMatchingTimelapse: 'Nenhum timelapse correspondente encontrado',
      failedScanTimelapse: 'Falha ao escanear timelapse',
      failedAttachTimelapse: 'Falha ao anexar timelapse',
      timelapseRemoved: 'Timelapse removido',
      failedRemoveTimelapse: 'Falha ao remover timelapse',
      timelapseUploaded: 'Timelapse enviado: {{filename}}',
      failedUploadTimelapse: 'Falha ao enviar timelapse',
      archiveDeleted: 'Arquivo excluído',
      failedDeleteArchive: 'Falha ao excluir arquivo',
      addedToFavorites: 'Adicionado aos favoritos',
      removedFromFavorites: 'Removido dos favoritos',
      projectUpdated: 'Projeto atualizado',
      failedUpdateProject: 'Falha ao atualizar projeto',
      linkCopied: 'Link copiado para a área de transferência',
      failedCopyLink: 'Falha ao copiar link',
      photoDeleted: 'Foto excluída',
      failedDeletePhoto: 'Falha ao excluir foto',
      failedDeleteArchives: 'Falha ao excluir arquivos',
      failedUpdateFavorites: 'Falha ao atualizar favoritos',
      exportDownloaded: 'Exportação baixada',
      exportFailed: 'Falha na exportação',
    },
    menu: {
      print: 'Imprimir',
      schedule: 'Agendar',
      openInBambuStudio: 'Abrir no Slicer',
      slice: 'Fatiar',
      externalLink: 'Link externo',
      viewOnMakerWorld: 'Ver no MakerWorld',
      preview3d: 'Pré-visualização 3D',
      viewTimelapse: 'Ver Timelapse',
      scanForTimelapse: 'Escanear Timelapse',
      uploadTimelapse: 'Enviar Timelapse',
      removeTimelapse: 'Remover Timelapse',
      downloadSource3mf: 'Baixar Source 3MF',
      uploadSource3mf: 'Enviar Source 3MF',
      replaceSource3mf: 'Substituir Source 3MF',
      removeSource3mf: 'Remover Source 3MF',
      uploadF3d: 'Enviar F3D',
      replaceF3d: 'Substituir F3D',
      downloadF3d: 'Baixar F3D',
      removeF3d: 'Remover F3D',
      download: 'Baixar',
      copyDownloadLink: 'Copiar link de download',
      qrCode: 'Qr Code',
      viewPhotos: 'Ver fotos',
      viewPhotosCount: 'Ver fotos ({{count}})',
      projectPage: 'Página do projeto',
      addToFavorites: 'Adicionar aos favoritos',
      removeFromFavorites: 'Remover dos favoritos',
      edit: 'Editar',
      printLog: 'Histórico de impressões',
      goToProject: 'Ir para o projeto: {{name}}',
      addToProject: 'Adicionar ao projeto',
      removeFromProject: 'Remover do projeto',
      loading: 'Carregando...',
      noProjectsAvailable: 'Nenhum projeto disponível',
      searchProjects: 'Pesquisar projetos…',
      select: 'Selecionar',
      deselect: 'Desmarcar',
      delete: 'Excluir',
    },
    permission: {
      noReprint: 'Você não tem permissão para reimprimir este arquivo',
      noAddToQueue: 'Você não tem permissão para adicionar à fila',
      noUpdateArchives: 'Você não tem permissão para atualizar arquivos',
      noUploadFiles: 'Você não tem permissão para enviar arquivos',
      noDownload: 'Você não tem permissão para baixar arquivos',
      noCopyLink: 'Você não tem permissão para copiar links de download',
      noDelete: 'Você não tem permissão para excluir este arquivo',
      noCreate: 'Você não tem permissão para criar arquivos',
    },
    platePicker: {
      title: 'Selecione a placa para visualizar',
      hint: 'Este arquivo contém várias placas. Escolha uma para abrir no visualizador GCode.',
      plateLabel: 'Placa {{index}}',
      objectCount: '{{count}} objeto',
      objectCount_plural: '{{count}} objetos',
      noGcode: 'Este arquivo não contém G-code fatiado para visualizar. Abra-o no Bambu Studio para fatiar primeiro.',
    },
    card: {
      previousPlate: 'Placa anterior',
      nextPlate: 'Próxima placa',
      plateNumber: 'Placa {{index}}',
      moreOptions: 'Clique com o botão direito para mais opções',
      addToFavorites: 'Adicionar aos favoritos',
      removeFromFavorites: 'Remover dos favoritos',
      cancelled: 'cancelado',
      failed: 'falha',
      duplicate: 'duplicado',
      duplicateTitle: 'Este modelo já foi impresso antes',
      openSource3mf: 'Abrir source 3MF no Bambu Studio (clique com o botão direito para mais opções)',
      downloadF3d: 'Baixar arquivo de design do Fusion 360',
      viewTimelapse: 'Ver timelapse',
      viewPhoto: 'Ver 1 foto',
      viewPhotos: 'Ver {{count}} fotos',
      openFolder: 'Abrir pasta: {{name}}',
      slicedFile: 'Arquivo fatiado - pronto para imprimir',
      sourceFile: 'Apenas arquivo fonte - nenhum mapeamento AMS disponível',
      gcode: 'GCODE',
      source: 'SOURCE',
      project: 'Projeto: {{name}}',
      runsBadge: '{{count}} impressões',
      runsBadgeTitle: '{{count}} impressões no total — {{successful}} bem-sucedidas, {{failed}} com falha. Clique para ver o histórico completo.',
      estimated: 'Estimado: {{time}}',
      actual: 'Real: {{time}}',
      accuracy: 'Precisão: {{percent}}%',
      filament: '{{weight}} g',
      layer: '{{count}} camada',
      layers: '{{count}} camadas',
      object: '{{count}} objeto',
      objects: '{{count}} objetos',
      slicedFor: 'Fatiado para {{model}}',
      uploadedBy: 'Enviado por',
      noPermissionReprint: 'Você não tem permissão para reimprimir',
      noFileForReprint: 'Nenhum arquivo 3MF disponível — o arquivo não pôde ser baixado da impressora quando a impressão foi registrada',
      noPermissionEdit: 'Você não tem permissão para editar arquivos',
      noPermissionDelete: 'Você não tem permissão para excluir arquivos',
      reprint: 'Reimprimir',
      schedulePrint: 'Agendar impressão',
      schedule: 'Agendar',
      openInBambuStudio: 'Abrir no Bambu Studio',
      openInBambuStudioToSlice: 'Abrir no Bambu Studio para fatiar',
      slice: 'Fatiar',
      externalLink: 'Link externo',
      makerWorld: 'MakerWorld – {{designer}}',
      viewProject: 'Ver projeto',
      noExternalLink: 'Nenhum link externo',
      preview3d: 'Visualização 3D',
      download: 'Baixar',
      edit: 'Editar',
      delete: 'Excluir',
    },
    runLog: {
      title: 'Histórico de impressões',
      modalTitle: 'Histórico de impressões — {{name}}',
      modalTitleFallback: 'este arquivo',
      empty: 'Nenhum evento de impressão registrado para este arquivo ainda.',
      col: {
        date: 'Data',
        status: 'Status',
        duration: 'Duração',
        filament: 'Filamento',
        cost: 'Custo',
      },
      status: {
        completed: 'Concluída',
        failed: 'Falhou',
        cancelled: 'Cancelada',
        stopped: 'Interrompida',
        skipped: 'Ignorada',
        printing: 'Imprimindo',
      },
    },
    modal: {
      deleteArchive: 'Excluir Arquivo',
      deleteConfirm: 'Tem certeza de que deseja excluir "{{name}}"? Esta ação não pode ser desfeita.',
      deleteButton: 'Excluir',
      deletePurgeStats: 'Remover também esta impressão das Quick Stats (filamento, tempo, custo, energia)',
      removeSource3mf: 'Remover Source 3MF',
      removeSource3mfConfirm: 'Tem certeza de que deseja remover o arquivo source 3MF de "{{name}}"? Isso excluirá o arquivo original do projeto do fatiador.',
      removeButton: 'Remover',
      removeF3d: 'Remover F3D',
      removeF3dConfirm: 'Tem certeza de que deseja remover o arquivo de design do Fusion 360 de "{{name}}"?',
      removeTimelapse: 'Remover Timelapse',
      removeTimelapseConfirm: 'Tem certeza de que deseja remover o vídeo timelapse de "{{name}}"?',
      timelapse: '{{name}} – Timelapse',
      selectTimelapse: 'Selecionar Timelapse',
      selectTimelapseDesc: 'Nenhuma correspondência automática encontrada. Selecione o timelapse para esta impressão:',
      deleteArchives: 'Excluir Arquivos',
      deleteArchivesConfirm: 'Tem certeza de que deseja excluir {{count}} arquivo(s)? Esta ação não pode ser desfeita.',
      deleteCount: 'Excluir {{count}}',
    },
    page: {
      title: 'Arquivos',
      printsCount: '{{filtered}} de {{total}} impressões',
      dropFilesHere: 'Solte arquivos .3mf aqui',
      releaseToUpload: 'Solte para enviar',
      only3mfSupported: 'Apenas arquivos .3mf são suportados',
      close: 'Fechar',
      selected: '{{count}} selecionado(s)',
      selectAll: 'Selecionar Todos',
      tags: 'Etiquetas',
      project: 'Projeto',
      favorite: 'Favorito',
      delete: 'Excluir',
      toggledFavorites: 'Favoritos alternados para {{count}} arquivo(s)',
      failedUpdateFavorites: 'Falha ao atualizar favoritos',
      archivesDeleted: '{{count}} arquivo(s) excluído(s)',
      failedDeleteArchives: 'Falha ao excluir arquivos',
      photoDeleted: 'Foto excluída',
      failedDeletePhoto: 'Falha ao excluir foto',
    },
    list: {
      name: 'Nome',
      printer: 'Impressora',
      date: 'Data',
      size: 'Tamanho',
      actions: 'Ações',
      hasTimelapse: 'Possui timelapse',
    },
    log: {
      date: 'Data',
      printName: 'Nome da Impressão',
      printer: 'Impressora',
      user: 'Usuário',
      status: 'Status',
      duration: 'Duração',
      filament: 'Filamento',
      allPrinters: 'Todas as Impressoras',
      allUsers: 'Todos os Usuários',
      allStatuses: 'Todos os Status',
      cancelled: 'Cancelado',
      skipped: 'Ignorado',
      dateFrom: 'De',
      dateTo: 'Até',
      noEntries: 'Nenhuma entrada de registro de impressão encontrada',
      showing: 'Mostrando {{count}} de {{total}} entradas',
      rowsPerPage: 'Linhas',
      page: 'Página',
      prev: 'Anterior',
      next: 'Próxima',
      clearLog: 'Limpar Registro',
      clearLogTitle: 'Limpar Registro de Impressão',
      clearLogConfirm: 'Todas as entradas do registro de impressão serão permanentemente excluídas. Arquivos e itens da fila não serão afetados. Esta ação não pode ser desfeita. Tem certeza?',
      clearLogButton: 'Limpar Tudo',
      cleared: '{{count}} entradas do registro de impressão limpas',
      clearFailed: 'Falha ao limpar o registro de impressão',
    },
  },

  // Queue page
  queue: {
    title: 'Fila de Impressão',
    subtitle: 'Agende e gerencie seus trabalhos de impressão',
    addToQueue: 'Adicionar à Fila',
    // Print modal
    print: 'Imprimir',
    reprint: 'Reimprimir',
    schedulePrint: 'Agendar Impressão',
    editQueueItem: 'Editar Item da Fila',
    printToPrinters: 'Imprimir para {{count}} Impressoras',
    queueToPrinters: 'Adicionar à Fila para {{count}} Impressoras',
    queueSelectedPlates: 'Adicionar {{count}} placas à fila',
    selectAllPlates: 'Selecionar todas as {{count}} placas',
    deselectAll: 'Desmarcar tudo',
    printQueued: 'Impressão adicionada à fila',
    itemsQueued: '{{count}} itens adicionados à fila',
    sending: 'Enviando...',
    sendingProgress: 'Enviando {{current}}/{{total}}...',
    adding: 'Adicionando...',
    addingProgress: 'Adicionando {{current}}/{{total}}...',
    savingProgress: 'Salvando {{current}}/{{total}}...',
    clearQueue: 'Limpar Fila',
    clearHistory: 'Limpar Histórico',
    emptyQueue: 'Fila vazia',
    position: 'Posição',
    scheduledTime: 'Hora Agendada',
    moveUp: 'Mover para Cima',
    moveDown: 'Mover para Baixo',
    startNow: 'Iniciar Agora',
    printingInProgress: 'Impressão em andamento...',
    viewArchive: 'Ver Arquivo',
    viewInFileManager: 'Ver no Gerenciador de Arquivos',
    itemCount: '{{count}} item',
    itemCount_plural: '{{count}} itens',
    dragToReorder: 'Arraste para reordenar (apenas ASAP)',
    reorderHint: 'A posição afeta apenas itens ASAP. Itens agendados são executados no horário definido.',
    sjf: {
      label: 'SJF',
      tooltip: 'Trabalho mais curto primeiro — o agendador prioriza impressões mais curtas',
    },
    addedBy: 'Adicionado por {{name}}',
    nextInQueue: 'Próximo na fila',
    clearPlateSuccess: 'Placa limpa — pronta para a próxima impressão',
    plateNumber: 'Placa {{index}}',
    // Batch / quantity
    quantity: 'Quantidade',
    quantityHint: 'Cria {{count}} itens na fila',
    activeBatches: 'Lotes ativos',
    batchProgress: '{{completed}} de {{total}} concluídos',
    cancelBatch: 'Cancelar restantes',
    batchCancelled: 'Itens restantes do lote cancelados',
    cancelBatchConfirmTitle: 'Cancelar lote',
    cancelBatchConfirmMessage: 'Cancelar todos os itens pendentes restantes neste lote?',
    batch: 'Lote',
    // Sections
    sections: {
      currentlyPrinting: 'Imprimindo Atualmente',
      queued: 'Na Fila',
      history: 'Histórico',
    },
    // Status
    status: {
      pending: 'Pendente',
      waiting: 'Aguardando',
      printing: 'Imprimindo',
      paused: 'Pausado',
      completed: 'Concluído',
      failed: 'Falhou',
      skipped: 'Ignorado',
      cancelled: 'Cancelado',
    },
    // Summary cards
    summary: {
      printing: 'Imprimindo',
      queued: 'Na Fila',
      totalTime: 'Tempo Total da Fila',
      totalWeight: 'Peso Total da Fila',
      history: 'Histórico',
    },
    // Filters
    filter: {
      allPrinters: 'Todas as Impressoras',
      unassigned: 'Não Atribuído',
      allStatus: 'Todos os Status',
      allLocations: 'Todos os Locais',
      any: 'Qualquer',
    },
    // Sort
    sort: {
      byPosition: 'Ordenar por Posição',
      byName: 'Ordenar por Nome',
      byPrinter: 'Ordenar por Impressora',
      bySchedule: 'Ordenar por Agendamento',
      byDate: 'Ordenar por Data',
      ascendingOldest: 'Crescente (mais antigo primeiro)',
      descendingNewest: 'Decrescente (mais recente primeiro)',
    },
    // Badges
    badges: {
      staged: 'Preparado (início manual)',
      requiresPrevious: 'Requer sucesso anterior',
      autoPowerOff: 'Desligamento automático',
      gcodeInjection: 'G-code',
    },
    // Empty state
    empty: {
      title: 'Nenhuma impressão agendada',
      description: 'Agende uma impressão a partir da página de Arquivos usando a opção "Agendar" no menu de contexto, ou arraste e solte arquivos para começar.',
    },
    // Time
    time: {
      asap: 'ASAP',
      overdue: 'Atrasado',
      now: 'Agora',
      lessThanMinute: 'Em menos de um minuto',
      inMinutes: 'Em {{count}} min',
      inHours: 'Em {{count}} horas',
    },
    // Actions
    actions: {
      stopPrint: 'Parar Impressão',
      startPrint: 'Iniciar Impressão',
      requeue: 'Reenfileirar',
    },
    // Bulk edit
    bulkEdit: {
      title: 'Editar {{count}} Item',
      title_plural: 'Editar {{count}} Itens',
      description: 'Apenas as configurações alteradas serão aplicadas aos itens selecionados.',
      printer: 'Impressora',
      noChange: '— Sem alterações —',
      queueOptions: 'Opções de Fila',
      staged: 'Preparado (início manual)',
      autoPowerOff: 'Desligamento automático após impressão',
      requirePrevious: 'Requer sucesso anterior',
      printOptions: 'Opções de Impressão',
      bedLevelling: 'Nivelamento da Mesa',
      flowCalibration: 'Calibração de Fluxo',
      vibrationCalibration: 'Calibração de Vibração',
      layerInspection: 'Inspeção da Primeira Camada',
      timelapse: 'Timelapse',
      useAms: 'Usar AMS',
      applyChanges: 'Aplicar Alterações',
      selectAll: 'Selecionar Todos',
      deselectAll: 'Desmarcar Todos',
      selected: '{{count}} selecionado(s)',
      editSelected: 'Editar Selecionados',
      cancelSelected: 'Cancelar Selecionados',
    },
    // Confirmations
    confirm: {
      cancelTitle: 'Cancelar Impressão Agendada',
      cancelMessage: 'Tem certeza de que deseja cancelar "{{name}}"?',
      stopTitle: 'Parar Impressão',
      stopMessage: 'Tem certeza de que deseja parar a impressão atual "{{name}}"? Isso cancelará o trabalho de impressão na impressora.',
      removeTitle: 'Remover do Histórico',
      removeMessage: 'Tem certeza de que deseja remover "{{name}}" do histórico da fila?',
      clearHistoryTitle: 'Limpar Histórico',
      clearHistoryMessage: 'Tem certeza de que deseja remover todos os {{count}} itens do histórico?',
      cancelButton: 'Cancelar Impressão',
      stopButton: 'Parar Impressão',
      thisPrint: 'esta impressão',
      thisItem: 'este item',
    },
    // Toast messages
    toast: {
      cancelled: 'Item da fila cancelado',
      cancelFailed: 'Falha ao cancelar item',
      removed: 'Item da fila removido',
      removeFailed: 'Falha ao remover item',
      stopped: 'Impressão parada',
      stopFailed: 'Falha ao parar impressão',
      released: 'Impressão liberada para a fila',
      startFailed: 'Falha ao iniciar impressão',
      reorderFailed: 'Falha ao reordenar fila',
      historyCleared: 'Limpar {{count}} item(s) do histórico',
      clearHistoryFailed: 'Falha ao limpar histórico',
      updateFailed: 'Falha ao atualizar itens',
      bulkCancelled: 'Cancelado {{count}} item(s)',
      bulkCancelFailed: 'Falha ao cancelar itens',
    },
    // Timeline view
    timeline: {
      listView: 'Lista',
      timelineView: 'Linha do tempo',
      unassigned: 'Não atribuído',
      noData: 'Nenhuma impressão agendada para este dia',
      allDoneBy: 'Todas as impressões concluídas até {{time}}',
      staged: 'Preparado',
      filterAll: 'Mostrar tudo',
      filterPrinting: 'Imprimindo',
      filterQueued: 'Na fila',
      time: {
        anyMoment: 'a qualquer momento',
        minutesLeft: '{{minutes}}m restantes',
        hoursLeft: '{{hours}}h restantes',
        hoursMinutesLeft: '{{hours}}h {{minutes}}m restantes',
      },
      day: {
        previous: 'Dia anterior',
        next: 'Próximo dia',
        today: 'Hoje',
      },
    },
    // Permissions
    permissions: {
      noStopPrint: 'Você não tem permissão para parar impressões',
      noStartPrint: 'Você não tem permissão para iniciar impressões',
      noEdit: 'Você não tem permissão para editar este item da fila',
      noCancel: 'Você não tem permissão para cancelar este item da fila',
      noRequeue: 'Você não tem permissão para reenfileirar itens',
      noRemove: 'Você não tem permissão para remover este item da fila',
      noClearHistory: 'Você não tem permissão para limpar todo o histórico',
      noEditItems: 'Você não tem permissão para editar itens da fila',
      noCancelItems: 'Você não tem permissão para cancelar itens da fila',
    },
  },

  backgroundDispatch: {
    unknownFile: 'Arquivo desconhecido',
    unknownPrinter: 'Impressora desconhecida',
    startingPrints: 'Iniciando impressões',
    progressSummary: '{{complete}}/{{total}} concluídos • Despachados: {{dispatched}} • Processando: {{processing}}',
    expandDetails: 'Expand dispatch details',
    collapseDetails: 'Collapse dispatch details',
    dismissToast: 'Dispensar notificação de despacho',
    cancelDispatchJob: 'Cancelar despacho',
    cancel: 'Cancelar',
    cancelling: 'Cancelando…',
    awaitingPrinter: 'Aguardando impressora…',
    status: {
      dispatched: 'Despachado',
      processing: 'Processando',
      completed: 'Concluído',
      failed: 'Falhou',
      cancelled: 'Cancelado',
    },
    toast: {
      cancellingUpload: 'Cancelling upload...',
      cancelled: 'Despacho cancelado',
      cancelFailed: 'Falha ao cancelar despacho',
      completeWithFailures: 'Despacho em segundo plano concluído: {{completed}} sucesso(s), {{failed}} falha(s)',
      completeSuccess: 'Despacho em segundo plano concluído: {{completed}} sucesso(s)',
      printStartedRemaining: '{{completed}} impressão(ões) iniciada(s), {{remaining}} enviando...',
    },
  },

  // Statistics page
  stats: {
    title: 'Estatísticas',
    subtitle: 'Arraste os widgets para reorganizar. Clique no ícone de olho para ocultar.',
    overview: 'Visão Geral',
    totalPrints: 'Total de Impressões',
    successRate: 'Taxa de Sucesso',
    totalPrintTime: 'Tempo Total de Impressão',
    printTime: 'Tempo de Impressão',
    totalFilament: 'Filamento Total Utilizado',
    filamentUsed: 'Filamento Utilizado',
    filamentCost: 'Custo do Filamento',
    totalCost: 'Custo Total',
    energyUsed: 'Energia Utilizada',
    energyCost: 'Custo da Energia',
    energyWarmingUpTooltip: 'O monitoramento de energia ainda está coletando snapshots por hora. Os totais por período ficarão precisos quando houver pelo menos um snapshot antes do intervalo selecionado. Valores iniciais podem ser subestimados.',
    averagePrintTime: 'Tempo Médio de Impressão',
    printsPerDay: 'Impressões por Dia',
    byPrinter: 'Por Impressora',
    printsByPrinter: 'Impressões por Impressora',
    byMaterial: 'Por Material',
    byMonth: 'Por Mês',
    last7Days: 'Últimos 7 Dias',
    last30Days: 'Últimos 30 Dias',
    last90Days: 'Últimos 90 Dias',
    allTime: 'Todo o Tempo',
    // Widgets
    quickStats: 'Estatísticas Rápidas',
    printActivity: 'Atividade de Impressão',
    filamentTypes: 'Tipos de Filamento',
    filamentTrends: 'Tendências de Filamento',
    failureAnalysis: 'Análise de Falhas',
    timeAccuracy: 'Precisão do Tempo',
    successful: 'Bem-sucedido:',
    failed: 'Falhou:',
    perfectEstimate: '100% = estimativa perfeita',
    noTimeAccuracyData: 'Nenhum dado de precisão de tempo disponível',
    noFilamentData: 'Nenhum dado de filamento disponível',
    noPrinterData: 'Nenhum dado de impressora disponível',
    noPrintData: 'Nenhum dado de impressão disponível',
    noPrintDataLast30Days: 'Nenhum dado de impressão nos últimos 30 dias',
    failureReasons: 'Razões de Falha',
    topFailureReasons: 'Principais Razões de Falha',
    failedPrintsCount: '{{failed}} / {{total}} impressões falharam',
    lastWeekRate: 'Última semana: {{rate}}%',
    // Actions
    resetLayout: 'Redefinir Layout',
    recalculateCosts: 'Recalcular Custos',
    recalculateCostsHint: 'Recalcular todos os custos do arquivo usando os preços atuais do filamento',
    exportStats: 'Exportar Estatísticas',
    exportAsCsv: 'Exportar como CSV',
    exportAsExcel: 'Exportar como Excel',
    hiddenCount: '{{count}} Oculto',
    // Toast
    exportDownloaded: 'Exportação baixada',
    exportFailed: 'Falha na exportação',
    layoutReset: 'Layout redefinido',
    recalculatedCosts: 'Custos recalculados para {{count}} arquivos',
    recalculateFailed: 'Falha ao recalcular custos',
    // Loading
    loadingStats: 'Carregando estatísticas...',
    // Permissions
    noPermissionResetLayout: 'Você não tem permissão para redefinir o layout',
    noPermissionRecalculate: 'Você não tem permissão para recalcular custos',
    noPrintDataInRange: 'Sem dados no período selecionado',
    periodFilament: 'Filamento usado',
    periodCost: 'Custo',
    avgPerPrint: 'Média por impressão',
    usageOverTime: 'Uso ao longo do tempo',
    filamentByWeight: 'Peso',
    printDuration: 'Duração da impressão',
    printerUtilization: 'Utilização da impressora',
    filamentSuccess: 'Sucesso por material',
    printHabits: 'Hábitos de impressão',
    printTimeOfDay: 'Horário de impressão',
    colorDistribution: 'Distribuição de cores',
    noColorData: 'Nenhum dado de cor disponível',
    records: 'Recordes',
    longestPrint: 'Impressão mais longa',
    heaviestPrint: 'Impressão mais pesada',
    mostExpensivePrint: 'Mais cara',
    busiestDay: 'Dia mais movimentado',
    successStreak: 'Sequência de sucesso',
    streakPrint: 'impressão consecutiva',
    streakPrints: '{{count}} impressões consecutivas',
    printerStats: 'Estatísticas da impressora',
    hours: 'horas',
    avgPrints: 'Méd. impressões',
    noArchiveData: 'Nenhum dado de impressão disponível',
    filamentByTime: 'Tempo',
    avgWeight: 'Méd. peso',
    avgTime: 'Méd. tempo',
    filamentByPrints: 'Impressões',
    timeframe: {
      today: 'Hoje',
      'this-week': 'Esta semana',
      'this-month': 'Este mês',
      'last-7': 'Últimos 7 dias',
      'last-30': 'Últimos 30 dias',
      'last-90': 'Últimos 90 dias',
      'this-year': 'Este ano',
      'all-time': 'Todo o período',
      custom: 'Personalizado',
      from: 'De',
      to: 'Até',
    },
    allUsers: 'Todos os Usuários',
    noUser: 'Sem Usuário (Sistema)',
    filterByUser: 'Filtrar por Usuário',
  },

  // Maintenance page
  maintenance: {
    title: 'Manutenção',
    overview: 'Visão Geral',
    allOk: 'Todas as manutenções estão em dia',
    dueCount: '{{count}} item pendente',
    dueCount_plural: '{{count}} itens pendentes',
    warningCount: '{{count}} aviso',
    warningCount_plural: '{{count}} avisos',
    totalPrintTime: 'Tempo Total de Impressão',
    nextMaintenance: 'Próxima Manutenção',
    nothingDue: 'Nada pendente',
    tasks: 'Tarefas',
    lastPerformed: 'Última execução',
    interval: 'Intervalo',
    hoursRemaining: '{{hours}}h restantes',
    hoursOverdue: '{{hours}}h atrasadas',
    markDone: 'Marcar como Concluída',
    performMaintenance: 'Realizar Manutenção',
    history: 'Histórico',
    noHistory: 'Nenhum histórico de manutenção',
    editPrintHours: 'Editar Horas de Impressão',
    currentHours: 'Horas Atuais',
    // Tabs
    statusTab: 'Status',
    settingsTab: 'Configurações',
    // Status
    overdueCount: '{{count}} atrasado',
    dueSoonCount: '{{count}} prestes a vencer',
    dueSoon: 'Prestes a vencer',
    allGood: 'Tudo certo',
    overdueBy: 'Atrasado por {{duration}}',
    dueIn: 'Vence em {{duration}}',
    timeLeft: '{{duration}} restantes',
    // Duration formats
    day: '1 dia',
    days: '{{count}} dias',
    week: '1 semana',
    weeks: '{{count}} semanas',
    month: '1 mês',
    months: '{{count}} meses',
    year: '1 ano',
    // Settings
    maintenanceTypes: 'Tipos de Manutenção',
    maintenanceTypesDescription: 'Tipos de sistema e suas tarefas de manutenção personalizadas',
    addCustomType: 'Adicionar Tipo Personalizado',
    restoreDefaults: 'Restaurar Tarefas Padrão',
    intervalType: 'Tipo de Intervalo',
    intervalValue: 'Intervalo ({{type}})',
    icon: 'Ícone',
    documentationLink: 'Link da Documentação (opcional)',
    assignToPrinters: 'Atribuir a Impressoras',
    selectAtLeastOnePrinter: 'Selecione pelo menos uma impressora',
    addType: 'Adicionar Tipo',
    custom: 'Personalizado',
    printHours: 'Horas de Impressão',
    calendarDays: 'Dias de Calendário',
    exampleName: 'ex., Substituir Filtro HEPA',
    viewDocumentation: 'Ver documentação',
    timeBasedInterval: 'Intervalo baseado em tempo',
    // Interval overrides
    intervalOverrides: 'Substituições de Intervalo',
    intervalOverridesDescription: 'Personalize os intervalos para impressoras específicas',
    // Printer assignment
    assignedToPrinters: 'Atribuído a impressoras:',
    noPrintersAssigned: 'Nenhuma impressora atribuída',
    addPrinterShort: 'Adicionar:',
    printersAssignedClick: '{{count}} impressora(s) atribuída(s) - clique para gerenciar',
    removeFromPrinter: 'Remover desta impressora',
    // Types
    types: {
      lubricateCarbonRods: 'Lubricar Barras de Carbono',
      lubricateRails: 'Lubricar Trilhos Lineares',
      cleanNozzle: 'Limpar Bico/Hotend',
      checkBelts: 'Verificar Tensão das Correias',
      cleanBuildPlate: 'Limpar Plataforma de Impressão',
      checkExtruder: 'Verificar Engrenagens do Extrusor',
      checkCooling: 'Verificar Ventiladores de Resfriamento',
      generalInspection: 'Inspeção Geral',
      cleanCarbonRods: 'Limpar Barras de Carbono',
      lubricateSteelRods: 'Lubrificar Barras de Aço',
      cleanSteelRods: 'Limpar Barras de Aço',
      cleanLinearRails: 'Limpar Trilhos Lineares',
      checkPtfeTube: 'Verificar Tubo PTFE',
      replaceHepaFilter: 'Substituir Filtro HEPA',
      replaceCarbonFilter: 'Substituir Filtro de Carbono',
      lubricateLeftNozzleRail: 'Lubrificar Trilho do Bico Esquerdo',
    },
    // Toast
    maintenanceComplete: 'Manutenção marcada como concluída',
    typeUpdated: 'Tipo de manutenção atualizado',
    typeDeleted: 'Tipo de manutenção excluído',
    defaultsRestored: 'Restauradas {{count}} tarefa(s) padrão',
    printHoursUpdated: 'Horas de impressão atualizadas',
    printerAssigned: 'Impressora atribuída',
    printerRemoved: 'Impressora removida',
    // Confirmation
    deleteTypeConfirm: 'Excluir "{{name}}"?',
    deleteSystemTypeTitle: 'Excluir tarefa de manutenção padrão?',
    deleteSystemTypeMessage: 'Tem certeza de que deseja excluir a tarefa de manutenção padrão "{{name}}"?',
    // Permissions
    noPermissionUpdate: 'Você não tem permissão para atualizar itens de manutenção',
    noPermissionPerform: 'Você não tem permissão para realizar manutenção',
    noPermissionEditTypes: 'Você não tem permissão para editar tipos de manutenção',
    noPermissionDeleteTypes: 'Você não tem permissão para excluir tipos de manutenção',
    noPermissionEditHours: 'Você não tem permissão para editar horas de impressão',
    noPermissionRemovePrinter: 'Você não tem permissão para remover atribuições de impressora',
    noPermissionAssignPrinter: 'Você não tem permissão para atribuir impressoras',
    noPermissionEditIntervals: 'Você não tem permissão para editar intervalos',
    // Configure link
    configureSettings: 'Configure tipos de manutenção e intervalos',
  },

  // Settings page
  settings: {
    title: 'Configurações',
    general: 'Geral',
    // Tab names
    tabs: {
      general: 'Geral',
      smartPlugs: 'Tomadas Inteligentes',
      notifications: 'Notificações',
      queue: 'Fluxo',
      filament: 'Filamento',
      network: 'Rede',
      apiKeys: 'Chaves API',
      virtualPrinter: 'Impressora Virtual',
      failureDetection: 'Detecção de Falhas',
      users: 'Autenticação',
      backup: 'Backup',
      emailAuth: 'Autenticação por Email',
      ldap: 'LDAP',
      twoFa: 'Autenticação 2FA',
      oidc: 'SSO / OIDC',
      security: 'Segurança',
      spoolbuddy: 'SpoolBuddy',
    },
    ldap: {
      title: 'Autenticação LDAP',
      enabledDesc: 'A autenticação LDAP está ativada',
      disabledDesc: 'A autenticação LDAP está desativada',
      disabledHint: 'Configure e salve as configurações LDAP abaixo, depois ative.',
      enabled: 'Autenticação LDAP ativada',
      disabled: 'Autenticação LDAP desativada',
      feature1: 'Usuários podem fazer login com credenciais LDAP',
      feature2: 'A conta de administrador local permanece como fallback',
      feature3: 'Grupos LDAP são mapeados para grupos BamBuddy no login',
      serverConfig: 'Configuração do Servidor LDAP',
      serverUrl: 'URL do servidor',
      serverUrlHint: 'Use ldap:// para padrão ou ldaps:// para conexões SSL',
      security: 'Segurança',
      securityHint: 'StartTLS atualiza uma conexão simples para TLS. LDAPS usa TLS desde o início.',
      bindDn: 'Bind DN (conta de serviço)',
      bindPassword: 'Senha Bind',
      searchBase: 'Base DN de pesquisa',
      userFilter: 'Filtro de pesquisa de usuário',
      userFilterHint: '{username} é substituído pelo nome de usuário. Use (uid={username}) para OpenLDAP.',
      advanced: 'Avançado',
      autoProvision: 'Provisionamento automático de usuários',
      autoProvisionHint: 'Criar automaticamente uma conta BamBuddy no primeiro login LDAP',
      defaultGroup: 'Grupo padrão',
      defaultGroupNone: '— Nenhum (sem fallback) —',
      defaultGroupHint: 'Grupo de fallback atribuído quando um usuário LDAP se autentica mas não está em nenhum grupo LDAP mapeado. Deixe vazio para manter usuários não mapeados sem permissões.',
      groupMapping: 'Mapeamento de grupos (JSON)',
      groupMappingHint: 'Mapear DNs de grupos LDAP para grupos BamBuddy. Grupos disponíveis: ',
      testConnection: 'Testar conexão',
      settingsSaved: 'Configurações LDAP salvas',
      errors: {
        serverRequired: 'URL do servidor LDAP é obrigatória',
        searchBaseRequired: 'Base DN de pesquisa é obrigatória',
        enableAuthFirst: 'Ative a autenticação primeiro',
        configureLdapFirst: 'Salve as configurações LDAP primeiro',
      },
    },
    // Email settings
    email: {
      smtpSettings: 'Configuração SMTP',
      smtpHost: 'Servidor SMTP',
      smtpPort: 'Porta SMTP',
      security: 'Segurança',
      authentication: 'Autenticação',
      username: 'Nome de Usuário',
      password: 'Senha',
      fromEmail: 'Email de Remetente',
      fromName: 'Nome de Remetente',
      testConnection: 'Testar Conexão SMTP',
      testRecipient: 'Email de Teste',
      sendTest: 'Enviar Email de Teste',
      sending: 'Enviando...',
      save: 'Salvar Configurações',
      saving: 'Salvando...',
      advancedAuth: 'Autenticação Avançada',
      advancedAuthEnabled: 'Autenticação Avançada está habilitada',
      advancedAuthEnabledDesc: 'Recursos de gerenciamento de usuários baseados em email estão ativos. Novos usuários receberão senhas geradas automaticamente por email, e os usuários podem redefinir suas senhas através do recurso de esqueci minha senha.',
      advancedAuthDisabled: 'Autenticação Avançada está desabilitada',
      advancedAuthDisabledDesc: 'Habilite a autenticação avançada para ativar recursos baseados em email para gerenciamento de usuários.',
      enable: 'Habilitar',
      disable: 'Desabilitar',
      feature1: 'Senhas são geradas automaticamente e enviadas por email para novos usuários',
      feature2: 'Usuários podem fazer login com nome de usuário ou email',
      feature3: 'Recurso de esqueci minha senha está disponível',
      feature4: 'Administradores podem redefinir senhas de usuários via email',
      // Error messages
      errors: {
        requiredFields: 'Por favor, preencha todos os campos obrigatórios',
        usernameRequired: 'Nome de usuário é obrigatório quando a autenticação está habilitada',
        enterTestEmail: 'Por favor, insira um endereço de email de teste',
        smtpServerAndEmail: 'Por favor, preencha o servidor SMTP e o email de remetente antes de testar',
        usernamePasswordRequired: 'Nome de usuário e senha são obrigatórios quando a autenticação está habilitada',
        configureSmtpFirst: 'Por favor, configure e teste as configurações SMTP primeiro',
        enableAuthFirst: 'Por favor, habilite a autenticação primeiro para usar os recursos baseados em e-mail.',
      },
      // Success messages
      success: {
        settingsSaved: 'Configurações SMTP salvas com sucesso',
      },
      // Security options
      securityOptions: {
        starttls: 'STARTTLS (Porta 587)',
        ssl: 'SSL/TLS (Porta 465)',
        none: 'Nenhuma (Porta 25)',
      },
      // Authentication options
      authOptions: {
        enabled: 'Habilitado',
        disabled: 'Desabilitado',
      },
    },
    appearance: 'Aparência',
    notifications: 'Notificações',
    smartPlugs: 'Tomadas Inteligentes',
    spoolman: 'Spoolman',
    updates: 'Atualizações',
    language: 'Idioma',
    languageDescription: 'Selecione seu idioma preferido',
    theme: 'Tema',
    themeLight: 'Claro',
    themeDark: 'Escuro',
    themeSystem: 'Sistema',
    defaultView: 'Visualização Padrão',
    defaultViewDescription: 'Página a ser exibida ao abrir o aplicativo',
    checkForUpdates: 'Verificar Atualizações',
    autoUpdate: 'Atualização Automática',
    currentVersion: 'Versão Atual',
    latestVersion: 'Última Versão',
    upToDate: 'Você está atualizado',
    updateAvailable: 'Atualização disponível',
    // Notifications
    notificationLanguage: 'Idioma das Notificações',
    notificationLanguageDescription: 'Idioma para notificações push',
    bedCooledThreshold: 'Limite de Resfriamento da Cama',
    bedCooledThresholdDescription: 'Temperatura abaixo da qual a cama é considerada resfriada após uma impressão',
    userNotificationsEnabled: 'Notificações do Usuário',
    userNotificationsEnabledDescription: 'Ativa o menu de notificações do usuário e notificações por e-mail para eventos de impressão. Requer Autenticação Avançada.',
    userNotificationsDisabledHint: 'Ative a Autenticação Avançada para usar as notificações do usuário.',
    notificationProviders: 'Provedores de Notificação',
    addProvider: 'Adicionar Provedor',
    editProvider: 'Editar Provedor',
    providerType: 'Tipo de Provedor',
    testNotification: 'Testar Notificação',
    testSuccess: 'Notificação de teste enviada com sucesso',
    testFailed: 'Falha ao enviar notificação de teste',
    quietHours: 'Horas de Silêncio',
    quietHoursDescription: 'Não perturbe durante essas horas',
    quietHoursStart: 'Início',
    quietHoursEnd: 'Fim',
    events: {
      title: 'Eventos de Notificação',
      printStart: 'Impressão Iniciada',
      printComplete: 'Impressão Concluída',
      printFailed: 'Falha na Impressão',
      printStopped: 'Impressão Interrompida',
      printProgress: 'Marcos de Progresso',
      printProgressDescription: 'Notificar em 25%, 50%, 75%',
      printerOffline: 'Impressora Offline',
      printerError: 'Erro na Impressora',
      filamentLow: 'Filamento Baixo',
      maintenanceDue: 'Manutenção Pendente',
      maintenanceDueDescription: 'Notificar quando a manutenção for necessária',
    },
    // Smart Plugs
    smartPlug: {
      title: 'Tomadas Inteligentes',
      add: 'Adicionar Tomada Inteligente',
      edit: 'Editar Tomada Inteligente',
      name: 'Nome',
      ipAddress: 'Endereço IP',
      linkedPrinter: 'Impressora Vinculada',
      autoOn: 'Ligar Automaticamente',
      autoOnDescription: 'Ligar quando a impressão começar',
      autoOff: 'Desligar Automaticamente',
      autoOffDescription: 'Desligar após a conclusão da impressão',
      offDelay: 'Atraso para Desligar',
      offDelayMinutes: 'Minutos após a impressão',
      offDelayTemp: 'Quando o bico estiver abaixo da temperatura',
      currentState: 'Estado Atual',
      turnOn: 'Ligar',
      turnOff: 'Desligar',
    },
    // Filament Tracking Mode
    filamentTracking: 'Rastreamento de Filamento',
    filamentTrackingDesc: 'Escolha como rastrear seus rolos de filamento. Você pode usar o inventário interno ou conectar a um servidor Spoolman externo.',
    filamentChecks: 'Verificações de filamento',
    disableFilamentWarnings: 'Desativar avisos de filamento',
    disableFilamentWarningsDesc: 'Não mostrar avisos sobre filamento insuficiente ao imprimir ou adicionar à fila',
    preferLowestFilament: 'Preferir filamento com menor resto',
    preferLowestFilamentDesc: 'Quando vários carretéis correspondem, usar o com menos filamento restante',
    trackingModeBuiltIn: 'Inventário Interno',
    trackingModeBuiltInDesc: 'Correspondência automática de RFID e rastreamento de uso incluídos',
    trackingModeSpoolmanDesc: 'Servidor de gerenciamento de filamento externo',
    builtInFeatureRfid: 'Detecta automaticamente rolos RFID da Bambu Lab no AMS',
    builtInFeatureUsage: 'Rastreia o consumo de filamento por impressão',
    builtInFeatureCatalog: 'Gerencia rolos, cores e perfis de fator K',
    builtInFeatureThirdParty: 'Rolos de terceiros podem ser atribuídos aos rolos do inventário',
    amsSyncButton: 'Sincronizar Pesos do AMS',
    amsSyncTitle: 'Sincronizar Pesos dos Rolos do AMS',
    amsSyncMessage: 'Isso substituirá todos os pesos dos rolos do inventário pelos valores atuais de % restante do AMS das impressoras conectadas. Use isso para recuperar dados de peso corrompidos. As impressoras devem estar online.',
    amsSyncing: 'Sincronizando...',
    amsSyncSuccess: '{{synced}} rolo(s) sincronizado(s), {{skipped}} ignorado(s)',
    amsSyncError: 'Falha ao sincronizar pesos do AMS',
    spoolmanAmsSyncButton: 'Sincronizar pesos do Spoolman pelo AMS',
    spoolmanAmsSyncTitle: 'Sincronizar pesos dos rolos Spoolman pelo AMS',
    spoolmanAmsSyncMessage: 'Isso atualizará os pesos de todos os rolos Spoolman com base nos valores atuais de % restante do AMS das impressoras conectadas. As impressoras devem estar online.',
    spoolmanAmsSyncing: 'Sincronizando...',
    spoolmanAmsSyncSuccess: '{{synced}} rolo(s) Spoolman sincronizado(s), {{skipped}} ignorado(s)',
    spoolmanAmsSyncError: 'Falha ao sincronizar pesos do Spoolman pelo AMS',
    spoolmanAmsSyncErrorUnreachable: 'Falha na sincronização (Spoolman inacessível)',
    spoolmanAmsSyncErrorNotConfigured: 'Falha na sincronização (Spoolman não configurado)',
    spoolmanNotConfigured: 'Spoolman não configurado',
    // Spoolman filament catalog section in spool catalog settings
    spoolmanFilamentCatalogTitle: 'Catálogo de filamentos Spoolman',
    spoolmanFilamentCatalogDesc: 'Nomes de filamentos e pesos tara da sua instância Spoolman. Nome e peso do carretel são editáveis aqui; todas as outras propriedades são gerenciadas diretamente no Spoolman.',
    // Spoolman settings
    spoolmanUrl: 'Spoolman URL',
    spoolmanUrlHint: 'URL do seu servidor Spoolman (por exemplo, http://localhost:7912)',
    spoolmanConnected: 'Conectado',
    spoolmanDisconnected: 'Desconectado',
    status: 'Status',
    connect: 'Conectar',
    disconnect: 'Desconectar',
    howSyncWorks: 'Como a Sincronização Funciona',
    syncInfoRfidOnly: 'Apenas rolos oficiais da Bambu Lab com RFID são sincronizados',
    syncInfoAutoCreate: 'Novos rolos são criados automaticamente no Spoolman na primeira sincronização',
    syncInfoThirdPartySkipped: 'Rolos não oficiais da Bambu Lab (terceiros, reabastecidos) são ignorados',
    linkingExistingSpools: 'Vinculando Rolos Existentes',
    linkingExistingSpoolsDesc: 'Para vincular rolos existentes do Spoolman ao seu AMS, passe o mouse sobre um slot do AMS e clique em "Vincular ao Spoolman".',
    syncMode: 'Modo de Sincronização',
    syncModeAuto: 'Automático',
    syncModeManual: 'Apenas Manual',
    syncModeAutoDesc: 'Os dados do AMS são sincronizados automaticamente quando alterações são detectadas',
    syncModeManualDesc: 'Somente sincronize quando acionado manualmente',
    syncAmsData: 'Sincronizar Dados do AMS',
    syncAmsDataDesc: 'Sincronize manualmente os dados do AMS da impressora com o Spoolman',
    allPrinters: 'Todas as Impressoras',
    // Default printer
    noDefaultPrinter: 'Sem padrão (perguntar a cada vez)',
    // Sidebar
    sidebarOrder: 'Ordem da barra lateral',
    // Camera
    saveThumbnails: 'Salvar miniaturas',
    captureFinishPhoto: 'Capturar foto de conclusão',
    noPrintersConfigured: 'Nenhuma impressora configurada',
    // Archive settings
    archiveMode: {
      always: 'Sempre criar entrada de arquivo',
      never: 'Nunca criar entrada de arquivo',
      ask: 'Perguntar a cada vez',
    },
    // Updates
    checkForUpdatesLabel: 'Verificar atualizações',
    checkPrinterFirmware: 'Verificar firmware da impressora',
    includeBetaUpdates: 'Incluir versões beta',
    includeBetaUpdatesDesc: 'Notificar sobre versões beta e pré-lançamento ao verificar atualizações',
    // Queue
    enableRetry: 'Habilitar tentativa',
    // Home Assistant
    homeAssistantDescription: 'Controlar tomadas inteligentes via Home Assistant',
    environmentManagedLabel: '(Gerenciado pelo Ambiente)',
    autoEnabledViaEnv: 'Habilitado automaticamente via variáveis de ambiente',
    urlFromEnvReadOnly: 'Valor definido pela variável de ambiente HA_URL (somente leitura)',
    tokenFromEnvReadOnly: 'Valor definido pela variável de ambiente HA_TOKEN (somente leitura)',
    // MQTT
    mqttConnectedTo: 'Conectado a',
    // Prometheus
    prometheusDescription: 'Expor dados da impressora no formato Prometheus',
    // Smart plugs empty state
    noSmartPlugsTitle: 'Nenhuma tomada inteligente configurada',
    noSmartPlugsDescription: 'Adicione uma tomada inteligente baseada em Tasmota para monitorar o consumo de energia e automatizar o controle de energia.',
    // Notifications empty state
    noProvidersTitle: 'Nenhum provedor configurado',
    noProvidersDescription: 'Adicione um provedor para receber alertas.',
    noTemplatesAvailable: 'Nenhum modelo disponível. Reinicie o backend para gerar os modelos padrão.',
    // API permissions
    apiPermissionView: 'Visualizar status da impressora e fila',
    apiPermissionEdit: 'Adicionar e remover itens da fila de impressão',
    // API keys
    apiKeysEmptyTitle: 'Nenhuma chave API',
    apiKeysEmptyDescription: 'Crie uma chave API para integrar com serviços externos.',
    // Users
    noUsersFound: 'Nenhum usuário encontrado',
    noGroupsFound: 'Nenhum grupo encontrado',
    noGroupsAvailable: 'Nenhum grupo disponível',
    passwordsDoNotMatch: 'As senhas não coincidem',
    systemGroupWarning: 'Os nomes dos grupos do sistema não podem ser alterados',
    // Auth disabled
    authDisabledTitle: 'Autenticação Desativada',
    authDisabledFeature1: 'Exigir login para acessar o sistema',
    authDisabledFeature2: 'Criar múltiplos usuários com permissões baseadas em grupos',
    authDisabledFeature3: 'Controlar acesso com mais de 50 permissões granulares',
    // User deletion
    userHasCreated: 'Este usuário criou:',
    userItemsQuestion: 'O que você gostaria de fazer com esses itens?',
    deleteUserConfirm: 'Tem certeza de que deseja excluir este usuário?',
    actionCannotBeUndone: 'Esta ação não pode ser desfeita.',
    // Smart plugs
    addFirstSmartPlug: 'Adicione sua primeira tomada inteligente',
    // Notifications
    providers: 'Provedores',
    log: 'Registro',
    testAll: 'Testar tudo',
    testResults: 'Resultados do teste',
    testPassedCount: '{{count}} aprovado',
    testFailedCount: '{{count}} falhou',
    messageTemplates: 'Modelos de mensagem',
    messageTemplatesDescription: 'Personalize as mensagens de notificação para cada evento.',
    // API Keys section
    apiKeys: 'Chaves API',
    apiKeysDescription: 'Crie chaves API para integrações externas e webhooks.',
    createKey: 'Criar Chave',
    apiKeyCreated: 'Chave API criada com sucesso',
    apiKeyCopyWarning: 'Copie esta chave agora - ela não será exibida novamente!',
    useInApiBrowser: 'Usar no Navegador API',
    createNewApiKey: 'Criar Nova Chave API',
    keyName: 'Nome da Chave',
    keyNamePlaceholder: 'e.g., Home Assistant, OctoPrint',
    readStatus: 'Status de Leitura',
    readStatusDescription: 'Visualizar status da impressora e fila',
    manageQueue: 'Gerenciar Fila',
    manageQueueDescription: 'Adicionar e remover itens da fila de impressão',
    controlPrinter: 'Controlar Impressora',
    controlPrinterDescription: 'Pausar, retomar e parar impressões',
    cloudAccess: 'Permitir acesso à nuvem',
    cloudAccessDescription: 'Lê predefinições e filamentos do Bambu Cloud em seu nome. Requer login no Bambu Cloud.',
    cloudBadge: 'Nuvem',
    updateEnergyCost: 'Atualizar preço da eletricidade',
    updateEnergyCostDescription: 'Permitir que esta chave envie POST de um novo preço por kWh para /settings/electricity-price. Útil para automações de tarifa dinâmica do Home Assistant (Tibber, Octopus, etc.). Este é o único campo de configuração gravável via API key.',
    energyCostBadge: 'Energia',
    legacyKey: 'Legado',
    legacyKeyTooltip: 'Criado antes da propriedade por usuário; recrie para acesso à nuvem',
    unnamedKey: 'Chave Sem Nome',
    lastUsed: 'Último uso',
    read: 'Ler',
    control: 'Controlar',
    createFirstKey: 'Crie sua primeira chave',
    webhookEndpoints: 'Endpoints de Webhook',
    webhookApiKeyHint: 'Use sua chave API no cabeçalho X-API-Key.',
    webhook: {
      getAllStatus: 'Obter status de todas as impressoras',
      getSpecificStatus: 'Obter status de uma impressora específica',
      addToQueue: 'Adicionar à fila de impressão',
      pausePrint: 'Pausar impressão',
      resumePrint: 'Retomar impressão',
      stopPrint: 'Parar impressão',
    },
    apiBrowser: 'Navegador API',
    apiBrowserDescription: 'Explore e teste todos os endpoints de API disponíveis.',
    apiKeyForTesting: 'Chave API para Teste',
    apiKeyPlaceholder: 'Cole sua chave API aqui para testar endpoints autenticados...',
    apiKeyHint: 'Esta chave será enviada como cabeçalho X-API-Key nas solicitações.',
    deleteApiKeyTitle: 'Excluir Chave API',
    deleteApiKeyMessage: 'Tem certeza de que deseja excluir esta chave API? Quaisquer integrações usando esta chave deixarão de funcionar.',
    deleteKey: 'Excluir Chave',
    // Filament tab
    amsDisplayThresholds: 'Limiares de Exibição AMS',
    amsThresholdsDescription: 'Configure os limiares de cores para os indicadores de umidade e temperatura do AMS.',
    humidity: 'Umidade',
    goodGreen: 'Bom (verde)',
    fairOrange: 'Razoável (laranja)',
    aboveFairBad: 'Acima do limiar razoável mostra como vermelho (ruim)',
    fairAlsoDryingThreshold: 'Este limiar também é usado para acionar a secagem automática',
    temperature: 'Temperatura',
    goodBlue: 'Bom (azul)',
    aboveFairHot: 'Acima do limiar razoável mostra como vermelho (quente)',
    historyRetention: 'Retenção de Histórico',
    keepSensorHistory: 'Manter histórico do sensor por',
    historyRetentionDescription: 'Dados antigos de umidade e temperatura serão automaticamente excluídos',
    defaultPrintOptions: 'Opções de impressão padrão',
    defaultPrintOptionsDescription: 'Defina valores padrão para opções de impressão. Podem ser alterados no diálogo de impressão.',
    defaultBedLevelling: 'Nivelamento da mesa',
    defaultBedLevellingDesc: 'Nivelar automaticamente a mesa antes da impressão',
    defaultFlowCali: 'Calibração de fluxo',
    defaultFlowCaliDesc: 'Calibrar fluxo de extrusão',
    defaultVibrationCali: 'Calibração de vibração',
    defaultVibrationCaliDesc: 'Reduzir artefatos de ringing',
    defaultLayerInspect: 'Inspeção da primeira camada',
    defaultLayerInspectDesc: 'Inspeção IA da primeira camada',
    defaultTimelapse: 'Timelapse',
    defaultTimelapseDesc: 'Gravar vídeo timelapse',
    staggeredStart: 'Início escalonado',
    staggeredStartDescription: 'Tamanho de grupo e intervalo padrão ao escalonar inícios de lotes multi-impressora. Pode ser sobrescrito por lote no modal de impressão.',
    plateClear: 'Confirmação de placa livre',
    requirePlateClear: 'Exigir confirmação de placa livre',
    requirePlateClearDescription: 'Quando ativado, o agendador aguarda uma confirmação de placa livre por impressora antes de iniciar impressões na fila em impressoras com trabalhos concluídos. Desativar isso também oculta o indicador de status da placa e o botão "Marcar placa como liberada" nos cartões das impressoras.',
    gcodeInjection: 'Injeção de G-code',
    gcodeInjectionDescription: 'Configure G-code personalizado para injetar no início e/ou no final das impressões para sistemas de impressão automática como Farmloop, SwapMod, AutoClear e Printflow 3D. Os snippets são configurados por modelo de impressora e aplicados quando "Injetar G-code" está ativado em um item da fila.',
    gcodeInjectionNoPrinters: 'Nenhuma impressora encontrada. Adicione impressoras para configurar snippets de G-code.',
    gcodeStartLabel: 'G-code inicial',
    gcodeEndLabel: 'G-code final',
    gcodeStartPlaceholder: 'G-code inserido antes do início da impressão...',
    gcodeEndPlaceholder: 'G-code adicionado após o término da impressão...',
    staggerGroupSize: 'Tamanho do grupo',
    staggerGroupSizeHelp: 'Impressoras para iniciar simultaneamente por grupo',
    staggerInterval: 'Intervalo (minutos)',
    staggerIntervalHelp: 'Atraso entre o início de cada grupo',
    queueDrying: 'Secagem Automática',
    queueDryingDescription: 'Secar automaticamente o filamento AMS quando a impressora estiver ociosa entre impressões na fila. Usa o limite de umidade acima.',
    queueDryingEnabled: 'Ativar secagem automática',
    queueDryingEnabledDescription: 'Iniciar secagem AMS automaticamente quando a impressora estiver ociosa e a umidade estiver acima do limite',
    queueDryingBlock: 'Aguardar conclusão da secagem',
    queueDryingBlockDescription: 'Bloquear a fila de impressão até a secagem terminar. Quando desativado, impressões têm prioridade.',
    ambientDryingEnabled: 'Secagem ambiente',
    ambientDryingEnabledDescription: 'Secar automaticamente o filamento em impressoras ociosas quando a umidade exceder o limite, mesmo sem impressões na fila.',
    dryingPresets: 'Predefinições de secagem',
    dryingPresetsDescription: 'Temperatura e duração por tipo de filamento. AMS 2 Pro usa temperaturas mais baixas, AMS-HT suporta temperaturas mais altas.',
    dryingFilament: 'Filamento',
    printModal: 'Modal de Impressão',
    expandCustomMapping: 'Expandir mapeamento personalizado por padrão',
    expandCustomMappingDescription: 'Ao imprimir em várias impressoras, mostrar o mapeamento AMS por impressora expandido',
    // User management
    authentication: 'Autenticação',
    authEnabledDescription: 'Sua instância está protegida com autenticação de usuário',
    authDisabledDescription: 'Ative para exigir login e gerenciar o acesso dos usuários',
    authDisabledMessage: 'Ative a autenticação para criar contas de usuário, gerenciar permissões e proteger sua instância do Bambuddy.',
    enableAuthentication: 'Ativar Autenticação',
    currentUser: 'Usuário Atual',
    changePassword: 'Alterar Senha',
    admin: 'Administrador',
    users: 'Usuários',
    addUser: 'Adicionar Usuário',
    groups: 'Grupos',
    addGroup: 'Adicionar Grupo',
    system: 'Sistema',
    noDescription: 'Sem descrição',
    userCount: '{{count}} usuários',
    permissionCount: '{{count}} permissões',
    createUser: 'Criar Usuário',
    username: 'Nome de Usuário',
    enterUsername: 'Digite o nome de usuário',
    password: 'Senha',
    enterPassword: 'Digite a senha',
    passwordRequirements: 'Pelo menos 8 caracteres, com uma maiúscula, uma minúscula, um dígito e um caractere especial.',
    confirmPassword: 'Confirmar Senha',
    confirmPasswordPlaceholder: 'Confirme a senha',
    // Title tooltips
    viewReleaseOnGitHub: 'Ver lançamento no GitHub',
    turnAllPlugsOn: 'Ligar todas as tomadas',
    turnAllPlugsOff: 'Desligar todas as tomadas',
    // Modal: Clear logs
    clearNotificationLogs: 'Limpar Logs de Notificação',
    clearLogsMessage: 'Isso excluirá permanentemente todos os logs de notificação com mais de 30 dias. Esta ação não pode ser desfeita.',
    clearLogs: 'Limpar Logs',
    // Modal: Reset UI
    resetUiPreferences: 'Redefinir Preferências de UI',
    resetUiPreferencesMessage: 'Isso redefinirá todas as preferências de UI para os padrões: ordem da barra lateral, tema, layout do painel, modos de exibição e preferências de classificação. Suas impressoras, arquivos e configurações do servidor NÃO serão afetados. A página será recarregada após a limpeza.',
    resetPreferences: 'Redefinir Preferências',
    // Modal: Delete group
    deleteGroupTitle: 'Excluir Grupo',
    deleteGroupMessage: 'Tem certeza de que deseja excluir este grupo? Usuários neste grupo perderão essas permissões.',
    deleteGroup: 'Excluir Grupo',
    // Modal: Disable auth
    disableAuthenticationTitle: 'Desativar Autenticação',
    disableAuthenticationMessage: 'Tem certeza de que deseja desativar a autenticação? Isso tornará sua instância do Bambuddy acessível sem login. Todos os usuários permanecerão no banco de dados, mas a autenticação será desativada.',
    disableAuthentication: 'Desativar Autenticação',
    // Additional settings
    configureBambuddy: 'Configurar Bambuddy',
    systemDefault: 'Padrão do Sistema',
    archiveSettings: 'Configurações de Arquivo',
    newWindow: 'Nova Janela',
    embeddedOverlay: 'Sobreposição Incorporada',
    preferredSlicer: 'Fatiador Preferido',
    preferredSlicerDescription: 'Escolha qual aplicativo de fatiamento abrirá os arquivos',
    orcaslicerKnownIssuesWarning: 'OrcaSlicer 2.3.2 / 2.4.0-dev têm bugs CLI conhecidos que bloqueiam o fatiamento de muitos 3MFs criados pela Bambu — veja issues upstream #12426 (segfault em arquivos multi-extrusor pintados) e #13386 (rejeição de validação estrita de intervalos de parâmetros). Bambu Studio é recomendado até as correções upstream chegarem.',
    useSlicerApi: 'Usar API do fatiador',
    useSlicerApiDescription: 'Quando ativo, as ações "Slice" abrem o modal do fatiador interno e chamam o sidecar slicer-API. Quando inativo (padrão), redirecionam ao fatiador desktop via esquema URI.',
    slicerCard: 'Fatiador',
    orcaslicerApiUrl: 'OrcaSlicer sidecar URL',
    bambuStudioApiUrl: 'Bambu Studio sidecar URL',
    slicerApiUrlDescription: 'URL do contêiner sidecar slicer-API. Deixe em branco para usar SLICER_API_URL / BAMBU_STUDIO_API_URL.',
    slicerBundles: {
      title: 'Bundles do fatiador',
      description: 'Importe um Printer Preset Bundle (.bbscfg) exportado do BambuStudio (Arquivo → Exportar → Exportar Bundle de Predefinições → "Printer preset bundle"). Após importado, solicitações de fatiamento podem escolher predefinições do bundle por nome sem re-enviar o triplet de perfis JSON.',
      uploadButton: 'Enviar bundle',
      uploading: 'Enviando…',
      loading: 'Carregando bundles…',
      empty: 'Nenhum bundle importado ainda.',
      summary: '{{processCount}} processo · {{filamentCount}} predefinições de filamento',
      delete: 'Excluir',
      uploadSuccess: '{{name}} importado',
      uploadError: 'Falha ao enviar bundle: {{message}}',
      deleteSuccess: 'Bundle removido',
      deleteError: 'Falha ao excluir bundle: {{message}}',
      confirmDeleteTitle: 'Remover este bundle?',
      confirmDeleteMessage: 'Solicitações de fatiamento referenciando "{{name}}" falharão até o bundle ser reimportado.',
    },
    externalCameras: 'Câmeras Externas',
    costTracking: 'Rastreamento de Custos',
    printsOnly: 'Apenas Impressões',
    totalConsumption: 'Consumo Total',
    dataManagement: 'Gerenciamento de Dados',
    storageUsage: 'Uso de Armazenamento',
    storageUsageDescription: 'Detalhamento do uso de dados por categoria',
    storageUsageTotal: 'Total',
    storageUsageErrors: 'Erros',
    storageUsageOtherBreakdown: 'Outros (inclui ativos estáticos, scripts e arquivos de configuração)',
    storageUsageSystem: 'Sistema',
    storageUsageData: 'Dados',
    storageUsageUnavailable: 'Informações de uso de armazenamento indisponíveis',
    clearNotificationLogsDescription: 'Excluir logs de notificação com mais de 30 dias',
    resetUiPreferencesDescription: 'Redefinir ordem da barra lateral, tema, modos de exibição e preferências de layout. Impressoras, arquivos e configurações não são afetados.',
    enableHomeAssistant: 'Ativar Home Assistant',
    enableMqtt: 'Ativar MQTT',
    useTls: 'Usar TLS',
    enableMetricsEndpoint: 'Ativar Endpoint de Métricas',
    availableMetrics: 'Métricas Disponíveis',
    editUser: 'Editar Usuário',
    deleteUserTitle: 'Excluir Usuário',
    groupName: 'Nome do Grupo',
    // Placeholders
    leaveEmptyForAnonymous: 'Deixe vazio para anônimo',
    leaveEmptyForNoAuth: 'Deixe vazio para sem autenticação',
    enterNewPassword: 'Digite a nova senha',
    confirmNewPassword: 'Confirme a nova senha',
    enterGroupName: 'Digite o nome do grupo',
    enterDescriptionOptional: 'Digite a descrição (opcional)',
    enterCurrentPassword: 'Digite a senha atual',
    enterNewPasswordMin6: 'Digite a nova senha (mínimo 6 caracteres)',
    toast: {
      keyCopied: 'Chave copiada para a área de transferência',
      copyFailed: 'Falha ao copiar a chave',
      keyAddedToBrowser: 'Chave adicionada ao Navegador de API',
      clearLogsFailed: 'Falha ao limpar logs',
      uiPreferencesReset: 'Preferências de UI redefinidas. Atualizando...',
      authDisabled: 'Autenticação desativada com sucesso',
      authDisableFailed: 'Falha ao desativar a autenticação',
      apiKeyCreated: 'Chave de API criada',
      apiKeyDeleted: 'Chave de API excluída',
      userCreated: 'Usuário criado com sucesso',
      userUpdated: 'Usuário atualizado com sucesso',
      userDeleted: 'Usuário excluído com sucesso',
      groupCreated: 'Grupo criado com sucesso',
      groupUpdated: 'Grupo atualizado com sucesso',
      groupDeleted: 'Grupo excluído com sucesso',
      fillRequiredFields: 'Por favor, preencha todos os campos obrigatórios',
      passwordsDoNotMatch: 'As senhas não coincidem',
      passwordTooShort: 'A senha deve ter pelo menos 8 caracteres',
      passwordNeedsUppercase: 'A senha deve conter pelo menos uma letra maiúscula',
      passwordNeedsLowercase: 'A senha deve conter pelo menos uma letra minúscula',
      passwordNeedsDigit: 'A senha deve conter pelo menos um dígito',
      passwordNeedsSpecial: 'A senha deve conter pelo menos um caractere especial',
      enterGroupName: 'Por favor, insira um nome de grupo',
      settingsSaved: 'Configurações salvas',
      noPermissionUpdate: 'Você não tem permissão para alterar as configurações',
      cameraSettingsSaved: 'Configurações da câmera salvas',
      enterCameraUrl: 'Por favor, insira a URL da câmera',
      passwordChanged: 'Senha alterada com sucesso',
      connectionFailed: 'Falha na conexão',
      testFailed: 'Falha no teste',
      cameraConnected: 'Câmera conectada{{resolution}}',
    },
    testConnection: 'Testar Conexão',
    catalog: {
      spoolCatalog: 'Catálogo de Carretéis',
      spoolCatalogDescription: 'Pesos de carretéis vazios por marca/tipo. Usado para pesquisa automática de peso ao adicionar carretéis.',
      searchCatalog: 'Pesquisar no catálogo...',
      addNewEntry: 'Adicionar Nova Entrada',
      namePlaceholder: 'Nome (ex.: Bambu Lab - Plástico)',
      weight: 'Peso',
      type: 'Tipo',
      default: 'Padrão',
      custom: 'Personalizado',
      noMatch: 'Nenhuma entrada corresponde à sua pesquisa',
      empty: 'Nenhuma entrada no catálogo',
      deleteEntry: 'Excluir Entrada',
      deleteConfirm: 'Tem certeza de que deseja excluir "{{name}}"?',
      resetCatalog: 'Redefinir Catálogo',
      resetConfirm: 'Redefinir catálogo para os padrões? Isso removerá todas as entradas personalizadas.',
      loadFailed: 'Falha ao carregar o catálogo de carretéis',
      nameWeightRequired: 'Nome e peso são obrigatórios',
      entryAdded: 'Entrada adicionada',
      addFailed: 'Falha ao adicionar entrada',
      entryUpdated: 'Entrada atualizada',
      updateFailed: 'Falha ao atualizar entrada',
      entryDeleted: 'Entrada excluída',
      deleteFailed: 'Falha ao excluir entrada',
      resetSuccess: 'Catálogo redefinido para os padrões',
      resetFailed: 'Falha ao redefinir catálogo',
      exported: 'Exportadas {{count}} entradas',
      imported: 'Importadas {{added}} entradas ({{skipped}} ignoradas)',
      importFailed: 'Falha ao importar: formato JSON inválido',
      exportTooltip: 'Exportar catálogo para JSON',
      importTooltip: 'Importar catálogo de JSON',
      resetTooltip: 'Redefinir para os padrões',
      selectedCount: '{{count}} selecionados',
      deleteSelected: 'Excluir Selecionados',
      bulkDeleteConfirm: 'Tem certeza de que deseja excluir {{count}} entradas?',
      bulkDeleted: '{{count}} entradas excluídas',
      bulkDeleteFailed: 'Falha ao excluir entradas',
      material: 'Material',
      spoolWeight: 'Peso do carretel',
      color: 'Cor',
      updateSpoolWeight: 'Atualizar peso do carretel',
      filamentUpdated: 'Filamento atualizado',
      filamentUpdateFailed: 'Falha ao atualizar filamento',
      filamentUpdateInvalid: 'Dados de filamento inválidos',
      keepExistingSpoolWeight: 'Manter peso antigo para carretéis existentes',
      keepExistingSpoolWeightDesc: 'Os carretéis já criados com este tipo de filamento mantêm o peso tara antigo. Novos carretéis usam o valor atualizado.',
      applyToAllSpools: 'Aplicar a todos os carretéis',
      applyToAllSpoolsDesc: 'Todos os cálculos de peso para este tipo de filamento usam imediatamente o novo peso tara.',
    },
    colorCatalog: {
      title: 'Catálogo de Cores',
      description: 'Cores de filamento por fabricante/material. Usado para pesquisa automática de cores ao adicionar carretéis.',
      searchColors: 'Pesquisar cores...',
      allManufacturers: 'Todos os fabricantes',
      addNewColor: 'Adicionar Nova Cor',
      manufacturer: 'Fabricante',
      colorName: 'Nome da Cor',
      hex: 'Hex',
      materialOptional: 'Material (opcional)',
      showing: 'Mostrando {{filtered}} de {{total}} cores',
      noMatch: 'Nenhuma cor corresponde à sua pesquisa',
      empty: 'Nenhuma cor no catálogo',
      deleteColor: 'Excluir Cor',
      deleteConfirm: 'Tem certeza de que deseja excluir "{{name}}"?',
      resetCatalog: 'Redefinir Catálogo de Cores',
      resetConfirm: 'Redefinir catálogo para os padrões? Isso removerá todas as cores personalizadas.',
      sync: 'Sincronizar',
      starting: 'Iniciando...',
      syncTooltip: 'Sincronizar do FilamentColors.xyz (2000+ cores, pode levar um minuto)',
      loadFailed: 'Falha ao carregar o catálogo de cores',
      fieldsRequired: 'Fabricante, nome da cor e cor hex são obrigatórios',
      colorAdded: 'Cor adicionada',
      addFailed: 'Falha ao adicionar cor',
      colorUpdated: 'Cor atualizada',
      updateFailed: 'Falha ao atualizar cor',
      colorDeleted: 'Cor excluída',
      deleteFailed: 'Falha ao excluir cor',
      resetSuccess: 'Catálogo de cores redefinido para os padrões',
      resetFailed: 'Falha ao redefinir catálogo',
      syncUpToDate: 'Já está atualizado ({{count}} cores verificadas)',
      syncComplete: 'Adicionadas {{added}} novas cores ({{skipped}} já existiam)',
      syncError: 'Erro de sincronização',
      syncFailed: 'Falha ao sincronizar do FilamentColors.xyz',
      exported: 'Exportadas {{count}} cores',
      imported: 'Importadas {{added}} cores ({{skipped}} ignoradas)',
      importFailed: 'Falha ao importar: formato JSON inválido',
      selectedCount: '{{count}} selecionados',
      deleteSelected: 'Excluir Selecionados',
      bulkDeleteConfirm: 'Tem certeza de que deseja excluir {{count}} cores?',
      bulkDeleted: '{{count}} cores excluídas',
      bulkDeleteFailed: 'Falha ao excluir cores',
    },
    dateFormat: 'Formato de data',
    dateFormatUs: 'US (MM/DD/AAAA)',
    dateFormatEu: 'EU (DD/MM/AAAA)',
    dateFormatIso: 'ISO (AAAA-MM-DD)',
    timeFormat: 'Formato de hora',
    timeFormat12: '12 horas (3:30 PM)',
    timeFormat24: '24 horas (15:30)',
    defaultPrinter: 'Impressora padrão',
    defaultPrinterDescription: 'Pré-selecionar esta impressora para uploads, reimpressões e outras operações.',
    slicerBambuStudio: 'Bambu Studio',
    slicerOrcaSlicer: 'OrcaSlicer',
    sidebarOrderDescription: 'Arraste itens na barra lateral para reordenar. Restaurar ordem padrão aqui.',
    setDefault: 'Definir padrão',
    sidebarOrderSetDefaultHint: 'Definir padrão aplica a ordem atual do menu aos usuários que ainda não personalizaram o seu.',
    sidebarDefaultSet: 'Ordem padrão do menu foi definida.',
    sidebarDefaultCleared: 'Ordem padrão do menu removida.',
    sidebarDefaultFailed: 'Falha ao definir a ordem padrão do menu.',
    reset: 'Redefinir',
    darkMode: 'Modo escuro',
    lightMode: 'Modo claro',
    active: '(ativo)',
    background: 'Fundo',
    accent: 'Destaque',
    style: 'Estilo',
    bgNeutral: 'Neutro',
    bgWarm: 'Quente',
    bgCool: 'Frio',
    bgOled: 'OLED Preto',
    bgSlate: 'Azul ardósia',
    bgForest: 'Verde floresta',
    accentGreen: 'Verde',
    accentTeal: 'Azul-petróleo',
    accentBlue: 'Azul',
    accentOrange: 'Laranja',
    accentPurple: 'Roxo',
    accentRed: 'Vermelho',
    styleClassic: 'Clássico',
    styleGlow: 'Brilhante',
    styleVibrant: 'Vibrante',
    themeToggleHint: 'Alternar entre modo escuro e claro usando o ícone de sol/lua na barra lateral.',
    autoArchivePrints: 'Arquivar impressões automaticamente',
    autoArchiveDescription: 'Salvar automaticamente arquivos 3MF quando impressões forem concluídas',
    saveThumbnailsDescription: 'Extrair e salvar imagens de pré-visualização dos arquivos 3MF',
    captureFinishPhotoDescription: 'Tirar foto da câmera da impressora quando a impressão for concluída',
    ffmpegNotInstalled: 'ffmpeg não instalado',
    ffmpegRequired: 'A captura de câmera requer ffmpeg. Instale via <brew>brew install ffmpeg</brew> (macOS) ou <apt>apt install ffmpeg</apt> (Linux).',
    camera: 'Câmera',
    cameraViewMode: 'Modo de visualização da câmera',
    cameraOverlayDescription: 'A câmera abre em uma sobreposição redimensionável na tela principal',
    cameraWindowDescription: 'A câmera abre em uma janela separada do navegador',
    externalCamerasDescription: 'Configure câmeras externas para substituir a câmera integrada da impressora. Suporta streams MJPEG, RTSP, snapshots HTTP e câmeras USB (V4L2). Quando habilitada, a câmera externa é usada para visualização ao vivo e fotos de conclusão.',
    cameraPlaceholderUsb: 'Caminho do dispositivo (/dev/video0)',
    cameraPlaceholderUrl: 'URL da câmera (rtsp://... ou http://...)',
    cameraTypeMjpeg: 'Stream MJPEG',
    cameraTypeRtsp: 'Stream RTSP',
    cameraTypeSnapshot: 'Snapshot HTTP',
    cameraTypeUsb: 'Câmera USB (V4L2)',
    cameraSnapshotUrl: 'URL de captura (opcional)',
    cameraSnapshotUrlPlaceholder: 'http://192.168.1.61:1984/api/frame.jpeg?src=printer',
    cameraSnapshotUrlHelp: 'URL de frame único usado para miniaturas de notificação, fotos de finalização, frames do timelapse por camada e detecção de mesa. Timelapse e detecção de mesa requerem cada um seu próprio toggle por impressora — esta URL é apenas a fonte de imagem que eles usam quando ativos. Deixe em branco para capturar do stream ao vivo acima. Útil para go2rtc (/api/frame.jpeg) e câmeras IP com endpoint de captura dedicado.',
    cameraRotation: 'Rotação',
    test: 'Testar',
    connected: 'Conectado',
    disconnected: 'Desconectado',
    currency: 'Moeda',
    defaultFilamentCost: 'Custo padrão do filamento (por kg)',
    electricityCost: 'Custo da eletricidade por kWh',
    energyDisplayMode: 'Modo de exibição de energia',
    energyModePrintDescription: 'O painel mostra a soma da energia usada durante as impressões',
    energyModeTotalDescription: 'O painel mostra a energia total dos plugues inteligentes',
    fileManager: 'Gerenciador de arquivos',
    createArchiveEntry: 'Criar entrada de arquivo ao imprimir',
    createArchiveEntryDescription: 'Ao imprimir pelo gerenciador de arquivos, criar opcionalmente uma entrada de arquivo',
    lowDiskSpaceWarning: 'Aviso de pouco espaço em disco',
    lowDiskSpaceDescription: 'Mostrar aviso quando o espaço livre em disco ficar abaixo deste limite',
    printerFirmware: 'Firmware da impressora',
    checkFirmwareDescription: 'Verificar atualizações de firmware da Bambu Lab',
    bambuddySoftware: 'Software Bambuddy',
    autoCheckDescription: 'Verificar automaticamente novas versões ao iniciar',
    checkNow: 'Verificar agora',
    updateAvailableVersion: 'Atualização disponível: v{{version}}',
    releaseNotes: 'Notas da versão',
    updateViaDocker: 'Atualizar via Docker Compose:',
    updateViaHomeAssistant: 'As atualizações são gerenciadas pelo Supervisor do Home Assistant. Abra Configurações → Complementos → Bambuddy no Home Assistant para instalar a nova versão.',
    installUpdate: 'Instalar atualização',
    latestVersionRunning: 'Você está usando a versão mais recente',
    failedToCheckUpdates: 'Falha ao verificar atualizações: {{error}}',
    backupRestore: 'Backup e Restauração',
    backupRestoreDescription: 'Exportar/importar configurações e configurar backup do GitHub',
    goToBackup: 'Ir para backup',
    externalUrl: 'URL externa',
    externalUrlDescription: 'A URL externa onde o Bambuddy está acessível. Usada para imagens de notificação e integrações externas.',
    bambuddyUrl: 'URL do Bambuddy',
    externalUrlHint: 'Inclua protocolo e porta (ex: http://192.168.1.100:8000)',
    ftpRetry: 'Tentativa FTP',
    ftpRetryDescription: 'Tentar novamente operações FTP quando o WiFi da impressora é instável. Aplica-se a downloads 3MF, uploads de impressão, downloads de timelapse e atualizações de firmware.',
    autoRetryDescription: 'Tentar novamente automaticamente operações FTP que falharam',
    retryAttempts: 'Tentativas de reenvio',
    retryDelay: 'Atraso entre tentativas',
    connectionTimeout: 'Tempo limite de conexão',
    time_one: '{{count}} vez',
    time_other: '{{count}} vezes',
    second_one: '{{count}} segundo',
    second_other: '{{count}} segundos',
    nSeconds: '{{count}} segundos',
    increaseForWeakWifi: 'Aumente para impressoras com WiFi fraco',
    homeAssistant: 'Home Assistant',
    homeAssistantFullDescription: 'Conecte ao Home Assistant para controlar plugues inteligentes via API REST do HA. Suporta entidades switch, light, input_boolean e script.',
    homeAssistantUrl: 'URL do Home Assistant',
    longLivedAccessToken: 'Token de acesso de longa duração',
    haTokenHint: 'Crie um token no HA: Perfil → Tokens de acesso de longa duração → Criar token',
    connectionSuccessful: 'Conexão bem-sucedida',
    connectionFailed: 'Falha na conexão',
    haConnectionSuccess: 'Conectado com sucesso ao Home Assistant.',
    haConnectionFailed: 'Falha ao conectar ao Home Assistant.',
    mqttPublishing: 'Publicação MQTT',
    mqttDescription: 'Publique eventos do BamBuddy para um broker MQTT externo para integração com Node-RED, Home Assistant e outros sistemas de automação.',
    mqttEnableDescription: 'Publicar eventos no broker MQTT externo',
    brokerHostname: 'Hostname do broker',
    port: 'Porta',
    usernameOptional: 'Usuário (opcional)',
    passwordOptional: 'Senha (opcional)',
    topicPrefix: 'Prefixo do tópico',
    topicPrefixHint: 'Os tópicos serão: {{prefix}}/printers/<serial>/status, etc.',
    prometheusMetrics: 'Métricas Prometheus',
    prometheusEndpointDescription: 'Expor métricas da impressora em <code>/api/v1/metrics</code> para monitoramento Prometheus/Grafana.',
    bearerTokenOptional: 'Token Bearer (opcional)',
    bearerTokenHint: 'Se definido, as requisições devem incluir <code>Authorization: Bearer <token></code>',
    metricsConnectionStatus: 'Status da conexão',
    metricsPrinterState: 'Estado da impressora (idle/printing/etc)',
    metricsPrintProgress: 'Progresso da impressão 0-100%',
    metricsBedTemp: 'Temperatura da mesa',
    metricsNozzleTemp: 'Temperatura do bico',
    metricsPrintsTotal: 'Total de impressões por resultado',
    metricsMore: '...e mais (camadas, ventoinhas, fila, uso de filamento)',
    smartPlugsDescription: 'Conecte plugues inteligentes (Tasmota ou Home Assistant) para automatizar o controle de energia e rastrear o consumo energético das suas impressoras.',
    allOn: 'Ligar todos',
    allOff: 'Desligar todos',
    addSmartPlug: 'Adicionar plugue inteligente',
    energySummary: 'Resumo de energia',
    currentPower: 'Potência atual',
    plugsOnline: '{{reachable}}/{{total}} plugues online',
    today: 'Hoje',
    yesterday: 'Ontem',
    total: 'Total',
    enablePlugsForSummary: 'Habilite os plugues para ver o resumo de energia',
    addNotificationProvider: 'Adicionar',
    systemBadge: '(Sistema)',
    creating: 'Criando...',
    changing: 'Alterando...',
    deleteUserAndItems: 'Excluir usuário E seus itens',
    deleteUserKeepItems: 'Excluir usuário, manter itens (ficarão sem dono)',
    ok: 'OK',

    // 2FA settings
    twoFa: {
      totpTitle: 'App Autenticador (TOTP)',
      totpDesc: 'Use um app como Google Authenticator, Aegis ou Authy.',
      emailOtpTitle: 'OTP por e-mail',
      emailOtpDesc: 'Envie um código único para {{email}} ao fazer login.',
      emailOtpNoEmail: 'Adicione um endereço de e-mail à sua conta para ativar este método.',
      addEmailFirst: 'Sua conta não tem endereço de e-mail. Peça a um administrador para adicionar um.',
      setupTotp: 'Configurar App Autenticador',
      setupAuthApp: 'Configurar App Autenticador',
      setupInstructions: 'Escaneie o código QR com seu app autenticador e confirme com um código.',
      manualEntry: 'Não consegue escanear? Digite este segredo manualmente:',
      scannedContinue: 'Código escaneado — continuar',
      enterCodeToConfirm: 'Digite o código de 6 dígitos do seu app autenticador para confirmar.',
      activate: 'Ativar',
      disableTotp: 'Desativar Autenticador',
      disableConfirmHint: 'Digite um código TOTP válido ou um código de backup para desativar o autenticador.',
      totpDisabled: 'App autenticador desativado.',
      emailOtpEnabled: 'OTP por e-mail ativado.',
      emailOtpDisabled: 'OTP por e-mail desativado.',
      smtpRequired: 'Por favor, configure e teste as configurações SMTP primeiro.',
      invalidCode: 'Código inválido. Por favor, tente novamente.',
      enableEmailOtp: 'Ativar OTP por e-mail',
      disableEmailOtp: 'Desativar OTP por e-mail',
      emailSetupEnterCode: 'Um código de verificação foi enviado para o seu endereço de e-mail. Digite-o abaixo para confirmar que você possui esta caixa de entrada.',
      verifyAndEnable: 'Verificar e Ativar',
      emailDisablePasswordHint: 'Digite a senha da sua conta para confirmar a desativação do OTP por e-mail.',
      passwordPlaceholder: 'Digite sua senha',
      backupCodesTitle: 'Salve seus códigos de backup',
      backupCodesWarning: 'Guarde estes códigos em lugar seguro. Cada código só pode ser usado uma vez.',
      backupCodesRemaining: '{{count}} códigos de backup restantes',
      savedCodes: 'Códigos salvos',
      regenBackup: 'Regenerar códigos de backup',
      regenBackupHint: 'Digite seu código TOTP atual para gerar 10 novos códigos de backup.',
      newBackupCodes: 'Novos códigos de backup',
      linkedAccounts: 'Contas SSO vinculadas',
      linkedAccountsDesc: 'Estes provedores de identidade externos estão vinculados à sua conta.',
      oidcUnlinked: 'Conta desvinculada.',
    },

    // OIDC provider settings
    oidc: {
      title: 'Provedores SSO / OIDC',
      desc: 'Configure provedores OpenID Connect para login único.',
      addProvider: 'Adicionar provedor',
      newProvider: 'Novo provedor',
      empty: 'Nenhum provedor OIDC configurado ainda.',
      created: 'Provedor criado.',
      updated: 'Provedor atualizado.',
      deleted: 'Provedor excluído.',
      refreshIcon: 'Atualizar ícone',
      removeIcon: 'Remover ícone',
      iconRefreshed: 'Ícone atualizado.',
      iconRemoved: 'Ícone removido.',
      iconFetchFailed: 'Não foi possível obter o ícone da URL do provedor.',
      deleteTitle: 'Excluir provedor',
      deleteMessage: 'Excluir "{{name}}"? Todas as contas vinculadas serão desconectadas.',
      form: {
        name: 'Nome de exibição',
        issuerUrl: 'URL do emissor',
        clientId: 'ID do cliente',
        clientSecret: 'Client secret',
        scopes: 'Escopos',
        iconUrl: 'URL do ícone (opcional)',
        enabled: 'Ativado',
        autoCreate: 'Criar usuários automaticamente',
        autoCreateDesc: 'Cria automaticamente uma conta local no primeiro login.',
        autoLink: 'Vincular contas existentes automaticamente',
        autoLinkDesc: 'Vincula contas locais existentes por e-mail no primeiro login.',
        secretHint: 'deixe em branco para manter',
        secretPlaceholder: 'novo segredo',
        emailClaim: 'Claim de e-mail',
        emailClaimDesc: "Claim JWT usado como identidade de e-mail. Use 'preferred_username' ou 'upn' para Azure Entra ID (que não envia email_verified). Use apenas nomes de claim confiáveis.",
        emailClaimPlaceholder: 'e-mail',
        emailClaimCustomClaimAutoLinkWarning: 'Claims personalizadas são seguras para vinculação automática apenas quando o valor é administrado pelo tenant (ex. Azure Entra ID upn / preferred_username). Não ative a vinculação automática se seu IdP permite que usuários auto-declarem essa claim.',
        requireEmailVerified: 'Exigir e-mail verificado',
        requireEmailVerifiedDesc: 'Aceitar o claim de e-mail apenas quando o provedor o marcar como verificado.',
        requireEmailVerifiedWarning: 'Aviso: o e-mail será aceito sem verificação. Use apenas com provedores confiáveis.',
        requireEmailVerifiedAutoLink: 'Desabilite o vínculo automático primeiro para alterar esta configuração.',
        defaultGroup: 'Grupo padrão',
        defaultGroupDesc: 'Grupo atribuído aos usuários criados automaticamente. Retorna a Viewers se não definido.',
        defaultGroupViewersFallback: 'Viewers (padrão)',
      },
    },

    // TODO: translate encryption keys
    encryption: {
      title: 'Status de criptografia MFA',
      enabledFromEnv: 'Criptografia em repouso ativa (chave da variável de ambiente MFA_ENCRYPTION_KEY)',
      enabledFromFile: 'Criptografia em repouso ativa (chave do diretório de dados)',
      enabledGenerated: 'Criptografia em repouso ativa com chave auto-gerada',
      notConfigured: 'Criptografia em repouso não configurada',
      notConfiguredDesc: 'Os segredos TOTP e client_secrets OIDC são armazenados em texto plano. Defina MFA_ENCRYPTION_KEY ou reinicie o Bambuddy com um diretório de dados gravável para gerar automaticamente.',
      allEncrypted: 'Todos os segredos MFA são criptografados em repouso.',
      legacyRowsLabel: 'Linhas legadas em texto plano',
      encryptedRowsLabel: 'Linhas criptografadas',
      legacyRowsWarning: '{{count}} linha(s) legada(s) em texto plano detectada(s). Salve novamente o provedor OIDC ou registre novamente o autenticador do usuário para migrar ao armazenamento criptografado.',
      backupHint: 'A chave auto-gerada é armazenada em DATA_DIR/.mfa_encryption_key e incluída em ZIPs de backup locais. Mantenha seus backups seguros ou defina MFA_ENCRYPTION_KEY explicitamente.',
      decryptionBrokenTitle: 'Chave de criptografia ausente',
      decryptionBrokenError: '{{count}} registro(s) criptografado(s) não podem ser descriptografados pois a chave de criptografia não está mais disponível. Restaure o MFA_ENCRYPTION_KEY anterior ou DATA_DIR/.mfa_encryption_key para recuperar.',
      migrationErrorWarning: '{{count}} linha(s) antiga(s) não puderam ser recriptografadas na inicialização. Verifique os logs do servidor e reinicie o Bambuddy para tentar novamente.',
    },


    spoolbuddy: {
      infoTitle: 'Dispositivos SpoolBuddy',
      infoBody: 'Os kiosks SpoolBuddy se registram automaticamente via heartbeat. Cancele o registro de um dispositivo aqui se não estiver mais em uso ou se um duplicado obsoleto foi deixado por uma falha do daemon.',
      duplicatesTitle: '{{count}} dispositivos registrados',
      duplicatesBody: 'Apenas o primeiro dispositivo registrado é usado pela interface do kiosk. Se algum destes for um duplicado obsoleto após uma falha, cancele seu registro — um dispositivo online se registrará novamente no próximo heartbeat.',
      empty: 'Nenhum dispositivo SpoolBuddy registrado ainda.',
      online: 'Online',
      offline: 'Offline',
      unregister: 'Cancelar registro',
      unregisterSuccess: 'Dispositivo removido',
      unregisterError: 'Falha ao cancelar registro',
      confirmTitle: 'Cancelar registro do dispositivo SpoolBuddy?',
      confirmBody: 'Isso removerá "{{hostname}}" ({{deviceId}}) do banco de dados. Se o dispositivo estiver online, ele se registrará novamente no próximo heartbeat.',
      ipAddress: 'Endereço IP',
      firmware: 'Firmware',
      lastSeen: 'Visto pela última vez',
      daemonUptime: 'Tempo ativo do daemon',
      systemUptime: 'Tempo ativo do sistema',
      never: 'nunca',
      nfc: 'NFC',
      scale: 'Balança',
      cpuTemp: 'Temp. CPU',
      memory: 'Memória',
      disk: 'Disco',
      update: 'Atualizar',
      updateConfirmTitle: 'Atualizar daemon do Spoolbuddy?',
      updateConfirmBody: 'Iniciar uma atualização de software em "{{hostname}}"? O daemon será reiniciado após a aplicação.',
      restartBrowser: 'Reiniciar navegador',
      restartBrowserConfirmTitle: 'Reiniciar o navegador do kiosk?',
      restartBrowserConfirmBody: 'Reiniciar o navegador do kiosk em "{{hostname}}"? A tela ficará em branco brevemente.',
      restartDaemon: 'Reiniciar daemon',
      restartDaemonConfirmTitle: 'Reiniciar daemon do Spoolbuddy?',
      restartDaemonConfirmBody: 'Reiniciar o daemon do Spoolbuddy em "{{hostname}}"? O dispositivo ficará offline por alguns segundos.',
      reboot: 'Reiniciar',
      rebootConfirmTitle: 'Reiniciar o dispositivo?',
      rebootConfirmBody: 'Reiniciar "{{hostname}}"? O dispositivo ficará offline por cerca de um minuto.',
      shutdown: 'Desligar',
      shutdownConfirmTitle: 'Desligar o dispositivo?',
      shutdownConfirmBody: 'Desligar "{{hostname}}"? Será necessário acesso físico para ligá-lo novamente.',
      commandConfirm: 'Confirmar',
      commandQueued: 'Comando enfileirado',
      commandError: 'Falha ao enviar comando',
    },
  },

  // Notifications (for push notifications)
  notification: {
    printStarted: {
      title: 'Impressão Iniciada',
      body: '{{printer}}: {{filename}} iniciou a impressão',
    },
    printCompleted: {
      title: 'Impressão Concluída',
      body: '{{printer}}: {{filename}} foi concluída com sucesso',
    },
    printFailed: {
      title: 'Falha na Impressão',
      body: '{{printer}}: {{filename}} falhou',
    },
    printStopped: {
      title: 'Impressão Interrompida',
      body: '{{printer}}: {{filename}} foi interrompida',
    },
    printProgress: {
      title: 'Progresso da Impressão',
      body: '{{printer}}: {{filename}} está {{percent}}% concluída',
    },
    printerOffline: {
      title: 'Impressora Offline',
      body: '{{printer}} está offline',
    },
    printerError: {
      title: 'Erro na Impressora',
      body: '{{printer}} – {{error}}',
    },
    filamentLow: {
      title: 'Filamento Baixo',
      body: '{{printer}}: O filamento está acabando',
    },
    maintenanceDue: {
      title: 'Manutenção Pendente',
      body: '{{printer}}: {{items}} precisam de atenção',
    },
  },

  // Errors
  errors: {
    generic: 'Algo deu errado',
    networkError: 'Erro de rede. Por favor, verifique sua conexão.',
    notFound: 'Não encontrado',
    unauthorized: 'Não autorizado',
    serverError: 'Erro no servidor',
    validationError: 'Por favor, verifique sua entrada',
    printerConnectionFailed: 'Falha ao conectar à impressora',
    saveFailed: 'Falha ao salvar alterações',
    deleteFailed: 'Falha ao excluir',
    loadFailed: 'Falha ao carregar dados',
  },

  // HMS Errors modal
  hmsErrors: {
    title: 'Erros - {{name}}',
    noErrors: 'Nenhum erro',
    viewOnWiki: 'Ver no Bambu Lab Wiki',
    clearInstructions: 'Limpe os erros na impressora para descartá-los aqui.',
    clearErrors: 'Limpar Erros',
    clearSuccess: 'Erros HMS limpos',
    clearFailed: 'Falha ao limpar erros HMS',
  },

  // MQTT Debug modal
  mqttDebug: {
    title: 'MQTT Log de Depuração',
    searchPlaceholder: 'Pesquisar tópico ou payload...',
    noMessages: 'Nenhuma mensagem registrada ainda',
    startLoggingHint: 'Clique em "Iniciar Registro" para começar a capturar mensagens MQTT',
    noMessagesMatch: 'Nenhuma mensagem corresponde ao seu filtro',
    adjustFilterHint: 'Tente ajustar seus critérios de pesquisa ou filtro',
    incoming: 'Entrada',
    outgoing: 'Saída',
    loggingStopped: 'Registro interrompido',
    loggingActive: 'Registro ativo - as mensagens serão atualizadas automaticamente',
    startLogging: 'Iniciar Registro',
    stopLogging: 'Parar Registro',
    clearLog: 'Limpar Registro',
    topic: 'ópico',
    timestamp: 'Carimbo de Data/Hora',
    direction: 'Direção',
    all: 'Todos',
  },

  // Printer File Manager modal (printer internal storage)
  printerFiles: {
    title: 'Gerenciador de Arquivos',
    storageUsed: 'Usado:',
    storageFree: 'Livre:',
    filterPlaceholder: 'Filtrar arquivos...',
    deleteButton: 'Excluir',
    deleteFiles: 'Excluir {{count}} arquivos',
    deleteFileConfirm: 'Excluir "{{name}}"? Isso não pode ser desfeito.',
    deleteFilesConfirm: 'Excluir {{count}} arquivos selecionados? Isso não pode ser desfeito.',
    noFiles: 'Nenhum arquivo na impressora',
    loadingFiles: 'Carregando arquivos...',
    failedToLoad: 'Falha ao carregar arquivos',
    toast: {
      filesDeleted: 'Arquivos excluídos: {{count}}',
      deleteFailed: 'Falha ao excluir: {{error}}',
    },
  },

  // Confirmations
  confirm: {
    delete: 'Tem certeza de que deseja excluir isso?',
    unsavedChanges: 'Você tem alterações não salvas. Tem certeza de que deseja sair?',
    clearQueue: 'Tem certeza de que deseja limpar a fila?',
  },

  // Login page
  login: {
    title: 'Login Bambuddy',
    subtitle: 'Faça login na sua conta',
    username: 'Nome de usuário',
    usernamePlaceholder: 'Digite seu nome de usuário',
    usernameOrEmail: 'Nome de usuário ou Email',
    usernameOrEmailPlaceholder: 'Nome de usuário ou Email',
    password: 'Senha',
    passwordPlaceholder: 'Digite sua senha',
    signIn: 'Entrar',
    signingIn: 'Entrando...',
    rememberMe: 'Lembrar de mim',
    forgotPassword: 'Esqueceu sua senha?',
    loginSuccess: 'Login realizado com sucesso',
    loginFailed: 'Falha no login',
    enterCredentials: 'Por favor, insira nome de usuário e senha',
    enterEmail: 'Por favor, insira seu endereço de e-mail',
    oidcLoginFailed: 'Falha no login OIDC',
    oidcErrors: {
      providerError: 'O provedor de identidade retornou um erro',
      missingParameters: 'Parâmetros obrigatórios ausentes no callback OIDC',
      invalidState: 'Estado OIDC inválido ou já utilizado',
      stateExpired: 'Sessão OIDC expirada — tente novamente',
      providerNotFound: 'Provedor OIDC não encontrado',
      discoveryFailed: 'Falha ao obter o documento de descoberta OIDC',
      invalidDiscovery: 'Documento de descoberta OIDC inválido',
      networkError: 'Erro de rede durante a troca de token OIDC',
      badResponse: 'Resposta inesperada durante a troca de token OIDC',
      noIdToken: 'O provedor OIDC não retornou um token de ID',
      validationFailed: 'Falha na validação do token OIDC',
      nonceMismatch: 'Nonce OIDC não corresponde — possível ataque de replay',
      missingSubClaim: 'Token OIDC sem claim sub',
      noLinkedAccount: 'Nenhuma conta local vinculada a esta identidade OIDC',
      accountInactive: 'Sua conta está inativa',
      userResolutionFailed: 'Falha ao resolver sua conta',
      internalError: 'Erro interno durante o login OIDC',
      tokenExchangeFailed: 'Falha na troca de token OIDC',
    },
    forgotPasswordTitle: 'Esqueceu a Senha',
    forgotPasswordMessage: 'Se você esqueceu sua senha, entre em contato com o administrador do sistema para redefini-la.',
    forgotPasswordEmailMessage: 'Digite seu endereço de email e enviaremos uma nova senha.',
    emailAddress: 'Endereço de Email',
    emailPlaceholder: 'seu.email@exemplo.com',
    cancel: 'Cancelar',
    sending: 'Enviando...',
    sendResetEmail: 'Enviar Email de Redefinição',
    howToReset: 'Como redefinir sua senha:',
    resetStep1: 'Entre em contato com o administrador do Bambuddy',
    resetStep2: 'Peça para redefinir sua senha na Gestão de Usuários',
    resetStep3: 'Eles podem definir uma nova senha temporária para você',
    resetStep4: 'Faça login com a nova senha e altere-a nas Configurações',
    gotIt: 'Entendi',
    resetPassword: {
      title: 'Definir nova senha',
      subtitle: 'Digite e confirme sua nova senha abaixo.',
      newPassword: 'Nova senha',
      newPasswordPlaceholder: 'Pelo menos 8 caracteres',
      confirmPassword: 'Confirmar senha',
      confirmPasswordPlaceholder: 'Repetir nova senha',
      saving: 'Salvando\u2026',
      submit: 'Definir nova senha',
      backToLogin: 'Voltar para o login',
      passwordsDoNotMatch: 'As senhas não coincidem',
      passwordTooShort: 'A senha deve ter pelo menos 8 caracteres',
      resetFailed: 'Falha ao redefinir senha. O link pode ter expirado.',
    },
    twoFA: {
      title: 'Autenticação em dois fatores',
      subtitle: 'Sua conta está protegida com 2FA. Insira o código de verificação abaixo.',
      methodAuthenticator: 'Aplicativo autenticador',
      methodEmail: 'Código por e-mail',
      methodBackup: 'Código de recuperação',
      instructionsTotp: 'Abra seu aplicativo autenticador e insira o código de 6 dígitos gerado para o Bambuddy.',
      instructionsEmail: 'Um código de 6 dígitos foi enviado para o seu e-mail. Ele é válido por 10 minutos.',
      instructionsEmailNotSent: 'Clique no botão abaixo para receber um código de verificação por e-mail.',
      instructionsBackup: 'Insira um dos seus códigos de recuperação de 8 caracteres. Cada código só pode ser utilizado uma vez.',
      sendCodeButton: 'Enviar código por e-mail',
      sendingCode: 'Enviando...',
      resendCode: 'Reenviar código',
      codeLabel: 'Código de verificação',
      backupCodeLabel: 'Código de recuperação',
      codePlaceholder: '000000',
      backupCodePlaceholder: 'XXXXXXXX',
      verifyButton: 'Verificar',
      verifyingButton: 'Verificando...',
      backToLogin: '← Voltar para o login',
      orContinueWith: 'ou entrar com',
      signInWith: 'Entrar com {{provider}}',
      enterCode: 'Por favor, insira o código de verificação',
      sendCodeFailed: 'Falha ao enviar o código de verificação',
      invalidCode: 'Código inválido. Por favor, tente novamente.',
    },

  },

  // Setup page
  setup: {
    title: 'Bambuddy Configuração',
    subtitle: 'Configure a autenticação para sua instância do Bambuddy',
    enableAuth: 'Ativar Autenticação',
    adminAccount: 'Conta de Administrador',
    adminAccountDesc: 'Se usuários administradores já existirem, a autenticação será ativada usando as contas de administrador existentes. Deixe os campos abaixo vazios para usar os administradores existentes ou insira novas credenciais para criar um novo usuário administrador.',
    adminUsername: 'Nome de usuário do administrador',
    adminPassword: 'Senha do administrador',
    optionalIfAdminExists: '(opcional se usuários administradores existirem)',
    adminUsernamePlaceholder: 'Digite o nome de usuário do administrador (opcional)',
    adminPasswordPlaceholder: 'Digite a senha do administrador (opcional)',
    confirmPassword: 'Confirmar Senha',
    confirmPasswordPlaceholder: 'Confirme a senha do administrador',
    settingUp: 'Configurando...',
    completeSetup: 'Concluir Configuração',
    toast: {
      authEnabledAdminCreated: 'Autenticação ativada e usuário administrador criado',
      authEnabledExistingAdmins: 'Autenticação ativada usando usuários administradores existentes',
      setupCompleted: 'Configuração concluída',
      enterBothCredentials: 'Por favor, insira o nome de usuário e a senha do administrador, ou deixe ambos vazios para usar os usuários administradores existentes',
      passwordsDoNotMatch: 'As senhas não coincidem',
      passwordTooShort: 'A senha deve ter pelo menos 6 caracteres',
    },
  },

  // Password change
  changePassword: {
    title: 'Alterar Senha',
    currentPassword: 'Senha Atual',
    currentPasswordPlaceholder: 'Digite a senha atual',
    newPassword: 'Nova Senha',
    newPasswordPlaceholder: 'Digite a nova senha (mínimo 6 caracteres)',
    confirmPassword: 'Confirmar Senha',
    confirmPasswordPlaceholder: 'Confirme a nova senha',
    passwordsDoNotMatch: 'As senhas não coincidem',
    passwordTooShort: 'A senha deve ter pelo menos 6 caracteres',
    changing: 'Alterando...',
    success: 'Senha alterada com sucesso',
    failed: 'Falha ao alterar a senha',
  },

  // Plate detection alert
  plateAlert: {
    title: 'Impressão Pausada!',
    message: 'Objetos detectados na mesa de impressão. A impressão foi automaticamente pausada. Por favor, limpe a mesa e retome a impressão.',
    understand: 'Entendi',
  },

  // Camera page
  camera: {
    title: 'Visualização da Câmera',
    invalidPrinterId: 'ID da impressora inválido',
    live: 'Ao Vivo',
    snapshot: 'Captura',
    restartStream: 'Reiniciar transmissão',
    refreshSnapshot: 'Atualizar captura',
    fullscreen: 'Tela Cheia',
    exitFullscreen: 'Sair da Tela Cheia',
    connectingToCamera: 'Conectando à câmera...',
    capturingSnapshot: 'Capturando imagem...',
    connectionLost: 'Conexão perdida',
    connectionFailed: 'Falha na conexão com a câmera',
    reconnecting: 'Reconectando em {{countdown}}s... (tentativa {{attempt}}/{{max}})',
    reconnectNow: 'Reconectar agora',
    cameraUnavailable: 'Câmera indisponível',
    cameraUnavailableDesc: 'Certifique-se de que a impressora está ligada e conectada.',
    noCamera: 'Nenhuma câmera disponível',
    retry: 'Tentar novamente',
    cameraStream: 'Transmissão da câmera',
    zoomOut: 'Reduzir zoom',
    zoomIn: 'Aumentar zoom',
    resetZoom: 'Redefinir zoom',
    recording: 'Gravando',
    startRecording: 'Iniciar gravação',
    stopRecording: 'Parar gravação',
    chamberLight: 'Alternar luz da câmara',
    unavailable: 'Câmera indisponível',
    diagnose: {
      button: 'Diagnóstico',
      modalTitle: 'Diagnóstico da câmera',
      running: 'Executando diagnóstico...',
      runFailed: 'Não foi possível executar o diagnóstico: {{error}}',
      retry: 'Executar novamente',
      stage: {
        tcp_reachable: 'Conectividade de rede',
        first_frame: 'Captura de frame',
        live_stream_active: 'Transmissão ao vivo ativa',
      },
      summary: {
        all_ok: 'A câmera está funcionando. O diagnóstico concluiu todas as etapas com sucesso.',
        live_stream_active_healthy: 'A câmera está transmitindo com frames recentes — nenhum teste necessário.',
        printer_unreachable: 'Impressora inacessível. Verifique o endereço IP, a conexão de rede e se a impressora está ligada.',
        camera_port_closed: 'A impressora responde mas a porta da câmera está fechada. Verifique se o modo LAN e o modo desenvolvedor estão ativados nas configurações da impressora.',
        no_frame: 'Conexão com a câmera estabelecida mas nenhum frame recebido. Tente novamente ou verifique se a câmera está habilitada nas configurações da impressora.',
        unknown_failure: 'Diagnóstico da câmera falhou por motivo desconhecido. Consulte o log de suporte para mais detalhes.',
      },
      meta: {
        protocol: 'Protocolo',
        port: 'Porta',
        profile: 'Perfil',
      },
    },
  },

  // Groups management
  groups: {
    title: 'Gerenciamento de Grupos',
    subtitle: 'Gerenciar grupos de permissão para controle de acesso',
    backToSettings: 'Voltar para Configurações',
    createGroup: 'Criar Grupo',
    noPermission: 'Você não tem permissão para acessar esta página.',
    system: 'Sistema',
    noDescription: 'Sem descrição',
    usersCount: '{{count}} usuários',
    permissionsCount: '{{count}} permissões',
    edit: 'Editar',
    delete: 'Excluir',
    toast: {
      created: 'Grupo criado com sucesso',
      updated: 'Grupo atualizado com sucesso',
      deleted: 'Grupo excluído com sucesso',
      enterGroupName: 'Por favor, insira um nome para o grupo',
    },
    modal: {
      editGroup: 'Editar Grupo',
      createGroup: 'Criar Grupo',
      cancel: 'Cancelar',
      saving: 'Salvando...',
      creating: 'Criando...',
      saveChanges: 'Salvar Alterações',
    },
    form: {
      groupName: 'Nome do Grupo',
      groupNamePlaceholder: 'Insira o nome do grupo',
      systemGroupWarning: 'Os nomes dos grupos do sistema não podem ser alterados',
      description: 'Descrição',
      descriptionPlaceholder: 'Insira a descrição (opcional)',
      permissions: 'Permissões ({{count}} selecionadas)',
    },
    deleteModal: {
      title: 'Excluir Grupo',
      message: 'Tem certeza de que deseja excluir este grupo? Os usuários deste grupo perderão essas permissões.',
      confirm: 'Excluir Grupo',
    },
    editor: {
      title: 'Editar Grupo',
      createTitle: 'Criar Grupo',
      search: 'Pesquisar permissões...',
      selectAll: 'Selecionar Tudo',
      clearAll: 'Limpar Tudo',
      permissionsSelected: '{{count}} selecionada(s)',
      noResults: 'Nenhuma permissão corresponde à sua pesquisa',
    },
  },

  // Users management
  users: {
    title: 'Gerenciamento de Usuários',
    subtitle: 'Gerenciar usuários e seu acesso à sua instância do Bambuddy',
    backToSettings: 'Voltar para Configurações',
    createUser: 'Criar Usuário',
    noPermission: 'Você não tem permissão para acessar esta página.',
    admin: 'Administrador',
    noGroups: 'Sem grupos',
    active: 'Ativo',
    inactive: 'Inativo',
    edit: 'Editar',
    delete: 'Excluir',
    system: 'Sistema',
    noGroupsAvailable: 'Nenhum grupo disponível',
    table: {
      username: 'Nome de Usuário',
      groups: 'Grupos',
      status: 'Status',
      actions: 'Ações',
    },
    toast: {
      created: 'Usuário criado com sucesso',
      updated: 'Usuário atualizado com sucesso',
      deleted: 'Usuário excluído com sucesso',
      fillRequired: 'Por favor, preencha todos os campos obrigatórios',
      passwordsDoNotMatch: 'As senhas não coincidem',
      passwordTooShort: 'A senha deve ter pelo menos 6 caracteres',
      ldapProvisioned: 'Usuário LDAP "{{username}}" provisionado',
    },
    modal: {
      createUser: 'Criar Usuário',
      editUser: 'Editar Usuário',
      cancel: 'Cancelar',
      creating: 'Criando...',
      saving: 'Salvando...',
      saveChanges: 'Salvar Alterações',
      advancedAuthSubtitle: 'com Autenticação Avançada',
      // Manual LDAP provisioning (#1298) — English fallbacks
      tabsAriaLabel: 'Fonte do usuário',
      localTab: 'Local',
      ldapTab: 'LDAP',
      ldapSearchLabel: 'Pesquisar diretório',
      ldapSearchPlaceholder: 'Digite um nome de usuário, nome ou e-mail...',
      ldapMinChars: 'Digite ao menos 2 caracteres para pesquisar',
      ldapTypeToSearch: 'Comece a digitar para pesquisar o diretório LDAP',
      ldapSearching: 'Pesquisando diretório...',
      ldapNoResults: 'Nenhum usuário correspondente no diretório',
      ldapSearchError: 'Falha na pesquisa do diretório. Verifique o status do servidor LDAP.',
      ldapAlreadyProvisioned: 'Já provisionado',
      ldapSelectedLabel: 'Selecionado',
      ldapProvision: 'Provisionar usuário',
      ldapProvisioning: 'Provisionando...',
      ldapErrorProvision: 'Falha no provisionamento. Verifique o status do servidor LDAP e tente novamente.',
    },
    form: {
      username: 'Nome de Usuário',
      usernamePlaceholder: 'Insira o nome de usuário',
      email: 'E-mail',
      emailPlaceholder: 'user@example.com',
      password: 'Senha',
      passwordPlaceholder: 'Insira a senha',
      confirmPassword: 'Confirmar Senha',
      confirmPasswordPlaceholder: 'Confirme a senha',
      newPasswordPlaceholder: 'Insira a nova senha',
      confirmNewPasswordPlaceholder: 'Confirme a nova senha',
      leaveBlankToKeep: 'deixe em branco para manter a atual',
      groups: 'Grupos',
      optional: 'opcional',
      autoGeneratedPassword: 'Uma senha segura será gerada automaticamente e enviada por e-mail ao usuário.',
      passwordManagedByAdvancedAuth: 'A senha é gerenciada pela Autenticação Avançada. Use "Redefinir Senha" para enviar uma nova senha ao usuário por e-mail.',
      resetPassword: 'Redefinir Senha',
      resettingPassword: 'Redefinindo Senha...',
    },
    deleteModal: {
      title: 'Excluir Usuário',
      message: 'Tem certeza de que deseja excluir este usuário? Esta ação não pode ser desfeita.',
      confirm: 'Excluir Usuário',
    },
  },

  // Stream overlay
  streamOverlay: {
    title: 'Sobreposição de stream',
    invalidPrinterId: 'ID da impressora inválido',
    cameraStream: 'Transmissão da câmera',
    progress: 'Progresso da impressão',
    eta: 'ETA',
    printerIdle: 'Impressora ociosa',
    printerOffline: 'Impressora offline',
    status: {
      printing: 'Imprimindo',
      paused: 'Pausado',
      finished: 'Concluído',
      failed: 'Falhou',
      idle: 'Ocioso',
      unknown: 'Desconhecido',
    },
  },

  // Profiles
  profiles: {
    title: 'Perfis',
    subtitle: 'Gerencie seus presets de fatiador e calibrações de avanço de pressão',
    tabs: {
      cloud: 'Perfis na Nuvem',
      local: 'Perfis Locais',
      kprofiles: 'K-Perfis',
    },
    localProfiles: {
      title: 'Perfis Locais',
      subtitle: 'Importe e gerencie presets de fatiador do OrcaSlicer',
      import: 'Importar Perfis',
      importDesc: 'Solte arquivos .bbscfg, .bbsflmt, .orca_filament, .zip ou .json aqui',
      importing: 'Importando...',
      search: 'Pesquisar presets locais...',
      noPresets: 'Nenhum preset local ainda',
      badge: 'Local',
      edit: 'Editar',
      delete: 'Excluir',
      cancel: 'Cancelar',
      deleteConfirmTitle: 'Excluir Preset',
      deleteConfirm: 'Tem certeza de que deseja excluir este preset? Esta ação não pode ser desfeita.',
      source: 'Fonte',
      inheritsFrom: 'Herdado de',
      filamentType: 'Tipo',
      vendor: 'Fornecedor',
      compatiblePrinters: 'Impressoras Compatíveis',
      nozzleTemp: 'Temperatura do Bico',
      cost: 'Custo',
      density: 'Densidade',
      pressureAdvance: 'Avanço de Pressão',
      filament: 'Filamento',
      process: 'Processo',
      printer: 'Impressora',
      toast: {
        importSuccess: '{{count}} preset(s) importada(s)',
        importSkipped: '{{count}} preset(s) ignorada(s) (duplicadas)',
        importError: '{{count}} erro(s) durante a importação',
        deleted: 'Preset excluído',
        updated: 'Preset atualizado',
      },
    },
    connectedAs: 'Conectado como',
    logout: 'Sair',
    noLogoutPermission: 'Você não tem permissão para sair',
    failedToLoad: 'Falha ao carregar perfis',
    retry: 'Tentar novamente',
    time: {
      justNow: 'Agora mesmo',
      minsAgo: 'há {{count}} minutos',
      hoursAgo: 'há {{count}} horas',
      daysAgo: 'há {{count}} dias',
    },
    toast: {
      loggedOut: 'Desconectado',
    },
    login: {
      title: 'Conectar ao Bambu Cloud',
      subtitle: 'Sincronize seus presets de fatiador entre dispositivos',
      email: 'E-mail',
      password: 'Senha',
      region: 'Região',
      regionGlobal: 'Global',
      regionChina: 'China',
      verificationCode: 'Código de Verificação',
      totpCode: 'Código do Autenticador',
      checkEmail: 'Verifique seu email ({{email}}) para um código de 6 dígitos',
      enterTotpHint: 'Digite o código de 6 dígitos do seu aplicativo autenticador',
      accessToken: 'Token de Acesso',
      accessTokenHint: 'Cole seu token de acesso da Bambu Cloud. Contas da região China precisam usar este caminho (vinculadas ao celular — login por e-mail indisponível). Veja no wiki como obter o token dos cookies do MakerWorld.',
      back: 'Voltar',
      loginButton: 'Entrar',
      verifyButton: 'Verificar',
      setTokenButton: 'Definir Token',
      useToken: 'Usar token de acesso em vez disso',
      useEmail: 'Entrar com email em vez disso',
      toast: {
        loggedIn: 'Conectado com sucesso',
        codeSent: 'Código de verificação enviado para seu email',
        enterTotp: 'Digite o código do seu aplicativo autenticador',
        tokenSet: 'Token definido com sucesso',
      },
    },
    presets: {
      myPreset: 'Meu preset (editável)',
      duplicate: 'Duplicar',
      editable: 'Editável',
      failedToLoadDetails: 'Falha ao carregar detalhes do preset',
      deleteConfirm: 'Excluir este preset?',
      deleteWarning: 'Isso excluirá permanentemente "{{name}}" do Bambu Cloud. Esta ação não pode ser desfeita.',
      noDuplicatePermission: 'Você não tem permissão para duplicar presets',
      noEditPermission: 'Você não tem permissão para editar presets',
      noDeletePermission: 'Você não tem permissão para excluir presets',
      types: {
        filament: 'Preset de filamento',
        printer: 'Preset de impressora',
        process: 'Preset de processo',
      },
      toast: {
        deleted: 'Preset excluído',
        created: 'Preset criado',
        updated: 'Preset atualizado',
        duplicated: 'Preset duplicado',
        fieldAdded: 'Campo "{{key}}" adicionado',
        exported: 'Preset exportado',
      },
      baseLabel: 'Base: {{name}}',
      currentLabel: 'Atual: {{name}}',
      newPreset: 'Novo Preset',
      editPreset: 'Editar Preset',
      duplicatePreset: 'Duplicar Preset',
      createNewPreset: 'Criar Novo Preset',
      customizeSettings: 'Personalizar configurações para seu novo preset',
      compareWithBase: 'Comparar com o preset base',
      compare: 'Comparar',
      // CreatePresetModal - Basic Info
      basePreset: 'Preset Base',
      selectBasePreset: 'Selecionar preset base...',
      presetName: 'Nome do Preset',
      myCustomPreset: 'Meu preset personalizado',
      inheritsFrom: 'Herdado de',
      dropJsonToImport: 'Solte o arquivo JSON para importar',
      // CreatePresetModal - Tabs
      tabs: {
        common: 'Comum',
        allFields: 'Todos os Campos',
      },
      // CreatePresetModal - All Fields Tab
      availableFields: 'Campos Disponíveis',
      searchFieldsPlaceholder: 'Pesquisar campos...',
      noMatchingFields: 'Nenhum campo correspondente',
      allFieldsAdded: 'Todos os campos adicionados',
      addCustomField: 'Adicionar campo personalizado',
      yourOverrides: 'Suas Substituições',
      noOverridesYet: 'Nenhuma substituição ainda',
      clickFieldsToAdd: 'Clique nos campos à esquerda para adicioná-los',
      saveAsTemplate: 'Salvar como modelo',
      jsonTip: 'Dica: Arraste e solte um arquivo .json em qualquer lugar deste modal para importar configurações',
    },
    cloudView: {
      searchPlaceholder: 'Pesquisar presets...',
      templates: 'Modelos',
      refresh: 'Atualizar',
      newPreset: 'Novo Preset',
      clearFilters: 'Limpar filtros',
      // Compare mode
      compareMode: 'Modo de Comparação',
      selectAnotherPreset: 'Selecionar outro preset {{type}}',
      clickTwoPresets: 'Clique em dois presets do mesmo tipo para comparar',
      selectFirst: '1. Selecionar primeiro',
      selectSecond: '2. Selecionar segundo',
      compareNow: 'Comparar Agora',
      // Status row
      lastSynced: 'Última sincronização:',
      showingCount: 'Mostrando {{showing}} de {{total}} presets',
      noPresetsFound: 'Nenhum preset encontrado',
      // Column headers
      columns: {
        filament: 'Filamento',
        process: 'Processo',
        printer: 'Impressora',
      },
      noFilamentPresets: 'Nenhum preset de filamento',
      noProcessPresets: 'Nenhum preset de processo',
      noPrinterPresets: 'Nenhum preset de impressora',
      // Filters
      filters: {
        type: 'Tipo',
        owner: 'Proprietário',
        printer: 'Impressora',
        nozzle: 'Bico',
        filament: 'Filamento',
        layer: 'Camada',
        all: 'Todos',
        myPresets: 'Meus Presets',
        builtIn: 'Integrado',
        process: 'Processo',
      },
      // Permissions
      noTemplatesPermission: 'Você não tem permissão para gerenciar modelos',
      noRefreshPermission: 'Você não tem permissão para atualizar perfis',
      noCreatePermission: 'Você não tem permissão para criar presets',
    },
    templates: {
      title: 'Modelos Rápidos',
      noTemplates: 'Nenhum modelo ainda',
      createFirst: 'Crie modelos a partir do editor de presets',
      typeFilter: 'Tipo:',
      deleteTitle: 'Excluir Modelo',
      deleteWarning: 'Esta ação não pode ser desfeita',
      deleteConfirm: 'Tem certeza de que deseja excluir "{{name}}"?',
      namePlaceholder: 'Nome do modelo',
      descriptionPlaceholder: 'Descrição',
      settingsJson: 'Configurações (JSON)',
      fieldsCount: '{{count}} campos',
      shownInModals: 'Exibido em modais',
      hiddenInModals: 'Oculto em modais',
      apply: 'Aplicar',
      toast: {
        deleted: 'Modelo excluído',
        updated: 'Modelo atualizado',
        created: 'Modelo criado',
        applied: 'Modelo aplicado',
      },
    },
  },

  // Support/Debug
  support: {
    debugLoggingActive: 'Registro de depuração ativo',
    manageLogs: 'Gerenciar',
    collectItem7: 'Conectividade da impressora e versões de firmware',
    collectItem8: 'Status de integração (Spoolman, MQTT, HA)',
    collectItem9: 'Interfaces de rede (somente sub-redes)',
    collectItem10: 'Versões de pacotes Python',
    collectItem11: 'Verificações de integridade do banco de dados',
    collectItem12: 'Detalhes do ambiente Docker',
  },

  // File manager
  fileManager: {
    title: 'Gerenciador de Arquivos',
    subtitle: 'Organize e gerencie seus arquivos de impressão',
    uploadFiles: 'Enviar Arquivos',
    newFolder: 'Nova Pasta',
    folderName: 'Nome da Pasta',
    folderNamePlaceholder: 'ex.: Peças Funcionais',
    renameFile: 'Renomear Arquivo',
    renameFolder: 'Renomear Pasta',
    moveFiles: 'Mover {{count}} Arquivo(s)',
    rootNoFolder: 'Raiz (Sem Pasta)',
    current: 'Atual',
    linkFolder: 'Vincular Pasta',
    linkFolderDescription: 'Vincular "{{name}}" a um projeto ou arquivo para acesso rápido.',
    project: 'Projeto',
    archive: 'Arquivo',
    noProjectsFound: 'Nenhum projeto encontrado',
    noArchivesFound: 'Nenhum arquivo encontrado',
    unlink: 'Desvincular',
    link: 'Vincular',
    dragDropFiles: 'Arraste e solte os arquivos aqui',
    dropFilesHere: 'Solte os arquivos aqui',
    orClickToBrowse: 'ou clique para procurar',
    allFileTypesSupported: 'Todos os tipos de arquivos são suportados. Arquivos ZIP serão extraídos.',
    zipFilesDetected: 'Arquivos ZIP detectados',
    zipExtractOptions: 'Arquivos ZIP serão extraídos. Escolha como lidar com a estrutura de pastas:',
    preserveZipStructure: 'Preservar estrutura de pastas do ZIP',
    createFolderFromZip: 'Criar pasta a partir do nome do arquivo ZIP',
    stlThumbnailGeneration: 'Geração de miniaturas STL',
    zipMayContainStl: 'Arquivos ZIP podem conter arquivos STL. Miniaturas podem ser geradas durante a extração.',
    thumbnailsCanBeGenerated: 'Miniaturas podem ser geradas para arquivos STL. Modelos grandes podem levar mais tempo para processar.',
    generateThumbnailsForStl: 'Gerar miniaturas para arquivos STL',
    threemfDetected: 'Arquivos 3MF detectados',
    threemfExtractionInfo: 'Modelo da impressora, material, cor e configurações de impressão serão extraídos automaticamente dos arquivos 3MF.',
    willBeExtracted: 'Será extraído',
    filesExtracted: '{{count}} arquivos extraídos',
    uploadComplete: 'Upload concluído: {{succeeded}} bem-sucedidos',
    uploadFailed: 'Falha no envio',
    zipFilesFailed: '{{count}} arquivos falharam',
    uploading: 'Enviando...',
    changeLink: 'Alterar link...',
    linkTo: 'Vincular a...',
    linkToProjectOrArchive: 'Vincular a projeto ou arquivo',
    addToQueue: 'Adicionar à fila',
    schedulePrint: 'Agendar impressão',
    generateThumbnail: 'Gerar miniatura',
    generateThumbnails: 'Gerar miniaturas',
    generateThumbnailsForMissing: 'Gerar miniaturas para arquivos STL que não possuem',
    gridView: 'Visualização em grade',
    listView: 'Visualização em lista',
    lowDiskSpaceWarning: 'Aviso de pouco espaço em disco',
    lowDiskSpaceDetails: 'Apenas {{free}} livres de {{total}} no total. O limite está definido para {{threshold}} GB nas configurações.',
    files: 'Arquivos',
    folders: 'Pastas',
    size: 'Tamanho',
    free: 'Livre',
    allFiles: 'Todos os arquivos',
    wrap: 'Quebrar texto',
    enableTextWrapping: 'Ativar quebra de texto',
    disableTextWrapping: 'Desativar quebra de texto',
    collapse: 'Recolher',
    collapseFoldersByDefault: 'Recolher pastas por padrão',
    expandFoldersByDefault: 'Expandir pastas por padrão',
    dragToResizeTooltip: 'Arraste para redimensionar, clique duas vezes para redefinir',
    searchFiles: 'Pesquisar arquivos...',
    allTypes: 'Todos os tipos',
    prints: 'Impressões',
    ascending: 'Crescente',
    descending: 'Decrescente',
    resultsCount: '{{showing}} de {{total}} arquivos',
    selectAll: 'Selecionar tudo',
    deselectAll: 'Desmarcar tudo',
    selected: '{{count}} selecionado(s)',
    adding: 'Adicionando...',
    loadingFiles: 'Carregando arquivos...',
    folderIsEmpty: 'A pasta está vazia',
    noFilesYet: 'Nenhum arquivo ainda',
    folderEmptyDescription: 'Envie arquivos ou mova arquivos para esta pasta para começar.',
    noFilesDescription: 'Envie arquivos para começar a organizar seus arquivos relacionados à impressão.',
    noMatchingFiles: 'Nenhum arquivo correspondente',
    noMatchingFilesDescription: 'Nenhum arquivo corresponde aos seus critérios de pesquisa ou filtro.',
    clearFilters: 'Limpar filtros',
    printedCount: 'Impresso {{count}}x',
    uploadedBy: 'Enviado por',
    deleteFolder: 'Excluir pasta',
    deleteFile: 'Excluir arquivo',
    deleteFilesCount: 'Excluir {{count}} arquivos',
    deleteFolderConfirm: 'Tem certeza de que deseja excluir esta pasta? Todos os arquivos dentro também serão excluídos.',
    deleteFileConfirm: 'Tem certeza de que deseja excluir este arquivo?',
    deleteFilesConfirm: 'Tem certeza de que deseja excluir {{count}} arquivos selecionados? Esta ação não pode ser desfeita.',
    deleting: 'Excluindo...',
    noPermissionRenameFolder: 'Você não tem permissão para renomear pastas',
    noPermissionLinkFolder: 'Você não tem permissão para vincular pastas',
    noPermissionDeleteFolder: 'Você não tem permissão para excluir pastas',
    noPermissionPrint: 'Você não tem permissão para imprimir',
    noPermissionSlice: 'Você não tem permissão para fatiar arquivos',
    noPermissionAddToQueue: 'Você não tem permissão para adicionar à fila',
    noPermissionDownload: 'Você não tem permissão para baixar arquivos',
    noPermissionRenameFile: 'Você não tem permissão para renomear este arquivo',
    noPermissionGenerateThumbnail: 'Você não tem permissão para gerar miniaturas',
    noPermissionDeleteFile: 'Você não tem permissão para excluir este arquivo',
    noPermissionCreateFolder: 'Você não tem permissão para criar pastas',
    noPermissionUpload: 'Você não tem permissão para enviar arquivos',
    noPermissionMoveFiles: 'Você não tem permissão para mover arquivos',
    noPermissionDeleteFiles: 'Você não tem permissão para excluir arquivos',
    // External folder
    linkExternal: 'Vincular externo',
    linkExternalFolder: 'Vincular pasta externa',
    linkExternalFolderDescription: 'Montar um diretório do host (NAS, USB, compartilhamento de rede) no Gerenciador de Arquivos. Os arquivos não são copiados — são acessados diretamente do caminho original.',
    externalFolderNamePlaceholder: 'ex. Impressões NAS',
    externalPath: 'Caminho do host',
    externalPathHelp: 'Caminho absoluto do diretório no host Docker. Deve estar montado como bind no contêiner.',
    readOnly: 'Somente leitura',
    readOnlyHelp: 'impede uploads e exclusões',
    showHiddenFiles: 'Mostrar arquivos ocultos (arquivos ponto)',
    externalFolder: 'Pasta externa',
    scanFolder: 'Escanear',
    toast: {
      folderCreated: 'Pasta criada',
      folderDeleted: 'Pasta excluída',
      fileDeleted: 'Arquivo excluído',
      filesDeleted: 'Excluídos {{count}} arquivos',
      filesMoved: 'Arquivos movidos',
      folderLinked: 'Pasta vinculada',
      folderUnlinked: 'Pasta desvinculada',
      externalFolderLinked: 'Pasta externa vinculada e escaneada',
      folderScanned: 'Escaneamento concluído: {{added}} adicionados, {{removed}} removidos',
      addedToQueue: 'Adicionado {{count}} arquivo(s) à fila',
      addedToQueuePartial: 'Adicionado {{added}} arquivo(s), {{failed}} falharam',
      failedToAddToQueue: 'Falha ao adicionar arquivos: {{error}}',
      fileRenamed: 'Arquivo renomeado',
      folderRenamed: 'Pasta renomeada',
      thumbnailsGenerated: 'Geradas {{count}} miniatura(s)',
      thumbnailsGeneratedPartial: 'Geradas {{succeeded}} miniatura(s), {{failed}} falharam',
      noStlMissingThumbnails: 'Nenhum arquivo STL sem miniatura',
      failedToGenerateThumbnails: 'Falha ao gerar miniaturas: {{error}}',
      thumbnailGenerated: 'Miniatura gerada',
      failedToGenerateThumbnail: 'Falha ao gerar miniatura: {{error}}',
    },
  },

  // Projects
  projects: {
    title: 'Projetos',
    subtitle: 'Organize e acompanhe seus projetos de impressão 3D',
    newProject: 'Novo Projeto',
    editProject: 'Editar Projeto',
    deleteProject: 'Excluir Projeto',
    projectName: 'Nome do Projeto',
    description: 'Descrição',
    noProjects: 'Nenhum projeto ainda',
    noProjectsFiltered: 'Nenhum projeto {{status}}',
    noProjectsFilteredHelp: 'Você não tem nenhum projeto {{status}}. Os projetos aparecerão aqui quando seu status mudar.',
    createFirst: 'Crie seu primeiro projeto para começar a organizar impressões relacionadas, acompanhar o progresso e gerenciar suas construções.',
    createFirstButton: 'Crie Seu Primeiro Projeto',
    create: 'Criar',
    files: 'Arquivos',
    prints: 'Impressões',
    plates: 'Placas',
    parts: 'Peças',
    lastModified: 'Última Modificação',
    deleteConfirm: 'Tem certeza de que deseja excluir este projeto? Arquivos e itens da fila serão desvinculados, mas não excluídos.',
    addFiles: 'Adicionar Arquivos',
    removeFile: 'Remover Arquivo',
    viewDetails: 'Ver Detalhes',
    // Modal fields
    namePlaceholder: 'ex., Voron 2.4 Build',
    descriptionPlaceholder: 'Descrição opcional...',
    urlLabel: 'URL',
    urlPlaceholder: 'https://makerworld.com/...',
    urlInvalid: 'A URL deve começar com http:// ou https://',
    openExternalUrl: 'Abrir URL do projeto',
    coverImageLabel: 'Imagem de capa',
    coverImageAlt: 'Imagem de capa do projeto',
    coverImageUpload: 'Enviar',
    coverImageReplace: 'Substituir',
    coverImageRemove: 'Remover',
    color: 'Cor',
    targetPlates: 'Placas Alvo',
    targetPlatesPlaceholder: 'ex., 25',
    targetPlatesHelp: 'Número de trabalhos de impressão',
    targetParts: 'Peças Alvo',
    targetPartsPlaceholder: 'ex., 150',
    targetPartsHelp: 'Total de objetos necessários',
    tagsLabel: 'Tags (separadas por vírgula)',
    tagsPlaceholder: 'ex., voron, funcional, presente',
    dueDate: 'Data de Vencimento',
    priority: 'Prioridade',
    priorityLow: 'Baixa',
    priorityNormal: 'Normal',
    priorityHigh: 'Alta',
    priorityUrgent: 'Urgente',
    // Status
    statusActive: 'Ativo',
    statusCompleted: 'Concluído',
    statusArchived: 'Arquivado',
    done: 'Concluído',
    completed: 'Concluído',
    failed: 'Falhou',
    inQueue: 'Na fila',
    noPrintsYet: 'Nenhuma impressão ainda',
    // Footer stats
    printJobs: 'Trabalhos de impressão (placas)',
    partsPrinted: 'Peças impressas',
    failedParts: 'Peças falhadas',
    // Actions
    import: 'Importar',
    export: 'Exportar',
    importProject: 'Importar projeto',
    exportAll: 'Exportar todos os projetos',
    loading: 'Carregando projetos...',
    // Permissions
    noEditPermission: 'Você não tem permissão para editar projetos',
    noDeletePermission: 'Você não tem permissão para excluir projetos',
    noCreatePermission: 'Você não tem permissão para criar projetos',
    noImportPermission: 'Você não tem permissão para importar projetos',
    noExportPermission: 'Você não tem permissão para exportar projetos',
    // Toast
    toast: {
      created: 'Projeto criado',
      updated: 'Projeto atualizado',
      deleted: 'Projeto excluído',
      imported: 'Projeto importado',
      multipleImported: '{{count}} projetos importados',
      importFailed: 'Falha na importação',
      exported: 'Projetos exportados (apenas metadados)',
    },
  },

  // Project detail page
  projectDetail: {
    notFound: 'Projeto não encontrado',
    backToProjects: 'Voltar para Projetos',
    export: 'Exportar',
    exportProject: 'Exportar projeto',
    noExportPermission: 'Você não tem permissão para exportar projetos',
    noEditPermission: 'Você não tem permissão para editar projetos',
    partOf: 'Parte de:',
    priorityLabel: 'Prioridade:',
    noPrints: 'Nenhuma impressão neste projeto ainda',
    status: {
      active: 'Ativo',
      completed: 'Concluído',
      archived: 'Arquivado',
    },
    priority: {
      low: 'Baixa',
      normal: 'Normal',
      high: 'Alta',
      urgent: 'Urgente',
    },
    dueDate: {
      overdue: 'Atrasado',
      today: 'Vence hoje',
      daysLeft: '{{count}} dias restantes',
    },
    progress: {
      platesProgress: 'Progresso das Placas',
      partsProgress: 'Progresso das Peças',
      printJobs: 'Trabalhos de Impressão',
      parts: 'Peças',
      percentComplete: '{{percent}}% concluído',
      remaining: '{{count}} restantes',
    },
    stats: {
      printJobs: 'Trabalhos de Impressão',
      total: 'total',
      failed: '{{count}} falhou',
      partsPrinted: '{{count}} peças impressas',
      printTime: 'Tempo de Impressão',
      filamentUsed: 'Filamento Usado',
    },
    cost: {
      title: 'Rastreamento de Custos',
      filamentCost: 'Custo do Filamento',
      energy: 'Energia',
      totalCost: 'Custo Total',
      total: 'Total',
      includesBom: 'incl. lista de materiais',
      budget: 'Orçamento',
      remaining: 'Restante',
    },
    subProjects: {
      title: 'Sub-projetos ({{count}})',
    },
    notes: {
      title: 'Notas',
      noEditPermission: 'Você não tem permissão para editar notas',
      placeholder: 'Adicione notas sobre este projeto...',
      empty: 'Nenhuma nota ainda. Clique em Editar para adicionar notas.',
    },
    files: {
      title: 'Arquivos',
      linkFolders: 'Vincular pastas do Gerenciador de Arquivos',
      forQuickAccess: 'a este projeto para acesso rápido.',
      fileCount: '{{count}} arquivo(s)',
      empty: 'Nenhuma pasta vinculada. Vá para o Gerenciador de Arquivos e vincule uma pasta a este projeto.',
      noFiles: 'Nenhum arquivo nesta pasta.',
      print: 'Imprimir agora',
      addToQueue: 'Adicionar à fila',
    },
    bom: {
      title: 'Lista de Materiais',
      acquired: '{{completed}}/{{total}} adquiridos',
      showAll: 'Mostrar todos',
      hideDone: 'Ocultar concluídos',
      addPart: 'Adicionar Peça',
      noAddPermission: 'Você não tem permissão para adicionar peças',
      partNamePlaceholder: 'Nome da peça (ex.: parafusos M3x8)',
      partName: 'Nome da peça',
      qty: 'Quantidade',
      price: 'Preço ({{currency}})',
      sourcingUrlPlaceholder: 'URL de fornecimento (opcional)',
      remarksPlaceholder: 'Observações (opcional)',
      deletePart: 'Excluir Peça',
      deleteConfirm: 'Tem certeza de que deseja excluir "{{name}}"?',
      noUpdatePermission: 'Você não tem permissão para atualizar peças',
      noEditPermission: 'Você não tem permissão para editar peças',
      noDeletePermission: 'Você não tem permissão para excluir peças',
      totalCost: 'Custo total:',
      empty: 'Nenhuma peça na lista de materiais. Adicione hardware, eletrônicos ou outros componentes para rastrear o que precisa ser adquirido.',
    },
    timeline: {
      title: 'Linha do Tempo de Atividades',
      empty: 'Nenhuma atividade ainda.',
    },
    template: {
      saveAsTemplate: 'Salvar como Modelo',
      noCreatePermission: 'Você não tem permissão para criar modelos',
    },
    queue: {
      title: 'Fila',
      viewAll: 'Ver todos',
      printing: '{{count}} imprimindo',
      queued: '{{count}} na fila',
    },
    prints: {
      title: 'Impressões ({{count}})',
    },
    toast: {
      projectUpdated: 'Projeto atualizado',
      partAdded: 'Peça adicionada',
      partRemoved: 'Peça removida',
      exportFailed: 'Falha na exportação',
      projectExported: 'Projeto exportado',
      templateCreated: 'Modelo criado',
    },
  },

  // System info
  system: {
    title: 'Informações do Sistema',
    version: 'Versão',
    uptime: 'Tempo de Atividade',
    cpuUsage: 'Uso da CPU',
    memoryUsage: 'Uso da Memória',
    diskUsage: 'Uso do Disco',
    networkInfo: 'Informações de Rede',
    logs: 'Registros',
    debugMode: 'Modo de Depuração',
    enableDebug: 'Ativar Registro de Depuração',
    disableDebug: 'Desativar Registro de Depuração',
    downloadLogs: 'Baixar Logs',
    clearLogs: 'Limpar Logs',
    dockerInfo: 'Informações do Docker',
    containerName: 'Nome do Contêiner',
    imageName: 'Nome da Imagem',
    platform: 'Plataforma',
    architecture: 'Arquitetura',
  },

  // Library (K Profiles)
  library: {
    title: 'Biblioteca de Filamentos',
    addFilament: 'Adicionar Filamento',
    editFilament: 'Editar Filamento',
    deleteFilament: 'Excluir Filamento',
    vendor: 'Fornecedor',
    material: 'Material',
    color: 'Cor',
    kFactor: 'Fator K',
    temperature: 'Temperatura',
    noFilaments: 'Nenhum filamento na biblioteca',
    deleteConfirm: 'Tem certeza de que deseja excluir este filamento?',
    importFromPrinter: 'Importar da Impressora',
    exportToFile: 'Exportar para Arquivo',
  },

  // Slice (slicer-API integration via SliceModal)
  slice: {
    title: 'Fatiar modelo',
    action: 'Fatiar',
    slicing: 'Fatiando…',
    printer: 'Perfil de impressora',
    process: 'Perfil de processo',
    filament: 'Perfil de filamento',
    filamentSlot: 'Filamento {{index}} ({{type}})',
    selectPreset: '— Selecione uma predefinição —',
    loadingPresets: 'Carregando predefinições…',
    analyzingPlateFilaments: 'Analisando filamentos da mesa…',
    analyzingPlateFilamentsHint: 'Executando uma fatia de pré-visualização para descobrir quais slots AMS esta mesa usa. Cacheado depois — reabrir é instantâneo.',
    previewToast: 'Analisando {{name}} – {{elapsed}}',
    previewWithProgress: 'Analisando {{name}} – {{stage}} ({{percent}}%) – {{elapsed}}',
    notUsedByPlate: '— não usado por esta mesa',
    printerMismatch: 'Este 3MF foi fatiado para {{source}}, mas você escolheu {{target}}. A CLI do fatiador não pode re-fatiar um 3MF para outra impressora — abra a origem no Bambu Studio, troque a impressora e re-exporte.',
    noPresetsForSlot: 'Nenhuma predefinição disponível',
    presetsLoadFailed: 'Falha ao carregar predefinições. Abra Configurações → Perfis para importá-las primeiro.',
    allPresetsRequired: 'Todas as predefinições devem ser selecionadas',
    enqueuing: 'Enviando trabalho de fatiamento…',
    queued: 'Na fila…',
    failed: 'Falha ao fatiar. Verifique os logs do sidecar.',
    startedToast: 'Fatiando {{name}} em segundo plano…',
    queuedToast: 'Na fila: {{name}} – {{elapsed}}',
    runningToast: 'Fatiando {{name}} – {{elapsed}}',
    runningWithProgress: '{{name}} – {{stage}} ({{percent}}%) – {{elapsed}}',
    completedToast: '{{name}} fatiado',
    failedToast: 'Falha ao fatiar {{name}}: {{detail}}',
    tier: {
      local: 'Importado',
      cloud: 'Nuvem',
      standard: 'Padrão',
    },
    cloud: {
      notAuthenticated: 'Faça login no Bambu Cloud (Configurações → Perfis → Nuvem) para ver as predefinições.',
      expired: 'Sessão do Bambu Cloud expirou – faça login novamente para atualizar as predefinições.',
      unreachable: 'Bambu Cloud está inacessível agora. Predefinições locais e padrão ainda funcionam.',
    },
    bedType: {
      label: 'Mesa de impressão',
      auto: 'Auto (usar predefinição de processo)',
      coolPlate: 'Cool Plate',
      coolPlateSuperTack: 'Cool Plate SuperTack',
      engineering: 'Engineering Plate',
      highTemp: 'High Temp Plate',
      texturedPEI: 'Textured PEI Plate',
      smoothPEI: 'Smooth PEI Plate',
    },
  },

  // Spoolman
  spoolman: {
    title: 'Integração com Spoolman',
    enabled: 'Spoolman Ativado',
    url: 'URL do Spoolman',
    connected: 'Conectado',
    disconnected: 'Não Conectado',
    testConnection: 'Testar Conexão',
    sync: 'Sincronizar',
    syncing: 'Sincronizando...',
    lastSync: 'Última Sincronização',
    linkToSpoolman: 'Vincular ao Spoolman',
    openInSpoolman: 'Abrir no Spoolman',
    unlinkSpool: 'Desvincular Carretel',
    unlinkConfirmTitle: 'Remover atribuição do carretel?',
    unlinkConfirmMessage: 'Isso removerá o carretel deste slot. Os dados do próprio carretel permanecerão inalterados.',
    selectSpool: 'Selecionar Carretel',
    noUnlinkedSpools: 'Nenhum carretel não atribuído disponível',
    linkSuccess: 'Carretel atribuído com sucesso',
    linkFailed: 'Falha ao atribuir carretel',
    unlinkSuccess: 'Atribuição do carretel removida com sucesso',
    unlinkFailed: 'Falha ao remover atribuição do carretel',
    linkedSpool: 'Carretel atribuído',
    spoolId: 'Carretel ID (Spool ID)',
    fillSourceLabel: '(Spoolman)',
    weight: 'Peso',
    remaining: 'Restante',
    disableWeightSync: 'Desativar Sincronização de Peso Estimado do AMS',
    disableWeightSyncDesc: 'Não atualize a capacidade restante a partir das estimativas do AMS. Use isso se preferir o rastreamento de uso do Spoolman em vez das estimativas baseadas em porcentagem do AMS. Novos carretéis ainda usarão a estimativa do AMS como seu peso inicial.',
    reportPartialUsage: 'Relatar Uso Parcial para Impressões Falhadas',
    reportPartialUsageDesc: 'Quando uma impressão falha ou é cancelada, relate o filamento estimado usado até aquele ponto com base no progresso das camadas.',
  },

  // Inventory
  inventory: {
    title: 'Inventário de Carretéis',
    subtitle: 'Gerencie seus carretéis',
    spoolmanMixedContentTitle: 'Spoolman não pode carregar em HTTPS — conteúdo misto bloqueado pelo navegador',
    spoolmanMixedContentBody: 'O Bambuddy é servido via HTTPS (pelo seu reverse proxy), mas a URL do Spoolman ainda é HTTP. Os navegadores bloqueiam conteúdo misto por segurança, então a interface embutida do Spoolman não consegue carregar. O Spoolman também precisa estar acessível via HTTPS.',
    spoolmanMixedContentFixReverseProxy: 'Coloque o Spoolman atrás do mesmo reverse proxy do Bambuddy (Traefik / Nginx / Caddy) com HTTPS e atualize a URL do Spoolman em Configurações com o novo endereço HTTPS.',
    spoolmanMixedContentFixOpenNewTab: 'Como alternativa, abra o Spoolman em uma nova aba via HTTP — as regras de conteúdo misto só se aplicam a frames embutidos, uma aba independente funciona normalmente.',
    spoolmanOpenInNewTab: 'Abrir Spoolman em nova aba',
    labels: {
      title: 'Imprimir etiquetas de bobinas',
      selectedCount: '{{count}} selecionado',
      pickSpools: 'Escolha para quais bobinas imprimir etiquetas:',
      searchPlaceholder: 'Buscar por nome, marca ou #ID',
      filterByMaterial: 'Material:',
      allMaterials: 'Tudo',
      selectVisible: 'Selecionar todos visíveis ({{count}})',
      deselectVisible: 'Desmarcar visíveis',
      clearAll: 'Limpar tudo',
      noSpoolsToShow: 'Nenhuma bobina para mostrar. Ajuste o filtro e tente novamente.',
      noMatches: 'Nenhuma bobina corresponde à pesquisa ou filtro atual.',
      printOne: 'Imprimir etiqueta desta bobina',
      printLabels: 'Imprimir etiquetas…',
      bulkTitle: 'Escolha bobinas para etiquetar entre as {{count}} exibidas',
      noSpoolsTitle: 'Nenhuma bobina para rotular',
      error: 'Não foi possível gerar etiquetas: {{msg}}',
      sortBy: {
        label: 'Ordenar:',
        id: 'Por ID',
        color: 'Por cor',
      },
      templates: {
        ams: {
          label: 'AMS holder (30 × 15 mm)',
          hint: 'Uma etiqueta por página; serve no porta-etiquetas AMS popular.',
        },
        box40x30: {
          label: 'Etiqueta de caixa (40 × 30 mm)',
          hint: 'Uma etiqueta por página; tamanho comum de rolo DK/Brother, ideal para etiquetar sacos de filamento e caixas de armazenamento.',
        },
        box: {
          label: 'Box label (62 × 29 mm)',
          hint: 'Uma etiqueta por página; tamanho para Brother PT/QL e etiquetas pequenas Dymo.',
        },
        averyL7160: {
          label: 'Avery L7160 — A4 sheet (38.1 × 63.5 mm × 21)',
          hint: 'Formato de folha UE; 21 etiquetas por página A4.',
        },
        avery5160: {
          label: 'Avery 5160 — US Letter sheet (25.4 × 66.7 mm × 30)',
          hint: 'Formato de folha US; 30 etiquetas por página Letter.',
        },
      },
    },
    addSpool: 'Adicionar Carretel',
    editSpool: 'Editar Carretel',
    copySpool: 'Copiar Carretel',
    material: 'Material',
    selectMaterial: 'Selecionar material...',
    subtype: 'Subtipo',
    brand: 'Marca',
    searchBrand: 'Pesquisar marca...',
    useCustomBrand: 'Usar "{{brand}}"',
    useCustomMaterial: 'Usar material personalizado: {{material}}',
    colorName: 'Nome da Cor',
    colorNamePlaceholder: 'Branco Jade, Vermelho Fogo...',
    color: 'Cor',
    hexColor: 'Cor Hexadecimal',
    pickColor: 'Escolher cor personalizada',
    labelWeight: 'Peso da Etiqueta',
    coreWeight: 'Peso do Carretel Vazio',
    searchSpoolWeight: 'Pesquisar peso do carretel...',
    weightUsed: 'Usado',
    currentWeight: 'Peso Restante',
    measuredWeight: 'Peso Medido',
    spoolName: 'Bobina',
    costPerKg: 'Custo por kg',
    storageLocation: 'Local de armazenamento',
    storageLocationPlaceholder: 'ex. Prateleira A, Gaveta 1',
    openInInventory: 'Abrir no inventário',
    measuredWeightError: 'O peso medido deve estar entre {{min}}g e {{max}}g.',
    slicerFilament: 'Filamento do Fatiador',
    slicerFilamentName: 'Nome do Predefinido do Fatiador',
    slicerPreset: 'Predefinido do Fatiador',
    searchPresets: 'Pesquisar predefinições de filamento...',
    selectedPreset: 'Selecionado',
    noPresetsFound: 'Nenhuma predefinição encontrada',
    tempOverrides: 'Substituições de Temperatura',
    note: 'Nota',
    notePlaceholder: 'Quaisquer notas adicionais sobre este spool...',
    // Per-spool category + low-stock threshold override (#729)
    category: 'Categoria',
    categoryPlaceholder: 'ex. Produção, Protótipo, Cliente A',
    categoryNone: 'Sem categoria',
    storageLocationNone: 'Sem local definido',
    lowStockThresholdOverride: 'Limite de estoque baixo (este carretel)',
    lowStockThresholdOverrideHelp: 'Deixe em branco para usar o limite global ({{global}}%).',
    clearRfid: 'Limpar tag RFID',
    rfidCleared: 'Tag RFID limpa',
    archive: 'Arquivar',
    restore: 'Restaurar',
    noSpools: 'Nenhum carretel ainda. Adicione seu primeiro carretel para começar.',
    noAvailableSpools: 'Nenhum carretel disponível. Adicione um carretel ao seu inventário ou desatribua um de outro slot primeiro.',
    kProfiles: 'K-Perfis',
    addKProfile: 'Adicionar K-Perfil',
    assignSpool: 'Atribuir Carretel',
    unassignSpool: 'Desatribuir',
    assignSuccess: 'Carretel atribuído e slot AMS configurado',
    assignFailed: 'Falha ao atribuir carretel',
    selectSpool: 'Selecione um carretel para atribuir a este slot',
    assigned: 'Atribuído',
    assigning: 'Atribuindo...',
    searchSpools: 'Pesquisar carretéis...',
    showAllSpools: 'Mostrar todos os carretéis',
    spoolmanSpools: 'Bobinas Spoolman',
    allMaterials: 'Todos os Materiais',
    filterByBrand: 'Filtrar por marca...',
    showArchived: 'Mostrar arquivados',
    quickAdd: 'Adição rápida (Estoque)',
    quantity: 'Quantidade',
    stock: 'Estoque',
    configured: 'Configurado',
    spoolsCreated: '{{count}} carretéis criados',
    spoolsPartiallyCreated: '{{created}} de {{total}} carretéis criados (alguns falharam)',
    spoolCreated: 'Carretel criado',
    spoolUpdated: 'Carretel atualizado',
    spoolDeleted: 'Carretel excluído',
    deepLinkSpoolNotFound: 'Carretel não encontrado',
    deepLinkFetchFailed: 'Não foi possível carregar o carretel — tente novamente',
    spoolArchived: 'Carretel arquivado',
    spoolRestored: 'Carretel restaurado',
    kProfileSaveFailed: 'Não foi possível salvar as configurações do perfil K',
    syncWeightSpoolNotFound: 'Carretel não encontrado — pode ter sido excluído',
    syncWeightSpoolmanUnreachable: 'Spoolman está inacessível — tente novamente mais tarde',
    syncWeightFailed: 'Falha ao sincronizar o peso',
    spoolmanUnreachable: 'Spoolman está inacessível — tente novamente mais tarde',
    deleteSpoolNotFound: 'Carretel não encontrado — pode já ter sido excluído',
    deleteFailed: 'Falha ao excluir carretel',
    archiveSpoolNotFound: 'Carretel não encontrado — pode já ter sido excluído',
    archiveFailed: 'Falha ao arquivar carretel',
    restoreSpoolNotFound: 'Carretel não encontrado — pode já ter sido excluído',
    restoreFailed: 'Falha ao restaurar carretel',
    saveFailed: 'Falha ao salvar as alterações',
    tagClearFailed: 'Falha ao limpar a tag',
    deleteConfirm: 'Tem certeza de que deseja excluir este carretel? Esta ação não pode ser desfeita.',
    archiveConfirm: 'Tem certeza de que deseja arquivar este carretel?',
    advancedSettings: 'Configurações Avançadas',
    // Tabs
    filamentInfoTab: 'Informações do Filamento',
    paProfileTab: 'Perfil PA',
    filamentInfo: 'Filamento',
    additional: 'Adicional',
    // Cloud
    loadingPresets: 'Carregando predefinições da nuvem...',
    cloudConnected: 'Nuvem conectada',
    cloudNotConnected: 'Nuvem não conectada (usando padrões)',
    // Colors
    recentColors: 'Recentes',
    searchColors: 'Pesquisar cores...',
    searchResults: 'Resultados da pesquisa',
    allColors: 'Todas as cores',
    commonColors: 'Cores comuns',
    showLess: 'Mostrar menos',
    showAll: 'Mostrar tudo',
    noColorsFound: 'Nenhuma cor corresponde à sua pesquisa',
    noResults: 'Nenhum resultado encontrado',
    // Multi-color gradient + visual effect (#1154) — English fallback.
    extraColorsLabel: 'Cores extras',
    extraColorsPlaceholder: 'EC984C,#6CD4BC,A66EB9,D87694',
    extraColorsHint: 'Cole 2 a 8 paradas hex, separadas por vírgulas. Renderizado como gradiente.',
    extraColorsInvalid: 'Hex inválidos ignorados: {{tokens}}',
    colorEffectLabel: 'Efeito',
    colorEffect: {
      none: 'Nenhum',
      sparkle: 'Brilho',
      wood: 'Madeira',
      marble: 'Mármore',
      glow: 'Brilho',
      matte: 'Fosco',
      silk: 'Silk',
      galaxy: 'Galáxia',
      rainbow: 'Arco-íris',
      metal: 'Metal',
      translucent: 'Translúcido',
      gradient: 'Gradiente',
      dualColor: 'Dupla cor',
      triColor: 'Tricolor',
      multicolor: 'Multicolor',
    },
    // PA Profiles
    selectMaterialFirst: 'Por favor, selecione um material primeiro na aba Informações do Filamento.',
    noPrintersConfigured: 'Nenhuma impressora configurada. Adicione impressoras para usar perfis PA.',
    matchingFilter: 'Correspondente',
    anyBrand: 'Qualquer marca',
    anyVariant: 'Qualquer variante',
    autoSelect: 'Seleção automática',
    matches: 'correspondências',
    match: 'correspondência',
    noMatches: 'Nenhuma correspondência',
    connected: 'Conectado',
    offline: 'Offline',
    printerOffline: 'A impressora está offline. Conecte-se para visualizar os perfis de calibração.',
    noKProfilesMatch: 'Nenhum K-perfil corresponde ao filamento selecionado.',
    leftNozzle: 'Bico Esquerdo',
    rightNozzle: 'Bico Direito',
    profilesSelected: 'perfil(is) de calibração selecionado(s)',
    // Stats & enhanced table
    totalInventory: 'Inventário Total',
    totalConsumed: 'Total Consumido',
    byMaterial: 'Por Material',
    inPrinter: 'Na Impressora',
    lowStock: 'Estoque Baixo',
    sinceTracking: 'Desde o início do rastreamento',
    resetUsage: 'Zerar uso',
    resetUsageTooltip: 'Zerar o contador de gramas consumidas desta bobina',
    resetUsageConfirm: 'Zerar o contador de gramas consumidas desta bobina? As impressões futuras voltarão a contar do zero. A bobina em si, o cálculo do peso restante e as configurações não são alterados.',
    resetAllUsage: 'Zerar uso de todas as bobinas',
    resetAllUsageTooltip: 'Zerar o contador de gramas consumidas em todas as bobinas ativas',
    resetAllUsageConfirm: 'Zerar o contador de gramas consumidas nas {{count}} bobinas ativas? Isso limpa o "Total Consumido" para que as impressões futuras contem do zero. Bobinas e pesos restantes não são alterados.',
    usageReset: 'Uso da bobina zerado',
    allUsageReset: '{{count}} bobina(s) zerada(s)',
    resetUsageFailed: 'Falha ao zerar o uso da bobina',
    loadedInAms: 'Carregado no AMS/Ext',
    remaining: 'Restante',
    weightCheck: 'Verificação de Peso',
    lastWeighed: 'Última pesagem',
    neverWeighed: 'Nunca pesado',
    search: 'Pesquisar carretéis...',
    showing: 'Mostrando',
    to: 'até',
    of: 'de',
    show: 'Mostrar',
    spools: 'carretéis',
    spool: 'carretel',
    page: 'Página',
    noSpoolsMatch: 'Nenhum resultado encontrado',
    noSpoolsMatchDesc: 'Tente ajustar sua pesquisa ou filtros para encontrar o que você está procurando.',
    active: 'Ativo',
    archived: 'Arquivado',
    all: 'Todos',
    used: 'Usado',
    new: 'Novo',
    clearFilters: 'Limpar filtros',
    table: 'Tabela',
    cards: 'Cartões',
    net: 'Líquido',
    // Grouping
    groupSimilar: 'Agrupar',
    groupedSpools: '{{count}} carretéis idênticos',
    groupedRows: 'linhas',
    // Column config
    columns: 'Colunas',
    configureColumns: 'Configurar Colunas',
    configureColumnsDesc: 'Arraste para reordenar as colunas ou use as setas. Alterne a visibilidade com o ícone de olho.',
    visible: 'Visível',
    reset: 'Redefinir',
    cancel: 'Cancelar',
    applyChanges: 'Aplicar Alterações',
    moveUp: 'Mover para cima',
    moveDown: 'Mover para baixo',
    hideColumn: 'Ocultar coluna',
    showColumn: 'Mostrar coluna',
    // Tag linking
    linkToSpool: 'Vincular ao Carretel',
    tagLinked: 'Tag vinculada ao carretel',
    tagLinkFailed: 'Falha ao vincular tag',
    tagAlreadyLinked: 'Tag já vinculada a outro carretel',
    unknownTag: 'Tag RFID desconhecida detectada',
    // Usage history
    usageHistory: 'Histórico de Uso',
    noUsageHistory: 'Nenhum uso registrado ainda',
    printName: 'Nome da Impressão',
    weightConsumed: 'Peso Consumido',
    clearHistory: 'Limpar',
    historyCleared: 'Histórico de uso limpo',
    fillSourceLabel: '(Inv)',
    lowStockThresholdError: 'O limite deve estar entre 0.1 e 99.9',
    assignMismatchTitle: 'Incompatibilidade de material',
    assignMismatchMessage: 'O material do carretel selecionado "{{spoolMaterial}}" não corresponde ao material da bandeja "{{trayMaterial}}" para {{location}}. Atribuir mesmo assim?',
    assignMismatchConfirm: 'Atribuir mesmo assim',
    assignPartialMismatchMessage: 'O material do carretel "{{spoolMaterial}}" é semelhante, mas não corresponde exatamente a "{{trayMaterial}}" em {{location}}. Deseja prosseguir?',
    assignProfileMismatchMessage: 'O perfil do carretel "{{spoolProfile}}" não corresponde ao perfil da bandeja "{{trayProfile}}" em {{location}}. Deseja prosseguir?',
    // Spoolman filament catalog picker
    spoolmanFilamentCatalog: 'Catálogo de filamentos Spoolman',
    pickFromSpoolmanCatalog: 'Escolher do catálogo Spoolman…',
    spoolmanFilamentSelected: 'Filamento selecionado do catálogo Spoolman',
    spoolmanFilamentUnlinked: 'Vínculo com o catálogo de filamentos removido',
    noSpoolmanFilaments: 'Nenhum filamento encontrado no catálogo Spoolman',
    spoolmanFilamentColorSwatch: 'Cor do filamento',
    spoolWeightManagedBySpoolman: 'O peso do carretel vazio é gerenciado por tipo de filamento no Spoolman',
    spoolmanCatalogLoadFailed: 'Falha ao carregar catálogo de filamentos do Spoolman',
  },

  // Timelapse
  timelapse: {
    title: 'Timelapse',
    create: 'Criar Timelapse',
    download: 'Baixar',
    delete: 'Excluir',
    preview: 'Visualizar',
    frameRate: 'Taxa de Quadros',
    quality: 'Qualidade',
    processing: 'Processando...',
    noTimelapses: 'Nenhum timelapse disponível',
  },

  // AMS
  ams: {
    title: 'AMS',
    slot: 'Slot',
    empty: 'Vazio',
    emptySlot: 'Slot vazio',
    unknown: 'Desconhecido',
    humidity: 'Umidade',
    temperature: 'Temperatura',
    filamentType: 'Tipo de Filamento',
    filamentColor: 'Cor',
    remaining: 'Restante',
    history: 'Histórico do AMS',
    noHistory: 'Nenhum histórico disponível',
    configureSlot: 'Configurar Slot',
    externalSpool: 'Carretel Externo',
    profile: 'Perfil',
    kFactor: 'Fator K',
    fill: 'Preencher',
    configure: 'Configurar',
    used: 'usado',
    remainingUnit: 'restante',
  },

  // Print modal
  printModal: {
    title: 'Iniciar Impressão',
    selectPrinter: 'Selecionar Impressora',
    selectPlate: 'Selecionar Placa',
    filamentMapping: 'Mapeamento de Filamento',
    totalCost: 'Custo total:',
    slotRemainingShort: ' - {{grams}}g rest.',
    printSettings: 'Configurações de Impressão',
    bedLeveling: 'Nivelamento da Mesa',
    flowCalibration: 'Calibração de Fluxo',
    vibrationCalibration: 'Calibração de Vibração',
    layerInspection: 'Inspeção da Primeira Camada',
    timelapse: 'Timelapse',
    startPrint: 'Iniciar Impressão',
    addToQueue: 'Adicionar à Fila',
    cancel: 'Cancelar',
    noPrintersAvailable: 'Nenhuma impressora disponível',
    printerBusy: 'Impressora ocupada',
    printerOffline: 'Impressora offline',
    sameTypeDifferentColor: 'Mesmo tipo, cor diferente',
    filamentTypeNotLoaded: 'Tipo de filamento não carregado',
    openCalendar: 'Abrir calendário',
    leftNozzle: 'L',
    rightNozzle: 'R',
    leftNozzleTooltip: 'Bico esquerdo',
    rightNozzleTooltip: 'Bico direito',
    filamentOverride: 'Substituição de Filamento',
    filamentOverrideHint: 'Substitua opcionalmente os filamentos para atribuição baseada em modelo. O agendador usará os filamentos selecionados em vez dos valores originais do 3MF.',
    originalFilament: 'Original',
    overrideWith: 'Substituir por',
    resetToOriginal: 'Restaurar original',
    insufficientFilamentTitle: 'Filamento insuficiente',
    insufficientFilamentMessage: 'Alguns dos carretéis atribuídos têm menos filamento restante do que o necessário para esta impressão:',
    insufficientFilamentLine: '{{printer}} - {{slot}}: necessário {{required}}g, restante {{remaining}}g',
    printAnyway: 'Imprimir mesmo assim',
    forceColorMatch: 'Forçar correspondência de cor',
    staggerPrinterStarts: 'Escalonar inícios',
    staggerGroupSize: 'Tamanho do grupo',
    staggerInterval: 'Intervalo (min)',
    staggerPreview: '{{printers}} impressoras → {{groups}} grupos de {{size}}, iniciando a cada {{interval}} min',
    staggerLastGroup: 'último grupo: {{count}}',
    staggerTotal: 'total: {{minutes}} min',
    staggerToPrinters: 'Escalonar para {{count}} impressoras',
    gcodeInjection: 'Injetar G-code de auto-impressão',
  },

  // Backup
  backup: {
    includesEncryptionKey: 'Backups locais incluem o arquivo da chave de criptografia MFA (DATA_DIR/.mfa_encryption_key), então o backup ZIP é autossuficiente. Trate o ZIP como sensível — quem tiver o arquivo pode descriptografar os client secrets OIDC e os segredos TOTP armazenados.',
    title: 'Bakup e Restauração',
    createBackup: 'Criar Backup',
    restoreBackup: 'Restaurar Backup',
    restoreDescription: 'Substituir todos os dados a partir de um arquivo de backup',
    downloadBackup: 'Baixar Backup',
    uploadBackup: 'Enviar Backup',
    lastBackup: 'Último Backup',
    autoBackup: 'Backup automático',
    backupNow: 'Fazer Backup Agora',
    restoreWarning: 'Aviso: Restaurar um backup substituirá todos os dados atuais.',
    includeArchives: 'Incluir Arquivos',
    includeSettings: 'Incluir Configurações',
    includeProfiles: 'Incluir Perfis',
    backupSuccess: 'Backup criado com sucesso',
    restoreSuccess: 'Backup restaurado com sucesso',
    backupFailed: 'Falha ao criar backup',
    restoreFailed: 'Falha ao restaurar backup',
    restoreNote: 'A impressora virtual será parada durante a restauração',

    // GitHub Backup
    githubBackup: 'Backup GitHub',
    enabled: 'Ativado',
    cloudLoginRequired: 'Login no Bambu Cloud necessário. Entre em Perfis → Perfis Cloud para ativar o backup GitHub.',
    cloudLoginRequiredShort: 'Login Cloud necessário',
    githubDescription: 'Sincronize automaticamente seus perfis com um repositório GitHub privado para backup e histórico de versões.',
    repoIsPrivate: 'O repositório é privado — seguro para backup.',
    repoIsPublicWarning: 'O repositório está PÚBLICO. Os backups do Bambuddy incluem credenciais MQTT, tokens do Home Assistant, tokens do Prometheus, seu e-mail do Bambu Cloud e os códigos de acesso das impressoras via K-profiles. Salvar está bloqueado até que você torne o repositório privado nas configurações do seu provedor.',
    repoVisibilityUnknown: 'Não foi possível determinar a visibilidade do repositório. O Bambuddy se recusa a fazer backup em qualquer destino não confirmado como privado; salvar será bloqueado.',
    repositoryUrl: 'URL do repositório',
    repoUrlPlaceholderGitHub: 'https://github.com/username/repo-name',
	repoUrlPlaceholderGitea: 'https://gitea.example.com/username/repo-name',
    repoUrlPlaceholderForgejo: 'https://forgejo.example.com/username/repo-name',
    repoUrlPlaceholderGitLab: 'https://gitlab.com/username/repo-name',
    allowInsecureHttp: 'Permitir HTTP inseguro',
    allowInsecureHttpHint: 'Ativar para instâncias auto-hospedadas em redes privadas sem TLS',
    personalAccessToken: 'Token de acesso pessoal',
    tokenSaved: '(salvo)',
    enterNewToken: 'Digite um novo token para atualizar',
    tokenHint: 'Token de granularidade fina com permissão de leitura/escrita de conteúdo',
    branch: 'Branch',
    provider: 'Provedor Git',
    providerGitHub: 'GitHub',
	providerGitLab: 'GitLab',
	providerGitea: 'Gitea',
    providerForgejo: 'Forgejo',
    manualOnly: 'Apenas manual',
    hourly: 'A cada hora',
    daily: 'Diário',
    weekly: 'Semanal',
    includeInBackup: 'Incluir no backup',
    kProfiles: 'K-Perfis',
    kProfilesDescription: 'Calibração de avanço de pressão das impressoras conectadas',
    noPrintersConnected: 'Nenhuma impressora conectada',
    printersConnected: '{{connected}}/{{total}} conectadas',
    cloudProfiles: 'Perfis Cloud',
    cloudProfilesDescription: 'Predefinições de filamento, impressora e processo do Bambu Cloud',
    appSettings: 'Configurações do App',
    appSettingsDescription: 'Configuração do Bambuddy (banco de dados completo)',
    spoolInventory: 'Inventário de bobinas',
    spoolInventoryDescription: 'Bobinas de filamento, histórico de uso e rastreamento de custos',
    printArchives: 'Arquivos de impressão',
    printArchivesDescription: 'Metadados do histórico de impressão (sem arquivos gcode/3MF)',
    lastBackupAt: 'Último backup:',
    noBackupsYet: 'Nenhum backup ainda',
    next: 'Próximo:',
    startingBackup: 'Iniciando backup...',
    test: 'Testar',
    enableBackup: 'Ativar backup',
    testConnection: 'Testar conexão',
    enterRepoUrl: 'Digite a URL do repositório',
    enterRepoAndToken: 'Digite a URL do repositório e o token de acesso',
    repoRequired: 'A URL do repositório é obrigatória',
    tokenRequired: 'O token de acesso é obrigatório',
    githubBackupEnabled: 'Backup GitHub ativado',
    tokenUpdated: 'Token atualizado',
    settingsSaved: 'Configurações salvas',
    failedToSave: 'Falha ao salvar: {{message}}',
    backupCompleteFiles: 'Backup concluído - {{count}} arquivos atualizados',
    backupSkippedNoChanges: 'Backup ignorado - sem alterações',
    backupFailed2: 'Falha no backup: {{message}}',
    clearedLogs: '{{count}} logs removidos',
    failedToClearLogs: 'Falha ao limpar logs: {{message}}',

    // History
    history: 'Histórico',
    clear: 'Limpar',
    date: 'Data',
    status: 'Status',
    commit: 'Commit',

    // Local Backup
    localBackup: 'Backup local',
    localBackupDescription: 'Crie um backup completo dos seus dados do Bambuddy incluindo banco de dados, arquivos, uploads e todos os ficheiros.',
    downloadBackupLabel: 'Baixar backup',
    completeBackupZip: 'Backup completo: banco de dados + todos os arquivos (ZIP)',
    download: 'Baixar',
    preparingBackup: 'Preparando backup...',
    creatingArchive: 'Criando arquivo de backup... Isso pode demorar para backups grandes.',
    downloadingFile: 'Baixando arquivo de backup...',
    backupDownloaded: 'Backup baixado com sucesso',
    failedToCreateBackup: 'Falha ao criar backup: {{message}}',
    restore: 'Restaurar',
    restoreReplacesAll: 'A restauração substitui todos os dados.',
    restoreReplacesAllDetail: 'Seu banco de dados e arquivos atuais serão completamente substituídos. É necessário reiniciar após a restauração.',
    restoreConfirmTitle: 'Restaurar backup',
    restoreConfirmMessage: 'Tem certeza de que deseja restaurar de "{{filename}}"? Isso substituirá completamente seu banco de dados e todos os arquivos. O aplicativo precisará ser reiniciado após a restauração.',
    restoreConfirmButton: 'Restaurar backup',
    uploadingFile: 'Enviando arquivo de backup...',
    backupRestoredRestart: 'Backup restaurado. Por favor, reinicie o Bambuddy.',
    failedToRestore: 'Falha ao restaurar backup. Verifique o formato do arquivo.',
    reloadNow: 'Recarregar agora',
    creatingBackup: 'Criando backup',
    restoringBackup: 'Restaurando backup',
    preparing: 'Preparando...',
    processing: 'Processando...',
    doNotClosePage: 'Por favor, não feche esta página nem navegue para outro lugar. Esta operação pode levar vários minutos para backups grandes.',

    // RestoreModal
    restoring: 'Restaurando...',
    restoreComplete: 'Restauração concluída',
    restoreFailed2: 'Falha na restauração',
    importSettings: 'Importar configurações de um arquivo de backup',
    pleaseWaitRestoring: 'Aguarde enquanto seus dados estão sendo restaurados',
    selectBackupFile: 'Clique para selecionar um arquivo de backup (.json ou .zip)',
    duplicateHandling: 'Como funciona o tratamento de duplicatas:',
    matchPrinters: 'Impressoras',
    matchPrintersBy: 'correspondência por número de série',
    matchSmartPlugs: 'Tomadas inteligentes',
    matchSmartPlugsBy: 'correspondência por endereço IP',
    matchNotificationProviders: 'Provedores de notificação',
    matchNotificationProvidersBy: 'correspondência por nome',
    matchFilaments: 'Filamentos',
    matchFilamentsBy: 'correspondência por nome + tipo + marca',
    matchArchives: 'Arquivos',
    matchArchivesBy: 'correspondência por hash de conteúdo (sempre ignorado)',
    matchPendingUploads: 'Uploads pendentes',
    matchPendingUploadsBy: 'correspondência por nome do arquivo',
    matchSettingsTemplates: 'Configurações e modelos',
    matchSettingsTemplatesBy: 'sempre sobrescritos',
    replaceExisting: 'Substituir dados existentes',
    keepExisting: 'Manter dados existentes',
    overwriteDescription: 'Sobrescrever itens que já existem com dados do backup',
    keepDescription: 'Restaurar apenas itens que ainda não existem',
    overwriteCaution: 'Cuidado:',
    overwriteWarning: 'A sobrescrita substituirá suas configurações atuais pelos dados do backup. Códigos de acesso das impressoras nunca são sobrescritos por segurança.',
    cancel: 'Cancelar',
    processingBackup: 'Processando arquivo de backup...',
    itemsRestored: 'Itens restaurados',
    itemsSkipped: 'Itens ignorados',
    restored: 'Restaurados',
    skippedAlreadyExist: 'Ignorados (já existem)',
    filesCategory: 'Arquivos (3MF, miniaturas, etc.)',
    andMore: '...e mais {{count}}',
    newApiKeysGenerated: 'Novas chaves API geradas',
    keysShownOnce: 'Estas chaves são exibidas apenas uma vez. Copie-as agora!',
    copy: 'Copiar',
    noDataFound: 'Nenhum dado para restaurar foi encontrado no arquivo de backup.',
    close: 'Fechar',

    // Scheduled local backups (#884)
    scheduledBackup: 'Backups agendados',
    scheduledBackupDescription: 'Cria automaticamente snapshots de backup conforme agendamento. O diretório de saída pode ser montado em um NAS ou armazenamento externo.',
    frequency: 'Frequência',
    backupTime: 'Tempo',
    retention: 'Retenção',
    retentionDescription: 'Número de backups a manter',
    outputPath: 'Caminho de saída',
    outputPathPlaceholder: 'Padrão: {{path}}',
    outputPathDescription: 'Deixe em branco para o local padrão',
    runNow: 'Executar agora',
    backupFiles: 'Arquivos de backup',
    noScheduledBackups: 'Sem backups ainda',
    deleteBackup: 'Excluir',
    deleteBackupConfirm: 'Excluir este arquivo de backup?',
    backupRunning: 'Backup em andamento...',
    scheduledBackupComplete: 'Backup concluído com sucesso',
    scheduledBackupFailed: 'Falha no backup',
    nextBackup: 'Próximo backup',
    backupSize: 'Tamanho',
    utc: 'UTC',
    defaultPathLabel: 'Padrão:',

    // Category labels
    categories: {
      settings: 'Configurações',
      notification_providers: 'Provedores de notificação',
      notification_templates: 'Modelos de notificação',
      smart_plugs: 'Tomadas inteligentes',
      printers: 'Impressoras',
      filaments: 'Filamentos',
      maintenance_types: 'Tipos de manutenção',
      archives: 'Arquivos',
      projects: 'Projetos',
      pending_uploads: 'Uploads pendentes',
      external_links: 'Links externos',
      api_keys: 'Chaves API',
    },
  },

  // Tags
  tags: {
    title: 'Etiquetas',
    addTag: 'Adicionar Tag',
    editTag: 'Editar Tag',
    deleteTag: 'Excluir Tag',
    tagName: 'Nome da Tag',
    tagColor: 'Cor da Tag',
    noTags: 'Nenhuma tag',
    deleteConfirm: 'Tem certeza de que deseja excluir esta tag?',
    manageTags: 'Gerenciar Tags',
  },

  // Upload modal (archives)
  uploadModal: {
    title: 'Upload Arquivos 3MF',
    dragDrop: 'Arraste e solte arquivos .3mf aqui',
    or: 'ou',
    browseFiles: 'Procurar Arquivos',
    extractionInfo: 'O modelo da impressora será extraído automaticamente dos metadados do arquivo 3MF.',
    uploaded: 'enviado',
    failed: 'falhou',
    uploading: 'Enviando...',
    upload: 'Enviar',
    uploadFailed: 'Falha no envio',
  },

  // Edit archive modal
  // Edit Archive Modal
  editArchive: {
    title: 'Editar Arquivo',
    name: 'Nome',
    namePlaceholder: 'Nome da impressão',
    printer: 'Impressora',
    noPrinter: 'Nenhuma impressora',
    project: 'Projeto',
    noProject: 'Nenhum projeto',
    itemsPrinted: 'Itens Impressos',
    itemsPrintedHelp: 'Número de itens produzidos neste trabalho de impressão',
    notes: 'Notas',
    notesPlaceholder: 'Adicione notas sobre esta impressão...',
    externalLink: 'Link Externo',
    externalLinkPlaceholder: 'https://printables.com/model/...',
    externalLinkHelp: 'Link para Printables, Thingiverse ou outra fonte',
    tags: 'Etiquetas',
    tagsPlaceholder: 'Adicionar tags...',
    addMoreTags: 'Adicionar mais tags...',
    matchingTags: 'Correspondendo "{{query}}"',
    existingTags: 'Tags existentes',
    clickToAdd: '(clique para adicionar)',
    status: 'Status',
    failureReason: 'Motivo da Falha',
    selectReason: 'Selecione o motivo...',
    photos: 'Fotos do Resultado da Impressão',
    photosHelp: 'Clique em + para adicionar fotos do seu resultado impresso',
    printResult: 'Resultado da Impressão',
    saving: 'Salvando...',
    // Failure reasons
    failureReasons: {
      adhesionFailure: 'Falha de adesão',
      spaghettiDetached: 'Spaghetti / Destacado',
      layerShift: 'Deslocamento de camada',
      cloggedNozzle: 'Bico entupido',
      filamentRunout: 'Fim do filamento',
      warping: 'Empenamento',
      stringing: 'Fios',
      underExtrusion: 'Subextrusão',
      powerFailure: 'Falha de energia',
      userCancelled: 'Cancelado pelo usuário',
      other: 'Outro',
    },
    // Archive statuses
    statuses: {
      completed: 'Concluído',
      failed: 'Falhou',
      aborted: 'Cancelado',
      printing: 'Imprimindo',
    },
  },

  // K-Profiles
  kProfiles: {
    title: 'Perfis K',
    noPrintersConfigured: 'Nenhuma impressora configurada',
    addPrinterInSettings: 'Adicione uma impressora nas Configurações para gerenciar K-profiles',
    noActivePrinters: 'Nenhuma impressora ativa',
    enablePrinterConnection: 'Ative a conexão da impressora para visualizar seus K-profiles',
    loadingProfiles: 'Carregando K-Profiles...',
    printerOffline: 'Impressora Offline',
    printerOfflineDesc: 'A impressora selecionada não está conectada. Ligue-a para visualizar os K-profiles.',
    noMatchingProfiles: 'Nenhum Perfil Correspondente',
    noMatchingProfilesDesc: 'Nenhum perfil corresponde aos seus critérios de pesquisa',
    noKProfiles: 'Nenhum K-Profile',
    noKProfilesDesc: 'Nenhum perfil de avanço de pressão encontrado para bico de {{diameter}}mm',
    createFirstProfile: 'Criar Primeiro Perfil',
    // Controls
    printer: 'Impressora',
    nozzle: 'Bico',
    refresh: 'Atualizar',
    addProfile: 'Adicionar Perfil',
    export: 'Exportar',
    import: 'Importar',
    select: 'Selecionar',
    selectAll: 'Selecionar Todos',
    delete: 'Excluir',
    // Filters
    searchPlaceholder: 'Pesquisar por nome ou filamento...',
    allExtruders: 'Todos os Extrusores',
    leftOnly: 'Apenas Esquerdo',
    rightOnly: 'Apenas Direito',
    allFlow: 'Todo Fluxo',
    hfOnly: 'Apenas HF',
    sOnly: 'Apenas S',
    sortName: 'Ordenar: Nome',
    sortKValue: 'Ordenar: Valor K',
    sortFilament: 'Ordenar: Filamento',
    // Dual extruder labels
    leftExtruder: 'Extrusor Esquerdo',
    rightExtruder: 'Extrusor Direito',
    // Modal
    modal: {
      addTitle: 'Adicionar K-Profile',
      editTitle: 'Editar K-Profile',
      profileName: 'Nome do Perfil',
      profileNamePlaceholder: 'Meu Perfil PLA',
      kValue: 'Valor K',
      kValuePlaceholder: '0.020',
      kValueHelp: 'Faixa típica: 0.01 - 0.06 para PLA, 0.02 - 0.10 para PETG',
      filament: 'Filamento',
      selectFilament: 'Selecionar filamento...',
      noFilamentsHelp: 'Nenhum filamento encontrado. Crie um K-profile no Bambu Studio primeiro.',
      flowType: 'Tipo de Fluxo',
      highFlow: 'Alto Fluxo',
      standard: 'Padrão',
      nozzleSize: 'Tamanho do Bico',
      extruder: 'Extrusor',
      extruders: 'Extrusores',
      left: 'Esquerdo',
      right: 'Direito',
      notes: 'Notas (armazenadas localmente)',
      notesPlaceholder: 'Adicione notas sobre este perfil...',
      notesHelp: 'As notas são salvas no Bambuddy, não na impressora',
      syncing: 'Sincronizando com a impressora...',
      savingExtruder: 'Salvando no extrusor {{current}}/{{total}}...',
      pleaseWait: 'Por favor, aguarde',
    },
    // Delete confirmation
    deleteConfirm: {
      title: 'Excluir Perfil',
      cannotUndo: 'Isso não pode ser desfeito',
      message: 'Tem certeza de que deseja excluir "{{name}}" da impressora?',
    },
    // Bulk delete
    bulkDelete: {
      title: 'Excluir Perfis',
      cannotUndo: 'Isso não pode ser desfeito',
      message: 'Tem certeza de que deseja excluir {{count}} perfis selecionados da impressora?',
    },
    // Toast
    toast: {
      profileSaved: 'K-profile salvo',
      profilesSaved: 'K-profile salvo em {{count}} extrusores',
      selectAtLeastOneExtruder: 'Por favor, selecione pelo menos um extrusor',
      profileDeleted: 'K-profile excluído',
      profilesDeleted: '{{count}} perfis excluídos',
      exportedProfiles: '{{count}} perfis exportados',
      importedProfiles: '{{count}} de {{total}} perfis importados',
      noProfilesToExport: 'Nenhum perfil para exportar',
      invalidFileFormat: 'Formato de arquivo inválido',
      failedToParseImport: 'Falha ao analisar o arquivo de importação',
      failedToSaveBatch: 'Falha ao salvar K-profiles',
      noteSaved: 'Nota salva',
      failedToSaveNote: 'Falha ao salvar nota',
    },
    // Permissions
    permission: {
      noRead: 'Você não tem permissão para atualizar perfis',
      noCreate: 'Você não tem permissão para adicionar perfis',
      noUpdate: 'Você não tem permissão para atualizar K-profiles',
      noDelete: 'Você não tem permissão para excluir K-profiles',
      noExport: 'Você não tem permissão para exportar perfis',
      noImport: 'Você não tem permissão para importar perfis',
    },
  },

  // Virtual Printer
  virtualPrinter: {
    title: 'Impressora Virtual',
    running: 'Em execução',
    stopped: 'Parada',
    description: {
      default: 'Ative uma impressora virtual que aparece no Bambu Studio e no OrcaSlicer. Os arquivos enviados para esta impressora serão arquivados diretamente sem impressão.',
      proxy: 'Ative um proxy que retransmite o tráfego do slicer para uma impressora real, permitindo impressão remota em qualquer rede.',
    },
    enable: {
      title: 'Ativar Impressora Virtual',
      visibleInSlicer: 'Visível como "Bambuddy" na descoberta do slicer',
      proxyingTo: 'Proxy para {{name}}',
      notActive: 'Não ativo',
    },
    model: {
      title: 'Modelo da Impressora',
      description: 'Selecione qual modelo de impressora emular.',
      restartWarning: 'Alterar o modelo reiniciará a impressora virtual',
    },
    accessCode: {
      title: 'Código de acesso',
      isSet: 'O código de acesso está definido',
      notSet: 'Nenhum código de acesso definido — necessário para ativar.',
      placeholder: 'Digite um código de 8 caracteres',
      placeholderChange: 'Digite um novo código para alterar',
      hint: 'Deve ter exatamente 8 caracteres. Usado pelos slicers para autenticação.',
      charCount: '({{count}}/8)',
    },
    targetPrinter: {
      title: 'Impressora Alvo',
      configured: 'Proxy alvo configurado',
      notConfigured: 'Nenhuma impressora alvo selecionada - necessário para o modo proxy',
      placeholder: 'Selecione uma impressora...',
      hint: 'Selecione a impressora para a qual o tráfego do slicer será enviado. A impressora deve estar no modo LAN.',
      noPrinters: 'Nenhuma impressora configurada. Adicione uma impressora primeiro para usar o modo proxy.',
    },
    remoteInterface: {
      title: 'Substituição da Interface de Rede',
      configured: 'Substituição da interface ativa',
      optional: 'Opcional - use se o IP detectado automaticamente estiver errado (por exemplo, várias NICs, Docker, VPN)',
      placeholder: 'Detecção automática (padrão)...',
      hint: 'Substitua o endereço IP anunciado via SSDP e usado no certificado TLS. Útil quando o Bambuddy possui várias interfaces de rede.',
    },
    mode: {
      title: 'Modo',
      archive: 'Arquivar',
      archiveDesc: 'Arquivar arquivos imediatamente',
      review: 'Revisar',
      reviewDesc: 'Revisar antes de arquivar',
      queue: 'Fila',
      queueDesc: 'Arquivar e adicionar à fila',
      proxy: 'Proxy',
      proxyDesc: 'Retransmitir para impressora real',
    },
    autoDispatch: {
      title: 'Envio automático',
      description: 'Iniciar impressões automaticamente quando adicionadas à fila. Quando desativado, as impressões aguardam envio manual.',
    },
    queueForceColorMatch: {
      title: 'Forçar correspondência de cor',
      description: 'Recusa enviar para uma impressora que não tenha exatamente o tipo e cor de filamento carregados. Desativado por padrão — sem isto, a fila usa apenas correspondência por modelo e pode escolher uma impressora com a cor errada carregada.',
    },
    tailscaleDisabled: {
      title: 'Integração Tailscale',
      description: 'Ative para marcar este VP como exposto via Tailscale. Mostra o endereço Tailscale do host para você saber qual IP colar no fatiador. A etapa de importação CA é inalterada — este toggle não afeta certificados.',
    },
    setupRequired: {
      title: 'Configuração Necessária',
      description: 'O recurso de impressora virtual requer configuração adicional do sistema antes de funcionar. Isso inclui encaminhamento de portas, regras de firewall e configurações específicas da plataforma.',
      readGuide: 'Leia o guia de configuração antes de ativar',
    },
    howItWorks: {
      title: 'Como funciona',
      step1: 'Complete o guia de configuração para sua plataforma',
      step2: 'Ative a impressora virtual e defina um código de acesso',
      step3: 'No Bambu Studio ou OrcaSlicer, vá para "Adicionar Impressora"',
    },
    status: {
      title: 'Detalhes do Status',
      printerName: 'Nome da Impressora',
      model: 'Modelo',
      serialNumber: 'Número de Série',
      mode: 'Modo',
      pendingFiles: 'Arquivos Pendentes',
      targetPrinter: 'Impressora Alvo',
      ftpPort: 'Porta FTP',
      mqttPort: 'Porta MQTT',
      ftpConnections: 'Conexões FTP',
      mqttConnections: 'Conexões MQTT',
    },
    toast: {
      updated: 'Configurações da impressora virtual atualizadas',
      failedToUpdate: 'Falha ao atualizar as configurações',
      copyFailed: 'Falha ao copiar — selecione o texto manualmente',
      accessCodeRequired: 'Defina um código de acesso primeiro',
      targetPrinterRequired: 'Selecione uma impressora alvo primeiro',
      bindIpRequired: 'Defina um IP de ligação primeiro',
      accessCodeEmpty: 'O código de acesso não pode estar vazio',
      accessCodeLength: 'O código de acesso deve ter exatamente 8 caracteres',
      created: 'Impressora virtual criada',
      failedToCreate: 'Falha ao criar impressora virtual',
      deleted: 'Impressora virtual excluída',
      failedToDelete: 'Falha ao excluir impressora virtual',
    },
    list: {
      title: 'Impressoras Virtuais',
      add: 'Adicionar',
      addFirst: 'Adicionar Impressora Virtual',
      empty: 'Nenhuma impressora virtual configurada. Adicione uma para começar.',
    },
    bindIp: {
      title: 'Interface de Rede',
      placeholder: 'Selecionar interface...',
      hint: 'Interface de rede para esta impressora virtual. Deve ser única por impressora.',
    },
    proxy: {
      accessCodeHint: 'No modo proxy, use o código de acesso da impressora alvo no slicer. A conexão é encaminhada de forma transparente para a impressora real.',
    },
    addDialog: {
      title: 'Adicionar Impressora Virtual',
      name: 'Nome',
      hint: 'Você pode configurar o código de acesso, impressora alvo e outras configurações após a criação.',
      create: 'Criar',
    },
    deleteConfirm: {
      title: 'Excluir Impressora Virtual',
      message: 'Tem certeza que deseja excluir "{{name}}"? Isso irá parar todos os serviços desta impressora.',
    },
    archiveNameSource: {
      title: 'Origem do nome do arquivo',
      description: 'Escolha como os novos arquivos são nomeados quando chegam pela impressora virtual. "Metadados" usa o título embutido pelo slicer no 3MF (padrão). "Nome do arquivo" usa o nome que o Bambu Studio enviou via FTP — útil se você renomeou o job no diálogo "enviar para impressora".',
      metadata: 'Metadados',
      filename: 'Nome do arquivo',
    },
  },

  // Model Viewer
  modelViewer: {
    openInSlicer: 'Abrir no Slicer',
    tabs: {
      model: 'Modelo 3D',
      gcode: 'Pré-visualização G-code',
    },
    notAvailable: 'Não disponível',
    notSliced: 'Não fatiado',
    plates: 'Placas',
    allPlates: 'Todas as Placas',
    plateNumber: 'Placa {{number}}',
    plateCount: '{{count}} placa',
    plateCount_other: '{{count}} placas',
    objectCount: '{{count}} objeto',
    objectCount_other: '{{count}} objetos',
    filamentCount: '{{count}} filamento',
    filamentCount_other: '{{count}} filamentos',
    eta: 'ETA {{minutes}} min',
    noPreview: 'Pré-visualização não disponível para este arquivo',
    pagination: {
      pageOf: 'Página {{current}} de {{total}}',
      prev: 'Anterior',
      next: 'Próximo',
    },
    errors: {
      failedToLoad: 'Falha ao carregar o arquivo',
      noMeshes: 'Nenhuma malha encontrada no arquivo 3MF',
      unsupportedFormat: 'Formato de arquivo não suportado',
    },
  },

  // Maintenance type descriptions (built-in)
  maintenanceDescriptions: {
    lubricateCarbonRods: 'Aplique lubrificante nos eixos de carbono para um movimento suave',
    lubricateRails: 'Aplique lubrificante nos trilhos lineares para um movimento suave',
    cleanNozzle: 'Limpe o hotend e o bico para evitar entupimentos',
    checkBelts: 'Verifique a tensão das correias para impressões precisas',
    cleanBuildPlate: 'Limpe a placa de construção para melhor adesão',
    checkExtruder: 'Verifique as engrenagens do extrusor quanto ao desgaste',
    checkCooling: 'Verifique se os ventiladores de resfriamento estão funcionando corretamente',
    generalInspection: 'Inspeção geral da impressora',
    cleanCarbonRods: 'Limpe os eixos de carbono para reduzir o atrito',
    lubricateSteelRods: 'Aplique lubrificante nas barras de aço para um movimento suave',
    cleanSteelRods: 'Limpe as barras de aço para reduzir o atrito',
    cleanLinearRails: 'Limpe os trilhos lineares para remover poeira e detritos',
    checkPtfeTube: 'Verifique o tubo PTFE quanto ao desgaste ou danos',
    replaceHepaFilter: 'Substitua o filtro HEPA para qualidade do ar',
    replaceCarbonFilter: 'Substitua o filtro de carbono ativado',
    lubricateLeftNozzleRail: 'Lubrifique o trilho do bico esquerdo (série H2)',
  },

  // Smart Plugs
  smartPlugs: {
    offline: 'Offline',
    admin: 'Administrador',
    openPlugAdminPage: 'Abrir o painel de administração da tomada inteligente',
    deleteSmartPlug: 'Excluir Tomada Inteligente',
    turnOnSmartPlug: 'Ligar Tomada Inteligente',
    turnOffSmartPlug: 'Desligar Tomada Inteligente',
    turnOn: 'Ligar',
    turnOff: 'Desligar',
    addSmartPlug: {
      scanningNetwork: 'Procurando na rede...',
      chooseEntity: 'Escolha uma entidade...',
      connectionFailed: 'Falha na conexão',
      searchEntities: 'Pesquisar entidades...',
      searchPowerSensors: 'Pesquisar sensores de energia...',
      searchEnergySensors: 'Pesquisar sensores de energia...',
      placeholders: {
        plugName: 'Tomada da Sala',
        mqttStateOnValue: 'ON, true, 1',
        mqttSameAsPower: 'Mesmo que o tópico de energia, ou diferente',
      },
    },
    // SmartPlugCard
    linkedTo: 'Vinculado a:',
    monitorOnly: 'Apenas monitoramento',
    alerts: 'Alertas',
    scheduleOn: 'Ligar {{time}}',
    scheduleOff: 'Desligar {{time}}',
    on: 'Ligado',
    off: 'Desligado',
    power: 'Potência',
    kwhToday: 'kWh Hoje',
    settings: 'Configurações',
    automationSettings: 'Configurações de automação',
    showInSwitchbar: 'Mostrar na barra de interruptores',
    quickAccessSidebar: 'Acesso rápido pela barra lateral',
    enabled: 'Ativado',
    enableAutomation: 'Ativar automação para este plugue',
    autoOn: 'Auto Ligar',
    autoOnDescription: 'Ligar quando a impressão iniciar',
    autoOff: 'Auto Desligar',
    autoOffDescription: 'Desligar quando a impressão terminar (única vez)',
    autoOffPersistent: 'Manter ativado',
    autoOffPersistentDescription: 'Permanecer ativado entre impressões em vez de única vez',
    autoOffAfterDrying: 'Desligar Após Secagem',
    autoOffAfterDryingDescription: 'Desligar quando a secagem do AMS terminar',
    delayAfterDryingMinutes: 'Atraso após secagem (minutos)',
    turnOffDelayMode: 'Modo de atraso para desligar',
    time: 'Tempo',
    temp: 'Temp.',
    delayMinutes: 'Atraso (minutos)',
    tempThreshold: 'Limite de temperatura (°C)',
    tempThresholdDescription: 'Desliga quando o bico esfria abaixo desta temperatura',
    edit: 'Editar',
    deleteConfirm: 'Tem certeza que deseja excluir "{{name}}"? Esta ação não pode ser desfeita.',
    turnOnConfirm: 'Tem certeza que deseja ligar "{{name}}"?',
    turnOffConfirm: 'Tem certeza que deseja desligar "{{name}}"? Isso cortará a energia do dispositivo conectado.',
    failedToTurn: 'Falha ao {{action}} "{{name}}"',
    unknown: 'Desconhecido',
    // AddSmartPlugModal
    addTitle: 'Adicionar plugue inteligente',
    editTitle: 'Editar plugue inteligente',
    stopScanning: 'Parar varredura',
    discoverTasmota: 'Descobrir dispositivos Tasmota',
    foundDevices: '{{count}} dispositivo(s) encontrado(s) - clique para selecionar:',
    noDevicesFound: 'Nenhum dispositivo Tasmota encontrado na sua rede',
    haNotConfigured: 'Home Assistant não está configurado. Configure em',
    haSettingsPath: 'Configurações → Rede → Home Assistant',
    selectEntity: 'Selecionar entidade *',
    ipAddress: 'Endereço IP *',
    nameLabel: 'Nome *',
    username: 'Usuário',
    password: 'Senha',
    authHint: 'Deixe vazio se seu dispositivo Tasmota não requer autenticação',
    linkToPrinter: 'Vincular à impressora',
    noPrinter: 'Sem impressora (apenas controle manual)',
    linkingDescription: 'A vinculação permite ligar/desligar automaticamente ao iniciar/terminar impressão',
    powerAlerts: 'Alertas de potência',
    alertAbove: 'Alertar se acima (W)',
    alertBelow: 'Alertar se abaixo (W)',
    alertDescription: 'Receba notificações quando o consumo de energia ultrapassar estes limites. Deixe vazio para desativar essa direção.',
    dailySchedule: 'Programação diária',
    turnOnAt: 'Ligar às',
    turnOffAt: 'Desligar às',
    scheduleDescription: 'Ligar/desligar automaticamente o plugue nestes horários diariamente. Deixe vazio para pular essa ação.',
    showOnPrinterCard: 'Mostrar no cartão da impressora',
    displayOnPrinterCard: 'Exibir botão no cartão da impressora',
    connectedResult: 'Conectado!',
    deviceLabel: 'Dispositivo: {{name}} - ',
    stateLabel: 'Estado: {{state}}',
    test: 'Testar',
    delete: 'Excluir',
    save: 'Salvar',
    add: 'Adicionar',
    cancel: 'Cancelar',
    failedToStartScan: 'Falha ao iniciar varredura',
    nameRequired: 'Nome é obrigatório',
    entityRequired: 'Entidade é obrigatória para plugues Home Assistant',
    mqttTopicRequired: 'Pelo menos um tópico MQTT deve ser configurado para potência, energia ou monitoramento de estado',
    loadingEntities: 'Carregando entidades...',
    loading: 'Carregando...',
    failedToLoadEntities: 'Falha ao carregar entidades: {{error}}',
    noEntitiesMatching: 'Nenhuma entidade encontrada correspondente a "{{search}}"',
    noEntitiesAvailable: 'Nenhuma entidade disponível',
    searchingEntities: 'Buscando todas as entidades ({{count}} encontradas)',
    showingEntities: 'Mostrando switch, light, input_boolean ({{count}} disponíveis)',
    energyMonitoringOptional: 'Monitoramento de energia (Opcional)',
    energyMonitoringHint: 'Pesquise e selecione sensores que fornecem dados de potência/energia.',
    powerSensorW: 'Sensor de potência (W)',
    energyTodayKwh: 'Energia hoje (kWh)',
    totalEnergyKwh: 'Energia total (kWh)',
    noMatchingSensors: 'Nenhum sensor correspondente',
    none: 'Nenhum',
    mqttNotConfigured: 'Broker MQTT não configurado. Defina o endereço do broker em',
    mqttSettingsPath: 'Configurações → Rede → Publicação MQTT',
    mqttNotConfiguredSuffix: '(você não precisa ativar a publicação, apenas preencha os detalhes do broker).',
    mqttMonitorOnlyDescription: 'Plugues MQTT recebem dados de potência/energia via assinatura MQTT. O controle liga/desliga não está disponível - use seu broker MQTT ou sistema de automação residencial.',
    powerMonitoring: 'Monitoramento de potência',
    energyMonitoring: 'Monitoramento de energia',
    stateMonitoring: 'Monitoramento de estado',
    optional: 'opcional',
    topic: 'Tópico',
    jsonPath: 'Caminho JSON',
    multiplier: 'Multiplicador',
    onValue: 'Valor ON',
    mqttPowerHint: 'O caminho JSON extrai o valor do payload JSON (ex: "power_l1"). Deixe vazio se o tópico publica valores numéricos brutos.\nUse multiplicador 0.001 para mW→W, 1000 para kW→W.',
    mqttEnergyHint: 'O caminho JSON extrai o valor do payload JSON. Deixe vazio para valores brutos.\nUse multiplicador 0.001 para Wh→kWh, 1000 para MWh→kWh.',
    mqttStateHint: 'O caminho JSON extrai o valor do payload JSON. Deixe vazio para valores brutos.\nValor ON: a string exata que significa "ON". Deixe vazio para detecção automática (ON, true, 1).',
    // REST smart plug
    restControl: 'Controle',
    restOnUrl: 'URL para ligar',
    restOffUrl: 'URL para desligar',
    restOnBody: 'Corpo da requisição ON',
    restOffBody: 'Corpo da requisição OFF',
    restMethod: 'Método HTTP',
    restHeaders: 'Custom Headers (JSON)',
    restStatusUrl: 'URL de status',
    restStatusPath: 'Caminho JSON de estado',
    restStatusOnValue: 'Valor ON',
    restPowerUrl: 'URL de potência',
    restPowerPath: 'Caminho JSON de energia',
    restPowerMultiplier: 'Multiplicador de potência',
    restEnergyUrl: 'URL de energia',
    restEnergyPath: 'Caminho JSON de energia',
    restEnergyMultiplier: 'Multiplicador de energia',
    restUrlRequired: 'Ao menos uma URL (ON ou OFF) é necessária para tomadas REST',
    restHeadersHint: 'ex. {"Authorization": "Bearer your-token"}',
    restBodyHint: 'ex. ON, {"state": "on"}',
    restStatusHint: 'URL para consultar o estado atual',
    restPathHint: 'ex. state ou data.power.status',
    restPowerUrlHint: 'URL separada para dados de potência (usa a URL de status se vazio)',
    restEnergyUrlHint: 'URL separada para dados de energia (usa a URL de status se vazio)',
    restEnergyHint: 'Cada valor pode usar sua própria URL ou recorrer à URL de status. Use multiplicadores para conversão de unidades (ex: 0.001 para converter Wh em kWh).',
    testConnection: 'Testar conexão',
    connectionSuccess: 'Conexão bem-sucedida',
    noSwitchesInSwitchbar: 'Nenhum interruptor na barra',
    enableSwitchbarHint: 'Ative "Mostrar na barra de interruptores" em Configurações > Smart Plugs',
  },

  // Notifications
  notifications: {
    // Provider types
    providerTypes: {
      callmebot: 'CallMeBot/WhatsApp',
      ntfy: 'ntfy',
      pushover: 'Pushover',
      telegram: 'Telegram',
      email: 'E-mail',
      discord: 'Discord',
      webhook: 'Webhook',
      homeassistant: 'Home Assistant',
    },
    // Provider descriptions
    providerDescriptions: {
      email: 'Notificações por e-mail SMTP',
      telegram: 'Notificações via bot do Telegram',
      discord: 'Enviar para canal do Discord via webhook',
      ntfy: 'Notificações push gratuitas e auto-hospedáveis',
      pushover: 'Notificações push simples e confiáveis',
      callmebot: 'Notificações gratuitas via WhatsApp pelo CallMeBot',
      webhook: 'POST HTTP genérico para qualquer URL',
      homeassistant: 'Notificações persistentes no painel do Home Assistant',
    },
    // NotificationProviderCard
    lastSuccess: 'Último: {{date}}',
    error: 'Erro',
    printer: 'Impressora:',
    allPrinters: 'Todas as impressoras',
    sendTestNotification: 'Enviar Notificação de Teste',
    eventSettings: 'Configurações de Eventos',
    enabled: 'Ativado',
    sendFromProvider: 'Enviar notificações deste provedor',
    // Event categories
    printEvents: 'Eventos de Impressão',
    printerStatus: 'Status da Impressora',
    amsAlarms: 'Alarmes do AMS',
    amsHtAlarms: 'Alarmes do AMS-HT',
    printQueue: 'Fila de Impressão',
    // Event tags (badges)
    start: 'Início',
    plateCheck: 'Verificação da Mesa',
    complete: 'Concluído',
    failed: 'Falhou',
    stopped: 'Parado',
    progress: 'Progresso',
    offline: 'Offline',
    lowFilament: 'Filamento Baixo',
    maintenance: 'Manutenção',
    amsHumidity: 'Umidade do AMS',
    amsTemp: 'Temp. do AMS',
    amsHtHumidity: 'Umidade do AMS-HT',
    amsHtTemp: 'Temp. do AMS-HT',
    bedCooled: 'Mesa Resfriada',
    firstLayer: 'Primeira camada',
    quiet: 'Silencioso',
    digest: 'Resumo {{time}}',
    // Event labels (expanded settings)
    printStarted: 'Impressão Iniciada',
    plateNotEmpty: 'Mesa Não Vazia',
    plateNotEmptyDescription: 'Objetos detectados antes da impressão',
    printCompleted: 'Impressão Concluída',
    bedCooledLabel: 'Mesa Resfriada',
    bedCooledDescription: 'Mesa resfriou abaixo do limite após a impressão',
    firstLayerCompleteLabel: 'Primeira camada concluída',
    firstLayerCompleteDescription: 'Notificar com foto quando a primeira camada terminar',
    missingSpoolAssignmentLabel: 'Atribuição de bobina ausente',
    missingSpoolAssignmentDescription: 'Notificar quando a impressão iniciar e bandejas necessárias não tiverem bobina atribuída',
    printFailed: 'Impressão Falhou',
    printStopped: 'Impressão Parada',
    progressMilestones: 'Marcos de Progresso',
    progressMilestonesDescription: 'Notificar em 25%, 50%, 75%',
    printerOffline: 'Impressora Offline',
    printerError: 'Erro da Impressora',
    lowFilamentLabel: 'Filamento Baixo',
    maintenanceDue: 'Manutenção Necessária',
    maintenanceDueDescription: 'Notificar quando manutenção for necessária',
    amsHumidityHigh: 'Umidade Alta do AMS',
    amsHumidityHighDescription: 'Umidade do AMS regular excede o limite',
    amsTemperatureHigh: 'Temperatura Alta do AMS',
    amsTemperatureHighDescription: 'Temperatura do AMS regular excede o limite',
    amsHtHumidityHigh: 'Umidade Alta do AMS-HT',
    amsHtHumidityHighDescription: 'Umidade do AMS-HT excede o limite',
    amsHtTemperatureHigh: 'Temperatura Alta do AMS-HT',
    amsHtTemperatureHighDescription: 'Temperatura do AMS-HT excede o limite',
    // Inventory stock alert events
    inventoryAlerts: 'Alertas de Estoque',
    stockReorderAlert: 'Alerta de Reposição',
    stockReorderAlertDescription: 'O SKU atingiu seu ponto de reposição',
    stockBreakAlert: 'Alerta de Ruptura de Estoque',
    stockBreakAlertDescription: 'O estoque se esgotará antes da chegada do reabastecimento',
    // Queue events
    jobAdded: 'Trabalho Adicionado',
    jobAddedDescription: 'Trabalho adicionado à fila',
    jobAssigned: 'Trabalho Atribuído',
    jobAssignedDescription: 'Trabalho baseado em modelo atribuído à impressora',
    jobStarted: 'Trabalho Iniciado',
    jobStartedDescription: 'Trabalho da fila começou a imprimir',
    jobWaiting: 'Trabalho Aguardando',
    jobWaitingDescription: 'Trabalho aguardando filamento ou impressora',
    jobSkipped: 'Trabalho Pulado',
    jobSkippedDescription: 'Trabalho pulado (anterior falhou)',
    jobFailed: 'Trabalho Falhou',
    jobFailedDescription: 'Trabalho falhou ao iniciar',
    queueComplete: 'Fila Concluída',
    queueCompleteDescription: 'Todos os trabalhos da fila finalizados',
    // Quiet hours
    quietHours: 'Horário de Silêncio',
    noNotificationsDuring: 'Sem notificações durante essas horas',
    editProviderToChangeQuietHours: 'Edite o provedor para alterar o horário de silêncio',
    // Daily digest
    dailyDigest: 'Resumo Diário',
    batchNotifications: 'Agrupar notificações em um único resumo diário',
    sendAt: 'Enviar às {{time}}',
    editProviderToChangeDigestTime: 'Edite o provedor para alterar o horário do resumo',
    // Actions
    edit: 'Editar',
    deleteProvider: 'Excluir Provedor de Notificação',
    deleteConfirm: 'Tem certeza que deseja excluir "{{name}}"? Isso não pode ser desfeito.',
    delete: 'Excluir',
    // AddNotificationModal
    addTitle: 'Adicionar Provedor de Notificação',
    editTitle: 'Editar Provedor de Notificação',
    nameLabel: 'Nome *',
    namePlaceholder: 'Minhas Notificações',
    providerTypeLabel: 'Tipo de Provedor *',
    configuration: 'Configuração',
    testConfiguration: 'Testar Configuração',
    printerFilter: 'Filtro de Impressora',
    onlyFromPrinter: 'Enviar notificações apenas para eventos desta impressora',
    quietHoursDnd: 'Horário de Silêncio (Não Perturbe)',
    quietStart: 'Início',
    quietEnd: 'Fim',
    dailyDigestLabel: 'Resumo Diário',
    sendDigestAt: 'Enviar resumo às',
    digestCollected: 'Os eventos serão coletados e enviados como um único resumo neste horário',
    notificationEvents: 'Eventos de Notificação',
    progressPercent: '(25%, 50%, 75%)',
    bedCooledAfterPrint: '(após conclusão da impressão)',
    // Per-event ntfy priority (#990)
    eventPriority: {
      sectionTitle: 'Prioridade ntfy',
      helpNtfy: 'Escolha uma prioridade para cada evento habilitado. O ntfy usa isso para escalar alertas (som, visibilidade, comportamento push). Níveis não definidos aqui usam o padrão do servidor ntfy.',
      min: 'Mín',
      low: 'Baixa',
      default: 'Padrão',
      high: 'Alta',
      urgent: 'Urgente',
    },
    cancel: 'Cancelar',
    save: 'Salvar',
    add: 'Adicionar',
    nameRequired: 'Nome é obrigatório',
    fieldRequired: '{{field}} é obrigatório',
    // Config field labels
    phoneNumber: 'Número de Telefone',
    apiKey: 'Chave da API',
    serverUrl: 'URL do Servidor',
    topic: 'Tópico',
    authToken: 'Token de Autenticação',
    userKey: 'Chave do Usuário',
    appToken: 'Token do Aplicativo',
    priority: 'Prioridade',
    botToken: 'Token do Bot',
    chatId: 'ID do Chat',
    smtpServer: 'Servidor SMTP',
    smtpPort: 'Porta SMTP',
    security: 'Segurança',
    authentication: 'Autenticação',
    username: 'Usuário',
    password: 'Senha',
    fromEmail: 'E-mail de Origem',
    toEmail: 'E-mail de Destino',
    webhookUrl: 'URL do Webhook',
    payloadFormat: 'Formato do Payload',
    authorization: 'Autorização',
    titleFieldName: 'Nome do Campo de Título',
    messageFieldName: 'Nome do Campo de Mensagem',
    // NotificationTemplateEditor
    editTemplate: 'Editar Modelo: {{name}}',
    titleLabel: 'Título',
    bodyLabel: 'Corpo',
    titlePlaceholder: 'Título da notificação...',
    bodyPlaceholder: 'Corpo da notificação...',
    availableVariables: 'Variáveis Disponíveis',
    clickToInsert: 'Clique para inserir na posição do cursor no corpo',
    livePreview: 'Pré-visualização ao Vivo',
    hide: 'Ocultar',
    show: 'Mostrar',
    loadingPreview: 'Carregando pré-visualização...',
    enterTemplateContent: 'Insira o conteúdo do modelo para ver a pré-visualização',
    titlePreview: 'Título:',
    bodyPreview: 'Corpo:',
    resetToDefault: 'Restaurar Padrão',
    titleRequired: 'Título é obrigatório',
    bodyRequired: 'Corpo é obrigatório',
    // NotificationLogViewer
    notificationLog: 'Registro de Notificações',
    showFailedOnly: 'Apenas falhas',
    last24Hours: 'Últimas 24 horas',
    last7Days: 'Últimos 7 dias',
    last30Days: 'Últimos 30 dias',
    last90Days: 'Últimos 90 dias',
    justNow: 'Agora mesmo',
    noFailedNotifications: 'Nenhuma notificação com falha',
    noNotificationsLogged: 'Nenhuma notificação registrada',
    unknownProvider: 'Provedor Desconhecido',
    logTitle: 'Título',
    logMessage: 'Mensagem',
    logError: 'Erro',
    logProvider: 'Provedor: {{type}}',
    logTime: 'Hora: {{time}}',
    refresh: 'Atualizar',
    clearOld: 'Limpar Antigos',
    statsSummary: 'Últimos {{days}} dias:',
    statsNotifications: 'notificações',
    statsSent: '{{count}} enviadas',
    statsFailed: '{{count}} com falha',
    // Event type labels (for log viewer)
    eventTypes: {
      print_start: 'Impressão Iniciada',
      print_complete: 'Impressão Concluída',
      print_failed: 'Impressão Falhou',
      print_stopped: 'Impressão Parada',
      print_progress: 'Progresso',
      printer_offline: 'Impressora Offline',
      printer_error: 'Erro da Impressora',
      filament_low: 'Filamento Baixo',
      maintenance_due: 'Manutenção Necessária',
      test: 'Teste',
    },
    // User email notification preferences
    userEmail: {
      title: 'Notificações',
      emailNotifications: 'Notificações por E-mail',
      emailNotificationsDesc: 'Receba notificações por e-mail para seus próprios trabalhos de impressão. Os e-mails são enviados usando as configurações SMTP definidas na Autenticação Avançada.',
      sendingTo: 'As notificações serão enviadas para',
      noEmailWarning: 'Sua conta não tem um endereço de e-mail. Entre em contato com um administrador para adicionar um.',
      printJobNotifications: 'Notificações de Trabalhos de Impressão',
      printJobNotificationsDesc: 'Escolha quais eventos acionam notificações por e-mail para os trabalhos de impressão que você envia.',
      printJobStarts: 'Início do Trabalho de Impressão',
      printJobStartsDesc: 'Ser notificado quando seu trabalho de impressão começar.',
      printJobFinishes: 'Conclusão do Trabalho de Impressão',
      printJobFinishesDesc: 'Ser notificado quando seu trabalho de impressão concluir com sucesso.',
      printErrors: 'Erros de Impressão',
      printErrorsDesc: 'Ser notificado quando seu trabalho de impressão falhar ou encontrar um erro.',
      printJobStops: 'Trabalho de Impressão Parado',
      printJobStopsDesc: 'Ser notificado quando seu trabalho de impressão for cancelado ou parado.',
      saveSuccess: 'Preferências de notificação salvas.',
      saveError: 'Falha ao salvar preferências de notificação.',
    },
  },

  // Rich Text Editor
  richTextEditor: {
    bold: 'Negrito',
    italic: 'Itálico',
    underline: 'Sublinhado',
    bulletList: 'Lista com marcadores',
    numberedList: 'Lista numerada',
    alignLeft: 'Alinhar à esquerda',
    alignCenter: 'Centralizar',
    alignRight: 'Alinhar à direita',
    addLink: 'Adicionar link',
    removeLink: 'Remover link',
  },

  // External Links
  externalLinks: {
    noLinksConfigured: 'Nenhum link externo configurado',
    deleteLink: 'Excluir link',
    removeCustomIcon: 'Remover ícone personalizado',
    openInNewTab: 'Abrir em nova aba',
    placeholders: {
      linkName: 'Meu Link',
    },
  },

  // Keyboard Shortcuts Modal
  keyboardShortcuts: {
    title: 'Atalhos de Teclado',
    navigation: 'Navegação',
    archivesSection: 'Arquivos',
    kProfilesSection: 'Perfis K',
    generalSection: 'Geral',
    shortcuts: {
      goToPrinters: 'Ir para Impressoras',
      goToArchives: 'Ir para Arquivos',
      goToQueue: 'Ir para Fila',
      goToStats: 'Ir para Estatísticas',
      goToProfiles: 'Ir para Perfis na Nuvem',
      goToSettings: 'Ir para Configurações',
      focusSearch: 'Focar na pesquisa',
      openUploadModal: 'Abrir modal de upload',
      clearSelection: 'Limpar seleção / desfocar input',
      contextMenu: 'Menu de contexto nos cartões',
      refreshProfiles: 'Atualizar perfis',
      newProfile: 'Novo perfil',
      exitSelectionMode: 'Sair do modo de seleção',
      showHelp: 'Mostrar esta ajuda',
    },
    footer: 'Pressione Esc ou clique fora para fechar',
  },

  // Notification Log
  notificationLog: {
    title: 'Registro de Notificações',
    events: {
      printStarted: 'Impressão Iniciada',
      printComplete: 'Impressão Concluída',
      printFailed: 'Impressão Falhou',
      printStopped: 'Impressão Interrompida',
      progress: 'Progresso',
      printerOffline: 'Impressora Offline',
      printerError: 'Erro na Impressora',
      lowFilament: 'Filamento Baixo',
      maintenanceDue: 'Manutenção Pendente',
      test: 'Teste',
    },
    timeAgo: {
      justNow: 'Agora mesmo',
      minutesAgo: 'há {{minutes}} minutos',
      hoursAgo: 'há {{hours}} horas',
    },
  },

  // Restore/Backup Modal
  restoreBackup: {
    title: 'Restaurar Backup',
    restoring: 'Restaurando...',
    restoreComplete: 'Restauração Concluída',
    restoreFailed: 'Falha na Restauração',
    importSettings: 'Importar configurações de um arquivo de backup',
    pleaseWait: 'Aguarde enquanto seus dados estão sendo restaurados',
    clickToSelect: 'Clique para selecionar o arquivo de backup (.json ou .zip)',
    howDuplicateHandling: 'Como funciona o tratamento de duplicatas:',
    categories: {
      printers: 'Impressoras',
      smartPlugs: 'Tomadas Inteligentes',
      notificationProviders: 'Provedores de Notificação',
      filaments: 'Filamentos',
      archives: 'Arquivos',
      pendingUploads: 'Uploads Pendentes',
      settingsTemplates: 'Configurações e Modelos',
    },
    matchingInfo: {
      printers: 'correspondem pelo número de série',
      smartPlugs: 'correspondem pelo endereço IP',
      notificationProviders: 'correspondem pelo nome',
      filaments: 'correspondem pelo nome + tipo + marca',
      archives: 'correspondem pelo hash do conteúdo',
      pendingUploads: 'correspondem pelo nome do arquivo',
      settingsTemplates: 'sempre sobrescrito',
    },
    replaceExisting: 'Substituir dados existentes',
    keepExisting: 'Manter dados existentes',
    replaceDescription: 'Substituir itens que já existem com os dados do backup',
    keepDescription: 'Restaurar apenas itens que não existem',
    caution: 'Atenção:',
    cautionText: 'Sobrescrever substituirá suas configurações atuais pelos dados do backup. Os códigos de acesso da impressora nunca são sobrescritos por segurança.',
    itemsRestored: 'Itens Restaurados',
    itemsSkipped: 'Itens Ignorados',
    restored: 'Restaurado',
    skipped: 'Ignorado (já existe)',
    filesLabel: 'Arquivos (3MF, miniaturas, etc.)',
    newApiKeysGenerated: 'Novas Chaves API Geradas',
    newApiKeysWarning: 'Essas chaves são exibidas apenas uma vez. Copie-as agora!',
    processingBackup: 'Processando arquivo de backup...',
    noDataFound: 'Nenhum dado foi encontrado para restaurar no arquivo de backup.',
    failedToRestore: 'Falha ao restaurar o backup. Verifique o formato do arquivo.',
  },

  // Backup Export Modal
  backupExport: {
    title: 'Exportar Backup',
    selectData: 'Selecione os dados a incluir',
    selectAll: 'Selecionar Todos',
    selectNone: 'Selecionar Nenhum',
    categoryDescriptions: {
      settings: 'Idioma, tema, preferências de atualização',
      notifications: 'ntfy, Pushover, Discord, etc.',
      templates: 'Modelos de mensagens personalizadas',
      smartPlugs: 'Configurações de tomadas Tasmota',
      externalLinks: 'Links da barra lateral para serviços externos',
      printers: 'Informações da impressora (códigos de acesso excluídos)',
      plateDetection: 'Imagens de referência de placa vazia',
      filaments: 'Tipos e custos de filamento',
      maintenance: 'Cronogramas de manutenção personalizados',
      archives: 'Todos os dados de impressão + arquivos (3MF, miniaturas, fotos)',
      projects: 'Projetos, itens de BOM e anexos',
      pendingUploads: 'Uploads de impressora virtual aguardando revisão',
      apiKeys: 'Chaves API de webhook (novas chaves geradas na importação)',
    },
    requiresPrinters: 'Requer que as impressoras sejam selecionadas',
    zipFileWarning: 'Um arquivo ZIP será criado.',
    zipFileDescription: 'Inclui todos os arquivos 3MF, miniaturas, timelapses e fotos. Isso pode levar algum tempo e resultar em um arquivo grande.',
    includeAccessCodes: 'Incluir Códigos de Acesso',
    includeAccessCodesDescription: 'Para transferir para outra máquina',
    includeAccessCodesWarning: 'Os códigos de acesso serão incluídos em texto simples. Mantenha este arquivo de backup seguro!',
    categoriesSelected: '{{selectedCount}} categorias selecionadas',
  },

  // Pending Uploads Panel
  pendingUploads: {
    placeholders: {
      notes: 'Adicione notas sobre esta impressão...',
    },
    discardUpload: 'Descartar Upload',
    archiveAllUploads: 'Arquivar Todos os Uploads',
    discardAllUploads: 'Descartar Todos os Uploads',
    archive: 'Arquivar',
    timeAgo: {
      justNow: 'Agora mesmo',
      minutesAgo: 'há {{minutes}} minutos',
      hoursAgo: 'há {{hours}} horas',
      daysAgo: 'há {{days}} dias',
    },
  },

  // API Browser
  apiBrowser: {
    placeholders: {
      requestBody: 'Corpo da requisição JSON...',
      searchEndpoints: 'Pesquisar endpoints...',
    },
  },

  // Configure AMS Slot Modal
  configureAmsSlot: {
    title: 'Configurar Slot AMS',
    slotConfigured: 'Slot Configurado!',
    configuringSlot: 'Configurando slot:',
    slotLabel: '{{ams}} – Slot {{slot}}',
    searchPresets: 'Pesquisar predefinições...',
    colorPlaceholder: 'Nome da cor ou hex (ex.: marrom, FF8800)',
    clearCustomColor: 'Limpar cor personalizada',
    noCloudPresets: 'Nenhuma predefinição na nuvem. Faça login no Bambu Cloud para sincronizar.',
    noPresetsAvailable: 'Nenhuma predefinição disponível. Faça login no Bambu Cloud ou importe perfis locais.',
    noMatchingPresets: 'Nenhuma predefinição correspondente encontrada.',
    custom: 'Personalizado',
    builtin: 'Integrado',
    settingsSentToPrinter: 'Configurações enviadas para a impressora',
    filamentProfile: 'Perfil de Filamento',
    kProfileLabel: 'Perfil K (Avanço de Pressão)',
    filteringFor: 'Filtrando por: {{material}}',
    noKProfile: 'Nenhum perfil K (usar padrão 0.020)',
    noMatchingKProfiles: 'Nenhum perfil K correspondente encontrado. O K padrão=0.020 será usado.',
    selectFilamentFirst: 'Selecione um perfil de filamento primeiro',
    kFromCalibration: 'K={{value}} da calibração da impressora',
    customColorLabel: 'Cor Personalizada (opcional)',
    presetColors: 'Cores de {{name}}:',
    showLessColors: 'Mostrar menos cores',
    showMoreColors: 'Mostrar mais cores',
    clear: 'Limpar',
    hexLabel: 'Hex – #{{hex}}',
    resetting: 'Redefinindo...',
    resetSlot: 'Redefinir Slot',
    cancel: 'Cancelar',
    configuring: 'Configurando...',
    configureSlot: 'Configurar Slot',
  },

  // Git Backup Settings
  githubBackup: {
    title: 'Backup do Git',
    history: 'Histórico',
    downloadBackup: 'Baixar Backup',
    restoreBackup: 'Restaurar Backup',
    noBackupsYet: 'Nenhum backup ainda',
  },

  // Email Settings
  emailSettings: {
    placeholders: {
      fromName: 'Bambuddy',
    },
  },

  // Tag Management Modal
  tagManagement: {
    searchTags: 'Pesquisar tags...',
    renameTag: 'Renomear tag',
    deleteTag: 'Excluir tag',
  },

  // Notification Template Editor
  notificationTemplates: {
    placeholders: {
      title: 'Título da notificação...',
      body: 'Corpo da notificação...',
    },
  },

  // Batch Tag Modal
  batchTag: {
    placeholders: {
      newTag: 'Digite uma nova tag...',
    },
  },

  // Photo Gallery Modal
  photoGallery: {
    deletePhoto: 'Excluir foto',
  },

  // Filament Hover Card
  filamentHoverCard: {
    copySpoolUuid: 'Copiar UUID do carretel',
  },

  // K Profiles View
  kProfilesView: {
    hasNote: 'Possui nota',
    copyProfile: 'Copiar perfil',
  },

  // Layout/Navigation
  layout: {
    openMenu: 'Abrir menu',
    noPermissionSystemInfo: 'Você não tem permissão para visualizar informações do sistema',
  },

  // Dashboard
  dashboard: {
    dragToReorder: 'Arrastar para reordenar',
    hideWidget: 'Ocultar widget',
  },

  // Notification Provider Card
  notificationProviderCard: {
    deleteNotificationProvider: 'Excluir provedor de notificação',
  },

  // File Manager Modal
  fileManagerModal: {
    closeFileManager: 'Fechar gerenciador de arquivos',
    sortFiles: 'Ordenar arquivos',
    goToParentFolder: 'Ir para a pasta pai',
    threeView: 'Visualização 3D',
  },

  // Embedded Camera Viewer
  embeddedCameraViewer: {
    refreshStream: 'Atualizar stream',
    close: 'Fechar',
    zoomOut: 'Reduzir zoom',
    resetZoom: 'Redefinir zoom',
    zoomIn: 'Aumentar zoom',
    dragToResize: 'Arrastar para redimensionar',
  },

  // Timelapse Viewer
  timelapseViewer: {
    skipBack5s: 'Voltar 5s',
    skipForward5s: 'Avançar 5s',
  },

  // Notification Providers
  notificationProviders: {
    descriptions: {
      email: 'Notificações por email SMTP',
      telegram: 'Notificações via bot do Telegram',
      discord: 'Enviar para canal do Discord via webhook',
      ntfy: 'Notificações push gratuitas e auto-hospedáveis',
      pushover: 'Notificações push simples e confiáveis',
      callmebot: 'Notificações gratuitas via WhatsApp pelo CallMeBot',
      webhook: 'POST HTTP genérico para qualquer URL',
    },
  },

  // Log Viewer
  logViewer: {
    searchPlaceholder: 'Pesquisar mensagem ou nome do logger...',
    noLogEntries: 'Nenhuma entrada de log encontrada',
  },

  // Switchbar Popover
  switchbarPopover: {
    noSwitchesInSwitchbar: 'Nenhum switch na barra de switches',
  },

  // Project Page Modal
  projectPageModal: {
    placeholders: {
      title: 'Título',
      designer: 'Designer',
      license: 'Licença',
      description: 'Digite a descrição...',
      profileTitle: 'Título do perfil',
      profileDescription: 'Descrição do perfil...',
    },
  },

  // Spoolman Settings
  spoolmanSettings: {},

  // Time
  time: {
    unknown: '-',
    waiting: 'Aguardando',
    justNow: 'Agora mesmo',
    now: 'Agora',
    minsAgo: '{{count}}min atrás',
    inMins: 'em {{count}}min',
    hoursAgo: '{{count}}h atrás',
    inHours: 'em {{count}}h',
    daysAgo: '{{count}}d atrás',
    inDays: 'em {{count}}d',
  },

  // SpoolBuddy Kiosk
  spoolbuddy: {
    nav: {
      dashboard: 'Painel',
      ams: 'AMS',
      inventory: 'Inventário',
      writeTag: 'Escrever',
      settings: 'Configurações',
    },
    status: {
      nfcReady: 'NFC pronto',
      nfcOff: 'NFC desligado',
      offline: 'Offline',
      online: 'Online',
      noPrinters: 'Sem impressoras',
      deviceOffline: 'Dispositivo offline',
      waitingConnection: 'Aguardando conexão do dispositivo...',
      systemReady: 'Sistema pronto',
      status: 'Status',
    },
    dashboard: {
      readyToScan: 'Pronto para escanear',
      idleMessage: 'Coloque um carretel na balança para identificá-lo',
      nfcHint: 'A tag NFC será lida automaticamente',
      device: 'Dispositivo',
      syncWeight: 'Sincronizar peso',
      weightSynced: 'Sincronizado!',
      unknownTag: 'Tag desconhecida',
      newTag: 'Nova tag detectada',
      onScale: 'na balança',
      linkSpool: 'Vincular ao carretel',
      linkTagTitle: 'Vincular tag ao carretel',
      linkTag: 'Vincular tag',
      selectSpool: 'Selecione um carretel para vincular a esta tag:',
      noUntagged: 'Nenhum carretel sem tag encontrado',
      tagDetected: 'Tag detectada',
      noTag: 'Sem tag',
      tagId: 'Etiqueta',
      grossWeight: 'Peso bruto',
      spoolSize: 'Tamanho do carretel',
      close: 'Fechar',
      currentSpool: 'Carretel Atual',
      plateReady: 'Mesa pronta: {{name}}',
      plateReadyLabel: 'Mesas para liberar',
      plateClearAction: 'Liberar',
      plateClearedToast: 'Mesa marcada como limpa',
      plateClearFailed: 'Não foi possível marcar a mesa como limpa',
    },
    modal: {
      spoolDetected: 'Carretel Detectado',
      assignToAms: 'Atribuir ao AMS',
      syncWeight: 'Sincronizar Peso',
      weightSynced: 'Sincronizado!',
      syncing: 'Sincronizando...',
      newTagDetected: 'Nova Tag Detectada',
      addToInventory: 'Adicionar ao Inventário',
      assignToAmsTitle: 'Atribuir ao AMS',
      selectSlot: 'Selecionar um slot',
      assign: 'Atribuir',
      assigning: 'Atribuindo...',
      assignSuccess: 'Atribuído!',
      assignPendingInsert: 'Atribuído. O slot será configurado quando você inserir o carretel.',
      assignError: 'Falha ao atribuir carretel. Tente novamente.',
      noPrinterSelected: 'Selecionar uma impressora...',
      noAmsDetected: 'Nenhum AMS detectado nesta impressora',
      slot: 'Slot',
    },
    weight: {
      noReading: 'Sem leitura',
      stable: 'Estável',
      measuring: 'Medindo...',
      tare: 'Tarar',
      calibrate: 'Calibrar',
    },
    spool: {
      remaining: 'Restante',
      material: 'Material',
      brand: 'Marca',
      color: 'Cor',
      coreWeight: 'Núcleo',
      labelWeight: 'Rótulo',
      scaleWeight: 'Balança',
      netWeight: 'Líquido',
      lastUsed: 'Último uso',
    },
    ams: {
      noData: 'Nenhum AMS detectado',
      connectAms: 'Conecte um AMS para ver os slots',
      noPrinter: 'Nenhuma impressora selecionada',
      selectPrinter: 'Selecione uma impressora na barra superior',
      printerDisconnected: 'Impressora desconectada',
      humidity: 'Umidade',
      level: 'Nível',
      active: 'Ativo',
      slot: 'Slot',
      empty: 'Vazio',
    },
    inventory: {
      search: 'Buscar carretéis...',
      empty: 'Nenhum carretel no inventário',
      noResults: 'Nenhum carretel correspondente',
      spools: 'carretéis',
      addSpool: 'Adicionar carretel',
    },
    settings: {
      // Tabs
      tabDevice: 'Dispositivo',
      tabDisplay: 'Tela',
      tabScale: 'Balança',
      tabUpdates: 'Atualizações',
      // Device tab
      nfcReader: 'Leitor NFC',
      type: 'Tipo',
      connection: 'Conexão',
      notConnected: 'N/D',
      deviceInfo: 'Info do dispositivo',
      hostname: 'Host',
      uptime: 'Tempo de atividade',
      // Display tab
      brightness: 'Brilho',
      saved: 'Salvo',
      noBacklight: 'Nenhuma retroiluminação DSI detectada. O controle de brilho requer uma tela DSI.',
      screenBlank: 'Tempo para desligar tela',
      screenBlankDesc: 'A tela desliga após inatividade. Toque para despertar.',
      displayNote: 'O brilho é aplicado como filtro de software.',
      // Scale tab
      scaleCalibration: 'Calibração da balança',
      currentWeight: 'Peso atual',
      tareOffset: 'Tara',
      calFactor: 'Fator',
      knownWeight: 'Peso conhecido',
      calStep1: 'Remova todos os itens da balança e pressione Definir zero.',
      calStep2: 'Coloque o peso conhecido na balança.',
      setZero: 'Definir zero',
      calibrateNow: 'Calibrar',
      calibrated: 'Calibrado',
      tareSet: 'Comando de tara enviado. Aguardando dispositivo...',
      tareFailed: 'Falha ao enviar comando de tara',
      zeroSet: 'Ponto zero definido. Coloque o peso conhecido na balança.',
      calibrationDone: 'Calibração concluída!',
      calibrationFailed: 'Falha na calibração',
      lastCalibrated: 'Última calibração',
      stable: 'Estável',
      settling: 'Estabilizando...',
      firmware: 'Firmware',
      scale: 'Balança',
      noDevice: 'Nenhum dispositivo SpoolBuddy encontrado',
      // Updates tab
      daemonVersion: 'Versão do daemon',
      currentVersion: 'Atual',
      versionPending: 'Aguardando daemon...',
      checking: 'Verificando...',
      checkUpdates: 'Verificar atualizações',
      updateAvailable: 'Atualização disponível',
      updateInstructions: 'Atualize via SSH: execute o script de instalação do SpoolBuddy.',
      upToDate: 'Atualizado',
      includeBeta: 'Incluir versões beta',
      systemConfig: 'Backend e autenticação',
      backendUrl: 'URL do backend Bambuddy',
      apiToken: 'Token de API',
      apiTokenPlaceholder: 'Insira o token de API',
      saveConfig: 'Salvar configuração',
      systemQueued: 'Configuração enfileirada.',
      systemFieldsRequired: 'URL do backend é obrigatória.',
      nfcDiagnostic: 'Diagnóstico NFC',
      scaleDiagnostic: 'Diagnóstico da balança',
      readTagDiagnostic: 'Diagnóstico de leitura de tag',
      testNfc: 'Testar leitor',
      testScale: 'Testar precisão',
      testReadTag: 'Ler tag',
    },
    writeTag: {
      tabExisting: 'Bobina existente',
      tabNew: 'Nova bobina',
      tabReplace: 'Substituir tag',
      searchPlaceholder: 'Buscar por material, cor, marca...',
      noUntaggedSpools: 'Nenhuma bobina sem tag',
      noTaggedSpools: 'Nenhuma bobina com tag',
      selectSpool: 'Selecione uma bobina e coloque um NTAG no leitor',
      placeTag: 'Coloque um NTAG no leitor',
      tagReady: 'Tag detectado — pronto para gravar',
      writeTag: 'Gravar Tag',
      replaceTag: 'Substituir Tag',
      writing: 'Gravando tag...',
      waiting: 'Aguardando SpoolBuddy...',
      writeSuccess: 'Tag gravado com sucesso!',
      writeFailed: 'Falha na gravação',
      queueFailed: 'Falha ao enfileirar comando de gravação',
      tryAgain: 'Tentar novamente',
      cancel: 'Cancelar',
      replaceWarning: 'O tag antigo será desvinculado. O novo tag o substituirá.',
      deviceOffline: 'SpoolBuddy está offline',
      material: 'Material',
      colorName: 'Nome da cor',
      color: 'Cor',
      brand: 'Marca',
      weight: 'Peso (g)',
      createSpool: 'Criar bobina',
      creating: 'Criando...',
      spoolCreated: 'Bobina criada! Pronto para gravar.',
      createFailed: 'Falha ao criar bobina',
      incompleteDataWarning: 'Tag gravada com dados Spoolman incompletos',
    },
    quickMenu: {
      printerPower: 'Energia da impressora',
      systemControls: 'Sistema',
      restartDaemon: 'Reiniciar daemon',
      restartBrowser: 'Reiniciar navegador',
      reboot: 'Reiniciar',
      shutdown: 'Desligar',
      swipeToClose: 'Deslize para baixo para fechar',
      confirmTitle: 'Confirmar',
      confirmShutdown: 'Tem certeza de que deseja desligar o SpoolBuddy? Você precisará de acesso físico para ligá-lo novamente.',
      confirmReboot: 'Tem certeza de que deseja reiniciar o SpoolBuddy?',
      confirmRestartDaemon: 'Reiniciar o daemon do SpoolBuddy? NFC e balança ficarão temporariamente indisponíveis.',
      confirmRestartBrowser: 'Reiniciar o navegador kiosk? A tela ficará brevemente preta.',
      confirm: 'Confirmar',
      confirmPlugOn: 'Ligar {{name}}?',
      confirmPlugOff: 'Desligar {{name}}?',
      turnOn: 'Ligar',
      turnOff: 'Desligar',
    },
  },

  bugReport: {
    title: 'Reportar um bug',
    description: 'Descrição',
    descriptionPlaceholder: 'O que deu errado? Por favor, descreva o problema...',
    email: 'Email (opcional)',
    emailPlaceholder: 'seu@email.com.br',
    emailPrivacy: 'Se fornecido, seu email será incluído em uma seção recolhida da issue no GitHub para que o mantenedor possa entrar em contato.',
    screenshot: 'Captura de tela',
    uploadOrPaste: 'Enviar, colar ou arrastar uma imagem',
    dataCollectedSummary: 'Quais dados são incluídos no relatório?',
    dataIncluded: 'Incluídos:',
    dataIncludedList: 'Versão do app, SO, arquitetura, versão Python, estatísticas do banco de dados (apenas contagens), modelos de impressora, quantidade de bicos, versões de firmware, status de conexão, status de integrações (Spoolman, MQTT, HA), configurações não sensíveis, contagem de interfaces de rede, detalhes Docker, versões de dependências.',
    dataNeverIncluded: 'Nunca incluídos:',
    dataNeverIncludedList: 'Nomes de impressoras, números de série, códigos de acesso, senhas, endereços IP, endereços de email, chaves de API, tokens, URLs de webhook, nomes de host ou nomes de usuário.',
    submit: 'Enviar',
    startLogging: 'Iniciar log de depuração',
    stepEnableLogging: 'Log de depuração ativado',
    stepReproduce: 'Reproduza o problema agora',
    stepStopLogging: 'Parar & enviar relatório',
    stopAndSubmit: 'Parar & Enviar',
    maxDuration: 'Para automaticamente após {{minutes}} min',
    stoppingLogs: 'Coletando logs & enviando...',
    submitting: 'Enviando relatório de bug...',
    submitSuccess: 'Relatório de bug enviado com sucesso!',
    submitFailed: 'Falha ao enviar relatório de bug',
    thankYou: 'Obrigado!',
    submitted: 'Seu relatório de bug foi enviado.',
    viewIssue: 'Ver issue',
    unexpectedError: 'Ocorreu um erro inesperado',
  },
  failureDetection: {
    title: 'Detecção de Falhas por IA',
    description: 'Monitora impressões via API ML do Obico auto-hospedada e age automaticamente em falhas detectadas.',
    mlUrl: 'URL da API ML do Obico',
    mlUrlHint: 'URL base do seu contêiner Obico ml_api auto-hospedado (ex.: http://192.168.1.10:3333).',
    test: 'Testar',
    testSuccess: 'API ML acessível e operacional.',
    testFailed: 'Não foi possível acessar a API ML.',
    sensitivity: 'Sensibilidade',
    sensitivityLow: 'Baixa (menos falsos positivos)',
    sensitivityMedium: 'Média (equilibrada)',
    sensitivityHigh: 'Alta (detecção precoce, mais falsos positivos)',
    sensitivityHint: 'Ajusta os limiares de confiança que disparam avisos e falhas.',
    action: 'Ação em falha detectada',
    actionNotify: 'Apenas notificar',
    actionPause: 'Pausar impressão',
    actionPauseOff: 'Pausar e cortar energia',
    pollInterval: 'Intervalo de verificação (segundos)',
    pollIntervalHint: 'Frequência de verificação de cada impressora durante a impressão. Mínimo 5s, máximo 120s.',
    externalUrlMissing: 'URL externa não definida.',
    externalUrlHint: 'A API ML busca a captura da câmera por URL. Defina a URL externa nas configurações gerais para que o contêiner da API ML possa alcançar o Bambuddy.',
    perPrinterTitle: 'Impressoras monitoradas',
    perPrinterHint: 'Escolha quais impressoras o serviço de detecção monitora.',
    monitorAll: 'Monitorar todas as impressoras conectadas',
    statusTitle: 'Status',
    serviceRunning: 'Serviço em execução',
    thresholds: 'Limiares baixo / alto',
    activePrinters: 'Impressões ativas',
    noActivePrints: 'Nenhuma impressão em andamento.',
    historyTitle: 'Detecções recentes',
    noHistory: 'Nenhuma detecção ainda.',
  },
  makerworld: {
    title: 'MakerWorld',
    description: 'Cole uma URL de modelo do MakerWorld para importar e imprimir diretamente do Bambuddy — sem precisar abrir o app Bambu Handy.',
    pasteUrlHeader: 'Importar do MakerWorld',
    pasteUrlPlaceholder: 'https://makerworld.com/en/models/… ou cole qualquer link do MakerWorld',
    resolveButton: 'Resolver',
    signInRequiredTitle: 'Login no Bambu Cloud necessário para baixar',
    signInRequiredBody: 'Você pode navegar pelos detalhes do modelo anonimamente, mas o MakerWorld exige uma conta Bambu Cloud para baixar arquivos 3MF.',
    openCloudSettings: 'Abrir configurações do Cloud',
    untitledModel: 'Modelo sem título',
    byCreator: 'por {{name}}',
    downloadsCount: '{{count}} downloads',
    licensePrefix: 'Licença',
    alreadyImported: 'Já na biblioteca',
    openOnMakerworld: 'Abrir no MakerWorld',
    alreadyInLibrary: 'Este modelo já está na sua biblioteca — encontre-o em Gerenciador de Arquivos → MakerWorld',
    importSuccess: '{{filename}} importado — salvo em Gerenciador de Arquivos → MakerWorld',
    platesHeader: 'Placas ({{count}})',
    plateDefaultName: 'Placa {{n}}',
    materialCount: '{{count}} filamentos',
    amsRequired: 'AMS necessário',
    slicedFor: 'Fatiado para {{printer}}',
    alsoCompatible: 'Também marcado como compatível: {{printers}}',
    importToLibrary: 'Salvar',
    sliceIn: 'Salvar e fatiar no {{slicer}}',
    disclaimer: 'A integração com o MakerWorld usa endpoints de API documentados pela comunidade. Bambuddy não é afiliado nem endossado pelo MakerWorld ou pela Bambu Lab.',
    lastImportSuccess: 'Importado para sua biblioteca',
    lastImportAlreadyInLibrary: 'Já na sua biblioteca',
    viewInLibrary: 'Ver no Gerenciador de Arquivos',
    openInBambuStudio: 'Abrir no Bambu Studio',
    openInOrcaSlicer: 'Abrir no OrcaSlicer',
    importTo: 'Importar para o Gerenciador de Arquivos',
    recentImportsHeader: 'Importações recentes',
    phaseResolving: 'Resolvendo',
    phaseDownloading: 'Baixando',
    folderAuto: 'MakerWorld (padrão)',
    importAll: 'Importar tudo',
    importAllProgress: 'Importando {{current}}/{{total}}',
    openGallery: 'Abrir galeria de imagens',
    galleryPrev: 'Imagem anterior',
    galleryNext: 'Próxima imagem',
    deleteImport: 'Remover da biblioteca',
    importDeleting: 'Removendo…',
    importDeleted: 'Removido da biblioteca',
    confirmDelete: 'Remover {{filename}} da biblioteca? O arquivo local será excluído, mas a placa pode ser reimportada do MakerWorld.',
    errors: {
      resolveFailed: 'Não foi possível resolver essa URL do MakerWorld.',
      downloadFailed: 'Falha no download. Tente novamente.',
      deleteFailed: 'Não foi possível remover o arquivo da biblioteca.',
    },
  },
  gcodeViewer: {
    back: 'Voltar',
    backToArchives: 'Voltar para os arquivos de impressão',
    backToFiles: 'Voltar para o gerenciador de arquivos',
  },
  libraryTrash: {
    title: 'Lixeira',
    headerButton: 'Lixeira',
    headerTooltip: 'Ver arquivos movidos para a lixeira',
    backToFiles: 'Voltar ao gerenciador de arquivos',
    subtitleAdmin: 'Arquivos excluídos ficam aqui por {{days}} dias e depois são removidos automaticamente. Esta visualização mostra a lixeira de todos os usuários.',
    subtitleUser: 'Arquivos excluídos ficam aqui por {{days}} dias e depois são removidos automaticamente.',
    loading: 'Carregando a lixeira…',
    loadError: 'Não foi possível carregar a lixeira.',
    empty: 'A lixeira está vazia.',
    summary: '{{count}} arquivos · {{size}}',
    emptyTrash: 'Esvaziar lixeira',
    restore: 'Restaurar',
    purgeNow: 'Excluir agora',
    autoPurgeIn: 'Exclusão automática em {{when}}',
    days: 'dias',
    retentionLabel: 'Excluir automaticamente após',
    selectAll: 'Selecionar todos',
    selectOne: 'Selecionar {{filename}}',
    selectionCount: '{{count}} selecionado(s)',
    bulkRestore: 'Restaurar selecionados',
    bulkPurge: 'Excluir selecionados',
    col: {
      filename: 'Arquivo',
      folder: 'Pasta',
      size: 'Tamanho',
      deleted: 'Movido para a lixeira',
      autoPurge: 'Exclusão auto.',
      owner: 'Proprietário',
      actions: 'Ações',
    },
    confirm: {
      purgeTitle: 'Excluir permanentemente?',
      purgeBody: '{{filename}} será excluído do disco e não poderá ser restaurado.',
      emptyTitle: 'Esvaziar a lixeira?',
      emptyBody: 'Todos os {{count}} arquivos serão excluídos do disco. Esta ação não pode ser desfeita.',
      bulkPurgeTitle: 'Excluir permanentemente os arquivos selecionados?',
      bulkPurgeBody: 'Os {{count}} arquivos selecionados serão excluídos do disco e não poderão ser restaurados.',
      cta: 'Excluir permanentemente',
    },
    toast: {
      restored: 'Arquivo restaurado.',
      restoreFailed: 'Não foi possível restaurar o arquivo.',
      purged: 'Arquivo excluído permanentemente.',
      purgeFailed: 'Não foi possível excluir o arquivo.',
      emptied: '{{count}} arquivo(s) excluído(s) da lixeira.',
      emptyFailed: 'Não foi possível esvaziar a lixeira.',
      retentionSaved: 'Exclusão automática definida para {{days}} dias.',
      retentionFailed: 'Não foi possível salvar a configuração de retenção.',
      bulkRestored: '{{count}} arquivo(s) restaurado(s).',
      bulkPurged: '{{count}} arquivo(s) excluído(s).',
    },
  },
  libraryPurge: {
    title: 'Limpar arquivos antigos',
    headerButton: 'Limpar antigos',
    headerTooltip: 'Mover arquivos antigos em massa para a lixeira',
    description: 'Arquivos mais antigos que o limite serão movidos para a lixeira. Pastas externas são ignoradas. Você pode restaurar da lixeira antes da exclusão automática.',
    ageLabel: 'Mover arquivos mais antigos que',
    days: 'dias',
    includeNeverPrinted: 'Incluir arquivos que nunca foram impressos',
    effectsTitle: 'O que acontece quando você clica em Limpar',
    effect1: 'Os arquivos correspondentes são movidos para a Lixeira — ainda não são excluídos do disco.',
    effect2: 'Você pode restaurá-los da Lixeira a qualquer momento até o fim do período de retenção.',
    effect3: 'Após o período de retenção, o coletor da lixeira os remove permanentemente.',
    effect4: 'Arquivos em pastas externas (vinculadas) são ignorados — Bambuddy nunca exclui bytes que não possui.',    previewLoading: 'Verificando quantos arquivos correspondem…',
    previewFailed: 'Não foi possível pré-visualizar a limpeza.',
    previewSummary: '{{count}} arquivos · {{size}} seriam movidos para a lixeira',
    andMore: '…e mais {{count}}',
    warning: 'Os arquivos são excluídos de forma suave — você pode restaurá-los da lixeira até o fim do período de retenção.',
    confirmCta: 'Mover {{count}} para a lixeira',
    purging: 'Movendo para a lixeira…',
    toast: {
      success: '{{count}} arquivo(s) movido(s) para a lixeira.',
      failed: 'Não foi possível limpar os arquivos.',
    },
  },
  libraryAutoPurge: {
    enableLabel: 'Limpar arquivos antigos automaticamente',
    enableDescription: 'Executa a limpeza administrativa uma vez por dia. Os arquivos vão primeiro para a lixeira — não são excluídos imediatamente.',
    ageLabel: 'Limpar automaticamente arquivos mais antigos que',
    ageDescription: 'Mínimo 7 dias, máximo 10 anos. Usa a mesma regra de idade do botão Limpar manual.',
    days: 'dias',
    includeNeverPrinted: 'Incluir arquivos que nunca foram impressos',
    saveFailed: 'Não foi possível salvar as configurações de limpeza automática.',
  },
  archivePurge: {
    headerButton: 'Limpar antigos',
    headerTooltip: 'Excluir arquivos antigos em massa',
    title: 'Limpar arquivos antigos',
    description: 'Limpa o histórico de impressão antigo. Cada arquivo envelhece pela última conclusão de impressão — reimprimir reinicia a idade, então trabalho ativo nunca é removido.',
    ageLabel: 'Excluir arquivos não impressos nos últimos',
    days: 'dias',
    effectsTitle: 'O que acontece quando você clica em Limpar',
    effect1: 'Cada arquivo correspondente é ocultado das listagens e seus arquivos são removidos do disco (3MF, miniatura, timelapse, 3MF de origem, F3D, fotos).',
    effect2: 'A linha do arquivo permanece no banco de dados para que o Quick Stats mantenha a contribuição de filamento, tempo, custo e energia — mesmo comportamento padrão da exclusão individual.',
    effect3: 'Marque "Remover também das estatísticas" abaixo para descartar também a contribuição do Quick Stats (equivalente à opção da exclusão individual). Esse caminho é irreversível.',
    effect4: 'Reimprimir um arquivo reinicia seu cronômetro de idade, então arquivos ativos estão protegidos.',
    purgeStatsLabel: 'Remover também das estatísticas',
    purgeStatsHint: 'Remove os arquivos correspondentes do Quick Stats (filamento, tempo, custo, energia). Sem essa opção, o Quick Stats mantém cada contribuição e apenas os arquivos saem do disco.',
    previewLoading: 'Verificando quantos arquivos correspondem…',
    previewFailed: 'Não foi possível visualizar a limpeza.',
    previewSummary: '{{count}} arquivos · {{size}} seriam removidos',
    andMore: '…e mais {{count}}',
    warning: 'Os arquivos são removidos do disco e não podem ser restaurados. Baixe ou favorite o que quiser manter antes de continuar.',
    confirmCta: 'Remover {{count}} arquivo(s)',
    purging: 'Removendo…',
    toast: {
      success: '{{count}} arquivo(s) removido(s).',
      failed: 'Não foi possível limpar os arquivos.',
    },
  },
  archiveAutoPurge: {
    enableLabel: 'Limpar arquivos antigos auto.',
    enableDescription: 'Uma vez por dia oculta das listagens os arquivos não impressos dentro do limite e remove seus arquivos do disco. Reimprimir reinicia o cronômetro.',
    ageLabel: 'Exclusão auto. de arquivos não impressos nos últimos',
    ageDescription: 'Mínimo 7 dias, máximo 10 anos. Baseado na última conclusão de impressão — reimprimir reinicia a idade. Remove 3MF, miniatura, timelapse, 3MF de origem, F3D e fotos.',
    days: 'dias',
    purgeStatsLabel: 'Remover também das estatísticas',
    purgeStatsDescription: 'Quando ativada, a varredura diária também descarta a contribuição de cada arquivo limpo do Quick Stats (filamento, tempo, custo, energia). Desativada por padrão — o Quick Stats mantém a contribuição e apenas os arquivos saem do disco.',
    runNow: 'Limpar arquivos agora',
    saveFailed: 'Não foi possível salvar as configurações de limpeza automática.',
  },
  cameraTokens: {
    title: 'Tokens da API de câmera',
    navTitle: 'Tokens da API de câmera',
    description:
      'Tokens de longa duração para incorporar o stream da câmera no Home Assistant, Frigate, quiosques ou qualquer outra ferramenta que precise de URL estável. Cada token é apenas para stream de câmera e pode ser revogado a qualquer momento.',
    loading: 'Carregando…',
    confirmRevoke: {
      title: 'Revogar este token?',
      body: 'Qualquer dispositivo usando "{{name}}" perderá acesso imediatamente. Isso não pode ser desfeito.',
      cancel: 'Cancelar',
      confirm: 'Revogar',
    },
    create: {
      title: 'Criar novo token',
      nameLabel: 'Nome do token',
      namePlaceholder: 'ex. Home Assistant',
      daysLabel: 'Dias até expirar',
      submit: 'Criar',
      hint:
        'Tempo de vida máximo 365 dias. O valor do token é exibido apenas na criação — copie agora.',
    },
    created: {
      title: 'Token criado – copie agora',
      warning:
        'Esta é a única vez que este token será visível. Após fechar este diálogo, você nunca poderá vê-lo novamente.',
      copy: 'Copiar',
      dismiss: 'Eu salvei',
    },
    list: {
      myTitle: 'Meus tokens',
      allTitle: 'Todos os usuários (visão admin)',
      empty: 'Nenhum token ainda.',
      name: 'Nome',
      owner: 'Proprietário',
      prefix: 'Prefixo',
      created: 'Criado',
      expires: 'Expira',
      lastUsed: 'Último uso',
      revoke: 'Revogar',
      expired: 'Expirado',
    },
    toast: {
      created: 'Token criado',
      createFailed: 'Falha ao criar token',
      revoked: 'Token revogado',
      revokeFailed: 'Falha ao revogar token',
      loadFailed: 'Falha ao carregar tokens',
      copied: 'Copiado para a área de transferência',
      copyFailed: 'Falha ao copiar – selecione e copie manualmente',
    },
  },

  // Forecast & Inventory Intelligence
  forecast: {
    title: 'Previsão de Estoque',
    noSpools: 'Nenhum carretel ativo encontrado. Adicione carretéis ao seu inventário para ver os dados de previsão.',
    noUsageData: 'Nenhum dado de uso disponível — não é possível projetar a linha do tempo do estoque.',
    sku: 'SKU',
    // Table headers
    material: 'Material',
    stock: 'Estoque',
    dailyRate: 'Taxa',
    daysLeft: 'Dias Restantes',
    emptyBy: 'Esgota em',
    reorderBy: 'Reabastecer até',
    actions: 'Ações',
    // Rate tier badges
    trend: 'Tendência',
    estimated: 'Est.',
    noData: 'Sem dados',
    // Timeframe
    timeframe: 'Período',
    // Chart
    chartTitle: 'Estoque projetado — Top 5 materiais',
    dashedLinesROP: 'Linhas tracejadas = pontos de reposição',
    stockLevel: 'Nível de Estoque',
    reorderPoint: 'Ponto de Reposição',
    safetyMargin: 'Margem de Segurança',
    trendLegend: 'Tendência (baseada em histórico, nível de serviço 95%)',
    estimatedLegend: 'Estimado (delta de peso)',
    noDataLegend: 'Sem dados',
    ropLabel: 'PR',
    ssLabel: 'SE',
    safetyStockLegend: 'Estoque de segurança',
    stockArrivalLegend: 'Chegada do estoque',
    stockoutLegend: 'Ruptura de estoque',
    // Alerts toolbar
    alertCount_one: '{{count}} alerta',
    alertCount_other: '{{count}} alertas',
    order: 'Pedir',
    // Settings
    globalLeadTime: 'Lead time global',
    globalLeadTimeHint: 'Lead time global mínimo — usado no cálculo do ponto de reposição para todos os SKUs',
    save: 'Salvar',
    cancel: 'Cancelar',
    settingsSaved: 'Configurações salvas',
    failedSaveSettings: 'Falha ao salvar configurações',
    globalLeadTimeSaved: 'Prazo global salvo',
    skuLeadTimeOverride: 'Override de Lead Time do SKU',
    skuLeadTimeHint: '0 = usar lead time global. Defina >0 para substituir para este SKU.',
    safetyMarginLabel: 'Margem de Segurança',
    effectiveLeadTime: 'Lead Time Efetivo',
    effectiveLeadTimeHint: 'máx(global {{global}}d, SKU {{sku}}d)',
    reorderPointHint: 'd̄ × LT + safety margin — peça quando o estoque atingir este nível',
    safetyMarginHint: 'Estoque de segurança estatístico (z=1,65 × σ × √LT) + buffer definido pelo usuário',
    safetyMarginHintDays: 'Buffer adicionado ao estoque de segurança estatístico.{{approx}}',
    safetyMarginHintDaysApprox: ' ≈ {{g}}g na taxa atual.',
    safetyMarginHintG: 'Buffer de peso fixo adicionado ao estoque de segurança estatístico.{{approx}}',
    safetyMarginHintGApprox: ' ≈ {{days}}d na taxa atual.',
    individualSpools: 'Carretéis individuais',
    labelWeight: 'Etiqueta',
    spoolCount_one: '{{count}} carretel',
    spoolCount_other: '{{count}} carretéis',
    // Alerts
    stockBreakRisk: 'Risco de ruptura de estoque',
    stockBreakBefore: 'Ruptura de estoque antes do reabastecimento',
    stockBreakDetail: '{{days}}d restantes, lead time {{lt}}d.',
    reorderNow: 'Reabastecer agora',
    reorderTriggerPassed: 'A data de acionamento {{date}} já passou.',
    // Shopping list
    shoppingList: 'Lista de Compras',
    shoppingListItems_one: '({{count}} item)',
    shoppingListItems_other: '({{count}} itens)',
    shoppingListEmpty: 'A lista de compras está vazia. Clique no ícone do carrinho em qualquer linha para adicionar itens.',
    addToCart: 'Adicionar à lista de compras',
    alertsSnoozed: 'Silenciar alertas para este SKU',
    alertsEnabled: 'Ativar alertas para este SKU',
    addedToCart: 'Adicionado à lista de compras',
    failedAddItem: 'Falha ao adicionar item',
    listView: 'Lista',
    logisticsView: 'Logística',
    qty: 'Qtd',
    weight: 'Peso',
    leadTime: 'Prazo de entrega',
    expectedRestock: 'Reabastecimento Previsto',
    status: 'Status',
    note: 'Nota',
    pending: 'Pendente',
    purchased: 'Comprado',
    received: 'Recebido',
    markPurchased: 'Marcar como comprado',
    markReceived: 'Marcar como recebido — adiciona carretéis ao estoque',
    resetToPending: 'Redefinir para pendente',
    remove: 'Remover',
    clearAll: 'Limpar tudo',
    downloadCsv: 'CSV',
    // Add to cart modal
    addToCartTitle: 'Adicionar à lista de compras',
    byQuantity: 'Por quantidade',
    byDuration: 'Por duração',
    numberOfSpools: 'Número de carretéis',
    lastHowManyDays: 'Por quantos dias deve durar?',
    noUsageQty: 'Sem dados de uso — quantidade definida como 1.',
    noteOptional: 'Observação (opcional)',
    notePlaceholder: 'ex. para o projeto X, urgente…',
    addNSpools_one: 'Adicionar {{count}} carretel',
    addNSpools_other: 'Adicionar {{count}} carretéis',
    // Cart logistics
    onArrival: 'Na Chegada',
    stockBreakIn: 'Ruptura de estoque em {{days}}d.',
    stockRunsOutBefore: 'O estoque se esgota antes do lead time de {{lt}}d decorrer.',
    atRate: 'A {{rate}}g/dia você precisa de',
    moreSpools_one: '{{count}} carretel a mais',
    moreSpools_other: '{{count}} carretéis a mais',
    bridgeGap: 'para cobrir a lacuna.',
    // Permissions
    noReadAccess: 'Você não tem permissão para visualizar previsões de inventário.',
    noWriteAccess: 'Você não tem permissão para modificar as configurações de previsão.',
  },
};
