export default {
// Navigation
nav: {
printers: 'Impressoras',
archives: 'Arquivos',
queue: 'Fila',
stats: 'Estatísticas',
profiles: 'Perfis',
maintenance: 'Manutenção',
projects: 'Projetos',
inventory: 'Inventário',
files: 'Gerenciador de Arquivos',
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',
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',
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',
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',
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',
// 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
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',
mqttDebug: 'Depuração MQTT',
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: 'Serial',
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',
printerAdded: 'Impressora adicionada',
printerUpdated: 'Impressora atualizada',
failedToDelete: 'Falha ao excluir impressora',
failedToAdd: 'Falha ao adicionar impressora',
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',
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',
},
// Connection status
connection: {
connected: 'Conectado',
offline: 'Offline',
},
// 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',
},
// 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',
},
// 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',
},
// 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',
},
// 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 completamente vazia, 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: 'Dica: 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',
},
// 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',
slotOptions: 'Opções de slot',
// 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 Configurações',
step2: 'Navegue até Firmware',
step3: 'Selecione Atualizar a partir do cartão SD',
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.',
},
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.',
},
},
// 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',
noArchivesYet: 'Ainda não há arquivos',
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',
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',
goToProject: 'Ir para o projeto: {{name}}',
addToProject: 'Adicionar ao projeto',
removeFromProject: 'Remover do projeto',
loading: 'Carregando...',
noProjectsAvailable: 'Nenhum projeto disponível',
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',
},
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}}',
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',
},
modal: {
deleteArchive: 'Excluir Arquivo',
deleteConfirm: 'Tem certeza de que deseja excluir "{{name}}"? Esta ação não pode ser desfeita.',
deleteButton: 'Excluir',
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: 'Tags',
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',
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.',
addedBy: 'Adicionado por {{name}}',
nextInQueue: 'Próximo na fila',
clearPlate: 'Limpar Placa e Iniciar Próximo',
clearPlateSuccess: 'Placa limpa — pronta para a próxima impressão',
plateReady: 'Placa limpa — pronta para a próxima impressão',
plateNumber: 'Placa {{index}}',
// 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',
},
// 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',
},
// 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',
},
},
// Statistics page
stats: {
title: 'Dashboard',
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',
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',
},
// 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: 'Icon',
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',
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',
filament: 'Filamento',
network: 'Rede',
apiKeys: 'Chaves API',
virtualPrinter: 'Impressora Virtual',
users: 'Autenticação',
backup: 'Backup',
emailAuth: 'Autenticação por Email',
},
// 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',
},
// 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',
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.',
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',
// 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',
// 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',
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)',
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',
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 (mínimo 6 caracteres)',
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',
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 6 caracteres',
enterGroupName: 'Por favor, insira um nome de grupo',
settingsSaved: 'Configurações salvas',
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',
},
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',
},
},
// 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: 'Bambuddy Login',
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...',
forgotPassword: 'Esqueceu sua senha?',
loginSuccess: 'Login realizado com sucesso',
loginFailed: 'Falha no login',
enterCredentials: 'Por favor, insira nome de usuário e senha',
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',
},
// 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',
},
// 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',
},
},
// 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: 'Admin',
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',
},
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',
},
form: {
username: 'Nome de Usuário',
usernamePlaceholder: 'Insira o nome de usuário',
email: 'Email',
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: 'Stream Overlay',
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: 'Email',
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 Bambu Lab (do Bambu Studio)',
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: '{{count}} falhou',
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',
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',
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',
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',
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...',
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',
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.',
},
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: 'Logs',
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',
},
// 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',
selectSpool: 'Selecionar Carretel',
noUnlinkedSpools: 'Nenhum carretel desvinculado disponível',
linkSuccess: 'Carretel vinculado ao Spoolman com sucesso',
linkFailed: 'Falha ao vincular carretel',
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',
addSpool: 'Adicionar Carretel',
editSpool: 'Editar Carretel',
material: 'Material',
selectMaterial: 'Selecionar material...',
subtype: 'Subtipo',
brand: 'Marca',
searchBrand: 'Pesquisar marca...',
useCustomBrand: 'Usar "{{brand}}"',
colorName: 'Nome da Cor',
colorNamePlaceholder: 'Jade White, Fire Red...',
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',
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...',
archive: 'Arquivar',
restore: 'Restaurar',
noSpools: 'Nenhum carretel ainda. Adicione seu primeiro carretel para começar.',
noManualSpools: 'Nenhum carretel adicionado manualmente disponível. Adicione um carretel ao seu inventário 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...',
allMaterials: 'Todos os Materiais',
filterByBrand: 'Filtrar por marca...',
showArchived: 'Mostrar arquivados',
spoolCreated: 'Carretel criado',
spoolUpdated: 'Carretel atualizado',
spoolDeleted: 'Carretel excluído',
spoolArchived: 'Carretel arquivado',
spoolRestored: 'Carretel restaurado',
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',
// 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',
loadedInAms: 'Carregado no AMS/Ext',
remaining: 'Restante',
lowStockThreshold: '<20% restante',
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',
// 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)',
},
// 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',
},
// Print modal
printModal: {
title: 'Iniciar Impressão',
selectPrinter: 'Selecionar Impressora',
selectPlate: 'Selecionar Placa',
filamentMapping: 'Mapeamento de Filamento',
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',
},
// Backup
backup: {
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: 'Auto Backup',
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',
},
// Tags
tags: {
title: 'Tags',
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: 'Tags',
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: 'Warping',
stringing: 'Stringing',
underExtrusion: 'Under-extrusion',
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: 'K-Profiles',
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',
},
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',
titleProxy: 'Como funciona (Modo Proxy)',
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"',
step4: 'A impressora "Bambuddy" deve aparecer na lista de descoberta',
step5: 'Conecte-se usando o código de acesso que você definiu',
step6: 'Quando você "imprimir" para o Bambuddy, o arquivo 3MF será arquivado em vez disso',
proxyStep1: 'Selecione a impressora alvo (deve estar no modo LAN)',
proxyStep2: 'Para rede cruzada: selecione a interface de rede do slicer',
proxyStep3: 'Ative o proxy - a impressora aparece na descoberta do slicer via SSDP',
proxyStep4: 'Conecte-se usando o código de acesso da impressora',
proxyStep5: 'Imprima normalmente - o tráfego é retransmitido pelo Bambuddy',
proxyStep6: 'O streaming da câmera requer NAT/encaminhamento de IP (veja a documentação)',
},
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',
accessCodeRequired: 'Defina um código de acesso primeiro',
targetPrinterRequired: 'Selecione uma impressora alvo primeiro',
accessCodeEmpty: 'O código de acesso não pode estar vazio',
accessCodeLength: 'O código de acesso deve ter exatamente 8 caracteres',
},
},
// 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',
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: 'Admin',
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',
},
},
},
// 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: 'K-Profiles',
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',
},
// GitHub Backup Settings
githubBackup: {
title: 'Backup do GitHub',
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: {},
};