{
  "_meta": {
    "locale": "pt-BR",
    "status": "machine-draft",
    "note": "Português do Brasil completo. O núcleo (interface, início, treinamentos, contato, certificações, apoio, admin) é tradução revisada e idiomática; as seções narrativas longas (Sobre, História, Fabricantes, Como eu ensino, Colofão) foram completadas com auxílio de IA. Recomendação: uma revisão nativa completa antes de campanhas de marketing. Tratamento informal (você). Sem travessões. Variáveis e nomes próprios inalterados."
  },
  "site": {
    "name": "ronutz",
    "tagline": "Ferramentas de rede e segurança que rodam na sua máquina, não na nuvem de outra pessoa."
  },
  "nav": {
    "tools": "Ferramentas",
    "about": "Sobre",
    "certifications": "Certificações",
    "training": "Treinamentos",
    "contact": "Contato",
    "skipToContent": "Pular para o conteúdo",
    "openMenu": "Abrir menu",
    "closeMenu": "Fechar menu",
    "learn": "Aprender",
    "endorsements": "Depoimentos",
    "certs": "Certificações"
  },
  "languageSwitcher": {
    "label": "Idioma",
    "stubNotice": "Este idioma ainda não foi traduzido. Exibindo em inglês."
  },
  "home": {
    "hero": {
      "eyebrow": "Feito por quem é da área, com privacidade em primeiro lugar",
      "title": "A caixa de ferramentas de rede e segurança que mantém seus dados na sua máquina.",
      "subtitle": "Cálculo de sub-redes, diagnóstico de DNS e e-mail, inspeção de certificados e muito mais, processado localmente no seu navegador. Sem envio, sem registro, sem necessidade de conta para as ferramentas do dia a dia.",
      "ctaPrimary": "Abrir a caixa de ferramentas",
      "ctaSecondary": "Quem desenvolve isto"
    },
    "credibility": {
      "title": "Feito por quem coloca a mão na massa desde 1996.",
      "body": "Trinta anos em redes e segurança corporativa, entregues por um instrutor que está na ativa, e não por uma página de marketing. Certificado em quatro plataformas, então as comparações aqui são feitas com honestidade, não para vender.",
      "aboutCta": "Mais sobre quem está por trás"
    },
    "pillars": {
      "title": "Quatro plataformas, ensinadas e mantidas atualizadas.",
      "f5": "F5",
      "fortinet": "Fortinet",
      "extreme": "Extreme Networks",
      "netskope": "Netskope"
    },
    "privacy": {
      "title": "Por que processar localmente faz diferença em segurança.",
      "body": "Quando você cola uma configuração, uma captura de pacotes ou um certificado em uma ferramenta, esses dados costumam conter segredos. Aqui, as ferramentas do dia a dia rodam inteiramente no seu navegador. A informação nunca sai do seu dispositivo, então não há o que registrar, vazar ou intimar judicialmente."
    },
    "toolPreview": {
      "title": "Experimente uma ferramenta agora.",
      "body": "A calculadora CIDR abaixo roda localmente. Digite uma rede e um prefixo para ver o intervalo de endereços, a quantidade de hosts e a máscara. Nada é enviado a lugar nenhum.",
      "learnHeading": "Aprenda os conceitos",
      "toolboxCta": "Abrir a caixa de ferramentas completa",
      "seeAllArticles": "Ver todos os artigos"
    },
    "provenance": {
      "title": "Créditos e fontes",
      "show": "Mostrar",
      "hide": "Ocultar",
      "basisLabel": "Como funciona",
      "sourcesLabel": "Normas e fontes"
    },
    "funding": {
      "title": "Apoie esta ferramenta",
      "pitch": "Esta ferramenta é gratuita e foi feita para continuar assim. Se ela conquistar um lugar no seu fluxo de trabalho, você pode ajudar a financiar sua manutenção e o que vem a seguir.",
      "purposeLabel": "Financiando agora"
    },
    "stats": {
      "tools": "Ferramentas",
      "articles": "Artigos",
      "sectionLabel": "O conjunto de ferramentas em números"
    }
  },
  "tools": {
    "cidr": {
      "title": "Calculadora CIDR",
      "description": "Calcule os endereços de rede e de broadcast, o intervalo de hosts utilizáveis, a quantidade de hosts e a máscara de um bloco CIDR IPv4. Roda localmente no seu navegador.",
      "inputLabel": "Bloco CIDR",
      "inputPlaceholder": "192.168.1.0/24",
      "compute": "Calcular",
      "runsLocally": "Roda localmente, nada é enviado a nenhum servidor.",
      "prefixSlider": "Comprimento do prefixo",
      "bitsHeading": "Bits do endereço",
      "bitsNetwork": "Rede",
      "bitsHost": "Host",
      "bitsNote": "Os bits destacados identificam a rede — os demais endereçam hosts dentro dela.",
      "results": {
        "network": "Endereço de rede",
        "broadcast": "Endereço de broadcast",
        "netmask": "Máscara de rede",
        "wildcard": "Máscara curinga",
        "firstHost": "Primeiro host utilizável",
        "lastHost": "Último host utilizável",
        "totalAddresses": "Total de endereços",
        "usableHosts": "Hosts utilizáveis"
      },
      "errors": {
        "empty": "Digite um bloco CIDR para calcular.",
        "invalid": "Isto não parece um bloco CIDR válido. Tente um formato como 192.168.1.0/24."
      },
      "name": "Calculadora CIDR / de sub-redes",
      "blurb": "Decomponha qualquer bloco CIDR de IPv4 em endereços de rede e de broadcast, faixa de hosts utilizáveis, contagem de hosts e máscara de rede. Roda inteiramente no seu navegador.",
      "modes": {
        "subnet": "Sub-rede",
        "vlsm": "VLSM",
        "supernet": "Super-rede",
        "overlap": "Sobreposição / lacuna"
      },
      "modeDesc": {
        "subnet": "Analisa um único bloco CIDR IPv4: rede, broadcast, máscara e faixa de hosts.",
        "vlsm": "Divide um bloco pai em sub-redes de tamanho variável conforme uma lista de quantidades de hosts.",
        "supernet": "Resume uma lista de prefixos no menor conjunto de blocos que os cobre.",
        "overlap": "Detecta sobreposições e contenção entre prefixos, além de lacunas dentro de um escopo opcional."
      },
      "vlsm": {
        "parentLabel": "Bloco pai",
        "reqsLabel": "Requisitos de sub-rede",
        "namePlaceholder": "Nome (opcional)",
        "hostsPlaceholder": "Hosts",
        "addRow": "Adicionar sub-rede",
        "remove": "Remover",
        "run": "Alocar",
        "th": {
          "name": "Nome",
          "hosts": "Hosts",
          "network": "Rede",
          "prefix": "Prefixo",
          "netmask": "Máscara de rede",
          "range": "Faixa utilizável",
          "broadcast": "Broadcast",
          "usable": "Hosts utilizáveis"
        },
        "stat": {
          "parent": "Pai",
          "used": "Usados",
          "free": "Livres",
          "utilization": "Utilização"
        },
        "unfit": "Não couberam",
        "parentPlaceholder": "10.0.0.0/24"
      },
      "supernet": {
        "label": "Prefixos a agregar",
        "run": "Agregar",
        "minimal": "Conjunto mínimo de cobertura",
        "single": "Super-rede única",
        "singleExtra": "Adiciona {extra} endereços extras além das entradas.",
        "stat": {
          "inputs": "Prefixos de entrada",
          "addresses": "Endereços",
          "blocks": "Blocos agregados"
        },
        "placeholder": "192.168.0.0/24\n192.168.1.0/24"
      },
      "overlap": {
        "label": "Prefixos a verificar",
        "scopeLabel": "Escopo (opcional, habilita a detecção de lacunas)",
        "run": "Verificar",
        "overlapsTitle": "Sobreposições",
        "noOverlaps": "Nenhuma sobreposição encontrada.",
        "gapsTitle": "Lacunas no escopo",
        "noGaps": "Nenhuma lacuna no escopo informado.",
        "kind": {
          "identical": "idêntico a",
          "contains": "contém",
          "contained": "está dentro de",
          "partial": "sobrepõe parcialmente"
        },
        "addresses": "endereços",
        "stat": {
          "covered": "Cobertos",
          "scope": "Escopo"
        },
        "placeholder": "10.0.0.0/24\n10.0.0.128/25",
        "scopePlaceholder": "10.0.0.0/16"
      },
      "err": {
        "ipv4": "Não é um endereço IPv4 válido. Use quatro octetos de 0 a 255, como 192.168.1.0.",
        "octet": "Um octeto está fora do intervalo (cada um deve estar entre 0 e 255).",
        "format": "Era esperado o formato A.B.C.D/prefixo, como 192.168.1.0/24.",
        "prefix": "O comprimento do prefixo deve estar entre 0 e 32.",
        "tooMany": "Entradas demais. Reduza a lista e tente novamente.",
        "noReqs": "Adicione ao menos um requisito de sub-rede com uma quantidade de hosts.",
        "noPrefixes": "Insira ao menos um prefixo, um por linha."
      },
      "rangeHeading": "Layout de endereços",
      "usableShort": "utilizáveis",
      "rfcNote": "/31 e /32 não reservam nada: todo endereço é utilizável (RFC 3021).",
      "reservedNote": "O primeiro endereço é a rede e o último é o broadcast; ambos são reservados, então utilizáveis = total − 2."
    },
    "secure-headers": {
      "name": "Analisador de Cabeçalhos de Segurança",
      "blurb": "Cole uma resposta HTTP e veja uma análise com nota dos cabeçalhos de segurança, flags de cookies e política de origem cruzada, verificada contra OWASP, RFC 6797, CSP Level 3 e RFC 6265bis.",
      "inputLabel": "Resposta HTTP ou bloco de cabeçalhos",
      "inputPlaceholder": "HTTP/2 200\nstrict-transport-security: max-age=63072000; includeSubDomains; preload\ncontent-security-policy: default-src 'self'; object-src 'none'\nx-content-type-options: nosniff\nset-cookie: id=abc; Secure; HttpOnly; SameSite=Lax",
      "runsLocally": "A análise roda localmente no seu navegador. Nada é enviado a nenhum servidor.",
      "gradeLabel": "Nota {grade}",
      "gradeAria": "Nota geral dos cabeçalhos de segurança: {grade}",
      "scoreLabel": "{score} / {max} pontos",
      "recommendedLabel": "Recomendado:",
      "cookieUnnamed": "(cookie sem nome)",
      "errors": {
        "empty": "Cole uma resposta HTTP ou um bloco de cabeçalhos para analisar.",
        "no-headers": "Nenhum cabeçalho encontrado. Cole uma resposta com linhas de cabeçalho como 'Nome-Do-Cabecalho: valor'."
      },
      "ratings": {
        "strong": "Forte",
        "adequate": "Adequado",
        "weak": "Fraco",
        "missing": "Ausente",
        "info": "Info"
      },
      "panels": {
        "headers": "Cabeçalhos",
        "cookies": "Cookies"
      },
      "reasons": {
        "HSTS_MISSING": "Sem cabeçalho Strict-Transport-Security. O navegador pode usar HTTP puro, deixando a primeira requisição exposta a ataques de downgrade.",
        "HSTS_MAXAGE_ZERO": "max-age é {value}, o que desativa o HSTS. Defina um max-age positivo, como 31536000 (um ano).",
        "HSTS_MAXAGE_LOW": "max-age é de apenas {value} segundos, abaixo do mínimo recomendado de seis meses.",
        "HSTS_MAXAGE_OK": "max-age é de {value} segundos, aceitável, mas abaixo da referência de um ano.",
        "HSTS_MAXAGE_STRONG": "max-age é de {value} segundos (um ano ou mais), a referência recomendada.",
        "HSTS_SUBDOMAINS": "includeSubDomains está definido, estendendo a exigência de HTTPS a todos os subdomínios.",
        "HSTS_NO_SUBDOMAINS": "includeSubDomains não está definido, então os subdomínios não estão cobertos.",
        "HSTS_PRELOAD": "preload está definido, tornando o host elegível para a lista de preload de HSTS do navegador.",
        "CSP_MISSING": "Sem Content-Security-Policy. O principal controle de defesa em profundidade contra cross-site scripting está ausente.",
        "CSP_HAS_DEFAULT_SRC": "A diretiva default-src está definida, dando uma política base a todos os tipos de recurso.",
        "CSP_NO_DEFAULT_SRC": "Sem diretiva default-src, então os tipos de recurso sem diretiva própria ficam sem restrição.",
        "CSP_HAS_OBJECT_SRC": "object-src está definido, restringindo conteúdo de plugins legados.",
        "CSP_HAS_BASE_URI": "base-uri está definido, evitando injeção de tag base.",
        "CSP_FRAME_ANCESTORS": "frame-ancestors está definido, o controle moderno contra enquadramento e clickjacking.",
        "CSP_UNSAFE_INLINE": "Usa 'unsafe-inline', que permite scripts ou estilos inline e anula boa parte da proteção da CSP contra XSS.",
        "CSP_UNSAFE_EVAL": "Usa 'unsafe-eval', que permite eval() e execução dinâmica de código semelhante.",
        "CSP_WILDCARD": "Uma origem curinga '*' permite conteúdo de qualquer origem, enfraquecendo a política.",
        "CSP_RO_ABSENT": "Nenhuma política report-only definida. É opcional e serve para testar uma CSP antes de aplicá-la.",
        "CSP_RO_ONLY": "Há uma CSP report-only, mas não há Content-Security-Policy aplicada. O modo report-only não protege a página.",
        "CSP_RO_WITH_ENFORCED": "Há uma CSP report-only junto à política aplicada, útil para testar mudanças.",
        "XCTO_MISSING": "Sem X-Content-Type-Options. O navegador pode inferir o tipo (MIME sniffing) e executar conteúdo como script.",
        "XCTO_NOSNIFF": "Definido como nosniff, o que impede a inferência de tipo MIME.",
        "XCTO_INVALID": "Valor inesperado '{value}'. O único valor válido é nosniff.",
        "XFO_MISSING": "Sem X-Frame-Options. Sem ele, ou sem CSP frame-ancestors, a página pode ser enquadrada para clickjacking.",
        "XFO_DENY": "Definido como DENY, impedindo que a página seja enquadrada por qualquer site.",
        "XFO_SAMEORIGIN": "Definido como SAMEORIGIN, permitindo enquadramento apenas por páginas de mesma origem.",
        "XFO_ALLOWFROM_DEPRECATED": "Usa ALLOW-FROM, que é obsoleto e ignorado pelos navegadores modernos. Use CSP frame-ancestors.",
        "XFO_INVALID": "Valor inesperado '{value}'. Use DENY ou SAMEORIGIN.",
        "REFERRER_MISSING": "Sem Referrer-Policy. Vale o padrão do navegador, que pode vazar URLs completas para outras origens.",
        "REFERRER_STRONG": "Definido como '{value}', uma política que preserva a privacidade.",
        "REFERRER_WEAK": "Definido como '{value}', que ainda envia a origem ou mais para outros sites.",
        "REFERRER_OTHER": "Definido como '{value}'.",
        "REFERRER_UNSAFE_URL": "Definido como unsafe-url, que envia a URL completa, incluindo caminho e query, para todo destino.",
        "PERMISSIONS_MISSING": "Sem Permissions-Policy. Recursos sensíveis como câmera, microfone e geolocalização não estão restritos.",
        "PERMISSIONS_PRESENT": "Presente, restringindo o acesso a recursos sensíveis do navegador.",
        "COOP_MISSING": "Sem Cross-Origin-Opener-Policy. A página compartilha o grupo de contexto de navegação com aberturas de origem cruzada.",
        "COOP_SAME_ORIGIN": "Definido como same-origin, isolando a página de janelas de origem cruzada.",
        "COOP_ALLOW_POPUPS": "Definido como same-origin-allow-popups, isolando a página, mas mantendo os popups que ela abre.",
        "COOP_UNSAFE_NONE": "Definido como unsafe-none, que não oferece isolamento de abertura.",
        "COEP_ABSENT": "Sem Cross-Origin-Embedder-Policy. É opcional e exigido apenas para isolamento de origem cruzada.",
        "COEP_PRESENT": "Definido como '{value}', exigindo que recursos incorporados façam opt-in.",
        "CORP_ABSENT": "Sem Cross-Origin-Resource-Policy. É opcional e limita quem pode incorporar este recurso.",
        "CORP_SAME_ORIGIN": "Definido como same-origin, a configuração mais restrita.",
        "CORP_SAME_SITE": "Definido como same-site, permitindo incorporação de mesmo site.",
        "CORP_CROSS_ORIGIN": "Definido como cross-origin, permitindo que qualquer site incorpore este recurso. Confirme se é intencional.",
        "CACHE_ABSENT": "Sem cabeçalho Cache-Control. Use no-store em respostas que carregam dados sensíveis.",
        "CACHE_RESTRICTED": "O cache está restrito (no-store, no-cache ou private), adequado para respostas sensíveis.",
        "CACHE_PERMISSIVE": "O cache está permissivo. Confirme que a resposta não contém dados sensíveis.",
        "CORS_WILDCARD": "Access-Control-Allow-Origin é '*', permitindo que qualquer site leia a resposta. Só é seguro para dados públicos e sem credenciais.",
        "CORS_WILDCARD_CREDENTIALS": "Access-Control-Allow-Origin é '*' junto com credenciais. Isso expõe dados com credenciais a qualquer origem, uma configuração gravemente incorreta.",
        "CORS_NULL_ORIGIN": "Access-Control-Allow-Origin é 'null', que vários contextos conseguem forjar. Evite a origem nula.",
        "CORS_SPECIFIC_ORIGIN": "Access-Control-Allow-Origin permite '{value}'. Confirme que essa origem é confiável.",
        "CORS_CREDENTIALS_TRUE": "Access-Control-Allow-Credentials é true, então a resposta pode carregar cookies entre origens. Combine apenas com uma origem específica e confiável.",
        "CORS_CREDENTIALS_OTHER": "Access-Control-Allow-Credentials é '{value}'.",
        "XPCDP_ABSENT": "Sem X-Permitted-Cross-Domain-Policies. A OWASP recomenda defini-lo como none.",
        "XPCDP_NONE": "Definido como none, o valor reforçado.",
        "XPCDP_ALL": "Definido como all, o valor mais permissivo. Prefira none.",
        "XPCDP_OTHER": "Definido como '{value}'.",
        "CLEAR_SITE_DATA_PRESENT": "Clear-Site-Data está definido ('{value}'), instruindo o navegador a limpar os dados do site. Use em endpoints de logout.",
        "FEATURE_POLICY_DEPRECATED": "Feature-Policy é obsoleto. Migre para Permissions-Policy.",
        "HPKP_DEPRECATED": "O HTTP Public Key Pinning é obsoleto e foi removido dos navegadores. Remova este cabeçalho.",
        "EXPECT_CT_OBSOLETE": "Expect-CT é obsoleto ('{value}'). A Certificate Transparency já é exigida por padrão, então remova-o.",
        "XSS_PROTECTION_LEGACY": "X-XSS-Protection é '{value}'. O auditor legado não existe mais nos navegadores modernos. Remova-o, ou defina como 0, e confie na CSP.",
        "XSS_PROTECTION_DISABLED_OK": "X-XSS-Protection é 0, o que corretamente desativa o auditor obsoleto.",
        "SERVER_VERSION_DISCLOSED": "Server revela detalhes de versão ('{value}'), ajudando atacantes a mirar falhas conhecidas. Minimize isso.",
        "SERVER_PRODUCT_DISCLOSED": "Server informa o produto ('{value}'). Considere remover ou minimizar.",
        "XPOWEREDBY_PRESENT": "X-Powered-By revela a stack ('{value}'). Remova-o.",
        "XASPNETVERSION_PRESENT": "X-AspNet-Version revela a versão do runtime ('{value}'). Remova-o.",
        "XASPNETMVCVERSION_PRESENT": "X-AspNetMvc-Version revela a versão do framework ('{value}'). Remova-o.",
        "HEADER_PRESENT": "Presente.",
        "COOKIE_COUNT": "{value} cookie(s) definido(s).",
        "COOKIE_WEAK_COUNT": "{value} cookie(s) com atributos fracos.",
        "COOKIE_SECURE": "Secure está definido, então o cookie só é enviado por HTTPS.",
        "COOKIE_NO_SECURE": "Secure não está definido, então o cookie pode ser enviado por HTTP puro.",
        "COOKIE_HTTPONLY": "HttpOnly está definido, escondendo o cookie do JavaScript.",
        "COOKIE_NO_HTTPONLY": "HttpOnly não está definido, então scripts podem ler o cookie e uma falha de XSS poderia roubá-lo.",
        "COOKIE_SAMESITE_STRICT": "SameSite=Strict, a proteção mais forte contra requisições entre sites.",
        "COOKIE_SAMESITE_LAX": "SameSite=Lax, proteção razoável contra requisições entre sites.",
        "COOKIE_SAMESITE_NONE": "SameSite=None com Secure, permitindo envio entre sites.",
        "COOKIE_SAMESITE_NONE_INSECURE": "SameSite=None sem Secure. Os navegadores rejeitam isso e é inseguro. Adicione Secure.",
        "COOKIE_NO_SAMESITE": "Sem atributo SameSite. Defina Lax ou Strict para resistir a requisições entre sites.",
        "COOKIE_HOST_PREFIX_OK": "Os requisitos do prefixo __Host- estão atendidos (Secure, Path=/ e sem Domain).",
        "COOKIE_HOST_PREFIX_VIOLATION": "O prefixo __Host- exige Secure, Path=/ e sem Domain. Essas condições não estão todas atendidas.",
        "COOKIE_SECURE_PREFIX_OK": "O requisito do prefixo __Secure- está atendido (Secure está definido).",
        "COOKIE_SECURE_PREFIX_VIOLATION": "O prefixo __Secure- exige Secure, que não está definido.",
        "OVERALL_MISSING_CRITICAL": "Cabeçalhos críticos ausentes ou fracos: {value}.",
        "OVERALL_INFO_LEAK": "{value} cabeçalho(s) revelam detalhes do servidor ou da stack.",
        "OVERALL_WEAK_COOKIES": "{value} cookie(s) com atributos fracos.",
        "OVERALL_CORS_RISK": "Uma política de origem cruzada (CORS) expõe dados a outros sites.",
        "OVERALL_STRONG": "Postura geral de cabeçalhos de segurança forte.",
        "OVERALL_POOR": "Vários cabeçalhos de segurança essenciais estão ausentes."
      }
    },
    "saml-decoder": {
      "name": "Decodificador SAML",
      "blurb": "Cole uma resposta ou asserção SAML (bruta, base64 ou URL-encoded) e decodifique emissor, status, sujeito, condições, audiência e atributos, com verificação de assinatura e de algoritmos fracos. Protegido contra XXE.",
      "inputLabel": "Mensagem SAML (XML, base64 ou URL-encoded)",
      "inputPlaceholder": "Cole uma resposta SAML, uma asserção ou o valor SAMLResponse em base64",
      "runsLocally": "A decodificação roda localmente no seu navegador. Nada é enviado a lugar nenhum.",
      "attrUnnamed": "(sem nome)",
      "attrNoValue": "(sem valor)",
      "encryptedNote": "{n} asserção(ões) criptografada(s) detectada(s). Descriptografar exige a chave privada do provedor de serviço e está fora do escopo deste decodificador.",
      "notVerifiedNote": "Esta ferramenta apenas decodifica e explica a estrutura. Ela não verifica assinaturas, não valida a mensagem e não descriptografa conteúdo criptografado.",
      "errors": {
        "empty": "Cole uma mensagem SAML para decodificar.",
        "not-decodable": "Isto não parece XML nem base64. Cole uma resposta SAML, uma asserção ou a forma base64.",
        "deflated": "Isto decodifica para bytes comprimidos (DEFLATE), que é o binding HTTP-Redirect. Cole o XML bruto ou a forma base64 do binding HTTP-POST.",
        "doctype-forbidden": "Esta mensagem contém um DOCTYPE ou declaração de entidade, o que uma mensagem SAML não deve ter. Ela é rejeitada para evitar ataques de entidade externa de XML (XXE).",
        "not-xml": "A entrada não pôde ser interpretada como XML.",
        "no-saml": "Isto é XML, mas não é uma mensagem SAML reconhecível.",
        "malformed": "O XML está malformado (uma tag não fechada ou incompatível).",
        "too-large": "A mensagem é grande demais para decodificar aqui.",
        "too-deep": "O XML está aninhado profundamente demais para decodificar.",
        "too-many-nodes": "O XML tem elementos demais para decodificar."
      },
      "badges": {
        "signed": "Assinada",
        "unsigned": "Sem assinatura",
        "encrypted": "Criptografada",
        "statusSuccess": "Status: Sucesso",
        "statusFailure": "Status: {code}",
        "weakAlgo": "algoritmo fraco",
        "weakDigest": "digest fraco"
      },
      "panels": {
        "message": "Mensagem",
        "assertion": "Asserção {n}"
      },
      "blocks": {
        "subject": "Sujeito",
        "conditions": "Condições",
        "authn": "Autenticação",
        "attributes": "Atributos",
        "responseSignature": "Assinatura da resposta"
      },
      "fields": {
        "docType": "Tipo",
        "issuer": "Emissor",
        "id": "ID",
        "issueInstant": "Emitida em",
        "destination": "Destino",
        "inResponseTo": "Em resposta a",
        "status": "Status",
        "statusMessage": "Mensagem de status",
        "nameId": "NameID",
        "nameIdFormat": "Formato do NameID",
        "confirmationMethod": "Método de confirmação",
        "notOnOrAfter": "Não em ou após",
        "recipient": "Destinatário",
        "notBefore": "Não antes de",
        "audience": "Audiência",
        "authnContext": "Contexto de autenticação",
        "authnInstant": "Instante de autenticação",
        "sessionIndex": "Índice de sessão",
        "algorithm": "Algoritmo de assinatura",
        "digest": "Algoritmo de digest",
        "c14n": "Canonicalização"
      },
      "reasons": {
        "SIGNED_RESPONSE": "A resposta está assinada no nível superior.",
        "SIGNED_ASSERTION": "Há assinatura de asserção presente ({value} assinada(s)).",
        "UNSIGNED": "Nada nesta mensagem está assinado. A autenticidade não pode ser estabelecida, então ela deve ser tratada como não confiável até que uma assinatura seja adicionada e verificada.",
        "WEAK_SIG_ALGO": "A assinatura usa {value}, um algoritmo fraco. Prefira RSA-SHA256 ou mais forte.",
        "WEAK_DIGEST_ALGO": "O digest da assinatura usa {value}, um hash fraco. Prefira SHA-256 ou mais forte.",
        "ENCRYPTED_ASSERTION": "{value} asserção(ões) está(ão) criptografada(s). Esta ferramenta informa a presença, mas não as descriptografa.",
        "STATUS_SUCCESS": "O status da resposta é Sucesso.",
        "STATUS_NOT_SUCCESS": "O status da resposta é {value}, e não Sucesso. O login não teve êxito.",
        "NO_CONDITIONS": "Uma asserção não tem o elemento Conditions, então não carrega janela de validade nem restrição de audiência.",
        "NO_AUDIENCE_RESTRICTION": "Uma asserção tem Conditions mas não tem AudienceRestriction, então não está vinculada a um provedor de serviço específico.",
        "BEARER_NO_NOTONORAFTER": "Uma SubjectConfirmation do tipo bearer não tem NotOnOrAfter, então a confirmação não expira. Isso enfraquece a proteção contra repetição.",
        "BEARER_NO_RECIPIENT": "Uma SubjectConfirmation do tipo bearer não tem Recipient, então não está vinculada ao endpoint pretendido.",
        "MULTIPLE_ASSERTIONS": "A mensagem contém {value} asserções. Confirme que o seu provedor de serviço processa a esperada, já que múltiplas asserções podem ser usadas em ataques de wrapping."
      },
      "flow": {
        "heading": "SSO via navegador (iniciado pelo SP)",
        "laneSp": "Provedor de serviço",
        "laneIdp": "Provedor de identidade",
        "s1": "Um usuário acessa um recurso protegido no provedor de serviço",
        "s2": "O SP monta um AuthnRequest e redireciona o navegador para o IdP",
        "s3": "O IdP recebe o AuthnRequest pelo binding de Redirect",
        "s4": "O IdP autentica o usuário",
        "s5": "O IdP emite uma Response assinada contendo uma Assertion",
        "s6": "O navegador envia a SAMLResponse (POST) de volta ao ACS do SP",
        "s7": "O SP verifica a assinatura, as condições e o audience",
        "s8": "O SP estabelece uma sessão e concede o acesso"
      }
    },
    "oidc": {
      "name": "Decodificador OIDC",
      "blurb": "Cole um ID token do OpenID Connect ou um documento .well-known/openid-configuration e decodifique: as claims principais, claims de perfil, endpoints e capacidades, com verificações de claims obrigatórias, algoritmo de assinatura, nonce e PKCE.",
      "inputLabel": "ID token (JWT) ou JSON do openid-configuration",
      "inputPlaceholder": "Cole um ID token, ou um documento JSON de discovery OIDC",
      "runsLocally": "A decodificação roda localmente no seu navegador. Ela nunca chama o jwks_uri nem qualquer endpoint, e nada é enviado a lugar nenhum.",
      "notVerifiedNote": "Esta ferramenta decodifica e explica. Ela não verifica a assinatura do token, não busca as chaves de assinatura e não checa a expiração contra o relógio.",
      "errors": {
        "empty": "Cole um ID token ou um documento openid-configuration para decodificar.",
        "malformed-json": "Isto começa como JSON mas não pôde ser interpretado. Verifique se falta uma chave, vírgula ou aspas.",
        "json-not-oidc": "Isto é JSON, mas não é um documento de discovery do OpenID Connect. Cole um ID token, ou um documento .well-known/openid-configuration.",
        "not-jwt": "Isto não parece um JWT nem um documento OIDC. Cole um ID token ou um documento de discovery.",
        "jwt-header": "O cabeçalho do token não pôde ser decodificado. Um JWT é composto por três partes base64url separadas por pontos.",
        "jwt-payload": "O payload do token não pôde ser decodificado como JSON."
      },
      "badges": {
        "idToken": "ID Token",
        "discovery": "Discovery",
        "signed": "Assinado",
        "unsigned": "Sem assinatura",
        "algNone": "alg: none",
        "algUnknown": "alg: ?"
      },
      "panels": {
        "header": "Cabeçalho",
        "coreClaims": "Claims principais do ID token",
        "metadata": "Provedor",
        "endpoints": "Endpoints",
        "capabilities": "Capacidades"
      },
      "categories": {
        "binding": "Vínculo de token",
        "profile": "Claims de perfil",
        "email": "E-mail",
        "address": "Endereço",
        "phone": "Telefone",
        "oauth": "OAuth / sessão",
        "other": "Outras claims"
      },
      "fields": {
        "alg": "Algoritmo",
        "typ": "Tipo",
        "kid": "ID da chave",
        "iss": "Emissor (iss)",
        "sub": "Sujeito (sub)",
        "aud": "Audiência (aud)",
        "azp": "Parte autorizada (azp)",
        "nonce": "Nonce",
        "acr": "Contexto de autenticação (acr)",
        "amr": "Métodos de autenticação (amr)",
        "authTime": "Hora de autenticação",
        "iat": "Emitido em (iat)",
        "nbf": "Não antes de (nbf)",
        "exp": "Expira em (exp)",
        "issuer": "Emissor"
      },
      "reasons": {
        "MISSING_REQUIRED_CLAIM": "Claim obrigatória ausente: {value}. Um ID token deve conter iss, sub, aud, exp e iat.",
        "ALG_NONE": "O token usa alg none, ou seja, não é assinado. Um ID token sem assinatura não prova nada e deve ser rejeitado.",
        "ALG_SYMMETRIC": "Assinado com {value}, um algoritmo simétrico (HMAC). ID tokens de um provedor público normalmente usam um algoritmo assimétrico como RS256 ou ES256, para que a parte confiante possa verificar com a chave pública.",
        "ALG_UNKNOWN": "Assinado com {value}, um algoritmo que esta ferramenta não reconhece. Confirme que é um algoritmo esperado e forte.",
        "SIGNED_ASYMMETRIC": "Assinado com {value}, um algoritmo assimétrico. A parte confiante o verifica contra a chave pública do provedor obtida do JWKS.",
        "NO_NONCE": "Sem a claim nonce. O nonce vincula o token à requisição de autenticação e protege contra repetição. Ele deve estar presente quando a requisição enviou um.",
        "MULTI_AUD_NO_AZP": "O token tem múltiplas audiências mas não tem azp (parte autorizada). Com mais de uma audiência, o azp deve nomear o cliente ao qual o token se destina.",
        "DISCOVERY_MISSING_FIELD": "Campo obrigatório de discovery ausente: {value}.",
        "DISCOVERY_ALG_NONE": "O provedor anuncia o algoritmo de assinatura none para ID tokens, o que permitiria tokens sem assinatura. Isso não deveria ser oferecido.",
        "DISCOVERY_NO_PKCE": "Sem code_challenge_methods_supported. O provedor não anuncia PKCE, que é recomendado para o fluxo de código de autorização.",
        "DISCOVERY_NO_PKCE_S256": "PKCE é anunciado mas sem o método S256. O S256 é o método de code challenge recomendado."
      },
      "flow": {
        "heading": "Fluxo de código de autorização",
        "laneRp": "Relying Party",
        "laneOp": "Provedor OpenID",
        "s1": "Redireciona o usuário ao provedor com scope=openid",
        "s2": "O provedor autentica o usuário e obtém o consentimento",
        "s3": "O provedor redireciona de volta com um código de autorização",
        "s4": "A Relying Party troca o código no endpoint de token",
        "s5": "O provedor retorna um ID token e um access token",
        "s6": "A Relying Party valida a assinatura do ID token contra o JWKS",
        "s7": "A Relying Party pode chamar o UserInfo com o access token",
        "s8": "O provedor retorna as claims do usuário"
      }
    },
    "bigip-persistence-cookie": {
      "name": "Decodificador de Cookie de Persistência BIG-IP",
      "blurb": "Decodifique um cookie de persistência BIGipServer da F5 no IP e porta do membro do pool, ou gere um cookie a partir de um endereço e porta. Roda inteiramente no seu navegador.",
      "inputLabel": "Cookie BIGipServer",
      "inputPlaceholder": "Cole o valor do cookie, um par nome=valor ou uma linha Set-Cookie completa. Exemplo: 1677787402.20480.0000",
      "runsLocally": "Decodificado no seu navegador. O cookie nunca é enviado a lugar nenhum.",
      "mode": {
        "label": "Decodificar ou codificar",
        "decode": "Decodificar",
        "encode": "Codificar"
      },
      "errors": {
        "empty": "Informe o valor de um cookie BIGipServer para decodificar.",
        "unrecognized": "Isto não corresponde a nenhum formato conhecido de cookie de persistência do BIG-IP. Verifique se você colou o valor do cookie, e não apenas o nome."
      },
      "encodeErrors": {
        "address": "Informe um endereço IPv4 ou IPv6 válido.",
        "port": "Informe uma porta entre 0 e 65535.",
        "routedomain": "O route domain deve ser um número entre 0 e 65535."
      },
      "badges": {
        "ipv4": "IPv4 padrão",
        "ipv4Rd": "IPv4 em route domain",
        "ipv6": "IPv6",
        "ipv6Rd": "IPv6 em route domain",
        "encrypted": "Criptografado",
        "internal": "Endereço interno",
        "public": "Endereço público"
      },
      "panels": {
        "result": "Membro do pool decodificado",
        "encrypted": "Cookie criptografado"
      },
      "fields": {
        "cookieName": "Nome do cookie",
        "address": "Endereço IP",
        "port": "Porta",
        "routeDomain": "Route domain",
        "addressType": "Tipo de endereço",
        "endpoint": "Membro do pool"
      },
      "reasons": {
        "INFO_DISCLOSURE": "Este cookie expõe o endereço IP e a porta de um membro do pool a qualquer pessoa que consiga ler a resposta. Ative a criptografia de cookie no perfil de persistência para evitar isso.",
        "INTERNAL_ADDRESS": "O endereço decodificado é {value}, confirmando um membro de pool interno e revelando parte da sua topologia interna.",
        "ROUTE_DOMAIN": "O membro do pool está no route domain {value}.",
        "ENCRYPTED": "Este cookie está criptografado com AES. O membro do pool não pode ser recuperado sem a chave do BIG-IP, que é a configuração segura recomendada."
      },
      "disclosureNote": "A decodificação usa apenas o esquema público de codificação (F5 K6917). Ela confirma o que qualquer cliente já consegue ler do cookie; a correção é criptografar o cookie de persistência.",
      "encryptedNote": "Um cookie de persistência criptografado é a configuração recomendada. Não há nada a decodificar sem a chave, e isso é intencional.",
      "encode": {
        "addressLabel": "Endereço do membro do pool",
        "addressPlaceholder": "10.1.1.100 ou 2001:112::30",
        "portLabel": "Porta",
        "routeDomainLabel": "Route domain (opcional)",
        "routeDomainPlaceholder": "ex.: 0",
        "resultLabel": "Valor do cookie",
        "resultNote": "Este é o valor que um BIG-IP definiria para esse membro do pool usando a codificação padrão (sem criptografia)."
      }
    },
    "url-inspector": {
      "name": "Inspetor de URL",
      "blurb": "Disseca qualquer URL em suas partes nomeadas: esquema, host, porta, caminho, parâmetros de query e fragmento. Decodifica escapes percent e hosts internacionalizados, e sinaliza credenciais e outros problemas. Roda inteiramente no seu navegador.",
      "inputLabel": "URL",
      "inputPlaceholder": "Cole uma URL. Exemplo: https://user@host.example.com:8443/path?q=hello%20world#section",
      "runsLocally": "Analisado no seu navegador. A URL nunca é enviada a lugar nenhum.",
      "panels": {
        "components": "Componentes",
        "query": "Parâmetros de query",
        "assessment": "Avaliação"
      },
      "fields": {
        "scheme": "Esquema",
        "userinfo": "Informação de usuário",
        "host": "Host",
        "hostUnicode": "Host (Unicode)",
        "port": "Porta",
        "isDefault": "(padrão para o esquema)",
        "defaultImplied": "não definida; padrão é {port}",
        "path": "Caminho",
        "segments": "Segmentos do caminho",
        "fragment": "Fragmento"
      },
      "hostType": {
        "ipv4": "IPv4",
        "ipv6": "IPv6",
        "registeredName": "nome de domínio"
      },
      "credentials": "senha presente",
      "emptyValue": "(sem valor)",
      "emptyString": "(vazio)",
      "emptyQuery": "A query string está presente mas vazia.",
      "errors": {
        "empty": "Informe uma URL para inspecionar."
      },
      "reasons": {
        "RELATIVE_REFERENCE": "Esta é uma referência relativa, não uma URL absoluta: não tem esquema nem host.",
        "NO_SCHEME": "Nenhum esquema presente, então esta URL não é absoluta.",
        "CREDENTIALS_IN_URL": "Esta URL embute um usuário e senha. Credenciais em uma URL são facilmente registradas, cacheadas e compartilhadas, e devem ser evitadas.",
        "USERINFO_PRESENT": "Esta URL inclui um componente de userinfo (um usuário antes do host).",
        "PLAINTEXT_SCHEME": "O esquema {value} não é criptografado em trânsito. Tudo enviado por ele pode ser lido na rede.",
        "NON_DEFAULT_PORT": "A porta {value} não é a padrão para este esquema.",
        "REDUNDANT_DEFAULT_PORT": "A porta {value} é a padrão para este esquema e pode ser omitida.",
        "IDN_HOST": "O host é internacionalizado e armazenado em punycode; a forma Unicode é mostrada acima. Cuidado com caracteres parecidos em links não confiáveis.",
        "UPPERCASE_SCHEME": "O esquema contém letras maiúsculas. Esquemas são insensíveis a maiúsculas e normalmente são escritos em minúsculas.",
        "UPPERCASE_HOST": "O host contém letras maiúsculas. Nomes de host são insensíveis a maiúsculas e normalmente são escritos em minúsculas.",
        "PERCENT_ENCODED": "Esta URL contém caracteres codificados em percent, que foram decodificados no detalhamento acima.",
        "PLUS_IN_QUERY": "A query contém um sinal de mais. Sob form encoding (application/x-www-form-urlencoded) um mais significa espaço; sob a RFC 3986 estrita é um mais literal. Os valores acima o mantêm literal."
      },
      "note": "Os componentes são mostrados exatamente como escritos, sem normalização. A análise segue a RFC 3986; a query é dividida em & e =, e cada parte é decodificada de percent."
    },
    "json-formatter": {
      "name": "Formatador e Validador JSON",
      "blurb": "Valide, formate, minifique e ordene JSON. Erros de análise apontam a linha, coluna e o caminho exatos; chaves duplicadas são sinalizadas; e números grandes são preservados exatamente. Roda inteiramente no seu navegador.",
      "inputLabel": "JSON",
      "inputPlaceholder": "Cole o JSON para validar e formatar. Exemplo: [\"id\", 42, true]",
      "runsLocally": "Validado e formatado no seu navegador. Nada é enviado a lugar nenhum.",
      "controlsLabel": "Opções de formatação",
      "controls": {
        "mode": "Modo",
        "indent": "Indentação",
        "sortKeys": "Ordenar chaves"
      },
      "modePretty": "Formatar",
      "modeMinify": "Minificar",
      "indentSpaces": "{n} espaços",
      "indentTab": "Tabs",
      "errorTitle": "JSON inválido",
      "errorLocation": "Linha {line}, coluna {column}",
      "errorAt": "em {pointer}",
      "rootPointer": "a raiz do documento",
      "outputTitle": "Formatado",
      "copy": "Copiar",
      "copied": "Copiado",
      "duplicatesTitle": "Chaves duplicadas encontradas ({count})",
      "duplicateItem": "{key} em {pointer}",
      "statsValid": "JSON válido",
      "statBytes": "{n} caracteres",
      "statKeys": "{n} chaves",
      "statObjects": "{n} objetos",
      "statArrays": "{n} arrays",
      "statDepth": "profundidade {n}"
    },
    "json-yaml-convert": {
      "name": "Conversor JSON ↔ YAML",
      "blurb": "Converta JSON para YAML em estilo de bloco ou YAML de volta para JSON, inteiramente no seu navegador. Erros de análise apontam a linha e a coluna exatas, e notas de conversão sinalizam as bordas com perda, como comentários descartados e âncoras expandidas.",
      "inputLabel": "Origem",
      "inputPlaceholder": "Cole JSON ou YAML para converter.",
      "runsLocally": "Convertido no seu navegador. Nada é enviado a lugar nenhum.",
      "controlsLabel": "Opções de conversão",
      "controls": {
        "direction": "Direção",
        "indent": "Indentação"
      },
      "dirJsonToYaml": "JSON → YAML",
      "dirYamlToJson": "YAML → JSON",
      "indentSpaces": "{n} espaços",
      "mismatchJson": "Esta entrada parece JSON.",
      "mismatchYaml": "Esta entrada parece YAML.",
      "switchTo": "Trocar direção",
      "errorTitle": "Não foi possível converter",
      "errorLocation": "Linha {line}, coluna {column}",
      "errorAt": "em {pointer}",
      "rootPointer": "a raiz do documento",
      "notesTitle": "Notas de conversão",
      "notes": {
        "COMMENTS_DROPPED": "Comentários foram descartados. O JSON não tem como representá-los.",
        "ANCHORS_EXPANDED": "Âncoras e aliases foram expandidos inline; os valores repetidos são escritos por extenso.",
        "MERGE_KEYS_LITERAL": "Chaves de mesclagem YAML foram mantidas como chaves literais, em vez de achatadas no mapa ao redor.",
        "LARGE_NUMBER": "Este documento tem um número muito grande. A conversão usa a precisão numérica do JavaScript, então valores além de cerca de dezesseis dígitos podem ser arredondados; use o formatador JSON quando os dígitos exatos importarem."
      },
      "outputYaml": "YAML",
      "outputJson": "JSON",
      "copy": "Copiar",
      "copied": "Copiado"
    },
    "tmsh-config-explainer": {
      "name": "Explicador de configuração tmsh",
      "blurb": "Cole um trecho de bigip.conf do BIG-IP e receba uma explicação em português de cada objeto, além da estrutura, totalmente no seu navegador.",
      "inputLabel": "Trecho de bigip.conf",
      "inputPlaceholder": "Cole um trecho de bigip.conf: ltm virtual, ltm pool, ltm monitor, uma iRule, e assim por diante.",
      "runsLocally": "Processado no seu navegador. Nada é enviado.",
      "errorTitle": "Não foi possível interpretar a configuração",
      "lineLabel": "Linha {line}",
      "emptyState": "Nenhum objeto de configuração encontrado. Cole um trecho de bigip.conf para ver a explicação.",
      "summaryLabel": "Objetos encontrados",
      "unknownType": "objeto",
      "notExplained": "ainda não explicado",
      "blockTag": "bloco",
      "iruleLabel": "Esta é uma iRule em Tcl, exibida na íntegra. É código executado em eventos, não configuração tmsh.",
      "notesHeading": "Pontos de atenção"
    },
    "persistence-method-explainer": {
      "name": "Explicador de métodos de persistência",
      "blurb": "Cole perfis de persistência e virtual servers do BIG-IP e veja o método por trás de cada um, seus modos de falha e a cadeia de primário para fallback, tudo no seu navegador.",
      "inputLabel": "Configuração de persistência (perfis e virtuals)",
      "inputPlaceholder": "Cole perfis ltm persistence e virtual servers ltm virtual com suas configurações persist e fallback-persistence.",
      "runsLocally": "Processado no seu navegador. Nada é enviado.",
      "errorTitle": "Não foi possível interpretar a configuração",
      "lineLabel": "Linha {line}",
      "emptyState": "Nenhum perfil de persistência ou persistência de virtual server encontrado. Cole um perfil de persistência ou um virtual com uma configuração persist.",
      "chainsHeading": "Cadeias de persistência",
      "primaryLabel": "Primário",
      "fallbackLabel": "Fallback",
      "noneLabel": "nenhum",
      "profilesHeading": "Perfis de persistência",
      "keysOnLabel": "Baseia-se em",
      "goodForLabel": "Indicado para",
      "caveatsHeading": "Atenção a",
      "notExplained": "ainda não explicado",
      "unknownMethod": "método",
      "blockTag": "bloco"
    },
    "f5-cipher-string-expander": {
      "name": "Explicador de cipher string do F5",
      "blurb": "Cole uma cipher string do F5 BIG-IP e veja cada palavra-chave e operador explicado, além de uma análise de segurança, tudo no seu navegador.",
      "inputLabel": "Cipher string ou nome de rule do F5",
      "inputPlaceholder": "Cole uma cipher string do F5 como ECDHE:RSA:!SSLv3:!RC4:@STRENGTH, ou um nome de rule como f5-secure.",
      "runsLocally": "Processado no seu navegador. Nada é enviado.",
      "expansionNote": "Isto explica as palavras-chave, os operadores e a postura de segurança da string. Não reproduz a lista exata e ordenada de suites, que depende da versão do TMOS; para isso, execute tmm --clientciphers na máquina alvo.",
      "errorTitle": "Não foi possível ler a cipher string",
      "ruleExpands": "A rule pré-definida {name} usa a cipher string:",
      "securityHeading": "Análise de segurança",
      "pfsYes": "Forward secrecy",
      "pfsNo": "Sem forward secrecy",
      "goodHeading": "Bom",
      "concernsHeading": "Preocupações",
      "setsHeading": "Conjuntos de cifras, em ordem",
      "opInclude": "selecionar",
      "opExclude": "excluir",
      "opDelete": "remover",
      "opLowerPriority": "baixar prioridade",
      "opSort": "ordenar",
      "notRecognized": "não reconhecido"
    },
    "syslog-pri-decoder": {
      "name": "Decodificador + codificador de PRI syslog",
      "blurb": "Decodifique um PRI de syslog como 134 em sua facility e severity, ou codifique-os de volta, tudo no seu navegador.",
      "modeLabel": "Decodificar ou codificar",
      "modeDecode": "Decodificar PRI",
      "modeEncode": "Codificar PRI",
      "formula": "PRI = facility × 8 + severity",
      "decodeInputLabel": "Valor do PRI",
      "decodeInputPlaceholder": "Digite um PRI, por exemplo 134",
      "runsLocally": "Calculado no seu navegador. Nada é enviado.",
      "priLabel": "PRI",
      "wireLabel": "No fio",
      "facilityHeading": "Facility",
      "severityHeading": "Severity",
      "facilityVaries": "As facilities 12 a 15 não são padronizadas na RFC 5424 e variam conforme a implementação.",
      "encodeFacilityLabel": "Facility",
      "encodeSeverityLabel": "Severity",
      "struct": {
        "heading": "Como um PRI se divide em facility e severity",
        "note": "Um único inteiro PRI carrega os dois campos. Dividir por 8 dá a facility, e o resto dá a severity, então o PRI 134 é facility 16 e severity 6. Codificar funciona no sentido inverso: facility × 8 + severity."
      }
    },
    "jwks-explainer": {
      "name": "Explicador de JWKS + correspondência de chaves",
      "blurb": "Cole um JSON Web Key Set para detalhar cada chave, sinalizar qualquer material privado e corresponder um JWT à sua chave pelo kid. Nada sai do seu navegador.",
      "modeLabel": "Explicar ou corresponder",
      "modeExplain": "Explicar um JWKS",
      "modeMatch": "Corresponder um JWT",
      "jwksInputLabel": "JWK Set (ou um único JWK)",
      "jwksInputPlaceholder": "Cole um JWKS aqui",
      "runsLocally": "Analisado no seu navegador. Nenhum jwks_uri é buscado.",
      "jwtInputLabel": "JWT para corresponder",
      "jwtInputPlaceholder": "Cole um JWT, ou apenas o cabeçalho dele",
      "noKid": "sem kid",
      "useField": "Uso",
      "useSig": "Assinatura",
      "useEnc": "Criptografia",
      "algField": "Algoritmo",
      "sizeField": "Tamanho",
      "publicParamsField": "Parâmetros públicos",
      "privateParamsField": "Parâmetros privados",
      "keySingular": "chave",
      "keyPlural": "chaves",
      "privateBanner": "Este conjunto contém material de chave privada. Um JWKS deve conter apenas chaves públicas.",
      "headerKidField": "kid do cabeçalho",
      "headerAlgField": "alg do cabeçalho",
      "algMismatch": "O alg do JWT não corresponde ao alg da chave encontrada.",
      "diag": {
        "heading": "Como uma chave é encontrada pelo kid",
        "jwtHeader": "Cabeçalho do JWT",
        "matchLabel": "correspondência por kid",
        "note": "Quando um JWT chega, o verificador lê o seu kid e encontra a única chave do conjunto com o mesmo kid, e então usa essa chave para conferir a assinatura. Cada chave precisa de um kid distinto para que isso seja inequívoco."
      }
    },
    "regex": {
      "name": "Kit de Regex",
      "blurb": "Teste, explique e depure expressões regulares com correspondências ao vivo e verificação de risco de backtracking.",
      "title": "Kit de Regex",
      "description": "Compile uma expressão regular JavaScript, teste-a no seu próprio texto com cada correspondência e grupo de captura destacados e leia uma explicação em linguagem clara do que o padrão faz — tudo no seu navegador.",
      "patternLabel": "Padrão e flags",
      "patternPlaceholder": "\\w+@\\w+\\.\\w+",
      "flagsLabel": "Flags",
      "flagsPlaceholder": "gim",
      "testLabel": "Texto de teste",
      "testPlaceholder": "Cole o texto para testar a correspondência...",
      "valid": "Padrão válido",
      "invalid": "Padrão inválido:",
      "redosTitle": "Possível backtracking catastrófico",
      "redosBody": "Este padrão aninha um quantificador ilimitado dentro de outro (o formato (a+)+), o que pode ficar lento ou travar em algumas entradas. Teste-o primeiro com um texto curto.",
      "runAnyway": "Executar mesmo assim",
      "explanationHeading": "O que este padrão faz",
      "matchesHeading": "Correspondências",
      "noMatches": "Nenhuma correspondência no texto de teste.",
      "atWord": "na posição",
      "groupsWord": "Grupos",
      "namedWord": "Nomeados",
      "showingFirst": "Mostrando as primeiras",
      "matchesWord": "correspondências",
      "tooLong": "O texto de teste é longo demais para executar; encurte-o e tente novamente.",
      "runsLocally": "Executa inteiramente no seu navegador."
    },
    "title": "Ferramentas",
    "lede": "Utilitários pequenos, rápidos e que respeitam a privacidade, rodando inteiramente no seu navegador. Nada do que você digita é enviado a lugar nenhum. Mais ferramentas a caminho.",
    "open": "Abrir",
    "comingSoon": "Em breve",
    "note": "Esta caixa de ferramentas está crescendo. Novas ferramentas são adicionadas aqui à medida que ficam prontas, cada uma com processamento local e de uso gratuito.",
    "learnHeading": "Aprenda os conceitos",
    "backToTools": "Ferramentas",
    "references": "Referências",
    "jumpTo": "Ir para",
    "categories": {
      "identity": "Identidade e tokens",
      "encoding": "Codificação e dados",
      "hashing": "Hashing e cripto",
      "identifiers": "Identificadores",
      "pki": "Certificados e PKI",
      "networking": "Redes",
      "web": "Web e HTTP",
      "transport": "TLS e transporte",
      "security": "Segurança e WAF",
      "text": "Texto e utilitários"
    },
    "hash": {
      "name": "Gerador de hash (SHA-1/256/384/512)",
      "blurb": "Calcule resumos SHA-1, SHA-256, SHA-384 e SHA-512 de qualquer texto, mostrados em hex e Base64, usando o Web Crypto nativo do navegador. Roda inteiramente no seu navegador.",
      "algorithmLabel": "Algoritmo de hash",
      "inputLabel": "Texto para gerar hash",
      "inputPlaceholder": "The quick brown fox jumps over the lazy dog",
      "runsLocally": "O hashing roda localmente via Web Crypto. Nada do que você digita sai do seu navegador.",
      "bits": "{bits} bits ({bytes} bytes)",
      "sha1Note": "O SHA-1 está quebrado quanto à resistência a colisões e é inadequado para segurança (assinaturas, certificados). Serve apenas para somas de verificação sem fins de segurança e para interoperabilidade legada.",
      "hex": "Hex",
      "base64": "Base64",
      "copy": "Copiar",
      "copied": "Copiado"
    },
    "hmac": {
      "name": "Gerador de HMAC (SHA-256/384/512)",
      "blurb": "Calcule um HMAC com chave sobre uma mensagem usando sua chave secreta, mostrado em hex e Base64, via o Web Crypto nativo do navegador. A mesma construção que o verificador de JWT usa para HS256. Sua chave nunca sai do seu navegador.",
      "algorithmLabel": "Algoritmo HMAC",
      "messageLabel": "Mensagem",
      "messagePlaceholder": "A mensagem a ser autenticada",
      "keyLabel": "Chave secreta",
      "keyPlaceholder": "Seu segredo compartilhado",
      "runsLocally": "O HMAC roda localmente via Web Crypto. Sua mensagem e sua chave nunca saem do seu navegador.",
      "hex": "Hex",
      "base64": "Base64",
      "copy": "Copiar",
      "copied": "Copiado",
      "struct": {
        "heading": "Como o HMAC é construído",
        "innerHash": "hash interno",
        "note": "O HMAC aplica o hash à mensagem duas vezes. A chave é combinada por XOR com um pad interno fixo antes do primeiro hash e com um pad externo antes do segundo, e essa construção de dois pads é o que evita ataques de extensão de comprimento. A chave é primeiro reduzida ao tamanho de bloco do hash."
      }
    },
    "totp-hotp": {
      "name": "Gerador e validador TOTP / HOTP",
      "blurb": "Gere e verifique senhas de uso único baseadas em tempo (TOTP, RFC 6238) e em contador (HOTP, RFC 4226) - os códigos por trás dos aplicativos autenticadores e de tokens físicos como o FortiToken. SHA-1/256/512, com dígitos e intervalo configuráveis. Tudo calculado localmente com Web Crypto; seu segredo nunca sai do navegador.",
      "modeLabel": "Modo",
      "modeTotp": "TOTP (por tempo)",
      "modeHotp": "HOTP (por contador)",
      "algorithmLabel": "Algoritmo",
      "secretLabel": "Segredo compartilhado",
      "secretPlaceholder": "Segredo em Base32, ex.: JBSWY3DPEHPK3PXP",
      "secretEncodingLabel": "Codificação do segredo",
      "encBase32": "Base32",
      "encHex": "Hex",
      "encAscii": "ASCII",
      "digitsLabel": "Dígitos",
      "stepLabel": "Intervalo (segundos)",
      "counterLabel": "Contador",
      "timeLabel": "Tempo",
      "useCurrentTime": "Usar a hora atual",
      "manualTime": "Tempo Unix (segundos)",
      "runsLocally": "Calculado no seu navegador. Seu segredo nunca é enviado a lugar nenhum.",
      "secretError": "Não foi possível decodificar esse segredo com a codificação selecionada. Confira o valor e o seletor Base32 / Hex / ASCII.",
      "generatedCode": "Código de uso único",
      "copy": "Copiar",
      "copied": "Copiado",
      "expiresIn": "Válido por mais {seconds}s",
      "validateLabel": "Validar um código",
      "validatePlaceholder": "Cole um código para verificar",
      "validMatch": "Confere - este código é válido agora.",
      "validNoMatch": "Nenhuma correspondência para os parâmetros atuais.",
      "validWindowNote": "Validadores reais costumam aceitar também os intervalos adjacentes; esta verificação tolera +/-1 intervalo de desvio de relógio.",
      "explainHeading": "Como este código foi derivado",
      "explainMovingFactor": "Fator móvel (contador / intervalo de tempo)",
      "explainOffset": "Deslocamento de truncamento",
      "explainTruncated": "Valor truncado para o código",
      "explainNote": "Aplica-se HMAC ao fator móvel de 8 bytes com o seu segredo, toma-se o nibble inferior do último byte como deslocamento, leem-se 4 bytes ali como um número de 31 bits e calcula-se o módulo 10^dígitos. É o truncamento dinâmico do RFC 4226; o TOTP apenas usa o intervalo de tempo como contador."
    },
    "diff": {
      "name": "Diff de texto",
      "blurb": "Compare dois blocos de texto e veja exatamente o que mudou, linha a linha, com destaque em nível de palavra nas linhas editadas. Opcionalmente, ignore espaços em branco ou maiúsculas e minúsculas. Tudo é calculado no seu navegador; seu texto nunca é enviado a lugar nenhum.",
      "originalLabel": "Original",
      "originalPlaceholder": "Cole o texto original",
      "changedLabel": "Modificado",
      "changedPlaceholder": "Cole o texto modificado",
      "ignoreWhitespace": "Ignorar espaços em branco",
      "ignoreCase": "Ignorar maiúsculas/minúsculas",
      "resultHeading": "Diferenças",
      "emptyState": "Cole texto nas duas caixas para compará-las.",
      "noChanges": "Nenhuma diferença encontrada.",
      "tooLarge": "Estas entradas são grandes demais para comparar no navegador. Tente comparar trechos menores."
    },
    "base64": {
      "name": "Códec Base64, Base32, Hex e Porcentual",
      "blurb": "Codifica texto para Base64, Base64 seguro para URL, Base32, hexadecimal ou codificação porcentual, e decodifica qualquer um deles de volta. Tolera preenchimento e espaços em branco ausentes, e sinaliza resultados binários (não UTF-8). É executado inteiramente no seu navegador.",
      "directionLabel": "Direção",
      "direction": {
        "encode": "Codificar",
        "decode": "Decodificar"
      },
      "inputLabelEncode": "Texto para codificar",
      "inputLabelDecode": "Texto codificado para decodificar",
      "placeholderEncode": "Hello, World!",
      "placeholderDecode": "SGVsbG8sIFdvcmxkIQ==",
      "runsLocally": "A codificação e a decodificação rodam localmente. Nada do que você cola sai do seu navegador.",
      "decodeErrors": {
        "invalid-characters": "Essa entrada contém caracteres fora do alfabeto do códec selecionado.",
        "invalid-length": "Essa entrada não tem um comprimento válido para o códec selecionado.",
        "invalid-escape": "Essa entrada tem um escape de porcentagem malformado (um % não seguido por dois dígitos hexadecimais)."
      },
      "outputEncode": "Codificado",
      "outputDecode": "Texto decodificado",
      "copy": "Copiar",
      "copied": "Copiado",
      "emptyOutput": "(vazio)",
      "decodedBytes": "{bytes, plural, one {# byte decodificado} other {# bytes decodificados}}.",
      "notUtf8": "{bytes, plural, one {# byte decodificado} other {# bytes decodificados}}, mas o resultado não é texto UTF-8 válido (provavelmente binário).",
      "codecLabel": "Códec",
      "codec": {
        "base64": "Base64",
        "base64url": "Base64URL",
        "base32": "Base32",
        "base16": "Hex",
        "percent": "Percent"
      }
    },
    "pkce": {
      "name": "Verificador e challenge de OAuth PKCE",
      "blurb": "Gere um code_verifier de OAuth 2.0 e derive seu code_challenge S256, ou cole o seu e verifique-o com as regras de comprimento e de conjunto de caracteres do RFC 7636. A mesma derivação SHA-256 em base64url que o seu servidor de autorização espera. Roda inteiramente no seu navegador.",
      "verifierLabel": "Verificador de código",
      "verifierPlaceholder": "Cole um code_verifier, ou gere um",
      "generate": "Gerar",
      "runsLocally": "A geração e a derivação rodam localmente. Seu verificador nunca sai do seu navegador.",
      "lengthBadge": "Comprimento {length} (43-128)",
      "charsetOk": "Conjunto de caracteres não reservados",
      "charsetBad": "Caracteres inválidos",
      "s256Title": "Code challenge · S256",
      "plainTitle": "Code challenge · plain",
      "plainNote": "O método plain é desencorajado. Use S256 sempre que o cliente puder calcular SHA-256.",
      "encodingLabel": "base64url",
      "plainValueLabel": "= code_verifier",
      "copy": "Copiar",
      "copied": "Copiado",
      "flowHeading": "Como o PKCE funciona",
      "laneClient": "App / Cliente",
      "laneServer": "Servidor de autorização",
      "s1": "Gera um code_verifier aleatório",
      "s2": "Deriva o code_challenge",
      "s3": "A requisição de autorização leva o challenge",
      "s4": "O servidor armazena o challenge",
      "s5": "Código de autorização retornado",
      "s6": "A requisição de token leva o verifier",
      "s7": "O servidor re-deriva e compara",
      "s8": "Tokens de acesso e refresh emitidos"
    },
    "uuid": {
      "name": "Gerador e inspetor de UUID (v4 / v7)",
      "blurb": "Gere UUIDs v4 aleatórios ou v7 ordenados por tempo, ou cole qualquer UUID para ler sua versão, variante e (para v7) o carimbo de data/hora de criação embutido. A geração usa a fonte aleatória segura do navegador. Roda inteiramente no seu navegador.",
      "versionLabel": "Versão do UUID",
      "generate": "Gerar",
      "clear": "Limpar",
      "emptyHint": "Escolha uma versão e gere.",
      "runsLocally": "A geração e a inspeção rodam localmente. Nada é enviado a lugar nenhum.",
      "copy": "Copiar",
      "copied": "Copiado",
      "inspectLabel": "Inspecionar um UUID",
      "inspectPlaceholder": "Cole qualquer UUID para decodificá-lo",
      "valid": "UUID válido",
      "invalid": "Não é um UUID válido",
      "versionField": "Versão",
      "variantField": "Variante",
      "timestampField": "Carimbo de data/hora (v7)",
      "versionValue": "Versão {version}"
    },
    "jwt": {
      "name": "Decodificador e verificador de JWT",
      "blurb": "Decodifique o cabeçalho e os claims de um JSON Web Token, leia sua expiração e seus tempos em linguagem clara e verifique uma assinatura HS256/384/512 com um segredo colado. Roda inteiramente no seu navegador.",
      "inputLabel": "JSON Web Token",
      "inputPlaceholder": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c",
      "runsLocally": "A decodificação e as verificações de assinatura rodam localmente. O token e o segredo nunca saem do seu navegador.",
      "errors": {
        "empty": "Cole um JSON Web Token para decodificar.",
        "format": "Isso não parece um JWT. Um token tem três partes base64url separadas por pontos: header.payload.signature.",
        "header": "O cabeçalho não é válido. Ele deveria ser JSON codificado em base64url.",
        "payload": "O payload não é válido. Ele deveria ser JSON codificado em base64url."
      },
      "panels": {
        "header": "Cabeçalho",
        "payload": "Payload",
        "signature": "Assinatura",
        "noSignature": "Sem segmento de assinatura (token não protegido)."
      },
      "claims": {
        "iss": "Emissor (iss)",
        "sub": "Sujeito (sub)",
        "aud": "Audiência (aud)",
        "jti": "ID do JWT (jti)",
        "iat": "Emitido em (iat)",
        "nbf": "Não antes de (nbf)",
        "exp": "Expira (exp)"
      },
      "status": {
        "expired": "Expirado {rel}",
        "expiresIn": "Válido, expira {rel}",
        "notYetValid": "Ainda não válido, começa {rel}",
        "noExpiry": "Sem claim de expiração (exp)"
      },
      "verify": {
        "label": "Verificar assinatura HMAC (HS256/384/512)",
        "placeholder": "segredo compartilhado",
        "button": "Verificar",
        "valid": "Assinatura válida para este segredo.",
        "invalid": "A assinatura não corresponde a este segredo.",
        "algNone": "Este token não é protegido (alg: none), então não há assinatura para verificar.",
        "unsupportedAlg": "A verificação no navegador cobre apenas HS256/384/512. {alg} é assimétrico e precisa de uma chave pública.",
        "hint": "O segredo é usado apenas para calcular um HMAC no seu navegador. Ele nunca é enviado a lugar nenhum."
      },
      "struct": {
        "heading": "Anatomia de um JWT",
        "signingInput": "Entrada da assinatura",
        "note": "O cabeçalho e o payload são apenas codificados em base64url, não criptografados, então qualquer pessoa pode lê-los. A assinatura é calculada sobre o cabeçalho e o payload unidos por um ponto, e é o que um verificador confere."
      }
    },
    "x509": {
      "name": "Decodificador de certificados X.509",
      "blurb": "Cole um certificado em PEM, base64 ou hex para ler seu titular, emissor, janela de validade, chave pública e extensões v3, com impressões digitais SHA-256 e SHA-1. Roda inteiramente no seu navegador.",
      "inputLabel": "Certificado X.509",
      "inputPlaceholder": "-----BEGIN CERTIFICATE-----\nMIIB...\n-----END CERTIFICATE-----",
      "runsLocally": "A decodificação e as impressões digitais rodam localmente. O certificado nunca sai do seu navegador.",
      "errors": {
        "empty": "Cole um certificado X.509 para decodificar.",
        "format": "Isso não parece um certificado. Cole PEM (-----BEGIN CERTIFICATE-----), base64 ou hex.",
        "der": "Os bytes não são DER válido. Verifique se todo o certificado foi colado, incluindo a linha END.",
        "structure": "Isso decodifica como ASN.1 mas não é um certificado X.509. Um certificado é uma SEQUENCE de TBSCertificate, signatureAlgorithm e signatureValue."
      },
      "status": {
        "valid": "Válido, expira {rel}",
        "expired": "Expirado {rel}",
        "notYetValid": "Ainda não válido, começa {rel}"
      },
      "panels": {
        "subject": "Titular",
        "issuer": "Emissor",
        "details": "Detalhes",
        "publicKey": "Chave pública",
        "extensions": "Extensões",
        "revocation": "Revogação",
        "fingerprints": "Impressões digitais",
        "sct": "Certificate Transparency"
      },
      "fields": {
        "version": "Versão",
        "serial": "Número de série",
        "notBefore": "Não antes de",
        "notAfter": "Não depois de",
        "signatureAlgorithm": "Algoritmo de assinatura",
        "algorithm": "Algoritmo",
        "keySize": "Tamanho da chave",
        "exponent": "Expoente",
        "curve": "Curva",
        "bits": "{n} bits",
        "selfSigned": "Autoemitido"
      },
      "ext": {
        "san": "Nomes alternativos do titular",
        "keyUsage": "Uso da chave",
        "extKeyUsage": "Uso estendido da chave",
        "basicConstraints": "Restrições básicas",
        "subjectKeyId": "Identificador de chave do titular",
        "authorityKeyId": "Identificador de chave da autoridade",
        "caTrue": "Autoridade certificadora (CA: true)",
        "caFalse": "Não é uma CA (CA: false)",
        "pathLen": "comprimento de caminho {n}",
        "critical": "crítico"
      },
      "rev": {
        "crl": "Distribuição de CRL",
        "ocsp": "Respondedor OCSP",
        "caIssuers": "Emissores da CA",
        "mustStaple": "Must-Staple",
        "mustStapleYes": "Exigido (TLS Feature: status_request)",
        "none": "Informação de revogação",
        "noneDetail": "Nenhum ponteiro de CRL ou OCSP está presente neste certificado.",
        "note": "Estes são os endpoints de revogação indicados no certificado. Esta ferramenta os lê, mas nunca os contata; a verificação do status de revogação acontece no seu cliente, não aqui."
      },
      "fp": {
        "sha256": "SHA-256",
        "sha1": "SHA-1",
        "computing": "Calculando impressões digitais..."
      },
      "chainHeading": "Cadeia de confiança",
      "tierRoot": "CA raiz",
      "tierIntermediate": "CA intermediária",
      "tierLeaf": "Certificado de entidade final",
      "roleRoot": "Âncora de confiança autoassinada",
      "roleIntermediate": "Assinada por uma raiz; assina certificados folha",
      "roleLeaf": "Identifica um servidor ou cliente",
      "thisCert": "este certificado",
      "issuedBy": "Emitido por",
      "signs": "assina",
      "trustNote": "A confiança flui de cima para baixo: cada certificado é assinado pelo de cima, até uma raiz em que o seu sistema já confia.",
      "sct": {
        "intro": "SCTs incorporados: {n}. Cada um é a prova assinada por um log CT de que registrou este certificado; os navegadores exigem um número mínimo para que o certificado seja confiável.",
        "entry": "SCT {i}",
        "logId": "ID do log",
        "timestamp": "Registrado em",
        "signature": "Assinatura",
        "note": "As assinaturas são exibidas mas não verificadas aqui; verificar um SCT requer a chave pública do log e o pré-certificado."
      }
    },
    "ipv6": {
      "name": "Kit de ferramentas IPv6",
      "blurb": "Analise um endereço ou prefixo IPv6 para ver suas formas canônica (RFC 5952) e totalmente expandida, sua classificação de uso especial, a aritmética de prefixo, um MAC EUI-64 se presente e seu nome de DNS reverso ip6.arpa. Roda inteiramente no seu navegador.",
      "inputLabel": "Endereço ou prefixo IPv6",
      "inputPlaceholder": "2001:db8::1/64",
      "runsLocally": "A análise roda localmente. O endereço nunca sai do seu navegador.",
      "errors": {
        "empty": "Insira um endereço ou prefixo IPv6 para decodificar.",
        "format": "Esse não é um endereço IPv6 válido. Use oito grupos hex, opcionalmente comprimidos com :: uma vez (por exemplo 2001:db8::1).",
        "prefix": "O comprimento do prefixo não é válido. Para IPv6 ele deve estar entre 0 e 128."
      },
      "panels": {
        "forms": "Formas canônicas",
        "classification": "Classificação",
        "prefix": "Prefixo",
        "identifiers": "Identificadores"
      },
      "fields": {
        "compressed": "Comprimido (RFC 5952)",
        "expanded": "Expandido",
        "type": "Tipo",
        "scope": "Escopo",
        "embeddedIpv4": "IPv4 embutido",
        "network": "Rede",
        "firstAddress": "Primeiro endereço",
        "lastAddress": "Último endereço",
        "count": "Endereços",
        "hostBits": "Bits de host",
        "eui64": "MAC EUI-64",
        "reverseDns": "DNS reverso (ip6.arpa)"
      },
      "badges": {
        "multicast": "multicast"
      },
      "segHeading": "Estrutura do endereço",
      "networkSeg": "Prefixo de rede",
      "ifaceId": "ID de interface",
      "hostBits": "Bits de host",
      "prefixNote": "Os bits à esquerda do limite são fixados pelo prefixo; os bits à direita identificam o host dentro dele.",
      "conventionNote": "Nenhum prefixo foi informado, então a linha tracejada marca a divisão convencional /64: prefixo de roteamento e sub-rede à esquerda, o identificador de interface de 64 bits à direita."
    },
    "cipher": {
      "name": "Decodificador de suítes de cifra",
      "blurb": "Informe uma suíte de cifra TLS, como nome IANA, nome OpenSSL ou GnuTLS, ou um ponto de código hexadecimal, para destrinchá-la em troca de chaves, autenticação, cifra, modo e MAC, com uma leitura de segurança em linguagem clara e a recomendação oficial da IANA. Roda inteiramente no seu navegador contra uma cópia embutida do registro da IANA.",
      "inputLabel": "Suíte de cifra",
      "inputPlaceholder": "TLS_AES_128_GCM_SHA256, ECDHE-RSA-AES128-GCM-SHA256 ou 0x1301",
      "runsLocally": "A decodificação roda localmente contra uma cópia embutida do registro de suítes de cifra TLS da IANA. Nada é enviado a lugar nenhum.",
      "notInRegistryNote": "Este nome foi analisado estruturalmente, mas não foi encontrado no instantâneo embutido do registro da IANA, então o ponto de código e os nomes equivalentes não são exibidos.",
      "errors": {
        "empty": "Informe uma suíte de cifra para decodificar.",
        "format": "Isso não é uma suíte de cifra. Informe um nome IANA (TLS_...), um nome OpenSSL ou um ponto de código hexadecimal como 0x1301.",
        "unknown": "Esse é um formato de ponto de código válido, mas não é uma suíte de cifra atribuída no registro da IANA."
      },
      "ratings": {
        "recommended": "Recomendada",
        "secure": "Segura",
        "weak": "Fraca",
        "insecure": "Insegura",
        "unknown": "Desconhecida"
      },
      "iana": {
        "Y": "IANA: recomendada",
        "N": "IANA: não recomendada",
        "D": "IANA: desaconselhada"
      },
      "badges": {
        "tls13": "TLS 1.3",
        "notInRegistry": "Fora do instantâneo da IANA"
      },
      "panels": {
        "identity": "Identidade",
        "components": "Componentes",
        "security": "Segurança"
      },
      "fields": {
        "codePoint": "Ponto de código",
        "name": "Nome IANA",
        "openssl": "Nome OpenSSL",
        "gnutls": "Nome GnuTLS",
        "protocol": "Protocolo",
        "dtls": "DTLS-OK",
        "references": "Referências"
      },
      "protocol": {
        "tls13": "TLS 1.3",
        "legacy": "TLS 1.2 e anteriores"
      },
      "comp": {
        "keyExchange": "Troca de chaves",
        "authentication": "Autenticação",
        "forwardSecrecy": "Sigilo de encaminhamento",
        "cipher": "Cifra",
        "mode": "Modo",
        "aead": "AEAD",
        "prf": "Hash PRF/KDF",
        "mac": "MAC",
        "yes": "Sim",
        "no": "Não",
        "bits": "{n} bits",
        "negotiatedSeparately": "Negociado separadamente (TLS 1.3)"
      },
      "reasons": {
        "nullCipher": "Cifra NULL: o tráfego não é cifrado de forma alguma.",
        "anon": "Troca de chaves anônima: o par não é autenticado, então não há proteção contra um intermediário ativo.",
        "export40": "Chave de nível de exportação de 40 bits: quebrada por força bruta trivialmente, um resquício das regras de exportação dos anos 1990.",
        "rc4": "Cifra de fluxo RC4: o fluxo de chaves enviesado a torna quebrada, e o RFC 7465 a proíbe no TLS.",
        "singleDes": "DES simples com chave de 56 bits: quebrável por força bruta em horas.",
        "rc2": "RC2: uma cifra obsoleta de 40/64 bits que não é segura para uso moderno.",
        "tripleDes": "O 3DES tem bloco de 64 bits, o que o expõe ao ataque de aniversário Sweet32 (CVE-2016-2183). O RFC 8429 o torna obsoleto.",
        "md5Mac": "MAC com MD5: o MD5 está criptograficamente quebrado.",
        "cbcMac": "CBC com MAC HMAC-SHA1 ou MD5 usa MAC-then-encrypt, exposto a ataques de oráculo de preenchimento como BEAST e Lucky13.",
        "ccm8": "O CCM_8 trunca a etiqueta de autenticação para 8 bytes, enfraquecendo a integridade. A IANA não o marca como recomendado.",
        "noFs": "Sem sigilo de encaminhamento: com troca de chaves estática, uma chave de longo prazo comprometida pode decifrar sessões passadas. A orientação moderna exige ECDHE ou DHE.",
        "legacyCipher": "{value} é uma cifra legada, obsoleta para o TLS.",
        "aead": "Cifra AEAD (cifragem autenticada): confidencialidade e integridade em uma única primitiva, sem um MAC separado para usar de forma errada.",
        "fs": "Sigilo de encaminhamento: uma troca de chaves efêmera mantém o tráfego passado seguro mesmo que a chave de longo prazo seja comprometida depois.",
        "tls13": "Suíte do TLS 1.3: apenas cifras AEAD modernas, com a troca de chaves negociada separadamente e sempre efêmera.",
        "ianaD": "A IANA marca esta suíte como \"D\" (desaconselhada): NÃO DEVERIA ou NÃO DEVE ser usada, conforme a situação.",
        "ianaN": "A IANA não marca esta suíte como \"Recomendada\": tem aplicabilidade limitada ou não passou pelo processo de consenso da IETF.",
        "signalling": "Suíte de sinalização (SCSV): não é uma cifra real, carrega um sinal de protocolo como proteção contra downgrade ou informação de renegociação."
      },
      "groups": {
        "title": "Grupos de troca de chaves",
        "intro": "O TLS negocia o grupo de acordo de chaves separadamente da suíte de cifras, na extensão supported_groups. Como \"harvest now, decrypt later\" impulsiona a migração para a troca de chaves pós-quântica, os grupos híbridos abaixo combinam uma curva clássica com ML-KEM.",
        "kind": {
          "ecdhe": "Curva ECDHE",
          "ffdhe": "DH de corpo finito",
          "pq-hybrid": "Híbrido PQ"
        },
        "pq": {
          "classical": "Clássico",
          "hybrid-pq": "PQ híbrido"
        },
        "recommended": "Recomendado",
        "obsolete": "Obsoleto",
        "legacy": "Legado",
        "combines": "Combina {classical} com {pq}",
        "foot": "X25519MLKEM768 é o grupo híbrido que a maioria dos navegadores agora envia por padrão."
      }
    },
    "f5-ssl-profile-explainer": {
      "name": "Explicador de perfil SSL do F5",
      "blurb": "Cole um perfil client-ssl ou server-ssl do tmsh e veja o papel dele, a matriz de protocolos TLS e uma análise de segurança cobrindo cadeia, renegociação, SNI, OCSP e TLS mútuo — tudo no seu navegador.",
      "inputLabel": "Perfil SSL (tmsh)",
      "inputPlaceholder": "ltm profile client-ssl /Common/name ...",
      "runsLocally": "Processado no seu navegador. Nada é enviado a lugar algum.",
      "scopeNote": "Decodifica um bloco de perfil colado. Nunca contata um BIG-IP.",
      "errorTitle": "Não foi possível ler o perfil",
      "err_empty": "Cole um perfil SSL para começar.",
      "err_noHeader": "Esperava uma linha como: ltm profile client-ssl /Common/name ...",
      "err_noBody": "Nenhuma chave de abertura foi encontrada no perfil.",
      "err_tooLong": "Essa entrada é grande demais para processar.",
      "err_invalid": "Isso não parece um perfil client-ssl ou server-ssl.",
      "protocolsHeading": "Versões do protocolo TLS",
      "permitted": "permitido",
      "disabled": "desabilitado",
      "findingsHeading": "Avaliação de segurança",
      "settingsHeading": "Configurações explicadas",
      "topoHeading": "No caminho dos dados",
      "nodeClient": "Cliente",
      "nodeBigip": "BIG-IP",
      "nodePool": "Membro do pool",
      "clientLeg": "TLS do lado do cliente",
      "serverLeg": "Lado do servidor",
      "thisProfile": "este perfil",
      "clientNote": "Um perfil client-ssl termina o TLS do cliente no BIG-IP. A conexão até o membro do pool só é recriptografada se um perfil server-ssl for aplicado; sem ele, esse trecho fica em texto puro (SSL offload).",
      "serverNote": "Um perfil server-ssl permite que o BIG-IP abra uma nova conexão TLS até o membro do pool (recriptografia). O lado do cliente é tratado por um perfil client-ssl separado."
    },
    "epoch": {
      "name": "Conversor de tempo Unix",
      "blurb": "Digite um timestamp Unix — segundos, milissegundos, microssegundos ou nanossegundos, detectado automaticamente — ou uma data ISO-8601, e leia de volta em todos os formatos comuns. Tudo no seu navegador.",
      "inputLabel": "Timestamp ou data",
      "inputPlaceholder": "1700000000  ou  2023-11-14T22:13:20Z",
      "runsLocally": "Convertido no seu navegador. Nada é enviado a lugar algum.",
      "scopeNote": "Matemática de datas pura. A unidade é deduzida pelo tamanho do número; corrija se necessário.",
      "nowButton": "Agora",
      "errorTitle": "Não foi possível ler isso",
      "err_empty": "Informe um timestamp ou data para começar.",
      "err_invalid": "Isso não é um timestamp Unix nem uma data ISO-8601.",
      "err_tooLong": "Essa entrada é longa demais.",
      "err_outOfRange": "Esse timestamp está fora do intervalo de datas representável.",
      "utcHeading": "Data e hora UTC",
      "formatsHeading": "Todos os formatos",
      "dayOfYearLabel": "dia do ano",
      "relativeNote": "relativo ao relógio do seu dispositivo"
    },
    "irules-event-order": {
      "name": "Ordem de eventos de iRule",
      "blurb": "Escolha o conjunto de perfis de um virtual server do BIG-IP — Client-SSL, HTTP, Server-SSL, pool — e veja a ordem em que os eventos de iRule comuns disparam, de CLIENT_ACCEPTED a CLIENT_CLOSED, como linha do tempo e lista. Tudo no seu navegador.",
      "stackLabel": "Conjunto de perfis do virtual server",
      "tog_clientssl": "Perfil Client-SSL",
      "tog_http": "Perfil HTTP",
      "tog_serverssl": "Perfil Server-SSL",
      "tog_pool": "Pool (balanceamento)",
      "tog_fastl4": "FastL4 (caminho rápido de pacotes)",
      "presetsLabel": "Predefinições:",
      "preset_https": "HTTPS com recriptografia",
      "preset_offload": "SSL offload",
      "preset_http": "HTTP",
      "preset_tcp": "TCP puro",
      "runsLocally": "Computado no seu navegador. Nada é enviado a lugar algum.",
      "scopeNote": "Um modelo do comportamento documentado do F5 para um virtual server Standard. Nunca contata um BIG-IP.",
      "diagramHeading": "Sequência de eventos",
      "listHeading": "Eventos em ordem",
      "conditionalHeading": "Eventos condicionais",
      "conditionalNote": "Estes disparam apenas sob condições específicas: um TCP::collect ou HTTP::collect, uma falha de balanceamento, ou uma resposta 100 Continue.",
      "sideClient": "lado cliente",
      "sideServer": "lado servidor",
      "sideGlobal": "global"
    },
    "cert-renewal-planner": {
      "name": "Planejador de renovação de certificados",
      "blurb": "Calcule a validade de um certificado TLS, se ele se encaixa no cronograma de 47 dias do CA/Browser Forum, e a cadência de renovação que isso implica; tudo offline.",
      "notBeforeLabel": "Emitido (notBefore)",
      "notAfterLabel": "Expira (notAfter)",
      "runsLocally": "Tudo roda no seu navegador; nada é enviado.",
      "exampleLabel": "Testar um exemplo de 90 dias",
      "summaryHeading": "Este certificado",
      "validity": "Validade de {days} dias",
      "compliantBadge": "Dentro do limite",
      "overCapBadge": "Acima do limite",
      "maxForPhase": "Máximo para sua data de emissão: {max} dias.",
      "overByText": "{days} dias acima do máximo de {max} dias para sua data de emissão; uma AC pública não o emitiria.",
      "renewalsValue": "Cerca de {n} renovações por ano com esta validade.",
      "remainingHeading": "Pelo relógio do seu dispositivo",
      "daysRemaining": "{days} dias até expirar.",
      "expiredText": "Expirou há {days} dias.",
      "renewByText": "Renovar até {date} (cerca de {lead} dias antes de expirar)",
      "renewByDue": "daqui a {days} dias",
      "reuseHeading": "Reutilização da validação (era de emissão)",
      "dcvText": "Os dados de validação de domínio (DCV) podem ser reutilizados por {days} dias.",
      "siiText": "A identidade da organização (SII de OV/EV) pode ser reutilizada por {days} dias.",
      "scheduleHeading": "O cronograma SC-081v3",
      "scheduleIntro": "Os máximos de TLS público dependem da data de emissão do certificado:",
      "colPeriod": "Emitido a partir de",
      "colValidity": "Validade máx. (dias)",
      "colDcv": "Reutilização DCV (dias)",
      "colSii": "Reutilização SII (dias)",
      "phaseP0": "Antes de 15 mar 2026",
      "phaseP1": "15 mar 2026",
      "phaseP2": "15 mar 2027",
      "phaseP3": "15 mar 2029",
      "yourPhase": "← este certificado",
      "projectionHeading": "Carga de renovação em cada limite",
      "projectionIntro": "Renovações por certificado por ano, à medida que os limites apertam:",
      "perYearShort": "ano",
      "note_overCap": "Esta validade excede o máximo de {max} dias para sua data de emissão.",
      "note_future47": "Conforme hoje, mas mais longo que o futuro limite de 47 dias; espere renovações mais frequentes conforme o cronograma avança.",
      "note_publicOnly": "Estes limites se aplicam apenas a certificados TLS publicamente confiáveis. PKI privada ou interna não é regida pela SC-081v3.",
      "note_automate": "Nessas cadências, automatize a emissão e a renovação com ACME (RFC 8555) e ARI (RFC 9773); a renovação manual não escala.",
      "err_empty": "Informe as duas datas, emissão e expiração.",
      "err_invalidDate": "Use uma data válida (AAAA-MM-DD).",
      "err_order": "A data de expiração deve ser posterior à de emissão.",
      "err_tooLong": "Esta entrada é longa demais.",
      "err_invalid": "Não foi possível ler essas datas."
    },
    "csr-decoder": {
      "name": "Decodificador de CSR",
      "blurb": "Decodifique uma solicitação de assinatura de certificado PKCS#10 para ler seu sujeito, chave pública, SANs e extensões solicitados, e atributos; tudo no navegador.",
      "inputLabel": "Solicitação de assinatura de certificado (PEM, base64 ou hex)",
      "inputPlaceholder": "-----BEGIN CERTIFICATE REQUEST-----\n...",
      "exampleLabel": "Carregar uma CSR de exemplo",
      "runsLocally": "Tudo roda no seu navegador; a CSR nunca é enviada.",
      "notCertNote": "Uma CSR é uma solicitação, não um certificado. Ela não tem número de série, emissor nem datas de validade; apenas o que o solicitante pede que uma AC certifique.",
      "subjectHeading": "Sujeito",
      "colAttr": "Atributo",
      "colValue": "Valor",
      "noSubject": "Sem nome de sujeito (esta CSR depende dos SANs solicitados).",
      "keyHeading": "Chave pública",
      "keyAlgorithmLabel": "Algoritmo",
      "keySizeLabel": "Tamanho",
      "keySizeValue": "{bits} bits",
      "keyCurveLabel": "Curva",
      "keyExponentLabel": "Expoente",
      "keyExponentValue": "{exp}",
      "requestedHeading": "Extensões solicitadas",
      "sanLabel": "Subject Alternative Names",
      "keyUsageLabel": "Uso da chave",
      "ekuLabel": "Uso estendido da chave",
      "basicConstraintsLabel": "Restrições básicas",
      "caYes": "AC: sim",
      "caNo": "AC: não",
      "pathLenValue": "comprimento de caminho {n}",
      "noRequested": "Nenhuma extensão solicitada.",
      "attributesHeading": "Atributos",
      "challengePasswordLabel": "Senha de desafio",
      "unstructuredNameLabel": "Nome não estruturado",
      "signatureHeading": "Autoassinatura",
      "signatureAlgLabel": "Algoritmo",
      "signatureBitsLabel": "Comprimento",
      "signatureBitsValue": "{bits} bits",
      "versionValue": "Versão: v1 ({v})",
      "derLengthValue": "DER: {bytes} bytes",
      "err_empty": "Cole uma solicitação de assinatura de certificado para decodificar.",
      "err_format": "Isso não parece uma CSR em PEM, base64 ou hex.",
      "err_der": "Não foi possível analisar a estrutura DER.",
      "err_structure": "Isso é analisado como DER, mas não é uma solicitação de certificação PKCS#10."
    }
  },
  "privacy_page": {
    "eyebrow": "Privacidade",
    "title": "Seus dados, e o que este site faz com eles",
    "lede": "Uma explicação em linguagem clara do que exatamente este site faz e não faz com as suas informações. Foi escrita para ser precisa, e não apenas tranquilizadora, porque sob normas como o GDPR e a LGPD brasileira é a declaração precisa que importa.",
    "shortTitle": "A versão curta",
    "short1": "Este site não usa cookies, não executa nenhuma análise (analytics), não usa publicidade e não contém rastreadores de terceiros nem fingerprinting. Nada o segue pela web.",
    "short2": "Ele não vende, compartilha nem cria perfis de seus visitantes, e não pede nada de você para que você o leia.",
    "short3": "As ferramentas interativas funcionam inteiramente no seu navegador. O que você cola ou digita nelas permanece no seu dispositivo e não é transmitido a lugar nenhum.",
    "short4": "Apenas três coisas envolvem dados, e cada uma é explicada abaixo: uma única configuração de tema salva no seu próprio navegador, os registros (logs) de conexão padrão que toda visita a um site gera na camada de hospedagem, e qualquer mensagem que você escolha enviar por e-mail.",
    "controllerTitle": "Quem é o responsável",
    "controllerBody": "Este é o site pessoal de Rodolfo Nützmann (ronutz.com). Para qualquer questão de privacidade, ou para exercer qualquer dos direitos descritos abaixo, escreva para {email}. As solicitações são tratadas diretamente por Rodolfo Nützmann, na condição de controlador dos dados.",
    "noTrackTitle": "Sem cookies, sem rastreamento, sem analytics",
    "noTrackBody": "Este site não usa cookies de nenhum tipo. Ele não usa nenhum serviço de análise (como Google Analytics ou Plausible), nenhuma rede de publicidade, nenhum pixel de rastreamento de redes sociais e nenhum fingerprinting de dispositivo. A sua visita não é medida, perfilada nem compartilhada com ninguém para esses fins.",
    "browserTitle": "O que é armazenado no seu navegador",
    "browserBody": "Uma única coisa pequena: o tema visual que você escolher, salvo no armazenamento local (local storage) do seu navegador para que o site possa lembrá-lo na sua próxima visita. É uma configuração de conveniência que permanece no seu próprio dispositivo, nunca é enviada a este site nem a ninguém, e pode ser apagada a qualquer momento pelo seu navegador. Nenhum outro dado sobre você é armazenado no seu dispositivo.",
    "hostingTitle": "Hospedagem e registros de servidor",
    "hostingBody": "O site é entregue por meio da Cloudflare, que fornece a sua hospedagem e a entrega de conteúdo. Como em qualquer site, carregar uma página significa que o seu dispositivo se conecta a um servidor, e a Cloudflare, atuando como provedora de hospedagem, processa dados básicos de conexão — incluindo o seu endereço IP e detalhes padrão da requisição — para entregar as páginas a você e proteger o site contra abuso e ataques. Esse tratamento é necessário para operar e proteger o site (legítimo interesse, nos termos do Artigo 6(1)(f) do GDPR e das bases correspondentes dos Artigos 7 e 10 da LGPD). É retido apenas brevemente pela provedora e não é usado aqui para identificar ou rastrear você.",
    "toolsTitle": "As ferramentas funcionam no seu navegador",
    "toolsBody": "Os decodificadores e calculadoras deste site — para JWTs, endereços IP, certificados e o restante — computam inteiramente dentro do seu navegador. Os valores que você insere são processados no seu próprio dispositivo e nunca são enviados a um servidor. Uma interface programática separada (uma API) é oferecida para automação e integrações; por design, ela não mantém estado e não registra nenhuma das consultas ou corpos de requisição enviados a ela.",
    "contactTitle": "Se você entrar em contato",
    "contactBody": "O formulário de contato não envia dados a nenhum servidor. Em vez disso, ele abre uma mensagem pré-preenchida no seu próprio aplicativo de e-mail, que você então envia a partir da sua própria conta, de modo que nada passa por terceiros. Se você escrever, seja pelo formulário ou diretamente, eu recebo as informações que você incluir, como o seu nome, endereço de e-mail e mensagem, e as uso apenas para responder a você. Eu as guardo apenas pelo tempo necessário para tratar a sua solicitação, não as uso para marketing e não as compartilho.",
    "intlTitle": "Tratamento fora do seu país",
    "intlBody": "Como a Cloudflare opera uma rede global, o tratamento em nível de conexão descrito acima pode ocorrer em servidores localizados fora do seu próprio país, inclusive fora do Brasil e do Espaço Econômico Europeu. Quando dados pessoais são tratados internacionalmente dessa forma, isso ocorre sob as salvaguardas oferecidas pela provedora envolvida.",
    "childrenTitle": "Crianças",
    "childrenBody": "Este site destina-se a um público profissional e geral. Ele não é dirigido a crianças e não coleta intencionalmente dados pessoais delas.",
    "rightsTitle": "Os seus direitos",
    "rightsBody": "Dependendo de onde você mora, você tem direitos sobre os seus dados pessoais, incluindo acessá-los, corrigi-los ou apagá-los, opor-se ou restringir o seu tratamento, solicitar uma cópia em formato portável e ser informado sobre como são tratados. Para exercer qualquer um deles, basta escrever para {email}. Como pouquíssimos dados pessoais são tratados aqui, na prática costuma haver muito pouco sobre o que agir, mas o canal está sempre aberto.",
    "rightsGdpr": "Se você está no Espaço Econômico Europeu ou no Reino Unido, você também tem o direito de apresentar uma reclamação à sua autoridade local de proteção de dados.",
    "rightsLgpd": "Se você está no Brasil, você possui os direitos previstos no Artigo 18 da LGPD e também pode contatar a Autoridade Nacional de Proteção de Dados (a ANPD).",
    "changesTitle": "Alterações neste aviso",
    "changesBody": "Se este aviso mudar, a versão revisada será publicada nesta página e a data abaixo será atualizada. Mudanças materiais não serão aplicadas retroativamente.",
    "updated": "Última atualização: 30 de junho de 2026",
    "backHome": "Voltar para o início"
  },
  "footer": {
    "redEducation": "Reserve treinamento oficial com a <b>Red Education</b>",
    "builtWith": "Feito por Rodolfo Nützmann com CONCORD",
    "colophon": "Como isto foi construído",
    "contribute": "Ajude a melhorar as traduções",
    "feedback": "Enviar feedback",
    "privacy": "Privacidade",
    "api": "Referência da API",
    "contributeTools": "Compartilhe uma ideia",
    "license": "Licença",
    "coffee": "Me pague um café"
  },
  "search": {
    "kindTool": "Ferramenta",
    "kindArticle": "Artigo",
    "kindPage": "Página",
    "label": "Buscar",
    "placeholder": "Buscar no site…",
    "close": "Fechar",
    "searching": "Buscando…",
    "noResults": "Nenhum resultado para “{query}”.",
    "unavailable": "A busca funciona no site publicado. Não está disponível na pré-visualização local.",
    "hint": "Digite para buscar artigos, ferramentas e páginas."
  },
  "theme": {
    "label": "Tema",
    "dark": "Escuro",
    "light": "Claro"
  },
  "about": {
    "eyebrow": "O instrutor",
    "role": "Instrutor técnico sênior",
    "lede": "Treinamentos de rede e segurança ministrados por quem passou a carreira no lado da implementação, e não apenas nos slides. Com base em São Paulo, ensinando para o mundo todo, em português e inglês.",
    "now": {
      "title": "O que faço agora",
      "body": "Ministro treinamentos oficiais e certificados, conduzidos por instrutor, em quatro plataformas de segurança e redes. O trabalho é prático e baseado em laboratórios: o objetivo é sempre que as pessoas saiam capazes de executar a tarefa, não apenas de descrevê-la. Sou instrutor autorizado desde 1996, e o treinamento e a capacitação técnica fazem parte do meu trabalho desde o fim dos anos 1990.",
      "basedLabel": "Com base em",
      "basedValue": "São Paulo, Brasil",
      "teachesLabel": "Ensina",
      "teachesValue": "Treinamento conduzido por instrutor, virtual e presencial, para o mundo todo",
      "languagesLabel": "Idiomas",
      "languagesValue": "Português (nativo), inglês (fluente)"
    },
    "platforms": {
      "title": "Quatro plataformas, ensinadas com profundidade",
      "body": "Ser certificado em quatro fabricantes significa que posso ensinar cada um como deve ser e compará-los com honestidade. Estas são as plataformas para as quais estou autorizado a ministrar treinamento oficial atualmente.",
      "f5": "BIG-IP em todo o currículo conduzido por instrutor: LTM, DNS, Advanced WAF (ASM), APM, AFM, SSL Orchestrator, automação e troubleshooting.",
      "fortinet": "Treinamento certificado da Fortinet, incluindo a trilha FCP.",
      "extreme": "Trilhas de switching, SD-WAN, e API e automação da Extreme Networks, passando por instalação, configuração, gerenciamento e troubleshooting.",
      "netskope": "Treinamento conduzido por instrutor sobre a Netskope Security Cloud."
    },
    "path": {
      "title": "O caminho até aqui",
      "intro": "Minha carreira começou no lado do fabricante e da implementação em 1996, e permaneceu ali por duas décadas antes de eu me dedicar inteiramente ao treinamento. Essa base de implementação é a razão de o treinamento fazer sentido: eu construí, quebrei e consertei esses sistemas em produção.",
      "present": "atual",
      "cabletron": "Engenheiro de redes e instrutor certificado. Redes não Ethernet e Ethernet, redes de campus, roteamento IP.",
      "riverstone": "Engenheiro de suporte a produto e coordenador de base de conhecimento na Califórnia. Gigabit Ethernet, redes metropolitanas, roteamento IP, BGP. Escalonamento de terceiro nível, reprodução de cenários de cliente e testes de regressão.",
      "cisco": "Engenheiro consultivo de redes, como ponto de contato único para clientes-chave como SERPRO e Correios. Gestão de escalonamento e de satisfação do cliente.",
      "enterasys": "Engenheiro de redes e instrutor. Redes corporativas, roteamento IP, controle de acesso de usuários e NAC, IDS e IPS.",
      "juniper": "Engenheiro de suporte de canal e instrutor para switches e firewalls corporativos. Capacitação técnica de vendas e treinamento operacional de Junos-SRX.",
      "f5channel": "Engenharia de vendas e pré-vendas voltada ao canal para a F5, com capacitação técnica, execução de provas de conceito e treinamento de parceiros ao longo da distribuição.",
      "rededucation": "Instrutor de treinamento autorizado que ministra cursos oficiais e certificados sobre F5, Fortinet, Extreme Networks e Netskope para organizações no mundo todo.",
      "fullHistory": "Ler a história completa",
      "vendorsLink": "Fabricantes com quem trabalhei"
    },
    "origins": {
      "title": "Onde tudo começou",
      "body": "Antes da carreira formal, veio a curiosidade. No início dos anos 1990, eu importava e montava computadores, operava e usava sistemas de bulletin board, e trabalhava com DOS, Unix, Linux, Netware, os primeiros Ethernet, X.25 e internet discada. Em 1995, esse trabalho prático já havia se tornado um primeiro emprego formal: a construção de um sistema de troca eletrônica de dados. O fio condutor de então até hoje é o mesmo: pegar algo realmente complexo e fazer funcionar, e depois torná-lo compreensível para outra pessoa."
    },
    "approach": {
      "title": "Como eu ensino",
      "body": "Escolhi me especializar em treinamento porque ele combina conhecimento técnico profundo com a parte do trabalho de que mais gosto: explicar conceitos complexos de forma simples. As melhores sessões conectam cada conceito à tarefa que a pessoa de fato precisa executar, para que o conteúdo tenha onde se fixar. Exemplos do mundo real, laboratórios de verdade, e o foco na compreensão acima da memorização."
    },
    "cta": {
      "title": "Comece pelos conceitos",
      "body": "A seção Aprender explica as ideias por trás das ferramentas, e as ferramentas permitem que você trabalhe com elas diretamente, tudo no seu navegador.",
      "learnButton": "Ler a seção Aprender",
      "toolsButton": "Abrir as ferramentas"
    },
    "recognition": {
      "title": "Reconhecimento",
      "body": "Reconhecido como F5 DevCentral MVP por três anos consecutivos, em 2022, 2023 e 2024, pelas contribuições à comunidade técnica da F5."
    }
  },
  "endorsements": {
    "eyebrow": "Depoimentos",
    "title": "O que as pessoas dizem, com suas próprias palavras.",
    "intro": "{count} recomendações e avaliações na íntegra, ao longo de duas décadas de ensino e consultoria. Nada aqui é parafraseado ou editado.",
    "provenance": "Provenientes de recomendações do LinkedIn, avaliações do Google e avaliações verificadas de alunos da Red Education. A redação e a ortografia originais são preservadas exatamente como escritas."
  },
  "testimonials": {
    "filterLabel": "Filtrar depoimentos",
    "sourceFilter": "Origem",
    "languageFilter": "Idioma",
    "all": "Todos",
    "showing": "Exibindo {count} de {total}",
    "reply": "Resposta da Red Education",
    "translateLabel": "Tradução",
    "translateOff": "Traduzir para inglês",
    "translateOn": "Exibindo em inglês",
    "machineDisclaimer": "Tradução gerada por máquina. Pode não refletir com exatidão o texto original.",
    "showOriginal": "Ver original",
    "hideOriginal": "Ocultar original"
  },
  "history": {
    "indexTitle": "A história",
    "indexLede": "Três épocas, um fio condutor: pegar algo realmente complexo, fazer funcionar, e depois torná-lo compreensível para outra pessoa.",
    "eraLabel": "Época",
    "backToHistory": "Todas as épocas",
    "backToAbout": "Sobre",
    "readNext": "Leia a seguir",
    "pre1996": {
      "years": "Antes de 1996",
      "title": "A curiosidade",
      "subtitle": "Importar peças, montar máquinas e conectar-se à internet dos primórdios, antes de nada disso ser um emprego.",
      "intro": "Toda carreira técnica tem um antes. Antes dos selos de fabricante e das certificações, houve um adolescente que desmontava máquinas para entender como funcionavam, e um jovem autônomo que transformava esse entendimento em sustento. Foi aqui que se formou o instinto que move todo o resto.",
      "s1Title": "Mão na massa com hardware, 1991 a 1995",
      "s1Body": "A partir de 1991, o trabalho foi autônomo e prático: importar componentes de computador dos Estados Unidos, montar e vender computadores pessoais sob medida, e instalá-los, configurá-los e consertá-los para quem precisasse de ajuda. Era a época de construir uma máquina a partir de componentes e fazê-la funcionar, em vez de comprar uma pronta. Os sistemas daquele tempo passaram diretamente por estas mãos: DOS e CP/M, BASIC, Turbo Pascal, as primeiras versões do Windows e aplicativos de escritório, e as ferramentas de banco de dados com que as pequenas empresas trabalhavam na época, Clipper e dBase.",
      "s2Title": "As redes anteriores à internet",
      "s2Body": "As redes não começaram com a web. Muito antes da banda larga, o tecido que conectava tudo era diferente e mais difícil de lidar: Novell NetWare para servidores locais, sistemas de bulletin board para comunidade e troca de arquivos, as primeiras redes Ethernet, e as tecnologias de longa distância da época, X.25 (conhecida no Brasil como RENPAC) e Frame Relay. Quando a internet enfim chegou, chegou por modem, acessada por uma conta shell, SLIP ou PPP. Trabalhar com tudo isso significava entender redes desde o cabo, um entendimento que mais tarde fez as redes corporativas parecerem terreno conhecido.",
      "s3Title": "BBS, phreaking e a internet acadêmica",
      "s3Body": "A verdadeira curiosidade daquela época ia além do trabalho remunerado. As explorações daqueles anos incluíram operar e usar sistemas de bulletin board, a mexida na rede telefônica da cena do phreaking, UNIX na prática, e o acesso inicial à internet acadêmica. Era aprender fazendo, em uma comunidade que compartilhava conhecimento porque não havia outro lugar para obtê-lo. Esse hábito, de cavar até entender algo de verdade e então repassá-lo, nunca desapareceu.",
      "s4Title": "1995: o primeiro emprego formal",
      "s4Body": "Em 1995, o trabalho autônomo desaguou em um primeiro emprego formal. Na INTELECTA, uma empresa incubada pelo SEBRAE-SP, o projeto foi um sistema de troca eletrônica de dados para a comercialização de suprimentos médicos e hospitalares, construído sobre servidores Novell NetWare e o sistema de bulletin board PCBoard. Era um sistema de verdade, resolvendo um problema comercial de verdade, e marcou o ponto em que o hobby e o ofício viraram profissão.",
      "closer": "No fim de 1995, a base estava lançada: uma pessoa que entendia máquinas e redes desde os primeiros princípios, que aprendia construindo, e que já tinha o instinto de explicar. Tudo o que veio depois, os fabricantes, as certificações, as salas de aula pelo mundo, foi construído sobre isso."
    },
    "era19962020": {
      "years": "1996 – 2020",
      "title": "Quem é da área",
      "subtitle": "Duas décadas dentro da indústria de redes e segurança, construindo, quebrando e consertando os sistemas que mais tarde se tornaram o conteúdo programático.",
      "intro": "Este é o longo meio da história, e a razão de o treinamento que veio depois ter peso. Por cerca de duas décadas, o trabalho foi implementação: projetar redes, colocá-las no ar, resolver seus problemas sob pressão, e ser a pessoa que recebe a ligação quando algo crítico quebrava. A jornada passou por alguns dos nomes que definiram as redes, em dois continentes.",
      "s1Title": "Cabletron e Enterasys, 1996 a 2000",
      "s1Body": "A carreira formal começou em 1996 na Cabletron Systems, à época uma fabricante líder de equipamentos de rede sediada em Rochester, New Hampshire. Ao longo de quatro anos e meio, o cargo abrangeu engenharia de campo e suporte pós-venda, engenharia de sistemas e pré-vendas, e, a partir de 1997, instrução certificada. O assunto era a LAN e a WAN corporativa da época: switches, roteadores, Wi-Fi e WLAN, gerenciamento de rede, NAC e UAC, e firewalls de inspeção de estado. Em 2000, a Cabletron se reorganizou em quatro empresas, e a parte que tocou esta carreira virou Enterasys Networks.",
      "s2Title": "Riverstone Networks, Santa Clara, 2000 a 2002",
      "s2Body": "O capítulo seguinte foi na Califórnia. A Riverstone Networks, um spin-off da Cabletron que fabricava equipamentos de rede metropolitana, trouxe uma mudança para Santa Clara com um visto de trabalho H1-B1. O cargo foi engenheiro de suporte a produto de nível III e coordenador de gestão do conhecimento: escalonamento técnico de terceiro nível, reprodução de cenários de cliente em laboratório, testes de regressão e verificação de bugs, e a construção da base de conhecimento na qual o restante do suporte se apoiava. As tecnologias eram a espinha dorsal do mundo de operadoras e metro do início dos anos 2000: Gigabit Ethernet, MPLS, switching e roteamento metropolitanos, e BGP. Esse período também rendeu um marco formal: como parte do processo de visto, uma avaliação nos Estados Unidos em 2001 reconheceu uma formação equivalente a um bacharelado em ciência da computação e um bacharelado em administração de empresas.",
      "s3Title": "Cisco Systems, Brasília, 2003 a 2004",
      "s3Body": "De volta ao Brasil, e contratado através da Cisco Professional Services, o cargo se deslocou para a relação com o cliente em sua forma mais exigente. Como gestor de operações de alto contato e ponto de contato único, o trabalho foi a gestão da satisfação do cliente no pós-venda para duas das maiores entidades federais do Brasil, o SERPRO, a empresa de processamento de dados do governo, e a ECT-Correios, o correio nacional. A superfície técnica eram switches e roteadores Catalyst, firewalls PIX, e balanceadores de carga CSS, CSM e ACE, mas o trabalho de verdade era a gestão de escalonamentos e manter uma infraestrutura nacional crítica funcionando sem percalços.",
      "s4Title": "Enterasys de novo, depois Juniper, 2005 a 2010",
      "s4Body": "A segunda metade da década voltou ao lado do fabricante como especialista na LAN corporativa. Na Enterasys a partir de 2005, o foco eram os switches e roteadores, Wi-Fi e WLAN, gerenciamento de rede, NAC e UAC, e detecção e prevenção de intrusões, passando por design de soluções, implementação, auditoria e treinamento. A partir de 2009, na Juniper Networks através da Professional Services para a América Latina, o cargo foi a promoção de novos produtos para o parceiro estratégico Telefónica Empresas no Brasil, com foco em switches EX e firewalls SRX, com treinamento operacional de Junos-SRX ministrado na Level 3 e na Impsat, hoje Lumen.",
      "s5Title": "Os anos de canal e consultoria, 2010 a 2020",
      "s5Body": "A última década desta época transitou com fluidez entre cargos, todos construindo em direção ao instrutor a que a história chega. Houve períodos como engenheiro de redes e segurança através de revendas e distribuidores, aprofundando a expertise em switching e roteamento corporativo, firewalls e firewalls de próxima geração, SSL-VPN, controle de acesso de usuários, aceleração de WAN e balanceamento de carga de internet em soluções da Juniper e da Cisco. De forma decisiva, esse período incluiu a virada para a F5, com o início do trabalho com F5 BIG-IP que definiria os anos seguintes. Em meio a tudo isso, o treinamento técnico foi um fio constante, nunca ausente de cargo nenhum.",
      "closer": "Em 2020, o quadro estava completo: alguém que não apenas havia estudado esses sistemas, mas vivido dentro deles por vinte anos, no lado do fabricante e no do cliente, no projeto e na crise. Essa é a diferença que um implementador leva para uma sala de aula. Quando essa pessoa explica por que uma configuração se comporta de determinada maneira, é porque a viu se comportar assim, às três da manhã, com um correio nacional esperando."
    },
    "era2020present": {
      "years": "2020 – atual",
      "title": "O instrutor",
      "subtitle": "Treinamento técnico em tempo integral, ministrado para o mundo todo, expandindo plataforma a plataforma.",
      "intro": "Em 2020, um fio presente por toda a carreira virou o tecido inteiro. Depois de duas décadas em que o ensino acompanhou cada cargo, o treinamento virou o trabalho em si: em tempo integral, oficial, instrução certificada ministrada para profissionais e equipes no mundo todo. O que distingue esta época não é só o foco, mas a expansão deliberada e datada pelas plataformas, cada uma somada sobre uma profunda experiência de campo, e não em seu lugar.",
      "s1Title": "Tempo integral, por vocação",
      "s1Body": "Desde 2020, o trabalho tem sido ministrar treinamento oficial conduzido por instrutor, remoto e presencial, em português e inglês, para audiências do mundo todo. A entrega alcança Austrália, Singapura, Índia, Europa Central, Estados Unidos e Brasil. As cidadanias brasileira e alemã, somadas à autorização de viagem para os Estados Unidos e o Reino Unido, tornam esse alcance global prático: elegibilidade irrestrita para trabalhar na União Europeia e no Mercosul, e a liberdade de ir até onde a sala de aula estiver.",
      "s2Title": "F5, desde o início",
      "s2Body": "A F5 é a âncora desde o começo desta época, apoiada em um trabalho com BIG-IP que remonta a mais de uma década. O currículo autorizado cobre todo o catálogo BIG-IP conduzido por instrutor: Local Traffic Manager, DNS, Advanced WAF, Access Policy Manager, Advanced Firewall Manager, SSL Orchestrator, BIG-IQ, desenvolvimento de iRules, automação e troubleshooting, de cursos de um dia a cursos de quatro dias. Ao lado do ensino corre um complemento prático: ambientes de laboratório F5 BIG-IP gerenciados, para que a prática sempre tenha um lugar de verdade para acontecer.",
      "s3Title": "A expansão, plataforma a plataforma",
      "s3Body": "O que distingue os anos recentes é uma progressão clara e datada. O treinamento da Extreme Networks foi somado a partir de 2021, cobrindo switching EXOS, SD-WAN e automação. A Fortinet veio a partir de 2024, com foco na trilha FCP FortiGate Administrator. A Netskope entrou a partir de 2025, cobrindo a operação, administração, implementação e integração da Netskope Security Cloud. Quatro plataformas, cada uma somada de forma deliberada, cada uma apoiada nas mesmas duas décadas de implementação de redes e segurança por baixo.",
      "s4Title": "Através da Red Education, para o mundo",
      "s4Body": "O principal veículo dessa entrega global é a Red Education, um centro de treinamento autorizado por meio do qual cursos oficiais e certificados alcançam organizações em diferentes regiões. O cargo é global technical training instructor, ministrando para o tipo de audiência internacional que uma base em São Paulo, dois passaportes e um amor genuíno por viajar tornam possível. A relação permanente transforma a expertise individual em algo que organizações no mundo todo podem contratar e em que podem confiar.",
      "closer": "É aqui que o fio condutor de toda a história dá retorno. A curiosidade dos primeiros anos virou a profundidade de implementação dos anos de campo, e essa profundidade é agora o que cada aluno recebe: não um apresentador lendo slides, mas alguém que construiu esses sistemas explicando como eles funcionam de verdade, e por quê."
    }
  },
  "vendors": {
    "indexTitle": "Fabricantes",
    "indexLede": "As empresas de redes e segurança cuja tecnologia moldou esta carreira, desde o cabo. São relações do passado; as plataformas ensinadas hoje estão em Treinamentos.",
    "backToVendors": "Todos os fabricantes",
    "backToAbout": "Sobre",
    "technologies": "Tecnologias",
    "role": "Cargo",
    "years": "Anos",
    "readNext": "Próximo fabricante",
    "cabletron": {
      "name": "Cabletron e Enterasys",
      "years": "1996 – 2007",
      "tagline": "Onde a carreira começou, e onde a LAN corporativa foi aprendida do zero.",
      "intro": "O fio individual mais longo desta história percorre uma empresa e sua sucessora. A Cabletron Systems, uma fabricante líder de equipamentos de rede sediada em Rochester, New Hampshire, foi o primeiro empregador, a partir de 1996. Quando a Cabletron se reorganizou em quatro empresas em 2000, a linha continuou como Enterasys Networks, e a relação foi retomada ali a partir de 2005. Juntas, abrangem a década formativa da expertise em redes corporativas.",
      "s1Title": "Cabletron, 1996 a 2000",
      "s1Body": "Ao longo de quatro anos e meio, o cargo percorreu todo o arco da engenharia de fabricante: engenharia de campo e suporte pós-venda, engenharia de sistemas e pré-vendas, e, a partir de 1997, instrução certificada. O assunto era a LAN e a WAN corporativa da época: switches e roteadores, Wi-Fi e WLAN, gerenciamento de rede, NAC e UAC, e firewalls de inspeção de estado. Foi aqui que a disciplina de design de soluções, implementação, auditoria, troubleshooting e gestão de escalonamentos foi praticada pela primeira vez, e foi aqui que o ensino entrou no trabalho pela primeira vez.",
      "s2Title": "Enterasys, 2005 a 2007",
      "s2Body": "De volta à linha como gestor de serviços e suporte, o foco era a linha de produtos Secure Routing, com a Enterasys como ponto focal regional para o Brasil. O trabalho combinava suporte ao cliente de alto nível, troubleshooting complexo e gestão de escalonamentos com gestão de produto localizada. A superfície técnica havia crescido e agora incluía gerenciamento de rede, NAC e UAC, detecção e prevenção de intrusões, e SIEM, passando por switching e roteamento corporativo. A Enterasys foi mais tarde adquirida pela Extreme Networks em 2013, fechando um círculo que conecta este trabalho inicial a uma plataforma ainda ensinada hoje.",
      "certs": "Cabletron Systems Engineer (CSE), 1999. Enterasys Systems Engineer (ESE), 2000 e 2007. Enterasys Certified Internetworking Engineer (ECIE), 2007.",
      "lineageTitle": "A linhagem corporativa",
      "lineageDesc": "A Cabletron Systems, sediada em Rochester, New Hampshire, dividiu-se em quatro empresas em 2000: Enterasys, Riverstone, Aprisma e GNTS. A Enterasys foi adquirida pela Extreme Networks em 2013. A Riverstone foi adquirida pela Alcatel-Lucent em 2006."
    },
    "juniper": {
      "name": "NetScreen e Juniper",
      "years": "2009 – 2014",
      "tagline": "O switching corporativo e os gateways de segurança que cresceram da NetScreen até a linha SRX da Juniper.",
      "intro": "A Juniper Networks adquiriu a NetScreen, a empresa de firewalls, em 2004, e a tecnologia de segurança da NetScreen virou a base da linha de gateways seguros da Juniper. Trabalhar com ambas reflete uma linhagem contínua: os firewalls SSG da NetScreen e os gateways SRX que os sucederam. A relação correu diretamente pela Juniper a partir de 2009, e continuou depois pelo canal de distribuição.",
      "s1Title": "Juniper Networks, 2009 a 2010",
      "s1Body": "Contratado através da Juniper Professional Services para o Brasil, o cargo foi a promoção de novos produtos para as linhas corporativas recém-lançadas: os gateways seguros da série SRX e os switches da série EX. A colaboração principal foi com o parceiro estratégico Telefónica Empresas no Brasil. Além da promoção de pré-vendas, esse período rendeu instrução de verdade: treinamento sobre o sistema operacional de rede JUNOS e a operação dos gateways seguros SRX para parceiros de canal e clientes, incluindo treinamento operacional para a equipe do centro de operações de rede da Level 3 Communications no Brasil e na Argentina.",
      "s2Title": "Pelo canal, 2010 a 2014",
      "s2Body": "A relação com Juniper e NetScreen continuou através de integradores de sistemas e revendas. Na CYLK, o trabalho abrangeu desenvolvimento de configurações, testes de prova de conceito e interoperabilidade, e implementação e troubleshooting em produção sobre Juniper, NetScreen e F5. Na TDec, a Juniper se somou a uma prática de consultoria e treinamento multifabricante. A gama de produtos na prática ao longo desses anos foi ampla: switches EX, firewalls SRX e NetScreen SSG, SSL-VPN SA, roteadores da série J e Wi-Fi gerenciado AX.",
      "certs": "Juniper Networks Sales Specialist, Enterprise Networking (JNSS-EN), 2010. Juniper Networks Sales Associate, Enterprise Networking (JNSA-EN), 2010.",
      "lineageTitle": "A linhagem de segurança",
      "lineageDesc": "A NetScreen, fabricante dos firewalls SSG, foi adquirida pela Juniper Networks em 2004 e virou a base da linha de gateways seguros SRX da Juniper."
    },
    "riverstone": {
      "name": "Riverstone Networks",
      "years": "2000 – 2002",
      "tagline": "Dois anos em Santa Clara, na fronteira das redes de operadora e metropolitanas.",
      "intro": "O único capítulo desta carreira situado inteiramente fora do Brasil. A Riverstone Networks, uma fabricante de equipamentos de rede metropolitana sediada em Santa Clara, Califórnia, trouxe uma mudança para os Estados Unidos com um visto de trabalho H1-B1. A Riverstone tinha uma linhagem própria incomum: originalmente uma empresa chamada Yago, adquirida pela Cabletron por volta de 1998, e reaparecida como empresa independente por meio de um spin-off em 2001. Mais tarde foi adquirida pela Alcatel-Lucent em 2006.",
      "s1Title": "Suporte de nível III e gestão do conhecimento",
      "s1Body": "O cargo teve dois títulos ao longo de dois anos: engenheiro de suporte a produto e coordenador de gestão do conhecimento. Como especialista de suporte técnico de nível III, o trabalho foi o escalonamento de terceiro nível, a reprodução de cenários de cliente em laboratório, os testes de regressão e a verificação de bugs. Como coordenador de gestão do conhecimento, consistiu em construir e organizar a base de conhecimento na qual o restante do suporte se apoiava, além de apoio ao marketing de produto e treinamento interno. Este foi o trabalho de suporte técnico mais profundo da carreira, no nível em que os problemas mais difíceis escalam.",
      "s2Title": "O mundo das redes metropolitanas",
      "s2Body": "As tecnologias eram a espinha dorsal da era de operadoras e metro do início dos anos 2000: Gigabit Ethernet, MPLS, switching e roteamento metropolitanos, e roteamento IP de longa distância, incluindo BGP. Trabalhar no suporte de terceiro nível do fabricante significava ver como esses sistemas se comportavam nos limites, sob condições que só afloram em produção em larga escala. Também rendeu instrução formal: treinamento sobre conceitos, recursos e configuração da Riverstone, e treinamento sobre identificação de problemas de suporte ao cliente e procedimentos de escalonamento.",
      "certs": "Riverstone Certified Networking Professional (RCNP), 2001. Avaliação de equivalência educacional nos Estados Unidos reconhecendo uma formação equivalente a um bacharelado em ciência da computação e um bacharelado em administração de empresas, concluída em 2001 como parte do processo do visto H1-B1.",
      "lineageTitle": "A linhagem corporativa",
      "lineageDesc": "A Riverstone Networks começou como uma empresa chamada Yago, foi adquirida pela Cabletron Systems por volta de 1998, reapareceu como empresa independente por meio de um spin-off em 2001, e foi adquirida pela Alcatel-Lucent em 2006."
    },
    "cisco": {
      "name": "Cisco Systems",
      "years": "2003 – 2008",
      "tagline": "Manter uma infraestrutura nacional crítica funcionando, como ponto de contato único para os clientes federais do Brasil.",
      "intro": "Contratado através da Cisco Professional Services no Brasil, esta foi a carreira em sua forma operacionalmente mais exigente, em que o trabalho tinha menos a ver com uma única tecnologia e mais com manter sistemas críticos funcionando para clientes que não podiam se dar ao luxo de tempo de inatividade.",
      "s1Title": "Operações de alto contato, 2003 a 2004",
      "s1Body": "Como gestor de operações de alto contato e ponto de contato único, o cargo foi a gestão da satisfação do cliente no pós-venda para duas das maiores entidades federais do Brasil: o SERPRO, a empresa de processamento de dados do governo, e a ECT-Correios, o correio nacional, entre Brasília e São Paulo. A superfície técnica incluía switches e roteadores Catalyst, firewalls PIX, e appliances de conteúdo e balanceamento de carga CSS, CSM e ACE. A verdadeira disciplina, porém, era a gestão de escalonamentos e o gerenciamento de crises, manter alta satisfação para contas em que o que estava em jogo era nacional.",
      "s2Title": "Instrução da Cisco, 2007 a 2008",
      "s2Body": "A relação com a Cisco também rendeu entrega de treinamento formal: conceitos e operação de IOS e CatOS, e conceitos, operação e troubleshooting de redes de camada 2 e camada 3, em cursos de vários dias. Isso complementou a profunda experiência operacional com a instrução estruturada que mais tarde se tornaria o foco completo da carreira.",
      "ironportTitle": "Uma nota à parte: IronPort, 2004",
      "ironportBody": "Vale registrar com exatidão, e diferenciado do trabalho na Cisco: uma breve colaboração de três meses no fim de 2004 com a IronPort Systems, à época uma startup independente de appliances de segurança de e-mail sediada em San Bruno, Califórnia. O trabalho foi desenvolvimento de canal e consultoria técnica de pré-vendas para seus appliances de segurança de e-mail da série C. Isso é anterior por completo à aquisição da IronPort pela Cisco em 2007, então foi uma relação à parte com uma empresa independente, não tecnologia da Cisco, e é mencionada aqui apenas porque a empresa mais tarde passou a fazer parte da Cisco.",
      "certs": "Cisco Certified Network Associate (CCNA), 2000 e 2005. Cisco Internetwork Troubleshooting (CIT), 2003."
    },
    "paloalto": {
      "name": "Palo Alto Networks",
      "years": "2013 – 2015",
      "tagline": "Firewalls de próxima geração, pelo canal de distribuição e pela sala de aula.",
      "intro": "Uma relação focada na tecnologia de firewalls de próxima geração, conduzida pelo canal de revendas e integradores. É uma colaboração do passado; a Palo Alto não está entre as plataformas ensinadas hoje, mas o trabalho foi real e certificado.",
      "s1Title": "Consultoria e treinamento de canal, 2013 a 2015",
      "s1Body": "Na TDec Network Group, a Palo Alto se somou a uma prática de consultoria e treinamento multifabricante que abrangia engenharia de sistemas, arquitetura de soluções, habilitação de aplicações, implementação, auditorias e troubleshooting. A relação continuou através da Cipher Security em 2015 para trabalho de pré-vendas e pós-venda. O foco técnico eram os firewalls de próxima geração e a plataforma de gerenciamento Panorama, o núcleo da oferta de segurança corporativa da Palo Alto à época.",
      "s2Title": "Instrução de PAN-OS",
      "s2Body": "Esse período incluiu entrega de treinamento formal: um bootcamp de PAN-OS 6.0, que construía a mesma instrução prática e baseada em laboratórios que define a prática de ensino de hoje. Combinado com as certificações conquistadas em 2014, isso estabeleceu uma profundidade genuína na plataforma, mesmo que o foco da carreira mais tarde tenha se concentrado em outras tecnologias.",
      "certs": "Palo Alto Certified Network Security Engineer (CNSE 5.1), 2014. Palo Alto Networks Accredited Configuration Engineer (ACE), 2014. Palo Alto Networks Accredited Sales Expert (ASE), 2014. Observação: estas certificações são históricas e não são mantidas como vigentes."
    }
  },
  "training": {
    "eyebrow": "Treinamentos que ministro",
    "title": "Quatro plataformas, ensinadas por quem já as operou.",
    "intro": "Treinamento oficial e certificado, conduzido por instrutor, em {courses} cursos nas quatro plataformas no centro das redes e da segurança modernas. Cada curso é ministrado por um instrutor autorizado, com décadas de implementação prática por trás do ensino.",
    "courseCount": "{count} cursos",
    "since": "desde",
    "representativeNote": "Este catálogo é representativo, não exaustivo. Nomes de cursos, durações e conteúdos refletem informações públicas atuais e são refinados a partir de datasheets oficiais.",
    "allPlatforms": "Todas as plataformas",
    "authorizedSince": "Instrutor autorizado desde {year}",
    "workingSince": "Trabalha com {platform} desde {year}",
    "tech": {
      "switchesRouters": "switches e roteadores corporativos",
      "firewalls": "firewalls",
      "webCloudSecurity": "segurança web e em nuvem"
    },
    "coursesHeading": "{count} cursos",
    "duration": "Duração",
    "delivery": "Entrega",
    "deliveryValue": "Virtual ou presencial",
    "modules": "Módulos",
    "aboutCourse": "Sobre este curso",
    "tableOfContents": "Conteúdo programático",
    "agendaPending": "Uma agenda detalhada, dia a dia, será adicionada a partir do datasheet oficial do curso.",
    "moreFrom": "Mais cursos {platform}",
    "requestTraining": "Solicitar este treinamento",
    "requestVia": "Ministrado através da {destination}"
  },
  "teach": {
    "eyebrow": "Como eu ensino",
    "title": "Um instrutor que construiu esses sistemas antes de ensiná-los.",
    "lede": "A maior parte do treinamento técnico é ministrada por pessoas que aprenderam o assunto para ensiná-lo. Aqui é o contrário: três décadas construindo, quebrando e consertando redes e sistemas de segurança de verdade, destiladas em um treinamento que conecta cada conceito ao modo como ele se comporta de fato em produção.",
    "s1Title": "Por que isso importa em uma sala de aula",
    "s1Body": "Há uma diferença entre explicar como um recurso deveria funcionar e explicar por que ele se comporta como se comporta às três da manhã quando algo crítico está fora do ar. O primeiro vem de um manual. O segundo vem de ter estado lá. Desde 1996, o trabalho foi implementação: projetar redes, colocá-las no ar, e ser a pessoa que recebe a ligação quando elas quebravam, para fabricantes e para algumas das maiores organizações do Brasil. Essa profundidade é o que cada aluno recebe, não um apresentador lendo slides, mas um engenheiro que viveu dentro desses sistemas explicando como eles funcionam de verdade.",
    "s2Title": "O complexo tornado claro",
    "s2Body": "Conhecimento técnico profundo é necessário, mas não suficiente. A habilidade mais rara é traduzi-lo: pegar algo realmente complexo, firewalls de aplicação web, federação de identidade, gerenciamento de tráfego, SD-WAN, e fazer com que faça sentido para quem topa com aquilo pela primeira vez. Os alunos destacam de forma constante os exemplos do mundo real e a didática clara e estruturada, a capacidade de colocar cada conceito no contexto do trabalho que de fato realizam. O ensino foi um fio ao longo de toda esta carreira, presente em quase todo cargo desde 1997, e o foco em tempo integral desde 2020.",
    "s3Title": "Mão na massa, não vago",
    "s3Body": "A habilidade técnica se constrói fazendo, não assistindo. Cada curso é construído em torno de laboratórios práticos em sistemas de verdade, reforçados com ambientes de laboratório gerenciados para que a prática sempre tenha um lugar de verdade para acontecer. O formato se adapta à audiência: treinamento conduzido por instrutor virtual para o mundo todo, presencial quando isso serve melhor, em inglês ou português. O objetivo de cada sessão é o mesmo, que os participantes saiam capazes de executar a tarefa, não apenas de descrevê-la.",
    "s4Title": "Reconhecido, certificado e atualizado",
    "s4Body": "O ensino se apoia em uma base de reconhecimento formal. F5 DevCentral MVP por três anos consecutivos, em 2022, 2023 e 2024. Certificações F5 mantidas desde 2015, e autorização de instrutor em quatro plataformas: F5, Extreme Networks, Fortinet e Netskope. A entrega alcança Austrália, Singapura, Índia, Europa Central, Estados Unidos e Brasil, através da Red Education, um centro de treinamento autorizado. As credenciais importam, mas são um atalho para o que está por baixo: um domínio genuíno e atual da tecnologia.",
    "platformsTitle": "O que eu ensino",
    "platformsBody": "Treinamento oficial e certificado, conduzido por instrutor, em quatro plataformas no centro das redes e da segurança modernas. Cada uma leva ao seu catálogo de cursos completo.",
    "s5Title": "Além da sala de aula",
    "s5Body": "A mesma profundidade que produz um bom ensino produz uma boa consultoria. Trinta anos atravessando entrega de aplicações, segurança de rede, identidade e infraestrutura, tanto no lado do fabricante quanto no do cliente, são uma perspectiva que viaja muito além de uma sala de treinamento, até as decisões de arquitetura, a seleção de tecnologia e os problemas difíceis que não cabem em um conteúdo programático. O ensino é o foco; a experiência por trás dele está disponível para equipes que precisam de mais do que um curso.",
    "toolsTitle": "Ferramentas que calculam, nunca chutam",
    "toolsBody": "Ao lado do treinamento há um conjunto crescente de ferramentas de rede e segurança gratuitas e que respeitam a privacidade, utilitários determinísticos que rodam inteiramente no seu navegador e nunca enviam sua informação a lugar nenhum. Cálculo de sub-redes e CIDR, IPv6, inspeção de certificados e tokens, e mais, o tipo de ferramenta do dia a dia a que um engenheiro na ativa recorre. São feitas com o mesmo espírito do ensino: precisas, práticas e de fato úteis. Experimente, sem cadastro, sem rastreamento.",
    "toolsCta": "Explorar as ferramentas",
    "historyTitle": "Três décadas, um fio condutor",
    "historyBody": "De montar computadores ainda adolescente em 1991, passando por duas décadas dentro da indústria de redes e segurança, até a instrução global em tempo integral desde 2020. Vale a pena ler a história completa se você quiser entender a experiência por trás do ensino.",
    "historyCta": "Ler a história completa",
    "ctaTitle": "Vamos trabalhar juntos",
    "ctaBody": "Seja para contratar um treinamento oficial, montar um programa sob medida para a sua equipe, ou trazer uma consultoria experiente para um problema difícil, a porta está aberta.",
    "ctaButton": "Entre em contato",
    "coursesButton": "Ver todos os cursos"
  },
  "contact": {
    "title": "Entre em contato",
    "lede": "Seja para contratar um treinamento oficial, montar um programa sob medida para a sua equipe ou trazer uma consultoria experiente para um problema difícil, terei prazer em conversar.",
    "formHeading": "Envie uma mensagem",
    "directHeading": "Ou fale diretamente",
    "formName": "Seu nome",
    "formEmail": "Seu e-mail",
    "formTopic": "Sobre o que é?",
    "topicTraining": "Treinamento oficial",
    "topicCustom": "Programa sob medida para equipe",
    "topicAdvisory": "Consultoria e assessoria",
    "topicOther": "Outro assunto",
    "formMessage": "Sua mensagem",
    "formSend": "Enviar mensagem",
    "formSending": "Enviando…",
    "formRequired": "Por favor, preencha seu nome, e-mail e uma mensagem.",
    "successTitle": "Obrigado.",
    "successBody": "Sua mensagem está a caminho. Responderei assim que possível.",
    "errorBody": "Algo deu errado no envio. Tente novamente ou escreva diretamente por e-mail.",
    "emailLabel": "E-mail",
    "channels": {
      "linkedin": {
        "description": "Conecte-se profissionalmente",
        "label": "LinkedIn"
      },
      "youtube": {
        "description": "Vídeos e tutoriais",
        "label": "YouTube"
      },
      "instagram": {
        "description": "Nos bastidores",
        "label": "Instagram"
      },
      "training": {
        "label": "Treinamento oficial",
        "description": "Reserve um curso pela Red Education"
      }
    },
    "feedbackNote": "Encontrou um bug, um erro ou uma imprecisão no site?",
    "feedbackLink": "Compartilhe na página de ideias"
  },
  "certs": {
    "title": "Certificações e credenciais",
    "lede": "Três décadas de credenciais formais em redes e segurança. As autorizações de instrutor e as certificações abaixo estão vigentes; um registro completo das credenciais conquistadas, a maioria já histórica, segue para quem quiser profundidade.",
    "jumpToHistorical": "Ir para o registro completo",
    "credlyVerify": "Verificar no Credly",
    "current": "Vigente",
    "historical": "Histórico",
    "instructorTitle": "Autorizações de instrutor",
    "instructorIntro": "Autorizado a ministrar treinamento oficial e certificado em cada uma destas plataformas atualmente.",
    "currentCertsTitle": "Certificações vigentes",
    "recognitionTitle": "Reconhecimento",
    "historicalTitle": "Registro completo",
    "historicalIntro": "Credenciais conquistadas ao longo de uma carreira iniciada em 1996. A maioria é histórica ou expirada, mantida aqui pela profundidade que representa.",
    "verify": "Verificar",
    "credly": "Credly",
    "certificate": "Certificado",
    "verifyCode": "Código",
    "candidateId": "ID"
  },
  "colophon_page": {
    "eyebrow": "Colofão",
    "title": "Como isto foi construído",
    "lede": "A maioria dos sites não se explica. Este explica, porque como ele foi feito é parte do que ele é: um experimento deliberado de construir bem, com colaboradores incomuns, e um registro que vale a pena preservar.",
    "concordTitle": "CONCORD",
    "concordBody1": "Este site foi projetado e construído por meio de um protocolo chamado CONCORD: uma colaboração estruturada entre uma pessoa e três sistemas de IA distintos, cada um em um papel próprio. Não é um truque. É um método de trabalho, com sua própria governança, seu próprio registro de decisões, e uma única pessoa responsável por cada escolha que foi publicada.",
    "concordBody2": "A premissa é simples. Modelos de IA diferentes têm forças diferentes, e um problema difícil se beneficia de mais de uma perspectiva mantidas em tensão. Por isso o trabalho foi dividido por papéis, e uma pessoa ficou no centro, fazendo a ponte entre eles, ratificando o que era sólido e rejeitando o que não era.",
    "concordBody3": "O CONCORD não foi adotado de lugar nenhum. Foi concebido por Rodolfo Nützmann para este projeto, a partir de uma necessidade prática: como recorrer a vários sistemas de IA ao mesmo tempo, cada um realmente bom em algo diferente, sem abrir mão do único fio de responsabilidade humana que o trabalho real exige. A resposta foi dar a cada sistema um posto definido, impedir que negociassem entre si e encaminhar cada troca por uma única pessoa que mantinha a visão do todo. Esse arranjo tem um nome mais antigo. Os sistemas de IA são agentes: agem por instrução e em nome de outra pessoa. O PRIME é o principal: quem de fato decide, quem exerce o julgamento e quem carrega as consequências e o nome.",
    "concordBody4": "Começou de modo informal — como uma forma de dividir o trabalho — e se consolidou ao longo da construção num método com nome: postos fixos, uma única regra acima de tudo, que nada é publicado sem que o PRIME ratifique, e um registro escrito de por que cada decisão foi tomada. O nome declara o objetivo: concórdia, um acordo alcançado de propósito por meio de um processo, não o que uma ferramenta sem supervisão venha a produzir.",
    "concordPrincipal": "A vantagem é dos agentes. A responsabilidade é do principal, e não se transfere.",
    "concordMechTitle": "A mecânica, em termos claros",
    "mech1Label": "Propor",
    "mech1Gloss": "Cada posto apresenta opções dentro do seu próprio âmbito.",
    "mech2Label": "Transmitir",
    "mech2Gloss": "O PRIME leva as propostas entre os postos; eles nunca negociam diretamente.",
    "mech3Label": "Ratificar",
    "mech3Gloss": "O PRIME aceita o que é sólido e rejeita o que não é. Sem isso, nada é publicado.",
    "mech4Label": "Restringir",
    "mech4Gloss": "Um conjunto permanente de regras internas limita cada resultado, em cada posto.",
    "mech5Label": "Registrar",
    "mech5Gloss": "Um registro escrito de decisões guarda o raciocínio por trás de cada escolha.",
    "mech6Label": "Lembrar",
    "mech6Gloss": "O contexto, as regras internas e esse registro persistem como arquivos, levados de uma sessão à seguinte, de modo que o método sobrevive a qualquer conversa.",
    "rolesTitle": "Os assentos",
    "rolePrime": "PRIME",
    "rolePrimeWho": "Rodolfo Nützmann",
    "rolePrimeBody": "O único ratificador. Cada decisão, cada linha publicada, passou por uma pessoa que tinha o quadro completo e assumia a responsabilidade final. As IAs propunham; PRIME decidia.",
    "rolePrimeModel": "Humano",
    "roleAnvil": "ANVIL",
    "roleAnvilWho": "Engenharia",
    "roleAnvilBody": "O assento de engenheiro-chefe. Arquitetura, código, estrutura de conteúdo, e a própria build, convertidos da intenção em um site funcional, testado e implantável.",
    "roleAnvilModel": "Anthropic · Claude Opus 4.8",
    "roleScout": "SCOUT",
    "roleScoutWho": "Estratégia e marca",
    "roleScoutBody": "O assento da estratégia e do posicionamento. As perguntas sobre o que isto é, para quem é, e como deve se apresentar ao mundo.",
    "roleScoutModel": "OpenAI · ChatGPT 5.5",
    "rolePrism": "PRISM",
    "rolePrismWho": "Design",
    "rolePrismBody": "O assento do design. A linguagem visual, a tipografia, a cor e a sensação do conjunto, moldados em um sistema coerente.",
    "rolePrismModel": "Google · Gemini 3.1 Pro",
    "seatsModelNote": "Versões dos modelos de IA em junho de 2026.",
    "principlesTitle": "Como foi feito",
    "principlesBody": "Alguns princípios valeram do início ao fim, e são visíveis se você souber onde olhar.",
    "p1Title": "Calcular, nunca chutar",
    "p1Body": "As ferramentas deste site calculam respostas de forma local e determinística. Elas não chamam um servidor com a sua informação, e não aproximam. O que roda no seu navegador, fica no seu navegador.",
    "p2Title": "Aberto no núcleo",
    "p3Title": "Documentado por construção",
    "p3Body": "Cada parte do código é comentada e documentada, não como algo deixado para depois, mas como regra permanente. A build é feita para ser legível, para quem a mantém e para qualquer um que a herde.",
    "p4Title": "Construído para durar e para viajar",
    "p4Body": "O site é uma exportação estática: rápida, cacheável e sem depender de nada em tempo de execução. É estruturado desde a base para muitos idiomas, de modo que pode se dirigir a uma audiência global sem ser reconstruído.",
    "stackTitle": "A stack",
    "stackBody": "Para quem se importa com essas coisas, a fundação técnica, exposta com clareza.",
    "stackFramework": "Framework",
    "stackFrameworkV": "Next.js 15 e React 19, exportados como site totalmente estático",
    "stackI18n": "Internacionalização",
    "stackI18nV": "next-intl, com {count} idiomas e suporte da direita para a esquerda",
    "stackDesign": "Sistema de design",
    "stackDesignV": "Um motor de temas personalizável, baseado em tokens; o tema padrão é o Obsidian",
    "stackType": "Tipografia",
    "stackTypeV": "Inter para o texto, JetBrains Mono para dados e códigos",
    "stackEngine": "Motor de ferramentas",
    "stackEngineV": "Uma camada de computação determinística que roda inteiramente no navegador",
    "stackSearch": "Busca",
    "stackSearchV": "Busca de texto completo estática, no lado do cliente; sem servidor de busca",
    "vibeTitle": "Isto é vibe coding?",
    "vibeBody1": "É uma pergunta justa, e vale a pena respondê-la com clareza. Vibe coding é um termo que o pesquisador de IA Andrej Karpathy cunhou no início de 2025 para uma forma de construir software em que você descreve o que quer a um modelo de linguagem, aceita o que ele escreve sem ler com atenção e se orienta pelos resultados, não pelo próprio código. Ele o descreveu como se entregar à vibe e esquecer que o código sequer existe, e deixou claro que servia mais para projetos rápidos e descartáveis do que para sistemas dos quais as pessoas dependem.",
    "vibeBody2": "Por essa definição, parte deste site foi construída assim, e é melhor assumir do que esconder. A superfície da aplicação, a ligação do framework, os componentes, a estilização, o encanamento que mantém as páginas juntas, foi produzida rapidamente com um engenheiro de IA e orientada pelo resultado e por um conjunto fixo de regras internas, não digitada à mão linha por linha. Para essa camada, onde um erro é visível e facilmente corrigido, a velocidade era o ponto.",
    "vibeBody3": "As partes que mais importam seguem um padrão diferente. Tudo o que computa os seus dados é verificado, não feito na vibe: o núcleo de cada ferramenta é conferido contra o padrão publicado que implementa, os RFCs e especificações pertinentes, e a sua saída é confirmada contra referências independentes antes de ser publicada. Como diz uma frase muito citada do programador Simon Willison, código que você revisou, testou e entendeu não é vibe coding de forma alguma. O próprio Karpathy agora chama a versão disciplinada de agentic engineering: manter a alavancagem da IA sem abrir mão da qualidade do resultado. É essa a linha que este projeto traça. Rápido onde a velocidade sai de graça, rigoroso onde importa, e uma pessoa responsável por tudo.",
    "closingTitle": "Uma nota sobre o método",
    "closingBody": "Construir software com colaboradores de IA é novo o bastante para que o honesto seja ser transparente a respeito. Nada aqui foi publicado sem que uma pessoa decidisse que deveria ser. As IAs foram instrumentos, instrumentos capazes, mas instrumentos. O julgamento, a responsabilidade e o nome no trabalho são humanos.",
    "backHome": "Voltar para as ferramentas",
    "changelogLink": "Registro de alterações",
    "standardsTitle": "Padrões e frameworks",
    "standardsLede": "Cada ferramenta aqui implementa uma especificação publicada, não um palpite. Os decodificadores e as calculadoras são construídos sobre os documentos que definem seus formatos e fixados aos vetores de teste que esses documentos publicam, de modo que cada resposta é conferida contra a fonte da verdade, e não contra si mesma.",
    "specsLabel": "As especificações",
    "specsBody": "JSON Web Tokens seguem a RFC 7519, com assinaturas e algoritmos nas RFC 7515 e 7518; PKCE é a RFC 7636; Base64 e suas variantes são a RFC 4648; UUIDs são a RFC 9562 (que tornou obsoleta a RFC 4122 em 2024 e traz seus próprios vetores de teste); HMAC é a RFC 2104, sobre a família SHA padronizada em FIPS 180-4 e FIPS 202; certificados X.509 são a RFC 5280; IPv4 e a notação CIDR são a RFC 4632; o endereçamento IPv6 e sua forma textual canônica são as RFC 4291 e RFC 5952; e o decodificador de cipher suites é guiado pelo registro oficial IANA TLS Cipher Suites, cruzado com as especificações do TLS 1.3 e 1.2 (RFC 8446 e 5246), as regras de atualização do registro que definem a coluna “Recommended” (RFC 8447) e a proibição do RC4 (RFC 7465). Onde um registro é a autoridade, seus dados são incorporados diretamente, em vez de redigitados.",
    "vectorsLabel": "Vetores de referência",
    "vectorsBody": "Cada ferramenta traz um conjunto de vetores de referência: entradas conhecidas pareadas com saídas sabidamente corretas, extraídas das RFCs e dos órgãos de padronização pertinentes. Eles rodam a cada build, de modo que uma refatoração que altere silenciosamente uma resposta quebra o build em vez de ir ao ar.",
    "owaspLabel": "OWASP",
    "owaspBody": "As ferramentas de segurança são definidas com base nos frameworks da OWASP, e não montadas de improviso. As ferramentas de criptografia e TLS mapeiam para as áreas Cryptographic Failures e Security Misconfiguration do OWASP Top 10 e para as verificações correspondentes do Application Security Verification Standard; a ferramenta de tokens segue a orientação da OWASP para inspecionar e validar JWTs. As prevention cheat sheets da OWASP também definem regras rígidas para o que vem a seguir: qualquer tratamento de XML ou SAML acrescentado aqui precisa ser endurecido contra XXE antes de ir ao ar.",
    "redblueLabel": "Vermelho e azul",
    "redblueBody": "A mesma decodificação-e-explicação que permite a um red-teamer ler um token capturado permite a um blue-teamer entender o que a própria stack está emitindo. A plataforma fica deliberadamente do lado da análise dessa linha: ela identifica, decodifica, converte e explica, e não chega a forjar, injetar ou derrotar controles. Essa fronteira é uma decisão de projeto, não um descuido; estas ferramentas existem para ensinar e diagnosticar, não para servir de arma.",
    "localLabel": "Local e determinístico",
    "localBody": "Tudo roda no navegador. A ferramenta chama uma função pura: dada a mesma entrada, ela retorna a mesma saída, não guarda estado e não envia nada para um servidor. Sem cookies, sem analytics, como a página de Privacidade detalha por completo.",
    "thanksTitle": "Agradecimentos especiais",
    "p2Body": "A lógica determinística que cada ferramenta executa é a ferramenta inteira: não há etapa oculta no servidor, nem conta, nem telemetria. Tudo é executado no seu navegador."
  },
  "support": {
    "title": "Apoie o projeto",
    "lede": "Estas ferramentas são gratuitas e foram feitas para continuar assim. Se elas economizam seu tempo, você pode contribuir com a manutenção. Totalmente opcional, sempre.",
    "tipHeading": "Deixe uma contribuição",
    "tipBlurb": "Cada contribuição vai diretamente para apoiar as ferramentas e o tempo dedicado a elas.",
    "zeroCommission": "0% de comissão. Os links vão direto para o provedor; este site nunca participa do pagamento.",
    "placeholder": "As opções de apoio estão sendo configuradas e aparecerão aqui em breve."
  },
  "admin": {
    "eyebrow": "Admin",
    "title": "Controle do site",
    "lede": "A superfície de controle dos recursos e configurações opcionais deste site.",
    "previewBanner": "Estrutura de prévia. No site estático, estes controles dão uma prévia da interface administrativa; o controle ao vivo é ativado com a camada de serviço. As alterações aqui não são salvas.",
    "featuresTitle": "Recursos",
    "flagRequestTraining": "Solicitar este treinamento",
    "flagRequestTrainingDesc": "O CTA de geração de leads nas páginas de cursos e plataformas.",
    "flagTipJar": "TipJar",
    "flagTipJarDesc": "Links de apoio ao criador na página de apoio.",
    "flagToolFunding": "Financiamento de ferramenta",
    "flagToolFundingDesc": "Interface de apoio por ferramenta.",
    "flagToolProvenance": "Proveniência da ferramenta",
    "flagToolProvenanceDesc": "Painel de créditos e fontes por ferramenta.",
    "routingTitle": "Roteamento de leads",
    "routingDefaultLabel": "Padrão global",
    "routingNoOverrides": "Nenhuma substituição por plataforma ou curso configurada.",
    "contactTitle": "Contato",
    "contactEmailLabel": "E-mail",
    "contactFormLabel": "Envio do formulário",
    "formMailto": "Fallback mailto (sem backend)",
    "formEndpoint": "Enviando para endpoint",
    "tipJarTitle": "Provedores do TipJar",
    "tipConfigured": "Configurado",
    "tipNotConfigured": "Não configurado",
    "on": "Ligado",
    "off": "Desligado",
    "accessTitle": "Controle de acesso",
    "accessNote": "Apenas estas identidades federadas podem ter acesso administrativo. Aplicado no servidor pela camada de serviço; o site estático não autentica.",
    "accessFederatedOnly": "Apenas login federado. Sem fallback de conta local.",
    "accessRoleLabel": "Papel",
    "accessPermsLabel": "Permissões de owner"
  },
  "machineTranslation": {
    "notice": "Esta página foi traduzida automaticamente e pode conter erros.",
    "cta": "Ajude a melhorar"
  },
  "contribute": {
    "eyebrow": "Traduções",
    "title": "Ajude a melhorar as traduções",
    "lede": "Todos os idiomas aqui além do inglês são um primeiro rascunho feito por máquina. Se você fala algum deles e percebe algo errado ou estranho, suas correções são muito bem-vindas. Veja como enviá-las.",
    "howTitle": "Como contribuir",
    "howBody": "O inglês é a fonte da verdade, e todos os outros idiomas são traduzidos a partir dele, então erros são possíveis. Cada pacote de idioma é um único arquivo de texto com frases rotuladas. Baixe o que você quer melhorar, altere apenas o texto após cada rótulo e deixe os rótulos e tudo o que estiver entre chaves exatamente como está. Depois envie o arquivo editado por e-mail e mencione o idioma. Cada envio é revisado manualmente.",
    "downloadHeading": "Pacotes de idioma",
    "referenceTag": "referência",
    "emailHeading": "Envie sua contribuição",
    "backHome": "Voltar às ferramentas"
  },
  "api": {
    "title": "API",
    "lede": "As ferramentas deste site rodam no seu navegador e mantêm os seus dados no seu dispositivo. Para automação — scripts, pipelines e integrações —, os mesmos cálculos determinísticos estão disponíveis como uma pequena API HTTP. É a contraparte programática das ferramentas do navegador, não um substituto delas.",
    "privacyTitle": "O que isso significa para os seus dados",
    "privacyBody": "A API recebe apenas a entrada que você envia, calcula um resultado e o devolve. Ela não tem estado e não registra valores de consulta nem corpos de requisição. Se você precisa de zero saída de dados garantida, use as ferramentas do navegador ou rode o motor aberto você mesmo.",
    "engineTitle": "O mesmo motor do navegador",
    "specTitle": "A especificação",
    "specBody": "O contrato completo é publicado como OpenAPI 3.1. Baixe-o, aponte as suas próprias ferramentas para ele ou leia a referência abaixo.",
    "downloadSpec": "Baixar openapi.yaml",
    "baseUrlLabel": "URL base",
    "authLabel": "Autenticação",
    "authValue": "Nenhuma. Esta é uma API pública e somente leitura.",
    "referenceTitle": "Referência",
    "loading": "Carregando a especificação.",
    "loadError": "Não foi possível carregar a especificação.",
    "tryItTitle": "Experimente",
    "tryItSend": "Enviar",
    "tryItRunning": "Executando.",
    "tryItHint": "Executa na API ativa deste origin. A sua entrada é enviada ao endpoint.",
    "paramsTitle": "Parâmetros",
    "responsesTitle": "Respostas",
    "schemasTitle": "Esquemas",
    "exampleLabel": "Exemplo",
    "requiredLabel": "obrigatório",
    "fieldLabel": "Campo",
    "typeLabel": "Tipo",
    "descriptionLabel": "Descrição",
    "viewReference": "Referência",
    "viewSwagger": "Swagger UI",
    "swaggerLoadError": "Não foi possível carregar o Swagger UI.",
    "engineBody": "Cada endpoint executa a mesma função pura que a ferramenta no navegador executa, de modo que a API e o navegador retornam resultados idênticos byte a byte."
  },
  "license_page": {
    "eyebrow": "Termos",
    "title": "Licença",
    "closedHeading": "Código fechado — este site",
    "closedBody": "O site em si é de código fechado. Seu design, sua interface, seu conteúdo escrito (incluindo cada artigo do Learn), sua marca e a forma específica como estas ferramentas são montadas e apresentadas aqui são propriedade exclusiva, todos os direitos reservados. Nenhuma permissão é concedida para copiar, reproduzir, modificar, redistribuir ou criar obras derivadas do site ou de seu conteúdo sem consentimento prévio por escrito.",
    "contact": "Dúvidas sobre a licença? <a>Entre em contato.</a>",
    "backHome": "Voltar às ferramentas",
    "thirdHeading": "Componentes de código aberto",
    "lede": "ronutz.com é uma obra proprietária, todos os direitos reservados. Estes termos abrangem o site e o seu conteúdo. O site é construído sobre software de código aberto, que é usado e redistribuído sob os seus próprios termos de licença, creditados abaixo.",
    "thirdBody": "Este site se apoia em trabalho de código aberto. O site em si é construído com Next.js e React e entregue como uma exportação estática; a internacionalização usa next-intl; o conteúdo do Learn é renderizado com next-mdx-remote, gray-matter, remark-gfm e js-yaml; e a busca é fornecida pelo Pagefind. Esses componentes são disponibilizados sob a MIT License, exceto o next-mdx-remote (Mozilla Public License 2.0). A referência da API incorpora o Swagger UI, sob a Apache License 2.0. Cada componente permanece sob a sua própria licença, e os avisos completos acompanham o código-fonte."
  },
  "contributeIdeas": {
    "eyebrow": "Ideias bem-vindas",
    "title": "Compartilhe uma ideia",
    "lede": "Este conjunto de ferramentas foi feito para crescer, e o sinal mais claro de para onde ele deve ir vem de quem o usa. Encontrou um bug, um erro ou uma imprecisão? Quer uma ferramenta que ainda não existe aqui? Viu uma forma melhor de resolver algo, ou um resultado que você redigiria de outro jeito? Envie; todo tipo de contribuição é bem-vindo.",
    "sendTitle": "O que você pode enviar",
    "sendBody": "Bugs, erros e imprecisões de qualquer tipo: uma ferramenta que se comporta mal, um resultado errado, um equívoco em um artigo do Learn, ou qualquer coisa que simplesmente pareça estranha. Pedidos de recursos para ferramentas que já existem. Ideias de novas ferramentas que o conjunto deveria ter. Correções e acréscimos aos artigos do Learn, como uma explicação mais clara, uma fonte melhor, ou um tópico que está faltando. Ou simplesmente um ângulo diferente sobre um problema. Pode vir bruto; uma frase já basta para começar uma conversa.",
    "toolTitle": "Se você está propondo uma nova ferramenta",
    "toolBody": "As ferramentas aqui são módulos pequenos e autodescritivos: um manifesto que diz o que a ferramenta é e de onde vem a sua correção, uma função pura que faz o trabalho, e um conjunto de vetores de referência (golden vectors), os pares fixos de entrada e saída que a comprovam. Uma boa candidata calcula localmente e de forma determinística (a mesma entrada sempre produz a mesma saída, sem relógio, rede ou aleatoriedade no resultado), mantém tudo que é sensível no dispositivo, e ancora a sua correção em uma fonte citada, como uma RFC, e não em opinião. Você não precisa construir nada disso para propor uma: basta descrever o que ela deve calcular, um exemplo, e a fonte em que se baseia.",
    "fitRule": "Um teste simples decide. Toda ferramenta aqui roda inteiramente no seu navegador e não envia nada para lugar nenhum, então uma nova ferramenta precisa ser algo que um computador consiga resolver apenas a partir do que você digita, seguindo uma regra fixa e publicada. Se precisar acessar a internet, consultar algo ao vivo, fazer login ou lembrar de você, não tem lugar aqui.",
    "fitYes": "Encaixa:",
    "fitYesBody": "decodificar ou explicar algo que você cola (um token, um certificado, uma config, a saída de um comando), converter entre formatos, calcular a partir de um padrão ou fórmula, ou gerar a partir de uma regra, como um UUID, um hash ou uma linha de comando.",
    "fitNo": "Não encaixa:",
    "fitNoBody": "qualquer coisa que precise acessar a internet ou verificar algo ao vivo (testar um site real, consultar um servidor DNS ao vivo, escanear um endereço), qualquer coisa que precise de conta, login ou dados salvos, ou qualquer coisa cuja resposta não seja determinada por um padrão publicado.",
    "fitUnsure": "Não tem certeza de que lado a sua ideia cai? Envie mesmo assim e diga o que ela deveria fazer. Vou te dizer com sinceridade se encaixa, e por quê.",
    "emailTitle": "Como falar comigo",
    "emailBody": "O e-mail é o canal. Conte o que você encontrou ou o que gostaria, com detalhes suficientes para agir: um exemplo, um link, a redação exata, o que fizer sentido. Se tornar o conjunto de ferramentas melhor, será construído.",
    "emailLabel": "E-mail",
    "backToTools": "Voltar para as ferramentas"
  },
  "languageStatus": {
    "title": "Status da tradução",
    "reviewed": "Revisado por uma pessoa",
    "complete": "Automática, completa",
    "partial": "Automática, em andamento",
    "explainTitle": "Como as traduções são marcadas",
    "explainBody": "O inglês e o português do Brasil são escritos e revisados por uma pessoa. A maioria dos outros idiomas é traduzida por máquina e sinalizada conforme o seu progresso: âmbar quando o idioma cobre todo o site, amarelo enquanto o conteúdo mais recente ainda está em inglês e sendo atualizado. Os idiomas marcados em vermelho ainda não têm tradução e são exibidos em inglês por enquanto. As páginas traduzidas por máquina também trazem um pequeno aviso, e você pode ajudar a melhorar qualquer uma delas.",
    "stub": "Ainda não traduzido"
  },
  "changelog": {
    "eyebrow": "Registro de mudanças",
    "title": "Novidades",
    "lede": "Um registro contínuo de novas ferramentas, novos artigos do Learn e mudanças importantes neste site. Há {count} ferramentas disponíveis hoje.",
    "kindLaunch": "Lançamento",
    "kindTool": "Nova ferramenta",
    "kindFeature": "Recurso",
    "kindI18n": "Localização",
    "kindContent": "Conteúdo",
    "kindInfra": "Infraestrutura"
  }
}
