diff --git a/src/i18n/config.ts b/src/i18n/config.ts index ce23fd4..df5456c 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 0000000..6ecaa9a --- /dev/null +++ b/src/i18n/locales/pt-BR/common.json @@ -0,0 +1,26 @@ +{ + "app": { + "name": "Recordly", + "editorTitle": "Recordly Editor", + "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": "Ok" + }, + "errors": { + "invalidFileType": "Tipo de arquivo inválido", + "failedToUploadImage": "Falha ao carregar imagem", + "fileReadError": "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 0000000..c3d55ad --- /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", + "takeMoment": "Isso pode demorar um pouco...", + "exportFailed": "Exportação Falhou", + "compilingGifTitle": "Compilando GIF", + "exportingFormat": "Exportando {{format}}", + "exportComplete": "Exportação Completa", + "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 Janela 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 nas anotações.", + "urlLabel": "URL de Importação da Fonte 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 o URL @import", + "nameLabel": "Nome Exibido", + "namePlaceholder": "Minha Fonte Personalizada", + "nameHelp": "Isso é como a fonte aparecerá no seletor de fontes", + "adding": "Adicionando...", + "addFont": "Adicionar Fonte", + "enterUrl": "Por favor, insira uma URL de importação da fonte do Google Fonts", + "invalidUrl": "Por favor, insira uma URL válida do Google Fonts", + "enterName": "Por favor, insira um nome para a fonte", + "extractFailed": "Não foi possível extrair a família da fonte da URL", + "addSuccess": "Fonte \"{{name}}\" adicionada com sucesso", + "addFailed": "Falha ao adicionar fonte", + "loadTimeout": "A fonte demorou demais para carregar. Verifique a URL e tente novamente.", + "loadFailed": "A fonte não pôde ser carregada. Verifique se a URL do Google Fonts está correta." + }, + "shortcutsConfig": { + "title": "Atalhos de Teclado", + "configurable": "Configurável", + "fixed": "Fixo", + "pressEscToCancel": "Pressione Esc para cancelar", + "clickToChange": "Clique para alterar", + "pressAKey": "Pressione uma tecla...", + "alreadyUsedBy": "Já está em uso por {{action}}", + "swap": "Trocar", + "reserved": "Este atalho é 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 0000000..ab40084 --- /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 de Texto", + "textPlaceholder": "Digite seu texto...", + "fontStyle": "Estilo de Fonte", + "selectStyle": "Selecione o estilo", + "size": "Tamanho", + "toggleBold": "Alternar negrito", + "toggleItalic": "Alternar itálico", + "toggleUnderline": "Alternar sublinhado", + "alignLeft": "Alinhar à esquerda", + "alignCenter": "Alinhar ao centro", + "alignRight": "Alinhar à direita", + "textColor": "Cor do Texto", + "background": "Fundo", + "none": "Nenhum", + "clearBackground": "Limpar Fundo", + "uploadImage": "Carregar Imagem", + "supportedFormats": "Formatos suportados: JPG, PNG, GIF, WebP", + "arrowDirection": "Direção da Seta", + "strokeWidth": "Largura da Linha: {{width}}px", + "arrowColor": "Cor da Seta", + "deleteAnnotation": "Excluir Anotação", + "shortcutsAndTips": "Atalhos e Dicas", + "tipSelectAnnotation": "Mova o cabeçote de reprodução para a seção sobreposta e selecione um item.", + "tipCycleForward": "Use Tab para percorrer os itens sobrepostos.", + "tipCycleBackward": "Use Shift+Tab para percorrer em ordem inversa.", + "imageUploadSuccess": "Imagem carregada com sucesso!", + "imageUploadError": "Por favor, carregue um arquivo de imagem JPG, PNG, GIF ou WebP." + }, + "fontStyles": { + "classic": "Clássico", + "editor": "Editor", + "strong": "Forte", + "typewriter": "Typewriter", + "deco": "Deco", + "simple": "Simples", + "modern": "Moderno", + "clean": "Limpo" + }, + "format": { + "mp4Video": "MP4 Vídeo", + "mp4Description": "Arquivo de vídeo de alta qualidade", + "gifAnimation": "Animação GIF", + "gifDescription": "Imagem animada para compartilhamento" + }, + "gifOptions": { + "frameRate": "Taxa de Quadro", + "outputSize": "Tamanho de Saída", + "outputDimensions": "Saída: {{width}} × {{height}}px", + "loopAnimation": "Loop Animação", + "loopDescription": "GIF será reproduzido continuamente" + }, + "tutorial": { + "howTrimmingWorks": "Como funciona o recorte", + "title": "Como Funciona o Recorte", + "understanding": "Entendendo como cortar partes indesejadas do seu vídeo.", + "descriptionP1": "A ferramenta de recorte funciona definindo os segmentos que você deseja", + "descriptionRemove": "remover", + "descriptionP2": "do seu vídeo.", + "descriptionP3": "Qualquer parte da linha do tempo que está coberta por um segmento de recorte vermelho será cortada quando você exportar.", + "visualExample": "Visual Example", + "removed": "REMOVIDO", + "kept": "Manter", + "finalVideo": "Vídeo Final", + "part": "Parte {{number}}", + "addTrimStep": "1. Adicionar Recorte", + "addTrimDesc": "Pressione T ou clique no ícone de cortar para marcar uma seção para remoção.", + "adjustStep": "2. Ajustar", + "adjustDesc": "Arraste as bordas da região vermelha para cobrir exatamente o que você deseja cortar." + }, + "feedback": { + "trigger": "Feedback", + "title": "Feedback & contato", + "description": "Fale diretamente conosco ou abra um problema se algo estiver quebrado ou faltando.", + "emailLabel": "Email", + "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 as controles da linha do tempo e do editor.", + "customizeTooltip": "Personalizar atalhos", + "customize": "Personalizar", + "panTimeline": "Mover Linha do Tempo", + "zoomTimeline": "Zoom Linha do Tempo", + "cycleAnnotations": "Ciclar Anotações", + "tab": "Tab" + }, + "actions": { + "saveAgain": "Salvar Novamente", + "showInFolder": "Mostrar na pasta" + }, + "project": { + "untitled": "Sem Título" + }, + "exportStatus": { + "exporting": "Exportando", + "renderingFile": "Renderizando arquivo.", + "preparing": "Preparando exportação...", + "completePercent": "{{percent}}% concluído", + "issue": "Problema de 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 0000000..d2b7596 --- /dev/null +++ b/src/i18n/locales/pt-BR/launch.json @@ -0,0 +1,62 @@ +{ + "recording": { + "disableSystemAudio": "Desativar áudio do sistema", + "enableSystemAudio": "Ativar áudio do sistema", + "disableMicrophone": "Desativar microfone", + "enableMicrophone": "Ativar microfone", + "disableWebcam": "Desativar overlay da webcam", + "enableWebcam": "Ativar overlay da webcam", + "countdownDelay": "Delay de contagem regressiva", + "noDelay": "Sem delay", + "record": "Gravar", + "recordingFolder": "Caminho de gravações: {{path}}", + "chooseRecordingsFolder": "Escolher caminho de gravações", + "folderPath": "Caminho: /{{name}}/", + "openVideoFile": "Abrir arquivo de vídeo", + "openProject": "Abrir projeto", + "hideHudFromVideo": "Ocultar HUD na gravação", + "showHudInVideo": "Mostrar HUD na gravação", + "hideHud": "Ocultar HUD", + "closeApp": "Fechar Aplicativo", + "screens": "Telas", + "windows": "Janelas", + "noSourcesFound": "Nenhum source encontrado", + "microphone": "Microfone", + "turnOffMicrophone": "Desativar Microfone", + "selectMicToEnable": "Selecione um microfone para ativar", + "noMicrophonesFound": "Nenhum microfone encontrado", + "webcam": "Webcam", + "turnOffWebcam": "Desativar Webcam", + "selectWebcamToEnable": "Selecione uma webcam para ativar", + "noWebcamsFound": "Nenhuma webcam encontrada", + "recordingsFolder": "Caminho de gravações", + "language": "Idioma", + "paused": "PAUSADO", + "rec": "REC", + "resume": "Retomar", + "pause": "Pausar", + "stop": "Parar", + "cancel": "Cancelar", + "more": "Mais" + }, + "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": "Recordly precisa da permissão de gravação de tela antes de começar. Configurações do sistema foram abertas. Após habilitar, feche e abra Recordly novamente.", + "screenRecordingMissing": "Permissão de gravação de tela ainda está faltando. Configurações do sistema foram abertas novamente. Habilite-a, então feche e abra Recordly antes de gravar.", + "accessibilityNeeded": "Recordly também precisa da permissão de acessibilidade para rastreamento do cursor. Configurações do sistema foram abertas. Após habilitar, feche e abra Recordly novamente.", + "accessibilityMissing": "Permissão de acessibilidade ainda está faltando. Configurações do sistema foram abertas novamente. Habilite-a, então feche e abra 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": "Microfone acesso 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 0000000..27141f8 --- /dev/null +++ b/src/i18n/locales/pt-BR/settings.json @@ -0,0 +1,96 @@ +{ + "zoom": { + "level": "Nível de Zoom", + "selectRegion": "Selecione uma região de zoom para ajustar", + "deleteZoom": "Excluir Zoom" + }, + "trim": { + "deleteRegion": "Excluir Região de Cortar" + }, + "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": "Loop cursor", + "backgroundBlur": "Blur de Fundo", + "zoomMotionBlur": "Zoom Motion Blur", + "connectZooms": "Conectar Zooms", + "cursorSize": "Tamanho do Cursor", + "cursorSmoothing": "Suavização do Cursor", + "off": "Off", + "cursorMotionBlur": "Blur de Movimento do Cursor", + "cursorClickBounce": "Bounce do Clique do Cursor", + "cursorClickBounceDuration": "Velocidade do Bounce", + "cursorSway": "Movimento do Cursor", + "webcam": "Overlay da Webcam", + "webcamFootage": "Vídeo da Webcam", + "webcamFootageDescription": "Nenhum vídeo da webcam linkado a este vídeo", + "uploadWebcamFootage": "Upload vídeo", + "replaceWebcamFootage": "Substituir vídeo", + "removeWebcamFootage": "Remover vídeo", + "webcamFootageAdded": "Vídeo da webcam linkado", + "webcamFootageRemoved": "Vídeo da webcam removido", + "webcamSize": "Tamanho da Webcam", + "webcamReactToZoom": "Webcam Reage ao Zoom", + "webcamRoundness": "Arredondamento da Webcam", + "webcamShadow": "Sombra da Webcam", + "shadow": "Sombra", + "radius": "Raio", + "roundness": "Arredondamento", + "padding": "Preenchimento", + "removeBackground": "Remover fundo" + }, + "sections": { + "scene": "Cena", + "cursor": "Cursor", + "webcam": "Webcam", + "frame": "Quadro", + "crop": "Cortar" + }, + "crop": { + "title": "Cortar Vídeo", + "instruction": "Arraste em cada lado para ajustar a área de corte", + "top": "Topo", + "bottom": "Baixo", + "left": "Esquerda", + "right": "Direita", + "openEditor": "Abrir Editor de Cortar" + }, + "background": { + "title": "Fundo", + "image": "Imagem", + "color": "Cor", + "gradient": "Gradiente", + "wallpaperPreview": "Pré-visualização de wallpaper", + "uploadCustom": "Upload Personalizado", + "uploadSuccess": "Imagem personalizada carregada com sucesso!", + "uploadError": "Por favor, carregue um arquivo de imagem JPG ou JPEG.", + "uploadErrorDescription": "Apenas arquivos de imagem JPG e JPEG são suportados." + }, + "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": "Estrelar 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 0000000..4e8cf16 --- /dev/null +++ b/src/i18n/locales/pt-BR/shortcuts.json @@ -0,0 +1,16 @@ +{ + "actions": { + "addZoom": "Adicionar Zoom", + "addTrim": "Adicionar Cortar", + "addSpeed": "Adicionar Velocidade", + "addAnnotation": "Adicionar Anotação", + "addKeyframe": "Adicionar Keyframe", + "deleteSelected": "Excluir Selecionado", + "playPause": "Reproduzir / Pausar", + "cycleForward": "Avançar Anotações", + "cycleBackward": "Retroceder Anotações", + "deleteSelectedAlt": "Excluir Selecionado (alt)", + "panTimeline": "Mover Timeline", + "zoomTimeline": "Zoom Timeline" + } +} diff --git a/src/i18n/locales/pt-BR/timeline.json b/src/i18n/locales/pt-BR/timeline.json new file mode 100644 index 0000000..d64d06e --- /dev/null +++ b/src/i18n/locales/pt-BR/timeline.json @@ -0,0 +1,38 @@ +{ + "zoom": { + "cannotPlace": "Não é possível colocar o zoom aqui", + "existsOrNoSpace": "Zoom já existe nessa localização ou não há espaço suficiente disponível.", + "suggestHandlerUnavailable": "Manipulador de sugestão de zoom indisponível", + "noTelemetry": "Nenhum dado de telemetria do cursor disponível", + "recordFirst": "Registre uma transmissão primeiro para gerar sugestões baseadas no cursor.", + "noUsableTelemetry": "Nenhum dado de telemetria do cursor usável", + "notEnoughMovement": "A transmissão não inclui dados suficientes de movimento do cursor.", + "noInteractionMoments": "Nenhum momento de interação claro encontrado", + "tryRecording": "Tente uma transmissão com pausas ou cliques em ações importantes.", + "noAutoZoomSlots": "Nenhum slot de zoom automático disponível", + "dwellPointsOverlap": "Detectado sobreposição de pontos de foco. Os zoom sugeridos podem não ser exibidos corretamente.", + "addedSuggestions": "Adicionado(s) {{count}} sugestão(s) de zoom baseada(s) na interação", + "label": "Zoom {{index}}", + "addZoom": "Adicionar Zoom (Z)", + "suggestZooms": "Sugerir Zooms a partir do Cursor" + }, + "trim": { + "cannotPlace": "Não é possível colocar o corte aqui", + "existsOrNoSpace": "Corte já existe nessa localização ou não há espaço suficiente disponível.", + "label": "Corte {{index}}", + "addTrim": "Adicionar Cortar (T)" + }, + "speed": { + "cannotPlace": "Não é possível colocar a velocidade aqui", + "existsOrNoSpace": "Região de velocidade já existe nessa localização ou não há espaço suficiente 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" +}