diff --git a/src/components/video-editor/SettingsPanel.tsx b/src/components/video-editor/SettingsPanel.tsx index 28e9c00f..0902094c 100644 --- a/src/components/video-editor/SettingsPanel.tsx +++ b/src/components/video-editor/SettingsPanel.tsx @@ -495,6 +495,7 @@ const APP_LANGUAGE_LABELS: Record = { fr: "Français", nl: "Nederlands", ko: "한국어", + "pt-BR": "Português", "zh-CN": "中文", }; diff --git a/src/contexts/I18nContext.tsx b/src/contexts/I18nContext.tsx index 6eded091..4f28634b 100644 --- a/src/contexts/I18nContext.tsx +++ b/src/contexts/I18nContext.tsx @@ -54,6 +54,14 @@ import nlLaunch from "@/i18n/locales/nl/launch.json"; import nlSettings from "@/i18n/locales/nl/settings.json"; import nlShortcuts from "@/i18n/locales/nl/shortcuts.json"; import nlTimeline from "@/i18n/locales/nl/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 ptBRExtensions from "@/i18n/locales/pt-BR/extensions.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"; import zhCNCommon from "@/i18n/locales/zh-CN/common.json"; import zhCNDialogs from "@/i18n/locales/zh-CN/dialogs.json"; import zhCNEditor from "@/i18n/locales/zh-CN/editor.json"; @@ -118,6 +126,16 @@ const messages: Record = { shortcuts: koShortcuts, extensions: koExtensions, }, + "pt-BR": { + common: ptBRCommon, + launch: ptBRLaunch, + editor: ptBREditor, + timeline: ptBRTimeline, + settings: ptBRSettings, + dialogs: ptBRDialogs, + shortcuts: ptBRShortcuts, + extensions: ptBRExtensions, + }, "zh-CN": { common: zhCNCommon, launch: zhCNLaunch, diff --git a/src/i18n/config.ts b/src/i18n/config.ts index 9d70853d..038d0fbb 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", "fr", "nl", "ko", "zh-CN"] as const; +export const SUPPORTED_LOCALES = ["en", "es", "fr", "nl", "ko", "pt-BR", "zh-CN"] 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..97a2ea1d --- /dev/null +++ b/src/i18n/locales/pt-BR/common.json @@ -0,0 +1,26 @@ +{ + "app": { + "name": "Recordly", + "editorTitle": "Editor do 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..f5f77206 --- /dev/null +++ b/src/i18n/locales/pt-BR/dialogs.json @@ -0,0 +1,62 @@ +{ + "export": { + "pleaseTryAgain": "Tente novamente", + "compilingGifProgress": "Compilando GIF... {{progress}}%", + "compilingGifWait": "Compilando GIF... Isso pode levar um tempo", + "takeMoment": "Isso pode levar um momento...", + "exportFailed": "Falha na exportação", + "compilingGifTitle": "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 salvar 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 suas anotações.", + "urlLabel": "URL de importação do Google Fonts", + "urlPlaceholder": "https://fonts.googleapis.com/css2?family=Roboto&display=swap", + "urlHelp": "Obtenha isso no Google Fonts: selecione uma fonte -> clique em \"Get font\" -> copie a URL de @import", + "nameLabel": "Nome de exibição", + "namePlaceholder": "Minha fonte personalizada", + "nameHelp": "Assim a fonte aparecerá no seletor de fontes", + "adding": "Adicionando...", + "addFont": "Adicionar fonte", + "enterUrl": "Informe uma URL de importação do Google Fonts", + "invalidUrl": "Informe uma URL válida do Google Fonts", + "enterName": "Informe 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 muito para carregar. Verifique a URL e tente novamente.", + "loadFailed": "A fonte não pode 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á usado 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 00000000..fff93fe9 --- /dev/null +++ b/src/i18n/locales/pt-BR/editor.json @@ -0,0 +1,134 @@ +{ + "playback": { + "play": "Reproduzir", + "pause": "Pausar", + "skipBack": "Voltar", + "skipForward": "Avançar", + "muteUnmute": "Silenciar/ativar som" + }, + "annotations": { + "settings": "Configurações de anotação", + "active": "Ativo", + "text": "Texto", + "image": "Imagem", + "arrow": "Seta", + "blur": "Blur", + "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": "Alinhar ao centro", + "alignRight": "Alinhar à direita", + "textColor": "Cor do texto", + "background": "Fundo", + "none": "Nenhum", + "clearBackground": "Limpar fundo", + "uploadImage": "Enviar imagem", + "supportedFormats": "Formatos suportados: JPG, PNG, GIF, WebP", + "arrowDirection": "Direção da seta", + "strokeWidth": "Espessura do traço: {{width}}px", + "arrowColor": "Cor da seta", + "deleteAnnotation": "Excluir anotação", + "shortcutsAndTips": "Atalhos e dicas", + "tipSelectAnnotation": "Mova o indicador para uma seção com anotações sobrepostas e selecione um item.", + "tipCycleForward": "Use Tab para alternar entre itens sobrepostos.", + "tipCycleBackward": "Use Shift+Tab para voltar.", + "imageUploadSuccess": "Imagem enviada com sucesso!", + "imageUploadError": "Envie um arquivo de imagem JPG, PNG, GIF ou WebP.", + "blurStrength": "Intensidade do blur: {{strength}}", + "solidColor": "Cor sólida (censura)", + "borderRadius": "Raio da borda" + }, + + "fontStyles": { + "classic": "Classic", + "editor": "Editor", + "strong": "Strong", + "typewriter": "Typewriter", + "deco": "Deco", + "simple": "Simple", + "modern": "Modern", + "clean": "Clean" + }, + "format": { + "mp4Video": "Vídeo MP4", + "mp4Description": "Arquivo de vídeo em 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}} × {{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": "Entenda como remover partes indesejadas do seu vídeo.", + "descriptionP1": "A ferramenta de corte funciona definindo os trechos que você quer", + "descriptionRemove": "remover", + "descriptionP2": "do seu vídeo.", + "descriptionP3": "Qualquer parte da linha do tempo coberta por uma região de corte vermelha será removida na exportação.", + "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 um trecho para remoção.", + "adjustStep": "2. Ajustar", + "adjustDesc": "Arraste as bordas da região vermelha para cobrir exatamente o que você quer remover." + }, + "feedback": { + "trigger": "Feedback", + "title": "Feedback e contato", + "description": "Fale diretamente conosco ou abra uma issue se algo estiver com problema 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 do editor.", + "customizeTooltip": "Personalizar atalhos", + "customize": "Personalizar", + "panTimeline": "Mover linha do tempo", + "zoomTimeline": "Zoom da linha do tempo", + "cycleAnnotations": "Alternar 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." + }, + "toolbar": { + "addLayer": "Adicionar camada", + "splitClip": "Dividir clipe (C)" + }, + "timeline": { + "expand": "Expandir linha do tempo", + "collapse": "Recolher linha do tempo" + }, + "openRecordingsFolder": "Abrir pasta de gravações" +} diff --git a/src/i18n/locales/pt-BR/extensions.json b/src/i18n/locales/pt-BR/extensions.json new file mode 100644 index 00000000..4f5dcbba --- /dev/null +++ b/src/i18n/locales/pt-BR/extensions.json @@ -0,0 +1,60 @@ +{ + "title": "Extensões", + "tabs": { + "browse": "Explorar", + "installed": "Instaladas" + }, + "actions": { + "submit": "Enviar uma extensão", + "docs": "Documentação de extensões", + "refresh": "Atualizar", + "openFolder": "Abrir pasta de extensões", + "uninstall": "Desinstalar", + "install": "Instalar", + "installing": "Instalando", + "add": "Adicionar", + "retry": "Tentar novamente", + "close": "Fechar", + "folder": "Pasta" + }, + "status": { + "enabled": "Ativada", + "disabled": "Desativada", + "installed": "Instalada" + }, + "detail": { + "by": "Por {{author}}", + "unknownAuthor": "Autor desconhecido", + "noDescription": "Sem descrição", + "downloads": "{{count}} downloads", + "preview": "Prévia", + "screenshotAlt": "Captura de tela {{number}}", + "description": "Descrição", + "tags": "Tags", + "permissions": "Permissões", + "location": "Localização", + "error": "Erro: {{message}}" + }, + "empty": { + "title": "Sem extensões", + "description": "Instale extensões para adicionar molduras, efeitos de cursor e ferramentas de edição." + }, + "search": { + "placeholder": "Buscar extensões...", + "noResults": "Nenhuma extensão encontrada", + "noMarketplace": "Ainda não há extensões disponíveis no marketplace", + "count": "{{count}} extensão", + "countPlural": "{{count}} extensões" + }, + "toast": { + "installedAndEnabled": "Extensão instalada e ativada", + "uninstalled": "{{name}} desinstalada", + "uninstallFailed": "Falha ao desinstalar {{name}}", + "searchFailed": "Falha ao buscar no marketplace", + "refreshed": "Extensões atualizadas", + "refreshFailed": "Falha ao atualizar extensões", + "marketplaceInstalled": "{{name}} instalada e ativada", + "marketplaceInstallFailed": "Falha ao instalar {{name}}", + "enableFailed": "Falha ao ativar extensão" + } +} \ No newline at end of file diff --git a/src/i18n/locales/pt-BR/launch.json b/src/i18n/locales/pt-BR/launch.json new file mode 100644 index 00000000..5cc1f066 --- /dev/null +++ b/src/i18n/locales/pt-BR/launch.json @@ -0,0 +1,77 @@ +{ + "recording": { + "disableSystemAudio": "Desativar áudio do sistema", + "enableSystemAudio": "Ativar áudio do sistema", + "disableMicrophone": "Desativar microfone", + "enableMicrophone": "Ativar microfone", + "disableWebcam": "Desativar sobreposição da webcam", + "enableWebcam": "Ativar sobreposição da webcam", + "countdownDelay": "Atraso da contagem regressiva", + "noDelay": "Sem atraso", + "record": "Gravar", + "recordingFolder": "Caminho das gravações: {{path}}", + "chooseRecordingsFolder": "Escolher caminho das 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 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", + "hideFloatingWebcamPreview": "Ocultar prévia flutuante", + "showFloatingWebcamPreview": "Mostrar prévia flutuante", + "selectWebcamToEnable": "Selecione uma webcam para ativar", + "noWebcamsFound": "Nenhuma webcam encontrada", + "recordingsFolder": "Caminho das gravações", + "language": "Idioma", + "paused": "PAUSADO", + "rec": "GRAV", + "resume": "Retomar", + "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": "Há uma atualização disponível." + } + }, + "sourceSelector": { + "loadingSources": "Carregando fontes...", + "screens": "Telas", + "windows": "Janelas", + "noScreensAvailable": "Nenhuma tela disponível", + "noWindowsAvailable": "Nenhuma janela disponível", + "windowsNote": "Apenas janelas visíveis (não minimizadas) podem ser gravadas.", + "windowPlaceholder": "Janela", + "cancel": "Cancelar", + "share": "Compartilhar" + }, + "permissions": { + "screenRecordingNeeded": "O Recordly precisa da permissão de Gravação de Tela antes de iniciar. Ajustes do Sistema foram abertos. Depois de ativar, feche e reabra o Recordly.", + "screenRecordingMissing": "A permissão de Gravação de Tela ainda está ausente. Ajustes do Sistema foram abertos novamente. Ative e depois feche e reabra o Recordly antes de gravar.", + "accessibilityNeeded": "O Recordly também precisa da permissão de Acessibilidade para rastrear o cursor. Ajustes do Sistema foram abertos. Depois de ativar, feche e reabra o Recordly.", + "accessibilityMissing": "A permissão de Acessibilidade ainda está ausente. Ajustes do Sistema foram abertos novamente. Ative e depois feche e reabra o Recordly antes de gravar.", + "selectSource": "Selecione uma fonte para gravar", + "systemAudioUnavailable": "O áudio do sistema não está disponível para esta fonte. A gravação continuará sem áudio do sistema.", + "microphoneDenied": "O 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..dbc21b19 --- /dev/null +++ b/src/i18n/locales/pt-BR/settings.json @@ -0,0 +1,174 @@ +{ + "zoom": { + "level": "Nível de zoom", + "selectRegion": "Selecione uma região de zoom para ajustar", + "deleteZoom": "Excluir zoom", + "modeAuto": "Auto", + "modeManual": "Manual", + "modeManualDescription": "Defina um ponto de foco fixo para este zoom", + "modeAutoDescription": "A câmera segue o cursor automaticamente" + }, + "trim": { + "deleteRegion": "Excluir região de corte" + }, + "speed": { + "playbackSpeed": "Velocidade de reprodução", + "selectRegion": "Selecione uma região de velocidade para ajustar", + "deleteRegion": "Excluir região de velocidade", + "label": "Velocidade" + }, + "clip": { + "title": "Clipe", + "muteAudio": "Silenciar áudio", + "delete": "Excluir clipe" + }, + "effects": { + "title": "Efeitos de vídeo", + "show": "Mostrar", + "showCursor": "Mostrar cursor", + "loopCursor": "Loop do cursor", + "cursorStyle": "Estilo do cursor", + "cursorStyleOptions": { + "tahoe": "Tahoe", + "dot": "Dot", + "figma": "Minimal", + "mono": "Inverted", + "lavender": "Lavender", + "parched": "Parched", + "chooper": "Chooper", + "amongus": "Among Us", + "turtle": "Turtle" + }, + "backgroundBlur": "Desfoque de fundo", + "zoomMotionBlur": "Desfoque de movimento do zoom", + "connectZooms": "Conectar zooms", + "connectZoomsDescription": "Suaviza regiões de zoom consecutivas em um movimento contínuo de câmera.", + "autoApplyFreshRecordingZooms": "Aplicar zooms automaticamente em gravações novas", + "autoApplyFreshRecordingZoomsDescription": "Sugere zooms seguindo o cursor automaticamente ao abrir uma nova gravação.", + "zoomGeneralTitle": "Geral", + "zoomGeneralDescription": "Configurações globais de movimento para cada transição de zoom.", + "zoomInTitle": "Aproximar", + "zoomInDescription": "Controla como a câmera entra em uma região de zoom.", + "zoomOutTitle": "Afastar", + "zoomOutDescription": "Controla como a câmera sai de uma região de zoom.", + "connectedZoomTitle": "Entre zooms", + "connectedZoomDescription": "Ajuste o deslizamento entre regiões de zoom consecutivas quando a conexão estiver ativada.", + "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": "Intervalo entre zooms conectados", + "connectedZoomDuration": "Duração do zoom conectado", + "connectedZoomEasing": "Curva de pan conectado", + "zoomEasingOptions": { + "recordly": "Recordly", + "glide": "Glide", + "smooth": "Smooth", + "snappy": "Snappy", + "linear": "Linear" + }, + "cursorSize": "Tamanho do cursor", + "cursorSmoothing": "Suavização do cursor", + "off": "Desligado", + "cursorMotionBlur": "Desfoque de movimento do cursor", + "cursorClickBounce": "Salto de clique do cursor", + "cursorClickBounceDuration": "Velocidade do salto", + "cursorSway": "Balanço do cursor", + "webcam": "Sobreposição da webcam", + "webcamFootage": "Filmagem da webcam", + "webcamFootageDescription": "Nenhuma filmagem de webcam vinculada a este vídeo", + "uploadWebcamFootage": "Enviar filmagem", + "replaceWebcamFootage": "Substituir filmagem", + "removeWebcamFootage": "Remover filmagem", + "webcamFootageAdded": "Filmagem da webcam vinculada", + "webcamFootageRemoved": "Filmagem da 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": "Corte" + }, + "captions": { + "enabled": "Mostrar", + "language": "Idioma", + "downloading": "Baixando...", + "deleteModel": "Excluir modelo", + "clearModel": "Limpar modelo", + "downloadModel": "Baixar modelo", + "generating": "Gerando...", + "generateFull": "Gerar legendas", + "regenerateFull": "Gerar legendas novamente", + "clearFull": "Limpar legendas", + "fontSettings": "Configurações da fonte", + "defaultFont": "Padrão", + "fontFamily": "Fonte", + "fontSize": "Tamanho da fonte", + "rowCount": "Linhas", + "animation": "Animação", + "animationOff": "Desligado", + "animationFade": "Fade", + "animationRise": "Rise", + "animationPop": "Pop", + "bottomOffset": "Deslocamento inferior", + "maxWidth": "Largura máxima", + "boxRadius": "Raio da caixa", + "backgroundOpacity": "Opacidade do fundo", + "textColor": "Cor do texto" + }, + "crop": { + "title": "Cortar vídeo", + "instruction": "Arraste cada lado para ajustar a área de corte", + "top": "Topo", + "bottom": "Base", + "left": "Esquerda", + "right": "Direita", + "openEditor": "Abrir editor de corte" + }, + "background": { + "title": "Fundo", + "image": "Imagem", + "color": "Cor", + "gradient": "Gradiente", + "wallpaperPreview": "Prévia do papel de parede", + "uploadCustom": "Enviar personalizado", + "uploadSuccess": "Imagem personalizada enviada com sucesso!", + "uploadError": "Envie um arquivo de imagem JPG ou JPEG.", + "uploadErrorDescription": "Somente imagens JPG e JPEG são suportadas." + }, + "export": { + "title": "Exportar", + "mp4": "MP4", + "gif": "GIF", + "quality": { + "low": "Baixa", + "medium": "Média", + "high": "Alta", + "original": "Original" + }, + "fpsTitle": "FPS", + "loop": "Repetir", + "outputDimensions": "Saída: {{dimensions}}px", + "sizePresetOriginalShort": "Orig", + "sizePresetMediumShort": "Med", + "sizePresetLargeShort": "Gra", + "loadProject": "Carregar projeto", + "saveProject": "Salvar projeto", + "exportVideo": "Exportar {{format}}", + "reportBug": "Reportar bug", + "starOnGithub": "Dar estrela 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..cf9d42b2 --- /dev/null +++ b/src/i18n/locales/pt-BR/shortcuts.json @@ -0,0 +1,16 @@ +{ + "actions": { + "addZoom": "Adicionar zoom", + "addTrim": "Adicionar corte", + "addSpeed": "Adicionar velocidade", + "addAnnotation": "Adicionar anotação", + "addKeyframe": "Adicionar quadro-chave", + "deleteSelected": "Excluir selecionado", + "playPause": "Reproduzir / Pausar", + "cycleForward": "Alternar anotações para frente", + "cycleBackward": "Alternar anotações para trás", + "deleteSelectedAlt": "Excluir selecionado (alt)", + "panTimeline": "Mover linha do tempo", + "zoomTimeline": "Zoom da 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..7bd64162 --- /dev/null +++ b/src/i18n/locales/pt-BR/timeline.json @@ -0,0 +1,41 @@ +{ + "zoom": { + "cannotPlace": "Não é possível inserir zoom aqui", + "existsOrNoSpace": "Já existe zoom nesse local ou não há espaço suficiente.", + "suggestHandlerUnavailable": "Manipulador de sugestão de zoom indisponível", + "noTelemetry": "Nenhuma telemetria de cursor disponível", + "recordFirst": "Grave uma captura de tela primeiro para gerar sugestões baseadas no cursor.", + "noUsableTelemetry": "Nenhuma telemetria de cursor utilizável", + "notEnoughMovement": "A gravação não inclui dados suficientes de movimento do cursor.", + "noInteractionMoments": "Nenhum momento claro de interação encontrado", + "tryRecording": "Tente uma gravação com pausas ou cliques em torno de ações importantes.", + "noAutoZoomSlots": "Nenhum espaço de auto-zoom disponível", + "dwellPointsOverlap": "Pontos de permanência detectados se sobrepõem a regiões de zoom existentes.", + "addedSuggestions": "{{count}} sugestão(ões) de zoom por interação adicionada(s)", + "label": "Zoom {{index}}", + "addZoom": "Adicionar zoom (Z)", + "suggestZooms": "Sugerir zooms pelo cursor" + }, + "trim": { + "cannotPlace": "Não é possível inserir corte aqui", + "existsOrNoSpace": "Já existe corte nesse local ou não há espaço suficiente.", + "label": "Corte {{index}}", + "addTrim": "Adicionar corte (T)" + }, + "speed": { + "cannotPlace": "Não é possível inserir velocidade aqui", + "existsOrNoSpace": "Já existe uma região de velocidade nesse local ou não há espaço suficiente.", + "label": "Velocidade" + }, + "annotation": { + "label": "Anotação", + "image": "Imagem", + "addAnnotation": "Adicionar anotação (A)" + }, + "audio": { + "label": "Áudio" + }, + "addSpeed": "Adicionar velocidade (S)", + "resizeLeft": "Redimensionar para a esquerda", + "resizeRight": "Redimensionar para a direita" +}