Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/components/launch/LaunchWindow.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -374,6 +374,7 @@ export function LaunchWindow() {
>
{systemLocaleSuggestion && (
<div
data-hud-interactive="true"
className={`fixed top-8 left-1/2 z-30 w-[calc(100vw-1rem)] max-w-[520px] -translate-x-1/2 rounded-xl border border-white/15 bg-[rgba(20,20,28,0.95)] p-3 shadow-2xl backdrop-blur-xl text-white animate-in fade-in-0 zoom-in-95 duration-200 ${styles.electronNoDrag}`}
>
<div className="text-[13px] font-semibold text-white">
Expand Down
1 change: 1 addition & 0 deletions src/i18n/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ export const SUPPORTED_LOCALES = [
"ar",
"ru",
"vi",
"pt-BR",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Register Portuguese in the Electron main locale list

When users select the newly exposed pt-BR locale, the renderer saves it and calls window.electronAPI.setLocale(newLocale), but the main-process i18n registry still only imports/accepts locales through vi in electron/i18n.ts (setMainLocale silently ignores anything else). In that scenario the HUD/editor text switches to Portuguese while the application menu and tray strings remain in the previous/default language, so this locale needs to be added to the main-process Locale, messages, and allow-list as well.

Useful? React with 👍 / 👎.

] as const;
export const I18N_NAMESPACES = [
"common",
Expand Down
50 changes: 50 additions & 0 deletions src/i18n/locales/pt-BR/common.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
{
"actions": {
"cancel": "Cancelar",
"save": "Salvar",
"delete": "Deletar",
"close": "Fechar",
"share": "Compartilhar",
"done": "Concluir",
"open": "Abrir",
"upload": "Upload",
"export": "Exportar",
"showInFolder": "Mostrar na Pasta",
"file": "Arquivo",
"edit": "Editar",
"view": "Visualizar",
"window": "Janela",
"quit": "Sair",
"stopRecording": "Parar Gravação",
"undo": "Desfazer",
"redo": "Refazer",
"cut": "Recortar",
"copy": "Copiar",
"paste": "Colar",
"selectAll": "Selecionar Tudo",
"minimize": "Minimizar",
"reload": "Recarregar",
"forceReload": "Forçar Recarregar",
"toggleDevTools": "Alternar ferramentas de desenvolvedor",
"actualSize": "Tamanho Original",
"zoomIn": "Aumentar Zoom",
"zoomOut": "Diminuir Zoom",
"toggleFullScreen": "Tela Cheia",
"recordingStatus": "Gravando: {{source}}",
"about": "Sobre o OpenScreen",
"services": "Serviços",
"hide": "Ocultar OpenScreen",
"hideOthers": "Ocultar Outros",
"unhide": "Mostrar Todos"
},
"playback": {
"play": "Play",
"pause": "Pause",
"fullscreen": "Tela Cheia",
"exitFullscreen": "Sair da Tela Cheia"
},
"locale": {
"name": "Português Brasileiro",
"short": "PT-BR"
}
}
71 changes: 71 additions & 0 deletions src/i18n/locales/pt-BR/dialogs.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
{
"export": {
"complete": "Exportação Concluída",
"yourFormatReady": "Seu {{format}} está pronto",
"showInFolder": "Mostrar na Pasta",
"finalizingVideo": "Finalizando exportação do vídeo...",
"compilingGifProgress": "Compilando GIF... {{progress}}%",
"compilingGifWait": "Compilando GIF... Isso pode demorar um pouco",
"takeMoment": "Isso pode levar um momento...",
"failed": "Falha na Exportação",
"tryAgain": "Por favor, tente novamente",
"finalizingVideoTitle": "Finalizando Vídeo",
"compilingGif": "Compilando GIF",
"exportingFormat": "Exportando {{format}}",
"compiling": "Compilando",
"renderingFrames": "Renderizando Quadros",
"processing": "Processando...",
"finalizing": "Finalizando...",
"compilingStatus": "Compilando...",
"status": "Status",
"format": "Formato",
"frames": "Quadros",
"cancelExport": "Cancelar Exportação",
"savedSuccessfully": "{{format}} salvo com sucesso!"
},
"tutorial": {
"triggerLabel": "Como funciona o recorte",
"title": "Como Funciona o Recorte",
"description": "Entendendo como cortar partes indesejadas do seu vídeo.",
"explanationBefore": "A ferramenta de Recorte funciona definindo os segmentos que você deseja",
"remove": "remover",
"explanationMiddle": " — qualquer coisa",
"covered": "coberta",
"explanationAfter": "por um segmento de recorte vermelho será removida quando você exportar.",
"visualExample": "Exemplo Visual",
"removed": "REMOVIDO",
"kept": "Mantido",
"part1": "Parte 1",
"part2": "Parte 2",
"part3": "Parte 3",
"finalVideo": "Vídeo Final",
"step1Title": "1. Adicionar Recorte",
"step1DescriptionBefore": "Pressione ",
"step1DescriptionAfter": " ou clique no ícone da tesoura para marcar uma seção para remoção.",

"step2Title": "2. Ajustar",
"step2Description": "Arraste as bordas da região vermelha para cobrir exatamente o que você deseja cortar."
},
"unsavedChanges": {
"title": "Alterações Não Salvas",
"message": "Você tem alterações não salvas.",
"detail": "Deseja salvar seu projeto antes de fechar?",
"saveAndClose": "Salvar e Fechar",
"discardAndClose": "Descartar e Fechar",
"loadProject": "Carregar Projeto…",
"saveProject": "Salvar Projeto…",
"saveProjectAs": "Salvar Projeto Como…"
},
"fileDialogs": {
"saveGif": "Salvar GIF Exportado",
"saveVideo": "Salvar Vídeo Exportado",
"selectVideo": "Selecionar Arquivo de Vídeo",
"saveProject": "Salvar Projeto OpenScreen",
"openProject": "Abrir Projeto OpenScreen",
"gifImage": "Imagem GIF",
"mp4Video": "Vídeo MP4",
"videoFiles": "Arquivos de Vídeo",
"openscreenProject": "Projeto OpenScreen",
"allFiles": "Todos os Arquivos"
}
}
45 changes: 45 additions & 0 deletions src/i18n/locales/pt-BR/editor.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
{
"newRecording": {
"title": "Voltar ao Gravador",
"description": "Sua sessão atual foi salva.",
"cancel": "Cancelar",
"confirm": "Confirmar"
},
"loadingVideo": "Carregando vídeo...",
"errors": {
"noVideoLoaded": "Nenhum vídeo carregado",
"videoNotReady": "Vídeo não está pronto",
"unableToDetermineSourcePath": "Não foi possível determinar o caminho do vídeo de origem",
"failedToSaveGif": "Falha ao salvar GIF",
"gifExportFailed": "Falha na exportação do GIF",
"failedToSaveVideo": "Falha ao salvar vídeo",
"exportFailed": "Falha na exportação",
"exportFailedWithError": "Falha na exportação: {{error}}",
"exportBackgroundLoadFailed": "Falha na exportação: não foi possível carregar a imagem de fundo ({{url}})",
"failedToSaveExport": "Falha ao salvar exportação",
"failedToSaveExportedVideo": "Falha ao salvar vídeo exportado",
"failedToRevealInFolder": "Erro ao mostrar na pasta: {{error}}"
},
"export": {
"canceled": "Exportação cancelada",
"exportedSuccessfully": "{{format}} exportado com sucesso"
},
"project": {
"saveCanceled": "Salvamento do projeto cancelado",
"failedToSave": "Falha ao salvar o projeto",
"savedTo": "Projeto salvo em {{path}}",
"failedToLoad": "Falha ao carregar o projeto",
"invalidFormat": "Formato de arquivo de projeto inválido",
"loadedFrom": "Projeto carregado de {{path}}"
},
"recording": {
"failedCameraAccess": "Falha ao solicitar acesso à câmera.",
"cameraBlocked": "O acesso à câmera está bloqueado. Ative-o nas configurações do sistema para usar a webcam.",
"systemAudioUnavailable": "Áudio do sistema não disponível. Gravando sem áudio do sistema.",
"microphoneDenied": "Acesso ao microfone negado. A gravação continuará sem áudio.",
"cameraDenied": "Acesso à câmera negado. A gravação continuará sem webcam.",
"cameraDisconnected": "Webcam desconectada.",
"cameraNotFound": "Câmera não encontrada.",
"permissionDenied": "Permissão de gravação negada. Por favor, permita a gravação de tela."
}
}
47 changes: 47 additions & 0 deletions src/i18n/locales/pt-BR/launch.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
{
"tooltips": {
"hideHUD": "Ocultar HUD",
"closeApp": "Fechar App",
"restartRecording": "Reiniciar gravação",
"cancelRecording": "Cancelar gravação",
"pauseRecording": "Pausar gravação",
"resumeRecording": "Retomar gravação",
"openVideoFile": "Abrir arquivo de vídeo",
"openProject": "Abrir projeto"
},
"audio": {
"enableSystemAudio": "Ativar áudio do sistema",
"disableSystemAudio": "Desativar áudio do sistema",
"enableMicrophone": "Ativar microfone",
"disableMicrophone": "Desativar microfone",
"defaultMicrophone": "Microfone Padrão"
},
"webcam": {
"enableWebcam": "Ativar webcam",
"disableWebcam": "Desativar webcam",
"defaultCamera": "Câmera Padrão",
"searching": "Procurando...",
"noneFound": "Nenhuma câmera encontrada",
"unavailable": "Câmera indisponível"
},
"cursor": {
"useEditableCursor": "Usar cursor editável",
"useSystemCursor": "Usar cursor do sistema"
},
"sourceSelector": {
"loading": "Carregando fontes...",
"screens": "Telas ({{count}})",
"windows": "Janelas ({{count}})",
"defaultSourceName": "Tela"
},
"recording": {
"selectSource": "Por favor, selecione uma fonte para gravar"
},
"language": "Idioma",
"systemLanguagePrompt": {
"title": "Usar o idioma do seu sistema?",
"description": "Detectamos {{language}} como o idioma do seu sistema. Deseja mudar o OpenScreen para {{language}}?",
"switch": "Mudar para {{language}}",
"keepDefault": "Manter idioma atual"
}
}
Loading
Loading