From 14dd72a2d99d33d8dd1d4142c62d6c8806a9c30b Mon Sep 17 00:00:00 2001 From: Gustavo Date: Fri, 3 Apr 2026 16:08:19 -0300 Subject: [PATCH 1/6] feat(i18n): add pt-BR Portuguese (Brazil) locale support --- src/contexts/I18nContext.tsx | 16 +++ src/i18n/config.ts | 2 +- src/i18n/locales/pt-BR/common.json | 26 +++++ src/i18n/locales/pt-BR/dialogs.json | 62 ++++++++++ src/i18n/locales/pt-BR/editor.json | 118 +++++++++++++++++++ src/i18n/locales/pt-BR/launch.json | 73 ++++++++++++ src/i18n/locales/pt-BR/settings.json | 160 ++++++++++++++++++++++++++ src/i18n/locales/pt-BR/shortcuts.json | 16 +++ src/i18n/locales/pt-BR/timeline.json | 38 ++++++ 9 files changed, 510 insertions(+), 1 deletion(-) create mode 100644 src/i18n/locales/pt-BR/common.json create mode 100644 src/i18n/locales/pt-BR/dialogs.json create mode 100644 src/i18n/locales/pt-BR/editor.json create mode 100644 src/i18n/locales/pt-BR/launch.json create mode 100644 src/i18n/locales/pt-BR/settings.json create mode 100644 src/i18n/locales/pt-BR/shortcuts.json create mode 100644 src/i18n/locales/pt-BR/timeline.json 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..5ff194ab --- /dev/null +++ b/src/i18n/locales/pt-BR/common.json @@ -0,0 +1,26 @@ +{ + "app": { + "name": "Recordly", + "editorTitle": "Editor Recordly", + "subtitle": "Gravacao e edicao de tela", + "language": "Idioma", + "manageRecordings": "Abrir pasta de gravacoes" + }, + "actions": { + "cancel": "Cancelar", + "close": "Fechar", + "export": "Exportar", + "load": "Carregar", + "redo": "Refazer", + "reset": "Redefinir", + "save": "Salvar", + "undo": "Desfazer", + "delete": "Excluir", + "done": "Concluido" + }, + "errors": { + "invalidFileType": "Tipo de arquivo invalido", + "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..bf76d63d --- /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": "Exportacao Falhou", + "compilingTitle": "Compilando GIF", + "exportingFormat": "Exportando {{format}}", + "exportComplete": "Exportacao Concluida", + "formatReady": "Seu {{format}} esta pronto", + "showInFolder": "Mostrar na Pasta", + "compiling": "Compilando", + "renderingFrames": "Renderizando Quadros", + "processing": "Processando...", + "status": "Status", + "format": "Formato", + "compilingStatus": "Compilando...", + "frames": "Quadros", + "cancelExport": "Cancelar Exportacao", + "reopenSaveDialog": "Abrir Dialogo 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 anotacoes.", + "urlLabel": "URL de Importacao 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 Exibicao", + "namePlaceholder": "Minha Fonte Personalizada", + "nameHelp": "E assim que a fonte aparecera no seletor de fontes", + "adding": "Adicionando...", + "addFont": "Adicionar Fonte", + "enterUrl": "Por favor, insira uma URL de importacao do Google Fonts", + "invalidUrl": "Por favor, insira uma URL valida do Google Fonts", + "enterName": "Por favor, insira um nome de fonte", + "extractFailed": "Nao foi possivel extrair a familia 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 nao pode ser carregada. Por favor, verifique se a URL do Google Fonts esta correta." + }, + "shortcutsConfig": { + "title": "Atalhos de Teclado", + "configurable": "Configuravel", + "fixed": "Fixo", + "pressEscToCancel": "Pressione Esc para cancelar", + "clickToChange": "Clique para alterar", + "pressAKey": "Pressione uma tecla...", + "alreadyUsedBy": "Ja usado por {{action}}", + "swap": "Trocar", + "reserved": "Este atalho esta reservado para \"{{label}}\" e nao pode ser reatribuido.", + "saved": "Atalhos de teclado salvos", + "resetNotice": "Redefinir para atalhos padrao -- clique em Salvar para aplicar", + "instructions": "Clique em um atalho e pressione a nova combinacao de teclas. Pressione Esc para cancelar.", + "resetToDefaults": "Redefinir para padrao", + "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..46d5139d --- /dev/null +++ b/src/i18n/locales/pt-BR/editor.json @@ -0,0 +1,118 @@ +{ + "playback": { + "play": "Reproduzir", + "pause": "Pausar" + }, + "annotations": { + "settings": "Configuracoes de Anotacao", + "active": "Ativo", + "text": "Texto", + "image": "Imagem", + "arrow": "Seta", + "textContent": "Conteudo do Texto", + "textPlaceholder": "Digite seu texto...", + "fontStyle": "Estilo da Fonte", + "selectStyle": "Selecionar estilo", + "size": "Tamanho", + "toggleBold": "Alternar negrito", + "toggleItalic": "Alternar italico", + "toggleUnderline": "Alternar sublinhado", + "alignLeft": "Alinhar a esquerda", + "alignCenter": "Centralizar", + "alignRight": "Alinhar a 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": "Direcao da Seta", + "strokeWidth": "Largura do Trace: {{width}}px", + "arrowColor": "Cor da Seta", + "deleteAnnotation": "Excluir Anotacao", + "shortcutsAndTips": "Atalhos e Dicas", + "tipSelectAnnotation": "Mova a cabeca de reproducao para a secao sobreposta da anotacao e selecione um item.", + "tipCycleForward": "Use Tab para navegar pelos itens sobrepostos.", + "tipCycleBackward": "Use Shift+Tab para navegar para tras.", + "imageUploadSuccess": "Imagem enviada com sucesso!", + "imageUploadError": "Por favor, envie um arquivo de imagem JPG, PNG, GIF ou WebP." + }, + "fontStyles": { + "classic": "Classico", + "editor": "Editor", + "strong": "Forte", + "typewriter": "Maquina de Escrever", + "deco": "Deco", + "simple": "Simples", + "modern": "Moderno", + "clean": "Limpo" + }, + "format": { + "mp4Video": "Video MP4", + "mp4Description": "Arquivo de video de alta qualidade", + "gifAnimation": "Animacao GIF", + "gifDescription": "Imagem animada para compartilhar" + }, + "gifOptions": { + "frameRate": "Taxa de Quadros", + "outputSize": "Tamanho de Saida", + "outputDimensions": "Saida: {{width}} x {{height}}px", + "loopAnimation": "Animacao em Loop", + "loopDescription": "O GIF sera reproduzido continuamente" + }, + "tutorial": { + "howTrimmingWorks": "Como o corte funciona", + "title": "Como o Corte Funciona", + "understanding": "Entendendo como cortar partes indesejadas do seu video.", + "descriptionP1": "A ferramenta de Corte funciona definindo os segmentos que voce deseja", + "descriptionRemove": "remover", + "descriptionP2": "do seu video.", + "descriptionP3": "Qualquer parte da linha do tempo coberta por um segmento de Corte vermelho sera removida quando voce exportar.", + "visualExample": "Exemplo Visual", + "removed": "REMOVIDO", + "kept": "Mantido", + "finalVideo": "Video Final", + "part": "Parte {{number}}", + "addTrimStep": "1. Adicionar Corte", + "addTrimDesc": "Pressione T ou clique no icone de tesoura para marcar uma secao para remocao.", + "adjustStep": "2. Ajustar", + "adjustDesc": "Arraste as bordas da regiao 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": "Referencia rapida 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 Anotacoes", + "tab": "Tab" + }, + "actions": { + "saveAgain": "Salvar Novamente", + "showInFolder": "Mostrar na Pasta" + }, + "project": { + "untitled": "Sem titulo" + }, + "exportStatus": { + "exporting": "Exportando", + "renderingFile": "Renderizando seu arquivo.", + "preparing": "Preparando exportacao...", + "completePercent": "{{percent}}% concluido", + "issue": "Problema na exportacao", + "complete": "Exportacao concluida", + "savedSuccessfully": "Seu arquivo foi salvo com sucesso." + }, + "openRecordingsFolder": "Abrir pasta de gravacoes" +} diff --git a/src/i18n/locales/pt-BR/launch.json b/src/i18n/locales/pt-BR/launch.json new file mode 100644 index 00000000..8b025d87 --- /dev/null +++ b/src/i18n/locales/pt-BR/launch.json @@ -0,0 +1,73 @@ +{ + "recording": { + "disableSystemAudio": "Desativar audio do sistema", + "enableSystemAudio": "Ativar audio do sistema", + "disableMicrophone": "Desativar microfone", + "enableMicrophone": "Ativar microfone", + "disableWebcam": "Desativar sobreposicao de webcam", + "enableWebcam": "Ativar sobreposicao de webcam", + "countdownDelay": "Atraso de contagem", + "noDelay": "Sem atraso", + "record": "Gravar", + "recordingFolder": "Pasta de Gravacoes: {{path}}", + "chooseRecordingsFolder": "Escolher pasta de gravacoes", + "folderPath": "Caminho: /{{name}}/", + "openVideoFile": "Abrir arquivo de video", + "openProject": "Abrir projeto", + "hideHudFromVideo": "Ocultar HUD da gravacao", + "showHudInVideo": "Mostrar HUD na gravacao", + "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", + "recordingsFolder": "Pasta de Gravacoes", + "language": "Idioma", + "paused": "PAUSADO", + "rec": "GRAV", + "resume": "Continuar", + "pause": "Pausar", + "stop": "Parar", + "cancel": "Cancelar", + "more": "Mais", + "update": { + "update": "Atualizar", + "updated": "Atualizado", + "idleTitle": "Verificar atualizacoes.", + "checkingTitle": "Verificando atualizacoes...", + "downloadingTitle": "Baixando atualizacao...", + "errorTitle": "Falha ao verificar atualizacoes. Clique para tentar novamente.", + "upToDateTitle": "Recordly {{version}} esta atualizado.", + "availableTitle": "Recordly {{version}} esta disponivel.", + "availableGenericTitle": "Uma atualizacao esta disponivel." + } + }, + "sourceSelector": { + "loadingSources": "Carregando fontes...", + "screens": "Telas", + "windows": "Janelas", + "windowsNote": "Apenas janelas visiveis (nao minimizadas) podem ser gravadas.", + "windowPlaceholder": "Janela", + "cancel": "Cancelar", + "share": "Compartilhar" + }, + "permissions": { + "screenRecordingNeeded": "O Recordly precisa de permissao de Gravacao de Tela antes de comecar. As Configuracoes do Sistema foram abertas. Apos habilitar, feche e reabra o Recordly.", + "screenRecordingMissing": "A permissao de Gravacao de Tela ainda esta faltando. As Configuracoes do Sistema foram abertas novamente. Habilite, depois feche e reabra o Recordly antes de gravar.", + "accessibilityNeeded": "O Recordly tambem precisa de permissao de Acessibilidade para rastrear o cursor. As Configuracoes do Sistema foram abertas. Apos habilitar, feche e reabra o Recordly.", + "accessibilityMissing": "A permissao de Acessibilidade ainda esta faltando. As Configuracoes do Sistema foram abertas novamente. Habilite, depois feche e reabra o Recordly antes de gravar.", + "selectSource": "Por favor, selecione uma fonte para gravar", + "systemAudioUnavailable": "Audio do sistema nao esta disponivel para esta fonte. A gravacao continuara sem audio do sistema.", + "microphoneDenied": "Acesso ao microfone foi negado. A gravacao continuara sem audio do microfone.", + "failedToStart": "Falha ao iniciar gravacao: {{error}}", + "failedToStartGeneric": "Falha ao iniciar gravacao" + } +} diff --git a/src/i18n/locales/pt-BR/settings.json b/src/i18n/locales/pt-BR/settings.json new file mode 100644 index 00000000..b9d0d719 --- /dev/null +++ b/src/i18n/locales/pt-BR/settings.json @@ -0,0 +1,160 @@ +{ + "zoom": { + "level": "Nivel de Zoom", + "selectRegion": "Selecione uma regiao de zoom para ajustar", + "deleteZoom": "Excluir Zoom" + }, + "trim": { + "deleteRegion": "Excluir Regiao de Trim" + }, + "speed": { + "playbackSpeed": "Velocidade de Reproducao", + "selectRegion": "Selecione uma regiao de velocidade para ajustar", + "deleteRegion": "Excluir Regiao de Velocidade" + }, + "effects": { + "title": "Efeitos de Video", + "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": "Configuracoes globais de movimento para cada transicao de zoom.", + "zoomInTitle": "Zoom In", + "zoomInDescription": "Controle como a camera entra em uma regiao de zoom.", + "zoomOutTitle": "Zoom Out", + "zoomOutDescription": "Controle como a camera sai de uma regiao de zoom.", + "connectedZoomTitle": "Entre Zooms", + "connectedZoomDescription": "Ajuste o deslize entre regioes de zoom consecutivas quando a conexao esta habilitada.", + "zoomInDuration": "Duracao do Zoom In", + "zoomInOverlap": "Sobreposicao do Zoom In", + "zoomOutDuration": "Duracao do Zoom Out", + "zoomInEasing": "Curva do Zoom In", + "zoomOutEasing": "Curva do Zoom Out", + "connectedZoomGap": "Gap do Zoom Conectado", + "connectedZoomDuration": "Duracao do Zoom Conectado", + "connectedZoomEasing": "Curva do Pan Conectado", + "zoomEasingOptions": { + "recordly": "Recordly", + "glide": "Deslize", + "smooth": "Suave", + "snappy": "Rapido", + "linear": "Linear" + }, + "cursorSize": "Tamanho do Cursor", + "cursorSmoothing": "Suavizacao do Cursor", + "off": "Desligado", + "cursorMotionBlur": "Desfoque de Movimento do Cursor", + "cursorClickBounce": "Pulo do Cursor no Clique", + "cursorClickBounceDuration": "Velocidade do Pulo", + "cursorSway": "Oscilacao do Cursor", + "webcam": "Sobreposicao de Webcam", + "webcamFootage": "Gravacao de Webcam", + "webcamFootageDescription": "Nenhuma gravacao de webcam vinculada a este video", + "uploadWebcamFootage": "Enviar gravacao", + "replaceWebcamFootage": "Substituir gravacao", + "removeWebcamFootage": "Remover gravacao", + "webcamFootageAdded": "Gravacao de webcam vinculada", + "webcamFootageRemoved": "Gravacao 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": "Espacamento", + "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": "Configuracoes de Fonte", + "defaultFont": "Padrao", + "fontFamily": "Fonte", + "fontSize": "Tamanho da Fonte", + "rowCount": "Linhas", + "animation": "Animacao", + "animationOff": "Desligado", + "animationFade": "Fade", + "animationRise": "Rise", + "animationPop": "Pop", + "bottomOffset": "Offset Inferior", + "maxWidth": "Largura Maxima", + "boxRadius": "Raio da Caixa", + "backgroundOpacity": "Opacidade do Fundo", + "textColor": "Cor do Texto" + }, + "crop": { + "title": "Cortar Video", + "instruction": "Arraste em cada lado para ajustar a area 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": "Visualizacao 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 sao suportadas." + }, + "export": { + "title": "Exportar", + "mp4": "MP4", + "gif": "GIF", + "quality": { + "low": "Baixa", + "medium": "Media", + "high": "Alta", + "original": "Original" + }, + "loop": "Loop", + "outputDimensions": "Saida: {{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..930ac221 --- /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 Anotacao", + "addKeyframe": "Adicionar Keyframe", + "deleteSelected": "Excluir Selecionado", + "playPause": "Reproduzir / Pausar", + "cycleForward": "Navegar Anotacoes para Frente", + "cycleBackward": "Navegar Anotacoes 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..fce5c4dd --- /dev/null +++ b/src/i18n/locales/pt-BR/timeline.json @@ -0,0 +1,38 @@ +{ + "zoom": { + "cannotPlace": "Nao e possivel colocar zoom aqui", + "existsOrNoSpace": "Zoom ja existe neste local ou espaco insuficiente disponivel.", + "suggestHandlerUnavailable": "Manipulador de sugestao de zoom indisponivel", + "noTelemetry": "Sem telemetria de cursor disponivel", + "recordFirst": "Grave uma screencast primeiro para gerar sugestoes baseadas em cursor.", + "noUsableTelemetry": "Sem telemetria de cursor utilizavel", + "notEnoughMovement": "A gravacao nao inclui dados suficientes de movimento do cursor.", + "noInteractionMoments": "Nenhum momento de interacao claro encontrado", + "tryRecording": "Tente uma gravacao com pausas ou cliques em torno de acoes importantes.", + "noAutoZoomSlots": "Nenhum slot de auto-zoom disponivel", + "dwellPointsOverlap": "Pontos de permanencia detectados se sobrepoem a regioes de zoom existentes.", + "addedSuggestions": "Adicionadas {{count}} sugestao(oes) de zoom baseada(s) em interacao", + "label": "Zoom {{index}}", + "addZoom": "Adicionar Zoom (Z)", + "suggestZooms": "Sugerir Zooms do Cursor" + }, + "trim": { + "cannotPlace": "Nao e possivel colocar trim aqui", + "existsOrNoSpace": "Trim ja existe neste local ou espaco insuficiente disponivel.", + "label": "Trim {{index}}", + "addTrim": "Adicionar Trim (T)" + }, + "speed": { + "cannotPlace": "Nao e possivel colocar velocidade aqui", + "existsOrNoSpace": "Regiao de velocidade ja existe neste local ou espaco insuficiente disponivel.", + "label": "Velocidade" + }, + "annotation": { + "label": "Anotacao", + "image": "Imagem", + "addAnnotation": "Adicionar Anotacao (A)" + }, + "addSpeed": "Adicionar Velocidade (S)", + "resizeLeft": "Redimensionar esquerda", + "resizeRight": "Redimensionar direita" +} From 1b52b4ed83215a3551d02d412f2754613abf6576 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Fri, 3 Apr 2026 16:20:14 -0300 Subject: [PATCH 2/6] Fix pt-BR translation accents and typos --- src/i18n/locales/pt-BR/common.json | 8 ++-- src/i18n/locales/pt-BR/dialogs.json | 18 ++++----- src/i18n/locales/pt-BR/editor.json | 54 ++++++++++++------------- src/i18n/locales/pt-BR/launch.json | 51 ++++++++++++----------- src/i18n/locales/pt-BR/settings.json | 58 +++++++++++++-------------- src/i18n/locales/pt-BR/shortcuts.json | 6 +-- src/i18n/locales/pt-BR/timeline.json | 32 +++++++-------- 7 files changed, 113 insertions(+), 114 deletions(-) diff --git a/src/i18n/locales/pt-BR/common.json b/src/i18n/locales/pt-BR/common.json index 5ff194ab..a3b1d036 100644 --- a/src/i18n/locales/pt-BR/common.json +++ b/src/i18n/locales/pt-BR/common.json @@ -2,9 +2,9 @@ "app": { "name": "Recordly", "editorTitle": "Editor Recordly", - "subtitle": "Gravacao e edicao de tela", + "subtitle": "Gravação e edição de tela", "language": "Idioma", - "manageRecordings": "Abrir pasta de gravacoes" + "manageRecordings": "Abrir pasta de gravações" }, "actions": { "cancel": "Cancelar", @@ -16,10 +16,10 @@ "save": "Salvar", "undo": "Desfazer", "delete": "Excluir", - "done": "Concluido" + "done": "Concluído" }, "errors": { - "invalidFileType": "Tipo de arquivo invalido", + "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 index bf76d63d..b49e6fb3 100644 --- a/src/i18n/locales/pt-BR/dialogs.json +++ b/src/i18n/locales/pt-BR/dialogs.json @@ -4,10 +4,10 @@ "compilingGifProgress": "Compilando GIF... {{progress}}%", "compilingGifWait": "Compilando GIF... Isso pode demorar um pouco", "takeMoment": "Isso pode demorar um momento...", - "exportFailed": "Exportacao Falhou", + "exportFailed": "Exportação Falhou", "compilingTitle": "Compilando GIF", "exportingFormat": "Exportando {{format}}", - "exportComplete": "Exportacao Concluida", + "exportComplete": "Exportação Concluída", "formatReady": "Seu {{format}} esta pronto", "showInFolder": "Mostrar na Pasta", "compiling": "Compilando", @@ -17,30 +17,30 @@ "format": "Formato", "compilingStatus": "Compilando...", "frames": "Quadros", - "cancelExport": "Cancelar Exportacao", + "cancelExport": "Cancelar Exportação", "reopenSaveDialog": "Abrir Dialogo 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 anotacoes.", + "description": "Adicione uma fonte personalizada do Google Fonts para usar em suas anotações.", "urlLabel": "URL de Importacao 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 Exibicao", "namePlaceholder": "Minha Fonte Personalizada", - "nameHelp": "E assim que a fonte aparecera no seletor de fontes", + "nameHelp": "É assim que a fonte aparecerá no seletor de fontes", "adding": "Adicionando...", "addFont": "Adicionar Fonte", "enterUrl": "Por favor, insira uma URL de importacao do Google Fonts", "invalidUrl": "Por favor, insira uma URL valida do Google Fonts", "enterName": "Por favor, insira um nome de fonte", - "extractFailed": "Nao foi possivel extrair a familia de fontes da URL", + "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 nao pode ser carregada. Por favor, verifique se a URL do Google Fonts esta correta." + "loadFailed": "A fonte não pode ser carregada. Por favor, verifique se a URL do Google Fonts está correta." }, "shortcutsConfig": { "title": "Atalhos de Teclado", @@ -49,11 +49,11 @@ "pressEscToCancel": "Pressione Esc para cancelar", "clickToChange": "Clique para alterar", "pressAKey": "Pressione uma tecla...", - "alreadyUsedBy": "Ja usado por {{action}}", + "alreadyUsedBy": "Já usado por {{action}}", "swap": "Trocar", "reserved": "Este atalho esta reservado para \"{{label}}\" e nao pode ser reatribuido.", "saved": "Atalhos de teclado salvos", - "resetNotice": "Redefinir para atalhos padrao -- clique em Salvar para aplicar", + "resetNotice": "Redefinir para atalhos padrão -- clique em Salvar para aplicar", "instructions": "Clique em um atalho e pressione a nova combinacao de teclas. Pressione Esc para cancelar.", "resetToDefaults": "Redefinir para padrao", "cancel": "Cancelar", diff --git a/src/i18n/locales/pt-BR/editor.json b/src/i18n/locales/pt-BR/editor.json index 46d5139d..d33dbe25 100644 --- a/src/i18n/locales/pt-BR/editor.json +++ b/src/i18n/locales/pt-BR/editor.json @@ -4,36 +4,36 @@ "pause": "Pausar" }, "annotations": { - "settings": "Configuracoes de Anotacao", + "settings": "Configurações de Anotação", "active": "Ativo", "text": "Texto", "image": "Imagem", "arrow": "Seta", - "textContent": "Conteudo do Texto", + "textContent": "Conteúdo do Texto", "textPlaceholder": "Digite seu texto...", "fontStyle": "Estilo da Fonte", "selectStyle": "Selecionar estilo", "size": "Tamanho", "toggleBold": "Alternar negrito", - "toggleItalic": "Alternar italico", + "toggleItalic": "Alternar itálico", "toggleUnderline": "Alternar sublinhado", - "alignLeft": "Alinhar a esquerda", + "alignLeft": "Alinhar à esquerda", "alignCenter": "Centralizar", - "alignRight": "Alinhar a direita", + "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": "Direcao da Seta", - "strokeWidth": "Largura do Trace: {{width}}px", + "arrowDirection": "Direção da Seta", + "strokeWidth": "Largura do Traço: {{width}}px", "arrowColor": "Cor da Seta", - "deleteAnnotation": "Excluir Anotacao", + "deleteAnnotation": "Excluir Anotação", "shortcutsAndTips": "Atalhos e Dicas", - "tipSelectAnnotation": "Mova a cabeca de reproducao para a secao sobreposta da anotacao e selecione um item.", + "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 tras.", + "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." }, @@ -41,7 +41,7 @@ "classic": "Classico", "editor": "Editor", "strong": "Forte", - "typewriter": "Maquina de Escrever", + "typewriter": "Máquina de Escrever", "deco": "Deco", "simple": "Simples", "modern": "Moderno", @@ -55,28 +55,28 @@ }, "gifOptions": { "frameRate": "Taxa de Quadros", - "outputSize": "Tamanho de Saida", - "outputDimensions": "Saida: {{width}} x {{height}}px", + "outputSize": "Tamanho de Saída", + "outputDimensions": "Saída: {{width}} x {{height}}px", "loopAnimation": "Animacao em Loop", "loopDescription": "O GIF sera reproduzido continuamente" }, "tutorial": { "howTrimmingWorks": "Como o corte funciona", "title": "Como o Corte Funciona", - "understanding": "Entendendo como cortar partes indesejadas do seu video.", - "descriptionP1": "A ferramenta de Corte funciona definindo os segmentos que voce deseja", + "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 video.", - "descriptionP3": "Qualquer parte da linha do tempo coberta por um segmento de Corte vermelho sera removida quando voce exportar.", + "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": "Video Final", + "finalVideo": "Vídeo Final", "part": "Parte {{number}}", "addTrimStep": "1. Adicionar Corte", - "addTrimDesc": "Pressione T ou clique no icone de tesoura para marcar uma secao para remocao.", + "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 regiao vermelha para cobrir exatamente o que deseja cortar." + "adjustDesc": "Arraste as bordas da região vermelha para cobrir exatamente o que deseja cortar." }, "feedback": { "trigger": "Feedback", @@ -90,12 +90,12 @@ "keyboardShortcuts": { "trigger": "Atalhos", "title": "Atalhos de Teclado", - "description": "Referencia rapida para os controles da linha do tempo e editor.", + "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 Anotacoes", + "cycleAnnotations": "Navegar Anotações", "tab": "Tab" }, "actions": { @@ -108,11 +108,11 @@ "exportStatus": { "exporting": "Exportando", "renderingFile": "Renderizando seu arquivo.", - "preparing": "Preparando exportacao...", - "completePercent": "{{percent}}% concluido", - "issue": "Problema na exportacao", - "complete": "Exportacao concluida", + "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 gravacoes" + "openRecordingsFolder": "Abrir pasta de gravações" } diff --git a/src/i18n/locales/pt-BR/launch.json b/src/i18n/locales/pt-BR/launch.json index 8b025d87..fb8ab7b8 100644 --- a/src/i18n/locales/pt-BR/launch.json +++ b/src/i18n/locales/pt-BR/launch.json @@ -1,21 +1,21 @@ { "recording": { - "disableSystemAudio": "Desativar audio do sistema", - "enableSystemAudio": "Ativar audio do sistema", + "disableSystemAudio": "Desativar áudio do sistema", + "enableSystemAudio": "Ativar áudio do sistema", "disableMicrophone": "Desativar microfone", "enableMicrophone": "Ativar microfone", - "disableWebcam": "Desativar sobreposicao de webcam", - "enableWebcam": "Ativar sobreposicao de webcam", + "disableWebcam": "Desativar sobreposição de webcam", + "enableWebcam": "Ativar sobreposição de webcam", "countdownDelay": "Atraso de contagem", "noDelay": "Sem atraso", "record": "Gravar", - "recordingFolder": "Pasta de Gravacoes: {{path}}", - "chooseRecordingsFolder": "Escolher pasta de gravacoes", + "recordingsFolder": "Pasta de Gravações: {{path}}", + "chooseRecordingsFolder": "Escolher pasta de gravações", "folderPath": "Caminho: /{{name}}/", - "openVideoFile": "Abrir arquivo de video", + "openVideoFile": "Abrir arquivo de vídeo", "openProject": "Abrir projeto", - "hideHudFromVideo": "Ocultar HUD da gravacao", - "showHudInVideo": "Mostrar HUD na gravacao", + "hideHudFromVideo": "Ocultar HUD da gravação", + "showHudInVideo": "Mostrar HUD na gravação", "hideHud": "Ocultar HUD", "closeApp": "Fechar App", "screens": "Telas", @@ -29,7 +29,6 @@ "turnOffWebcam": "Desligar Webcam", "selectWebcamToEnable": "Selecione uma webcam para ativar", "noWebcamsFound": "Nenhuma webcam encontrada", - "recordingsFolder": "Pasta de Gravacoes", "language": "Idioma", "paused": "PAUSADO", "rec": "GRAV", @@ -41,33 +40,33 @@ "update": { "update": "Atualizar", "updated": "Atualizado", - "idleTitle": "Verificar atualizacoes.", - "checkingTitle": "Verificando atualizacoes...", - "downloadingTitle": "Baixando atualizacao...", - "errorTitle": "Falha ao verificar atualizacoes. Clique para tentar novamente.", - "upToDateTitle": "Recordly {{version}} esta atualizado.", - "availableTitle": "Recordly {{version}} esta disponivel.", - "availableGenericTitle": "Uma atualizacao esta disponivel." + "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 visiveis (nao minimizadas) podem ser gravadas.", + "windowsNote": "Apenas janelas visíveis (não minimizadas) podem ser gravadas.", "windowPlaceholder": "Janela", "cancel": "Cancelar", "share": "Compartilhar" }, "permissions": { - "screenRecordingNeeded": "O Recordly precisa de permissao de Gravacao de Tela antes de comecar. As Configuracoes do Sistema foram abertas. Apos habilitar, feche e reabra o Recordly.", - "screenRecordingMissing": "A permissao de Gravacao de Tela ainda esta faltando. As Configuracoes do Sistema foram abertas novamente. Habilite, depois feche e reabra o Recordly antes de gravar.", - "accessibilityNeeded": "O Recordly tambem precisa de permissao de Acessibilidade para rastrear o cursor. As Configuracoes do Sistema foram abertas. Apos habilitar, feche e reabra o Recordly.", - "accessibilityMissing": "A permissao de Acessibilidade ainda esta faltando. As Configuracoes do Sistema foram abertas novamente. Habilite, depois feche e reabra o Recordly antes de gravar.", + "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": "Audio do sistema nao esta disponivel para esta fonte. A gravacao continuara sem audio do sistema.", - "microphoneDenied": "Acesso ao microfone foi negado. A gravacao continuara sem audio do microfone.", - "failedToStart": "Falha ao iniciar gravacao: {{error}}", - "failedToStartGeneric": "Falha ao iniciar gravacao" + "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 index b9d0d719..23f029fe 100644 --- a/src/i18n/locales/pt-BR/settings.json +++ b/src/i18n/locales/pt-BR/settings.json @@ -1,16 +1,16 @@ { "zoom": { - "level": "Nivel de Zoom", - "selectRegion": "Selecione uma regiao de zoom para ajustar", + "level": "Nível de Zoom", + "selectRegion": "Selecione uma região de zoom para ajustar", "deleteZoom": "Excluir Zoom" }, "trim": { "deleteRegion": "Excluir Regiao de Trim" }, "speed": { - "playbackSpeed": "Velocidade de Reproducao", - "selectRegion": "Selecione uma regiao de velocidade para ajustar", - "deleteRegion": "Excluir Regiao de Velocidade" + "playbackSpeed": "Velocidade de Reprodução", + "selectRegion": "Selecione uma região de velocidade para ajustar", + "deleteRegion": "Excluir Região de Velocidade" }, "effects": { "title": "Efeitos de Video", @@ -33,16 +33,16 @@ "zoomMotionBlur": "Desfoque de Movimento no Zoom", "connect Zooms": "Conectar Zooms", "zoomGeneralTitle": "Geral", - "zoomGeneralDescription": "Configuracoes globais de movimento para cada transicao de zoom.", + "zoomGeneralDescription": "Configurações globais de movimento para cada transição de zoom.", "zoomInTitle": "Zoom In", - "zoomInDescription": "Controle como a camera entra em uma regiao de zoom.", + "zoomInDescription": "Controle como a câmera entra em uma região de zoom.", "zoomOutTitle": "Zoom Out", - "zoomOutDescription": "Controle como a camera sai de uma regiao de zoom.", + "zoomOutDescription": "Controle como a câmera sai de uma região de zoom.", "connectedZoomTitle": "Entre Zooms", - "connectedZoomDescription": "Ajuste o deslize entre regioes de zoom consecutivas quando a conexao esta habilitada.", - "zoomInDuration": "Duracao do Zoom In", - "zoomInOverlap": "Sobreposicao do Zoom In", - "zoomOutDuration": "Duracao do Zoom Out", + "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", @@ -56,20 +56,20 @@ "linear": "Linear" }, "cursorSize": "Tamanho do Cursor", - "cursorSmoothing": "Suavizacao 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": "Oscilacao do Cursor", + "cursorSway": "Oscilação do Cursor", "webcam": "Sobreposicao de Webcam", "webcamFootage": "Gravacao de Webcam", - "webcamFootageDescription": "Nenhuma gravacao de webcam vinculada a este video", - "uploadWebcamFootage": "Enviar gravacao", - "replaceWebcamFootage": "Substituir gravacao", - "removeWebcamFootage": "Remover gravacao", - "webcamFootageAdded": "Gravacao de webcam vinculada", - "webcamFootageRemoved": "Gravacao de webcam removida", + "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", @@ -77,7 +77,7 @@ "shadow": "Sombra", "radius": "Raio", "roundness": "Arredondamento", - "padding": "Espacamento", + "padding": "Espaçamento", "removeBackground": "Remover fundo" }, "sections": { @@ -100,25 +100,25 @@ "generateFull": "Gerar Legendas", "regenerateFull": "Regerar Legendas", "clearFull": "Limpar Legendas", - "fontSettings": "Configuracoes de Fonte", - "defaultFont": "Padrao", + "fontSettings": "Configurações de Fonte", + "defaultFont": "Padrão", "fontFamily": "Fonte", "fontSize": "Tamanho da Fonte", "rowCount": "Linhas", - "animation": "Animacao", + "animation": "Animação", "animationOff": "Desligado", "animationFade": "Fade", "animationRise": "Rise", "animationPop": "Pop", "bottomOffset": "Offset Inferior", - "maxWidth": "Largura Maxima", + "maxWidth": "Largura Máxima", "boxRadius": "Raio da Caixa", "backgroundOpacity": "Opacidade do Fundo", "textColor": "Cor do Texto" }, "crop": { - "title": "Cortar Video", - "instruction": "Arraste em cada lado para ajustar a area de corte", + "title": "Cortar Vídeo", + "instruction": "Arraste em cada lado para ajustar a área de corte", "top": "Superior", "bottom": "Inferior", "left": "Esquerda", @@ -130,11 +130,11 @@ "image": "Imagem", "color": "Cor", "gradient": "Gradiente", - "wallpaperPreview": "Visualizacao do papel de parede", + "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 sao suportadas." + "uploadErrorDescription": "Apenas imagens JPG e JPEG são suportadas." }, "export": { "title": "Exportar", diff --git a/src/i18n/locales/pt-BR/shortcuts.json b/src/i18n/locales/pt-BR/shortcuts.json index 930ac221..f5fc5d7c 100644 --- a/src/i18n/locales/pt-BR/shortcuts.json +++ b/src/i18n/locales/pt-BR/shortcuts.json @@ -3,12 +3,12 @@ "addZoom": "Adicionar Zoom", "addTrim": "Adicionar Trim", "addSpeed": "Adicionar Velocidade", - "addAnnotation": "Adicionar Anotacao", + "addAnnotation": "Adicionar Anotação", "addKeyframe": "Adicionar Keyframe", "deleteSelected": "Excluir Selecionado", "playPause": "Reproduzir / Pausar", - "cycleForward": "Navegar Anotacoes para Frente", - "cycleBackward": "Navegar Anotacoes para Tras", + "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 index fce5c4dd..f6e7cf9a 100644 --- a/src/i18n/locales/pt-BR/timeline.json +++ b/src/i18n/locales/pt-BR/timeline.json @@ -1,30 +1,30 @@ { "zoom": { - "cannotPlace": "Nao e possivel colocar zoom aqui", - "existsOrNoSpace": "Zoom ja existe neste local ou espaco insuficiente disponivel.", - "suggestHandlerUnavailable": "Manipulador de sugestao de zoom indisponivel", - "noTelemetry": "Sem telemetria de cursor disponivel", - "recordFirst": "Grave uma screencast primeiro para gerar sugestoes baseadas em cursor.", - "noUsableTelemetry": "Sem telemetria de cursor utilizavel", - "notEnoughMovement": "A gravacao nao inclui dados suficientes de movimento do cursor.", - "noInteractionMoments": "Nenhum momento de interacao claro encontrado", - "tryRecording": "Tente uma gravacao com pausas ou cliques em torno de acoes importantes.", - "noAutoZoomSlots": "Nenhum slot de auto-zoom disponivel", - "dwellPointsOverlap": "Pontos de permanencia detectados se sobrepoem a regioes de zoom existentes.", - "addedSuggestions": "Adicionadas {{count}} sugestao(oes) de zoom baseada(s) em interacao", + "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": "Nao e possivel colocar trim aqui", - "existsOrNoSpace": "Trim ja existe neste local ou espaco insuficiente disponivel.", + "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": "Nao e possivel colocar velocidade aqui", - "existsOrNoSpace": "Regiao de velocidade ja existe neste local ou espaco insuficiente disponivel.", + "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": { From 8c5e1b3947793e056e81b0e6f7b50842d07c3bd1 Mon Sep 17 00:00:00 2001 From: Gustavo Toledo Date: Sat, 4 Apr 2026 15:34:51 -0300 Subject: [PATCH 3/6] Update src/i18n/locales/pt-BR/settings.json Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- src/i18n/locales/pt-BR/settings.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/i18n/locales/pt-BR/settings.json b/src/i18n/locales/pt-BR/settings.json index 23f029fe..54959657 100644 --- a/src/i18n/locales/pt-BR/settings.json +++ b/src/i18n/locales/pt-BR/settings.json @@ -5,7 +5,7 @@ "deleteZoom": "Excluir Zoom" }, "trim": { - "deleteRegion": "Excluir Regiao de Trim" + "deleteRegion": "Excluir Região de Trim" }, "speed": { "playbackSpeed": "Velocidade de Reprodução", From 3f20da04512398809c16d49377981e33906fa6d2 Mon Sep 17 00:00:00 2001 From: Gustavo Toledo Date: Sat, 4 Apr 2026 16:30:24 -0300 Subject: [PATCH 4/6] Update src/i18n/locales/pt-BR/settings.json Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- src/i18n/locales/pt-BR/settings.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/i18n/locales/pt-BR/settings.json b/src/i18n/locales/pt-BR/settings.json index 54959657..a97c983e 100644 --- a/src/i18n/locales/pt-BR/settings.json +++ b/src/i18n/locales/pt-BR/settings.json @@ -142,12 +142,12 @@ "gif": "GIF", "quality": { "low": "Baixa", - "medium": "Media", + "medium": "Média", "high": "Alta", "original": "Original" }, "loop": "Loop", - "outputDimensions": "Saida: {{dimensions}}px", + "outputDimensions": "Saída: {{dimensions}}px", "sizePresetOriginalShort": "Orig", "sizePresetMediumShort": "Med", "sizePresetLargeShort": "Lar", From 0f93026fd3ae53a1d6287d57bda14561b7bb6f2a Mon Sep 17 00:00:00 2001 From: Gustavo Date: Fri, 3 Apr 2026 16:25:13 -0300 Subject: [PATCH 5/6] fix: add missing accents to pt-BR translations --- src/i18n/locales/pt-BR/dialogs.json | 20 ++++++++++---------- src/i18n/locales/pt-BR/editor.json | 14 +++++++------- src/i18n/locales/pt-BR/settings.json | 6 +++--- src/i18n/locales/pt-BR/timeline.json | 4 ++-- 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/i18n/locales/pt-BR/dialogs.json b/src/i18n/locales/pt-BR/dialogs.json index b49e6fb3..bb90d8ef 100644 --- a/src/i18n/locales/pt-BR/dialogs.json +++ b/src/i18n/locales/pt-BR/dialogs.json @@ -8,7 +8,7 @@ "compilingTitle": "Compilando GIF", "exportingFormat": "Exportando {{format}}", "exportComplete": "Exportação Concluída", - "formatReady": "Seu {{format}} esta pronto", + "formatReady": "Seu {{format}} está pronto", "showInFolder": "Mostrar na Pasta", "compiling": "Compilando", "renderingFrames": "Renderizando Quadros", @@ -18,23 +18,23 @@ "compilingStatus": "Compilando...", "frames": "Quadros", "cancelExport": "Cancelar Exportação", - "reopenSaveDialog": "Abrir Dialogo de Salvamento Novamente", + "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 Importacao do Google Fonts", + "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 Exibicao", + "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 importacao do Google Fonts", - "invalidUrl": "Por favor, insira uma URL valida do Google Fonts", + "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", @@ -44,18 +44,18 @@ }, "shortcutsConfig": { "title": "Atalhos de Teclado", - "configurable": "Configuravel", + "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 esta reservado para \"{{label}}\" e nao pode ser reatribuido.", + "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 combinacao de teclas. Pressione Esc para cancelar.", - "resetToDefaults": "Redefinir para padrao", + "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 index d33dbe25..ec053d80 100644 --- a/src/i18n/locales/pt-BR/editor.json +++ b/src/i18n/locales/pt-BR/editor.json @@ -38,7 +38,7 @@ "imageUploadError": "Por favor, envie um arquivo de imagem JPG, PNG, GIF ou WebP." }, "fontStyles": { - "classic": "Classico", + "classic": "Clássico", "editor": "Editor", "strong": "Forte", "typewriter": "Máquina de Escrever", @@ -48,17 +48,17 @@ "clean": "Limpo" }, "format": { - "mp4Video": "Video MP4", - "mp4Description": "Arquivo de video de alta qualidade", - "gifAnimation": "Animacao GIF", + "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": "Animacao em Loop", - "loopDescription": "O GIF sera reproduzido continuamente" + "loopAnimation": "Animação em Loop", + "loopDescription": "O GIF será reproduzido continuamente" }, "tutorial": { "howTrimmingWorks": "Como o corte funciona", @@ -103,7 +103,7 @@ "showInFolder": "Mostrar na Pasta" }, "project": { - "untitled": "Sem titulo" + "untitled": "Sem título" }, "exportStatus": { "exporting": "Exportando", diff --git a/src/i18n/locales/pt-BR/settings.json b/src/i18n/locales/pt-BR/settings.json index a97c983e..f848772d 100644 --- a/src/i18n/locales/pt-BR/settings.json +++ b/src/i18n/locales/pt-BR/settings.json @@ -13,7 +13,7 @@ "deleteRegion": "Excluir Região de Velocidade" }, "effects": { - "title": "Efeitos de Video", + "title": "Efeitos de Vídeo", "show": "Mostrar", "showCursor": "Mostrar Cursor", "loopCursor": "Cursor em loop", @@ -46,13 +46,13 @@ "zoomInEasing": "Curva do Zoom In", "zoomOutEasing": "Curva do Zoom Out", "connectedZoomGap": "Gap do Zoom Conectado", - "connectedZoomDuration": "Duracao do Zoom Conectado", + "connectedZoomDuration": "Duração do Zoom Conectado", "connectedZoomEasing": "Curva do Pan Conectado", "zoomEasingOptions": { "recordly": "Recordly", "glide": "Deslize", "smooth": "Suave", - "snappy": "Rapido", + "snappy": "Rápido", "linear": "Linear" }, "cursorSize": "Tamanho do Cursor", diff --git a/src/i18n/locales/pt-BR/timeline.json b/src/i18n/locales/pt-BR/timeline.json index f6e7cf9a..12ad788d 100644 --- a/src/i18n/locales/pt-BR/timeline.json +++ b/src/i18n/locales/pt-BR/timeline.json @@ -28,9 +28,9 @@ "label": "Velocidade" }, "annotation": { - "label": "Anotacao", + "label": "Anotação", "image": "Imagem", - "addAnnotation": "Adicionar Anotacao (A)" + "addAnnotation": "Adicionar Anotação (A)" }, "addSpeed": "Adicionar Velocidade (S)", "resizeLeft": "Redimensionar esquerda", From 8103034b0d0d61abd4ffa9e4e08007ffcedead75 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Sat, 4 Apr 2026 15:37:08 -0300 Subject: [PATCH 6/6] fix: add pt-BR label to LOCALE_LABELS and tighten type --- src/components/launch/LaunchWindow.tsx | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) 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");