diff --git a/src/components/launch/LaunchWindow.tsx b/src/components/launch/LaunchWindow.tsx index 46bef471..15f9a4c9 100644 --- a/src/components/launch/LaunchWindow.tsx +++ b/src/components/launch/LaunchWindow.tsx @@ -1,8 +1,8 @@ import { AppWindow, ArrowUpCircle, - ChevronUp, CheckCircle2, + ChevronUp, Eye, EyeOff, FolderOpen, @@ -54,11 +54,12 @@ interface DesktopSource { windowTitle?: string; } -const LOCALE_LABELS: Record = { +const LOCALE_LABELS: Record = { en: "EN", es: "ES", "zh-CN": "中文", -}; + "pt-BR": "Português (Brasil)", +} as const; const COUNTDOWN_OPTIONS = [0, 3, 5, 10]; @@ -678,8 +679,8 @@ export function LaunchWindow() { case "ready": return updateStatus.availableVersion ? t("recording.update.availableTitle", "Recordly {{version}} is available.", { - version: updateStatus.availableVersion, - }) + version: updateStatus.availableVersion, + }) : t("recording.update.availableGenericTitle"); case "downloading": return updateStatus.detail ?? t("recording.update.downloadingTitle"); diff --git a/src/contexts/I18nContext.tsx b/src/contexts/I18nContext.tsx index c62e8188..8fbdaba6 100644 --- a/src/contexts/I18nContext.tsx +++ b/src/contexts/I18nContext.tsx @@ -35,6 +35,13 @@ import zhCNLaunch from '@/i18n/locales/zh-CN/launch.json' import zhCNSettings from '@/i18n/locales/zh-CN/settings.json' import zhCNShortcuts from '@/i18n/locales/zh-CN/shortcuts.json' import zhCNTimeline from '@/i18n/locales/zh-CN/timeline.json' +import ptBRCommon from '@/i18n/locales/pt-BR/common.json' +import ptBRDialogs from '@/i18n/locales/pt-BR/dialogs.json' +import ptBREditor from '@/i18n/locales/pt-BR/editor.json' +import ptBRLaunch from '@/i18n/locales/pt-BR/launch.json' +import ptBRSettings from '@/i18n/locales/pt-BR/settings.json' +import ptBRShortcuts from '@/i18n/locales/pt-BR/shortcuts.json' +import ptBRTimeline from '@/i18n/locales/pt-BR/timeline.json' const LOCALE_STORAGE_KEY = 'recordly.locale' @@ -68,6 +75,15 @@ const messages: Record = { dialogs: zhCNDialogs, shortcuts: zhCNShortcuts, }, + 'pt-BR': { + common: ptBRCommon, + launch: ptBRLaunch, + editor: ptBREditor, + timeline: ptBRTimeline, + settings: ptBRSettings, + dialogs: ptBRDialogs, + shortcuts: ptBRShortcuts, + }, } as const interface I18nContextValue { diff --git a/src/i18n/config.ts b/src/i18n/config.ts index ce23fd41..df5456c9 100644 --- a/src/i18n/config.ts +++ b/src/i18n/config.ts @@ -1,6 +1,6 @@ export const DEFAULT_LOCALE = 'en' as const -export const SUPPORTED_LOCALES = ['en', 'es', 'zh-CN'] as const +export const SUPPORTED_LOCALES = ['en', 'es', 'zh-CN', 'pt-BR'] as const export const I18N_NAMESPACES = [ 'common', diff --git a/src/i18n/locales/pt-BR/common.json b/src/i18n/locales/pt-BR/common.json new file mode 100644 index 00000000..a3b1d036 --- /dev/null +++ b/src/i18n/locales/pt-BR/common.json @@ -0,0 +1,26 @@ +{ + "app": { + "name": "Recordly", + "editorTitle": "Editor Recordly", + "subtitle": "Gravação e edição de tela", + "language": "Idioma", + "manageRecordings": "Abrir pasta de gravações" + }, + "actions": { + "cancel": "Cancelar", + "close": "Fechar", + "export": "Exportar", + "load": "Carregar", + "redo": "Refazer", + "reset": "Redefinir", + "save": "Salvar", + "undo": "Desfazer", + "delete": "Excluir", + "done": "Concluído" + }, + "errors": { + "invalidFileType": "Tipo de arquivo inválido", + "failedToUploadImage": "Falha ao enviar imagem", + "fileReadError": "Ocorreu um erro ao ler o arquivo." + } +} diff --git a/src/i18n/locales/pt-BR/dialogs.json b/src/i18n/locales/pt-BR/dialogs.json new file mode 100644 index 00000000..bb90d8ef --- /dev/null +++ b/src/i18n/locales/pt-BR/dialogs.json @@ -0,0 +1,62 @@ +{ + "export": { + "pleaseTryAgain": "Por favor, tente novamente", + "compilingGifProgress": "Compilando GIF... {{progress}}%", + "compilingGifWait": "Compilando GIF... Isso pode demorar um pouco", + "takeMoment": "Isso pode demorar um momento...", + "exportFailed": "Exportação Falhou", + "compilingTitle": "Compilando GIF", + "exportingFormat": "Exportando {{format}}", + "exportComplete": "Exportação Concluída", + "formatReady": "Seu {{format}} está pronto", + "showInFolder": "Mostrar na Pasta", + "compiling": "Compilando", + "renderingFrames": "Renderizando Quadros", + "processing": "Processando...", + "status": "Status", + "format": "Formato", + "compilingStatus": "Compilando...", + "frames": "Quadros", + "cancelExport": "Cancelar Exportação", + "reopenSaveDialog": "Abrir Diálogo de Salvamento Novamente", + "savedSuccess": "{{format}} salvo com sucesso!" + }, + "addFont": { + "title": "Adicionar Fonte do Google", + "heading": "Adicionar Fonte do Google", + "description": "Adicione uma fonte personalizada do Google Fonts para usar em suas anotações.", + "urlLabel": "URL de Importação do Google Fonts", + "urlPlaceholder": "https://fonts.googleapis.com/css2?family=Roboto&display=swap", + "urlHelp": "Obtenha isso do Google Fonts: Selecione uma fonte -> Clique em \"Obter fonte\" -> Copie a URL de @import", + "nameLabel": "Nome de Exibição", + "namePlaceholder": "Minha Fonte Personalizada", + "nameHelp": "É assim que a fonte aparecerá no seletor de fontes", + "adding": "Adicionando...", + "addFont": "Adicionar Fonte", + "enterUrl": "Por favor, insira uma URL de importação do Google Fonts", + "invalidUrl": "Por favor, insira uma URL válida do Google Fonts", + "enterName": "Por favor, insira um nome de fonte", + "extractFailed": "Não foi possível extrair a família de fontes da URL", + "addSuccess": "Fonte \"{{name}}\" adicionada com sucesso", + "addFailed": "Falha ao adicionar fonte", + "loadTimeout": "A fonte demorou muito para carregar. Por favor, verifique a URL e tente novamente.", + "loadFailed": "A fonte não pode ser carregada. Por favor, verifique se a URL do Google Fonts está correta." + }, + "shortcutsConfig": { + "title": "Atalhos de Teclado", + "configurável": "Configurável", + "fixed": "Fixo", + "pressEscToCancel": "Pressione Esc para cancelar", + "clickToChange": "Clique para alterar", + "pressAKey": "Pressione uma tecla...", + "alreadyUsedBy": "Já usado por {{action}}", + "swap": "Trocar", + "reserved": "Este atalho está reservado para \"{{label}}\" e não pode ser reatribuído.", + "saved": "Atalhos de teclado salvos", + "resetNotice": "Redefinir para atalhos padrão -- clique em Salvar para aplicar", + "instructions": "Clique em um atalho e pressione a nova combinação de teclas. Pressione Esc para cancelar.", + "resetToDefaults": "Redefinir para padrão", + "cancel": "Cancelar", + "save": "Salvar" + } +} diff --git a/src/i18n/locales/pt-BR/editor.json b/src/i18n/locales/pt-BR/editor.json new file mode 100644 index 00000000..ec053d80 --- /dev/null +++ b/src/i18n/locales/pt-BR/editor.json @@ -0,0 +1,118 @@ +{ + "playback": { + "play": "Reproduzir", + "pause": "Pausar" + }, + "annotations": { + "settings": "Configurações de Anotação", + "active": "Ativo", + "text": "Texto", + "image": "Imagem", + "arrow": "Seta", + "textContent": "Conteúdo do Texto", + "textPlaceholder": "Digite seu texto...", + "fontStyle": "Estilo da Fonte", + "selectStyle": "Selecionar estilo", + "size": "Tamanho", + "toggleBold": "Alternar negrito", + "toggleItalic": "Alternar itálico", + "toggleUnderline": "Alternar sublinhado", + "alignLeft": "Alinhar à esquerda", + "alignCenter": "Centralizar", + "alignRight": "Alinhar à direita", + "textColor": "Cor do Texto", + "background": "Plano de Fundo", + "none": "Nenhum", + "clearBackground": "Limpar Plano de Fundo", + "uploadImage": "Enviar Imagem", + "supportedFormats": "Formatos suportados: JPG, PNG, GIF, WebP", + "arrowDirection": "Direção da Seta", + "strokeWidth": "Largura do Traço: {{width}}px", + "arrowColor": "Cor da Seta", + "deleteAnnotation": "Excluir Anotação", + "shortcutsAndTips": "Atalhos e Dicas", + "tipSelectAnnotation": "Mova a cabeça de reprodução para a seção sobreposta da anotação e selecione um item.", + "tipCycleForward": "Use Tab para navegar pelos itens sobrepostos.", + "tipCycleBackward": "Use Shift+Tab para navegar para trás.", + "imageUploadSuccess": "Imagem enviada com sucesso!", + "imageUploadError": "Por favor, envie um arquivo de imagem JPG, PNG, GIF ou WebP." + }, + "fontStyles": { + "classic": "Clássico", + "editor": "Editor", + "strong": "Forte", + "typewriter": "Máquina de Escrever", + "deco": "Deco", + "simple": "Simples", + "modern": "Moderno", + "clean": "Limpo" + }, + "format": { + "mp4Video": "Vídeo MP4", + "mp4Description": "Arquivo de vídeo de alta qualidade", + "gifAnimation": "Animação GIF", + "gifDescription": "Imagem animada para compartilhar" + }, + "gifOptions": { + "frameRate": "Taxa de Quadros", + "outputSize": "Tamanho de Saída", + "outputDimensions": "Saída: {{width}} x {{height}}px", + "loopAnimation": "Animação em Loop", + "loopDescription": "O GIF será reproduzido continuamente" + }, + "tutorial": { + "howTrimmingWorks": "Como o corte funciona", + "title": "Como o Corte Funciona", + "understanding": "Entendendo como cortar partes indesejadas do seu vídeo.", + "descriptionP1": "A ferramenta de Corte funciona definindo os segmentos que você deseja", + "descriptionRemove": "remover", + "descriptionP2": "do seu vídeo.", + "descriptionP3": "Qualquer parte da linha do tempo coberta por um segmento de Corte vermelho será removida quando você exportar.", + "visualExample": "Exemplo Visual", + "removed": "REMOVIDO", + "kept": "Mantido", + "finalVideo": "Vídeo Final", + "part": "Parte {{number}}", + "addTrimStep": "1. Adicionar Corte", + "addTrimDesc": "Pressione T ou clique no ícone de tesoura para marcar uma seção para remoção.", + "adjustStep": "2. Ajustar", + "adjustDesc": "Arraste as bordas da região vermelha para cobrir exatamente o que deseja cortar." + }, + "feedback": { + "trigger": "Feedback", + "title": "Feedback e contato", + "description": "Entre em contato diretamente ou abra uma issue se algo estiver quebrado ou faltando.", + "emailLabel": "E-mail", + "xLabel": "X", + "reportIssue": "Reportar problema / enviar feedback", + "openFailed": "Falha ao abrir link." + }, + "keyboardShortcuts": { + "trigger": "Atalhos", + "title": "Atalhos de Teclado", + "description": "Referência rápida para os controles da linha do tempo e editor.", + "customizeTooltip": "Personalizar atalhos", + "customize": "Personalizar", + "panTimeline": "Mover Linha do Tempo", + "zoomTimeline": "Ampliar Linha do Tempo", + "cycleAnnotations": "Navegar Anotações", + "tab": "Tab" + }, + "actions": { + "saveAgain": "Salvar Novamente", + "showInFolder": "Mostrar na Pasta" + }, + "project": { + "untitled": "Sem título" + }, + "exportStatus": { + "exporting": "Exportando", + "renderingFile": "Renderizando seu arquivo.", + "preparing": "Preparando exportação...", + "completePercent": "{{percent}}% concluído", + "issue": "Problema na exportação", + "complete": "Exportação concluída", + "savedSuccessfully": "Seu arquivo foi salvo com sucesso." + }, + "openRecordingsFolder": "Abrir pasta de gravações" +} diff --git a/src/i18n/locales/pt-BR/launch.json b/src/i18n/locales/pt-BR/launch.json new file mode 100644 index 00000000..fb8ab7b8 --- /dev/null +++ b/src/i18n/locales/pt-BR/launch.json @@ -0,0 +1,72 @@ +{ + "recording": { + "disableSystemAudio": "Desativar áudio do sistema", + "enableSystemAudio": "Ativar áudio do sistema", + "disableMicrophone": "Desativar microfone", + "enableMicrophone": "Ativar microfone", + "disableWebcam": "Desativar sobreposição de webcam", + "enableWebcam": "Ativar sobreposição de webcam", + "countdownDelay": "Atraso de contagem", + "noDelay": "Sem atraso", + "record": "Gravar", + "recordingsFolder": "Pasta de Gravações: {{path}}", + "chooseRecordingsFolder": "Escolher pasta de gravações", + "folderPath": "Caminho: /{{name}}/", + "openVideoFile": "Abrir arquivo de vídeo", + "openProject": "Abrir projeto", + "hideHudFromVideo": "Ocultar HUD da gravação", + "showHudInVideo": "Mostrar HUD na gravação", + "hideHud": "Ocultar HUD", + "closeApp": "Fechar App", + "screens": "Telas", + "windows": "Janelas", + "noSourcesFound": "Nenhuma fonte encontrada", + "microphone": "Microfone", + "turnOffMicrophone": "Desligar Microfone", + "selectMicToEnable": "Selecione um microfone para ativar", + "noMicrophonesFound": "Nenhum microfone encontrado", + "webcam": "Webcam", + "turnOffWebcam": "Desligar Webcam", + "selectWebcamToEnable": "Selecione uma webcam para ativar", + "noWebcamsFound": "Nenhuma webcam encontrada", + "language": "Idioma", + "paused": "PAUSADO", + "rec": "GRAV", + "resume": "Continuar", + "pause": "Pausar", + "stop": "Parar", + "cancel": "Cancelar", + "more": "Mais", + "update": { + "update": "Atualizar", + "updated": "Atualizado", + "idleTitle": "Verificar atualizações.", + "checkingTitle": "Verificando atualizações...", + "downloadingTitle": "Baixando atualização...", + "errorTitle": "Falha ao verificar atualizações. Clique para tentar novamente.", + "upToDateTitle": "Recordly {{version}} está atualizado.", + "availableTitle": "Recordly {{version}} está disponível.", + "availableGenericTitle": "Uma atualização está disponível." + } + }, + "sourceSelector": { + "loadingSources": "Carregando fontes...", + "screens": "Telas", + "windows": "Janelas", + "windowsNote": "Apenas janelas visíveis (não minimizadas) podem ser gravadas.", + "windowPlaceholder": "Janela", + "cancel": "Cancelar", + "share": "Compartilhar" + }, + "permissions": { + "screenRecordingNeeded": "O Recordly precisa de permissão de Gravação de Tela antes de começar. As Configurações do Sistema foram abertas. Após habilitar, feche e reabra o Recordly.", + "screenRecordingMissing": "A permissão de Gravação de Tela ainda está faltando. As Configurações do Sistema foram abertas novamente. Habilite, depois feche e reabra o Recordly antes de gravar.", + "accessibilityNeeded": "O Recordly também precisa de permissão de Acessibilidade para rastrear o cursor. As Configurações do Sistema foram abertas. Após habilitar, feche e reabra o Recordly.", + "accessibilityMissing": "A permissão de Acessibilidade ainda está faltando. As Configurações do Sistema foram abertas novamente. Habilite, depois feche e reabra o Recordly antes de gravar.", + "selectSource": "Por favor, selecione uma fonte para gravar", + "systemAudioUnavailable": "Áudio do sistema não está disponível para esta fonte. A gravação continuará sem áudio do sistema.", + "microphoneDenied": "Acesso ao microfone foi negado. A gravação continuará sem áudio do microfone.", + "failedToStart": "Falha ao iniciar gravação: {{error}}", + "failedToStartGeneric": "Falha ao iniciar gravação" + } +} diff --git a/src/i18n/locales/pt-BR/settings.json b/src/i18n/locales/pt-BR/settings.json new file mode 100644 index 00000000..f848772d --- /dev/null +++ b/src/i18n/locales/pt-BR/settings.json @@ -0,0 +1,160 @@ +{ + "zoom": { + "level": "Nível de Zoom", + "selectRegion": "Selecione uma região de zoom para ajustar", + "deleteZoom": "Excluir Zoom" + }, + "trim": { + "deleteRegion": "Excluir Região de Trim" + }, + "speed": { + "playbackSpeed": "Velocidade de Reprodução", + "selectRegion": "Selecione uma região de velocidade para ajustar", + "deleteRegion": "Excluir Região de Velocidade" + }, + "effects": { + "title": "Efeitos de Vídeo", + "show": "Mostrar", + "showCursor": "Mostrar Cursor", + "loopCursor": "Cursor em loop", + "cursorStyle": "Estilo do Cursor", + "cursorStyleOptions": { + "tahoe": "Tahoe", + "dot": "Ponto", + "figma": "Minimal", + "mono": "Invertido", + "lavender": "Lavanda", + "parched": "Seco", + "chooper": "Chooper", + "amongus": "Among Us", + "turtle": "Tartaruga" + }, + "backgroundBlur": "Desfoque de Fundo", + "zoomMotionBlur": "Desfoque de Movimento no Zoom", + "connect Zooms": "Conectar Zooms", + "zoomGeneralTitle": "Geral", + "zoomGeneralDescription": "Configurações globais de movimento para cada transição de zoom.", + "zoomInTitle": "Zoom In", + "zoomInDescription": "Controle como a câmera entra em uma região de zoom.", + "zoomOutTitle": "Zoom Out", + "zoomOutDescription": "Controle como a câmera sai de uma região de zoom.", + "connectedZoomTitle": "Entre Zooms", + "connectedZoomDescription": "Ajuste o deslize entre regiões de zoom consecutivas quando a conexão está habilitada.", + "zoomInDuration": "Duração do Zoom In", + "zoomInOverlap": "Sobreposição do Zoom In", + "zoomOutDuration": "Duração do Zoom Out", + "zoomInEasing": "Curva do Zoom In", + "zoomOutEasing": "Curva do Zoom Out", + "connectedZoomGap": "Gap do Zoom Conectado", + "connectedZoomDuration": "Duração do Zoom Conectado", + "connectedZoomEasing": "Curva do Pan Conectado", + "zoomEasingOptions": { + "recordly": "Recordly", + "glide": "Deslize", + "smooth": "Suave", + "snappy": "Rápido", + "linear": "Linear" + }, + "cursorSize": "Tamanho do Cursor", + "cursorSmoothing": "Suavização do Cursor", + "off": "Desligado", + "cursorMotionBlur": "Desfoque de Movimento do Cursor", + "cursorClickBounce": "Pulo do Cursor no Clique", + "cursorClickBounceDuration": "Velocidade do Pulo", + "cursorSway": "Oscilação do Cursor", + "webcam": "Sobreposicao de Webcam", + "webcamFootage": "Gravacao de Webcam", + "webcamFootageDescription": "Nenhuma gravação de webcam vinculada a este vídeo", + "uploadWebcamFootage": "Enviar gravação", + "replaceWebcamFootage": "Substituir gravação", + "removeWebcamFootage": "Remover gravação", + "webcamFootageAdded": "Gravação de webcam vinculada", + "webcamFootageRemoved": "Gravação de webcam removida", + "webcamSize": "Tamanho da Webcam", + "webcamReactToZoom": "Webcam Reage ao Zoom", + "webcamRoundness": "Arredondamento da Webcam", + "webcamShadow": "Sombra da Webcam", + "shadow": "Sombra", + "radius": "Raio", + "roundness": "Arredondamento", + "padding": "Espaçamento", + "removeBackground": "Remover fundo" + }, + "sections": { + "scene": "Cena", + "captions": "Legendas", + "zoom": "Zoom", + "cursor": "Cursor", + "webcam": "Webcam", + "frame": "Quadro", + "crop": "Cortar" + }, + "captions": { + "enabled": "Mostrar", + "language": "Idioma", + "downloading": "Baixando...", + "deleteModel": "Excluir Modelo", + "clearModel": "Limpar Modelo", + "downloadModel": "Baixar Modelo", + "generating": "Gerando...", + "generateFull": "Gerar Legendas", + "regenerateFull": "Regerar Legendas", + "clearFull": "Limpar Legendas", + "fontSettings": "Configurações de Fonte", + "defaultFont": "Padrão", + "fontFamily": "Fonte", + "fontSize": "Tamanho da Fonte", + "rowCount": "Linhas", + "animation": "Animação", + "animationOff": "Desligado", + "animationFade": "Fade", + "animationRise": "Rise", + "animationPop": "Pop", + "bottomOffset": "Offset Inferior", + "maxWidth": "Largura Máxima", + "boxRadius": "Raio da Caixa", + "backgroundOpacity": "Opacidade do Fundo", + "textColor": "Cor do Texto" + }, + "crop": { + "title": "Cortar Vídeo", + "instruction": "Arraste em cada lado para ajustar a área de corte", + "top": "Superior", + "bottom": "Inferior", + "left": "Esquerda", + "right": "Direita", + "openEditor": "Abrir Editor de Corte" + }, + "background": { + "title": "Fundo", + "image": "Imagem", + "color": "Cor", + "gradient": "Gradiente", + "wallpaperPreview": "Visualização do papel de parede", + "uploadCustom": "Enviar Personalizado", + "uploadSuccess": "Imagem personalizada enviada com sucesso!", + "uploadError": "Por favor, envie um arquivo de imagem JPG ou JPEG.", + "uploadErrorDescription": "Apenas imagens JPG e JPEG são suportadas." + }, + "export": { + "title": "Exportar", + "mp4": "MP4", + "gif": "GIF", + "quality": { + "low": "Baixa", + "medium": "Média", + "high": "Alta", + "original": "Original" + }, + "loop": "Loop", + "outputDimensions": "Saída: {{dimensions}}px", + "sizePresetOriginalShort": "Orig", + "sizePresetMediumShort": "Med", + "sizePresetLargeShort": "Lar", + "loadProject": "Carregar Projeto", + "saveProject": "Salvar Projeto", + "exportVideo": "Exportar {{format}}", + "reportBug": "Reportar Bug", + "starOnGithub": "Star no GitHub" + } +} diff --git a/src/i18n/locales/pt-BR/shortcuts.json b/src/i18n/locales/pt-BR/shortcuts.json new file mode 100644 index 00000000..f5fc5d7c --- /dev/null +++ b/src/i18n/locales/pt-BR/shortcuts.json @@ -0,0 +1,16 @@ +{ + "actions": { + "addZoom": "Adicionar Zoom", + "addTrim": "Adicionar Trim", + "addSpeed": "Adicionar Velocidade", + "addAnnotation": "Adicionar Anotação", + "addKeyframe": "Adicionar Keyframe", + "deleteSelected": "Excluir Selecionado", + "playPause": "Reproduzir / Pausar", + "cycleForward": "Navegar Anotações para Frente", + "cycleBackward": "Navegar Anotações para Tras", + "deleteSelectedAlt": "Excluir Selecionado (alt)", + "panTimeline": "Mover Linha do Tempo", + "zoomTimeline": "Ampliar Linha do Tempo" + } +} diff --git a/src/i18n/locales/pt-BR/timeline.json b/src/i18n/locales/pt-BR/timeline.json new file mode 100644 index 00000000..12ad788d --- /dev/null +++ b/src/i18n/locales/pt-BR/timeline.json @@ -0,0 +1,38 @@ +{ + "zoom": { + "cannotPlace": "Não é possível colocar zoom aqui", + "existsOrNoSpace": "Zoom já existe neste local ou espaço insuficiente disponível.", + "suggestHandlerUnavailable": "Manipulador de sugestão de zoom indisponível", + "noTelemetry": "Sem telemetria de cursor disponível", + "recordFirst": "Grave uma screencast primeiro para gerar sugestões baseadas em cursor.", + "noUsableTelemetry": "Sem telemetria de cursor utilizável", + "notEnoughMovement": "A gravação não inclui dados suficientes de movimento do cursor.", + "noInteractionMoments": "Nenhum momento de interação claro encontrado", + "tryRecording": "Tente uma gravação com pausas ou cliques em torno de ações importantes.", + "noAutoZoomSlots": "Nenhum slot de auto-zoom disponível", + "dwellPointsOverlap": "Pontos de permanência detectados se sobrepõem a regiões de zoom existentes.", + "addedSuggestions": "Adicionadas {{count}} sugestão(ões) de zoom baseada(s) em interação", + "label": "Zoom {{index}}", + "addZoom": "Adicionar Zoom (Z)", + "suggestZooms": "Sugerir Zooms do Cursor" + }, + "trim": { + "cannotPlace": "Não é possível colocar trim aqui", + "existsOrNoSpace": "Trim já existe neste local ou espaço insuficiente disponível.", + "label": "Trim {{index}}", + "addTrim": "Adicionar Trim (T)" + }, + "speed": { + "cannotPlace": "Não é possível colocar velocidade aqui", + "existsOrNoSpace": "Região de velocidade já existe neste local ou espaço insuficiente disponível.", + "label": "Velocidade" + }, + "annotation": { + "label": "Anotação", + "image": "Imagem", + "addAnnotation": "Adicionar Anotação (A)" + }, + "addSpeed": "Adicionar Velocidade (S)", + "resizeLeft": "Redimensionar esquerda", + "resizeRight": "Redimensionar direita" +}