RSS Git Download  Clone
Raw Blame History 47kB 1093 lines
const strings = {
  error: {
    server_error: "Erro do servidor, por favor tente novamente",
    aiPromptTooLong: "O prompt de AI é demasiado longo (máximo de 4096 caracteres)",
  },
  title: {
    donate: "Doar",
    donateTitle: "Apoie o P3X Redis UI",
    donateDescription: "O P3X Redis UI é um projeto gratuito e de código aberto. Os custos de manutenção da aplicação, funcionalidades de IA, imagens Docker, servidores e infraestrutura saem do bolso do programador. Se considera esta ferramenta útil, por favor considere apoiar o seu desenvolvimento contínuo com um donativo. Cada contribuição ajuda a manter o projeto vivo e em crescimento. Obrigado!",
    jsonRecursive: "A expandir todas as folhas",
    name: "P3X Redis UI",
    nameDonated: "P3X Redis UI+",
    main: "Pode escolher uma ligação Redis a partir do menu inferior esquerdo.",
    statistics: "Estatísticas",
    error: "Erro",
    connectingRedis: "A ligar ao Redis ...",
    socketioConnectError: "Erro Socket.IO",
    db: "DB",
    server: "Servidor",
    clients: "Clientes",
    memory: "Memória",
    persistence: "Persistência",
    stats: "Estatísticas",
    replication: "Replicação",
    cpu: "CPU",
    cluster: "Cluster",
    modules: "Módulos",
    errorstats: "Estatísticas de erros",
    commandstats: "Estatísticas de comandos",
    latencystats: "Estatísticas de latência",
    keysizes: "Tamanhos de chaves",
    threads: "Threads"
  },
  confirm: {
    dropIndex: "Tem a certeza de que deseja eliminar este índice?",
    uploadBuffer: "Tem a certeza de que quer carregar estes dados binários?",
    uploadBufferDone: "Os dados binários foram carregados",
    uploadBufferDoneAndSave: "Os dados binários foram carregados e guardados no servidor",
    title: "Confirmar",
    alert: "Alerta",
    info: "Informação",
    deleteListItem: "Tem a certeza de que quer eliminar este item da lista?",
    deleteHashKey: "Tem a certeza de que quer eliminar esta chave hash?",
    deleteStreamTimestamp: "Tem a certeza de que quer eliminar este carimbo temporal do stream?",
    deleteSetMember: "Tem a certeza de que quer eliminar este membro do conjunto?",
    deleteZSetMember: "Tem a certeza de que quer eliminar este membro do conjunto ordenado?",
    deleteConnection: "Confirmar",
    deleteConnectionText: "Tem a certeza de que quer eliminar esta ligação Redis?",
    deleteNode: "Tem a certeza de que quer eliminar este nó Redis?",
    delete: "Eliminar?",
    deleteAllKeys: opts => {
      return `Eliminar esta árvore e todas as suas chaves (${opts.key})?`;
    },
    deleteSearchKeys: opts => {
      return `Tem a certeza de que deseja eliminar todas as chaves correspondentes a "${opts.pattern}"? Encontradas ${opts.count} chaves.`;
    },
    socketioConnectError: "O Socket.IO não consegue ligar-se ao servidor. Pode recarregar e tentar resolver o erro de ligação; o cliente não sabe como resolvê-lo sozinho.",
    socketioAuthRequired: "É necessária autorização Socket.IO. Autentique-se com HTTP Basic Auth (nome de utilizador/palavra-passe) e recarregue.",
    invalidCredentials: "Nome de utilizador ou palavra-passe inválidos.",
    deleteKey: "Tem a certeza de que quer eliminar esta chave?",
    rename: {
      title: "Tem a certeza de que quer renomear esta chave?",
      textContent: "Esta ação renomeia a chave permanentemente.",
      placeholder: "A chave Redis (obrigatório)"
    },
    ttl: {
      title: "Tem a certeza de que quer alterar o TTL desta chave?",
      textContent: "Alterar o TTL atualiza o tempo de vida desta chave. Deixe vazio para manter a chave para sempre.",
      placeholder: "O TTL da chave Redis (inteiro ou vazio)",
      placeholderPlaceholder: "Vazio significa que persiste para sempre; caso contrário, introduza um número inteiro.",
      convertTextToTime: "Converter texto em tempo",
      convertTextToTimePlaceholder: "Ex.: 1d será 86400"
    }
  },
  language: {
    bg: "Български / Bulgarian",
    cs: "Čeština / Czech",
    de: "Deutsch / German",
    el: "Ελληνικά / Greek",
    en: "English",
    es: "Español / Spanish",
    fr: "Français / French",
    hu: "Magyar / Hungarian",
    it: "Italiano / Italian",
    ja: "日本語 / Japanese",
    nl: "Nederlands / Dutch",
    pl: "Polski / Polish",
    "pt-PT": "Português / Portuguese",
    ro: "Română / Romanian",
    ru: "Русский / Russian",
    sk: "Slovenčina / Slovak",
    sr: "Српски / Serbian",
    sv: "Svenska / Swedish",
    tr: "Türkçe / Turkish",
    uk: "Українська / Ukrainian",
    zn: "中文 / Chinese",
    ar: "العربية / Arabic",
    az: "Azərbaycanca / Azerbaijani",
    be: "Беларуская / Belarusian",
    bn: "বাংলা / Bengali",
    da: "Dansk / Danish",
    et: "Eesti / Estonian",
    fi: "Suomi / Finnish",
    fil: "Filipino / Filipino",
    he: "עברית / Hebrew",
    hr: "Hrvatski / Croatian",
    hy: "Հայերեն / Armenian",
    id: "Bahasa Indonesia / Indonesian",
    ka: "ქართული / Georgian",
    kk: "Қазақша / Kazakh",
    km: "ខ្មែរ / Khmer",
    ko: "한국어 / Korean",
    ky: "Кыргызча / Kyrgyz",
    lt: "Lietuvių / Lithuanian",
    mk: "Македонски / Macedonian",
    ms: "Bahasa Melayu / Malay",
    ne: "नेपाली / Nepali",
    no: "Norsk / Norwegian",
    "pt-BR": "Português (Brasil) / Portuguese (Brazil)",
    sl: "Slovenščina / Slovenian",
    tg: "Тоҷикӣ / Tajik",
    th: "ไทย / Thai",
    vi: "Tiếng Việt / Vietnamese",
    "zh-HK": "中文(香港) / Chinese (Hong Kong)",
    "zh-TW": "中文(台灣) / Chinese (Taiwan)",
    bs: 'Bosanski / Bosnian',
    si: 'සිංහල / Sinhala',
    sw: 'Kiswahili / Swahili',
    ta: 'தமிழ் / Tamil'
  },
  intention: {
    copy: "Copiar",
    downloadBuffer: "Descarregar binário",
    setBuffer: "Carregar binário",
    exportKeys: "Exportar chaves",
    exportAllKeys: (opts) => `Exportar todas as ${opts.count} chaves`,
    exportSearchResults: (opts) => `Exportar ${opts.count} resultados`,
    deleteAllKeysMenu: (opts) => `Eliminar tudo ${opts.count}`,
    importKeys: "Importar chaves",
    deleteSearchKeys: (opts) => `Eliminar ${opts.count} chaves correspondentes`,
    saveWithFormatJson: "Guardar com formatação",
    formatJson: "Formatar Json",
    wrap: "Quebrar linha",
    unwrap: "Não quebrar linha",
    downloadJson: "Descarregar JSON",
    pubsubMonitor: "PubSub",
    pulse: "Pulse",
    profiler: "Profiler",
    memoryAnalysis: "Analysis",
    // When you translate the language, keep the Language in English
    // eg. Idioma / Language
    language: "Idioma / Language",
    ok: "OK",
    addKey: "Adicionar a esta chave",
    addKeyRoot: "Adicionar uma chave raiz",
    reloadKey: "Recarregar chave",
    reload: "Recarregar",
    close: "Fechar",
    commands: "Comandos",
    view: "Vista",
    statistics: "Estatísticas",
    refresh: "Atualizar",
    pause: "Pausar",
    resume: "Retomar",
    clear: "Limpar",
    rename: "Renomear",
    main: "Base de dados",
    cancel: "Cancelar",
    theme: "Tema",
    github: "GitHub",
    githubRepo: "Repositório",
    githubRelease: "Versões",
    githubChangelog: "Registo de alterações",
    info: "Info",
    settings: "Definições",
    connect: "Ligar",
    disconnect: "Desligar",
    logout: "Sair",
    overview: "Visão geral",
    console: "Consola",
    noConnections: "Sem ligações, adicione uma ligação no menu de definições.",
    noConnectionsInSettings: "Sem ligações, pode adicionar uma NOVA LIGAÇÃO acima.",
    connectionAdd: "Nova ligação",
    addGroup: "Adicionar grupo",
    extend: "Expandir",
    collapse: "Recolher",
    add: "Adicionar",
    edit: "Editar",
    save: "Guardar",
    ttl: "Definir TTL",
    fieldTtl: "TTL do campo",
    digest: "Resumo",
    delete: "Eliminar",
    remove: "Remover",
    areYouSure: "Tem a certeza?",
    sure: "Sim",
    testConnection: "Testar ligação",
    getKey: "A carregar a chave Redis e dados associados ...",
    jsonViewShow: "Mostrar JSON",
    jsonViewEditor: "Editar JSON",
    quickConsole: "Consola Rápida",
    moveUp: "Mover para cima",
    moveDown: "Mover para baixo",
  },
  diff: {
    reviewChanges: "Rever altera\u00e7\u00f5es",
    inline: "Em linha",
    sideBySide: "Lado a lado",
    additions: "adi\u00e7\u00f5es",
    deletions: "remo\u00e7\u00f5es",
    unchangedLines: "linhas inalteradas",
    noChanges: "N\u00e3o foram detetadas altera\u00e7\u00f5es",
    before: "Antes",
    after: "Depois",
  },
  label: {
    id: {
      nodeId: 'ID do nó',
      id: "ID da ligação",
      info: "Se não pretende alterar as propriedades: sshPassword, sshPrivateKey, password, tlsCrt, tlsKey, tlsCa, introduza o ID da ligação nessas propriedades para manter os valores intactos. Se pretende a mesma lógica para a palavra-passe do nó, introduza o ID do nó na palavra-passe do nó."
    },
    secureFeature: 'Se vir um valor que começa com P3X e parece igual, é uma funcionalidade de segurança. Para alterar as definições, basta substituí-las por valores vazios ou por outra coisa e serão guardadas. Se não alterar as definições, estas mantêm-se como estão no servidor.',
    aiTranslating: "A traduzir...",
    aiSettings: "Definições de IA",
    aiGroqApiKey: "Chave API Groq",
    aiGroqApiKeyInfo: "Opcional. A sua própria chave API Groq para melhor desempenho. Obtenha uma chave gratuita em",
    aiGroqApiKeyPlaceholder: "gsk_...",
    aiGroqApiKeySaved: "Chave API IA guardada",
    aiGroqApiKeyInvalid: "Chave API Groq inválida",
    aiGroqApiKeyNotSet: "Não definido (predefinição do servidor)",
    aiEnabled: "IA ativada",
    aiEnabledYes: "Sim",
    aiEnabledNo: "Não",
    aiRouteViaNetwork: "Rota via network.corifeus.com",
    aiRoutingDirect: "As consultas vão diretamente para o Groq usando a sua própria chave API, sem passar pelo network.corifeus.com.",
    aiRoutingNetwork: "As consultas de IA são encaminhadas via network.corifeus.com. Se tiver a sua própria chave API Groq gratuita, pode desativar esta opção para encaminhar diretamente para o Groq sem network.corifeus.com.",
    aiMaxTokens: "Máximo de tokens de IA",
    aiMaxTokensInfo: "Número máximo de tokens para respostas de IA. Valores mais elevados permitem respostas mais longas, mas podem usar mais créditos de API.",
    consoleDrawer: {
      toggleTooltip: "Alternar consola",
      clearTooltip: "Limpar histórico da consola",
      closeTooltip: "Fechar consola",
      aiSettingsTooltip: "Definições de IA",
      modeRedis: "REDIS",
      modeAi: "AI",
      connectionChipNoDb: opts => `${opts.name}`,
      connectionChipWithDb: opts => `${opts.name} · db ${opts.db}`,
      pageChip: opts => `página: ${opts.page}`,
      connectingTo: opts => `A ligar a ${opts.name}…`,
      connectedTo: opts => `Ligado a ${opts.name} (Redis ${opts.version} ${opts.mode}, ${opts.modules} módulos carregados)`,
      connectedToNoInfo: opts => `Ligado a ${opts.name}`,
      disconnectedFrom: opts => `Desligado de ${opts.name}`,
      notConnected: "Sem ligação.",
      limitedAiOnly: "Apenas IA limitada — funcionam perguntas e respostas gerais sobre Redis.",
      connectHint: "Para diagnóstico em tempo real, escreva: connect <name>",
      cheatsheetHint: "Escreva ai: help para ver o que pode perguntar.",
      needsConnection: "Isto requer uma ligação ativa. Escreva primeiro \"connect <name>\".",
      aiNeedsConnectionReason: "A IA de estado em tempo real (uso de ferramentas) só está disponível quando estiver ligado ao Redis.",
      verbNeedsConnection: opts => `"${opts.verb}" requer uma ligação ativa — escreva primeiro "connect <name>".`,
      aiLimitedMode: "A IA está em modo limitado — até se ligar, só funcionam perguntas gerais sobre Redis.",
      welcomeDisconnected: "Bem-vindo. Ainda não está ligado a nenhuma instância Redis.",
      readyIndicator: "Pronto.",
    },
    cheatsheet: {
      title: "Guia rápido da IA — o que posso perguntar?",
      subtitle: "Clique em qualquer prompt para o colar na consola. Em seguida, prima Enter.",
      searchPlaceholder: "Filtrar prompts…",
      openOfficialDocs: "Comandos Redis ↗",
      openOfficialDocsTooltip: "Abrir a referência oficial dos comandos Redis em redis.io",
      closeTooltip: "Fechar (Esc)",
      empty: "Nenhum prompt corresponde ao seu filtro.",
      footerHint: "Dica: escreva \"ai:\" seguido de qualquer coisa em qualquer idioma — a IA compreende 54 idiomas e usa o estado atual do Redis quando necessário.",

      // Each group has: name (category label), match (search-filter alias), prompts (array of example strings)
      groups: {
        diagnostics: {
          name: "Diagnóstico em tempo real",
          description: "Peça à IA para investigar o estado do servidor em tempo real através de ferramentas seguras só de leitura.",
          prompts: [
            "porque é que a memória está alta?",
            "mostre-me as 10 consultas mais lentas",
            "que clientes estão ligados?",
            "qual é a política de maxmemory?",
            "houve evictions recentes?",
            "existe algum evento de latência?",
            "há quanto tempo o servidor está em execução?",
            "qual é a taxa de acertos?",
            "mostre a utilização do CPU",
            "resuma o keyspace",
            "quanta memória utiliza cada tipo de dados?",
            "há algo a bloquear o servidor neste momento?"
          ]
        },
        keys: {
          name: "Chaves",
          description: "Inspeccione, encontre e analise chaves sem ter de clicar pela árvore.",
          prompts: [
            "encontre todas as chaves que correspondem a user:*",
            "quantas chaves há em cada base de dados?",
            "mostre o maior hash nesta base de dados",
            "encontre chaves com TTL inferior a 60 segundos",
            "que chaves não têm TTL?",
            "qual é o tipo da chave session:abc?",
            "estime a memória utilizada pelo prefixo \"session:\"",
            "mostre a codificação de objecto da chave user:42",
            "há chaves prestes a expirar?",
            "que espaço de nomes utiliza mais memória?"
          ]
        },
        dataTypes: {
          name: "Tipos de dados",
          description: "Frases em linguagem natural para criar/ler/actualizar em qualquer tipo Redis.",
          prompts: [
            "crie um hash chamado user:1 com os campos name=Alice age=30",
            "adicione três itens à lista tasks",
            "adicione membros ao conjunto favourites",
            "adicione membros com pontuação ao sorted set leaderboard",
            "anexe um evento à stream events",
            "obtenha as últimas 10 entradas da stream events",
            "obtenha todos os campos do hash user:1",
            "obtenha os membros do conjunto favourites",
            "obtenha o top 10 por pontuação do leaderboard"
          ]
        },
        modules: {
          name: "Módulos",
          description: "Consultas para módulos Redis carregados (as categorias abaixo só aparecem quando o módulo está presente).",
          prompts: []
        },
        json: {
          name: "RedisJSON",
          description: "Disponível quando o módulo ReJSON está carregado.",
          prompts: [
            "crie um documento JSON em user:42 com { name: \"Alice\", age: 30 }",
            "leia o campo name de user:42",
            "actualize a idade de user:42 para 31",
            "liste todas as chaves JSON",
            "elimine um campo de um documento JSON",
            "obtenha um campo aninhado através de JSONPath"
          ]
        },
        search: {
          name: "RediSearch",
          description: "Disponível quando o módulo search está carregado.",
          prompts: [
            "liste todos os índices full-text",
            "execute uma pesquisa full-text por \"redis\" no índice idx:products",
            "crie um índice baseado em hash com os campos title (TEXT) e price (NUMERIC)",
            "obtenha informações sobre o índice idx:products",
            "remova o índice idx:products",
            "encontre documentos em que price está entre 10 e 50",
            "escreva uma pesquisa híbrida combinando texto e semelhança vectorial"
          ]
        },
        timeseries: {
          name: "RedisTimeSeries",
          description: "Disponível quando o módulo timeseries está carregado.",
          prompts: [
            "liste todas as chaves de timeseries",
            "adicione um ponto de dados a temp:room1",
            "obtenha o intervalo de temp:room1 de ontem até agora",
            "obtenha multi-range pela etiqueta sensor=temp",
            "gere 100 pontos de dados em onda sinusoidal para temp:room1",
            "mostre a retenção e as etiquetas de temp:room1"
          ]
        },
        bloom: {
          name: "RedisBloom (Bloom / Cuckoo / Top-K / CMS / T-Digest)",
          description: "Disponível quando o módulo bf está carregado.",
          prompts: [
            "verifique se o item foo existe no bloom filter spam:ips",
            "adicione itens ao bloom filter spam:ips",
            "crie um top-K chamado popular com K=10",
            "consulte o count-min sketch traffic para a chave /home",
            "adicione valores ao t-digest e obtenha o percentil 95",
            "mostre informações do bloom filter spam:ips"
          ]
        },
        vectorSet: {
          name: "VectorSet (Redis 8+)",
          description: "Disponível quando é detectado Redis 8+ (tipo VECTORSET nativo).",
          prompts: [
            "adicione um vector a embeddings",
            "encontre os 10 vectores mais semelhantes a um vector de consulta",
            "mostre as dimensões e a contagem do vectorset embeddings",
            "elimine um elemento do vectorset embeddings",
            "pesquise por nome de elemento com VSIM"
          ]
        },
        redis8: {
          name: "Funcionalidades do Redis 8+",
          description: "Apresentado quando é detectado Redis 8+.",
          prompts: [
            "defina o TTL de um campo de hash com HEXPIRE",
            "obtenha o digest de um valor de string",
            "execute uma pesquisa híbrida full-text + vector (FT.HYBRID)",
            "defina várias chaves com uma expiração partilhada através de MSETEX",
            "elimine uma entrada de stream com grupo de consumidores (XDELEX)",
            "mostre as estatísticas de slots do cluster para os 10 principais slots"
          ]
        },
        scripting: {
          name: "Scripts",
          description: "Gere scripts Lua / EVAL a partir de descrições em linguagem natural.",
          prompts: [
            "escreva um script atómico que incrementa o contador X apenas se Y > 5",
            "gere 100 chaves aleatórias com Lua",
            "converta este pipeline de shell num único EVAL: keys user:* | GET | grep inactive | DEL",
            "porte uma operação em lote para Lua para garantir segurança em cluster",
            "actualização do tipo check-and-set numa única chamada Lua",
            "itere sobre um hash e elimine campos que correspondam a um padrão"
          ]
        },
        cluster: {
          name: "Cluster",
          description: "Apresentado apenas no modo cluster.",
          prompts: [
            "mostre as informações do cluster",
            "liste os nós do cluster",
            "mostre os 10 principais slots por contagem de chaves",
            "mostre os 10 principais slots por memória",
            "que master é dono do slot 5000?"
          ]
        },
        acl: {
          name: "ACL (Redis 6+)",
          description: "Inspeccione utilizadores de controlo de acesso e a ligação actual.",
          prompts: [
            "com que utilizador estou ligado?",
            "liste todos os utilizadores ACL",
            "que permissões tenho?",
            "mostre as regras do utilizador default"
          ]
        },
        qna: {
          name: "Perguntas e respostas gerais",
          description: "Coloque perguntas de conhecimento sobre Redis — sem ferramentas, apenas respostas.",
          prompts: [
            "o que é ZADD?",
            "como funciona o failover de cluster?",
            "explique SCAN vs KEYS",
            "quando devo utilizar EVAL em vez de vários comandos?",
            "quais são as opções de persistência do Redis?",
            "qual é a diferença entre RDB e AOF?",
            "como é que o Redis Sentinel decide o novo master?",
            "explique hash tags no modo cluster"
          ]
        },
        translate: {
          name: "Linguagem natural → comando Redis",
          description: "Descreva o que pretende em português (ou em qualquer um dos 54 idiomas); a IA escreve o comando Redis.",
          prompts: [
            "elimine a chave user:42",
            "renomeie a chave foo para bar",
            "faça a chave session:abc expirar em 10 segundos",
            "copie a chave source para destination",
            "incremente o contador visits em 5",
            "defina a chave greeting para \"hello\" durante 1 hora",
            "mostre-me as 10 chaves mais acedidas",
            "elimine todas as chaves que correspondem a temp:*"
          ]
        }
      }
    },
    ssh: {
      on: 'SSH ativado',
      off: 'SSH desativado',
      sshHost: 'Anfitrião SSH',
      sshPort: 'Porta SSH',
      sshUsername: 'Nome de utilizador SSH',
      sshPassword: 'Palavra-passe SSH',
      sshPrivateKey: 'Chave privada SSH'
    },
    isBuffer: opts => `[object ArrayBuffer] significa que o valor é dados binários ou o valor é maior que ${opts.maxValueAsBuffer}`,
    streamValue: `O campo e valor do stream estão numa única linha. Ex.: campo1 valor1 "campo 2" "valor 2"`,
    streamTimestampId: `'*' significa gerado automaticamente ou a especificação como <millisecondsTime>-<sequenceNumber>`,
    unableToLoadKey: ({
      key
    }) => {
      return `Não foi possível carregar esta chave: ${key}. É possível que a chave tenha sido eliminada. O erro exato está na consola.`;
    },
    bigJson: "Este objeto JSON tem mais de 10 kb, por isso certifique-se de que sabe o que está a fazer, pois algumas funções podem renderizar lentamente.",
    addNode: "Adicionar nó",
    validateJson: "Validar JSON",
    reducedFunction: `Funcionalidade reduzida`,
    tooManyKeys: opts => {
      return `Para a funcionalidade completa, o máximo de chaves permitido é ${opts.maxLightKeysCount}. Esta base de dados tem mais chaves do que o permitido, num total de ${opts.count}. A ordenação de chaves e a informação adicional da árvore estão desativadas. A pesquisa ocorre apenas no servidor em vez do cliente.`;
    },
    redisCommandNotFound: "Nenhum comando Redis correspondente encontrado ...",
    treeKeyStore: `A ordenação (comparação natural) é executada no cliente, ou seja, no navegador, o que significa que tem uma penalização para conjuntos grandes, como mais de 10k chaves; pode adicionar algum tempo à renderização da página. Não existe ordenação de chaves no Redis, apenas desta forma.`,
    socketIoTimeout: options => {
      return `O Socket.IO excedeu o tempo limite para este pedido (máx. ${options.timeout / 1000} segundos) ...`;
    },
    resizerInfo: options => {
      return `A largura mínima do painel esquerdo ou direito é ${options.width}px`;
    },
    jsonViewNotParsable: "Este valor não é analisável como JSON  ",
    ttlTitle: "Definir o TTL em segundos",
    passwordSecure: "A palavra-passe pode estar vazia, mas ainda assim mostrará caracteres; é uma funcionalidade de segurança.",
    aclAuthHint: "Utilize o nome de utilizador e a palavra-passe do Redis ACL para autenticar. Deixe em branco para o utilizador padrão sem palavra-passe.",
    tlsWithoutCert: "Ativar TLS sem certificado adicional",
    tlsRejectUnauthorized: "Rejeitar certificado não autorizado",
    tlsSecure: "Se vir uma configuração TLS que começa com P3X ou se todas as definições TLS parecem iguais, é uma funcionalidade de segurança. Para alterar as definições, substitua-as por valores vazios ou por outra coisa e serão guardadas. Se não alterar as definições TLS, estas mantêm-se como estão no servidor.",
    treeSeparatorEmpty: "Se o separador da árvore estiver vazio, a árvore não terá nós aninhados, apenas uma lista simples",
    treeSeparatorEmptyNote: "Sem nós aninhados, apenas uma lista simples",
    welcomeConsole: "Bem-vindo à Consola Redis",
    welcomeConsoleInfo: "SHIFT + Histórico com cursor CIMA ou BAIXO está ativado",
    redisListIndexInfo: "Vazio para acrescentar, -1 para inserir no início ou guardar na posição apresentada.",
    console: "Consola",
    connectiondAdd: "Adicionar ligação",
    connectiondEdit: "Editar ligação",
    connectiondView: "Ver ligação",
    connections: "Ligações",
    keysSort: {
      on: "Ordenação de chaves ativada",
      off: "Ordenação de chaves desativada"
    },
    cluster: {
      on: "Cluster ativado",
      off: "Cluster desativado"
    },
    sentinel: {
      on: "Sentinel ativado",
      off: "Sentinel desativado",
      name: "Nome do Sentinel"
    },
    readonly: {
      on: "Só de leitura ativado",
      off: "Só de leitura desativado"
    },
    theme: {
      light: "Claro",
      dark: "Escuro enterprise",
      darkNeu: "Escuro",
      darkoBluo: "Darko bluo",
      enterprise: "Enterprise",
      redis: "Redis",
      matrix: "Matrix"
    },
    connected: opts => {
      return `Ligado: ${opts.name}`;
    },
    tree: "Árvore",
    askAuth: "Pedir autorização",
    keyboardShortcuts: "Atalhos de teclado",
    about: "Sobre",
    supportedLanguages: "Idiomas suportados",
    version: "Versão",
    redisVersion: "Versão do Redis",
    modules: "Módulos",
    shortcutRefresh: "Atualizar",
    shortcutSearch: "Focar pesquisa",
    shortcutNewKey: "Nova chave",
    shortcutDisconnect: "Desligar",
    themeAuto: "Automático (sistema)",
    languageAuto: "Auto (system)",
    shortcutCommandPalette: "Paleta de comandos",
    commandPalette: "Paleta de comandos",
    noResults: "Sem resultados",
    redisCommandsReference: "Comandos Redis",
    ungrouped: "Sem grupo",
    grouped: "Agrupados",
    connectFirst: "Ligue-se primeiro a um servidor Redis",
    searchLanguage: "Pesquisar idioma...",
    exportProgress: "A exportar chaves...",
    importProgress: "A importar chaves...",
    importPreview: "Pré-visualização",
    importOverwrite: "Substituir",
    importSkip: "Ignorar",
    importConflict: "Se a chave já existir:",
    noKeysToExport: "Sem chaves para exportar",
    type: "Tipo",
    time: "Tempo",
    format: "Formato",
    loading: "A carregar...",
    autoRefresh: "Auto",
    exportSearchHint: "Exportando apenas chaves que correspondem à pesquisa atual",
    importSearchHint: "A importação aplica-se a toda a base de dados, não apenas aos resultados da pesquisa",
    deleteSearchHint: "Eliminar todas as chaves correspondentes à pesquisa atual",
    deletingSearchKeys: "A eliminar chaves correspondentes...",
    importNoKeys: "Nenhuma chave encontrada no ficheiro",
    desktopNotifications: "Notificações do ambiente de trabalho",
    desktopNotificationsEnabled: "Ativar notificações do ambiente de trabalho",
    desktopNotificationsInfo: "Receba notificações do SO para desconexões e reconexões do Redis quando a aplicação não estiver em foco."
  },
  status: {
    dataCopied: "Os dados estão na área de transferência",
    exportDone: "Exportação concluída",
    deletedSearchKeys: (opts) => `${opts.count} chaves eliminadas`,
    indexCreated: "Índice criado",
    indexDropped: "Índice eliminado",
    importDone: (opts) => `Importação concluída: ${opts.created} criados, ${opts.skipped} ignorados, ${opts.errors} erros`,
    nodeRemoved: "Nó removido",
    keyIsNotExisting: "Esta chave pode ter sido eliminada ou expirada.",
    keyCount: opts => {
      if (opts.keyCount === 0) {
        return "Sem chaves";
      } else if (opts.keyCount === 1) {
        return "1 chave";
      } else {
        return `${opts.keyCount} chaves`;
      }
    },
    treeExpandAll: "Expandir todas as folhas da árvore. Esta operação pode ser dispendiosa e demorar algum tempo ...",
    noRedisKeys: "Não existem chaves nesta base de dados.",
    redisConnected: "Ligação ao Redis estabelecida com sucesso",
    reverted: "Revertido",
    reloadingDataInfo: "A recarregar informações de dados Redis",
    added: "Adicionado",
    saved: "Atualizado",
    cancelled: "Cancelado",
    deleted: "Eliminado",
    savedRedis: "Os dados Redis foram guardados",
    redisDisconnected: opts => {
      return `A ligação atual teve um erro: ${opts.error.message}`;
    },
    dbChanged: opts => {
      return `O índice da base de dados foi definido para ${opts.db}. `;
    },
    treeDeleted: opts => {
      return `A chave da árvore foi eliminada (${opts.key}).`;
    },
    deletedKey: opts => {
      return `A chave foi eliminada (${opts.key}).`;
    },
    renamedKey: "Esta chave foi renomeada",
    ttlChanged: "O TTL desta chave foi alterado",
    notInteger: "Esta entrada não é um número inteiro",
    persisted: "Esta chave é persistida para sempre",
    set: "A chave foi definida/adicionada",
    connectionRestored: "Ligação restaurada",
    socketDisconnected: "Desligado",
    socketError: "Erro de ligação",
    deletedHashKey: "Chave hash eliminada",
    deletedSetMember: "Membro do conjunto eliminado",
    deletedListElement: "Elemento da lista eliminado",
    deletedZSetMember: "Membro do conjunto ordenado eliminado",
    deletedStreamTimestamp: "Entrada do stream eliminada",
  },
  code: {
    "delete-connection": "Esta ligação foi eliminada, por isso foi desligado desta instância Redis.",
    "save-connection": "Esta ligação foi alterada, por isso foi desligado desta instância Redis. Pode voltar a ligar-se.",
    "readonly-connections": "Adicionar/guardar/eliminar ligações é só de leitura!",
    "readonly-connection-mode": "Esta ligação é só de leitura!",
    "list-out-of-bounds": "O índice desta lista está fora dos limites",
    "invalid-json-value": "The value is not valid JSON.",
    "http_auth_required": "Autorização necessária: autentique-se com HTTP Basic Auth e recarregue.",
    "auto-connection-failed": "É possível que a ligação tenha sido removida e a ligação automática tenha falhado por esse motivo.",
    invalid_console_command: "Este comando não funciona através da GUI.",
    "AI_DISABLED": "IA está desativada. Ative nas definições de IA.",
    "AI_PROMPT_REQUIRED": "Consulta de IA é obrigatória.",
    "GROQ_API_KEY_READONLY": "A chave Groq API é apenas de leitura e não pode ser modificada.",
    "blocked_api_access": "O seu plano Groq API não permite acesso a este modelo. Atualize o seu plano Groq ou utilize o proxy network.corifeus.com.",
    "rate_limit": "Limite de taxa de IA atingido. Tente novamente mais tarde ou utilize a sua própria chave Groq API nas definições."
  },
  form: {
    error: {
      required: "Obrigatório",
      port: "A porta deve estar entre 1-65535",
      invalid: "O formulário é inválido"
    },
    connection: {
      label: {
        name: "Nome",
        group: "Grupo",
        host: "Nome do anfitrião",
        port: "Porta",
        password: "Palavra-passe",
        username: "Nome de utilizador"
      }
    },
    treeSettings: {
      maxValueDisplay: "Comprimento máximo de exibição do valor",
      maxValueDisplayInfo: "Se definido como 0, mostra valores completos. Se maior que 0, trunca para este comprimento. Se -1: para strings, oculta o valor até editar; para outros tipos, mostra o conteúdo completo.",
      maxKeys: "Número máximo de chaves",
      maxKeysInfo: "Para que a GUI não falhe, limitamos o número máximo de chaves.",
      keyCount: (opts) => {
        return `Número de chaves: ${opts?.keyCount ?? 0}`;
      },
      label: {
        animation: "Usar animação",
        noAnimation: "Sem animação",
        undoEnabled: "Desfazer ativado",
        undoDisabled: "Desfazer desativado",
        diffEnabled: "Mostrar diff antes de guardar",
        diffDisabled: "Diff antes de guardar desativado",
        jsonFormatTwoSpace: "Formatar JSON com 2 espaços",
        jsonFormatFourSpace: "Formatar JSON com 4 espaços",
        formName: "Definições Redis",
        searchModeClient: "Modo de pesquisa no cliente",
        searchModeServer: "Modo de pesquisa no servidor",
        searchModeStartsWith: "Pesquisa com modo começa com",
        searchModeIncludes: "Pesquisa com modo inclui"
      },
      undoHint: "Desfazer est\u00e1 dispon\u00edvel apenas para tipos de chave string e JSON",
      field: {
        treeSeparator: "Separador da árvore",
        treeSeparatorSelector: "Seletor do separador da árvore",
        page: "Contagem de páginas da árvore",
        keyPageCount: "Contagem de páginas de chaves",
        keysSort: "Ordenar as chaves",
        searchMode: "Modo de pesquisa",
        searchModeStartsWith: "Pesquisa começa com / inclui"
      },
      error: {
        keyPageCount: "A contagem de páginas de chaves deve ser um inteiro entre 5 - 100",
        page: "A contagem de páginas deve ser um inteiro entre 10 - 5000",
        maxValueDisplay: "O valor máximo de exibição deve ser um inteiro entre -1 e 32768",
        maxKeys: "O número máximo de chaves deve ser um inteiro entre 100 e 100000"
      }
    },
    key: {
      label: {
        formName: {
          add: "Adicionar nova chave Redis",
          edit: "Editar chave Redis",
          append: "Adicionar a chave Redis existente"
        }
      },
      field: {
        streamTimestamp: "Carimbo temporal",
        key: "Chave",
        type: "Tipo",
        index: "Índice",
        hashKey: "Chave hash",
        score: "Pontuação",
        value: "Valor",
        errorRate: "Taxa de erro",
        capacity: "Capacidade",
        topk: "Top K",
        width: "Largura",
        depth: "Profundidade",
        decay: "Decaimento",
        compression: "Compressão",
        increment: "Incremento",
        item: "Item",
        vectorValues: "Valores do vetor (separados por vírgula)",
        element: "Nome do elemento",
      },
      error: {
        streamTimestamp: "O carimbo temporal é obrigatório, em formato Redis ou como *",
        key: "A chave deve ter pelo menos um carácter",
        hashKey: "A chave da tabela hash deve ter pelo menos um carácter",
        score: "A pontuação do conjunto ordenado é obrigatória",
        value: "O valor é obrigatório",
        errorRate: "A taxa de erro deve estar entre 0 e 1 (ex. 0,01)",
        capacity: "A capacidade deve ser um inteiro positivo",
        topk: "Top K deve ser um inteiro positivo",
        width: "A largura deve ser um inteiro positivo",
        depth: "A profundidade deve ser um inteiro positivo",
        item: "O item é obrigatório"
      }
    },
    main: {
      label: {
        database: "DB"
      }
    }
  },
  page: {
    search: {
      title: "Pesquisar",
      index: "Índice",
      query: "Consulta",
      results: "Resultados",
      noIndex: "Nenhum índice encontrado",
      createIndex: "Criar índice",
      dropIndex: "Eliminar índice",
      indexInfo: "Info do índice",
      indexName: "Nome do índice",
      prefix: "Prefixo de chave (opcional)",
      fieldName: "Nome do campo",
      hybridMode: "Pesquisa híbrida (FT.HYBRID)",
      vectorField: "Campo vetorial",
      vectorValues: "Valores vetoriais",
    },
    monitor: {
      title: "Monitorização",
      memory: "Memória",
      opsPerSec: "Ops/seg",
      clients: "Clientes",
      blocked: "Bloqueados",
      hitsMisses: "Taxa de acerto",
      networkIo: "Rede I/O",
      slowLog: "Log lento",
      noSlowQueries: "Nenhuma consulta lenta registada.",
      confirmSlowLogReset: "Tem a certeza de que pretende repor o registo lento?",
      slowLogResetDone: "O registo lento foi reposto.",
      totalCommands: "Total",
      expired: "Expirados",
      evicted: "Despejados",
      clientList: "Lista de clientes",
      topKeys: "Maiores chaves por memória",
      killClient: "Encerrar cliente",
      clientKilled: "Cliente encerrado",
      confirmKillClient: "Tem a certeza de que deseja encerrar este cliente?",
      noKeys: "Sem chaves",
      rss: "RSS",
      peak: "Pico",
      fragmentation: "Fragmentação",
      hitsAndMisses: "Acertos / Erros",
      noClients: "Sem clientes",
      slotStats: "Estatísticas de slots do cluster",
      serverInfo: "Informações do servidor",
      os: "Sistema operativo",
      port: "Porta de rede",
      pid: "ID do processo",
      configFile: "Ficheiro de configuração",
      uptime: "Tempo de atividade",
      keyspace: "Espaço de chaves Redis",
      keys: "Chaves Redis",
      expires: "Expira",
      noKeyspace: "Sem chaves",
      persistence: "Persistência de dados",
      rdbLastSave: "Último salvamento do RDB",
      rdbStatus: "Estado do RDB",
      rdbChanges: "Alterações desde o último guardar",
      aofEnabled: "AOF ativado",
      aofSize: "Tamanho AOF",
      replication: "Replicação Redis",
      role: "Função de replicação",
      replicas: "Réplicas conectadas",
      masterHost: "Anfitrião Primário",
      linkStatus: "Estado do link de replicação",
      cpu: "Utilização da CPU",
      cpuSys: "Sistema",
      cpuUser: "Usuário",
      modules: "Módulos Redis carregados",
      noModules: "Nenhum módulo Redis carregado",
      clusterSlotMap: "Mapa de slots do cluster Redis",
      slotRange: "Intervalo de slots de cluster",
      totalSlots: "Total de slots de cluster",
      noClusterData: "Sem dados de cluster Redis disponíveis.",
    },
    analysis: {
      title: "Análise de Memória",
      runAnalysis: "Executar Análise",
      running: "A analisar...",
      typeDistribution: "Distribuição de Tipos",
      prefixMemory: "Memória por Prefixo",
      topKeysByMemory: "Maiores Chaves por Memória",
      expirationOverview: "Expiração de Chaves",
      memoryBreakdown: "Discriminação de Memória",
      keysScanned: "Chaves Analisadas",
      totalMemory: "Memória Total",
      rssMemory: "Memória RSS",
      peakMemory: "Memória de Pico",
      luaMemory: "Memória Lua",
      overheadMemory: "Sobrecarga",
      datasetMemory: "Conjunto de Dados",
      fragmentation: "Fragmentação",
      allocator: "Alocador",
      withTTL: "Com TTL",
      persistent: "Persistentes",
      avgTTL: "TTL Médio",
      prefix: "Prefixo",
      keyCount: "Contagem de Chaves",
      memoryUsage: "Utilização de Memória",
      noPrefix: "(sem prefixo)",
      topN: "Top N",
      maxScanKeys: "Máx. Chaves Analisadas",
      type: "Tipo",
      noData: "Sem dados. Clique em Executar Análise para começar.",
      exportAll: "Exportar Tudo",
      memoryDoctor: "Memory Doctor",
      doctorNoData: "Clique em Atualizar para executar o diagnóstico Memory Doctor.",
    },
    acl: {
      title: "Utilizadores ACL",
      loadUsers: "Carregar utilizadores",
      loading: "A carregar...",
      username: "Nome de utilizador",
      status: "Estado",
      enabled: "Habilitado",
      disabled: "Desativado",
      commands: "Comandos",
      commandsHint: "por exemplo, +@all or +@read -@dangerous",
      keys: "Padrões de chaves Redis",
      keysHint: "por exemplo, ~* or ~user:*",
      channels: "Canais Pub/Sub",
      channelsHint: "por exemplo, &* or &notifications:*",
      password: "Palavra-passe",
      noPassword: "Sem password (nopass)",
      passwordHint: "Deixe em branco para manter a palavra-passe atual",
      currentUser: "Atual",
      createUser: "Criar utilizador",
      editUser: "Editar utilizador",
      deleteUser: "Eliminar",
      confirmDelete: "Tem a certeza de que pretende eliminar o utilizador ACL?",
      userDeleted: "O utilizador ACL foi eliminado.",
      userSaved: "O utilizador ACL foi guardado.",
      cannotDeleteDefault: "Não é possível eliminar o utilizador padrão.",
      cannotDeleteSelf: "Não é possível eliminar o utilizador atualmente ligado.",
      noUsers: "O ACL requer o Redis 6.0+.",
      groupCommon: "Geral",
      groupDataTypes: "Tipos de dados",
      groupOperations: "Operações",
      rules: "Regras",
      rulesHint: "Tokens separados por espaço (por exemplo on >password +@all ~* &*)",
      defaultUserWarning: "Atenção: Modificar o utilizador padrão pode bloquear todas as ligações. Se isto acontecer, terá de reiniciar o Redis ou utilizar o redis-cli para restaurar o acesso.",
    },
    overview: {
      noConnected: "Não existe ligação ao Redis.",
      overviewClients: "Listar os ligados pelo número de clientes",
      connectedCount: opt => {
        if (opt.length === 1) {
          return "1 cliente";
        }
        return `${opt.length} clientes`;
      }
    },
    key: {
      label: {
        key: "Chave",
        encoding: "Codificação",
        compression: "Compressão",
        aiRateLimited: "Limite de pedidos de IA atingido. Tente novamente mais tarde ou utilize a sua própria chave de API do Groq nas Definições.",
        aiError: "A consulta de IA falhou",
        length: "Tamanho",
        ttl: "TTL",
        ttlTitle: "Time To Live",
        type: "Tipo",
        ttlNotExpire: "não expira",
        lengthString: "bytes",
        lengthItem: "itens",
        actions: "Ações"
      },
      list: {
        table: {
          index: "Índice",
          value: "Valor"
        }
      },
      hash: {
        table: {
          hashkey: "Chave hash",
          value: "Valor"
        }
      },
      set: {
        table: {
          value: "Membro"
        }
      },
      zset: {
        table: {
          value: "Membro",
          score: "Pontuação"
        }
      },
      stream: {
        table: {
          timestamp: "ID do carimbo temporal",
          field: "Campo",
          value: "Valor"
        }
      },
      timeseries: {
        chart: "Gráfico",
        info: "Informação",
        addPoint: "Adicionar ponto",
        from: "De (ms ou -)",
        to: "Até (ms ou +)",
        aggregation: "Agregação",
        timeBucket: "Bucket (ms)",
        none: "Nenhum",
        dataPoints: "pontos de dados",
        labels: "Etiquetas",
        rules: "Regras",
        retention: "Retenção",
        timestamp: "Carimbo temporal",
        value: "Valor",
        retentionHint: "0 = sem expiração, ou milissegundos",
        duplicatePolicy: "Política de duplicados",
        labelsHint: "chave1 valor1 chave2 valor2",
        timestampHint: "'*' significa gerado automaticamente, ou carimbo temporal em milissegundos",
        editAllHint: "Um ponto de dados por linha: carimbo_temporal valor (o carimbo temporal pode ser * para automático)",
        autoSpread: "Intervalo de dispersão automático *",
        formula: "Fórmula",
        formulaLinear: "Linear",
        formulaRandom: "Aleatório",
        formulaSawtooth: "Dente de serra",
        formulaPoints: "Pontos",
        formulaAmplitude: "Amplitude",
        formulaOffset: "Desvio",
        generate: "Gerar",
        exportChart: "Exportar PNG",
        overlay: "Sobrepor chaves",
        overlayHint: "Chaves separadas por vírgulas",
        mrangeFilter: "Filtro de etiquetas",
        bulkMode: "Geração em massa",
        mrangeHint: "ex. sensor=temp"
      },
      probabilistic: {
        info: "Informação",
        addItem: "Adicionar Item",
        checkItem: "Verificar Item",
        item: "Item",
        exists: "Existe",
        doesNotExist: "Não existe",
        topkList: "Itens Principais",
        topkCount: "Contagem",
        queryCount: "Contagem de Consultas",
        queryResult: "Resultado da Consulta",
        addedSuccessfully: "Item adicionado com sucesso",
        deletedSuccessfully: "Item eliminado com sucesso",
        quantile: "Quantil",
        quantileResult: "Resultado",
        noItems: "Sem itens para apresentar",
        resetConfirm: "Repor todos os dados neste T-Digest?"
      },
      vectorset: {
        info: "Informações",
        elements: "Elementos",
        similarity: "Pesquisa por Similaridade",
        searchByElement: "Pesquisar por elemento",
        searchByVector: "Pesquisar por vetor",
        vectorValues: "Valores do vetor",
        element: "Elemento",
        score: "Pontuação",
        count: "Contagem",
        addElement: "Adicionar Elemento",
        attributes: "Atributos",
        noAttributes: "Sem atributos",
        dimensions: "Dimensões",
        removeConfirm: "Remover este elemento do VectorSet?",
        noElements: "Sem elementos",
        filter: "Filtro",
        searchComplete: "Pesquisa concluída",
      }
    },
    treeControls: {
      settings: "Definições da árvore",
      expandAll: "Expandir tudo",
      collapseAll: "Recolher tudo",
      level: "Nível",
      search: {
        search: "Pesquisar nas chaves",
        clear: "Limpar pesquisa atual",
        placeholderClient: "Pesquisar no lado do cliente",
        placeholderServer: "Pesquisar no lado do servidor",
        info: (opts) => "A pesquisa no lado do cliente significa que corresponde ao texto no campo de pesquisa. A pesquisa no lado do servidor significa que pesquisa nos padrões de chaves como *{texto-de-pesquisa}*. Para conjuntos de pesquisa grandes, é melhor usar a pesquisa no lado do servidor. Para conjuntos de pesquisa mais pequenos, é melhor usar a pesquisa no lado do cliente." + ` Se a contagem de chaves for superior a ${opts?.maxLightKeysCount ?? 110000}, só pode pesquisar no lado do servidor.`,
        largeSetInfo: "Num conjunto grande, a pesquisa no lado do cliente está desativada, portanto atualmente só é possível pesquisar no lado do servidor.",
        infoDetails: "Para saber como a pesquisa funciona, verifique as definições"
      },
      pager: {
        next: "Seguinte",
        prev: "Anterior",
        first: "Primeiro",
        last: "Último"
      }
    }
  },
  time: {
    years: "anos",
    months: "meses",
    days: "dias",
    year: "ano",
    month: "mês",
    day: "dia",
    second: "segundo",
    seconds: "segundos",
    minute: "minuto",
    minutes: "minutos",
    hour: "hora",
    hours: "horas"
  },
  redisTypes: {
    string: "String",
    list: "List",
    hash: "Hash table",
    set: "Set",
    zset: "Sorted set - zset",
    stream: "Stream",
    json: "JSON",
    timeseries: "Time Series",
    bloom: "Bloom filtro",
    cuckoo: "Cuckoo filtro",
    topk: "Top-K",
    cms: "Count-Min Sketch",
    tdigest: "T-Digest",
    vectorset: "VectorSet",
  },
  promo: {
    title: "Assistente de Rede com IA",
    description: "Descubra o nosso Assistente de Rede com IA gratuito em network.corifeus.com — analise domínios, IPs, registos DNS, certificados SSL, segurança de email e infraestrutura de rede. Potenciado por IA para resultados instantâneos e completos.",
    disclaimer: "Esta promoção é apresentada apenas no site de demonstração e não aparecerá em implementações do Docker, Electron ou da aplicação web.",
    toastMessage: "Experimente o nosso Assistente de Rede com IA gratuito em network.corifeus.com — analise domínios, DNS, SSL e muito mais!",
    visit: "Visitar network.corifeus.com",
  }
};
module.exports = strings;