From 8a9b46ba710c71e37bbcc5ec6cbad5fea3126536 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Wladmir=20J=C3=BAnior?= Date: Sun, 11 Oct 2026 00:44:05 -0300 Subject: [PATCH] pt-BR: translate the panels below the menu bar --- crates/ui-egui/src/i18n/ui.rs | 462 +++++++++++++++++++++++++++++++++- 1 file changed, 459 insertions(+), 3 deletions(-) diff --git a/crates/ui-egui/src/i18n/ui.rs b/crates/ui-egui/src/i18n/ui.rs index f7c77905..3858a29c 100644 --- a/crates/ui-egui/src/i18n/ui.rs +++ b/crates/ui-egui/src/i18n/ui.rs @@ -19,7 +19,7 @@ use std::fmt::Display; use std::sync::OnceLock; thread_local! { - /// The resolved interface language ("en", "ja", "zh-hans", "zh-hant", "uk"); "en" until the first + /// The resolved interface language ("en", "ja", "zh-hans", "zh-hant", "uk", "pt-br"); "en" until the first /// frame sets it. static CURRENT: Cell<&'static str> = const { Cell::new("en") }; } @@ -44,11 +44,13 @@ fn catalog(language: &str) -> Option<&'static Index> { static HANS: OnceLock = OnceLock::new(); static HANT: OnceLock = OnceLock::new(); static UK: OnceLock = OnceLock::new(); + static PT_BR: OnceLock = OnceLock::new(); let (index, rows) = match language { "ja" => (&JA, JAPANESE), "zh-hans" => (&HANS, SIMPLIFIED_CHINESE), "zh-hant" => (&HANT, TRADITIONAL_CHINESE), "uk" => (&UK, UKRAINIAN), + "pt-br" => (&PT_BR, PORTUGUESE), _ => return None, }; Some(index.get_or_init(|| rows.iter().copied().collect())) @@ -1990,6 +1992,440 @@ const UKRAINIAN: &[(&str, &str)] = &[ ("⚠ {} is used by:", "⚠ {} використовується в:"), ]; +// Brazilian Portuguese. +const PORTUGUESE: &[(&str, &str)] = &[ + (" OK ", " OK "), + (" Delete ", " Excluir "), + (" Open Auto-Save ", " Abrir salvamento automático "), + ("(missing)", "(ausente)"), + ("360 View Orientation", "Orientação da vista 360°"), + ("3:2 Pulldown: {}", "Pulldown 3:2: {}"), + ( + "A clean-room, open-source compositor for motion graphics and visual effects: native on macOS, Windows and Linux, and in the browser. Part of the ArtCraft family of creative apps.", + "Um compositor de código aberto, desenvolvido em clean-room, para motion graphics e efeitos visuais: nativo no macOS, Windows e Linux, e no navegador. Parte da família de aplicativos criativos ArtCraft.", + ), + ("About EffectCraft", "Sobre o EffectCraft"), + ("About...", "Sobre..."), + ("Active Camera", "Câmera ativa"), + ("Adapt Feature On Every Frame", "Adaptar o recurso em cada quadro"), + ("Adaptive Sample Limit:", "Limite de amostras adaptativas:"), + ("Add Animator", "Adicionar animador"), + ("Add Comment", "Adicionar comentário"), + ("Add Formatting", "Adicionar formatação"), + ("Add Group", "Adicionar grupo"), + ("Add Mirror", "Adicionar espelho"), + ("Add Selected As", "Adicionar selecionados como"), + ("Add a comment", "Adicionar um comentário"), + ("Add a shape, fill, stroke or path operation", "Adicionar uma forma, preenchimento, traço ou operação de caminho"), + ("Add to Composition", "Adicionar à composição"), + ("Add to Favorites", "Adicionar aos favoritos"), + ("Add:", "Adicionar:"), + ("Adjust Exposure (stops)", "Ajustar exposição (stops)"), + ("Adjust composition duration to the time span of the selected layers", "Ajustar a duração da composição ao intervalo de tempo das camadas selecionadas"), + ("Advanced 3D", "3D avançado"), + ("Align Layers to:", "Alinhar camadas a:"), + ("All six face cameras turn together; the scene is not changed.", "As seis câmeras das faces giram juntas; a cena não é alterada."), + ("Anchor:", "Âncora:"), + ("Aperture", "Abertura"), + ("Apply Dimensions:", "Aplicar dimensões:"), + ("Apply Motion To:", "Aplicar movimento a:"), + ("Arrange", "Organizar"), + ("Assign", "Atribuir"), + ("Auto", "Automático"), + ("Auto-saves", "Salvamentos automáticos"), + ("Back", "Voltar"), + ("Background Color:", "Cor do plano de fundo:"), + ("Blend Mode:", "Modo de mesclagem:"), + ("Blending Mode", "Modo de mesclagem"), + ("Blur", "Desfoque"), + ("Blur Level", "Nível de desfoque"), + ("Browser Storage", "Armazenamento do navegador"), + ("Browse…", "Procurar…"), + ("Brush Dynamics", "Dinâmica do pincel"), + ("Caching frames…", "Armazenando quadros em cache…"), + ("Cancel", "Cancelar"), + ("Casts Shadows", "Projeta sombras"), + ("Change Renderer…", "Alterar renderizador…"), + ( + "Changing a shortcut creates a custom preset; the default stays as it is.", + "Alterar um atalho cria uma predefinição personalizada; a padrão permanece como está.", + ), + ("Channel", "Canal"), + ("Channel:", "Canal:"), + ("Chapter:", "Capítulo:"), + ("Choose...", "Escolher..."), + ("Classic 3D", "3D clássico"), + ("Clear", "Limpar"), + ("Clear list", "Limpar lista"), + ("Click a key to see its commands.", "Clique em uma tecla para ver seus comandos."), + ("Click adds a point (½ height = no change)", "Clique adiciona um ponto (½ altura = sem alteração)"), + ("Click adds a point; drag one off to remove", "Clique adiciona um ponto; arraste um para fora para remover"), + ("Click to make this viewer active", "Clique para tornar este visualizador ativo"), + ("Click to reveal the expression in the timeline", "Clique para revelar a expressão na linha do tempo"), + ("Click to show the active composition here", "Clique para mostrar a composição ativa aqui"), + ("Click, then click in the Composition panel", "Clique e depois clique no painel Composição"), + ("Clone Options", "Opções de clone"), + ("Clone Source Overlay:", "Sobreposição da origem do clone:"), + ("Close", "Fechar"), + ("Close Panel", "Fechar painel"), + ("Close tutorial", "Fechar tutorial"), + ("Color", "Cor"), + ("Color Depth: {}", "Profundidade de cor: {}"), + ("Color:", "Cor:"), + ("Colour map", "Mapa de cores"), + ("Columns", "Colunas"), + ("Comment:", "Comentário:"), + ("Community", "Comunidade"), + ("Composition", "Composição"), + ("Composition Mini-Flowchart", "Minifluxograma da composição"), + ("Composition Name:", "Nome da composição:"), + ("Composition Settings ▸ 3D Renderer", "Configurações da composição ▸ Renderizador 3D"), + ("Composition Settings…", "Configurações da composição…"), + ("Composition marker bin: drag a marker to the time ruler", "Compartimento de marcadores da composição: arraste um marcador para a régua de tempo"), + ("Cone Angle", "Ângulo do cone"), + ("Cone Feather", "Suavização do cone"), + ("Constrain Proportions", "Restringir proporções"), + ("Continuous (Lock Outgoing to Incoming)", "Contínuo (travar saída na entrada)"), + ("Cue Point", "Ponto de cue"), + ("Current Render", "Renderização atual"), + ("Darker", "Mais escuro"), + ("Default Output:", "Saída padrão:"), + ("Default: {}", "Padrão: {}"), + ("Defaults", "Padrões"), + ("Delete", "Excluir"), + ("Delete Selected Points", "Excluir pontos selecionados"), + ("Delete selected project items", "Excluir itens de projeto selecionados"), + ("Delete this template", "Excluir este modelo"), + ("Depth of Field", "Profundidade de campo"), + ("Discord", "Discord"), + ("Distribute Layers:", "Distribuir camadas:"), + ("Don't Recover", "Não recuperar"), + ("Don't Save", "Não salvar"), + ("Double-click a layer to open it in the Layer panel", "Clique duas vezes em uma camada para abri-la no painel Camada"), + ("Double-click footage in the Project panel to open it here", "Clique duas vezes em uma mídia no painel Projeto para abri-la aqui"), + ("Double-click to edit the comment", "Clique duas vezes para editar o comentário"), + ("Download", "Baixar"), + ( + "Drag properties here from the timeline,\nor use Animation > Add Property to Essential Graphics.", + "Arraste propriedades da linha do tempo para cá,\nou use Animação > Adicionar propriedade aos Gráficos essenciais.", + ), + ("Drag to change", "Arraste para alterar"), + ("Drag to create a guide", "Arraste para criar uma guia"), + ("Drag to slip the source", "Arraste para deslizar a origem"), + ("Drop Frame", "Drop frame"), + ("Duplicate", "Duplicar"), + ("Duration:", "Duração:"), + ("Edit Gradient…", "Editar gradiente…"), + ("Edit Target: {}", "Editar destino: {}"), + ("Edit in the Timeline", "Editar na linha do tempo"), + ("EffectCraft didn't quit normally last time.", "O EffectCraft não foi encerrado normalmente da última vez."), + ("Effects & Presets options", "Opções de Efeitos e predefinições"), + ("Effects: {}", "Efeitos: {}"), + ("Empty folder", "Pasta vazia"), + ("Enable Depth of Field", "Ativar profundidade de campo"), + ("Enable Expression", "Ativar expressão"), + ("Enhance", "Aprimorar"), + ("Essential Properties — {}", "Propriedades essenciais: {}"), + ("Event", "Evento"), + ("Export Template…", "Exportar modelo…"), + ("Export...", "Exportar..."), + ("Expression Language Menu", "Menu de linguagem de expressão"), + ("Expression pick whip: drag onto a property", "Pick whip de expressão: arraste até uma propriedade"), + ("Expression:", "Expressão:"), + ("Eyedropper: click, then click in the Composition panel", "Conta-gotas: clique e depois clique no painel Composição"), + ("Falloff", "Atenuação"), + ("Falloff Distance", "Distância de atenuação"), + ("Favorites", "Favoritos"), + ("Field Render: {}", "Renderização de campos: {}"), + ("Figures", "Numerais"), + ("Fill Target", "Destino do preenchimento"), + ("Finished", "Concluído"), + ("Flowchart: {}", "Fluxograma: {}"), + ("Focus Distance", "Distância de foco"), + ("Follow Feature Rotation and Scale", "Acompanhar rotação e escala do recurso"), + ("Footage: {}", "Mídia: {}"), + ("Format: {}", "Formato: {}"), + ("Frame Aspect Ratio: {}", "Proporção do quadro: {}"), + ("Frame Blending: {}", "Mesclagem de quadros: {}"), + ("Frame Rate:", "Taxa de quadros:"), + ("Frame Render Time {}ms", "Tempo de renderização do quadro {}ms"), + ("Frame Target:", "Destino do quadro:"), + ("Grab bag", "Lista"), + ("Grid", "Grade"), + ("Guide Layers: {}", "Camadas de guia: {}"), + ("Guides", "Guias"), + ("Height:", "Altura:"), + ("Hide This", "Ocultar isto"), + ("Histogram", "Histograma"), + ("Hold In Place", "Manter no lugar"), + ("Home", "Início"), + ("If Confidence is Below", "Se a confiança for inferior a"), + ("Import", "Importar"), + ("Import and Add to Composition", "Importar e adicionar à composição"), + ("Import...", "Importar..."), + ("Imported media", "Mídia importada"), + ("Influence:", "Influência:"), + ("Install from File…", "Instalar a partir de arquivo…"), + ("Intensity", "Intensidade"), + ("Inverted", "Invertido"), + ("Join the ArtCraft community on Discord", "Entre na comunidade ArtCraft no Discord"), + ("Key: {}", "Tecla: {}"), + ("LEARN", "APRENDER"), + ("Label", "Rótulo"), + ("Label Colors and Names:", "Cores e nomes dos rótulos:"), + ("Label:", "Rótulo:"), + ("Latest auto-save: {}", "Último salvamento automático: {}"), + ("Layer", "Camada"), + ("Layer controls", "Controles da camada"), + ("Layer {}", "Camada {}"), + ("Layer:", "Camada:"), + ("Layer: {}", "Camada: {}"), + ("Learn", "Aprender"), + ("Leave all attributes in \"{}\"", "Manter todos os atributos em \"{}\""), + ("Licence: {}", "Licença: {}"), + ("Ligatures", "Ligaduras"), + ("Light Type", "Tipo de luz"), + ("Lighter", "Mais claro"), + ("Link Selected Property", "Vincular propriedade selecionada"), + ("Lock Aspect Ratio to {}", "Travar proporção em {}"), + ("Lock to Zoom", "Travar no zoom"), + ("Locked: {} — {}", "Travado: {} / {}"), + ("Log:", "Registro:"), + ("Loop (Trace Path)", "Laço (traçar caminho)"), + ("MIT OR Apache-2.0 • Fonts: Inter, JetBrains Mono (OFL)", "MIT OU Apache-2.0 • Fontes: Inter, JetBrains Mono (OFL)"), + ("Magnification ratio popup", "Menu de proporção de ampliação"), + ("Make Comp Size", "Ajustar ao tamanho da composição"), + ("Masks", "Máscaras"), + ("Maximize Panel", "Maximizar painel"), + ("Media Replacement", "Substituição de mídia"), + ("Mesh:", "Malha:"), + ("Diameter:", "Diâmetro:"), + ("Method Used: {} Average Error: {} pixels", "Método usado: {} Erro médio: {} pixels"), + ("Models folder: {}", "Pasta de modelos: {}"), + ("Modifiers:", "Modificadores:"), + ("More", "Mais"), + ("More ArtCraft apps", "Mais aplicativos ArtCraft"), + ("More tutorials", "Mais tutoriais"), + ("Motion Blur", "Desfoque de movimento"), + ("Motion Blur: {}", "Desfoque de movimento: {}"), + ("Motion Sketch: drag to record", "Motion Sketch: arraste para gravar"), + ("Move Down", "Mover para baixo"), + ("Move Up", "Mover para cima"), + ("Move to Project Root", "Mover para a raiz do projeto"), + ("Name", "Nome"), + ("Name:", "Nome:"), + ("Navigation", "Navegação"), + ("New", "Novo"), + ("New Comp from Selection", "Nova composição a partir da seleção"), + ("New Duration:", "Nova duração:"), + ("New composition name:", "Nome da nova composição:"), + ("New from Render Queue item:", "Novo a partir do item da fila de renderização:"), + ("New from Template", "Novo a partir de modelo"), + ("Next", "Próximo"), + ("Nice work. Pick another tutorial on the Home screen's Learn tab.", "Bom trabalho. Escolha outro tutorial na guia Aprender da tela Início."), + ( + "No VR environments yet. Create one with Composition ▸ VR ▸ Create VR Environment…", + "Nenhum ambiente de RV ainda. Crie um com Composição ▸ RV ▸ Criar ambiente de RV…", + ), + ("No audio layer selected", "Nenhuma camada de áudio selecionada"), + ("No background jobs running", "Nenhuma tarefa em segundo plano em execução"), + ("No composition markers", "Nenhum marcador de composição"), + ("No contributor data was built into this copy.", "Nenhum dado de colaboradores foi incluído nesta cópia."), + ("No device list from this host; the system default output is used.", "Este host não forneceu lista de dispositivos; a saída padrão do sistema é usada."), + ("No layer selected", "Nenhuma camada selecionada"), + ("No matching effects or presets", "Nenhum efeito ou predefinição correspondente"), + ("No matching fonts", "Nenhuma fonte correspondente"), + ("No model credits were built into this copy.", "Nenhum crédito de modelos foi incluído nesta cópia."), + ("No nested compositions", "Nenhuma composição aninhada"), + ("No shortcut", "Sem atalho"), + ("No unlocked layer selected", "Nenhuma camada desbloqueada selecionada"), + ("No video", "Sem vídeo"), + ("None", "Nenhum"), + ("Not applied: tick it in the list to add it.", "Não aplicado: marque-o na lista para adicioná-lo."), + ("Not assigned", "Não atribuído"), + ( + "Note: Shadows are only cast from layers with Cast Shadows enabled.", + "Observação: as sombras só são projetadas por camadas com Projetar sombras ativado.", + ), + ("Notify", "Notificar"), + ("OK", "OK"), + ("Offset:", "Deslocamento:"), + ("On ({}) stop:", "Ao parar ({}):"), + ("One-Node Camera", "Câmera de um nó"), + ("Opacity:", "Opacidade:"), + ("Open Composition", "Abrir composição"), + ("Open Last Saved Project", "Abrir último projeto salvo"), + ("Open New Composition", "Abrir nova composição"), + ("Open Output", "Abrir saída"), + ("Open a composition to build Essential Graphics", "Abra uma composição para criar Gráficos essenciais"), + ("Open a composition to see its scopes", "Abra uma composição para ver seus scopes"), + ("Open a composition to track motion.", "Abra uma composição para rastrear movimento."), + ("Opus Tuning: {}", "Ajuste do Opus: {}"), + ("Original Duration:", "Duração original:"), + ("Output Cycle: {}", "Ciclo de saída: {}"), + ("Output To:", "Saída para:"), + ("Parameter Name:", "Nome do parâmetro:"), + ("Parent pick whip: drag onto a layer", "Pick whip de pai: arraste até uma camada"), + ("Pixel Aspect Ratio:", "Proporção de pixel:"), + ("Playing on Video Preview", "Reproduzindo na visualização de vídeo"), + ("Post-Render Action: {}", "Ação pós-renderização: {}"), + ("Preserve frame rate when nested or in render queue", "Preservar a taxa de quadros quando aninhada ou na fila de renderização"), + ("Preserve resolution when nested", "Preservar a resolução quando aninhada"), + ("Preset", "Predefinição"), + ("Preset:", "Predefinição:"), + ("Presets", "Predefinições"), + ("Previous", "Anterior"), + ("Primary:", "Primário:"), + ("Process Before Match", "Processar antes de corresponder"), + ("Profile: {}", "Perfil: {}"), + ( + "Project color depth: click to cycle 8/16/32 bpc, Alt-click for Project Settings", + "Profundidade de cor do projeto: clique para alternar entre 8/16/32 bpc, Alt+clique para Configurações do projeto", + ), + ("Project: {}", "Projeto: {}"), + ("Projects", "Projetos"), + ("Property pick whip: drag onto a property", "Pick whip de propriedade: arraste até uma propriedade"), + ("Protected Region", "Região protegida"), + ("Proxy Use: {}", "Uso de proxy: {}"), + ("Push All to Comp", "Enviar tudo para a composição"), + ("Radius", "Raio"), + ("Rate Control: {}", "Controle de taxa: {}"), + ("Recent", "Recentes"), + ("Recording", "Gravando"), + ("Remove", "Remover"), + ("Rename", "Renomear"), + ("Render: {} ms • UI {} fps{}", "Renderização: {} ms • IU {} fps{}"), + ("Renderer:", "Renderizador:"), + ("Request Persistent Storage", "Solicitar armazenamento persistente"), + ("Reset", "Redefinir"), + ("Reset Labels", "Redefinir rótulos"), + ("Reset Preset", "Redefinir predefinição"), + ("Reset to Default", "Redefinir para o padrão"), + ("Reset to Saved Layout", "Redefinir para o layout salvo"), + ("Resolution/Down Sample Factor Popup", "Menu de resolução/fator de redução de amostragem"), + ("Restore Panel Size", "Restaurar tamanho do painel"), + ("Reverse the order", "Inverter a ordem"), + ("Revert All", "Reverter tudo"), + ("Roman Hanging Punctuation", "Pontuação romana suspensa"), + ("Roving:", "Roving:"), + ("Ruler zero point (drag to move, double-click to reset)", "Ponto zero da régua (arraste para mover, clique duas vezes para redefinir)"), + ("Rulers", "Réguas"), + ("Run", "Executar"), + ("Sample Format: {}", "Formato da amostra: {}"), + ("Samples Per Frame:", "Amostras por quadro:"), + ("Save from #{}", "Salvar a partir de #{}"), + ("Saved {}", "{} salvo"), + ("Script… (⌘/Ctrl+Enter runs)", "Script… (⌘/Ctrl+Enter executa)"), + ("Search commands or shortcuts", "Pesquisar comandos ou atalhos"), + ("Select", "Selecionar"), + ("Select a command to change its shortcut.", "Selecione um comando para alterar seu atalho."), + ("Select a layer to see its effects", "Selecione uma camada para ver seus efeitos"), + ("Select a layer to see its properties", "Selecione uma camada para ver suas propriedades"), + ("({}) Selected Objects", "({}) objetos selecionados"), + ( + "Select a layer with a mask or shape path (or the path property), or Puppet pins.", + "Selecione uma camada com máscara ou caminho de forma (ou a propriedade de caminho), ou pinos de Puppet.", + ), + ("Select a text layer", "Selecione uma camada de texto"), + ("Select an item in the Project panel", "Selecione um item no painel Projeto"), + ("Select animated properties to show them in the Graph Editor", "Selecione propriedades animadas para exibi-las no Editor de gráficos"), + ( + "Select the leader pin, then Shift-click the pins that should trail it (hair, cloth, tails)", + "Selecione o pino líder e depois Shift+clique nos pinos que devem segui-lo (cabelo, tecido, caudas)", + ), + ("Set Ground Plane and Origin", "Definir plano do solo e origem"), + ("Set Paint Colors to Black and White (D)", "Definir cores de pintura como preto e branco (D)"), + ("Settings", "Configurações"), + ("Settings Name:", "Nome das configurações:"), + ("Shadow Darkness", "Escuridão da sombra"), + ("Shadow Diffusion", "Difusão da sombra"), + ("Shadows", "Sombras"), + ("Shape…", "Forma…"), + ("Show", "Exibir"), + ("Show Layer Name", "Exibir nome da camada"), + ("Show Source Name", "Exibir nome da origem"), + ("Show me", "Mostre-me"), + ("Show:", "Exibir:"), + ("Shutter Angle:", "Ângulo do obturador:"), + ("Shutter Phase:", "Fase do obturador:"), + ("Size", "Tamanho"), + ("Skip", "Ignorar"), + ("Snapping", "Ajuste magnético"), + ("Snapping options", "Opções de ajuste magnético"), + ("Snapshot", "Instantâneo"), + ("Solo Supported Properties", "Solo de propriedades suportadas"), + ("Solo Switches: {}", "Chaves de solo: {}"), + ("Sort", "Ordenar"), + ("Spacing:", "Espaçamento:"), + ("Spatial Interpolation:", "Interpolação espacial:"), + ("Speed:", "Velocidade:"), + ("Start Timecode:", "Timecode inicial:"), + ("Start: {} Duration: {}", "Início: {} Duração: {}"), + ("Step {} of {}: {}", "Etapa {} de {}: {}"), + ("Stop {} at {}°", "Parada {} em {}°"), + ("Stored in: {}", "Armazenado em: {}"), + ("Stretch", "Esticar"), + ("Stretch Factor:", "Fator de esticamento:"), + ("Stylistic Sets", "Conjuntos estilísticos"), + ("Subpixel Positioning", "Posicionamento em subpixel"), + ("Swap Paint Colors (X)", "Trocar cores de pintura (X)"), + ("System Default", "Padrão do sistema"), + ("Table", "Tabela"), + ("Template name", "Nome do modelo"), + ("Template: {}\n{}", "Modelo: {}\n{}"), + ("Temporal Interpolation:", "Interpolação temporal:"), + ("The Media Browser is not available here (use File ▸ Import)", "O Media Browser não está disponível aqui (use Arquivo ▸ Importar)"), + ("The OpenEXR layer shown in red, green, blue and alpha", "A camada OpenEXR exibida em vermelho, verde, azul e alfa"), + ("The render queue is empty.", "A fila de renderização está vazia."), + ("This ScriptUI panel has closed", "Este painel ScriptUI foi fechado"), + ("This change will create a new solid for this layer.", "Esta alteração criará um novo sólido para esta camada."), + ("Time", "Tempo"), + ("Time Stretch…", "Esticamento de tempo…"), + ("Time:", "Tempo:"), + ("Time: {}", "Tempo: {}"), + ("Title/Action Safe", "Área segura de título/ação"), + ("Title/action safe", "Área segura de título/ação"), + ("Toggle Switches / Modes", "Alternar chaves / modos"), + ("Track Name:", "Nome da faixa:"), + ( + "Trained models are available in the desktop app; the browser uses the classic engine.", + "Os modelos treinados estão disponíveis no aplicativo para desktop; o navegador usa o mecanismo clássico.", + ), + ("Transform", "Transformar"), + ("Transparency grid", "Grade de transparência"), + ("Tutorial complete", "Tutorial concluído"), + ("Two-Node Camera", "Câmera de dois nós"), + ("Type", "Tipo"), + ("Type a command or effect…", "Digite um comando ou efeito…"), + ("URL:", "URL:"), + ("Undock Panel", "Desencaixar painel"), + ("Unlink {}", "Desvincular {}"), + ( + "Use this option to place the currently selected layers together into a new intermediate composition.", + "Use esta opção para colocar as camadas selecionadas juntas em uma nova composição intermediária.", + ), + ("VR Environments", "Ambientes de RV"), + ("Value:", "Valor:"), + ("Variable Font Axes", "Eixos da fonte variável"), + ("Video Codec: {}", "Codec de vídeo: {}"), + ("View:", "Exibição:"), + ("Welcome to EffectCraft", "Boas-vindas ao EffectCraft"), + ("Width:", "Largura:"), + ("You can undo this.", "Você pode desfazer isto."), + ("Your changes will be lost if you don't save them.", "Suas alterações serão perdidas se você não as salvar."), + ("Zoom", "Zoom"), + ("built-in", "integrado"), + ("frames per second", "quadros por segundo"), + ("template name", "nome do modelo"), + ("{} contributors · {} commits", "{} colaboradores · {} commits"), + ("{} x {}, {}MB per 8bpc frame", "{} x {}, {}MB por quadro de 8 bpc"), + ("{} — coming soon", "{} em breve"), + ("{} — double-click to open, {}-click to reveal", "{}: clique duas vezes para abrir, {}+clique para revelar"), + ("⌘/Ctrl-drag a pin to record its motion", "⌘/Ctrl+arraste um pino para gravar seu movimento"), + ("▣ {}", "▣ {}"), + ("⚠ {} is used by:", "⚠ {} é usado por:"), +]; + #[cfg(test)] mod tests { use super::*; @@ -2082,7 +2518,14 @@ mod tests { const UNITS: &[&str] = &[" px", "%", "·", "s", "ms", "°", "fps", " bpc", " mm", " s", " %", " pixels"]; fn catalogs() -> Vec<(&'static str, &'static str)> { - JAPANESE.iter().copied().chain(SIMPLIFIED_CHINESE.iter().copied()).chain(TRADITIONAL_CHINESE.iter().copied()).chain(UKRAINIAN.iter().copied()).collect() + JAPANESE + .iter() + .copied() + .chain(SIMPLIFIED_CHINESE.iter().copied()) + .chain(TRADITIONAL_CHINESE.iter().copied()) + .chain(UKRAINIAN.iter().copied()) + .chain(PORTUGUESE.iter().copied()) + .collect() } /// A row that translates nothing, repeats a source string, or changes the number of values the @@ -2093,7 +2536,7 @@ mod tests { let hant: Vec<&str> = TRADITIONAL_CHINESE.iter().map(|(en, _)| *en).collect(); assert_eq!(hans, hant, "the two Chinese catalogs list different source strings"); // Japanese and Ukrainian may lag the Chinese catalogs: a missing row falls back to English. - for (name, cat) in [("Japanese", JAPANESE), ("Ukrainian", UKRAINIAN)] { + for (name, cat) in [("Japanese", JAPANESE), ("Ukrainian", UKRAINIAN), ("Brazilian Portuguese", PORTUGUESE)] { let extra: Vec<&str> = cat.iter().map(|(en, _)| *en).filter(|en| !hans.contains(en)).collect(); assert!(extra.is_empty(), "the {name} catalog lists source strings the Chinese ones don't: {extra:?}"); } @@ -2138,6 +2581,19 @@ mod tests { assert_eq!(tr("Composition Name:"), "Composition Name:"); } + /// Brazilian Portuguese panels translate, fill values in order and keep project content. + #[test] + fn brazilian_portuguese_panels_translate_and_keep_project_content() { + set_current("pt-br"); + assert_eq!(tr("Composition Name:"), "Nome da composição:"); + assert_eq!(tr("Cancel"), "Cancelar"); + assert_eq!(tr("my layer.mp4"), "my layer.mp4"); + assert_eq!(tr_args("Step {} of {}: {}", &[&1, &3, &"Colour"]), "Etapa 1 de 3: Colour"); + assert_eq!(tr(" OK "), " OK "); + set_current("en"); + assert_eq!(tr("Cancel"), "Cancel"); + } + /// Values fill the placeholders in order, and a missing value is dropped instead of panicking. #[test] fn tr_args_fills_values_in_order() {