Files
SnapOtter/packages/shared/src/i18n/pt-BR.ts
T
SnapOtterandGitHub b4375e558d fix: harden install queue/dispatcher lifecycle and repair review-sweep regressions (#395)
Fixes 15 defects found by a max-effort multi-agent review of the last 6
merged PRs (#388, #390, #391, #392, #393, #394), all adversarially
verified before fixing.

Install queue + dispatcher (the serious cluster):

- features.ts: finalize the installer child exactly once. A failed spawn
  fires both "error" and "close", and the second event released the file
  lock and active slot that pump() had just handed to the next queued
  bundle, letting two pip processes write the same venv concurrently.
  Outcome recording now happens before pump() so the next bundle's first
  progress frame cannot race the previous install's bookkeeping.
- feature-status.ts: keep failed-install errors in a per-bundle map
  instead of the single progress slot. With the queue auto-starting the
  next install, the slot was overwritten within seconds and a failed
  install vanished without ever surfacing to GET /features.
- bridge.ts: scope child lifecycle per process (stopped-children set +
  request generation tags) instead of an instance-wide shuttingDown flag
  that the next spawn reset. A stale SIGTERMed child's late close event
  could record a phantom crash (5 of which permanently disable the
  dispatcher), null out the freshly spawned child, and reject the new
  child's pending requests. The request-timeout kill path still counts
  as a real crash.
- install_feature.py: the pre-write disk re-check measured ai_dir's
  filesystem even when budgeting the cross-filesystem copy that lands on
  the venv's disk; now each budget is checked against the filesystem the
  bytes actually land on, so ENOSPC cannot strike mid-write and leave
  site-packages half overwritten.

Behavior regressions:

- embed-subtitles: preserve pre-existing subtitle tracks (0:s?) and MKV
  attachments (0:t?) that the -map 0:v:0/0:a? rewrite silently dropped;
  data streams stay unmapped on purpose (the actual MPEG remux fix). The
  new subtitle maps first so the language tag hits the right stream.
- usage-survey-overlay: fail closed when the settings fetch fails; the
  fail-open path rendered the blocking survey against an unhealthy API
  and soft-locked admins, the lock-out class #392 fixed.
- features-store: queued bundles poll instead of each holding an SSE
  connection (Install All could pin 7 EventSources and exhaust the
  browser's 6-per-origin HTTP/1.1 limit, hanging the whole app);
  listenToProgress closes any prior stream and stops any poll before
  subscribing; installAll skips bundles already installing or queued.

Contracts, tests, i18n:

- openapi.yaml: add "queued" to the features status enum and document
  downloadBytes/installedBytes (Schemathesis conformance).
- feature-lifecycle e2e: queue transcription (~0.5 GB) instead of ocr
  (~6 GB) and give the test a budget that covers both install drains
  (the stacked waits exceeded the old 900s timeout).
- docker-compose.qa.yml: parameterize the host port (QA_APP_PORT) so
  QA_PROJECT_NAME concurrent stacks can actually bind.
- compare + watermark-image: restore per-input error attribution
  ("Invalid first/second image", "Invalid watermark image") lost in the
  shared-handler migration.
- ai-features-section: the "{size} on disk" suffix now goes through
  i18n; key added to all 21 locales.
- watermark-image + content-aware-resize: migrate to the shared
  inputHandlerFor("image") chain like compare/vectorize/compose, fixing
  drift in the inline copies (no SVG sanitize, no RAW extension hint,
  no AVIF probe).

Verified: typecheck across 9 workspaces, Biome clean on all changed
files, 584 targeted unit tests and 249 integration tests green
(including real-ffmpeg embed-subtitles runs). One unit test updated to
the new poll-while-queued contract with a single-EventSource assertion.

Claude-Session: https://claude.ai/code/session_017mR1HiHaf3a1BmUtrHX4j3
2026-07-03 13:47:15 +08:00

3977 lines
142 KiB
TypeScript

import type { TranslationKeys } from "./en.js";
export const ptBR: TranslationKeys = {
common: {
upload: "Enviar do computador",
process: "Processar",
download: "Baixar",
cancel: "Cancelar",
save: "Salvar",
delete: "Excluir",
settings: "Configurações",
search: "Buscar ferramentas...",
dropFiles: "Arraste arquivos aqui ou clique no botão de envio",
loading: "Carregando...",
saving: "Salvando...",
error: "Ocorreu um erro",
confirm: "Confirmar",
close: "Fechar",
back: "Voltar",
next: "Próximo",
clear: "Limpar",
copy: "Copiar",
copied: "Copiado!",
noResults: "Nenhum resultado encontrado",
showLess: "Mostrar menos",
showMore: "Mostrar mais {count}",
experimental: "Experimental",
enabled: "Ativado",
disabled: "Desativado",
rename: "Renomear",
edit: "Editar",
actions: "Ações",
create: "Criar",
or: "ou",
goHome: "Ir para o início",
somethingWentWrong: "Algo deu errado",
unexpectedError: "Ocorreu um erro inesperado.",
retry: "Tentar novamente",
privacyPolicy: "Política de privacidade",
pageNotFound: "Página não encontrada",
pageNotFoundDescription: "A página que você procura não existe ou foi movida.",
},
feedback: {
navLabel: "Share feedback",
dialogTitle: "Share feedback",
toolDialogTitle: "How did this tool work?",
failedDialogTitle: "Report a tool issue",
adminDialogTitle: "How was setup?",
closeLabel: "Close feedback dialog",
privacyNote:
"Feedback is sent only when you submit it. SnapOtter does not include your files, file contents, file names, or private outputs.",
typeLabel: "Feedback type",
sentimentLabel: "Quick rating",
messageLabel: "Feedback",
messagePlaceholder: "Tell us what worked, what broke, or what would make SnapOtter better.",
improveFirstLabel: "What should we improve first?",
improveFirstPlaceholder: "Tell us what made setup harder than it should be.",
contactOkLabel: "You can contact me about this feedback.",
emailPlaceholder: "Email (optional)",
namePlaceholder: "Name (optional)",
companyPlaceholder: "Company or org (optional)",
submit: "Send feedback",
submitting: "Sending...",
submitFailed: "Feedback could not be sent. Please try again.",
searchMissTitle: "Solicitar uma ferramenta",
searchMissContext: "Você pesquisou: {query}",
searchMissDiscussionsFallback:
"Não conseguimos registrar. Abra uma solicitação no Discussions.",
thanksTitle: "Thanks for the feedback.",
thanksDescription: "It helps us improve SnapOtter without collecting files or private content.",
quickThanks: "Thanks for the signal.",
reportIssue: "Report issue",
toolPromptTitle: "How did this tool work?",
toolPromptDescription: "One quick signal helps us improve SnapOtter.",
dismissPrompt: "Dismiss feedback prompt",
workedWell: "Worked well",
dontAskAgain: "Don't ask again",
shareFeedback: "Share feedback",
remindLater: "Remind me later",
adminCardTitle: "How was setup?",
adminCardDescription:
"A quick note from admins helps us improve Docker, source installs, and docs.",
installMethodLabel: "Install method",
frictionAreaLabel: "Hardest setup area",
importantAreasLabel: "Most important areas",
sentiments: {
great: "Great",
okay: "Okay",
issue: "Had an issue",
missing: "Missing something",
bug: "Bug",
idea: "Idea",
other: "Other",
},
types: {
bug: "Bug",
feature_request: "Feature request",
confusing_ux: "Confusing UX",
performance: "Performance",
other: "Other",
},
installMethods: {
docker: "Docker",
docker_compose: "Docker Compose",
source: "Built from source",
cloud: "Cloud/demo",
other: "Other",
},
usageTypes: {
personal: "Só eu",
team_internal: "Equipe pequena",
business_workflow: "Empresa ou organização",
education: "Education",
evaluating: "Evaluating",
},
frictionAreas: {
smooth: "Nothing, setup was smooth",
docker: "Docker/container setup",
environment_variables: "Environment variables",
auth: "Authentication/SSO",
storage: "Storage/uploads",
workers: "Workers/queues",
ai_tools: "AI tools",
docs: "Documentation",
performance: "Performance/resources",
other: "Other",
},
importantAreas: {
images: "Images",
pdf_docs: "PDF/docs",
video_audio: "Video/audio",
batch_workflows: "Batch workflows",
ai_tools: "AI tools",
},
},
onboarding: {
usageSurveyTitle: "Como você usa o SnapOtter?",
usageSurveyToolsLabel: "O que é mais importante para você?",
pickAnyHint: "(escolha quantas quiser)",
continueLabel: "Continuar",
},
categories: {
essentials: "Essenciais",
adjustments: "Ajustes",
enhance: "Aprimorar & AI",
watermark: "Marca d'água e sobreposição",
layout: "Layout e composição",
utilities: "Utilitários",
optimization: "Otimização",
format: "Formato e conversão",
"video-edit": "Vídeo",
"video-convert": "Converter",
"video-effects": "Efeitos & Composição",
"video-subtitles": "Legendas",
"video-metadata": "Metadados",
"audio-edit": "Editar",
"audio-convert": "Converter",
"audio-effects": "Efeitos & Composição",
"audio-metadata": "Metadados",
"pdf-organize": "Organizar",
"pdf-edit": "Editar & Anotar",
"pdf-security": "Segurança",
"pdf-optimize": "Otimizar",
"doc-convert": "Converter",
data: "Arquivos",
archives: "Compactados",
},
modalities: {
image: "Imagem",
video: "Vídeo",
audio: "Áudio",
documentsAndFiles: "PDF & Arquivos",
},
tools: {
// BEGIN conversion-presets (generated by scripts/generate-conversion-i18n.mjs)
"jpg-to-png": {
name: "JPG para PNG",
description: "Converta JPG para PNG online. Rápido, grátis e privado.",
},
"png-to-jpg": {
name: "PNG para JPG",
description: "Converta PNG para JPG online. Rápido, grátis e privado.",
},
"jpg-to-webp": {
name: "JPG para WebP",
description: "Converta JPG para WebP online. Rápido, grátis e privado.",
},
"png-to-webp": {
name: "PNG para WebP",
description: "Converta PNG para WebP online. Rápido, grátis e privado.",
},
"webp-to-jpg": {
name: "WebP para JPG",
description: "Converta WebP para JPG online. Rápido, grátis e privado.",
},
"webp-to-png": {
name: "WebP para PNG",
description: "Converta WebP para PNG online. Rápido, grátis e privado.",
},
"jpg-to-avif": {
name: "JPG para AVIF",
description: "Converta JPG para AVIF online. Rápido, grátis e privado.",
},
"png-to-avif": {
name: "PNG para AVIF",
description: "Converta PNG para AVIF online. Rápido, grátis e privado.",
},
"webp-to-avif": {
name: "WebP para AVIF",
description: "Converta WebP para AVIF online. Rápido, grátis e privado.",
},
"heic-to-jpg": {
name: "HEIC para JPG",
description: "Converta HEIC para JPG online. Rápido, grátis e privado.",
},
"heic-to-png": {
name: "HEIC para PNG",
description: "Converta HEIC para PNG online. Rápido, grátis e privado.",
},
"heic-to-avif": {
name: "HEIC para AVIF",
description: "Converta HEIC para AVIF online. Rápido, grátis e privado.",
},
"jpg-to-gif": {
name: "JPG para GIF",
description: "Converta JPG para GIF online. Rápido, grátis e privado.",
},
"png-to-gif": {
name: "PNG para GIF",
description: "Converta PNG para GIF online. Rápido, grátis e privado.",
},
"gif-to-jpg": {
name: "GIF para JPG",
description: "Converta GIF para JPG online. Rápido, grátis e privado.",
},
"gif-to-png": {
name: "GIF para PNG",
description: "Converta GIF para PNG online. Rápido, grátis e privado.",
},
"webp-to-gif": {
name: "WebP para GIF",
description: "Converta WebP para GIF online. Rápido, grátis e privado.",
},
"jpg-to-tiff": {
name: "JPG para TIFF",
description: "Converta JPG para TIFF online. Rápido, grátis e privado.",
},
"png-to-tiff": {
name: "PNG para TIFF",
description: "Converta PNG para TIFF online. Rápido, grátis e privado.",
},
"tiff-to-jpg": {
name: "TIFF para JPG",
description: "Converta TIFF para JPG online. Rápido, grátis e privado.",
},
"tiff-to-png": {
name: "TIFF para PNG",
description: "Converta TIFF para PNG online. Rápido, grátis e privado.",
},
"psd-to-jpg": {
name: "PSD para JPG",
description: "Converta PSD para JPG online. Rápido, grátis e privado.",
},
"psd-to-png": {
name: "PSD para PNG",
description: "Converta PSD para PNG online. Rápido, grátis e privado.",
},
"png-to-eps": {
name: "PNG para EPS",
description: "Converta PNG para EPS online. Rápido, grátis e privado.",
},
"jpg-to-eps": {
name: "JPG para EPS",
description: "Converta JPG para EPS online. Rápido, grátis e privado.",
},
"eps-to-png": {
name: "EPS para PNG",
description: "Converta EPS para PNG online. Rápido, grátis e privado.",
},
"eps-to-jpg": {
name: "EPS para JPG",
description: "Converta EPS para JPG online. Rápido, grátis e privado.",
},
"png-to-svg": {
name: "PNG para SVG",
description: "Converta PNG para SVG online. Rápido, grátis e privado.",
},
"jpg-to-svg": {
name: "JPG para SVG",
description: "Converta JPG para SVG online. Rápido, grátis e privado.",
},
"tiff-to-svg": {
name: "TIFF para SVG",
description: "Converta TIFF para SVG online. Rápido, grátis e privado.",
},
"psd-to-svg": {
name: "PSD para SVG",
description: "Converta PSD para SVG online. Rápido, grátis e privado.",
},
"eps-to-svg": {
name: "EPS para SVG",
description: "Converta EPS para SVG online. Rápido, grátis e privado.",
},
"svg-to-png": {
name: "SVG para PNG",
description: "Converta SVG para PNG online. Rápido, grátis e privado.",
},
"svg-to-jpg": {
name: "SVG para JPG",
description: "Converta SVG para JPG online. Rápido, grátis e privado.",
},
"jpg-to-pdf": {
name: "JPG para PDF",
description: "Converta JPG para PDF online. Rápido, grátis e privado.",
},
"png-to-pdf": {
name: "PNG para PDF",
description: "Converta PNG para PDF online. Rápido, grátis e privado.",
},
"heic-to-pdf": {
name: "HEIC para PDF",
description: "Converta HEIC para PDF online. Rápido, grátis e privado.",
},
"tiff-to-pdf": {
name: "TIFF para PDF",
description: "Converta TIFF para PDF online. Rápido, grátis e privado.",
},
"webp-to-pdf": {
name: "WebP para PDF",
description: "Converta WebP para PDF online. Rápido, grátis e privado.",
},
"gif-to-pdf": {
name: "GIF para PDF",
description: "Converta GIF para PDF online. Rápido, grátis e privado.",
},
"eps-to-pdf": {
name: "EPS para PDF",
description: "Converta EPS para PDF online. Rápido, grátis e privado.",
},
"pdf-to-jpg": {
name: "PDF para JPG",
description: "Converta PDF para JPG online. Rápido, grátis e privado.",
},
"pdf-to-png": {
name: "PDF para PNG",
description: "Converta PDF para PNG online. Rápido, grátis e privado.",
},
"pdf-to-tiff": {
name: "PDF para TIFF",
description: "Converta PDF para TIFF online. Rápido, grátis e privado.",
},
"mov-to-mp4": {
name: "MOV para MP4",
description: "Converta MOV para MP4 online. Rápido, grátis e privado.",
},
"webm-to-mp4": {
name: "WEBM para MP4",
description: "Converta WEBM para MP4 online. Rápido, grátis e privado.",
},
"mkv-to-mp4": {
name: "MKV para MP4",
description: "Converta MKV para MP4 online. Rápido, grátis e privado.",
},
"avi-to-mp4": {
name: "AVI para MP4",
description: "Converta AVI para MP4 online. Rápido, grátis e privado.",
},
"mp4-to-mov": {
name: "MP4 para MOV",
description: "Converta MP4 para MOV online. Rápido, grátis e privado.",
},
"mp4-to-webm": {
name: "MP4 para WEBM",
description: "Converta MP4 para WEBM online. Rápido, grátis e privado.",
},
"webm-to-mov": {
name: "WEBM para MOV",
description: "Converta WEBM para MOV online. Rápido, grátis e privado.",
},
"mkv-to-mov": {
name: "MKV para MOV",
description: "Converta MKV para MOV online. Rápido, grátis e privado.",
},
"avi-to-mov": {
name: "AVI para MOV",
description: "Converta AVI para MOV online. Rápido, grátis e privado.",
},
"mp4-to-avi": {
name: "MP4 para AVI",
description: "Converta MP4 para AVI online. Rápido, grátis e privado.",
},
"mov-to-avi": {
name: "MOV para AVI",
description: "Converta MOV para AVI online. Rápido, grátis e privado.",
},
"mkv-to-avi": {
name: "MKV para AVI",
description: "Converta MKV para AVI online. Rápido, grátis e privado.",
},
"avi-to-mkv": {
name: "AVI para MKV",
description: "Converta AVI para MKV online. Rápido, grátis e privado.",
},
"mp4-to-gif": {
name: "MP4 para GIF",
description: "Converta MP4 para GIF online. Rápido, grátis e privado.",
},
"mov-to-gif": {
name: "MOV para GIF",
description: "Converta MOV para GIF online. Rápido, grátis e privado.",
},
"mkv-to-gif": {
name: "MKV para GIF",
description: "Converta MKV para GIF online. Rápido, grátis e privado.",
},
"avi-to-gif": {
name: "AVI para GIF",
description: "Converta AVI para GIF online. Rápido, grátis e privado.",
},
"gif-to-mp4": {
name: "GIF para MP4",
description: "Converta GIF para MP4 online. Rápido, grátis e privado.",
},
"gif-to-webm": {
name: "GIF para WEBM",
description: "Converta GIF para WEBM online. Rápido, grátis e privado.",
},
"gif-to-mov": {
name: "GIF para MOV",
description: "Converta GIF para MOV online. Rápido, grátis e privado.",
},
"mp4-to-mp3": {
name: "MP4 para MP3",
description: "Converta MP4 para MP3 online. Rápido, grátis e privado.",
},
"mov-to-mp3": {
name: "MOV para MP3",
description: "Converta MOV para MP3 online. Rápido, grátis e privado.",
},
"mkv-to-mp3": {
name: "MKV para MP3",
description: "Converta MKV para MP3 online. Rápido, grátis e privado.",
},
"webm-to-mp3": {
name: "WEBM para MP3",
description: "Converta WEBM para MP3 online. Rápido, grátis e privado.",
},
"avi-to-mp3": {
name: "AVI para MP3",
description: "Converta AVI para MP3 online. Rápido, grátis e privado.",
},
"mp4-to-wav": {
name: "MP4 para WAV",
description: "Converta MP4 para WAV online. Rápido, grátis e privado.",
},
"mov-to-wav": {
name: "MOV para WAV",
description: "Converta MOV para WAV online. Rápido, grátis e privado.",
},
"mp4-to-ogg": {
name: "MP4 para OGG",
description: "Converta MP4 para OGG online. Rápido, grátis e privado.",
},
"m4a-to-mp3": {
name: "M4A para MP3",
description: "Converta M4A para MP3 online. Rápido, grátis e privado.",
},
"m4a-to-wav": {
name: "M4A para WAV",
description: "Converta M4A para WAV online. Rápido, grátis e privado.",
},
"aac-to-mp3": {
name: "AAC para MP3",
description: "Converta AAC para MP3 online. Rápido, grátis e privado.",
},
"aac-to-wav": {
name: "AAC para WAV",
description: "Converta AAC para WAV online. Rápido, grátis e privado.",
},
"aac-to-flac": {
name: "AAC para FLAC",
description: "Converta AAC para FLAC online. Rápido, grátis e privado.",
},
"ogg-to-mp3": {
name: "OGG para MP3",
description: "Converta OGG para MP3 online. Rápido, grátis e privado.",
},
"ogg-to-wav": {
name: "OGG para WAV",
description: "Converta OGG para WAV online. Rápido, grátis e privado.",
},
"wav-to-mp3": {
name: "WAV para MP3",
description: "Converta WAV para MP3 online. Rápido, grátis e privado.",
},
"mp3-to-wav": {
name: "MP3 para WAV",
description: "Converta MP3 para WAV online. Rápido, grátis e privado.",
},
"flac-to-mp3": {
name: "FLAC para MP3",
description: "Converta FLAC para MP3 online. Rápido, grátis e privado.",
},
"excel-to-csv": {
name: "Excel para CSV",
description: "Converta Excel para CSV online. Rápido, grátis e privado.",
},
// END conversion-presets
resize: {
name: "Redimensionar",
description: "Redimensione por pixels, porcentagem ou presets de redes sociais",
},
crop: {
name: "Cortar",
description: "Corte livre, proporções predefinidas, corte por forma",
},
rotate: {
name: "Girar e espelhar",
description: "Gire, espelhe e endireite imagens",
},
convert: { name: "Converter", description: "Converta entre formatos de imagem" },
compress: {
name: "Comprimir",
description: "Reduza o tamanho do arquivo por qualidade ou tamanho alvo",
},
"optimize-for-web": {
name: "Otimizar para web",
description:
"Otimize imagens para web com conversão de formato, controle de qualidade e visualização ao vivo",
},
"strip-metadata": {
name: "Remover metadados",
description: "Remova EXIF, GPS e informações da câmera",
},
"edit-metadata": {
name: "Editar metadados",
description: "Edite EXIF, IPTC, XMP, GPS, palavras-chave e datas",
},
"bulk-rename": {
name: "Renomear em lote",
description: "Renomeie vários arquivos com padrões",
},
"image-to-pdf": {
name: "Imagem para PDF",
description: "Combine imagens em um documento PDF",
},
"pdf-to-image": {
name: "PDF para imagem",
description: "Converta páginas de PDF em imagens",
},
favicon: {
name: "Gerador de Favicon",
description: "Gere todos os tamanhos de favicon e ícones de app",
},
"adjust-colors": {
name: "Ajustar cores",
description: "Brilho, contraste, exposição, saturação, temperatura, nitidez e efeitos",
},
sharpening: {
name: "Nitidez",
description: "Nitidez adaptativa, máscara de desfoque e passa-alta com presets",
},
"replace-color": {
name: "Substituir e inverter cor",
description: "Substitua cores específicas ou inverta",
},
"color-blindness": {
name: "Simulação de daltonismo",
description:
"Simule como as imagens aparecem com diferentes tipos de deficiência na visão de cores",
},
"remove-background": {
name: "Remover fundo",
description: "Remoção de fundo com AI",
},
upscale: {
name: "Ampliar imagem",
description: "Melhoria por super-resolução com AI",
},
"erase-object": {
name: "Apagador de objetos",
description: "Remova objetos indesejados com AI",
},
ocr: {
name: "Extrair texto de imagem (OCR)",
description: "Extraia texto de imagens com precisão alimentada por AI",
},
"ocr-pdf": {
name: "OCR de PDF",
description: "Extraia texto de documentos PDF com OCR baseado em IA",
},
"blur-faces": {
name: "Desfocar rostos / dados sensíveis",
description: "Detecte e desfoque automaticamente rostos e informações sensíveis",
},
"enhance-faces": {
name: "Melhoria de rostos",
description: "Restaure e melhore rostos com AI",
},
"smart-crop": {
name: "Corte inteligente",
description: "Corte inteligente por assunto, rosto ou bordas",
},
"image-enhancement": {
name: "Melhoria de imagem",
description:
"Melhoria automática com um clique: exposição, contraste, cor e nitidez inteligentes",
},
"noise-removal": {
name: "Remoção de ruído",
description: "Remoção de ruído e granulação com AI",
},
"red-eye-removal": {
name: "Remoção de olhos vermelhos",
description: "Detecção e correção de olhos vermelhos com AI para fotos com flash",
},
"restore-photo": {
name: "Restauração de fotos",
description: "Repare arranhões, rasgos e danos em fotos antigas com AI",
},
"content-aware-resize": {
name: "Redimensionamento inteligente",
description: "Redimensione imagens de forma inteligente preservando o conteúdo importante",
},
"ai-canvas-expand": {
name: "Expansão de canvas com AI",
description: "Expanda o canvas com preenchimento gerado por AI",
},
colorize: {
name: "Colorização com AI",
description:
"Converta fotos em preto e branco para coloridas usando modelos de aprendizado profundo com AI",
},
"passport-photo": {
name: "Foto para documento",
description:
"Crie fotos para passaporte, visto e identidade em conformidade com os requisitos oficiais, com detecção automática de rosto",
},
"transcribe-audio": {
name: "Transcrever áudio",
description: "Converta fala em texto com transcrição baseada em IA",
},
"auto-subtitles": {
name: "Legendas automáticas",
description: "Gere arquivos de legenda a partir de faixas de áudio de vídeo",
},
"transparency-fixer": {
name: "Corretor de transparência PNG",
description: "Corrija PNGs com transparência falsa em um clique",
},
"background-replace": {
name: "Substituir fundo",
description: "Substituir o fundo da imagem por uma cor sólida",
},
"blur-background": {
name: "Desfocar fundo",
description: "Desfoca o fundo mantendo o objeto em foco",
},
"watermark-text": {
name: "Marca d'água de texto",
description: "Adicione uma marca d'água de texto em sobreposição",
},
"watermark-image": {
name: "Marca d'água de imagem",
description: "Sobreponha um logo como marca d'água",
},
"text-overlay": {
name: "Texto sobreposto",
description: "Adicione texto estilizado às imagens",
},
compose: {
name: "Composição de imagem",
description: "Sobreponha imagens com posição e opacidade",
},
"meme-generator": {
name: "Gerador de Meme",
description:
"Crie memes com modelos populares ou suas próprias imagens. Texto clássico estilo Impact com fontes, cores e posicionamento personalizáveis.",
},
info: {
name: "Info da imagem",
description: "Veja todos os metadados e propriedades da imagem",
},
compare: {
name: "Comparar imagens",
description: "Comparação lado a lado de duas imagens",
},
"find-duplicates": {
name: "Encontrar duplicatas",
description: "Detecte imagens duplicadas e quase duplicadas",
},
"color-palette": {
name: "Paleta de cores",
description: "Extraia as cores dominantes de uma imagem",
},
"qr-generate": {
name: "Gerador de códigos QR",
description: "Gere códigos QR estilizados com cores, padrões e logos personalizados",
},
"html-to-image": {
name: "HTML para Imagem",
description: "Capture páginas da web como imagens de alta qualidade",
},
"barcode-read": {
name: "Leitor de códigos de barras",
description: "Escaneie imagens em busca de códigos QR, códigos de barras e códigos 2D",
},
collage: {
name: "Collage / Grade",
description: "Combine imagens em belos collages com mais de 25 modelos",
},
stitch: {
name: "Juntar / Combinar",
description: "Junte imagens lado a lado, empilhadas ou em grade",
},
split: {
name: "Divisão de imagem",
description: "Divida imagens em grade ou por tamanho em pixels com visualização ao vivo",
},
border: {
name: "Borda e moldura",
description:
"Adicione bordas, preenchimento, cantos arredondados e sombras com presets de um clique",
},
beautify: {
name: "Embelezar captura de tela",
description:
"Adicione fundos degradados, molduras de dispositivo, sombras e tamanhos para redes sociais às capturas de tela",
},
"circle-crop": {
name: "Recorte Circular",
description: "Recorte a imagem em um círculo centralizado com cantos transparentes",
},
duotone: {
name: "Duotone",
description: "Aplique um efeito duotone com cores personalizadas de sombra e destaque",
},
"image-pad": {
name: "Preenchimento de Imagem",
description: "Preencha a imagem até uma proporção alvo com fundo de cor sólida",
},
pixelate: {
name: "Pixelar",
description: "Aplique um efeito de pixelização na imagem inteira ou em uma região específica",
},
vignette: {
name: "Vinheta",
description: "Adicione um efeito de vinheta com intensidade e cor ajustáveis",
},
"gif-webp": {
name: "Conversor GIF/WebP",
description: "Converta GIF animado para WebP e vice-versa, preservando todos os quadros",
},
histogram: {
name: "Histograma",
description: "Gere um gráfico de histograma RGB a partir de uma imagem",
},
"lqip-placeholder": {
name: "Placeholder LQIP",
description:
"Gere um placeholder de imagem minúsculo de baixa qualidade com URI de dados base64",
},
"sprite-sheet": {
name: "Sprite Sheet",
description: "Combine várias imagens em uma grade de sprite sheet",
},
"svg-to-raster": {
name: "SVG para raster",
description:
"Converta SVG para PNG, JPEG, WebP, AVIF, TIFF, GIF ou HEIF em escala e DPI personalizados",
},
vectorize: {
name: "Imagem para SVG",
description: "Converta imagens em gráficos vetoriais escaláveis",
},
"gif-tools": {
name: "Ferramentas GIF",
description:
"Redimensione, otimize, altere velocidade, inverta, extraia quadros e gire GIFs animados",
},
"image-to-base64": {
name: "Imagem para Base64",
description: "Converta imagens em strings Base64 para incorporar em HTML, CSS e mais",
},
"barcode-generate": {
name: "Gerador de Código de Barras",
description:
"Gere códigos de barras em Code 128, EAN-13, UPC-A, Code 39, ITF-14 e Data Matrix",
},
"chart-maker": {
name: "Criador de Gráficos",
description: "Crie gráficos de barras, linhas ou pizza a partir de dados CSV ou JSON",
},
"convert-video": {
name: "Converter Vídeo",
description: "Converta vídeos entre MP4, MOV e WebM",
},
"compress-video": {
name: "Comprimir Vídeo",
description: "Reduza o tamanho do arquivo de vídeo com controle de qualidade",
},
"trim-video": {
name: "Cortar Vídeo",
description: "Recorte um trecho de um vídeo",
},
"mute-video": {
name: "Silenciar Vídeo",
description: "Remova a faixa de áudio de um vídeo",
},
"video-to-gif": {
name: "Vídeo para GIF",
description: "Transforme um trecho de vídeo em um GIF animado",
},
"resize-video": {
name: "Redimensionar Vídeo",
description: "Redimensione um vídeo para uma nova resolução ou tamanho predefinido",
},
"crop-video": {
name: "Recortar Vídeo",
description: "Recorte uma região de um vídeo",
},
"rotate-video": {
name: "Girar Vídeo",
description: "Gire ou espelhe um vídeo",
},
"change-fps": {
name: "Alterar FPS",
description: "Altere a taxa de quadros de um vídeo",
},
"video-color": {
name: "Cor do Vídeo",
description: "Ajuste brilho, contraste, saturação e gama",
},
"video-speed": {
name: "Velocidade do Vídeo",
description: "Acelere ou desacelere um vídeo",
},
"reverse-video": {
name: "Inverter Vídeo",
description: "Reproduza um trecho de vídeo de trás para frente",
},
"video-loudnorm": {
name: "Normalizar Áudio",
description: "Normalize o volume do áudio do vídeo para o padrão de transmissão",
},
"aspect-pad": {
name: "Preenchimento de Proporção",
description: "Adicione barras de cor sólida para ajustar à proporção desejada",
},
"blur-pad": {
name: "Preenchimento Desfocado",
description: "Preencha as barras com uma cópia desfocada do vídeo",
},
"watermark-video": {
name: "Marca d'Água em Vídeo",
description: "Grave uma marca d'água de texto nos quadros do vídeo",
},
"stabilize-video": {
name: "Estabilizar Vídeo",
description: "Reduza a trepidação da câmera com estabilização em duas passadas",
},
"gif-to-video": {
name: "GIF para Vídeo",
description: "Converta um GIF animado em um vídeo MP4 ou WebM",
},
"video-to-webp": {
name: "Vídeo para WebP",
description: "Converta um trecho de vídeo em uma imagem WebP animada",
},
"video-to-frames": {
name: "Vídeo para Quadros",
description: "Extraia quadros de um vídeo como um ZIP de imagens",
},
"merge-videos": {
name: "Mesclar Vídeos",
description: "Junte vários trechos de vídeo em um único arquivo",
},
"replace-audio": {
name: "Substituir Áudio",
description: "Substitua a faixa de áudio de um vídeo por outro arquivo",
},
"burn-subtitles": {
name: "Gravar Legendas",
description: "Grave legendas permanentemente nos quadros do vídeo",
},
"embed-subtitles": {
name: "Incorporar Legendas",
description: "Incorpore uma faixa de legendas no contêiner do vídeo",
},
"extract-subtitles": {
name: "Extrair Legendas",
description: "Extraia a faixa de legendas de um vídeo como arquivo SRT",
},
"images-to-video": {
name: "Imagens para Vídeo",
description: "Transforme um conjunto de imagens em um vídeo de apresentação",
},
"video-metadata": {
name: "Limpar Metadados do Vídeo",
description: "Remova os metadados de um vídeo e exiba o que foi encontrado",
},
"convert-audio": {
name: "Converter Áudio",
description: "Converta áudio entre MP3, WAV, OGG e outros formatos",
},
"trim-audio": {
name: "Cortar Áudio",
description: "Recorte um trecho de um arquivo de áudio",
},
"extract-audio": {
name: "Extrair Áudio",
description: "Extraia a faixa de áudio de um vídeo",
},
"volume-adjust": {
name: "Ajustar Volume",
description: "Aumente ou diminua o volume do áudio com ganho fixo",
},
"normalize-audio": {
name: "Normalizar Áudio",
description: "Nivele o volume para os padrões de transmissão",
},
"fade-audio": {
name: "Fade de Áudio",
description: "Adicione efeitos de fade-in e fade-out ao áudio",
},
"reverse-audio": {
name: "Inverter Áudio",
description: "Reproduza o áudio de trás para frente",
},
"audio-speed": {
name: "Velocidade do Áudio",
description: "Acelere ou desacelere a reprodução do áudio",
},
"pitch-shift": {
name: "Alterar Tom",
description: "Aumente ou diminua o tom em semitons sem alterar a velocidade",
},
"audio-channels": {
name: "Canais de Áudio",
description: "Converta entre mono, estéreo ou troque os canais esquerdo e direito",
},
"silence-removal": {
name: "Remoção de Silêncio",
description: "Remova trechos silenciosos do áudio",
},
"noise-reduction": {
name: "Redução de Ruído",
description: "Reduza o ruído de fundo com filtragem baseada em FFT",
},
"merge-audio": {
name: "Mesclar Áudio",
description: "Combine vários arquivos de áudio em um só",
},
"split-audio": {
name: "Dividir Áudio",
description: "Divida o áudio por tempo, partes iguais ou detecção de silêncio",
},
"ringtone-maker": {
name: "Criador de Toque",
description: "Crie um toque a partir de qualquer arquivo de áudio",
},
"waveform-image": {
name: "Imagem de Forma de Onda",
description: "Gere uma visualização de forma de onda como imagem PNG",
},
"audio-metadata": {
name: "Metadados de Áudio",
description: "Visualize, edite ou remova tags de áudio (ID3)",
},
"merge-pdf": {
name: "Mesclar PDFs",
description: "Combine vários PDFs em um só",
},
"split-pdf": {
name: "Dividir PDF",
description: "Extraia páginas ou divida em partes",
},
"compress-pdf": {
name: "Comprimir PDF",
description: "Reduza o tamanho do arquivo PDF",
},
"rotate-pdf": {
name: "Girar PDF",
description: "Gire as páginas de um PDF",
},
"convert-document": {
name: "Converter Documento",
description: "Converta entre formatos Word, OpenDocument, RTF e texto simples",
},
"convert-presentation": {
name: "Converter Apresentação",
description: "Converta entre formatos de apresentação PowerPoint e OpenDocument",
},
"convert-spreadsheet": {
name: "Converter Planilha",
description:
"Converta entre formatos Excel, OpenDocument e CSV. Planilhas com várias abas exportam a primeira aba para CSV.",
},
"excel-to-pdf": {
name: "Excel para PDF",
description:
"Converta planilhas para PDF. Planilhas largas podem ser paginadas em várias páginas.",
},
"word-to-pdf": {
name: "Word para PDF",
description: "Converta documentos Word para PDF",
},
"extract-pages": {
name: "Extrair Páginas",
description: "Extraia páginas selecionadas para um novo PDF",
},
"remove-pages": {
name: "Remover Páginas",
description: "Exclua páginas específicas de um PDF",
},
"organize-pdf": {
name: "Organizar PDF",
description: "Reordene as páginas com uma ordem explícita",
},
"protect-pdf": {
name: "Proteger PDF",
description: "Adicione proteção por senha (criptografia AES-256)",
},
"unlock-pdf": {
name: "Desbloquear PDF",
description: "Remova a proteção por senha de um PDF",
},
"repair-pdf": {
name: "Reparar PDF",
description: "Tente reparar um PDF danificado ou corrompido",
},
"linearize-pdf": {
name: "Otimizar PDF para Web",
description: "Linearize um PDF para visualização rápida na web",
},
"grayscale-pdf": {
name: "PDF em Escala de Cinza",
description: "Converta todas as cores para escala de cinza",
},
"pdfa-convert": {
name: "Converter para PDF/A",
description: "Converta para o formato de arquivamento PDF/A-2",
},
"crop-pdf": {
name: "Recortar PDF",
description: "Recorte todas as páginas com uma margem uniforme",
},
"nup-pdf": {
name: "PDF N-up",
description: "Organize várias páginas por folha",
},
"booklet-pdf": {
name: "PDF em Livreto",
description: "Organize as páginas para dobrar como livreto",
},
"watermark-pdf": {
name: "Marca d'Água em PDF",
description: "Adicione uma marca d'água de texto em todas as páginas",
},
"pdf-page-numbers": {
name: "Numerar Páginas do PDF",
description: "Adicione números de página em todas as páginas",
},
"flatten-pdf": {
name: "Achatar PDF",
description: "Incorpore formulários e anotações ao conteúdo da página",
},
"redact-pdf": {
name: "Tarjar PDF",
description: "Remova permanentemente ocorrências de texto (redação verificada)",
},
"pdf-to-text": {
name: "PDF para Texto",
description: "Extraia texto simples de um PDF",
},
"pdf-to-word": {
name: "PDF para Word",
description: "Ideal para PDFs baseados em texto; páginas digitalizadas precisam de OCR",
},
"pdf-metadata": {
name: "Metadados do PDF",
description: "Leia e edite os metadados do documento PDF",
},
"powerpoint-to-pdf": {
name: "PowerPoint para PDF",
description: "Converta apresentações para PDF",
},
"html-to-pdf": {
name: "HTML para PDF",
description:
"Converta um arquivo HTML para PDF. Recursos remotos são desativados por privacidade.",
},
"markdown-to-docx": {
name: "Markdown para Word",
description: "Converta um arquivo Markdown para um documento Word (DOCX)",
},
"markdown-to-html": {
name: "Markdown para HTML",
description:
"Converta um arquivo Markdown para uma página HTML independente. Imagens remotas no original são mantidas na saída.",
},
"markdown-to-pdf": {
name: "Markdown para PDF",
description:
"Converta um arquivo Markdown para um PDF estilizado. Recursos remotos são desativados por privacidade.",
},
"epub-convert": {
name: "Converter EPUB",
description:
"Converta um EPUB para PDF, DOCX, HTML ou Markdown. Recursos remotos dentro do livro não são baixados.",
},
"to-epub": {
name: "Converter para EPUB",
description: "Converta arquivos Word, Markdown, HTML ou texto simples para EPUB",
},
"csv-excel": {
name: "CSV para Excel",
description: "Converta entre CSV e Excel (XLSX), nos dois sentidos",
},
"csv-json": {
name: "CSV para JSON",
description: "Converta entre CSV e JSON, nos dois sentidos",
},
"json-xml": {
name: "JSON para XML",
description: "Converta entre JSON e XML, nos dois sentidos",
},
"split-csv": {
name: "Dividir CSV",
description: "Divida um CSV em arquivos menores por contagem de linhas",
},
"merge-csvs": {
name: "Mesclar CSVs",
description: "Combine vários arquivos CSV ou TSV com colunas correspondentes em um só",
},
"yaml-json": {
name: "YAML / JSON",
description: "Converta entre YAML e JSON, nos dois sentidos",
},
"xml-to-csv": {
name: "XML para CSV",
description: "Extraia elementos repetidos de um XML para uma tabela CSV",
},
"create-zip": {
name: "Criar ZIP",
description: "Agrupe vários arquivos em um único arquivo ZIP",
},
"extract-zip": {
name: "Extrair ZIP",
description:
"Extraia arquivos de um ZIP com segurança e proteção contra arquivos maliciosos. Arquivos com um único item retornam o arquivo diretamente.",
},
pipeline: {
name: "Construtor de Pipeline",
description: "Encadeie várias ferramentas em um fluxo de trabalho",
},
processing: { canceled: "Processamento cancelado" },
mediaPlayer: {
unsupported: "Seu navegador não suporta este formato de mídia.",
},
documentView: {
loadFailed: "Falha ao carregar o documento.",
previousPage: "Página anterior",
nextPage: "Próxima página",
inputNotPreviewable: "Pré-visualização não disponível para este tipo de arquivo",
},
},
toolSettings: {
compress: {
compressionMode: "Modo de compressão",
targetSize: "Tamanho alvo",
quality: "Qualidade",
smallestFile: "Menor arquivo",
bestQuality: "Melhor qualidade",
submit: "Comprimir",
submitBatch: "Comprimir ({count} arquivos)",
progressLabel: "Comprimindo",
original: "Original: {size} KB",
processed: "Processado: {size} KB",
saved: "Economia: {percent}%",
},
resize: {
customSize: "Tamanho personalizado",
scale: "Escala",
presets: "Predefinições",
contentAware: "Consciente do conteúdo",
widthPx: "Largura (px)",
heightPx: "Altura (px)",
fitMode: "Modo de ajuste",
cropToFit: "Cortar para ajustar",
fitInside: "Ajustar dentro",
stretch: "Esticar",
limitToOriginalSize: "Limitar ao tamanho original",
limitToOriginalSizeHint:
"Se a imagem já for menor que o alvo, ela é mantida como está ao invés de ser ampliada",
scalePercent: "Escala (%)",
resizeToSquare: "Redimensionar para quadrado",
protectFaces: "Proteger rostos",
smoothing: "Suavização",
edgeSensitivity: "Sensibilidade de bordas",
submit: "Redimensionar",
submitBatch: "Redimensionar ({count} arquivos)",
progressLabel: "Redimensionando",
},
crop: {
aspectRatio: "Proporção",
custom: "Personalizado",
positionAndSize: "Posição e tamanho",
ruleOfThirds: "Regra dos terços",
leftOffsetPx: "Deslocamento esquerdo (px)",
topOffsetPx: "Deslocamento superior (px)",
submit: "Cortar",
submitBatch: "Cortar ({count} arquivos)",
progressLabel: "Cortando",
},
rotate: {
rotate: "Girar",
angle: "Ângulo",
straighten: "Endireitar",
flip: "Espelhar",
horizontal: "Horizontal",
vertical: "Vertical",
resetAllChanges: "Redefinir todas as alterações",
submit: "Aplicar",
submitBatch: "Aplicar ({count} arquivos)",
progressLabel: "Aplicando",
},
convert: {
targetFormat: "Formato de destino",
sourceFormat: "Formato de origem",
quality: "Qualidade",
submit: "Converter",
submitBatch: "Converter ({count} arquivos)",
progressLabel: "Convertendo",
},
"optimize-for-web": {
outputFormat: "Formato de saída",
quality: "Qualidade",
smallestFile: "Menor arquivo",
bestQuality: "Melhor qualidade",
maxDimensions: "Dimensões máximas",
maxWidth: "Largura máxima",
maxHeight: "Altura máxima",
stripMetadata: "Remover metadados",
sizeComparison: "Comparação de tamanho",
optimized: "Otimizado:",
smaller: "{percent}% menor",
larger: "{percent}% maior",
submit: "Processar e baixar",
submitBatch: "Processar e baixar ({count} arquivos)",
progressLabel: "Otimizando",
},
"strip-metadata": {
currentMetadata: "Metadados atuais",
readingMetadata: "Lendo metadados...",
noMetadataFound: "Nenhum metadado encontrado nesta imagem.",
removeAllMetadata: "Remover todos os metadados",
selectSpecific: "Ou selecione metadados específicos:",
stripExif: "Remover EXIF (info da câmera, data, exposição)",
stripGps: "Remover GPS (dados de localização)",
stripIcc: "Remover ICC (perfil de cor)",
stripXmp: "Remover XMP (metadados extensíveis)",
locationFound: "localização encontrada",
locationWarning:
"Esta imagem contém sua localização precisa. Considere remover os dados GPS antes de compartilhá-la.",
metadataSections: "{count} seção de metadados encontrada",
metadataSectionsPlural: "{count} seções de metadados encontradas",
metadataRemoved: "Metadados removidos: {size} KB",
submit: "Remover metadados",
progressLabel: "Removendo metadados",
},
"edit-metadata": {
readingMetadata: "Lendo metadados...",
couldNotReadMetadata: "Não foi possível ler os metadados - os campos começarão vazios.",
basicInfo: "Informações básicas",
description: "Descrição",
artist: "Artista",
copyright: "Copyright",
software: "Software",
iptc: "IPTC",
title: "Título",
headline: "Título principal",
city: "Cidade",
stateProvince: "Estado/Província",
country: "País",
dateAndTime: "Data e hora",
editDates: "Editar datas",
shiftAllDates: "Ajustar todas as datas",
dateModified: "Data de modificação",
dateTaken: "Data da captura",
shiftHint:
"Ajuste todos os campos de data por um deslocamento (útil para correções de fuso horário)",
direction: "Direção",
forward: "+ Para frente",
backward: "- Para trás",
hoursMinutes: "Horas:Minutos",
locationGps: "Localização (GPS)",
locationDataFound: "Dados de localização encontrados",
noGpsData: "Sem dados GPS. Adicione coordenadas abaixo.",
latitude: "Latitude",
longitude: "Longitude",
altitudeMeters: "Altitude (metros)",
removeAllGpsData: "Remover todos os dados GPS",
keywords: "Palavras-chave",
addKeywordPlaceholder: "Adicione palavra-chave e pressione Enter",
addToExisting: "Adicionar às existentes",
replaceAll: "Substituir todas",
allMetadata: "Todos os metadados",
templates: "Modelos",
templateNamePlaceholder: "Nome do modelo",
uploadPrompt: "Envie uma imagem para editar seus metadados.",
changes: "{count} alterações:",
modified: "{count} modificados",
removed: "{count} removidos",
gpsCleared: "GPS removido",
gpsAdded: "GPS adicionado",
datesShifted: "datas ajustadas",
submit: "Aplicar metadados",
progressLabel: "Gravando metadados",
},
"bulk-rename": {
pattern: "Padrão",
patternHint: "Variáveis: {{index}}, {{padded}}, {{original}}",
startIndex: "Índice inicial",
preview: "Visualização",
andMore: "... e mais {count}",
renaming: "Renomeando...",
submit: "Renomear {count} arquivos",
zipDownloaded: "ZIP baixado com sucesso",
},
"image-to-pdf": {
imageCount: "{count} imagem será convertida em {mode}",
imageCountPlural: "{count} imagens serão convertidas em {mode}",
singlePdfMode: "um único PDF, uma imagem por página",
separatePdfMode: "PDFs separados, um por imagem",
combineAllImages: "Combinar todas as imagens em um PDF",
pageSize: "Tamanho da página",
orientation: "Orientação",
portrait: "Retrato",
landscape: "Paisagem",
margin: "Margem",
targetSizeLabel: "Tamanho de arquivo alvo (opcional)",
targetSizePlaceholder: "ex. 2",
targetSizeHint: "Deixe vazio para qualidade máxima",
targetSizeMet: "Alvo atingido",
targetSizeNotMet: "Não foi possível atingir o alvo. Arquivo comprimido com qualidade mínima.",
targetSizeTooSmall: "O alvo deve ser de pelo menos 50KB",
jpegQualityLabel: "Qualidade JPEG utilizada",
noImage: "Sem imagem",
submitCollate: "Criar PDF ({count} páginas)",
submitSeparate: "Criar {count} PDFs",
downloadPdf: "Baixar PDF",
downloadZip: "Baixar ZIP",
progressLabel: "Criando PDF",
uploadingImages: "Enviando imagens...",
processingPages: "Processando {count} páginas...",
},
"pdf-to-image": {
dropPdf: "Arraste um PDF aqui ou clique para selecionar",
readingPdf: "Lendo PDF...",
pageCount: "{count} página",
pageCountPlural: "{count} páginas",
outputFormat: "Formato de saída",
quality: "Qualidade",
resolutionDpi: "Resolução (DPI)",
dpiScreen: "Tela",
dpiStandard: "Padrão",
dpiPrint: "Impressão",
dpiHighQuality: "Alta qualidade",
colorMode: "Modo de cor",
colorModeColor: "Colorido",
colorModeGrayscale: "Escala de cinza",
colorModeBw: "P&B",
pages: "Páginas",
allPages: "Todas as páginas",
pagesHint: "ex. 1-3, 5, 8-10 (o documento tem {count} páginas)",
converting: "Convertendo...",
submit: "Converter {count} página",
submitPlural: "Converter {count} páginas",
downloadAllZip: "Baixar tudo (ZIP)",
},
favicon: {
uploadHint:
"Envie imagens quadradas (recomendado 512x512 ou maior) para gerar todos os tamanhos de favicon e ícones de app.",
multipleHint: "Cada uma das {count} imagens recebe sua própria pasta no ZIP.",
generatedSizes: "Tamanhos gerados (por imagem)",
plusManifest: "+ manifest.json + trecho HTML",
submit: "Gerar Favicons ({count} imagem)",
submitPlural: "Gerar Favicons ({count} imagens)",
downloadZip: "Baixar ZIP dos Favicons",
progressLabel: "Gerando Favicons",
},
"adjust-colors": {
light: "Luz",
brightness: "Brilho",
contrast: "Contraste",
exposure: "Exposição",
color: "Cor",
saturation: "Saturação",
temperature: "Temperatura",
temperatureHint: "frio / quente",
tint: "Tonalidade",
tintHint: "verde / magenta",
hue: "Matiz",
detail: "Detalhe",
sharpness: "Nitidez",
effects: "Efeitos",
none: "nenhum",
grayscale: "escala de cinza",
sepia: "sépia",
invert: "inverter",
colorChannels: "Canais de cor",
channelModified: "modificado",
red: "Vermelho",
green: "Verde",
blue: "Azul",
resetAll: "Redefinir tudo",
submit: "Aplicar",
submitBatch: "Aplicar ({count} arquivos)",
progressLabel: "Ajustando cores",
},
sharpening: {
method: "Método",
adaptive: "Adaptativo",
unsharpMask: "Máscara de desfoque",
highPass: "Passa-alta",
presets: "Predefinições",
textureAmount: "Quantidade de textura",
amount: "Quantidade",
strength: "Intensidade",
noiseReduction: "Redução de ruído",
off: "desativado",
lightDenoise: "leve",
mediumDenoise: "médio",
strongDenoise: "forte",
advancedControls: "Controles avançados",
radius: "Raio",
flatProtection: "Proteção de áreas planas",
detailThreshold: "Limiar de detalhe",
haloLimitLight: "Limite de halo (claro)",
haloLimitDark: "Limite de halo (escuro)",
threshold: "Limiar",
kernelSize: "Tamanho do kernel",
submit: "Aumentar nitidez",
submitBatch: "Aumentar nitidez ({count} arquivos)",
progressLabel: "Aumentando nitidez",
},
"replace-color": {
sourceColor: "Cor de origem (a substituir)",
targetColor: "Cor de destino (substituição)",
makeTransparent: "Tornar transparente em vez disso",
tolerance: "Tolerância",
exactMatch: "Correspondência exata",
wideRange: "Faixa ampla",
submit: "Substituir cor",
submitBatch: "Substituir cor ({count} arquivos)",
progressLabel: "Substituindo cor",
},
"color-blindness": {
simulationType: "Tipo de simulação",
redGreen: "Vermelho-Verde",
blueYellow: "Azul-Amarelo",
monochromatic: "Monocromático",
submit: "Simular",
submitBatch: "Simular ({count} arquivos)",
progressLabel: "Simulando daltonismo",
},
"remove-background": {
subject: "Assunto",
people: "Pessoas",
products: "Produtos",
general: "Geral",
passportIdPhoto: "Foto para passaporte / documento",
quality: "Qualidade",
fast: "Rápido",
hd: "HD",
max: "Máx",
ultra: "Ultra",
background: "Fundo",
transparent: "Transparente",
bgColor: "Cor",
gradient: "Degradado",
image: "Imagem",
gradientDirection: "Direção",
chooseBackgroundImage: "Escolher imagem de fundo",
effectsSection: "Efeitos",
effectsActive: "ativos",
blurBackground: "Desfocar fundo",
intensity: "Intensidade",
addShadow: "Adicionar sombra",
opacity: "Opacidade",
outputFormat: "Formato de Saída",
edgeSmoothing: "Suavização de Bordas",
edgeSmoothingOff: "Desligado",
edgeSmoothingLight: "Leve",
edgeSmoothingMedium: "Médio",
edgeSmoothingStrong: "Forte",
colorDecontamination: "Descontaminação de Cor",
rendering: "Renderizando...",
submit: "Remover fundo",
submitBatch: "Remover fundo ({count} arquivos)",
progressLabel: "Removendo fundo",
},
upscale: {
scaleFactor: "Fator de escala",
quality: "Qualidade",
enhanceFaces: "Melhorar rostos",
noiseReduction: "Redução de ruído",
noiseReductionHint:
"Suaviza granulação e ruído. Valores mais altos removem mais ruído mas podem suavizar os detalhes.",
outputFormat: "Formato de saída",
submit: "Ampliar {scale}x",
submitBatch: "Ampliar {scale}x ({count} arquivos)",
progressLabel: "Ampliando imagem",
progressLabelBatch: "Ampliando {count} imagens",
},
"erase-object": {
brushSize: "Tamanho do pincel",
fine: "Fino",
wide: "Largo",
undo: "Desfazer",
clear: "Limpar",
outputFormat: "Formato de saída",
quality: "Qualidade",
paintHint: "Pinte sobre os objetos que deseja remover. Use Ctrl+Z para desfazer.",
submit: "Apagar objeto",
submitBatch: "Apagar todos ({count})",
progressLabel: "Apagando objeto",
},
ocr: {
quality: "Qualidade",
enhanceBeforeScanning: "Melhorar antes da varredura",
enhanceHint:
"Endireita, melhora o contraste, remove ruído e amplia a imagem automaticamente antes da varredura para maior precisão.",
language: "Idioma",
autoDetect: "Detecção automática",
extractedText: "Texto extraído",
noTextDetected: "Nenhum texto detectado nesta imagem",
characters: "{count} caracteres",
submit: "Extrair texto",
submitBatch: "Extrair texto ({count} arquivos)",
progressLabel: "Extraindo texto",
},
"ocr-pdf": {
quality: "Qualidade",
language: "Idioma",
autoDetect: "Detectar automaticamente",
pages: "Páginas",
pagesPlaceholder: "todas, 1-3, 5",
pagesHint: "Insira números de página ou intervalos (ex. 1-3, 5, 8-10). Max 50 páginas.",
submit: "Extrair texto",
submitBatch: "Extrair texto ({count} arquivos)",
progressLabel: "Extraindo texto do PDF",
},
"blur-faces": {
blurRadius: "Raio de desfoque",
blurLight: "Leve",
blurHeavy: "Forte",
detectionSensitivity: "Sensibilidade de detecção",
moreFaces: "Mais rostos",
fewerFaces: "Menos rostos",
submit: "Desfocar rostos",
progressLabel: "Desfocando rostos",
},
"enhance-faces": {
quality: "Qualidade",
enhancementStrength: "Intensidade da melhoria",
onlyCenterFace: "Apenas o rosto central",
detectionSensitivity: "Sensibilidade de detecção",
submit: "Melhorar rostos",
submitBatch: "Melhorar rostos ({count} arquivos)",
progressLabel: "Melhorando rostos",
},
"smart-crop": {
subjectFocus: "Foco no assunto",
faceFocus: "Foco no rosto",
autoTrim: "Corte automático",
customSize: "Tamanho personalizado",
socialPresets: "Presets de redes sociais",
detectionStrategy: "Estratégia de detecção",
detectionStrategyHint:
"Atenção encontra a região visualmente mais relevante. Entropia encontra a área com mais detalhes e informações.",
attention: "Atenção",
entropy: "Entropia",
padding: "Preenchimento",
paddingHint: "Espaço extra ao redor da área de foco",
outputQuality: "Qualidade de saída",
outputQualityHint: "Para saídas JPEG e WebP. PNG é sempre sem perdas.",
subjectDescription:
"Detecta a região mais interessante usando análise de relevância e corta no tamanho desejado.",
framing: "Enquadramento",
facePadding: "Espaço ao redor do rosto",
facePaddingHint: "Espaço extra ao redor dos rostos detectados",
fewerFalsePositives: "Menos falsos positivos",
faceDescription:
"Usa detecção facial com AI para manter os rostos bem enquadrados. Se nenhum rosto for detectado, usa o foco no assunto.",
trimTolerance: "Tolerância",
trimDescription:
"O quanto um pixel da borda pode diferir da cor da borda e ainda ser cortado. Maior = mais agressivo.",
padToSquare: "Preencher para quadrado",
targetSizePx: "Tamanho alvo (px)",
padColor: "Cor de preenchimento",
trimHint:
'Remove bordas de cor uniforme ao redor do assunto. Ative "Preencher para quadrado" para imagens prontas para e-commerce.',
submitSubject: "Corte inteligente",
submitFace: "Corte por rosto",
submitTrim: "Cortar bordas",
},
imageEnhancement: {
enhancementMode: "Modo de melhoria",
auto: "Automático",
portrait: "Retrato",
landscape: "Paisagem",
lowLight: "Pouca luz",
food: "Comida",
document: "Documento",
intensity: "Intensidade",
deepEnhance: "Melhoria profunda (AI)",
deepEnhanceDescription: "Remove ruído e artefatos usando AI",
deepEnhanceRequires: "Requer o pacote de Ampliação e melhoria",
analyzingImage: "Analisando imagem...",
detectedIssues: "Problemas detectados",
imageLooksGood: "A imagem parece boa. Ajuste com o controle de intensidade.",
issueUnderexposed: "Baixa exposição",
issueOverexposed: "Superexposta",
issueLowContrast: "Contraste plano",
issueColorCast: "Dominante de cor",
issueDesaturated: "Dessaturada",
issueSoftFocus: "Foco suave",
issueNoisy: "Ruidosa",
submit: "Melhorar",
submitDeep: "Melhoria profunda",
submitBatch: "Melhorar ({count} arquivos)",
submitDeepBatch: "Melhoria profunda ({count} arquivos)",
progressLabel: "Melhorando imagem",
progressLabelBatch: "Melhorando {count} imagens",
},
"noise-removal": {
denoisingTier: "Nível de redução de ruído",
quick: "Rápido",
balanced: "Equilibrado",
quality: "Qualidade",
maximum: "Máximo",
quickDesc: "Rápido e leve",
balancedDesc: "Boa qualidade, velocidade moderada",
qualityDesc: "Com AI, lento",
maximumDesc: "Melhor modelo AI, mais lento",
strength: "Intensidade",
subtle: "Sutil",
aggressive: "Agressivo",
detailPreservation: "Preservação de detalhes",
smooth: "Suave",
sharp: "Nítido",
colorNoise: "Ruído de cor",
heavy: "Intenso",
outputFormat: "Formato de saída",
gifAiWarning:
"A redução de ruído com AI em arquivos GIF processa apenas o primeiro quadro. Para GIFs animados, use o nível Rápido ou Equilibrado.",
submit: "Remover ruído",
submitBatch: "Remover ruído ({count} arquivos)",
progressLabel: "Removendo ruído",
progressLabelBatch: "Removendo ruído de {count} imagens",
},
"red-eye-removal": {
sensitivity: "Sensibilidade",
strict: "Rigorosa",
aggressive: "Agressiva",
correctionStrength: "Intensidade da correção",
subtle: "Sutil",
dark: "Escuro",
outputFormat: "Formato de saída",
quality: "Qualidade",
submit: "Corrigir olhos vermelhos",
submitBatch: "Corrigir olhos vermelhos ({count} arquivos)",
progressLabel: "Corrigindo olhos vermelhos",
progressLabelBatch: "Corrigindo olhos vermelhos em {count} imagens",
},
"restore-photo": {
scratchRemoval: "Remoção de arranhões",
scratchRemovalDesc: "Detecta e repara arranhões, rasgos e manchas",
faceEnhancement: "Melhoria de rostos",
faceEnhancementDesc: "Restaura rostos degradados com CodeFormer AI",
faceFidelity: "Fidelidade do rosto",
enhanced: "Melhorado",
faithful: "Fiel",
noiseReduction: "Redução de ruído",
noiseReductionDesc: "Remove granulação e ruído de fotos antigas",
denoiseStrength: "Intensidade da redução de ruído",
autoColorize: "Colorizar automaticamente",
autoColorizeDesc: "Adicione cor a fotos P&B usando DDColor AI",
colorizeStrength: "Intensidade da colorização",
vivid: "Vívido",
submit: "Restaurar foto",
submitBatch: "Restaurar fotos ({count})",
progressLabel: "Restaurando foto",
progressLabelBatch: "Restaurando {count} fotos",
},
"content-aware-resize": {
widthPx: "Largura (px)",
heightPx: "Altura (px)",
resizeToSquare: "Redimensionar para quadrado",
protectFaces: "Proteger rostos",
protectFacesHint:
"Detecta e protege as áreas do rosto da remoção de costuras usando detecção facial",
smoothing: "Suavização",
edgeSensitivity: "Sensibilidade de bordas",
submit: "Redimensionar",
submitBatch: "Redimensionar ({count} arquivos)",
progressLabel: "Redimensionamento inteligente",
},
"ai-canvas-expand": {
quality: "Qualidade",
fast: "Rápido",
balanced: "Equilibrado",
highQuality: "Alta qualidade",
fastDesc: "Visualização rápida, menos passagens AI",
balancedDesc: "Boa qualidade, velocidade moderada",
highQualityDesc: "Melhores resultados, mais lento",
extendToAspectRatio: "Estender para proporção",
extendByPixels: "Estender por (pixels)",
top: "Topo",
right: "Direita",
bottom: "Baixo",
left: "Esquerda",
newSize: "Novo tamanho: {width} x {height}",
submit: "Estender canvas",
submitBatch: "Estender ({count} arquivos)",
progressLabel: "Estendendo canvas",
},
colorize: {
aiModel: "Modelo AI",
fast: "Rápido",
fastDesc: "Resultados rápidos",
balanced: "Equilibrado",
balancedDesc: "O melhor disponível",
best: "Melhor",
bestDesc: "A mais alta qualidade",
colorIntensity: "Intensidade de cor",
grayscaleLabel: "Escala de cinza",
subtleLabel: "Sutil",
naturalLabel: "Natural",
vividLabel: "Vívido",
intensityHint: "Valores mais baixos produzem cores mais suaves, estilo vintage.",
strength: "Intensidade da colorização",
submit: "Colorizar",
submitBatch: "Colorizar ({count} arquivos)",
progressLabel: "Colorizando",
progressLabelBatch: "Colorizando {count} imagens",
},
"passport-photo": {
country: "País",
searchCountries: "Buscar países...",
noCountriesFound: "Nenhum país encontrado",
customDimensions: "Dimensões personalizadas",
documentType: "Tipo de documento",
dimensionsMm: "Dimensões (mm)",
dpi: "DPI",
pixelsPerInch: "pixels por polegada",
backgroundColor: "Cor de fundo",
maxFileSize: "Tamanho máximo do arquivo",
noLimit: "Sem limite",
customKb: "Personalizado KB...",
uploadPortrait: "Envie uma foto tipo retrato",
uploadHint:
"Arraste ou envie uma imagem no painel esquerdo para visualizar sua foto para documento",
analyzingPhoto: "Analisando foto",
detectingLandmarks: "Detectando pontos faciais e removendo fundo...",
generatePassportPhoto: "Gerar foto para documento",
generating: "Gerando...",
downloadPhoto: "Baixar foto",
faceCentered: "Rosto centralizado",
headLevel: "Cabeça nivelada",
lookingStraight: "Olhando para frente",
faceSize: "Tamanho do rosto",
whatYouSee: "O que você vê é o que vai baixar",
dragToAdjust: "Arraste para ajustar",
scrollToZoom: "Role para dar zoom",
photoGenerated: "Foto gerada. Baixe pelo painel esquerdo.",
},
"transcribe-audio": {
language: "Idioma",
autoDetect: "Detecção automática",
outputFormat: "Formato de saída",
plainText: "Texto simples",
submit: "Transcrever",
submitBatch: "Transcrever ({count} arquivos)",
progressLabel: "Transcrevendo áudio",
},
"auto-subtitles": {
language: "Idioma",
autoDetect: "Detecção automática",
format: "Formato de legenda",
submit: "Gerar legendas",
submitBatch: "Gerar legendas ({count} arquivos)",
progressLabel: "Gerando legendas",
},
"transparency-fixer": {
description: "Envie um PNG com fundo transparente falso e corrigimos em um clique.",
removeWatermark: "Remover marca d'água",
removeWatermarkHelp: "Detecta e remove marcas d'água semitransparentes",
requiresEraser: "Requer o pacote do Apagador de objetos",
advanced: "Avançado",
defringe: "Remover franjas",
outputFormat: "Formato de saída",
submit: "Corrigir transparência",
submitBatch: "Corrigir transparência ({count} arquivos)",
progressLabel: "Corrigindo transparência",
},
"background-replace": {
color: "Cor do fundo",
submit: "Substituir fundo",
submitBatch: "Substituir fundo ({count} arquivos)",
progressLabel: "Substituindo fundo",
},
"blur-background": {
intensity: "Intensidade do desfoque",
submit: "Desfocar fundo",
submitBatch: "Desfocar fundo ({count} arquivos)",
progressLabel: "Desfocando fundo",
},
"watermark-text": {
watermarkText: "Texto da marca d'água",
fontSize: "Tamanho da fonte",
color: "Cor",
opacity: "Opacidade",
position: "Posição",
rotation: "Rotação",
center: "Centro",
topLeft: "Superior esquerdo",
topRight: "Superior direito",
bottomLeft: "Inferior esquerdo",
bottomRight: "Inferior direito",
tiled: "Lado a lado",
submit: "Adicionar marca d'água",
submitBatch: "Adicionar marca d'água ({count} arquivos)",
progressLabel: "Adicionando marca d'água",
},
"watermark-image": {
uploadWatermark: "Enviar imagem de marca d'água",
position: "Posição",
opacity: "Opacidade",
scale: "Escala",
submit: "Aplicar marca d'água",
submitBatch: "Aplicar marca d'água ({count} arquivos)",
},
"text-overlay": {
text: "Texto",
fontSize: "Tamanho da fonte",
color: "Cor",
position: "Posição",
top: "Topo",
center: "Centro",
bottom: "Baixo",
backgroundBox: "Caixa de fundo",
backgroundColor: "Cor de fundo",
shadow: "Sombra",
submit: "Adicionar texto",
submitBatch: "Adicionar texto ({count} arquivos)",
progressLabel: "Adicionando texto sobreposto",
download: "Baixar",
defaultText: "Seu Texto Aqui",
},
compose: {
uploadOverlay: "Enviar imagem de sobreposição",
xPosition: "Posição X",
yPosition: "Posição Y",
opacity: "Opacidade",
blendMode: "Modo de mesclagem",
submit: "Compor",
},
"meme-generator": {
selectTemplate: "Selecione um modelo da galeria ou envie sua própria imagem para começar.",
chooseLayout: "Escolha um layout de texto para sua imagem personalizada.",
textContent: "Conteúdo do texto",
textStyle: "Estilo do texto",
font: "Fonte",
fontSize: "Tamanho da fonte",
textColor: "Cor do texto",
strokeColor: "Cor do contorno",
allCaps: "MAIÚSCULAS",
generate: "Gerar Meme",
generating: "Gerando...",
downloadMeme: "Baixar Meme",
backToGallery: "Voltar para a galeria",
},
info: {
loadingInfo: "Carregando informações...",
filename: "Nome do arquivo",
fileSize: "Tamanho do arquivo",
dimensions: "Dimensões",
format: "Formato",
channels: "Canais",
colorSpace: "Espaço de cor",
density: "Densidade",
bitDepth: "Profundidade de bits",
progressive: "Progressivo",
pages: "Páginas",
hasAlpha: "Tem alfa",
hasProfile: "Tem perfil",
hasExif: "Tem EXIF",
hasIcc: "Tem ICC",
hasXmp: "Tem XMP",
readInfo: "Ler Informações",
reading: "Lendo...",
channelStats: "Estatísticas de Canal",
yes: "Sim",
no: "Não",
na: "N/D",
failedToRead: "Falha ao ler informações",
},
compare: {
uploadSecondImage: "Enviar segunda imagem",
similarity: "Similaridade: {percent}%",
submit: "Comparar",
downloadDiff: "Baixar diferença",
},
"find-duplicates": {
preset: "Predefinição",
exact: "Exato",
similar: "Similar",
loose: "Amplo",
exactDesc: "Cópias idênticas pixel a pixel, mesma imagem em formatos diferentes.",
similarDesc: "Cópias redimensionadas, recomprimidas ou levemente editadas.",
looseDesc: "Imagens visualmente relacionadas, cortes leves, exposições diferentes.",
threshold: "Limiar",
submit: "Buscar duplicatas",
scanning: "Escaneando...",
},
"color-palette": {
submit: "Extrair paleta",
extracting: "Extraindo...",
dominantColors: "Cores dominantes",
clickToCopy: "Clique para copiar",
},
"qr-generate": {
contentType: "Tipo de conteúdo",
url: "URL",
text: "Texto",
wifi: "WiFi",
vcard: "vCard",
email: "E-mail",
phone: "Telefone",
sms: "SMS",
styling: "Estilo",
dotStyle: "Estilo dos pontos",
cornerSquareStyle: "Estilo do quadrado de canto",
cornerDotStyle: "Estilo do ponto de canto",
foregroundColor: "Cor do primeiro plano",
bgColor: "Cor de fundo",
logo: "Logo",
downloadFormat: "Formato de download",
submit: "Gerar código QR",
download: "Baixar código QR",
},
"html-to-image": {
modeUrl: "URL",
modeHtml: "Arquivo HTML",
htmlFile: "Arquivo HTML",
url: "URL",
urlPlaceholder: "https://snapotter.com",
format: "Formato de saída",
quality: "Qualidade",
devicePreset: "Dispositivo",
viewportWidth: "Largura",
viewportHeight: "Altura",
fullPage: "Página inteira",
submit: "Capturar",
download: "Baixar captura de tela",
capturing: "Capturando página...",
errorTimeout: "A página demorou demais para carregar",
errorBlocked: "Esta URL não pode ser capturada",
errorUnavailable: "Serviço de captura de tela indisponível",
errorFailed: "Falha ao capturar a página",
placeholder: "Insira uma URL e clique em Capturar",
presets: {
desktop: "Desktop",
tablet: "Tablet",
mobile: "Celular",
custom: "Personalizado",
},
},
"barcode-read": {
submit: "Escanear códigos de barras",
submitBatch: "Escanear ({count} arquivos)",
scanning: "Escaneando...",
noBarcodesFound: "Nenhum código de barras encontrado",
barcodesFound: "{count} código de barras encontrado",
barcodesFoundPlural: "{count} códigos de barras encontrados",
},
collage: {
template: "Modelo",
aspectRatio: "Proporção",
gap: "Espaço",
cornerRadius: "Raio do canto",
backgroundColor: "Cor de fundo",
outputFormat: "Formato de saída",
quality: "Qualidade",
submit: "Criar collage",
downloadCollage: "Baixar collage",
},
stitch: {
direction: "Direção",
horizontal: "Horizontal",
vertical: "Vertical",
grid: "Grade",
gridColumns: "Colunas da grade",
resizeMode: "Modo de redimensionamento",
fit: "Ajustar",
original: "Original",
stretchMode: "Esticar",
cropMode: "Cortar",
alignment: "Alinhamento",
start: "Início",
center: "Centro",
end: "Fim",
gap: "Espaço",
border: "Borda",
cornerRadius: "Raio do canto",
backgroundColor: "Cor de fundo",
outputFormat: "Formato de saída",
quality: "Qualidade",
submit: "Juntar imagens",
},
split: {
modeGrid: "Grade",
modeTileSize: "Tamanho do bloco",
presets: "Predefinições",
columns: "Colunas",
rows: "Linhas",
tileWidth: "Largura do bloco",
tileHeight: "Altura do bloco",
outputFormat: "Formato de saída",
quality: "Qualidade",
submit: "Dividir imagem",
downloadAll: "Baixar tudo (ZIP)",
},
border: {
presets: "Predefinições",
borderWidth: "Largura da borda",
borderColor: "Cor da borda",
padding: "Preenchimento",
paddingColor: "Cor do preenchimento",
cornerRadius: "Raio do canto",
shadow: "Sombra",
shadowBlur: "Desfoque da sombra",
shadowOffsetX: "Deslocamento X da sombra",
shadowOffsetY: "Deslocamento Y da sombra",
shadowColor: "Cor da sombra",
shadowOpacity: "Opacidade da sombra",
submit: "Adicionar borda",
submitBatch: "Adicionar borda ({count} arquivos)",
progressLabel: "Adicionando borda",
},
beautify: {
preset: "Predefinição",
backgroundType: "Tipo de fundo",
solidColor: "Cor sólida",
linearGradient: "Degradado linear",
radialGradient: "Degradado radial",
customImage: "Imagem personalizada",
gradientAngle: "Ângulo do degradado",
padding: "Preenchimento",
borderRadius: "Raio da borda",
shadowPreset: "Preset de sombra",
deviceFrame: "Moldura de dispositivo",
submit: "Embelezar",
submitBatch: "Embelezar ({count} arquivos)",
progressLabel: "Embelezando captura de tela",
},
"circle-crop": {
submit: "Recorte circular",
submitBatch: "Recorte circular ({count} arquivos)",
progressLabel: "Recortando em círculo",
},
duotone: {
shadow: "Cor da sombra",
highlight: "Cor do realce",
submit: "Aplicar duotone",
submitBatch: "Aplicar duotone ({count} arquivos)",
progressLabel: "Aplicando duotone",
},
"image-pad": {
target: "Proporção alvo",
color: "Cor de fundo",
submit: "Preencher imagem",
submitBatch: "Preencher imagem ({count} arquivos)",
progressLabel: "Preenchendo imagem",
},
pixelate: {
blockSize: "Tamanho do bloco",
submit: "Pixelar",
submitBatch: "Pixelar ({count} arquivos)",
progressLabel: "Pixelando",
},
vignette: {
strength: "Intensidade",
color: "Cor da vinheta",
submit: "Aplicar vinheta",
submitBatch: "Aplicar vinheta ({count} arquivos)",
progressLabel: "Aplicando vinheta",
},
"gif-webp": {
submit: "Converter",
submitBatch: "Converter ({count} arquivos)",
progressLabel: "Convertendo animação",
},
histogram: {
submit: "Gerar histograma",
submitBatch: "Gerar histograma ({count} arquivos)",
progressLabel: "Gerando histograma",
},
"lqip-placeholder": {
width: "Largura",
blur: "Desfoque",
submit: "Gerar placeholder",
submitBatch: "Gerar placeholder ({count} arquivos)",
progressLabel: "Gerando placeholder",
},
"sprite-sheet": {
columns: "Colunas",
padding: "Espaçamento",
background: "Cor de fundo",
submit: "Criar sprite sheet",
submitBatch: "Criar sprite sheet",
progressLabel: "Criando sprite sheet",
},
"svg-to-raster": {
outputFormat: "Formato de saída",
sizing: "Dimensionamento",
scaleMode: "Escala",
customMode: "Personalizado",
scalePresets: "Presets de escala",
dpiPresets: "Presets de DPI",
customWidth: "Largura (px)",
customHeight: "Altura (px)",
background: "Fundo",
bgTransparent: "Transparente",
bgColor: "Cor",
quality: "Qualidade",
submit: "Converter SVG",
submitBatch: "Converter ({count} arquivos)",
progressLabel: "Convertendo SVG",
},
vectorize: {
preset: "Predefinição",
logo: "Logo",
illustration: "Ilustração",
photo: "Foto",
sketch: "Rascunho",
customPreset: "Personalizado",
colorMode: "Modo de cor",
bw: "P&B",
colorModeColor: "Colorido",
threshold: "Limiar",
colorPrecision: "Precisão de cor",
layerDifference: "Diferença de camadas",
filterSpeckle: "Filtrar manchas",
pathMode: "Modo de caminho",
cornerThreshold: "Limiar de canto",
invertColors: "Inverter cores",
submit: "Vetorizar",
submitBatch: "Vetorizar ({count} arquivos)",
progressLabel: "Vetorizando",
},
"gif-tools": {
mode: "Modo",
resize: "Redimensionar",
optimize: "Otimizar",
speed: "Velocidade",
reverse: "Inverter",
extract: "Extrair",
rotateMode: "Girar",
pixel: "Pixel",
percentage: "Porcentagem",
colors: "Cores",
dither: "Dithering",
effort: "Esforço",
speedFactor: "Fator de velocidade",
loopControl: "Controle de loop",
infinite: "Infinito",
once: "Uma vez",
customLoop: "Personalizado",
loopCount: "Quantidade de loops",
extractSingle: "Individual",
extractRange: "Faixa",
extractAll: "Todos",
frameNumber: "Número do quadro",
frameStart: "Quadro inicial",
frameEnd: "Quadro final",
extractFormat: "Formato",
submit: "Processar GIF",
submitBatch: "Processar ({count} arquivos)",
progressLabel: "Processando GIF",
},
"image-to-base64": {
outputFormat: "Formato de saída",
keepOriginal: "Manter original",
quality: "Qualidade",
maxWidth: "Largura máxima",
maxHeight: "Altura máxima",
submit: "Converter para Base64",
submitBatch: "Converter ({count} arquivos)",
copyBase64: "Copiar Base64",
copyDataUri: "Copiar Data URI",
copyImgTag: "Copiar tag <img>",
copyCssUrl: "Copiar CSS url()",
},
"barcode-generate": {
text: "Texto",
type: "Tipo de código de barras",
scale: "Escala",
includeText: "Incluir texto",
submit: "Gerar código de barras",
download: "Baixar código de barras",
},
"chart-maker": {
kind: "Tipo de gráfico",
title: "Título",
width: "Largura",
height: "Altura",
submit: "Criar gráfico",
submitBatch: "Criar gráfico ({count} arquivos)",
progressLabel: "Criando gráfico",
},
"enhance-faces-standalone": {
model: "Modelo",
fast: "Rápido",
balanced: "Equilibrado",
best: "Melhor",
},
"convert-video": {
format: "Formato de saída",
quality: "Qualidade",
high: "Alta",
balanced: "Equilibrada",
small: "Menor",
submit: "Converter",
submitBatch: "Converter ({count} arquivos)",
progressLabel: "Convertendo",
},
"compress-video": {
quality: "Compressão",
light: "Leve",
balanced: "Equilibrada",
strong: "Forte",
resolution: "Resolução",
original: "Original",
submit: "Comprimir",
submitBatch: "Comprimir ({count} arquivos)",
progressLabel: "Comprimindo",
},
"trim-video": {
start: "Início (segundos)",
end: "Fim (segundos)",
precise: "Preciso por quadro (recodifica)",
submit: "Cortar",
submitBatch: "Cortar ({count} arquivos)",
progressLabel: "Cortando",
},
"mute-video": {
submit: "Remover áudio",
submitBatch: "Remover áudio ({count} arquivos)",
progressLabel: "Removendo áudio",
},
"video-to-gif": {
fps: "Quadros por segundo",
width: "Largura (px)",
start: "Início (segundos)",
duration: "Duração (segundos)",
submit: "Criar GIF",
submitBatch: "Criar GIFs ({count} arquivos)",
progressLabel: "Criando GIF",
},
"resize-video": {
preset: "Predefinição",
width: "Largura (px)",
height: "Altura (px)",
hint: "Deixe uma dimensão vazia para manter a proporção",
submit: "Redimensionar",
submitBatch: "Redimensionar ({count} arquivos)",
progressLabel: "Redimensionando",
},
"crop-video": {
width: "Largura (px)",
height: "Altura (px)",
x: "Deslocamento X",
y: "Deslocamento Y",
submit: "Recortar",
submitBatch: "Recortar ({count} arquivos)",
progressLabel: "Recortando",
},
"rotate-video": {
transform: "Transformação",
cw90: "Girar 90° horário",
ccw90: "Girar 90° anti-horário",
rotate180: "Girar 180°",
hflip: "Espelhar horizontal",
vflip: "Espelhar vertical",
submit: "Girar",
submitBatch: "Girar ({count} arquivos)",
progressLabel: "Girando",
},
"change-fps": {
fps: "Quadros por segundo",
submit: "Alterar FPS",
submitBatch: "Alterar FPS ({count} arquivos)",
progressLabel: "Alterando FPS",
},
"video-color": {
brightness: "Brilho",
contrast: "Contraste",
saturation: "Saturação",
gamma: "Gama",
submit: "Aplicar",
submitBatch: "Aplicar ({count} arquivos)",
progressLabel: "Ajustando cor",
},
"video-speed": {
factor: "Fator de velocidade",
keepPitch: "Manter tom original",
submit: "Alterar velocidade",
submitBatch: "Alterar velocidade ({count} arquivos)",
progressLabel: "Alterando velocidade",
},
"reverse-video": {
hint: "Limitado a clipes de até 5 minutos",
submit: "Inverter",
submitBatch: "Inverter ({count} arquivos)",
progressLabel: "Invertendo",
},
"video-loudnorm": {
hint: "Normaliza o áudio para o padrão de transmissão EBU R128",
submit: "Normalizar",
submitBatch: "Normalizar ({count} arquivos)",
progressLabel: "Normalizando",
},
"aspect-pad": {
target: "Proporção alvo",
color: "Cor de fundo",
colorHint: "Cor HEX, ex: #000000",
submit: "Preencher",
submitBatch: "Preencher ({count} arquivos)",
progressLabel: "Preenchendo",
},
"blur-pad": {
target: "Proporção alvo",
blur: "Intensidade do desfoque",
submit: "Preencher",
submitBatch: "Preencher ({count} arquivos)",
progressLabel: "Preenchendo",
},
"watermark-video": {
text: "Texto da marca d'água",
position: "Posição",
fontSize: "Tamanho da fonte",
opacity: "Opacidade",
color: "Cor",
colorHint: "Cor HEX, ex: #ffffff",
submit: "Marca d'água",
submitBatch: "Marca d'água ({count} arquivos)",
progressLabel: "Aplicando marca d'água",
},
"stabilize-video": {
smoothing: "Suavização",
hint: "Executa duas passagens e demora mais que a maioria das ferramentas",
submit: "Estabilizar",
submitBatch: "Estabilizar ({count} arquivos)",
progressLabel: "Estabilizando",
},
"gif-to-video": {
format: "Formato de saída",
submit: "Converter",
submitBatch: "Converter ({count} arquivos)",
progressLabel: "Convertendo",
},
"video-to-webp": {
fps: "Quadros por segundo",
width: "Largura (px)",
quality: "Qualidade",
loop: "Repetir animação",
submit: "Converter",
submitBatch: "Converter ({count} arquivos)",
progressLabel: "Convertendo",
},
"video-to-frames": {
mode: "Modo de extração",
modeAll: "Todos os quadros",
modeNth: "A cada N quadros",
modeTimestamps: "Marcas de tempo específicas",
n: "Extrair a cada N quadros",
timestamps: "Marcas de tempo (segundos)",
timestampsHint: "Separados por vírgula, ex: 0.5, 2, 4.5",
format: "Formato de imagem",
submit: "Extrair quadros",
submitBatch: "Extrair quadros ({count} arquivos)",
progressLabel: "Extraindo quadros",
},
"merge-videos": {
hint: "Os arquivos são unidos na ordem de upload",
submit: "Mesclar",
submitBatch: "Mesclar ({count} arquivos)",
progressLabel: "Mesclando",
},
"replace-audio": {
hint: "Envie o vídeo primeiro, depois o áudio",
submit: "Substituir áudio",
submitBatch: "Substituir áudio ({count} arquivos)",
progressLabel: "Substituindo áudio",
},
"burn-subtitles": {
fontSize: "Tamanho da fonte",
hint: "Envie um vídeo e um arquivo de legendas (.srt ou .vtt)",
submit: "Gravar legendas",
submitBatch: "Gravar legendas ({count} arquivos)",
progressLabel: "Gravando legendas",
},
"embed-subtitles": {
language: "Código do idioma",
languageHint: "Código ISO 639-2 de três letras, ex: eng, spa, por",
submit: "Embutir legendas",
submitBatch: "Embutir legendas ({count} arquivos)",
progressLabel: "Embutindo legendas",
},
"extract-subtitles": {
submit: "Extrair legendas",
submitBatch: "Extrair legendas ({count} arquivos)",
progressLabel: "Extraindo legendas",
},
"images-to-video": {
secondsPerImage: "Segundos por imagem",
resolution: "Resolução",
fps: "Quadros por segundo",
submit: "Criar vídeo",
submitBatch: "Criar vídeo ({count} arquivos)",
progressLabel: "Criando apresentação",
},
"video-metadata": {
hint: "O relatório de metadados aparece no resultado",
submit: "Remover metadados",
submitBatch: "Remover metadados ({count} arquivos)",
progressLabel: "Removendo metadados",
},
"convert-audio": {
format: "Formato de saída",
bitrate: "Taxa de bits (kbps)",
submit: "Converter",
submitBatch: "Converter ({count} arquivos)",
progressLabel: "Convertendo",
},
"trim-audio": {
start: "Início (segundos)",
end: "Fim (segundos)",
submit: "Cortar",
submitBatch: "Cortar ({count} arquivos)",
progressLabel: "Cortando",
},
"extract-audio": {
format: "Formato de saída",
submit: "Extrair",
submitBatch: "Extrair ({count} arquivos)",
progressLabel: "Extraindo",
},
"volume-adjust": {
"gain-db": "Ganho (dB)",
submit: "Ajustar Volume",
submitBatch: "Ajustar Volume ({count} arquivos)",
progressLabel: "Ajustando volume",
},
"normalize-audio": {
hint: "Normalização de loudness EBU R128",
submit: "Normalizar",
submitBatch: "Normalizar ({count} arquivos)",
progressLabel: "Normalizando",
},
"fade-audio": {
"fade-in-s": "Fade in (segundos)",
"fade-out-s": "Fade out (segundos)",
submit: "Aplicar Fade",
submitBatch: "Aplicar Fade ({count} arquivos)",
progressLabel: "Aplicando fade",
},
"reverse-audio": {
submit: "Inverter",
submitBatch: "Inverter ({count} arquivos)",
progressLabel: "Invertendo",
},
"audio-speed": {
factor: "Fator de velocidade",
submit: "Alterar Velocidade",
submitBatch: "Alterar Velocidade ({count} arquivos)",
progressLabel: "Alterando velocidade",
},
"pitch-shift": {
semitones: "Semitons",
hint: "0 semitons não é permitido",
submit: "Alterar Tom",
submitBatch: "Alterar Tom ({count} arquivos)",
progressLabel: "Alterando tom",
},
"audio-channels": {
mode: "Modo de canal",
"stereo-to-mono": "Estéreo para mono",
"mono-to-stereo": "Mono para estéreo",
swap: "Trocar esquerdo/direito",
submit: "Converter Canais",
submitBatch: "Converter Canais ({count} arquivos)",
progressLabel: "Convertendo canais",
},
"silence-removal": {
"threshold-db": "Limiar de silêncio (dB)",
"min-silence-s": "Duração mínima do silêncio (segundos)",
submit: "Remover Silêncio",
submitBatch: "Remover Silêncio ({count} arquivos)",
progressLabel: "Removendo silêncio",
},
"noise-reduction": {
strength: "Intensidade",
light: "Leve",
medium: "Médio",
strong: "Forte",
submit: "Reduzir Ruído",
submitBatch: "Reduzir Ruído ({count} arquivos)",
progressLabel: "Reduzindo ruído",
},
"merge-audio": {
format: "Formato de saída",
mp3: "MP3",
wav: "WAV",
flac: "FLAC",
m4a: "M4A",
"order-hint": "Os arquivos serão unidos na ordem de upload",
submit: "Mesclar Áudio",
submitBatch: "Mesclar Áudio ({count} arquivos)",
progressLabel: "Mesclando áudio",
},
"split-audio": {
mode: "Modo de divisão",
time: "Por tempo",
parts: "Partes iguais",
silence: "Por silêncio",
"segment-s": "Duração do segmento (segundos)",
"num-parts": "Número de partes",
"threshold-db": "Limiar de silêncio (dB)",
"min-silence-s": "Duração mínima do silêncio (segundos)",
submit: "Dividir Áudio",
submitBatch: "Dividir Áudio ({count} arquivos)",
progressLabel: "Dividindo áudio",
},
"ringtone-maker": {
"start-s": "Tempo inicial (segundos)",
"duration-s": "Duração (segundos)",
"max-hint": "Máximo de 30 segundos",
submit: "Criar Toque",
submitBatch: "Criar Toque ({count} arquivos)",
progressLabel: "Criando toque",
},
"waveform-image": {
width: "Largura (px)",
height: "Altura (px)",
color: "Cor da forma de onda",
submit: "Gerar Forma de Onda",
submitBatch: "Gerar Forma de Onda ({count} arquivos)",
progressLabel: "Gerando forma de onda",
},
"audio-metadata": {
strip: "Remover todos os metadados",
title: "Título",
artist: "Artista",
album: "Álbum",
submit: "Aplicar Metadados",
submitBatch: "Aplicar Metadados ({count} arquivos)",
progressLabel: "Aplicando metadados",
},
"merge-pdf": {
addFiles: "Adicionar PDFs para mesclar",
needTwo: "São necessários pelo menos dois PDFs",
orderHint: "{count} PDFs serão mesclados nesta ordem",
submit: "Mesclar",
submitBatch: "Mesclar ({count} arquivos)",
progressLabel: "Mesclando",
},
"split-pdf": {
mode: "Modo de divisão",
range: "Intervalo de páginas",
rangeHint: "ex: 1-3, 5, 7-z",
everyN: "Páginas por parte",
submit: "Dividir",
submitBatch: "Dividir ({count} arquivos)",
progressLabel: "Dividindo",
},
"compress-pdf": {
preset: "Predefinição de qualidade",
screen: "Tela (menor tamanho)",
ebook: "Ebook (equilibrado)",
printer: "Impressora (melhor qualidade)",
submit: "Comprimir",
submitBatch: "Comprimir ({count} arquivos)",
progressLabel: "Comprimindo",
},
"rotate-pdf": {
angle: "Ângulo de rotação",
range: "Intervalo de páginas",
rangeHint: "ex: 1-3, 5, 1-z (todas as páginas)",
submit: "Girar",
submitBatch: "Girar ({count} arquivos)",
progressLabel: "Girando",
},
"convert-document": {
format: "Formato de saída",
submit: "Converter",
submitBatch: "Converter ({count} arquivos)",
progressLabel: "Convertendo",
},
"convert-presentation": {
format: "Formato de saída",
submit: "Converter",
submitBatch: "Converter ({count} arquivos)",
progressLabel: "Convertendo",
},
"convert-spreadsheet": {
format: "Formato de saída",
hint: "Planilhas com várias abas exportam apenas a primeira aba para CSV.",
submit: "Converter",
submitBatch: "Converter ({count} arquivos)",
progressLabel: "Convertendo",
},
"excel-to-pdf": {
submit: "Converter para PDF",
submitBatch: "Converter ({count} arquivos)",
progressLabel: "Convertendo",
},
"powerpoint-to-pdf": {
submit: "Converter para PDF",
submitBatch: "Converter ({count} arquivos)",
progressLabel: "Convertendo",
},
"word-to-pdf": {
submit: "Converter para PDF",
submitBatch: "Converter ({count} arquivos)",
progressLabel: "Convertendo",
},
"extract-pages": {
range: "Intervalo de páginas",
rangeHint: "ex: 1-3, 5, 7-z",
submit: "Extrair",
submitBatch: "Extrair ({count} arquivos)",
progressLabel: "Extraindo",
},
"remove-pages": {
pages: "Páginas para remover",
pagesHint: "ex: 2, 4-6, z (última página)",
submit: "Remover",
submitBatch: "Remover ({count} arquivos)",
progressLabel: "Removendo",
},
"organize-pdf": {
order: "Ordem das páginas",
orderHint: "ex: 3,1,2 ou 1-z (sem alteração)",
submit: "Reordenar",
submitBatch: "Reordenar ({count} arquivos)",
progressLabel: "Reordenando",
},
"protect-pdf": {
userPassword: "Senha do usuário",
ownerPassword: "Senha do proprietário (opcional)",
ownerPasswordHint: "Usa a senha do usuário se vazio",
submit: "Proteger",
submitBatch: "Proteger ({count} arquivos)",
progressLabel: "Criptografando",
},
"unlock-pdf": {
password: "Senha",
submit: "Desbloquear",
submitBatch: "Desbloquear ({count} arquivos)",
progressLabel: "Descriptografando",
},
"repair-pdf": {
submit: "Reparar",
submitBatch: "Reparar ({count} arquivos)",
progressLabel: "Reparando",
},
"linearize-pdf": {
submit: "Otimizar",
submitBatch: "Otimizar ({count} arquivos)",
progressLabel: "Linearizando",
},
"grayscale-pdf": {
submit: "Converter",
submitBatch: "Converter ({count} arquivos)",
progressLabel: "Convertendo",
},
"pdfa-convert": {
submit: "Converter",
submitBatch: "Converter ({count} arquivos)",
progressLabel: "Convertendo",
},
"crop-pdf": {
margin: "Margem (pontos)",
submit: "Recortar",
submitBatch: "Recortar ({count} arquivos)",
progressLabel: "Recortando",
},
"nup-pdf": {
perSheet: "Páginas por folha",
submit: "Organizar",
submitBatch: "Organizar ({count} arquivos)",
progressLabel: "Organizando",
},
"booklet-pdf": {
perSheet: "Páginas por folha",
submit: "Criar Livreto",
submitBatch: "Criar Livreto ({count} arquivos)",
progressLabel: "Criando livreto",
},
"watermark-pdf": {
text: "Texto da marca d'água",
position: "Posição",
fontSize: "Tamanho da fonte",
opacity: "Opacidade",
rotation: "Rotação",
submit: "Marca d'Água",
submitBatch: "Marca d'Água ({count} arquivos)",
progressLabel: "Aplicando marca d'água",
},
"pdf-page-numbers": {
position: "Posição",
fontSize: "Tamanho da fonte",
submit: "Adicionar Números",
submitBatch: "Adicionar Números ({count} arquivos)",
progressLabel: "Numerando",
},
"flatten-pdf": {
submit: "Achatar",
submitBatch: "Achatar ({count} arquivos)",
progressLabel: "Achatando",
},
"sign-pdf": {
yourSignatures: "Suas assinaturas",
newSignature: "Nova",
clickToPlace: "Clique em uma assinatura para colocá-la na página atual.",
selectedSignature: "Assinatura selecionada",
dragToAdjust: "Arraste as alças para redimensionar ou girar.",
disclaimer:
"Adiciona uma imagem de assinatura visível. Não é uma assinatura digital baseada em certificado.",
signing: "Assinando…",
signingPercent: "Assinando… {percent}%",
downloadSigned: "Baixar PDF assinado",
addFirst: "Adicione pelo menos uma assinatura antes de baixar.",
pad: {
title: "Criar assinatura",
draw: "Desenhar",
type: "Digitar",
upload: "Enviar",
color: "Cor",
pen: "Caneta",
namePlaceholder: "Digite seu nome",
yourName: "Seu nome",
remember: "Lembrar neste dispositivo",
save: "Salvar e posicionar",
uploadHint: "Solte um PNG / JPG ou clique para escolher. PNG transparente funciona melhor.",
},
},
"redact-pdf": {
terms: "Termos para censurar",
termsHint: "Um termo por linha (máx. 50)",
caseSensitive: "Diferenciar maiúsculas/minúsculas",
submit: "Censurar",
submitBatch: "Censurar ({count} arquivos)",
progressLabel: "Censurando",
},
"pdf-to-text": {
submit: "Extrair Texto",
submitBatch: "Extrair Texto ({count} arquivos)",
progressLabel: "Extraindo",
},
"pdf-to-word": {
hint: "Ideal para PDFs com texto; páginas digitalizadas precisam de OCR",
submit: "Converter para Word",
submitBatch: "Converter para Word ({count} arquivos)",
progressLabel: "Convertendo",
},
"pdf-metadata": {
title: "Título",
author: "Autor",
subject: "Assunto",
keywords: "Palavras-chave",
submit: "Definir Metadados",
submitBatch: "Definir Metadados ({count} arquivos)",
progressLabel: "Definindo metadados",
},
"html-to-pdf": {
hint: "Recursos remotos estão desativados por privacidade.",
submit: "Converter para PDF",
submitBatch: "Converter para PDF ({count} arquivos)",
progressLabel: "Convertendo",
},
"markdown-to-docx": {
submit: "Converter para DOCX",
submitBatch: "Converter ({count} arquivos)",
progressLabel: "Convertendo",
},
"markdown-to-html": {
hint: "Imagens remotas no arquivo original são mantidas como estão na saída.",
submit: "Converter para HTML",
submitBatch: "Converter ({count} arquivos)",
progressLabel: "Convertendo",
},
"markdown-to-pdf": {
hint: "Recursos remotos estão desativados por privacidade.",
submit: "Converter para PDF",
submitBatch: "Converter para PDF ({count} arquivos)",
progressLabel: "Convertendo",
},
"epub-convert": {
format: "Formato de saída",
hint: "Recursos remotos dentro do livro não são baixados.",
submit: "Converter",
submitBatch: "Converter ({count} arquivos)",
progressLabel: "Convertendo",
},
"to-epub": {
submit: "Converter para EPUB",
submitBatch: "Converter ({count} arquivos)",
progressLabel: "Convertendo",
},
"csv-excel": {
sheet: "Número da planilha",
submit: "Converter",
submitBatch: "Converter ({count} arquivos)",
progressLabel: "Convertendo",
},
"csv-json": {
pretty: "Formatação legível",
submit: "Converter",
submitBatch: "Converter ({count} arquivos)",
progressLabel: "Convertendo",
},
"json-xml": {
pretty: "Formatação legível",
submit: "Converter",
submitBatch: "Converter ({count} arquivos)",
progressLabel: "Convertendo",
},
"split-csv": {
rowsPerFile: "Linhas por arquivo",
keepHeader: "Manter cabeçalho em cada arquivo",
submit: "Dividir",
submitBatch: "Dividir ({count} arquivos)",
progressLabel: "Dividindo",
},
"merge-csvs": {
submit: "Mesclar",
submitBatch: "Mesclar ({count} arquivos)",
progressLabel: "Mesclando",
},
"yaml-json": {
submit: "Converter",
submitBatch: "Converter ({count} arquivos)",
progressLabel: "Convertendo",
},
"xml-to-csv": {
submit: "Converter",
submitBatch: "Converter ({count} arquivos)",
progressLabel: "Convertendo",
},
"create-zip": {
submit: "Criar ZIP",
submitBatch: "Criar ZIP ({count} arquivos)",
progressLabel: "Compactando",
},
"extract-zip": {
submit: "Extrair",
submitBatch: "Extrair ({count} arquivos)",
progressLabel: "Extraindo",
},
},
urlImport: {
title: "Importar de URLs",
placeholder: "Cole URLs de imagens, uma por linha...",
importButton: "Importar URLs",
addButton: "Adicionar {count} arquivos",
adding: "Adicionando...",
retryButton: "Tentar novamente",
cancelButton: "Cancelar",
readyCount: "{count} prontos",
failedStatus: "Falhou",
},
comparison: {
original: "Original",
processed: "Processado",
before: "Antes",
after: "Depois",
savings: "Economia",
},
toolPage: {
emptyPrompt: "Arraste ou envie uma imagem para começar",
filesCount: "Arquivos ({count})",
addMore: "+ Adicionar mais",
clearAll: "Limpar tudo",
acceptDescription: "Apenas arquivos {exts}",
notFound: "Ferramenta não encontrada",
configureAndGenerate: "Configure os ajustes e gere.",
processingFailed: "Falha ao processar este arquivo",
conversionComplete: "Conversão concluída",
cannotPreviewDownload:
"Arquivos {type} não podem ser visualizados no navegador. Use o botão de download para salvar seu arquivo.",
generatingPreview: "Gerando visualização...",
cannotPreviewWillProcess:
"Arquivos {ext} não podem ser visualizados no navegador. A ferramenta processará este arquivo normalmente.",
previousImage: "Arquivo anterior",
nextImage: "Próximo arquivo",
imageCounter: "{current} / {total}",
settingsLabel: "Configurações",
downloadAllZip: "Baixar tudo (ZIP)",
hideSettings: "Ocultar configurações",
imageArea: "Área de visualização",
disabledByAdmin: "Esta ferramenta foi desativada pelo administrador",
browseOtherTools: "Ver outras ferramentas",
privacyNote: "Os arquivos são processados no seu servidor e nunca saem da sua rede",
applyAndDownload: "Aplicar e baixar",
andMore: "e mais {count}",
importFromFiles: "Importar de Arquivos",
saveToFiles: "Salvar em Arquivos",
savedToFiles: "Salvo em Arquivos",
adjustSettings: "Ajustar configurações",
startOver: "Recomeçar com um novo arquivo",
newFile: "Novo arquivo",
previewUnavailable: "A pré-visualização estará disponível após o processamento",
generatePreview: "Gerar pré-visualização",
previewFailed: "Falha ao gerar pré-visualização",
backToTools: "Voltar para Ferramentas",
original: "Original",
processed: "Processado",
saved: "Salvo",
noChange: "sem alteração",
download: "Baixar",
settingsSaved: "Suas configurações foram salvas.",
tryAgain: "Tentar novamente",
tryDifferentFile: "Tentar outro arquivo",
batchPartialSuccess: "{success} de {total} processados. {failed} falharam.",
dataResultsHint: "Resultados exibidos acima. Use o botão de copiar no painel de resultados.",
downloadAsFile: "Baixar como arquivo",
downloadAll: "Baixar tudo",
downloadFiles: "Baixar {count} arquivos",
audioDecodeUnsupported: "Este formato de áudio não pode ser pré-visualizado no navegador",
},
homePage: {
generatingPreview: "Gerando visualização...",
loadingPreview: "Carregando visualização...",
changeFile: "Alterar arquivo",
quickActions: "Ações rápidas",
allTools: "Todas as ferramentas",
searchPlaceholder: "Buscar em {count} ferramentas...",
recent: "Recentes",
popular: "Populares",
browseByCategory: "Navegar por categoria",
gettingStarted: "Primeiros passos",
noToolsMatch: "Nenhuma ferramenta corresponde a '{query}'",
clearSearch: "Limpar busca",
requestToolCta: "Solicitar '{query}'",
requestToolBelowResults: "Não encontrou? Solicite uma ferramenta",
all: "Todas",
documents: "PDF",
data: "Arquivos",
pdf: "PDF",
files: "Arquivos",
toolCount: "{count} ferramentas",
heading: "Ferramentas SnapOtter",
},
fullscreenGrid: {
searchPlaceholder: "Buscar ferramentas...",
hideDetails: "Ocultar detalhes",
showDetails: "Mostrar detalhes",
switchToSidebar: "Alternar para visualização em barra lateral",
sidebarButton: "Barra lateral",
noToolsFound: "Nenhuma ferramenta encontrada",
tryDifferent: "Tente um termo de busca diferente",
},
editor: {
menu: {
file: {
label: "Arquivo",
new: "Novo",
open: "Abrir",
save: "Salvar",
exportAs: "Exportar como...",
quickExportPng: "Exportação rápida como PNG",
close: "Fechar",
},
edit: {
label: "Editar",
undo: "Desfazer",
redo: "Refazer",
cut: "Recortar",
copy: "Copiar",
copyMerged: "Copiar mesclado",
paste: "Colar",
pasteInPlace: "Colar no lugar",
delete: "Excluir",
freeTransform: "Transformação livre",
transform: {
label: "Transformar",
scale: "Escala",
rotate: "Girar",
skew: "Inclinar",
flipHorizontal: "Espelhar horizontal",
flipVertical: "Espelhar vertical",
},
},
image: {
label: "Imagem",
imageSize: "Tamanho da imagem...",
canvasSize: "Tamanho do canvas...",
rotation: {
label: "Rotação da imagem",
cw90: "90 sentido horário",
ccw90: "90 sentido anti-horário",
r180: "180",
flipHorizontal: "Espelhar horizontal",
flipVertical: "Espelhar vertical",
},
trim: "Cortar",
adjustments: {
label: "Ajustes",
brightnessContrast: "Brilho/Contraste",
hueSaturation: "Matiz/Saturação",
colorBalance: "Balanço de cores",
levels: "Níveis",
curves: "Curvas",
},
},
layer: {
label: "Camada",
newLayer: "Nova camada",
duplicateLayer: "Duplicar camada",
deleteLayer: "Excluir camada",
arrange: {
label: "Organizar",
bringToFront: "Trazer para frente",
bringForward: "Trazer para a frente",
sendBackward: "Enviar para trás",
sendToBack: "Enviar para o fundo",
},
mergeDown: "Mesclar para baixo",
flattenImage: "Achatar imagem",
},
select: {
label: "Seleção",
all: "Tudo",
deselect: "Desmarcar",
inverse: "Inverter",
colorRange: "Faixa de cores...",
},
filter: {
label: "Filtro",
blur: {
label: "Desfoque",
gaussian: "Desfoque gaussiano",
motion: "Desfoque de movimento",
radial: "Desfoque radial",
surface: "Desfoque de superfície",
},
sharpen: {
label: "Nitidez",
sharpen: "Nitidez",
unsharpMask: "Máscara de desfoque",
},
noise: {
label: "Ruído",
addNoise: "Adicionar ruído",
reduceNoise: "Reduzir ruído",
},
pixelate: {
label: "Pixelização",
pixelate: "Pixelizar",
mosaic: "Mosaico",
},
stylize: {
label: "Estilizar",
emboss: "Relevo",
solarize: "Solarizar",
posterize: "Posterizar",
},
grayscale: "Escala de cinza",
sepia: "Sépia",
invert: "Inverter",
},
view: {
label: "Visualizar",
zoomIn: "Aumentar zoom",
zoomOut: "Diminuir zoom",
fitOnScreen: "Ajustar à tela",
actualPixels: "Pixels reais",
rulers: "Réguas",
grid: "Grade",
guides: "Guias",
snap: "Encaixar",
panels: "Painéis",
},
},
menuBar: {
backTitle: "Voltar ao SnapOtter",
},
welcome: {
ariaLabel: "Área de soltar imagem",
heading: "Editor de imagens",
dropDescription: "Arraste uma imagem aqui para começar",
openImageButton: "Abrir imagem",
newDocumentButton: "Novo documento",
pasteHint: "Ou cole da área de transferência (Ctrl+V)",
},
mobile: {
heading: "Recomendado para desktop",
description:
"O editor de imagens funciona melhor em telas de desktop. Mude para um dispositivo com tela maior para a experiência completa de edição.",
},
errors: {
serverDecodeFailed: "Falha na decodificação do servidor",
},
shapes: {
shape: "Forma",
fill: "Preenchimento",
stroke: "Contorno",
strokeWidth: "Largura",
cornerRadius: "Raio",
sides: "Lados",
points: "Pontas",
dashStyle: "Tracejado",
solid: "Sólido",
dashed: "Tracejado",
dotted: "Pontilhado",
none: "Nenhum",
opacity: "Opacidade",
rectangle: "Retângulo",
ellipse: "Elipse",
line: "Linha",
arrow: "Seta",
polygon: "Polígono",
star: "Estrela",
},
},
settings: {
heading: "Configurações",
nav: {
general: "Geral",
systemSettings: "Configurações do sistema",
security: "Segurança",
people: "Pessoas",
teams: "Equipes",
roles: "Funções",
auditLog: "Registro de auditoria",
usage: "Uso",
apiKeys: "Chaves API",
aiFeatures: "Recursos de AI",
tools: "Ferramentas",
about: "Sobre",
},
general: {
heading: "Geral",
description: "Preferências do usuário e configurações de exibição.",
loading: "Carregando...",
logOut: "Sair",
defaultToolViewLabel: "Visualização padrão das ferramentas",
defaultToolViewDescription: "Como as ferramentas são exibidas na página inicial",
sidebarOption: "Barra lateral",
fullscreenGridOption: "Grade em tela cheia",
appVersionLabel: "Versão do app",
appVersionDescription: "Versão atual do SnapOtter",
saveButton: "Salvar configurações",
saveSuccess: "Configurações salvas.",
saveFailed: "Falha ao salvar as configurações.",
},
system: {
heading: "Configurações do sistema",
description: "Configuração do servidor e limites.",
fileUploadLimitLabel: "Limite de envio de arquivo (MB)",
fileUploadLimitDescription: "Tamanho máximo de arquivo por envio",
defaultThemeLabel: "Tema padrão",
defaultThemeDescription: "Tema aplicado para novas sessões",
lightOption: "Claro",
darkOption: "Escuro",
systemOption: "Sistema",
languageLabel: "Idioma",
languageDescription: "Idioma da interface",
loginAttemptLimitLabel: "Limite de tentativas de login",
loginAttemptLimitDescription:
"Máximo de tentativas de login falhadas por minuto antes do bloqueio",
fileManagementHeading: "Gerenciamento de arquivos",
maxFileAgeLabel: "Idade máxima dos arquivos (horas)",
maxFileAgeDescription:
"Por quanto tempo os arquivos processados são mantidos antes da limpeza automática",
startupCleanupLabel: "Limpeza na inicialização",
startupCleanupDescription: "Limpa arquivos temporários antigos quando o servidor inicia",
saveButton: "Salvar configurações",
saveSuccess: "Configurações salvas.",
saveFailed: "Falha ao salvar as configurações.",
limitsAndResources: "Limites e recursos",
maxFileSize: "Tamanho máximo de arquivo",
maxBatchSize: "Tamanho máximo de lote",
concurrentJobs: "Trabalhos simultâneos",
workerThreads: "Threads de trabalho",
maxPipelineSteps: "Passos máximos do Pipeline",
processingTimeout: "Tempo limite de processamento",
rateLimitPerMin: "Limite de requisições (req/min)",
unlimited: "Ilimitado",
auto: "Automático",
envOverride: "Definido por variável de ambiente",
maxCanvasPixels: "Pixels máximos do canvas",
maxSvgSize: "Tamanho máximo de SVG",
maxSplitGrid: "Grade máxima de divisão",
maxPdfPages: "Páginas máximas de PDF",
sessionDuration: "Duração da sessão",
supportBundleButton: "Baixar pacote de suporte",
supportBundleDescription:
"Baixe um ZIP de diagnóstico com configurações ocultadas, logs e dados de tarefas para solução de problemas.",
supportBundleFailed: "Falha ao baixar o pacote de suporte.",
},
privacy: {
title: "Privacidade",
description:
"As análises de produto anônimas ajudam a melhorar o SnapOtter. Elas ficam ativadas por padrão e são configuradas para toda a instância por um administrador.",
analyticsLabel: "Análises de produto anônimas",
analyticsDescription:
"Compartilhe dados de uso anônimos (quais ferramentas são executadas, durações, códigos de erro) e relatórios de falha. Sem endereço IP, sem identidade de conta. Nunca coletamos os nomes dos seus arquivos, o conteúdo dos arquivos, a saída de OCR, os metadados de imagem ou o texto de documentos. Desative isso para interromper tudo.",
},
security: {
heading: "Segurança",
description: "Configurações de senha e autenticação.",
changePasswordHeading: "Alterar senha",
currentPasswordPlaceholder: "Senha atual",
newPasswordPlaceholder: "Nova senha",
confirmPasswordPlaceholder: "Confirmar nova senha",
passwordsMismatch: "As senhas não coincidem",
passwordTooShort: "A senha deve ter pelo menos 4 caracteres",
changeSuccess: "Senha alterada com sucesso",
changeFailed: "Falha ao alterar a senha",
currentPasswordIncorrect: "A senha atual está incorreta",
changePasswordButton: "Alterar senha",
loginAttemptLimitNote:
"Os limites de tentativas de login podem ser configurados nas Configurações do sistema.",
adminHeading: "Configurações de segurança do administrador",
adminDescription:
"Configurações de política de segurança empresarial. Aplicam-se a todos os usuários.",
sessionIdleTimeout: "Tempo limite de inatividade da sessão (minutos)",
sessionIdleTimeoutDesc: "Encerrar sessões inativas automaticamente. 0 = desativado.",
maxSessionsPerUser: "Máximo de sessões por usuário",
maxSessionsPerUserDesc: "Limitar sessões simultâneas por usuário. 0 = ilimitado.",
mfaPolicy: "Política de MFA",
mfaPolicyDesc: "Exigir autenticação multifator para os usuários.",
mfaPolicyOptional: "Opcional",
mfaPolicyAdminsOnly: "Obrigatório para administradores",
mfaPolicyRequired: "Obrigatório para todos os usuários",
ssoEnforcement: "Imposição de SSO",
ssoEnforcementDesc: "Exigir login via SSO para todos os usuários sem acesso de emergência.",
ssoBreakGlassUsername: "Usuário administrador de emergência",
ssoBreakGlassUsernameDesc:
"Este administrador pode continuar acessando com credenciais locais quando o SSO está ativo.",
passwordMinLength: "Comprimento mínimo da senha",
passwordMinLengthDesc: "Número mínimo de caracteres exigido para senhas.",
passwordRequireUppercase: "Exigir maiúscula",
passwordRequireUppercaseDesc: "Exigir pelo menos uma letra maiúscula.",
passwordRequireNumber: "Exigir número",
passwordRequireNumberDesc: "Exigir pelo menos um número.",
passwordRequireSpecial: "Exigir caractere especial",
passwordRequireSpecialDesc: "Exigir pelo menos um caractere especial.",
passwordPolicyHeading: "Política de senhas",
securitySettingsSaved: "Configurações de segurança salvas",
securitySettingsFailed: "Falha ao salvar configurações de segurança",
},
people: {
heading: "Pessoas",
description: "Gerencie os membros do espaço de trabalho e suas permissões",
userCount: "{count} usuário",
userCountPlural: "{count} usuários",
searchPlaceholder: "Buscar membros...",
addMembersButton: "Adicionar membros",
newMemberHeading: "Novo membro",
usernamePlaceholder: "Nome de usuário",
passwordPlaceholder: "Senha",
roleUserOption: "Usuário",
roleEditorOption: "Editor",
roleAdminOption: "Administrador",
roleUserDescription: "Acesso básico às ferramentas",
roleEditorDescription: "Todos os arquivos e pipelines",
roleAdminDescription: "Acesso completo",
noDescription: "Sem descrição",
defaultTeamOption: "Padrão",
createButton: "Criar",
cancelButton: "Cancelar",
createSuccess: "Usuário criado com sucesso",
createFailed: "Falha ao criar o usuário",
userLimitReached: "Limite de usuários atingido ({max} máximo)",
deleteConfirm: 'Excluir usuário "{username}"? Esta ação não pode ser desfeita.',
deleteSuccess: 'Usuário "{username}" excluído',
deleteFailed: "Falha ao excluir o usuário",
editHeading: "Editar {username}",
updateSuccess: "Usuário atualizado",
updateFailed: "Falha ao atualizar o usuário",
cannotRemoveOwnAdmin: "Não é possível remover sua própria função de administrador",
resetPasswordHeading: "Redefinir senha de {username}",
newPasswordLabel: "Nova senha (min. 8 caracteres)",
resetPasswordButton: "Redefinir senha",
resetPasswordWarning: "Isso invalidará todas as sessões e chaves API deste usuário.",
resetSuccess: "Senha redefinida com sucesso",
resetFailed: "Falha ao redefinir a senha",
tableHeaderUser: "Usuário",
tableHeaderRole: "Função",
tableHeaderTeam: "Equipe",
noSearchResults: "Nenhum membro corresponde a sua busca.",
noUsersFound: "Nenhum usuário encontrado.",
authBadgeLocalOidc: "Local + OIDC",
authBadgeOidc: "OIDC",
editRoleTeamAction: "Editar função / equipe",
resetPasswordAction: "Redefinir senha",
deleteUserAction: "Excluir usuário",
saveButton: "Salvar",
copyPasswordButton: "Copiar senha",
passwordCopied: "Copiado!",
copyPasswordWarning: "Copie esta senha agora. Você não poderá vê-la após criar o usuário.",
},
teams: {
heading: "Equipes",
description: "Organize os membros em equipes para melhor gerenciamento.",
createButton: "Criar nova equipe",
newTeamHeading: "Nova equipe",
teamNamePlaceholder: "Nome da equipe",
createSubmitButton: "Criar",
cancelButton: "Cancelar",
createSuccess: "Equipe criada com sucesso",
createFailed: "Falha ao criar a equipe",
duplicateTeamError: "Já existe uma equipe com esse nome",
renameSuccess: "Equipe renomeada",
renameFailed: "Falha ao renomear a equipe",
deleteConfirm: 'Excluir equipe "{name}"? Os membros serão desvinculados.',
deleteSuccess: 'Equipe "{name}" excluída',
deleteFailed: "Falha ao excluir a equipe",
cannotDeleteDefault: "Não é possível excluir a equipe padrão ou uma equipe com membros",
tableHeaderTeamName: "Nome da equipe",
tableHeaderMembers: "Membros",
emptyState: "Nenhuma equipe encontrada.",
renameSaveButton: "Salvar",
renameCancelButton: "Cancelar",
renameAction: "Renomear",
deleteAction: "Excluir",
totalMembers: "Total de membros",
nameRequired: "O nome da equipe é obrigatório",
nameTooLong: "O nome da equipe deve ter 50 caracteres ou menos",
duplicateName: "Já existe uma equipe com este nome",
teamStorageQuota: "Cota de armazenamento (MB)",
teamStorageQuotaDesc:
"Armazenamento máximo para esta equipe em MB. Deixe vazio para sem limite.",
teamRetentionHours: "Retenção (horas)",
teamRetentionHoursDesc:
"Retenção de arquivos processados desta equipe. Deixe vazio para usar o padrão global.",
quotaSaved: "Configurações da equipe salvas",
},
roles: {
heading: "Funções",
description:
"Gerencie funções e suas permissões. Funções predefinidas não podem ser modificadas.",
createButton: "Criar função personalizada",
newRoleHeading: "Nova função",
roleNamePlaceholder: "Nome da função",
descriptionPlaceholder: "Descrição (opcional)",
permissionsLabel: "Permissões",
createSubmitButton: "Criar",
cancelButton: "Cancelar",
createSuccess: "Função criada com sucesso",
createFailed: "Falha ao criar a função",
duplicateRoleError: "Já existe uma função com esse nome",
editHeading: "Editar função: {name}",
editSaveButton: "Salvar",
editCancelButton: "Cancelar",
updateSuccess: "Função atualizada",
updateFailed: "Falha ao atualizar a função",
deleteConfirm: 'Excluir função "{name}"? {count} usuário(s) precisarão ser reatribuídos.',
deleteConfirmSimple: 'Excluir função "{name}"?',
deleteSuccess: 'Função "{name}" excluída',
deleteFailed: "Falha ao excluir a função",
emptyState: "Nenhuma função encontrada.",
builtInBadge: "Predefinida",
userCountBadge: "{count} usuário(s)",
editRoleTitle: "Editar função",
deleteRoleTitle: "Excluir função",
permGroup: {
tools: "Ferramentas",
files: "Arquivos",
apiKeys: "Chaves API",
pipelines: "Pipelines",
settings: "Configurações",
users: "Usuários",
teams: "Equipes",
system: "Sistema",
},
},
auditLog: {
heading: "Registro de auditoria",
allActionsFilter: "Todas as ações",
emptyState: "Nenhuma entrada no registro de auditoria.",
tableHeaderTime: "Hora",
tableHeaderUser: "Usuário",
tableHeaderAction: "Ação",
tableHeaderTarget: "Alvo",
paginationInfo: "Página {page} de {totalPages} ({total} entradas)",
previousButton: "Anterior",
nextButton: "Próximo",
justNow: "agora mesmo",
minutesAgo: "há {mins}min",
hoursAgo: "há {hrs}h",
daysAgo: "há {days}d",
},
usage: {
heading: "Uso",
description: "Estatísticas de uso local de tarefas e armazenamento de arquivos.",
periodLabel: "Período",
days7: "7 dias",
days30: "30 dias",
days90: "90 dias",
jobsPerDayHeading: "Tarefas por dia",
topToolsHeading: "Ferramentas mais usadas",
perUserHeading: "Volume por usuário",
durationsHeading: "Percentis de duração",
noData: "Sem dados para este período.",
dayColumn: "Dia",
totalColumn: "Total",
completedColumn: "Concluídos",
failedColumn: "Falhas",
toolColumn: "Ferramenta",
runsColumn: "Execuções",
userColumn: "Usuário",
bytesInColumn: "Bytes entrada",
poolColumn: "Pool",
p50Column: "p50",
p95Column: "p95",
storageHeading: "Armazenamento da biblioteca",
storageFiles: "{count} arquivos",
unknownUser: "(desconhecido)",
storageByTeam: "Armazenamento por equipe",
teamColumn: "Equipe",
storageColumn: "Armazenamento",
usersColumn: "Usuários",
},
apiKeys: {
heading: "Chaves API",
description: "Gerencie as chaves API para acesso programático ao SnapOtter.",
keyNamePlaceholder: "Nome da chave (opcional)",
generateButton: "Gerar chave API",
removeScopingLabel: "Remover restrição de permissões",
restrictPermissionsLabel: "Restringir permissões (opcional)",
expiresLabel: "Expira:",
clearButton: "Limpar",
copyTitle: "Copiar",
keyWarning: "Guarde esta chave em local seguro. Ela não será exibida novamente.",
existingKeysHeading: "Chaves existentes",
createdPrefix: "Criada em {date}",
scopedPrefix: "Escopo:",
expiresPrefix: "Expira em {date}",
deleteKeyTitle: "Excluir chave",
deleteConfirm: "Excluir esta chave API? As integrações que a utilizam deixarão de funcionar.",
emptyState: "Nenhuma chave API ainda. Gere uma para começar.",
},
tools: {
heading: "Ferramentas",
description:
"Ative ou desative ferramentas individuais. Ferramentas desativadas ficam ocultas para todos os usuários.",
restartBanner: "É necessário reiniciar para que as alterações tenham efeito.",
searchPlaceholder: "Buscar ferramentas...",
noSearchResults: "Nenhuma ferramenta corresponde a sua busca.",
loadFailedError:
"Falha ao carregar as configurações das ferramentas. O salvamento está desativado para evitar perda de dados.",
saveButton: "Salvar configurações das ferramentas",
disabledCount: "{count} ferramenta(s) desativada(s)",
},
experimental: {
label: "Ativar ferramentas experimentais",
description: "Mostra ferramentas que ainda estão em desenvolvimento. Podem ser instáveis.",
},
fileManagement: {
title: "Gerenciamento de arquivos",
maxAge: "Idade máxima dos arquivos (horas)",
maxAgeDescription:
"Por quanto tempo os arquivos processados são mantidos antes da limpeza automática",
startupCleanup: "Limpeza na inicialização",
startupCleanupDescription: "Limpa arquivos temporários antigos quando o servidor inicia",
},
dataRetention: {
title: "Retenção de dados",
fileMaxAgeHours: "Retenção de arquivos processados (horas)",
fileMaxAgeHoursDesc:
"Por quanto tempo manter arquivos enviados e processados. Padrão: 72 horas.",
jobsRetentionDays: "Retenção de registros de tarefas (dias)",
jobsRetentionDaysDesc:
"Por quanto tempo manter metadados de tarefas. 0 = manter para sempre. Padrão: 30 dias.",
auditRetentionDays: "Retenção do log de auditoria (dias)",
auditRetentionDaysDesc:
"Por quanto tempo manter registros de auditoria. 0 = manter para sempre. Padrão: para sempre.",
},
aiFeatures: {
title: "Recursos de AI",
description: "Gerencie pacotes de modelos de IA para processamento avançado de arquivos.",
installAll: "Instalar tudo",
diskUsage: "Uso do disco: {size}",
sizeOnDisk: "{size} em disco",
installed: "Instalado",
notInstalled: "Não instalado",
queued: "Na fila",
install: "Instalar",
repair: "Reparar",
uninstall: "Desinstalar",
installing: "Instalando...",
importBundle: "Importar pacote",
importDescription: "Envie um arquivo .tar.gz exportado de outra instalação.",
importButton: "Importar de arquivo",
importing: "Importando...",
importSuccess: "Pacote importado com sucesso.",
importError: "Falha ao importar pacote: {error}",
},
about: {
heading: "Sobre",
appName: "SnapOtter",
appDescription:
"Uma suite de processamento de arquivos auto-hospedada e focada em privacidade, com 200+ ferramentas. Converta, comprima, edite, transcreva, OCR, e automatize fluxos de trabalho de imagem, vídeo, áudio, documentos e dados sem enviar dados para a nuvem.",
versionLabel: "Versão:",
linksHeading: "Links",
githubLink: "Repositório no GitHub",
docsLink: "Documentação",
apiRefLink: "Referência da API (Swagger)",
licenseLabel: "Licença:",
licenseDescription:
"SnapOtter é um software de código aberto licenciado sob a GNU Affero General Public License v3 (AGPLv3).",
},
},
auth: {
login: "Entrar",
logout: "Sair",
username: "Nome de usuário",
password: "Senha",
loginButton: "Entrar",
loggingIn: "Entrando...",
invalidCredentials: "Nome de usuário ou senha inválidos",
connectionError: "Erro de conexão",
signInWith: "Entrar com {provider}",
signInWithSso: "Entrar com SSO",
or: "ou",
methodLocal: "Local",
methodOidc: "OIDC",
methodBoth: "Local + OIDC",
oidcAuthFailed: "Autenticação falhou. Tente novamente.",
oidcProviderUnreachable:
"Não foi possível contatar o provedor de identidade. Tente novamente mais tarde.",
oidcSessionExpired: "Sessão de login expirada. Tente novamente.",
oidcUserNotAuthorized:
"Sua conta não está autorizada a acessar este aplicativo. Entre em contato com o administrador.",
oidcUserLimitReached: "Limite de usuários atingido. Entre em contato com o administrador.",
oidcGenericError: "Erro de autenticação. Tente novamente.",
samlAuthFailed: "Falha na autenticação SAML. Tente novamente.",
samlUserNotAuthorized:
"Sua conta não está autorizada a acessar esta aplicação. Contate o administrador.",
samlUserLimitReached: "Limite de usuários atingido. Contate o administrador.",
ssoEnforcedLocalRestricted: "O login local é restrito a administradores autorizados.",
mfaRequired: "Digite seu código de autenticação",
mfaRecoveryHint: "Você também pode usar um código de recuperação",
verify: "Verificar",
verifying: "Verificando...",
mfaInvalidCode: "Código inválido. Tente novamente.",
mfaEnrollmentRequired:
"Sua organização exige autenticação multifator. Configure o MFA nas configurações da sua conta.",
methodSaml: "SAML",
passwordManagedByProvider:
"Alterações de senha são gerenciadas pelo seu provedor de identidade.",
enterUsername: "Digite seu nome de usuário",
enterPassword: "Digite sua senha",
heroTitle: "Seus arquivos. Ficam com você.",
heroSubtitle: "Todas as ferramentas que você precisa.",
rotatingPhrases: [
"Sem cadastro. Sem contas.",
"Sem envio para a nuvem. Nunca.",
"Processamento 100% local.",
"Gratuito. Para sempre.",
"Sem limites. Sem tetos ocultos.",
"Funciona totalmente offline.",
"Processamento em lote ilimitado.",
"200+ ferramentas.",
"15 modelos AI. Seu hardware.",
"Ultra rápido. Construído sobre Sharp.",
"Pronto para redes isoladas.",
"Um único container Docker.",
"Código aberto. Sempre.",
"Cada pixel fica no seu hardware.",
"Seu servidor. Suas regras.",
"Instala com um único docker pull.",
"A alternativa auto-hospedada.",
"Redimensione, comprima, converta. Localmente.",
"Editor de imagens gratuito. Sem marcas d'água.",
"Processamento em lote de arquivos. Ilimitado.",
"Remova fundos offline.",
"Alternativa auto-hospedada ao Canva.",
"Sem chaves API necessárias.",
"Conformidade LGPD por design.",
"Funciona sem internet.",
],
},
changePassword: {
title: "Altere sua senha",
description:
"Você precisa definir uma nova senha antes de continuar. Sua senha deve ter pelo menos 8 caracteres com maiúsculas, minúsculas e um número.",
usernameLabel: "Nome de usuário",
currentPasswordLabel: "Senha atual",
currentPasswordPlaceholder: "Digite a senha atual",
newPasswordLabel: "Nova senha",
generateButton: "Gerar senha forte",
newPasswordPlaceholder: "Pelo menos 8 caracteres",
confirmPasswordLabel: "Confirmar nova senha",
confirmPasswordPlaceholder: "Repita a nova senha",
passwordsMismatch: "As senhas não coincidem",
failedError: "Falha ao alterar a senha",
connectionError: "Erro de conexão",
changingButton: "Alterando...",
changeButton: "Alterar senha",
sidebarTitle: "Quase lá",
sidebarDescription: "Defina uma senha forte para proteger sua conta e você estará pronto.",
},
automate: {
title: "Automatizar",
invalidPipelineFile: "Não é um arquivo Pipeline do SnapOtter válido",
newerVersion: "Este Pipeline foi criado com uma versão mais recente do SnapOtter",
missingName: "O arquivo Pipeline não tem nome",
noSteps: "O arquivo Pipeline não tem passos",
importFailed: "Falha na importação",
couldNotRead: "Não foi possível ler o arquivo Pipeline",
fileCount: "{count} arquivo",
fileCountPlural: "{count} arquivos",
importFromLibrary: "Importar da biblioteca",
addButton: "+ Adicionar",
libraryButton: "Biblioteca",
clearButton: "Limpar",
processingFailed: "Falha ao processar este arquivo",
processingMultiple: "Processando {count} arquivos...",
processingPipeline: "Processando Pipeline...",
processButton: "Processar",
processButtonMultiple: "Processar ({count})",
processAllButton: "Processar todos ({count})",
addTool: "Adicionar ferramenta",
toolPalette: "Paleta de ferramentas",
clickToAdd: "Clique para adicionar ao Pipeline",
savedLabel: "Salvo",
templatesLabel: "Modelos",
importButton: "Importar",
noSavedPipelines: "Nenhum Pipeline salvo",
stepCount: "({count} passo)",
stepCountPlural: "({count} passos)",
exportPipeline: "Exportar Pipeline",
deletePipeline: "Excluir Pipeline",
moreCount: "+{count} mais",
pipelineBuilder: "Construtor de Pipeline",
addToolsPrompt: "Adicione ferramentas da paleta para começar",
stepsConfigured: "{count} passo configurado",
stepsConfiguredPlural: "{count} passos configurados",
noFilesLoaded: "Nenhum arquivo carregado",
downloadZip: "Baixar ZIP",
saveButton: "Salvar",
pipelineNamePlaceholder: "Nome do Pipeline",
descriptionPlaceholder: "Descrição",
savingIndicator: "...",
cancelButton: "Cancelar",
preview: "Visualização",
previousImage: "Arquivo anterior",
nextImage: "Próximo arquivo",
imageCounter: "{current} / {total}",
imageArea: "Área de visualização",
templateSocialMedia: "Pronto para redes sociais",
templatePrivacyClean: "Limpeza de privacidade",
templateWebOptimization: "Otimização para web",
templateProfilePicture: "Foto de perfil",
templateWatermarkBatch: "Lote de marcas d'água",
createNew: "Criar nova automação",
savedAutomations: "Automações salvas",
templates: "Modelos",
addStep: "Adicionar passo",
removeStep: "Remover",
moveUp: "Mover para cima",
moveDown: "Mover para baixo",
savePipeline: "Salvar Pipeline",
runPipeline: "Processar",
pipelineName: "Nome do Pipeline",
pipelineDescription: "Descrição (opcional)",
noStepsPrompt: "Adicione passos para construir sua automação",
noStepsHeading: "Nenhuma etapa ainda",
searchToolsPlaceholder: "Buscar ferramentas...",
step: "Passo",
modalityWarning: "Incompatibilidade de modalidade",
modalityWarningTooltip:
"Esta etapa espera {expected}, mas recebe {received}; pode falhar ao executar o pipeline.",
},
nav: {
tools: "Ferramentas",
reader: "Leitor",
automate: "Automatizar",
editor: "Editor",
files: "Arquivos",
help: "Ajuda",
settings: "Configurações",
grid: "Grade",
},
files: {
myFiles: "Meus arquivos",
recentTab: "Recentes",
uploadTab: "Enviar arquivos",
fileDetailsAriaLabel: "Detalhes do arquivo",
fileDetailsHeading: "Detalhes do arquivo",
searchPlaceholder: "Buscar arquivos...",
selectedCount: "{count} selecionados",
fileCount: "{count} arquivos",
fileCountSingular: "{count} arquivo",
noFilesFound: "Nenhum arquivo encontrado",
selectFilePrompt: "Selecione um arquivo para ver os detalhes",
openFile: "Abrir arquivo",
selectFile: "Selecionar arquivo",
openInPipeline: "Abrir no Pipeline",
dropFilesHere: "Solte os arquivos aqui",
orClickToSelect: "ou clique para selecionar arquivos",
name: "Nome",
format: "Formato",
size: "Tamanho",
dimensions: "Dimensões",
version: "Versão",
toolsUsed: "Ferramentas usadas",
none: "Nenhum",
delete: "Excluir",
pipeline: "Pipeline",
download: "Baixar",
},
dropzone: {
unsupportedFileType: "Este tipo de arquivo não é suportado por esta ferramenta",
urlFetchFailed: "Não foi possível obter a imagem da URL",
ariaLabel: "Área de soltar arquivos",
dropPrompt: "Arraste suas imagens aqui",
browseOrPaste: "use o botão de upload ou cole da área de transferência",
uploadButton: "Enviar",
defaultFormats: "PNG, JPG, WebP, HEIC, RAW, PSD e mais de 65 formatos",
orSeparator: "ou",
urlPlaceholder: "Cole a URL da imagem...",
urlLoadingIndicator: "...",
addUrlButton: "Adicionar",
importMultipleUrls: "Importar múltiplas URLs...",
filesSelected: "{count} arquivos selecionados",
dropToAdd: "Solte para adicionar arquivos",
dropToReplace: "Solte para substituir arquivo",
},
reviewPanel: {
processedResultAlt: "Resultado processado",
sizeLabel: "Tamanho: {size}",
typeLabel: "Tipo: {type}",
processedLabel: "Processado: {time}",
undoButton: "Desfazer",
downloadButton: "Baixar",
openInEditor: "Abrir no editor",
reviewHeading: "Revisão",
continueEditing: "Continuar editando",
},
features: {
notEnabledTitle: "Recurso não ativado",
notEnabledDescription:
"Este recurso não está ativado. Peça ao administrador para ativá-lo nas Configurações.",
requiresDownload: "Este recurso requer um download adicional (~{size})",
retryButton: "Tentar novamente",
queued: "Na fila para instalação...",
enableButton: "Ativar {name}",
repairRequired: "Reparo necessário",
repairDescription:
"Alguns arquivos de modelo estão ausentes ou corrompidos. O reparo irá baixá-los novamente.",
repairButton: "Reparar {name}",
lessThanMinute: "Menos de um minuto restante",
oneMinuteLeft: "~1 minuto restante",
minutesLeft: "~{mins} minutos restantes",
progressMessages: [
"Quase lá... provavelmente...",
"Coisas boas levam tempo...",
"Ainda mais rápido que ver a tinta secar...",
"Sua paciência é realmente inspiradora...",
"Trabalhando mais do que parece...",
"Essa é a parte empolgante, confia...",
"Fazendo coisas importantes nos bastidores...",
"Se você está lendo isso, está funcionando...",
"Preparando algo incrível...",
"Vale cada segundo, prometo...",
"O suspense faz parte da experiência...",
"Ensinando truques novos ao seu computador...",
"Configurando seus superpoderes...",
"Seus arquivos vão te agradecer depois...",
"Carregando... mas com estilo...",
"Hora perfeita para um cafezinho...",
"Roma também não foi construída em um dia...",
"Shhh... gênio trabalhando...",
"Seus projetos vão ficar com inveja do que vem aí...",
"Montando o time dos sonhos...",
"Desempacotando coisas incríveis...",
"Quase terminei de pensar em começar... brincadeira...",
"Plot twist: isso está realmente fazendo algo...",
"Aquecendo os motores criativos...",
"Imaginação carregando...",
"Não é um protetor de tela, prometemos...",
"A grande arte leva tempo para instalar...",
"Seu eu do futuro vai te agradecer...",
"Buscando arquivos super inteligentes...",
"Aguenta firme, o melhor ainda está por vir...",
],
},
help: {
heading: "Ajuda",
gettingStarted: {
heading: "Primeiros passos",
description:
"Selecione uma ferramenta na barra lateral ou busque uma. Envie um arquivo arrastando-o para a página ou clicando na área de envio. Ajuste as configurações e baixe seu resultado.",
},
keyboardShortcuts: {
heading: "Atalhos de teclado",
focusSearchBar: "Focar na barra de busca",
goToTools: "Ir para ferramentas",
toggleTheme: "Alternar tema",
goToResize: "Ir para Redimensionar",
goToCrop: "Ir para Cortar",
goToCompress: "Ir para Comprimir",
goToConvert: "Ir para Converter",
goToRemoveBackground: "Ir para Remover fundo",
goToWatermarkText: "Ir para Marca d'água de texto",
goToStripMetadata: "Ir para Remover metadados",
goToImageInfo: "Ir para Info da imagem",
processFile: "Processar arquivo",
downloadResult: "Baixar resultado",
},
resources: {
heading: "Recursos",
githubLink: "Repositório no GitHub",
reportIssueLink: "Relatar um problema",
docsLink: "Documentação",
apiRefLink: "Referência da API (Swagger)",
},
versionLabel: "SnapOtter v{version}",
},
errors: {
generic: "Ocorreu um erro",
offline: "Você está offline",
reconnecting: "Reconectando ao servidor...",
connected: "Conectado",
processingFailed: "Falha ao processar este arquivo",
timeout: "A requisição expirou. O servidor pode estar sobrecarregado. Tente novamente.",
networkError: "Erro de rede. Verifique sua conexão.",
invalidCredentials: "Nome de usuário ou senha inválidos",
connectionError: "Erro de conexão",
},
sidebar: {
tools: "Ferramentas",
grid: "Grade",
automate: "Automatizar",
editor: "Editor",
files: "Arquivos",
help: "Ajuda",
settings: "Configurações",
},
toolCard: {
addToFavourites: "Adicionar aos favoritos",
},
appLayout: {
mobileNavTools: "Ferramentas",
mobileNavAutomate: "Automatizar",
mobileNavEditor: "Editor",
mobileNavFiles: "Arquivos",
mobileNavSettings: "Configurações",
},
a11y: {
skipToContent: "Pular para o conteúdo principal",
openSidebar: "Abrir barra lateral",
closeSidebar: "Fechar barra lateral",
closeSettings: "Fechar configurações",
closeHelp: "Fechar ajuda",
closeDialog: "Fechar diálogo",
zoomIn: "Aumentar zoom",
zoomOut: "Diminuir zoom",
fitToView: "Ajustar à tela",
actualSize: "Tamanho real",
pan: "Mover",
previousImage: "Arquivo anterior",
nextImage: "Próximo arquivo",
imageArea: "Área de visualização",
imageViewer: "Visualizador de arquivos",
fileDropZone: "Área para soltar arquivos",
imageDropZone: "Zona de soltar arquivos",
beforeAfterSlider: "Controle deslizante de comparação antes/depois",
imageControls: "Controles de visualização",
zoomControls: "Controles de zoom",
dragToReorder: "Arraste para reordenar",
whiteBackground: "Fundo branco",
blackBackground: "Fundo preto",
expandPanel: "Expandir painel",
collapsePanel: "Recolher painel",
swapDimensions: "Trocar dimensões",
applyCrop: "Aplicar recorte",
cancelCrop: "Cancelar recorte",
fontFamily: "Família da fonte",
textColor: "Cor do texto",
flipHorizontal: "Espelhar horizontalmente",
flipVertical: "Espelhar verticalmente",
hexColorValue: "Valor de cor HEX",
backgroundColor: "Cor de fundo",
foregroundColor: "Cor de primeiro plano",
swapColors: "Trocar cores de primeiro plano e fundo",
resetColors: "Redefinir para preto e branco padrão",
foregroundHex: "Valor HEX da cor de primeiro plano",
undo: "Desfazer",
redo: "Refazer",
layers: "Camadas",
addLayer: "Adicionar camada",
deleteLayer: "Excluir camada",
cancelOperation: "Cancelar operação",
fill: "Preencher",
fileDetails: "Detalhes do arquivo",
language: "Idioma",
selected: "Selecionado",
deleteKey: "Excluir chave",
editRole: "Editar cargo",
deleteRole: "Excluir cargo",
notInstalled: "Não instalado",
queued: "Na fila para instalação",
installing: "Instalando",
imageNOfTotal: "Imagem {n} de {total}",
processingComplete: "Imagem processada com sucesso",
processingFailed: "Falha no processamento",
settingsDialog: "Configurações",
helpDialog: "Ajuda",
navigationMenu: "Navegação",
homeLink: "Início do SnapOtter",
},
pipelineTemplates: {
"web-optimize": {
name: "Otimizar para a web",
description:
"Redimensione, converta para WebP e comprima uma imagem para carregamento rápido na web.",
},
"email-friendly": {
name: "Compatível com e-mail",
description: "Reduza uma imagem para que fique pequena o suficiente para anexar a um e-mail.",
},
"privacy-scrub": {
name: "Limpeza de privacidade",
description: "Remova EXIF, GPS e outros metadados e, em seguida, comprima.",
},
"social-square": {
name: "Quadrado para redes sociais",
description: "Recorte em um quadrado 1:1 e comprima para publicações nas redes sociais.",
},
"watermark-batch": {
name: "Marca-d'água em lote",
description: "Aplique uma marca-d'água de texto nas imagens e, em seguida, comprima.",
},
"shrink-pdf-email": {
name: "Reduzir PDF para e-mail",
description:
"Achate e comprima um PDF de forma agressiva para respeitar os limites de e-mail.",
},
"podcast-polish": {
name: "Acabamento de podcast",
description: "Remova os silêncios, normalize o volume e adicione fades a uma gravação.",
},
"cut-out-subject": {
name: "Recortar o objeto",
description: "Remova o fundo com IA e comprima o recorte transparente.",
},
"restore-old-photo": {
name: "Restaurar foto antiga",
description: "Repare, colorize e amplie uma foto antiga ou danificada com IA.",
},
},
} as const;
export default ptBR;