Files
descrybe/apps/web/src/lib/i18n/messages/pt.ts
T

5651 lines
412 KiB
TypeScript
Raw Normal View History

2026-08-16 18:49:02 +02:00
import type { MessageDict } from "./types";
2026-08-16 18:18:39 +02:00
/** Portuguese (pt) UI pack — keys must stay in sync with en.ts. */
export const pt: MessageDict = {
"app.name": "Descrybe",
2026-08-16 18:18:39 +02:00
"app.home": "Início Descrybe",
"common.cancel": "Cancelar",
2026-08-16 18:18:39 +02:00
"common.save": "Guardar alterações",
"common.saveShort": "Guardar",
"common.continue": "Continuar",
"common.open": "Abrir",
2026-08-16 18:18:39 +02:00
"common.markDone": "Marcar como concluído",
"common.viewAll": "Ver tudo",
"common.close": "Fechar",
2026-08-16 18:18:39 +02:00
"common.askAdmin": "Peça a um administrador da empresa",
"common.you": "Você",
"common.active": "Ativo",
"common.pending": "Pendente",
"common.email": "E-mail",
"common.password": "Palavra-passe",
"common.name": "O seu nome",
2026-08-16 18:18:39 +02:00
"common.viewPricing": "Ver preços",
"common.backToSignIn": "Voltar ao início de sessão",
"common.signingOut": "A terminar sessão…",
"common.signOutAndContinue": "Terminar sessão e continuar",
"common.staySignedIn": "Manter sessão iniciada",
"a11y.skipToContent": "Saltar para o conteúdo",
"theme.switchToDark": "Mudar para tema escuro",
"theme.switchToLight": "Mudar para tema claro",
2026-08-16 18:18:39 +02:00
"header.signOut": "Terminar sessão",
"header.signingOut": "A terminar sessão…",
"status.emDash": "—",
"status.pending": "Pendente",
"status.processing": "A processar",
2026-08-16 18:18:39 +02:00
"status.completed": "Concluído",
"status.failed": "Falhou",
"status.cancelled": "Cancelado",
2026-08-16 18:18:39 +02:00
"nav.section.overview": "Visão geral",
"nav.section.catalog": "Catálogo",
"nav.section.feeds": "Feeds",
"nav.section.stores": "Lojas",
"nav.section.processing": "A processar",
"nav.section.marketing": "Marketing",
2026-08-16 18:18:39 +02:00
"nav.section.integrations": "Integrações",
"nav.section.account": "Conta",
"nav.section.platform": "Plataforma",
"nav.dashboard": "Painel",
"nav.products": "Produtos",
"nav.categories": "Categorias",
"nav.attributes": "Atributos",
"nav.fields": "Campos",
"nav.feeds": "Feeds",
2026-08-16 18:18:39 +02:00
"nav.exports": "Exportações",
"nav.stores": "Lojas",
"nav.jobs": "Tarefas",
"nav.campaigns": "Campanhas",
2026-08-16 18:18:39 +02:00
"nav.calendar": "Calendário",
"nav.seo": "SEO",
"nav.brand": "Marca",
2026-08-16 18:18:39 +02:00
"nav.reviews": "Avaliações",
"nav.ai": "IA",
"nav.email": "E-mail",
2026-08-16 18:18:39 +02:00
"nav.billing": "Faturação",
"nav.settings": "Definições",
"nav.support": "Suporte",
"nav.admin": "Admin",
2026-08-16 18:18:39 +02:00
"nav.main": "Navegação principal",
"nav.sidebar": "Barra lateral da app",
2026-08-16 18:18:39 +02:00
"nav.close": "Fechar navegação",
"nav.closeMenu": "Fechar menu",
2026-08-16 18:18:39 +02:00
"nav.open": "Abrir navegação",
"nav.commandPalette": "Pesquisar páginas",
"nav.commandPaletteLabel": "Pesquisar",
2026-08-16 18:18:39 +02:00
"auth.login.title": "Iniciar sessão",
"auth.login.description": "Utilize o seu e-mail e palavra-passe Descrybe.",
2026-08-16 18:18:39 +02:00
"auth.login.submit": "Iniciar sessão",
"auth.login.submitting": "A iniciar sessão…",
"auth.login.failed": "Falha no início de sessão",
"auth.login.passwordNotSet": "Esta conta ainda precisa de uma palavra-passe. Abra o link do convite ou peça a um administrador para emitir um novo.",
"auth.login.setPasswordFirstTitle": "Defina primeiro a palavra-passe:",
2026-08-16 18:18:39 +02:00
"auth.login.setPasswordFirstBody": "utilize o link do convite do seu e-mail. Se o link foi para um endereço antigo (desvio de e-mail), peça a um administrador da empresa para emitir um novo convite de definição de palavra-passe para {email}.",
"auth.login.yourEmail": "o seu e-mail",
"auth.login.platformAdminsReissue": "Os administradores da plataforma podem reemitir a partir de",
2026-08-16 18:18:39 +02:00
"auth.login.adminUsersLink": "Admin → Utilizadores",
"auth.login.haveToken": "Tem um token? Abrir aceitar convite",
"auth.login.noAccount": "Sem conta?",
"auth.login.createCompany": "Criar empresa",
"auth.login.haveInvite": "Tem um convite ou um link para definir a palavra-passe?",
"auth.login.acceptInvite": "Aceitar convite",
"auth.login.forgotPassword": "Esqueceu a palavra-passe?",
2026-08-16 18:18:39 +02:00
"auth.login.forgotPasswordHelp": "Introduza o seu e-mail na página de redefinição. Se nunca definiu uma palavra-passe, use o link de convite / definir palavra-passe.",
"auth.forgot.title": "Esqueceu a palavra-passe",
2026-08-16 18:18:39 +02:00
"auth.forgot.description": "Introduza o e-mail da conta. Se corresponder a uma conta ativa, enviaremos um link de redefinição.",
"auth.forgot.submit": "Enviar link de redefinição",
"auth.forgot.submitting": "A enviar…",
"auth.forgot.failed": "Não foi possível pedir a redefinição",
"auth.forgot.sentTitle": "Verifique o seu e-mail",
2026-08-16 18:18:39 +02:00
"auth.forgot.sentBody": "Se existir uma conta para esse endereço, o link de redefinição está a caminho. O link expira em uma hora.",
"auth.forgot.backToSignIn": "Voltar ao início de sessão",
"auth.reset.title": "Redefinir palavra-passe",
"auth.reset.description": "Escolha uma nova palavra-passe para a sua conta Descrybe (pelo menos 8 caracteres).",
"auth.reset.submit": "Guardar nova palavra-passe",
2026-08-16 18:18:39 +02:00
"auth.reset.submitting": "A guardar…",
"auth.reset.failed": "Não foi possível redefinir a palavra-passe",
"auth.reset.doneTitle": "Palavra-passe atualizada",
2026-08-16 18:18:39 +02:00
"auth.reset.doneDescription": "Inicie sessão com o seu e-mail e a nova palavra-passe.",
"auth.reset.goToSignIn": "Ir para iniciar sessão",
"auth.reset.passwordConfirm": "Confirmar palavra-passe",
2026-08-16 18:18:39 +02:00
"auth.reset.passwordMismatch": "As palavras-passe não coincidem",
"auth.reset.missingTitle": "Link de redefinição em falta",
"auth.reset.missingDescription": "Abra o link do seu e-mail para escolher uma nova palavra-passe.",
2026-08-16 18:18:39 +02:00
"auth.reset.requestNewLink": "Pedir um novo link de redefinição",
"auth.reset.tokenMissing": "Não foi fornecido um link de redefinição. Use o link do e-mail ou peça um novo.",
"auth.reset.tokenInvalid": "Este link de redefinição é inválido ou expirou. Peça um novo na página de esqueci a palavra-passe.",
"auth.reset.linkRecognized": "Link de redefinição reconhecido. Introduza uma nova palavra-passe abaixo — o segredo não é mostrado nesta página.",
"auth.reset.tokenLabel": "Token de redefinição",
"auth.reset.passwordHint": "Pelo menos 8 caracteres. Sem outras regras de complexidade.",
"auth.register.title": "Criar empresa",
"auth.register.description": "Regista uma empresa e o respetivo utilizador administrador.",
"auth.register.companyName": "Nome da empresa",
"auth.register.submit": "Criar conta",
2026-08-16 18:18:39 +02:00
"auth.register.submitting": "A criar…",
"auth.register.failed": "Falha no registo",
2026-08-16 18:18:39 +02:00
"auth.register.haveAccount": "Já tem uma conta?",
"auth.register.signIn": "Iniciar sessão",
"auth.invite.title": "Aceitar convite",
"auth.invite.setPasswordTitle": "Definir palavra-passe",
2026-08-16 18:18:39 +02:00
"auth.invite.description": "Defina a sua palavra-passe para aderir à empresa. O seu administrador atribuiu Membro (trabalho diário) ou Admin (equipa e faturação).",
"auth.invite.setPasswordDescription": "Escolha uma palavra-passe para a sua conta Descrybe migrada (pelo menos 8 caracteres).",
2026-08-16 18:18:39 +02:00
"auth.invite.checking": "A verificar convite…",
"auth.invite.forEmail": "Convite para {email}.",
2026-08-16 18:18:39 +02:00
"auth.invite.linkRecognized": "Link de convite reconhecido. Introduza uma palavra-passe abaixo para continuar — o segredo não é mostrado nesta página.",
"auth.invite.resetLinkRecognized": "Link de redefinição reconhecido. Introduza uma palavra-passe abaixo para continuar — o segredo não é mostrado nesta página.",
"auth.invite.tokenLabel": "Token de convite",
2026-08-16 18:18:39 +02:00
"auth.invite.resetTokenLabel": "Token de redefinição",
"auth.invite.tokenHelp": "Cole o token do e-mail de convite. É mascarado neste campo.",
"auth.invite.passwordHint": "Pelo menos 8 caracteres. Sem outras regras de complexidade.",
"auth.invite.submit": "Aceitar convite",
"auth.invite.setPasswordSubmit": "Definir palavra-passe",
2026-08-16 18:18:39 +02:00
"auth.invite.accepting": "A aceitar…",
"auth.invite.saving": "A guardar…",
"auth.invite.verifyFailed": "Não foi possível verificar o convite",
"auth.invite.verifySetPasswordFailed": "Não foi possível verificar o link de definição de palavra-passe",
"auth.invite.acceptFailed": "Não foi possível aceitar o convite",
"auth.invite.setPasswordFailed": "Não foi possível definir a palavra-passe",
"auth.invite.expired": "Este convite é inválido ou expirou. Peça ao administrador da empresa para enviar um novo convite e abra o novo link (ou cole o novo token abaixo).",
"auth.invite.setPasswordExpired": "Este link de definição de palavra-passe é inválido ou expirou. Peça a um administrador da empresa ou da plataforma para o reemitir e abra o novo link (ou cole o novo token abaixo).",
"auth.invite.emailMismatchDefault": "Tem sessão iniciada com um e-mail diferente deste convite.",
"auth.invite.expiredFooter": "Link expirado? Peça a um administrador para o reemitir — não há API de reenvio self-service. Administradores da plataforma:",
"auth.invite.adminUsersLink": "Admin → Utilizadores",
"auth.invite.doneTitle": "Já faz parte da equipa",
"auth.invite.doneSetPasswordTitle": "Palavra-passe guardada",
2026-08-16 18:18:39 +02:00
"auth.invite.doneDescription": "A sua conta está pronta. Em seguida, abra o painel para trabalhar com feeds e produtos, ou reveja as definições da empresa.",
"auth.invite.doneSetPasswordDescription": "Inicie sessão com o seu e-mail e a nova palavra-passe para abrir o seu espaço de trabalho.",
"auth.invite.openDashboard": "Abrir painel",
2026-08-16 18:18:39 +02:00
"auth.invite.companySettings": "Definições da empresa",
"auth.invite.goToSignIn": "Ir para início de sessão",
"auth.invite.afterSignInNote": "Após o início de sessão chega ao seu espaço de trabalho — o tour de configuração inicial é ignorado.",
"auth.invite.mismatchTitle": "Conta errada para este convite",
2026-08-16 18:18:39 +02:00
"auth.invite.mismatchDescription": "Este link é para um e-mail diferente daquele com que tem sessão iniciada. Termine a sessão para continuar como o utilizador convidado, ou mantenha a sessão e peça a um administrador para reemitir o convite.",
"auth.invite.mismatchDetail": "Sessão iniciada como {session}, mas este convite é para {invite}.",
"auth.invite.mismatchFallback": "O e-mail da sessão não corresponde a este convite.",
"auth.invite.switchAccountTitle": "Mudar de conta:",
2026-08-16 18:18:39 +02:00
"auth.invite.switchAccountBody": "termine a sessão e conclua este formulário com o e-mail convidado{emailSuffix}.",
"auth.invite.reissueTitle": "Caminho de reemissão:",
"auth.invite.reissueBody": "se o seu e-mail real de início de sessão mudou (desvio de e-mail), peça a um administrador da empresa para revogar este convite e enviar um novo para o e-mail que utiliza para iniciar sessão. Os administradores da plataforma também podem reemitir links de definição de palavra-passe em Admin → Utilizadores.",
"locale.switcher": "Idioma da interface",
"locale.menu": "Escolher idioma da interface",
"locale.label": "Idioma do painel",
2026-08-16 18:18:39 +02:00
"locale.help": "Altera as etiquetas da navegação e das definições. O idioma do conteúdo gerado é definido separadamente em Empresa.",
"settings.contentLanguage": "Idioma do conteúdo",
"settings.contentLanguageHelp": "Idioma usado para títulos, descrições e outros conteúdos gerados",
"settings.tab.profile": "Perfil",
"settings.tab.company": "Empresa",
"settings.tab.alerts": "Alertas",
"settings.tab.apiKeys": "Chaves API",
"settings.tab.team": "Equipa",
2026-08-16 18:18:39 +02:00
"settings.title": "Definições",
"settings.description": "Conta, empresa, chaves API e equipa.",
2026-08-16 18:18:39 +02:00
"settings.accessDenied": "Não tem permissão para abrir as definições da empresa. Peça ajuda a um administrador da empresa.",
"settings.loadFailed": "Falha ao carregar as definições",
"settings.profileHeading": "Perfil",
2026-08-16 18:18:39 +02:00
"settings.personalInfo": "Informação pessoal",
"settings.personalInfoHelp": "Atualize os seus dados pessoais",
2026-08-16 18:18:39 +02:00
"settings.firstName": "Nome próprio",
"settings.firstNamePlaceholder": "O seu nome próprio",
"settings.lastName": "Apelido",
"settings.lastNamePlaceholder": "O seu apelido",
"settings.email": "E-mail",
"settings.profileUpdated": "Perfil atualizado.",
2026-08-16 18:18:39 +02:00
"settings.profileUpdateFailed": "Não foi possível atualizar o perfil",
"settings.role.member": "Membro",
"settings.role.admin": "Admin",
"settings.teamHeading": "Membros da equipa",
"settings.inviteUser": "Convidar utilizador",
"settings.teamAdminOnly": "Apenas administradores da empresa podem convidar, promover, despromover ou remover colegas.",
2026-08-16 18:18:39 +02:00
"settings.shareAcceptLink": "Partilhar link de aceitação",
"settings.shareAcceptLinkHelp": "O e-mail de saída não está configurado. Copie este link de utilização única e envie-o ao convidado. Definirá uma palavra-passe (pelo menos 8 caracteres) e aderirá com o papel que escolheu.",
"settings.acceptLinkLabel": "Link de aceitação de convite de utilização única",
"settings.copyLink": "Copiar link",
2026-08-16 18:18:39 +02:00
"settings.linkCopied": "Link de aceitação copiado.",
"settings.table.email": "E-mail",
"settings.table.role": "Papel",
"settings.table.status": "Estado",
2026-08-16 18:18:39 +02:00
"settings.table.joined": "Adesão / expira",
"settings.table.actions": "Ações",
"settings.teamForbidden": "Não tem permissão para ver a lista da equipa. Peça ajuda a um administrador da empresa.",
"settings.noTeammates": "Ainda sem colegas",
2026-08-16 18:18:39 +02:00
"settings.noTeammatesHelp": "Convide colegas como Membro (produtos e feeds) ou Admin (equipa e definições da empresa). Os convites pendentes aparecem aqui até serem aceites.",
"settings.noTeammatesMemberHelp": "Ainda não há colegas listados. Peça a um administrador da empresa para enviar convites.",
"settings.memberActions": "Ações do membro",
"settings.makeAdmin": "Tornar admin",
"settings.makeMember": "Tornar membro",
"settings.removeMember": "Remover",
"settings.revokeInvite": "Revogar convite",
"settings.needOneAdmin": "As empresas precisam de pelo menos um administrador",
"settings.expires": "Expira a {date}",
2026-08-16 18:18:39 +02:00
"settings.invalidEmail": "Introduza um endereço de e-mail válido.",
"settings.inviteCreatedNoMail": "Convite criado para {email} como {role}. Copie o link de aceitação abaixo e partilhe-o — o e-mail de saída não está configurado.",
"settings.inviteSent": "Convite enviado para {email} como {role}. Deve abrir o e-mail e aceitar antes de expirar.",
2026-08-16 18:18:39 +02:00
"settings.inviteFailed": "Não foi possível enviar o convite",
"settings.revokeConfirm": "Revogar este convite?",
"settings.revoked": "Convite revogado.",
2026-08-16 18:18:39 +02:00
"settings.revokeFailed": "Não foi possível revogar o convite",
"settings.removeConfirm": "Remover {email} desta empresa?",
"settings.memberRemoved": "{email} removido.",
2026-08-16 18:18:39 +02:00
"settings.removeFailed": "Não foi possível remover o utilizador",
"settings.roleChangeConfirm": "{action} {email} para {role}?",
2026-08-16 18:18:39 +02:00
"settings.roleChanged": "{email} é agora {role}.",
"settings.roleChangeFailed": "Não foi possível atualizar o papel",
"settings.promote": "Promover",
"settings.demote": "Despromover",
"settings.inviteTitle": "Convidar colega",
2026-08-16 18:18:39 +02:00
"settings.inviteDescription": "Receberão um link para definir uma palavra-passe (pelo menos 8 caracteres) e aderir a esta empresa.",
"settings.inviteEmail": "E-mail",
"settings.inviteEmailPlaceholder": "colega@exemplo.com",
"settings.inviteRole": "Papel",
2026-08-16 18:18:39 +02:00
"settings.inviteRoleHint": "Os membros gerem produtos e feeds. Os administradores também podem convidar colegas e alterar as definições da empresa.",
"settings.sendInvite": "Enviar convite",
2026-08-16 18:18:39 +02:00
"settings.companyHeading": "Definições da empresa",
"settings.activeCompany": "Empresa ativa",
2026-08-16 18:18:39 +02:00
"settings.creditsOverview": "Resumo de créditos",
"settings.plan": "Plano",
"settings.used": "Usado",
2026-08-16 18:18:39 +02:00
"settings.companyInfo": "Informação da empresa",
"settings.companyInfoHelp": "Atualize os detalhes da empresa",
"settings.companyName": "Nome da empresa",
"settings.companyNamePlaceholder": "O nome da sua empresa",
2026-08-16 18:18:39 +02:00
"settings.contentSettings": "Definições de conteúdo",
"settings.mergeProducts": "Unir produtos com o mesmo GTIN",
2026-08-16 18:18:39 +02:00
"settings.emailIntegration": "Integração de e-mail",
"settings.aiIntegrations": "Integrações de IA",
"settings.alertsHeading": "Alertas do operador",
2026-08-16 18:18:39 +02:00
"settings.inAppToasts": "Toasts na aplicação",
"settings.emailAlerts": "Alertas por e-mail",
"settings.apiKeysHeading": "Chaves API",
"settings.createApiKey": "Criar chave API",
"settings.createApiKeyShort": "Criar chave API",
"settings.createApiKeyTitle": "Criar chave API",
"settings.apiKeyLabel": "Chave API",
"settings.keyName": "Nome da chave",
2026-08-16 18:18:39 +02:00
"settings.storeKeySafe": "Guarde-a num local seguro — não poderá ver o segredo completo de novo.",
"settings.apiKeysIntro": "Crie uma chave API da empresa para chamar os endpoints públicos /api/v1. O segredo completo é mostrado apenas uma vez ao criar — copie-o de imediato.",
"settings.apiKeysUseWhere": "Envie-a como Authorization: Bearer <key> (preferido) ou X-API-Key.",
2026-08-16 18:18:39 +02:00
"settings.apiKeysDocsLink": "Documentação de autenticação da API",
"settings.apiKeyOnceWarning": "Esta é a única vez que o segredo completo é mostrado. Copie-o agora antes de fechar este diálogo.",
"settings.table.name": "Nome",
"settings.table.key": "Chave",
2026-08-16 18:18:39 +02:00
"settings.table.lastUsed": "Última utilização",
"dashboard.demoSandbox": "Sandbox de demonstração",
"dashboard.demoEmptyTitle": "A sandbox de demonstração está vazia",
"dashboard.demoEmptyHint": "A sandbox de demonstração está vazia — mude para A1 ou ligue um feed para ver estatísticas reais do catálogo.",
"dashboard.overviewTitle": "Visão geral",
"dashboard.quickLinks": "Ligações rápidas",
"dashboard.whatsNew": "Novidades",
"dashboard.startTutorial": "Iniciar tutorial",
"dashboard.resumeTutorial": "Retomar tutorial",
"dashboard.restartTutorial": "Reiniciar tutorial",
2026-08-16 18:18:39 +02:00
"dashboard.tourTopics": "Tópicos do tour",
"dashboard.browseTutorialSections": "Explorar secções do tutorial",
"dashboard.connectFeed": "Ligar um feed",
"dashboard.processProducts": "Processar produtos",
"dashboard.openProducts": "Abrir produtos",
"dashboard.welcomeTo": "Bem-vindo a {name}",
"dashboard.trialBadge": "Teste",
2026-08-16 18:18:39 +02:00
"dashboard.actions": "Ações do painel",
"dashboard.emptyPaygHint": "A Descrybe importa um catálogo, enriquece e processa, e depois exporta ou envia para as lojas. Use Primeiros passos abaixo.",
"dashboard.emptyCreditsHint": "A Descrybe importa um catálogo, enriquece e processa, e depois exporta ou envia para as lojas. Tem {credits} — comece com Primeiros passos abaixo.",
"dashboard.workflowTitle": "Fluxo do catálogo",
"dashboard.recentActivity": "Atividade recente",
"dashboard.loadFailed": "Falha ao carregar o painel",
2026-08-16 18:18:39 +02:00
"dashboard.workspaceFallback": "Este espaço de trabalho",
"dashboard.jobFallback": "Trabalho {id}",
"dashboard.workflow.feeds.connect": "Ligar uma origem",
"dashboard.workflow.feeds.sources": "{count} origem",
"dashboard.workflow.feeds.sourcesPlural": "{count} origens",
2026-08-16 18:18:39 +02:00
"dashboard.workflow.products.build": "Criar catálogo",
"dashboard.workflow.products.count": "{count} no catálogo",
"dashboard.workflow.map": "Map",
"dashboard.workflow.map.detail": "Associe colunas depois de adicionar um feed",
"dashboard.workflow.map.ready": "Abrir Map num feed",
"dashboard.workflow.sync": "Sync",
2026-08-16 18:18:39 +02:00
"dashboard.workflow.sync.detail": "Obtenha uma amostra após o mapeamento",
"dashboard.workflow.sync.ready": "Sincronizar uma amostra nos produtos",
"dashboard.workflow.process": "Processar",
"dashboard.workflow.processActive": "{count} ativos",
"dashboard.workflow.processWaiting": "{count} em espera",
2026-08-16 18:18:39 +02:00
"dashboard.workflow.processDone": "{count} concluídos",
"dashboard.workflow.processRun": "Executar tarefas de IA",
"dashboard.workflow.export": "Exportar",
2026-08-16 18:18:39 +02:00
"dashboard.workflow.exportReady": "Modelos e transferência",
"dashboard.workflow.exportMap": "Mapear e exportar",
2026-08-16 18:18:39 +02:00
"dashboard.workflowHint": "Catálogo a entrar → enriquecer / processar → exportar ou enviar para lojas. Salte para o passo seguinte para {name}.",
"dashboard.overviewHint": "Totais em direto para {name}",
2026-08-16 18:18:39 +02:00
"dashboard.demoEmptyMessage": "Mude para A1 (ou outra empresa com dados) no cabeçalho, ou ligue um feed aqui para preencher esta sandbox.",
"dashboard.emptyTitle": "Importe um catálogo",
"dashboard.emptyMessage": "Catálogo a entrar → enriquecer / processar → exportar ou enviar para lojas. Comece com Primeiros passos abaixo (ou ligue um feed / carregue um CSV).",
"dashboard.connectFeedAnyway": "Ligar feed mesmo assim",
"dashboard.connectFeedShort": "Ligar feed",
"dashboard.uploadCsv": "Carregar CSV",
2026-08-16 18:18:39 +02:00
"dashboard.goToBilling": "Ir para Faturação",
"dashboard.freePlanTitle": "Está no plano Free",
"dashboard.freePlanMessageWithLimit": "{used} de {max} produtos usados. O mapeamento de feeds, a limpeza básica e as etiquetas energéticas da UE (EPREL) estão incluídos; atualize para títulos e descrições com IA e mais capacidade.",
"dashboard.freePlanMessage": "O mapeamento de feeds, a limpeza básica e as etiquetas energéticas da UE (EPREL) estão incluídos; atualize para títulos e descrições com IA e mais capacidade.",
"dashboard.outOfCreditsTitle": "Ficou sem créditos de IA",
"dashboard.outOfCreditsMessage": "Compre mais créditos ou atualize o plano para continuar a processar.",
"dashboard.productLimitTitle": "Limite de produtos atingido",
2026-08-16 18:18:39 +02:00
"dashboard.productLimitMessage": "O seu plano {plan} permite {max} produtos ({count} no catálogo). Atualize para processar mais.",
"dashboard.productLimitMessageFull": "O limite de produtos do plano {plan} foi atingido. Atualize para processar mais.",
"dashboard.comparePlans": "Comparar planos",
"dashboard.viewPlans": "Ver planos",
2026-08-16 18:18:39 +02:00
"dashboard.trialTitle": "Teste · {plan}",
"dashboard.trialMessageDated": "O teste termina a {date}. {credits} créditos restantes.",
"dashboard.trialMessage": "{credits} créditos restantes no seu teste.",
"dashboard.lowCreditsTitle": "Créditos a esgotar-se",
"dashboard.lowCreditsMessage": "Restam {remaining} de {total} créditos. Recarregue ou atualize antes de as tarefas pararem.",
"dashboard.latestJobs": "Últimas tarefas de processamento",
"dashboard.noJobsEmpty": "Ainda sem tarefas — importe produtos primeiro.",
"dashboard.noJobsReady": "Sem tarefas recentes. Inicie uma em Produtos quando estiver pronto.",
"dashboard.startJob": "Iniciar um trabalho a partir de Produtos",
2026-08-16 18:18:39 +02:00
"dashboard.quickLinksHint": "Feeds, produtos, tarefas e exportação.",
"dashboard.feedsImportMap": "Importar e mapear",
"dashboard.productsBrowse": "Explorar e processar",
"dashboard.jobsMonitor": "Monitorizar tarefas",
2026-08-16 18:18:39 +02:00
"dashboard.exportsTemplates": "Modelos e transferência",
"activation.title": "Primeiros passos",
2026-08-16 18:18:39 +02:00
"activation.description": "A Descrybe importa um catálogo, enriquece e processa, e depois exporta ou envia para as lojas. Conclua o passo atual e continue — o tour demo explica os ecrãs sem alterar o progresso da lista.",
"activation.descriptionShort": "Comece pelo passo destacado abaixo — uma ação de cada vez. Ligar a loja é opcional.",
"activation.nextCta": "Fazer este passo",
2026-08-16 18:18:39 +02:00
"activation.valueProp": "A Descrybe importa um catálogo, enriquece e processa, e depois exporta ou envia para as suas lojas.",
"activation.alreadyDone": "Já feito",
"activation.skipForNow": "Ignorar por agora",
"activation.showAllSteps": "Mostrar os {total} passos",
"activation.showFewerSteps": "Mostrar menos passos",
"activation.corePathLabel": "Em resumo",
2026-08-16 18:18:39 +02:00
"activation.corePath": "Catálogo a entrar → Enriquecer / processar → Exportar ou enviar para lojas",
"activation.storeWizardHint": "Não é necessário para feeds ou exportações — ignore a menos que queira enviar produtos para uma loja ativa.",
"activation.storeWizardCta": "Iniciar configuração guiada",
"activation.focus.map": "Seguinte: abra Map num feed, associe colunas e guarde. Adicione primeiro um feed se a lista estiver vazia.",
2026-08-16 18:18:39 +02:00
"activation.focus.sync": "Seguinte: sincronize uma amostra depois de guardar o mapeamento. Use Sync num feed mapeado — evite origens sem mapa.",
"activation.focus.dismiss": "Fechar dica",
"activation.dismiss": "Dispensar lista",
"hypercare.report.title": "Hypercare de cutover",
2026-08-16 18:18:39 +02:00
"hypercare.report.message": "Dados em falta ou incorretos após a migração? Reporte para podermos corrigir o seu espaço de trabalho.",
"hypercare.report.cta": "Reportar dados em falta ou incorretos",
"hypercare.report.dismiss": "Dispensar",
"hypercare.report.adminTriage": "Abrir fila de hypercare",
"etl.gaps.title": "What did not migrate",
2026-08-16 18:18:39 +02:00
"etl.gaps.message": "These areas were intentionally left empty or partial after the Descrybe platform cutover. Nothing is “broken” — recreate or reconnect as needed.",
"etl.gaps.dismiss": "Dismiss",
"etl.gaps.apiKeys.title": "API keys",
2026-08-16 18:18:39 +02:00
"etl.gaps.apiKeys.body": "Legacy API key secrets were not migrated. Create a new key to restore API access — the secret is shown only once.",
"etl.gaps.apiKeys.cta": "Open API keys",
"etl.gaps.blobs.title": "File contents (blobs)",
2026-08-16 18:18:39 +02:00
"etl.gaps.blobs.body": "Upload records may exist as metadata only. File bytes were not copied — re-upload CSVs or resync object storage if you need the originals.",
"etl.gaps.blobs.countHint": "{count} file records are metadata-only (bytes were not migrated).",
"etl.gaps.blobs.cta": "Open Files",
"etl.gaps.jobs.title": "Processing history",
"etl.gaps.jobs.body": "Legacy job and task history was not backfilled for cutover. New jobs you start here will appear normally.",
2026-08-16 18:18:39 +02:00
"etl.gaps.jobs.emptyHint": "Optional jobs domain was not run — empty history is expected.",
"etl.gaps.jobs.migratedHint": "{count} jobs were tagged migrated from an optional backfill.",
"etl.gaps.jobs.cta": "Open Processing",
"etl.gaps.woo.title": "Store credentials",
2026-08-16 18:18:39 +02:00
"etl.gaps.woo.body": "WooCommerce and Shopify secrets may need to be re-entered after cutover — that is a reconnect step, not a broken sync.",
"etl.gaps.woo.cta": "Open Stores",
"etl.gaps.settings.title": "Company settings",
"etl.gaps.settings.body": "Only language and merge-products settings were imported. Re-check other company preferences in Settings.",
"etl.gaps.settings.cta": "Open company settings",
2026-08-16 18:18:39 +02:00
"activation.progress": "{done} de {total} concluídos",
"activation.stepsLabel": "Passos de ativação",
"activation.pausedTitle": "Começar em pausa",
"activation.pausedBody": "Retome quando quiser — dos campos de produto até à exportação. Ligar a loja continua opcional.",
"activation.resume": "Retomar lista",
"activation.step.enable-fields.title": "Ativar campos de produto",
2026-08-16 18:18:39 +02:00
"activation.step.enable-fields.body": "Escolha quais colunas de produto padrão o Descrybe deve mapear e limpar.",
"activation.step.connect-source.title": "Adicionar um feed de produtos",
2026-08-16 18:18:39 +02:00
"activation.step.connect-source.body": "Adicione um feed de catálogo CSV ou XML para os produtos entrarem no Descrybe. Ligar uma loja ativa é um passo opcional posterior.",
"activation.step.map.title": "Mapear colunas do feed",
2026-08-16 18:18:39 +02:00
"activation.step.map.body": "Em Feeds, abra Map no seu feed, faça corresponder as colunas do fornecedor e guarde.",
"activation.step.sync-sample.title": "Sincronizar uma amostra",
2026-08-16 18:18:39 +02:00
"activation.step.sync-sample.body": "Em Feeds, sincronize uma pequena amostra de um feed mapeado para verificar o mapeamento antes da execução completa.",
"activation.step.process.title": "Processar produtos",
2026-08-16 18:18:39 +02:00
"activation.step.process.body": "Abra produtos não processados e execute o processamento para gerar conteúdo de catálogo limpo.",
"activation.step.store-connect.title": "Ligar uma loja",
2026-08-16 18:18:39 +02:00
"activation.step.store-connect.body": "Opcional. Ligue WooCommerce ou Shopify para enviar produtos para a sua loja. Ignore se usar apenas feeds e exportações.",
"activation.step.export.title": "Criar uma exportação",
"activation.step.export.body": "Crie um feed de exportação para descarregar ou publicar produtos limpos como XML ou CSV.",
"stats.products": "Produtos importados",
"stats.categories": "Categorias",
"stats.attributes": "Atributos",
"stats.feeds": "Feeds",
2026-08-16 18:18:39 +02:00
"stats.credits": "Créditos",
"stats.openCatalog": "Abrir catálogo",
"stats.productsHint": "Catálogo {processed} · fila {unprocessed} (contagens separadas)",
"stats.catalogTree": "Árvore do catálogo",
"stats.attributeLibrary": "Biblioteca de atributos",
2026-08-16 18:18:39 +02:00
"stats.importSources": "Origens de importação",
"stats.payAsYouGo": "Pagamento conforme o uso",
2026-08-16 18:18:39 +02:00
"stats.walletBilling": "Carteira · Faturação",
"stats.enterpriseBilling": "Empresarial · Faturação",
"stats.usedBilling": "{used} usados · Faturação",
"processing.jobStatus.processing": "A processar",
2026-08-16 18:18:39 +02:00
"processing.jobStatus.completed": "Concluído",
"processing.jobStatus.failed": "Falhou",
"processing.jobStatus.cancelled": "Cancelado",
"processing.jobStatus.pending": "Pendente",
"processing.jobStatus.queued": "Na fila",
"processing.jobStatus.skipped": "Ignorado",
"processing.jobStatus.unknown": "Desconhecido",
"processing.job.error.all_failed": "Todos os {count} produtos falharam.",
"processing.job.error.partial_failed": "{count} produtos falharam.",
"processing.step.normalize": "Normalizar",
"processing.step.parse_specs": "Analisar specs",
"processing.step.fill_fields": "Preencher campos",
"processing.step.eprel": "EPREL",
"processing.step.ai_enhance": "Melhoria com IA",
"processing.type.full": "Processamento completo",
2026-08-16 18:18:39 +02:00
"processing.type.enhance_only": "Só melhorar",
"processing.type.title": "Só título",
"processing.type.description": "Só descrição",
"processing.type.attributes": "Atributos",
"processing.type.category": "Categoria",
"processing.type.eprel": "EPREL",
"processing.type.seo": "SEO",
"processing.type.normalize": "Normalizar",
"errors.requestFailed": "Pedido falhou",
2026-08-16 18:18:39 +02:00
"errors.maintenance": "O sistema está em manutenção. Tente novamente mais tarde.",
"errors.readOnly": "O sistema está em modo só de leitura. As alterações estão temporariamente desativadas.",
"errors.companyAdminDenied": "Apenas administradores da empresa podem {action}. Peça ajuda a um administrador.",
"errors.companyAdminDenied.actionDefault": "fazer isto",
2026-08-16 18:18:39 +02:00
"docs.tryIt.memberCannotCreate": "Só os admins da empresa podem criar chaves API. As legado não foram migradas — cole uma chave abaixo ou peça a um admin para criar uma nova.",
"docs.tryIt.noKeysLegacyAdmin": "As chaves API legado não foram migradas. Crie uma nova via Use my API key ou Definições → Chaves API — o segredo só é mostrado uma vez.",
"docs.tryIt.noKeysLegacyMember": "Sem chaves API listadas. As legado não foram migradas — peça a um admin para criar uma, ou cole uma chave dk_.",
"errors.couldNotUpdateLanguage": "Não foi possível atualizar o idioma",
"toast.support.replyTitle": "Resposta de suporte",
"toast.support.replyBody": "A equipa respondeu ao seu ticket de suporte.",
"toast.support.replyRe": "Re: {subject}",
"toast.support.statusTitle": "Estado do ticket atualizado",
"toast.support.statusBody": "O estado do seu ticket de suporte alterou-se.",
2026-08-16 18:18:39 +02:00
"toast.support.updateTitle": "Atualização de suporte",
"assistant.label": "Assistente",
"assistant.open": "Abrir o assistente do sistema",
"assistant.close": "Fechar o assistente do sistema",
"tutorial.demoTour": "Tour demo",
2026-08-16 18:18:39 +02:00
"tutorial.jumpToTopic": "Ir para um tópico",
"tutorial.whereNeedHelp": "Em que precisa de ajuda?",
"tutorial.skipTour": "Saltar tour",
"tutorial.skipAria": "Saltar tutorial",
2026-08-16 18:18:39 +02:00
"tutorial.pickerBody": "Escolha uma secção para reabrir essa parte da demo. Explorar o tour não altera os dados da sua conta.",
"tutorial.sectionsAria": "Secções do tutorial",
"tutorial.open": "Abrir",
"tutorial.close": "Fechar",
2026-08-16 18:18:39 +02:00
"tutorial.resumeLastStep": "Retomar último passo",
"tutorial.startFromBeginning": "Começar do início",
"tutorial.stepOf": "Passo {current} de {total}",
2026-08-16 18:18:39 +02:00
"tutorial.jumpTo": "Ir para…",
"tutorial.jumpToSectionAria": "Ir para a secção",
"tutorial.back": "Voltar",
"tutorial.pause": "Pausar",
"tutorial.continue": "Continuar",
"tutorial.finishTour": "Concluir tour",
2026-08-16 18:18:39 +02:00
"tutorial.missingTargetHint": "Esse controlo ainda não está neste ecrã. Pode Continuar na mesma — o tour nunca exige guardar ou sincronizar.",
"tutorial.section.welcome": "Welcome",
"tutorial.section.catalog": "Catalog setup",
"tutorial.section.sources": "Feeds",
"tutorial.section.mapping": "Map & sync",
"tutorial.section.products": "Process",
"tutorial.section.export": "Export & stores",
"tutorial.section.grow": "Grow",
"tutorial.section.done": "Done",
"tutorial.step.welcome.title": "Bem-vindo ao Descrybe",
2026-08-16 18:18:39 +02:00
"tutorial.step.welcome.body": "O ciclo principal do Descrybe é Feeds → Process → Export / Stores. Esta demo guiada destaca esses ecrãs no seu dashboard real — sem exigir guardar, sincronizar, ativar campos ou criar feeds. Pause quando quiser; retome no cabeçalho. Salte para uma secção se só precisar de ajuda num tópico.",
"tutorial.step.welcome.tip": "Demo tour — your data stays unchanged until you choose to act outside the tour.",
"tutorial.step.welcome.nextLabel": "Start tour",
2026-08-16 18:18:39 +02:00
"tutorial.step.welcome.missingHint": "You’re on the dashboard — continue when ready.",
"tutorial.step.dashboard-overview.title": "O seu centro de comando",
2026-08-16 18:18:39 +02:00
"tutorial.step.dashboard-overview.body": "A faixa de workflow do catálogo mostra o caminho diário: Feeds → Map → Sync → Process. Getting started acompanha o progresso real do workspace (à parte desta demo). Quando estiver pronto, use Manage feeds ou Start processing — depois exporte ou ligue uma loja.",
"tutorial.step.dashboard-overview.tip": "Completing this tour does not mark checklist steps done — only real workspace progress does.",
"tutorial.step.dashboard-overview.missingHint": "The workflow strip and checklist appear after the dashboard loads.",
"tutorial.step.enable-fields.title": "Campos standard",
2026-08-16 18:18:39 +02:00
"tutorial.step.enable-fields.body": "Standard Fields são as colunas de produto que o Descrybe mapeia, processa e exporta — título, descrição, GTIN, imagens e mais. Enable recommended ativa um conjunto predefinido sensato para a maioria dos catálogos. Pode afinar a lista depois sem partir mapeamentos existentes.",
"tutorial.step.enable-fields.tip": "In the demo you don’t need to click Enable recommended — Continue when you understand the idea.",
"tutorial.step.enable-fields.warning": "Enabling or disabling fields affects mapping and processing for this company. Prefer Enable recommended once, then tweak carefully.",
"tutorial.step.enable-fields.missingHint": "Wait for the Fields page to load, or open Fields from the Catalog section in the sidebar.",
"tutorial.step.catalog-depth.title": "Categorias e atributos",
2026-08-16 18:18:39 +02:00
"tutorial.step.catalog-depth.body": "Na secção Catalog da barra lateral também encontra Categories e Attributes. Categories organizam o catálogo; os atributos alimentam filtros e descrições estruturadas. Não precisa de os configurar para terminar este tour.",
"tutorial.step.catalog-depth.tip": "Return to this section anytime from Jump to… if you revisit taxonomy later.",
"tutorial.step.catalog-depth.missingHint": "Expand Catalog in the sidebar to open Categories or Attributes after the tour.",
"tutorial.step.connect-source.title": "Adicionar uma origem de produtos",
2026-08-16 18:18:39 +02:00
"tutorial.step.connect-source.body": "Os feeds são como os catálogos de fornecedores entram no Descrybe — ficheiros CSV, XML ou URL. Add Feed cria uma nova origem; cada linha mostra o estado (pronto para mapear, mapeado, ativo). Map abre o ecrã de correspondência de campos desse feed.",
"tutorial.step.connect-source.tip": "You don’t need to add a feed for the demo. When ready for real setup, add one sample file first.",
"tutorial.step.connect-source.warning": "Avoid deleting live feeds unless you intend to remove that source and its sync history.",
2026-08-16 18:18:39 +02:00
"tutorial.step.connect-source.missingHint": "Open Feeds from the sidebar if this screen hasn’t loaded.",
"tutorial.step.map.title": "Mapear campos de origem",
2026-08-16 18:18:39 +02:00
"tutorial.step.map.body": "No ecrã Map de um feed associa colunas do fornecedor aos standard fields do Descrybe. Auto-map sugere correspondências pelos nomes das colunas; confirme as aproximadas e corrija o resto. Save Mappings guarda o mapa para que sync e processamento saibam ler cada linha.",
"tutorial.step.map.tip": "Demo tip: open Map on a feed when you have one — you are not required to save.",
"tutorial.step.map.warning": "Don’t Save Mappings until Auto-map looks right — a bad map makes bad products.",
"tutorial.step.map.missingHint": "Add a feed and click Map to see the mapping UI; or Continue to keep learning.",
"tutorial.step.sync-sample.title": "Sincronizar uma amostra (quando estiver pronto)",
2026-08-16 18:18:39 +02:00
"tutorial.step.sync-sample.body": "Depois de guardar os mapeamentos, Sync + Process sample obtém um lote pequeno e corre o processamento para verificar títulos, imagens e atributos antes de uma execução completa. Full Sync now na lista de feeds serve para importações maiores quando a amostra estiver boa.",
"tutorial.step.sync-sample.tip": "Skip Sync during the demo — use it only after Save Mappings on a real feed.",
"tutorial.step.sync-sample.warning": "Syncing writes products into this company. Prefer a sample first; avoid Sync now on unmapped feeds.",
"tutorial.step.sync-sample.missingHint": "Sync controls appear on feed rows and on the mapping screen footer.",
"tutorial.step.process.title": "Rever produtos",
2026-08-16 18:18:39 +02:00
"tutorial.step.process.body": "Products lista itens sincronizados e processados. Filtre por estado, abra uma linha para detalhes e use badges EPREL quando existirem dados de etiqueta energética. É aqui que deteta erros de mapeamento antes da exportação ou sync de loja.",
"tutorial.step.process.tip": "Browsing products is read-only for exploration — editing a row changes live catalog data.",
"tutorial.step.process.missingHint": "Wait for the products table, or Continue if the catalog is still empty.",
"tutorial.step.processing-hub.title": "Processamento em segundo plano",
2026-08-16 18:18:39 +02:00
"tutorial.step.processing-hub.body": "Os jobs em Processing mostram progresso de AI e pipeline: execuções concluídas e falhas. Inicie jobs a partir do dashboard ou produtos quando quiser gastar créditos num lote de propósito.",
"tutorial.step.processing-hub.tip": "Jobs consume credits — watch Billing before large runs.",
"tutorial.step.processing-hub.missingHint": "Open Jobs from the Processing section in the sidebar if the page is empty.",
"tutorial.step.stores-hub.title": "Lojas e plataformas",
2026-08-16 18:18:39 +02:00
"tutorial.step.stores-hub.body": "Depois de processar, Stores liga WooCommerce ou Shopify para enviar o catálogo limpo para a loja. Use isto quando um marketplace ou CMS for o destino — ou salte para Export feeds se os parceiros só precisarem de ficheiro/URL.",
"tutorial.step.stores-hub.tip": "Reconnect banners appear if a token expires — fix those before relying on sync.",
"tutorial.step.stores-hub.missingHint": "Open Stores from the sidebar to see connection cards.",
"tutorial.step.export.title": "Exportar produtos limpos",
2026-08-16 18:18:39 +02:00
"tutorial.step.export.body": "Os export feeds publicam produtos limpos como XML ou CSV para canais, parceiros ou a sua loja. Crie uma exportação, escolha formato e filtros, depois partilhe o URL do feed ou descarregue. As exportações leem dados de catálogo processados — mapeie e processe primeiro para melhores resultados.",
"tutorial.step.export.tip": "You don’t need to create an export during the demo.",
"tutorial.step.export.warning": "Creating or deleting export feeds affects what partners can download — avoid deleting production feeds casually.",
"tutorial.step.export.missingHint": "Wait for Export feeds to load, or open Exports from the Feeds section in the sidebar.",
2026-08-16 18:18:39 +02:00
"tutorial.step.billing-hub.title": "Créditos e faturação",
"tutorial.step.billing-hub.body": "Billing mostra o seu plano, carteira e créditos restantes. O processamento e algumas funcionalidades de AI usam este saldo. Vigie o uso antes de grandes execuções de catálogo.",
"tutorial.step.billing-hub.tip": "Demo accounts may show unlimited or large balances — treat production credits carefully.",
"tutorial.step.billing-hub.missingHint": "Open Billing from the Account section in the sidebar.",
"tutorial.step.grow-hub.title": "Campanhas, SEO e reviews",
2026-08-16 18:18:39 +02:00
"tutorial.step.grow-hub.body": "Em Marketing: Campaigns gera conteúdo, Content calendar planeia publicações, SEO verifica listagens e Reviews liga-se ao WooCommerce. Assentam num catálogo bem mapeado — termine Feeds → Process → Export / Stores antes de depender deles.",
"tutorial.step.grow-hub.tip": "Jump back here when you’re ready to market, not during first mapping.",
"tutorial.step.grow-hub.missingHint": "Open Campaigns from Marketing in the sidebar, or Continue.",
"tutorial.step.tour-done.title": "Pronto para explorar",
2026-08-16 18:18:39 +02:00
"tutorial.step.tour-done.body": "Esse é o mapa do produto: Feeds → Map → Sync → Process → Export / Stores. Use Getting started no dashboard para a configuração real. Retome ou reinicie este tour no cabeçalho a qualquer momento, ou Jump to… uma secção. Skip tour termina a demo sem alterar a checklist.",
"tutorial.step.tour-done.tip": "Demo complete — no cleanup needed. Your account was not modified by Continue alone.",
"tutorial.step.tour-done.nextLabel": "Finish tour",
"tutorial.step.tour-done.missingHint": "Return to the dashboard to finish.",
2026-08-16 18:18:39 +02:00
"news.uxImprovements.title": "Melhorias na experiência do utilizador",
"flash.contentLanguageUpdated": "Idioma do conteúdo atualizado.",
"theme.darkMode": "Modo escuro",
"theme.lightMode": "Modo claro",
"forbidden.title.accessRestricted": "Acesso restrito",
2026-08-16 18:18:39 +02:00
"forbidden.title.permissionDenied": "Permissão negada",
"forbidden.message.support": "Esta área só está disponível para a equipa de suporte e administradores da plataforma.",
"forbidden.message.platform": "Esta área só está disponível para administradores da plataforma.",
"forbidden.message.company": "Não tem permissão para isto. Peça ajuda a um administrador da empresa.",
"forbidden.backToDashboard": "Voltar ao painel",
"admin.chrome.platformOps": "Ops da plataforma",
"admin.chrome.sidebar": "Barra lateral de ops da plataforma",
"admin.chrome.nav": "Ops da plataforma",
2026-08-16 18:18:39 +02:00
"admin.chrome.mobileMenu": "Menu móvel de ops da plataforma",
"admin.chrome.opsBadge": "Ops",
2026-08-16 18:18:39 +02:00
"admin.chrome.backToApp": "Voltar à app",
"admin.chrome.uiLanguage": "Idioma da UI",
2026-08-16 18:18:39 +02:00
"admin.chrome.staff.supportDesk": "Secretária de suporte",
"admin.chrome.staff.platformAdmin": "Admin da plataforma",
"admin.chrome.staff.staff": "Equipa",
"admin.chrome.staff.admin": "Admin",
2026-08-16 18:18:39 +02:00
"admin.nav.section.overview": "Visão geral",
"admin.nav.section.directory": "Diretório",
"admin.nav.section.support": "Suporte",
2026-08-16 18:18:39 +02:00
"admin.nav.section.ops": "Operações",
"admin.nav.section.commerce": "Comércio",
"admin.nav.section.system": "Sistema",
"admin.nav.commandCenter": "Centro de comando",
2026-08-16 18:18:39 +02:00
"admin.nav.analytics": "Análises",
"admin.nav.usersOrgs": "Utilizadores e orgs",
"admin.nav.tickets": "Tickets",
"admin.nav.knowledge": "Conhecimento",
2026-08-16 18:18:39 +02:00
"admin.nav.diagnostics": "Diagnósticos",
"admin.nav.stuckProducts": "Produtos bloqueados",
"admin.nav.orphanProcessed": "Orphan processed",
2026-08-16 18:18:39 +02:00
"admin.nav.billing": "Faturação",
"admin.nav.sales": "Sales",
2026-08-16 18:18:39 +02:00
"admin.nav.translations": "Traduções",
"admin.nav.settings": "Definições",
"admin.sales.title": "Sales leads",
"admin.sales.description": "Inbound Contact sales messages and custom payment quotes.",
"admin.sales.listTitle": "Leads",
"admin.sales.listDesc": "{total} matching leads",
2026-08-16 18:18:39 +02:00
"admin.sales.searchPlaceholder": "Search name, email, company…",
"admin.sales.statusAll": "All statuses",
"admin.sales.status.new": "New",
"admin.sales.status.contacted": "Contacted",
"admin.sales.status.quoted": "Quoted",
"admin.sales.status.won": "Won",
"admin.sales.status.closed": "Closed",
"admin.sales.empty": "No sales leads yet.",
"admin.sales.loadError": "Could not load sales leads.",
"admin.sales.saveError": "Could not save lead.",
"admin.sales.saved": "Lead updated.",
"admin.sales.notFound": "Lead not found.",
"admin.sales.leadTitle": "Lead details",
"admin.sales.estimatedSkus": "Estimated SKUs",
"admin.sales.linkCompany": "Link company",
"admin.sales.noCompany": "No company linked",
"admin.sales.adminNotes": "Admin notes",
"admin.sales.companyRequired": "Link a company before creating a payment quote.",
"admin.sales.prepareQuote": "Prepare custom plan",
"admin.sales.prepareQuoteDesc": "Creates an is_custom plan and optional Stripe Checkout link (one-time or installments).",
"admin.sales.planName": "Plan name",
"admin.sales.monthlyCredits": "Monthly AI credits",
"admin.sales.maxProducts": "Max SKUs",
"admin.sales.unlimitedHint": "Leave blank for unlimited",
"admin.sales.totalUsd": "Total price (USD)",
"admin.sales.termMonths": "Term (months)",
"admin.sales.installmentCount": "Installments",
"admin.sales.installmentInterval": "Interval",
"admin.sales.interval.month": "Monthly",
"admin.sales.interval.quarter": "Quarterly",
"admin.sales.interval.year": "Yearly",
"admin.sales.prepareCheckoutNow": "Create Stripe Checkout link now",
"admin.sales.createQuote": "Create quote",
"admin.sales.quoteCreated": "Quote created.",
"admin.sales.quoteError": "Could not create quote.",
"admin.sales.quotesTitle": "Quotes",
"admin.sales.noQuotes": "No quotes yet for this lead.",
"admin.sales.prepareCheckout": "Prepare Checkout",
"admin.sales.checkoutReady": "Checkout link ready.",
"admin.sales.checkoutError": "Could not prepare Checkout.",
"admin.sales.markSent": "Mark sent",
"admin.sales.markedSent": "Quote marked as sent.",
"admin.sales.col.name": "Name",
"admin.sales.col.email": "Email",
"admin.sales.col.company": "Company",
"admin.sales.col.status": "Status",
"admin.sales.col.created": "Created",
"sales.contact.title": "Contact sales",
2026-08-16 18:18:39 +02:00
"sales.contact.lead": "Tell us about your catalog and capacity needs — we will prepare a custom plan you can pay online.",
"sales.contact.formTitle": "Send a message",
"sales.contact.formLead": "Enterprise and custom deals are prepared by our team, then paid via Stripe Checkout.",
"sales.contact.name": "Name",
"sales.contact.email": "Work email",
"sales.contact.company": "Company",
"sales.contact.phone": "Phone (optional)",
"sales.contact.estimatedSkus": "Estimated SKUs (optional)",
"sales.contact.message": "How can we help?",
"sales.contact.submit": "Send message",
2026-08-16 18:18:39 +02:00
"sales.contact.submitting": "Sending…",
"sales.contact.error": "Could not send your message. Please try again.",
2026-08-16 18:18:39 +02:00
"sales.contact.toast.success": "Message sent — we will follow up soon.",
"sales.contact.thanksTitle": "Thanks — we got your message",
"sales.contact.thanksBody": "A platform admin will review your request and can send a Checkout link for a custom plan.",
"sales.contact.bookDemo": "Book a live demo",
"sales.contact.orBookDemo": "Or book a Calendly demo",
"sales.contact.backPricing": "Back to pricing",
"admin.overview.eyebrow": "Centro de comando",
2026-08-16 18:18:39 +02:00
"admin.overview.title": "Visão geral da plataforma",
"admin.overview.description": "Pulso ao vivo da plataforma a partir do resumo de análises — salte para ops, insights e suporte.",
"admin.overview.tokens": "Fichas",
2026-08-16 18:18:39 +02:00
"admin.overview.tokensHint": "De sempre · período",
"admin.overview.credits": "Créditos",
"admin.overview.creditsHint": "Em todas as empresas",
"admin.overview.jobs": "Tarefas",
2026-08-16 18:18:39 +02:00
"admin.overview.jobsHint": "Instantâneo da fila",
"admin.overview.platform": "Plataforma",
2026-08-16 18:18:39 +02:00
"admin.overview.platformHint": "Inquilinos · volume",
"admin.overview.signals": "Sinais recentes",
"admin.overview.shortcuts": "Atalhos de ops",
"admin.overview.providers": "Mix de fornecedores de IA",
"admin.overview.internalAi": "IA interna",
2026-08-16 18:18:39 +02:00
"admin.overview.internalAiHint": "Definições da plataforma",
"admin.overview.popularKeys": "Chaves populares",
"admin.overview.popularKeysHint": "Fornecedores populares do inquilino",
"admin.overview.customUrl": "URL personalizado",
"admin.overview.customUrlHint": "URL base personalizado do inquilino",
2026-08-16 18:18:39 +02:00
"admin.overview.linkBilling": "Faturação",
"admin.overview.linkSettings": "Definições",
"admin.overview.shortcut.diagnostics.title": "Diagnósticos",
"admin.overview.shortcut.diagnostics.desc": "Verificações de saúde, fila, falhas recentes",
"admin.overview.shortcut.analytics.title": "Análises",
"admin.overview.shortcut.analytics.desc": "Tokens, trabalhos, registos, fornecedores",
"admin.overview.shortcut.knowledge.title": "Conhecimento",
2026-08-16 18:18:39 +02:00
"admin.overview.shortcut.knowledge.desc": "Artigos, modelos, resposta automática",
"admin.overview.shortcut.users.title": "Utilizadores e orgs",
"admin.overview.shortcut.users.desc": "Contas, empresas, convites",
"admin.overview.shortcut.stuck.title": "Produtos bloqueados",
2026-08-16 18:18:39 +02:00
"admin.overview.shortcut.stuck.desc": "Em execução há mais de 2 horas",
"admin.overview.signal.stuckTitle": "{count} trabalho bloqueado",
"admin.overview.signal.stuckTitlePlural": "{count} trabalhos bloqueados",
2026-08-16 18:18:39 +02:00
"admin.overview.signal.stuckDetail": "Em execução há mais de 2 horas — reveja e reponha se necessário.",
"admin.overview.signal.stuckCta": "Abrir trabalhos bloqueados",
2026-08-16 18:18:39 +02:00
"admin.overview.signal.failedTitle": "{count} falhados nos últimos {days} d",
"admin.overview.signal.failedDetail": "{completed} concluídos na mesma janela.",
"admin.overview.signal.failedDetailRate": "{rate}% taxa de falha · {completed} concluídos.",
"admin.overview.signal.failedCta": "Abrir diagnósticos",
"admin.overview.signal.runningTitle": "{count} trabalho em execução",
"admin.overview.signal.runningTitlePlural": "{count} trabalhos em execução",
"admin.overview.signal.runningDetail": "Trabalhos de processamento ativos neste momento.",
"admin.overview.signal.runningCta": "Ver fila",
"admin.overview.signal.ticketsTitle": "{count} ticket de suporte aberto",
"admin.overview.signal.ticketsTitlePlural": "{count} tickets de suporte abertos",
2026-08-16 18:18:39 +02:00
"admin.overview.signal.ticketsDetail": "Tickets abertos ou pendentes na secretária de suporte.",
"admin.overview.signal.ticketsCta": "Abrir suporte",
"admin.overview.signal.clearTitle": "Sem sinais elevados",
2026-08-16 18:18:39 +02:00
"admin.overview.signal.clearDetail": "Sem trabalhos bloqueados, falhas do período ou tickets abertos no resumo ao vivo (últimos {days} d).",
"admin.overview.signal.clearCta": "Confirmar nos diagnósticos",
"admin.overview.badge.action": "Ação",
"admin.overview.badge.watch": "Monitorizar",
"admin.overview.badge.live": "Ao vivo",
"admin.overview.badge.clear": "Limpar",
2026-08-16 18:18:39 +02:00
"admin.overview.summaryLoadFailed": "Não foi possível carregar o resumo ao vivo. Os atalhos abaixo ainda funcionam.",
"admin.overview.keyMetrics": "Métricas principais",
"admin.overview.summaryWindow": "Últimos {days} d · endpoint de resumo",
"admin.overview.tokensPeriod": "{count} nos últimos {days} d",
"admin.overview.creditsFoot": "{remaining} restantes de {allocated} atribuídos",
"admin.overview.jobsFoot": "{failed} falhados · {running} a correr · {stuck} presos",
"admin.overview.platformFoot": "{users} utilizadores · {processed} processados · {feeds} feeds de entrada",
"admin.overview.fullDiagnostics": "Diagnósticos completos",
"admin.overview.also": "Também:",
"admin.overview.linkSupport": "Secretária de suporte",
"admin.overview.charts": "Gráficos",
"admin.overview.providerFoot": "{jobs} tarefas · {products} produtos",
"admin.analytics.eyebrow": "Insights",
2026-08-16 18:18:39 +02:00
"admin.analytics.title": "Análises e relatórios",
"admin.analytics.description": "KPI e tendências ao vivo da plataforma a partir de tokens, trabalhos, registos, feeds, tickets e faturação.",
"admin.analytics.period": "Período",
"admin.analytics.refreshing": "A atualizar…",
"admin.analytics.llmTokens": "Tokens LLM",
2026-08-16 18:18:39 +02:00
"admin.analytics.credits": "Créditos",
"admin.analytics.jobs": "Tarefas",
"admin.analytics.volume": "Volume",
"admin.analytics.failureRate": "Taxa de falha",
"admin.analytics.stuckJobs": "Trabalhos bloqueados",
"admin.analytics.apiKeys": "Chaves API",
"admin.analytics.signups": "Registos",
"admin.analytics.internalAi": "IA interna",
2026-08-16 18:18:39 +02:00
"admin.analytics.internalAiHint": "OpenAI da plataforma (definições admin)",
"admin.analytics.popularKeys": "Chaves populares",
2026-08-16 18:18:39 +02:00
"admin.analytics.popularKeysHint": "OpenAI / Groq / … do inquilino",
"admin.analytics.customUrl": "URL/modelo personalizado",
"admin.analytics.customUrlHint": "URL base do inquilino + modelo + chave",
"admin.analytics.tokensByDay": "Tokens por dia",
"admin.analytics.tokensByProvider": "Tokens por classe de fornecedor",
"admin.analytics.tokensByProviderAria": "Tokens por classe de fornecedor",
"admin.analytics.internalCount": "Interno {count}",
"admin.analytics.popularCount": "Popular {count}",
"admin.analytics.customCount": "Personalizado {count}",
"admin.analytics.jobsByDay": "Trabalhos por dia",
2026-08-16 18:18:39 +02:00
"admin.analytics.jobsByDayHint": "Trabalhos criados (secundário = falhados).",
"admin.analytics.signupsByDay": "Registos por dia",
2026-08-16 18:18:39 +02:00
"admin.analytics.signupsByDayHint": "Novos utilizadores (principal) e empresas (secundário)",
"admin.analytics.processingJobsStatus": "processing_jobs por estado",
"admin.analytics.feedSyncStatus": "feed_sync_jobs por estado",
"admin.analytics.ticketsStatus": "support_tickets por estado",
"admin.analytics.providerDetail": "Detalhe do fornecedor",
"admin.analytics.providerDetailHint": "Principais modos de fornecedor (limitados pelo tamanho do payload).",
"admin.analytics.noProviderRows": "Sem linhas de fornecedor",
"admin.analytics.provider": "Fornecedor",
"admin.analytics.class": "Classe",
"admin.analytics.tokensCol": "Fichas",
"admin.analytics.productsCol": "Produtos",
2026-08-16 18:18:39 +02:00
"admin.analytics.companiesHint": "Principais empresas por tokens com divisão de fornecedor",
"admin.analytics.noCompanies": "Sem empresas",
2026-08-16 18:18:39 +02:00
"admin.analytics.noCompaniesMsg": "A lista de empresas está vazia.",
"admin.analytics.company": "Empresa",
"admin.analytics.internal": "Interno",
"admin.analytics.popular": "Popular",
"admin.analytics.custom": "Personalizado",
2026-08-16 18:18:39 +02:00
"admin.analytics.noBillingCycles": "Ainda sem ciclos de faturação",
"admin.analytics.linkDiagnostics": "Diagnósticos",
"admin.analytics.linkStuck": "Produtos bloqueados",
"admin.users.eyebrow": "Admin da plataforma",
2026-08-16 18:18:39 +02:00
"admin.users.title": "Utilizadores e organizações",
"admin.users.description": "Diretório de utilizadores da plataforma, funções de equipa e atribuições de planos de empresa.",
"admin.users.staffRoleUnavailable": "As atualizações de função de equipa ainda não estão disponíveis neste deployment. Contacte o administrador da plataforma se precisar.",
"admin.users.search": "Pesquisar",
"admin.users.tabUsers": "Utilizadores",
"admin.users.tabCompanies": "Empresas",
"admin.users.filterWithoutPlan": "Without plan",
"admin.users.filterWithoutApiKeys": "Keys needing reissue",
"admin.users.needsApiKeyReissue": "Needs API key reissue",
"admin.users.colName": "Nome",
2026-08-16 18:18:39 +02:00
"admin.users.colStaffRole": "Função da equipa",
"admin.users.colStatus": "Estado",
"admin.users.colCreated": "Criado",
2026-08-16 18:18:39 +02:00
"admin.users.colActions": "Ações",
"admin.users.mustSetPassword": "Tem de definir palavra-passe",
"admin.users.inactive": "Inativo",
"admin.users.reissueInvite": "Reemitir convite",
"admin.users.setLocalPassword": "Definir palavra-passe local",
"admin.users.switchToUser": "Mudar para utilizador",
"admin.users.colCompany": "Empresa",
"admin.users.colPlan": "Plano",
2026-08-16 18:18:39 +02:00
"admin.users.colCredits": "Créditos",
"admin.users.colLanguage": "Idioma",
"admin.users.assignPlan": "Atribuir plano",
2026-08-16 11:37:42 +02:00
"admin.users.cloneCatalog": "Copiar para a minha empresa",
2026-08-16 18:18:39 +02:00
"admin.users.cloneCatalogAria": "Copiar o catálogo de {name} para a sua empresa sandbox",
"admin.users.cloneCatalogTitle": "Copiar catálogo da empresa",
"admin.users.cloneCatalogDesc": "Permanece na sua conta de admin. Os dados de origem não são alterados.",
2026-08-16 11:37:42 +02:00
"admin.users.cloneCatalogFrom": "Origem: {name}",
"admin.users.cloneCatalogInto": "Destino: {name}",
2026-08-16 18:18:39 +02:00
"admin.users.cloneCatalogWarning": "Substitui categorias, feeds, produtos, atributos, mappings e marca no destino. Plano, faturação, membros, chaves API e conectores de loja não são copiados.",
2026-08-16 11:37:42 +02:00
"admin.users.cloneCatalogCancel": "Cancelar",
2026-08-16 18:18:39 +02:00
"admin.users.cloneCatalogConfirm": "Copiar catálogo",
2026-08-16 11:37:42 +02:00
"admin.users.cloneDestFallback": "a sua empresa sandbox",
2026-08-16 18:49:02 +02:00
"admin.users.cloneDestLabel": "Destination company",
"admin.users.cloneDestSelect": "Select destination",
"admin.users.cloneDestRequired": "Choose a destination company different from the source.",
2026-08-16 18:36:56 +02:00
"admin.users.syncA1": "Sincronizar A1",
"admin.users.syncA1Aria": "Sync A1 categories from dump and repair catalog hygiene for {name}",
"admin.users.syncA1Title": "Sincronizar catálogo A1",
"admin.users.syncA1Desc": "Backfills mapped categories from the MySQL dump when present on the API host, then runs catalog hygiene (prompts, weak hashes, bidirectional category backfill, attribute sanitize). Does not wipe or reimport the full catalog.",
"admin.users.syncA1Company": "Company: {name}",
"admin.users.syncA1Warning": "Requires descrybe_new.sql on the API server (scripts/seed/ or SEED_A1_MYSQL_DUMP) for dump category coverage. Without a dump, only DB hygiene runs. No mass reprocess.",
"admin.users.syncA1Cancel": "Cancelar",
"admin.users.syncA1Confirm": "Sincronizar A1",
"admin.users.noUsers": "Nenhum utilizador corresponde a este filtro.",
"admin.users.noCompanies": "Nenhuma empresa corresponde a este filtro.",
2026-08-16 18:18:39 +02:00
"admin.users.assignRoleTitle": "Atribuir função de equipa",
"admin.users.assignRoleDesc": "As funções da plataforma controlam o painel admin (Admin e Developer) e a secretária de suporte (equipa de suporte).",
"admin.users.staffRole": "Função da equipa",
"admin.users.saveRole": "Guardar função",
"admin.users.assignPlanTitle": "Atribuir plano",
2026-08-16 18:18:39 +02:00
"admin.users.assignPlanDesc": "Associar um plano público, legacy ou personalizado a esta empresa.",
"admin.users.selectPlan": "Selecionar plano",
"admin.users.assign": "Atribuir",
2026-08-16 18:18:39 +02:00
"admin.settings.title": "Definições da plataforma",
"admin.settings.description": "Credenciais da plataforma, funções de IA, e-mail e integrações para este deployment",
"admin.settings.intro": "Configure aqui funções de IA da plataforma, SMTP, OAuth, EPREL, Pinecone e Stripe. Deixe os segredos em branco para manter o valor guardado. As chaves por empresa ficam em Integrações do inquilino.",
"admin.settings.aiRolesUnavailable": "As funções de IA completas ainda não estão disponíveis neste deployment. O processamento continua a guardar via definições OpenAI da plataforma; outras funções serão persistidas quando suportadas.",
"admin.settings.tab.integrations": "Visão geral",
"admin.settings.tab.ai": "Funções de IA",
"admin.settings.tab.mail": "Mail",
"admin.settings.tab.other": "Outro",
"admin.settings.tab.admins": "Utilizadores admin",
2026-08-16 18:18:39 +02:00
"admin.settings.mailCardDesc": "Convites de definição de palavra-passe e e-mail de saída da plataforma",
"admin.settings.integrationsCardDesc": "OAuth, EPREL, Pinecone, Stripe, feeds",
"admin.settings.tenantVsPlatform": "Inquilino vs plataforma",
2026-08-16 18:18:39 +02:00
"admin.settings.hostSecrets": "Segredos de base de dados, sessão e assinatura do servidor — configurar apenas no host",
"admin.settings.linkAi": "IA",
2026-08-16 18:18:39 +02:00
"admin.settings.linkEmail": "Correio eletrónico",
"admin.settings.linkBilling": "Faturação",
"admin.settings.provider": "Fornecedor",
"admin.settings.model": "Modelo",
"admin.settings.baseUrl": "URL base",
"admin.settings.apiKey": "Chave API",
2026-08-16 18:18:39 +02:00
"admin.settings.embeddingDims": "Dimensões de embedding (opcional)",
"admin.settings.smtpHost": "Host SMTP",
"admin.settings.port": "Porta",
"admin.settings.username": "Nome de utilizador",
2026-08-16 18:18:39 +02:00
"admin.settings.fromAddress": "Endereço de origem",
"admin.settings.testRecipient": "Destinatário de teste (opcional)",
"admin.settings.testRecipientPlaceholder": "Predefinição: o seu e-mail de admin",
"admin.settings.googleOauth": "Google OAuth",
"admin.settings.googleOauthDesc": "Credenciais de cliente Google OAuth da plataforma opcionais.",
"admin.settings.clientId": "ID de cliente",
"admin.settings.eprel": "EPREL",
"admin.settings.timeout": "Timeout",
"admin.settings.ficheLanguage": "Idioma da ficha",
"admin.settings.pinecone": "Pinecone",
"admin.settings.host": "Host",
"admin.settings.namespace": "Namespace",
"admin.settings.namespacePlaceholder": "opcional",
"admin.settings.stripe": "Stripe",
2026-08-16 18:18:39 +02:00
"admin.settings.priceStarterMo": "ID de preço mensal Starter",
"admin.settings.priceStarterYr": "ID de preço anual Starter",
"admin.settings.pricePlusMo": "Plus monthly price ID",
"admin.settings.pricePlusYr": "Plus yearly price ID",
2026-08-16 18:18:39 +02:00
"admin.settings.priceGrowthMo": "ID de preço mensal Growth",
"admin.settings.priceGrowthYr": "ID de preço anual Growth",
"admin.settings.priceBusinessMo": "ID de preço mensal Business",
"admin.settings.priceBusinessYr": "ID de preço anual Business",
"admin.settings.priceScaleMo": "Scale monthly price ID",
"admin.settings.priceScaleYr": "Scale yearly price ID",
"admin.settings.creditPackPrices": "AI credit pack price IDs (one-time)",
2026-08-16 18:18:39 +02:00
"admin.settings.creditPackPricesHint": "Create one-time Prices in Stripe (mode=payment products). Paste Price IDs here — same sync path as plan subscriptions.",
"admin.settings.syncCreditPacks": "Sync Stripe packs",
"admin.settings.syncCreditPacksOk": "Synced {count} credit pack price(s) ({mode} mode).",
"admin.settings.syncCreditPacksModeHint": "Stripe mode for this sync: {mode}. Switch the secret key (sk_test_ vs sk_live_) to sync the other environment.",
"admin.settings.syncCreditPacksFailed": "Could not sync credit packs to Stripe.",
"admin.settings.pricePackSmall": "Starter pack (500 credits) price ID",
"admin.settings.pricePackMedium": "Growth pack (2,000 credits) price ID",
"admin.settings.pricePackLarge": "Catalog pack (10,000 credits) price ID",
"admin.settings.pricePackXL": "Scale pack (40,000 credits) price ID",
2026-08-16 18:18:39 +02:00
"admin.settings.feedAllowlist": "Lista de permissão de URL privadas de feeds",
"admin.settings.allowlist": "Lista de permissões",
"admin.settings.platformAdmins": "Administradores da plataforma",
"admin.settings.colUserId": "ID de utilizador",
2026-08-16 18:18:39 +02:00
"admin.settings.colEmail": "Correio eletrónico",
"admin.settings.colName": "Nome",
"admin.settings.colAddedOn": "Adicionado em",
2026-08-16 18:18:39 +02:00
"admin.settings.colRole": "Função",
"admin.settings.platformAdminBadge": "Admin da plataforma",
"admin.settings.noAdmins": "Nenhum utilizador admin encontrado",
2026-08-16 18:18:39 +02:00
"admin.settings.adminStatusCheck": "Verificação de estado admin",
"admin.settings.bootstrapPage": "página bootstrap",
"admin.readiness.title": "Preparação do cutover",
"admin.readiness.detail": "Contagens de hypercare que ainda precisam de atenção antes da mudança de DNS.",
"admin.readiness.mustSetPassword": "{count} utilizadores devem definir palavra-passe",
"admin.readiness.withoutAdmin": "{count} empresas sem administrador",
"admin.readiness.withoutPlan": "{count} empresas sem plano ativo",
"admin.readiness.withoutApiKeys": "{count} companies needing API key reissue",
2026-08-16 18:18:39 +02:00
"admin.readiness.linksAria": "Ligações profundas de preparação",
"admin.readiness.linkUsers": "Utilizadores",
2026-08-16 18:18:39 +02:00
"admin.readiness.linkBilling": "Faturação",
"admin.readiness.linkSettings": "Definições",
"admin.readiness.linkApiKeys": "Keys needing reissue",
"admin.diagnostics.eyebrow": "Plataforma",
2026-08-16 18:18:39 +02:00
"admin.diagnostics.title": "Diagnósticos",
"admin.diagnostics.description": "Consola ops para saúde da app, profundidade da fila, trabalhos recentes e flags de config. Segredos e DSN nunca são mostrados; erros de trabalhos são sanitizados.",
"admin.diagnostics.filterAria": "Filtro de estado do trabalho",
"admin.diagnostics.queue": "Fila",
2026-08-16 18:18:39 +02:00
"admin.diagnostics.noJobsInQueue": "Não há trabalhos na fila.",
"admin.diagnostics.sanitizedErrors": "Erros sanitizados · máx. 25",
"admin.diagnostics.colId": "ID",
"admin.diagnostics.colCompany": "Empresa",
"admin.diagnostics.colStatus": "Estado",
"admin.diagnostics.colProgress": "Progresso",
"admin.diagnostics.colUpdated": "Atualizado",
"admin.diagnostics.colError": "Erro",
"admin.diagnostics.colTicket": "Ticket",
"admin.diagnostics.colWhen": "Quando",
2026-08-16 18:18:39 +02:00
"admin.diagnostics.noJobsFilter": "Não há trabalhos para este filtro.",
"admin.stuck.title": "Produtos bloqueados",
2026-08-16 18:18:39 +02:00
"admin.stuck.description": "Reveja trabalhos de processamento recentes e reponha os bloqueados há mais de 2 horas",
"admin.stuck.noJobs": "Nenhum trabalho encontrado.",
"admin.stuck.filterAria": "Filtrar trabalhos por estado",
"admin.orphan.title": "Orphan processed",
2026-08-16 18:18:39 +02:00
"admin.orphan.description": "Cutover ops #7 — report stale catalog rows first (dry-run), then confirm delete only if needed.",
"admin.orphan.cutoverHint": "Safe by default: refresh and dry-run never delete. Confirm delete sends confirm=true only after you approve the dialog.",
"admin.orphan.refreshReport": "Refresh report",
"admin.orphan.dryRunBtn": "Dry-run cleanup",
2026-08-16 18:18:39 +02:00
"admin.orphan.deleteBtn": "Confirm delete…",
"admin.orphan.loadFailed": "Could not load orphan report",
"admin.orphan.dryRunFailed": "Dry-run cleanup failed",
"admin.orphan.deleteFailed": "Confirmed orphan cleanup failed",
"admin.orphan.metric.total": "Total orphans",
"admin.orphan.metric.missingRaw": "Missing raw",
"admin.orphan.metric.unprocessedRaw": "Unprocessed raw",
"admin.orphan.samplesTitle": "Sample rows",
"admin.orphan.samplesDesc": "Up to 25 most recently updated orphan catalog rows",
"admin.orphan.cleanBadge": "Clean",
"admin.orphan.needsCleanupBadge": "Needs cleanup",
2026-08-16 18:18:39 +02:00
"admin.orphan.noneFound": "No orphan processed rows — cutover ops #7 report is clean.",
"admin.orphan.noSamples": "No sample rows in this report.",
"admin.orphan.colProcessed": "Processed ID",
"admin.orphan.colCompany": "Company",
"admin.orphan.colRaw": "Raw ID",
"admin.orphan.colReason": "Reason",
"admin.orphan.colRawStatus": "Raw status",
"admin.orphan.reason.missingRaw": "Missing raw",
"admin.orphan.reason.unprocessedRaw": "Unprocessed raw",
"admin.orphan.reason.other": "Other",
"admin.orphan.rawProcessedYes": "is_processed=true",
"admin.orphan.rawProcessedNo": "is_processed=false",
"admin.orphan.confirmTitle": "Delete orphan processed rows?",
"admin.orphan.confirmDesc": "This permanently deletes {total} processed_products row(s) whose raw is missing or unprocessed. Job product links use ON DELETE SET NULL.",
"admin.orphan.confirmDelete": "Delete orphans",
2026-08-16 18:18:39 +02:00
"admin.billing.title": "Admin de faturação",
"admin.billing.description": "Gira planos, créditos, permissões de funcionalidades por pacote e interruptores de funcionalidades em toda a plataforma.",
"admin.billing.noCompanies": "Nenhuma empresa encontrada.",
"admin.billing.noCompaniesFilter": "Nenhuma empresa corresponde a este filtro.",
"admin.billing.assignPlanTitle": "Atribuir plano",
2026-08-16 18:18:39 +02:00
"admin.billing.assignPlanDesc": "Associe um plano de faturação a uma empresa. Os créditos de teste opcionais repõem o saldo da empresa para o período de teste.",
"admin.billing.creditsTitle": "Adicionar / ajustar créditos",
"admin.billing.creditsDesc": "Creditar ou debitar o saldo de uma empresa.",
2026-08-16 18:18:39 +02:00
"admin.billing.searchCompany": "Pesquisar empresa…",
"admin.knowledge.draft": "Rascunho",
"admin.knowledge.badge.draft": "Rascunho",
"admin.knowledge.newArticle": "Novo artigo",
"admin.knowledge.editArticle": "Editar artigo",
"admin.knowledge.noMatchingArticles": "Sem artigos correspondentes",
"admin.knowledge.noArticles": "Sem artigos de conhecimento",
2026-08-16 18:18:39 +02:00
"admin.knowledge.emptyCategoryMsg": "A categoria “{category}” está pronta — adicione um artigo base para um agente de conteúdo preencher.",
"admin.knowledge.emptyArticlesMsg": "Adicione bases estilo FAQ com categorias e palavras-chave. Deixe marcadores no corpo para agentes de conteúdo.",
"admin.knowledge.col.title": "Título",
"admin.knowledge.col.name": "Nome",
"admin.knowledge.edit": "Editar",
"admin.knowledge.newTemplate": "Novo modelo",
"admin.knowledge.editTemplate": "Editar modelo",
"admin.knowledge.allCategories": "Tudo",
"admin.settings.enablePlatformSmtp": "Ativar SMTP da plataforma",
2026-08-16 18:18:39 +02:00
"admin.plans.title": "Planos de subscrição",
"admin.plans.description": "Público ladder, A1 / Legacy, Plataforma Demo, and custom deals. Ephemeral test and obsolete ladder rows stay under Oculto.",
"admin.plans.searchPlaceholder": "Pesquisar nome ou descrição…",
"admin.plans.searchAria": "Pesquisar planos",
"admin.plans.filterAria": "Filtrar planos por visibilidade",
2026-08-16 18:18:39 +02:00
"admin.plans.filter.catalog": "Catálogo",
"admin.plans.filter.public": "Público",
"admin.plans.filter.legacy": "Legacy",
"admin.plans.filter.custom": "Personalizado",
"admin.plans.filter.hidden": "Oculto",
"admin.plans.filter.all": "Tudo",
"admin.plans.col.plan": "Plano",
"admin.plans.col.visibility": "Visibilidade",
2026-08-16 18:18:39 +02:00
"admin.plans.col.monthlyCredits": "Créditos mensais",
"admin.plans.col.maxProducts": "Produtos máx.",
"admin.plans.col.term": "Prazo",
"admin.plans.customPackageFlag": "Sinalizador de pacote personalizado",
2026-08-16 18:18:39 +02:00
"admin.plans.visibility.public": "Público",
"admin.plans.visibility.legacy": "Legacy",
"admin.plans.visibility.hidden": "Oculto",
"admin.plans.visibility.custom": "Personalizado",
"admin.plans.edit": "Editar",
"admin.plans.editAria": "Editar {name}",
"admin.plans.assign": "Atribuir",
"admin.plans.assignAria": "Atribuir {name}",
2026-08-16 18:18:39 +02:00
"admin.plans.permissions": "Permissões do plano",
"admin.plans.permissionsAria": "Editar permissões do plano for {name}",
"admin.plans.showing": "A mostrar {filtered} de {total} planos",
"admin.plans.unlimited": "Ilimitado",
2026-08-16 18:18:39 +02:00
"admin.plans.optionLabel": "{name} ({credits} créditos) · {kind}",
"admin.permissions.noteStrong": "Plano entitlements only.",
2026-08-16 18:18:39 +02:00
"admin.permissions.noteBody": "These toggles set what this package may include. Plataforma-wide on/desligado masters are on the {global} tab — a plan can enable a feature that still stays desligado when the platform switch is desativado.",
"admin.permissions.globalTab": "Interruptores globais",
2026-08-16 18:18:39 +02:00
"admin.permissions.title": "Permissões do plano",
"admin.permissions.descCount": "{enabled}/{total} ativados",
"admin.permissions.matchesProfile": "corresponde a {profile}",
2026-08-16 18:18:39 +02:00
"admin.permissions.customizedOverrides": "substituições personalizadas",
"admin.permissions.planDefaults": "predefinições do plano",
"admin.permissions.badge.legacy": "Pacote legado migrado",
2026-08-16 18:18:39 +02:00
"admin.permissions.badge.publicLadder": "Público ladder",
"admin.permissions.badge.ladderCustom": "Público ladder · personalizado flag",
"admin.permissions.badge.customDeal": "Personalizado deal",
"admin.permissions.badge.clientDeal": "Acordo com cliente",
"admin.permissions.badge.customOverrides": "Personalizado overrides",
2026-08-16 18:18:39 +02:00
"admin.permissions.badge.defaults": "Predefinições",
"admin.permissions.badge.customFlag": "Personalizado flag",
"admin.permissions.package": "Pacote",
"admin.permissions.noPlans": "Sem planos",
2026-08-16 18:18:39 +02:00
"admin.permissions.suffix.legacy": "· legacy",
"admin.permissions.suffix.default": " · predefinido",
"admin.permissions.suffix.custom": " · personalizado",
"admin.permissions.section": "Secção",
"admin.permissions.allSections": "Todas as secções",
"admin.permissions.state": "Estado",
"admin.permissions.stateAll": "Tudo",
"admin.permissions.stateOn": "Ativado",
"admin.permissions.stateOff": "Desativado",
"admin.permissions.stateDiffers": "Difere from default",
"admin.permissions.search": "Pesquisar",
"admin.permissions.searchPlaceholder": "Filtrar por chave ou etiqueta",
"admin.permissions.profilesAria": "Plano feature profiles",
"admin.permissions.applyProfile": "Aplicar perfil",
"admin.permissions.applyLegacy": "Aplicar perfil legacy",
"admin.permissions.profilesHint": "One-click matrices for public ladder packages and migrated legacy navigation. Guardars overrides for the selecionado package only.",
"admin.permissions.applyNamed": "Aplicar {label}",
"admin.permissions.applyGeneric": "Aplicar perfil",
"admin.permissions.enableAll": "Ativar tudo",
"admin.permissions.disableAll": "Desativar tudo",
2026-08-16 18:18:39 +02:00
"admin.permissions.clearOverrides": "Limpar substituições",
"admin.permissions.globallyOff": "Globally desligado",
2026-08-16 18:18:39 +02:00
"admin.permissions.enableSection": "Ativar secção",
"admin.permissions.disableSection": "Desativar secção",
"admin.permissions.noMatch": "Nenhuma funcionalidade corresponde aos filtros atuais.",
"admin.permissions.differs": "Difere",
"admin.permissions.platformOffHint": "Desligado em toda a plataforma even if this plan enables it.",
"admin.permissions.sectionToggled": "{label} {state} para este plano.",
"admin.permissions.state.enabled": "ativado",
"admin.permissions.state.disabled": "desativado",
2026-08-16 18:18:39 +02:00
"admin.permissions.loadFailed": "Falha ao carregar permissões do plano",
"admin.permissions.saveFailed": "Falha ao guardar feature",
"admin.permissions.enableAllFailed": "Ativar tudo falhou",
"admin.permissions.disableAllFailed": "Desativar tudo falhou",
"admin.permissions.profileFailed": "Falha ao apply profile",
"admin.permissions.resetFailed": "Falha ao reset defaults",
2026-08-16 18:18:39 +02:00
"admin.permissions.sectionFailed": "Secção update falhou",
"admin.profile.legacy.label": "Legacy",
2026-08-16 18:18:39 +02:00
"admin.profile.legacy.description": "Migrated legacy navigation: catalog, feeds, faturação, and definições; no Voltarground Tasks, lojas, or marketing.",
"admin.profile.free.label": "Grátis",
"admin.profile.free.description": "Público Free ladder — AI, chave APIs, live email, and own-key AI desligado.",
"admin.profile.starter.label": "Starter",
2026-08-16 18:18:39 +02:00
"admin.profile.starter.description": "Público Starter — AI on; own-key AI desligado.",
"admin.profile.growth.label": "Growth",
2026-08-16 18:18:39 +02:00
"admin.profile.growth.description": "Todas as funcionalidades do catálogo ativas.",
"admin.profile.business.label": "Business",
2026-08-16 18:18:39 +02:00
"admin.profile.business.description": "Todas as funcionalidades do catálogo ativas.",
"admin.profile.enterprise.label": "Enterprise / tudo ligado",
"admin.profile.enterprise.description": "Full matriz de funcionalidades (custom and Enterprise default).",
"admin.gates.noteStrong": "Plataforma-wide masters.",
2026-08-16 18:18:39 +02:00
"admin.gates.noteBody": "Estes interruptores aplicam-se a todos os pacotes. O acesso efetivo é {combo}. Os direitos por pacote ficam no separador {permissions}.",
"admin.gates.combo": "permissão do plano E secção global E funcionalidade global",
"admin.gates.permissionsTab": "Permissões do plano",
"admin.gates.sectionsOff": "{count} section desligado",
"admin.gates.sectionsOffPlural": "{count} sections desligado",
"admin.gates.featuresOff": "{count} feature master desligado",
"admin.gates.featuresOffPlural": "{count} feature masters desligado",
"admin.gates.title": "Mestres de funcionalidades globais",
"admin.gates.description": "Disable a feature here to turn it desligado for every package, even when a plan enables it.",
2026-08-16 18:18:39 +02:00
"admin.gates.section": "Secção",
"admin.gates.allSections": "Todas as secções",
"admin.gates.search": "Pesquisar",
"admin.gates.searchPlaceholder": "Filtrar por chave ou etiqueta",
2026-08-16 18:18:39 +02:00
"admin.gates.sectionOff": "Secção desligado",
"admin.gates.noMatch": "Nenhuma funcionalidade corresponde aos filtros atuais.",
"admin.gates.featureAria": "{label} global",
2026-08-16 18:18:39 +02:00
"admin.gates.sectionsTitle": "Interruptores de secção global",
"admin.gates.sectionsDesc": "Turn an entire produto area on or desligado for all packages. “Secção + features” also updates every feature master in that section.",
"admin.gates.sectionAria": "Secção global {label}",
"admin.gates.enableSectionFeatures": "Ativar secção + funcionalidades",
"admin.gates.disableSectionFeatures": "Desativar secção + funcionalidades",
"admin.gates.sectionSuccess": "{label} {state} para todos os pacotes.",
2026-08-16 18:18:39 +02:00
"admin.gates.sectionSuccessWithFeatures": "{label} {state} para todos os pacotes (mestres de secção e funcionalidade).",
"admin.gates.featureSuccess": "{key} {state} globalmente.",
"admin.gates.state.enabled": "ativado",
"admin.gates.state.disabled": "desativado",
"admin.gates.loadFailed": "Falha ao carregar global feature switches",
"admin.gates.sectionFailed": "Falha ao update global section",
"admin.gates.saveFailed": "Falha ao guardar global feature",
"admin.billing.createPlan": "Criar plano",
"admin.billing.assignPlanBtn": "Atribuir plano",
"admin.billing.stat.plans": "Planos",
2026-08-16 18:18:39 +02:00
"admin.billing.stat.catalogHidden": "{catalog} catálogo · {hidden} ocultos",
"admin.billing.stat.creditsAllocated": "Créditos allocated",
"admin.billing.stat.acrossCompanies": "Across empresas on this page (first 50)",
2026-08-16 18:18:39 +02:00
"admin.billing.stat.creditsUsed": "Créditos used",
"admin.billing.stat.creditsConsumed": "Créditos consumed on this page",
"admin.billing.stat.noActivePlan": "Sem plano ativo",
"admin.billing.stat.noActivePlanHint": "Empresas with no active subscription (this page)",
"admin.billing.tab.plans": "Planos",
2026-08-16 18:18:39 +02:00
"admin.billing.tab.permissions": "Permissões do plano",
"admin.billing.tab.global": "Interruptores globais",
"admin.billing.tab.companies": "Empresas",
2026-08-16 18:18:39 +02:00
"admin.billing.cyclesTitle": "Faturação cycles",
"admin.billing.cyclesDesc": "Process due renewals for empresas on scheduled ciclos de faturação.",
"admin.billing.runCycles": "Run due ciclos de faturação",
"admin.billing.companiesTitle": "Empresas",
2026-08-16 18:18:39 +02:00
"admin.billing.companiesDesc": "Saldos de créditos e estado do plano — atribua planos ou ajuste créditos.",
"admin.billing.searchCompaniesAria": "Pesquisar empresas",
"admin.billing.planStatusAria": "Estado do plano",
"admin.billing.filter.all": "Tudo empresas",
"admin.billing.filter.withPlan": "Tem plano ativo",
"admin.billing.filter.withoutPlan": "Sem plano ativo",
"admin.billing.col.company": "Empresa",
"admin.billing.col.planStatus": "Estado do plano",
2026-08-16 18:18:39 +02:00
"admin.billing.col.creditsRemaining": "Créditos restantes",
"admin.billing.col.total": "Total",
"admin.billing.col.used": "Usados",
2026-08-16 18:18:39 +02:00
"admin.billing.col.usagePct": "% de utilização",
"admin.billing.badge.noPlan": "Sem plano",
"admin.billing.badge.active": "Ativo",
"admin.billing.assignPlanAria": "Atribuir plano a {name}",
2026-08-16 18:18:39 +02:00
"admin.billing.addCredits": "Adicionar créditos",
"admin.billing.addCreditsAria": "Adicionar credits for {name}",
"admin.billing.showingCompanies": "A mostrar {filtered} de {total} empresas",
"admin.billing.editPlanTitle": "Editar plan",
"admin.billing.createPlanTitle": "Criar plano",
"admin.billing.editPlanDesc": "Update credits, produto caps, and whether this plan is marked custom.",
"admin.billing.createPlanDesc": "Criar a package. Personalizado plans stay hidden from public pricing.",
"admin.billing.field.name": "Nome",
2026-08-16 18:18:39 +02:00
"admin.billing.field.description": "Descrição",
"admin.billing.field.descriptionPlaceholder": "Opcional short summary for admins",
2026-08-16 18:18:39 +02:00
"admin.billing.field.monthlyCredits": "Créditos mensais",
"admin.billing.field.yearlyCredits": "Créditos anuais",
"admin.billing.field.maxProducts": "Produtos máx.",
"admin.billing.field.maxProductsPlaceholder": "Em branco = ilimitado",
"admin.billing.field.term": "Prazo",
"admin.billing.term.monthly": "Mensal",
"admin.billing.term.yearly": "Anual",
"admin.billing.customPackage": "Personalizado package",
2026-08-16 18:18:39 +02:00
"admin.billing.customPackageHint": "Oculto from public pricing. Use for client deals; leave desligado for Free–Business.",
"admin.billing.previewBadge": "Distintivo de pré-visualização: {preview}.",
"admin.billing.company": "Empresa",
"admin.billing.selectCompany": "Selecionar empresa",
2026-08-16 18:18:39 +02:00
"admin.billing.noPlanSuffix": "· no plan",
"admin.billing.plan": "Plano",
"admin.billing.selectPlan": "Selecionar plano",
2026-08-16 18:18:39 +02:00
"admin.billing.trialAssignment": "Atribuição de teste",
"admin.billing.trialHint": "Opcional trial flag + credit grant for sales or evaluation trials.",
2026-08-16 18:18:39 +02:00
"admin.billing.trialCredits": "Créditos de teste",
"admin.billing.assign": "Atribuir",
"admin.billing.amount": "Valor",
"admin.billing.amountHint": "Use um valor negativo para debitar.",
"admin.billing.apply": "Aplicar",
"admin.billing.planUpdated": "Plano atualizado.",
"admin.billing.planCreated": "Plano criado.",
2026-08-16 18:18:39 +02:00
"admin.billing.loadFailed": "Falha ao carregar faturação data",
"admin.billing.updateFailed": "Update plan falhou",
"admin.billing.createFailed": "Criar plan falhou",
"admin.billing.assignFailed": "Assign falhou",
"admin.billing.creditsFailed": "Add credits falhou",
"admin.billing.cyclesFailed": "Run cycles falhou",
"admin.knowledge.supportInbox": "Suporte inbox",
2026-08-16 18:18:39 +02:00
"admin.knowledge.aiRoles": "Funções de IA",
"admin.knowledge.tab.articles": "Artigos",
"admin.knowledge.tab.templates": "Modelos",
2026-08-16 18:18:39 +02:00
"admin.knowledge.tab.settings": "Resposta automática",
"admin.knowledge.allStatuses": "Tudo statuses",
"admin.knowledge.published": "Publicado",
"admin.knowledge.createArticle": "Criar article",
"admin.knowledge.col.categories": "Categorias",
"admin.knowledge.col.status": "Estado",
"admin.knowledge.col.keywords": "Palavras-chave",
"admin.knowledge.badge.published": "Publicado",
"admin.knowledge.createTemplate": "Criar template",
"admin.knowledge.badge.active": "Ativo",
"admin.knowledge.badge.inactive": "Inativo",
2026-08-16 18:18:39 +02:00
"admin.knowledge.autoFirstResponses": "Ativar primeiras respostas automáticas",
"admin.knowledge.faqMatching": "Correspondência FAQ / modelo",
"admin.knowledge.retryOnReply": "Tentar novamente on first customer reply (if no prior auto)",
2026-08-16 18:18:39 +02:00
"admin.knowledge.matchThreshold": "Limiar de confiança de correspondência",
"admin.knowledge.enableAiFallback": "Ativar fallback de IA",
"admin.knowledge.deliveryMode": "Modo de entrega",
"admin.knowledge.delivery.draft": "Apenas rascunho (nota interna)",
2026-08-16 18:18:39 +02:00
"admin.knowledge.delivery.autoSend": "Envio automático ao cliente",
"admin.knowledge.aiThreshold": "Limiar de confiança da IA",
"admin.knowledge.usePlatformRole": "Use platform suporte AI role (recommended)",
"admin.knowledge.modelOverride": "Modelo override",
"admin.knowledge.providerOverride": "Fornecedor override",
2026-08-16 18:18:39 +02:00
"admin.knowledge.baseUrlOverride": "Substituição do URL base",
"admin.knowledge.supportAiRoleTitle": "Suporte AI role (fallback provider)",
"admin.knowledge.configured": "Configurado",
2026-08-16 18:18:39 +02:00
"admin.knowledge.notReadyBadge": "Não pronto",
"admin.knowledge.enabled": "Ativado",
"admin.knowledge.disabled": "Desativado",
2026-08-16 18:18:39 +02:00
"admin.knowledge.openAiRoles": "Abrir Plataforma definições → AI roles",
"admin.knowledge.field.title": "Título",
"admin.knowledge.field.slug": "Slug",
"admin.knowledge.field.body": "Corpo (markdown)",
"admin.knowledge.field.keywords": "Palavras-chave",
2026-08-16 18:18:39 +02:00
"admin.knowledge.keywordsPlaceholder": "separados por vírgulas",
"admin.knowledge.field.intents": "Chaves de intenção",
"admin.knowledge.intentsPlaceholder": "separados por vírgulas",
"admin.knowledge.field.categories": "Categoria slugs",
2026-08-16 18:18:39 +02:00
"admin.knowledge.categoriesPlaceholder": "faturação, account…",
"admin.knowledge.field.weight": "Peso de prioridade",
2026-08-16 18:18:39 +02:00
"admin.knowledge.publishedEligible": "Publicado (elegível para correspondência)",
"admin.knowledge.field.name": "Nome",
"admin.knowledge.field.templateBody": "Corpo",
"admin.knowledge.active": "Ativo",
"admin.settings.card.aiRolesTitle": "Plataforma AI roles",
2026-08-16 18:18:39 +02:00
"admin.settings.card.aiRolesDesc": "Processamento, vectorization, docs/API, and suporte — separate keys/models",
"admin.settings.roleOff": " (desligado)",
2026-08-16 18:18:39 +02:00
"admin.settings.roleNotSet": "· not set",
"admin.settings.someRolesUnavailable": "Some AI roles are not disponível on this deployment yet. Processamento still uses the platform AbrirAI definições until all roles are suporteed.",
"admin.settings.configure": "Configurar",
"admin.settings.card.smtpTitle": "Plataforma SMTP",
"admin.settings.configured": "Configurado",
2026-08-16 18:18:39 +02:00
"admin.settings.notConfigured": "Não configurado",
"admin.settings.source": "origem: {source}",
"admin.settings.smtpEnabled": "SMTP ativado",
"admin.settings.smtpDisabled": "SMTP desativado",
2026-08-16 18:18:39 +02:00
"admin.settings.passwordSet": "· password set",
"admin.settings.card.otherTitle": "Outras integrações",
"admin.settings.oauthSet": "Google OAuth definido",
"admin.settings.oauthOff": "Google OAuth desligado",
"admin.settings.eprelOn": "EPREL ligado",
"admin.settings.eprelOff": "EPREL desligado",
"admin.settings.pineconeSet": "Pinecone definido",
"admin.settings.pineconeOff": "Pinecone desligado",
"admin.settings.stripeSet": "Stripe definido",
"admin.settings.stripeOff": "Stripe desligado",
"admin.settings.password": "Palavra-passe",
2026-08-16 18:18:39 +02:00
"admin.settings.passwordSavedHint": "(guardado — leave blank to keep)",
"admin.settings.secretKey": "Chave secreta",
2026-08-16 18:18:39 +02:00
"admin.settings.secretConfiguredHint": "(configurado — deixe em branco para manter)",
"admin.settings.passwordConfigured": "Palavra-passe configured",
"admin.settings.noSmtpPassword": "Sem palavra-passe SMTP",
"admin.settings.enabled": "Ativado",
"admin.settings.disabled": "Desativado",
"admin.settings.saveRole": "Guardar {label}",
2026-08-16 18:18:39 +02:00
"admin.settings.testConnection": "Testar ligação",
"admin.settings.saveMail": "Guardar mail definições",
"admin.settings.saveIntegrations": "Guardar integrations",
"admin.settings.eprelEnabled": "EPREL enrichment ativado",
2026-08-16 18:18:39 +02:00
"admin.settings.loadFailed": "Plataforma definições could not be loaded. Saving is desativado until reload succeeds.",
"admin.settings.testAccepted": "Mensagem de teste aceite pelo SMTP",
2026-08-16 18:18:39 +02:00
"admin.stuck.cleanupBtn": "Limpeza de trabalhos presos (>2 h em execução)",
"admin.stuck.jobsTitle": "Trabalhos de processamento",
2026-08-16 18:18:39 +02:00
"admin.stuck.jobsDesc": "Últimos 100 trabalhos · {running} em execução",
"admin.stuck.filterAll": "Tudo",
2026-08-16 18:18:39 +02:00
"admin.stuck.filterRunning": "Em execução",
"admin.stuck.filterFailed": "Falhado",
"admin.stuck.filterPending": "Pendente",
2026-08-16 18:18:39 +02:00
"admin.stuck.filterCompleted": "Concluído",
"admin.stuck.colId": "ID",
"admin.stuck.colCompany": "Empresa",
"admin.stuck.colStatus": "Estado",
"admin.stuck.colProgress": "Progresso",
"admin.stuck.colUpdated": "Atualizado",
"admin.stuck.colError": "Erro",
"admin.stuck.loadFailed": "Falha ao carregar trabalhos",
"admin.stuck.cleanupFailed": "Falha na limpeza",
2026-08-16 18:18:39 +02:00
"admin.support.knowledgeLink": "Conhecimento e resposta automática",
"admin.support.queueTitle": "Fila de tickets",
2026-08-16 18:18:39 +02:00
"admin.support.queueMeta": "{total} · âmbito {scope}",
"admin.support.queueMetaStatus": "· estado {status}",
"admin.support.ticketCountOne": "{count} ticket",
"admin.support.ticketCountMany": "{count} tickets",
"admin.support.statusAll": "Tudo statuses",
"admin.support.scopeAll": "Tudo tickets",
"admin.support.scopeInbox": "Caixa de entrada",
"admin.support.scopeMine": "Meus",
2026-08-16 18:18:39 +02:00
"admin.support.scopeUnassigned": "Não atribuídos",
"admin.support.flagAny": "Qualquer estado auto",
"admin.support.flagNeedsHuman": "Precisa de humano",
"admin.support.flagAiDraft": "Rascunho IA",
"admin.support.colSubject": "Assunto",
"admin.support.colStatus": "Estado",
"admin.support.colAuto": "Auto",
"admin.support.colPriority": "Prioridade",
2026-08-16 18:18:39 +02:00
"admin.support.colAssignee": "Atribuído",
"admin.support.colCompany": "Empresa",
"admin.support.colUpdated": "Atualizado",
2026-08-16 18:18:39 +02:00
"admin.support.colActions": "Ações",
"admin.support.autoOff": "Auto desligado",
"admin.support.claim": "Assumir",
"admin.support.claimAria": "Assumir ticket {subject}",
2026-08-16 18:18:39 +02:00
"admin.support.unassigned": "Não atribuído",
"admin.support.you": "Você",
"admin.support.assigned": "Atribuído",
"admin.support.loadQueueFailed": "Falha ao carregar a fila de suporte",
"admin.support.claimFailed": "Falha ao assumir o ticket",
"admin.support.ticketFallbackTitle": "Suporte ticket",
2026-08-16 18:18:39 +02:00
"admin.support.ticketMeta": "{company} · {requester}",
"admin.support.ticketMetaFallback": "Thread de revisão da equipa",
"admin.support.companyFallback": "Empresa",
"admin.support.requesterFallback": "requerente",
"admin.support.backQueue": "Fila",
"admin.support.resolve": "Resolver",
"admin.support.markPending": "Marcar pendente",
"admin.support.reopen": "Reabrir",
2026-08-16 18:18:39 +02:00
"admin.support.assigneeLabel": "Atribuído:",
"admin.support.unassign": "Remover atribuição",
"admin.support.assignToStaff": "Atribuir à equipa",
"admin.support.apply": "Aplicar",
2026-08-16 18:18:39 +02:00
"admin.support.autoPanelTitle": "Auto-match / assistência IA",
"admin.support.autoPanelDesc": "Resultado só para a equipa do match FAQ e rascunho/envio IA. Os clientes nunca veem rascunhos.",
"admin.support.autoDisabledBadge": "Auto desativado",
"admin.support.autoStatusLabel": "Estado:",
2026-08-16 18:18:39 +02:00
"admin.support.lastAttempt": "Última tentativa:",
"admin.support.reenableAuto": "Reativar auto",
"admin.support.disableAuto": "Desativar auto neste ticket",
"admin.support.aiDraftTitle": "Rascunho IA (aprovar ou editar)",
2026-08-16 18:18:39 +02:00
"admin.support.aiDraftDesc": "O modo só-rascunho deixou uma nota interna. Edite se necessário e envie ao cliente — ou descarte e continue manualmente.",
"admin.support.confidence": "Confiança {value}",
"admin.support.statusAfterSend": "Estado após o envio",
"admin.support.approveSend": "Aprovar e enviar",
"admin.support.discardDraft": "Descartar rascunho",
2026-08-16 18:18:39 +02:00
"admin.support.threadTitle": "Tópico",
"admin.support.threadMeta": "{count} · última atividade {when}",
"admin.support.messageCountOne": "{count} mensagem",
"admin.support.messageCountMany": "{count} mensagens",
"admin.support.replyTitle": "Responder",
2026-08-16 18:18:39 +02:00
"admin.support.replyDesc": "As respostas públicas notificam o cliente. As notas internas ficam só para a equipa. O estado predefinido após uma resposta pública é pendente.",
"admin.support.internalNote": "Nota interna (não visível ao cliente)",
"admin.support.setStatus": "Definir estado",
2026-08-16 18:18:39 +02:00
"admin.support.statusDefault": "Predefinição",
"admin.support.saveNote": "Guardar nota",
"admin.support.sendReply": "Enviar resposta",
"admin.support.replyAndResolve": "Responder e resolver",
2026-08-16 18:18:39 +02:00
"admin.support.closedBanner": "Este ticket está fechado. Reabra-o para continuar a conversa.",
"admin.support.priorityMeta": "prioridade {priority}",
2026-08-16 18:18:39 +02:00
"admin.support.authorAiDraft": "Rascunho IA (só equipa)",
"admin.support.authorInternal": "Nota interna",
"admin.support.authorStaff": "Equipa",
"admin.support.authorCustomer": "Cliente",
"admin.support.flash.noteSaved": "Nota interna guardada.",
"admin.support.flash.replySent": "Resposta enviada.",
"admin.support.flash.resolved": "Ticket marcado como resolvido.",
2026-08-16 18:18:39 +02:00
"admin.support.flash.pending": "Ticket marcado como pendente (à espera do cliente).",
"admin.support.flash.reopened": "Ticket reaberto.",
"admin.support.flash.statusSet": "Estado do ticket definido para {status}.",
2026-08-16 18:18:39 +02:00
"admin.support.flash.autoDisabled": "Respostas automáticas desativadas neste ticket.",
"admin.support.flash.autoEnabled": "Respostas automáticas reativadas neste ticket.",
"admin.support.loadTicketFailed": "Falha ao carregar o ticket",
"admin.support.replyFailed": "Falha ao enviar a resposta",
"admin.support.statusFailed": "Falha ao atualizar o estado",
2026-08-16 18:18:39 +02:00
"admin.support.unassignFailed": "Falha ao remover a atribuição",
"admin.support.assignFailed": "Falha ao atribuir o ticket",
2026-08-16 18:18:39 +02:00
"admin.support.autoFailed": "Falha ao atualizar a resposta automática",
"admin.support.approveFailed": "Falha ao aprovar o rascunho IA",
"admin.support.discardFailed": "Falha ao descartar o rascunho IA",
"admin.settings.sourceResolved": "Resolvido a partir de {sources}",
2026-08-16 18:18:39 +02:00
"admin.settings.sourceUpdated": " · atualizado {when}",
"admin.settings.updatedAt": "Atualizado {when}",
2026-08-16 18:18:39 +02:00
"admin.settings.tenantDesc": "As chaves de IA e o e-mail de marketing da empresa ficam em Integrações. Os segredos de sessão e encriptação ficam no ambiente do servidor e não se editam aqui.",
"admin.settings.perCompanyAiEmail": "IA/e-mail por empresa —",
"admin.settings.plansCredits": "Planos e créditos —",
"admin.settings.fromDatabase": "Da base de dados",
"admin.settings.fromEnvironment": "Do ambiente",
"admin.settings.sourceBadge": "Origem: {source}",
"admin.settings.storedKey": "Chave guardada: {masked}",
2026-08-16 18:18:39 +02:00
"admin.settings.enableRole": "Ativar esta função",
"admin.settings.clearApiKey": "Limpar chave API guardada",
2026-08-16 18:18:39 +02:00
"admin.settings.apiKeyKeepPlaceholder": "•••• deixe em branco para manter",
"admin.settings.apiKeyNewPlaceholder": "sk-… ou local",
"admin.settings.smtpCardTitle": "Plataforma SMTP",
2026-08-16 18:18:39 +02:00
"admin.settings.smtpCardDesc": "Usado para convites de palavra-passe e e-mail de saída da plataforma. Resend/SMTP de marketing continua por empresa em Integrações → Email.",
"admin.settings.smtpBadgeOn": "SMTP ativado",
"admin.settings.smtpBadgeOff": "SMTP desativado",
"admin.settings.enableSmtp": "Ativar SMTP da plataforma",
"admin.settings.storedPassword": "Palavra-passe guardada: {masked}",
"admin.settings.clearSmtpPassword": "Limpar palavra-passe SMTP guardada",
"admin.settings.sendTestEmail": "Enviar e-mail de teste",
"admin.settings.enableGoogle": "Ativar Google OAuth",
"admin.settings.clientSecret": "Segredo do cliente",
"admin.settings.leaveBlankKeep": "(deixe em branco para manter)",
"admin.settings.storedSecret": "Segredo guardado: {masked}",
"admin.settings.clearClientSecret": "Limpar segredo de cliente guardado",
2026-08-16 18:18:39 +02:00
"admin.settings.eprelDesc": "Dados públicos gratuitos de rótulos energéticos da UE durante o processamento. Ativo por predefinição em todos os planos — sem ativação nem upgrade pago. Use os controlos só para desativar ou afinar o cliente.",
"admin.settings.optionalKeySaved": "Chave API opcional guardada",
2026-08-16 18:18:39 +02:00
"admin.settings.noApiKeyNeeded": "Não é necessária chave API",
"admin.settings.optionalApiKey": "Chave API opcional",
2026-08-16 18:18:39 +02:00
"admin.settings.optionalApiKeySavedHint": "(guardado — leave blank to keep)",
"admin.settings.optionalApiKeyPublicHint": "(a API pública funciona sem ela)",
"admin.settings.clearEprelKey": "Limpar chave API EPREL guardada",
2026-08-16 18:18:39 +02:00
"admin.settings.pineconeDesc": "Sugestões opcionais de categoria vetorial durante o processamento. Valores do ambiente do host são usados quando estes campos ficam vazios.",
"admin.settings.apiKeyConfigured": "Chave API configurada",
"admin.settings.noApiKey": "Sem chave API",
"admin.settings.apiKeyLabel": "Chave API",
"admin.settings.clearPineconeKey": "Limpar chave API Pinecone guardada",
2026-08-16 18:18:39 +02:00
"admin.settings.stripeDesc": "Substituições opcionais da configuração Stripe do servidor. Prefira campos de palavra-passe; os valores não voltam a ser mostrados após guardar.",
"admin.settings.stripeMock": "Forçar modo mock Stripe (apenas não produção — desativa cobranças reais)",
"admin.settings.webhookSecret": "Segredo do webhook",
"admin.settings.clearStripeSecret": "Limpar chave secreta Stripe",
"admin.settings.clearStripeWebhook": "Limpar segredo de webhook Stripe",
2026-08-16 18:18:39 +02:00
"admin.settings.feedAllowlistDesc": "Hosts/CIDR separados por vírgulas permitidos para URL de feeds privadas.",
"admin.settings.adminsDesc": "Administradores da plataforma neste deployment",
"admin.settings.onboardingTitle": "Ajudas de onboarding de admins",
2026-08-16 18:18:39 +02:00
"admin.settings.onboardingDesc": "Use e-mails de convite set-password para integrar utilizadores elegíveis que ainda precisam de palavra-passe.",
"admin.settings.sendInvites": "Enviar e-mails set-password",
2026-08-16 18:18:39 +02:00
"admin.settings.adminStatusBefore": "Os admins da plataforma não podem ser criados neste ecrã. Confirme o acesso na",
"admin.settings.adminStatusAfter": ", ou peça a um admin/ops existente para promover a sua conta.",
"admin.settings.loadUsersFailed": "Falha ao carregar utilizadores admin",
"admin.settings.sendFailed": "Falha no envio",
2026-08-16 18:18:39 +02:00
"admin.settings.saveMailFailed": "Não foi possível guardar as definições de correio",
"admin.settings.smtpNotConfigured": "O SMTP não está configurado — ative e guarde primeiro as definições de correio.",
"admin.settings.smtpTestFailed": "Teste SMTP falhou",
2026-08-16 18:18:39 +02:00
"admin.settings.testEmailFailed": "Não foi possível enviar o e-mail de teste",
"admin.settings.saveIntegrationFailed": "Não foi possível guardar as definições de integração",
"admin.settings.aiSaved": "Definições de IA {label} guardadas. As chaves API nunca são mostradas de novo.",
"admin.settings.aiSaveFailed": "Não foi possível guardar as definições de IA {label}",
"admin.settings.aiTestOk": "{label}: ligação OK",
"admin.settings.aiTestSkipped": "{label}: ignorado — guarde credenciais (e ative a função) para testar.",
"admin.settings.aiTestFailed": "{label}: falha na ligação",
"admin.settings.aiTestError": "Não foi possível testar a ligação {label}",
"admin.settings.aiRole.processing.label": "Processamento",
2026-08-16 18:18:39 +02:00
"admin.settings.aiRole.processing.desc": "Chat/completions do pipeline de produtos (títulos, descrições, enhance).",
"admin.settings.aiRole.vectorization.label": "Vetorização",
"admin.settings.aiRole.vectorization.desc": "Embeddings para pesquisa / indexação Pinecone (alinhar dimensões do índice).",
"admin.settings.aiRole.docs_api.label": "Docs / API",
2026-08-16 18:18:39 +02:00
"admin.settings.aiRole.docs_api.desc": "Slot futuro de assistente docs/API — /docs Ask continua baseado em regras e nunca deve chamar este papel.",
"admin.settings.aiRole.support.label": "Suporte",
2026-08-16 18:18:39 +02:00
"admin.settings.aiRole.support.desc": "IA de fallback para auto-resposta de tickets — configure fornecedor/chave/modelo aqui; ative o envio em Conhecimento de suporte → Auto-resposta.",
"admin.settings.providerOption.openai": "OpenAI",
"admin.settings.providerOption.openrouter": "OpenRouter",
"admin.settings.providerOption.azure": "Azure OpenAI",
"admin.settings.providerOption.ollama": "Ollama",
"admin.settings.providerOption.custom": "Personalizado / outro",
"admin.support.title": "Centro de suporte",
2026-08-16 18:18:39 +02:00
"admin.support.description": "Caixa de entrada da equipa — reivindique da fila, filtre por âmbito, abra tópicos e resolva",
"admin.support.unavailable": "A fila de suporte não está disponível. Contacte o administrador da plataforma se persistir.",
"admin.support.noTickets": "Não há tickets nesta fila.",
"admin.support.ticketNotFound": "Ticket não encontrado.",
"admin.support.notAvailable": "O suporte não está disponível neste deployment.",
"admin.support.loadFailed": "Não foi possível carregar este ticket.",
"admin.support.noMessages": "Ainda sem mensagens.",
2026-08-16 18:18:39 +02:00
"admin.support.queueScopeAria": "Âmbito da fila",
"admin.support.statusFilterAria": "Filtro de estado",
"admin.support.autoAssistFilterAria": "Filtro de autoajuda",
"admin.support.searchPlaceholder": "Pesquisar assunto, e-mail ou empresa",
"admin.support.searchAria": "Pesquisar tickets",
2026-08-16 18:18:39 +02:00
"admin.support.assignStaffAria": "Atribuir à equipa",
"admin.support.aiDraftAria": "Rascunho IA",
2026-08-16 18:18:39 +02:00
"admin.support.replyPlaceholder": "Escrever uma resposta…",
"admin.support.replyAria": "Corpo da resposta",
"admin.knowledge.eyebrow": "Admin da plataforma",
"admin.knowledge.title": "Conhecimento de suporte",
2026-08-16 18:18:39 +02:00
"admin.knowledge.description": "Estruture artigos de ajuda para correspondência automática de FAQ. Agentes de conteúdo preenchem corpos — mantenha os factos precisos.",
"admin.knowledge.notReady": "O conhecimento de suporte não está pronto",
"admin.knowledge.noTemplates": "Sem modelos de resposta",
2026-08-16 18:18:39 +02:00
"admin.knowledge.articleDesc": "O corpo Markdown admite imagens via carregamento seguro. Não invente factos de produto — deixe marcadores para agentes de conteúdo.",
"admin.knowledge.templateDesc": "Marcadores permitidos: subject, category.",
2026-08-16 18:18:39 +02:00
"admin.knowledge.searchPlaceholder": "Pesquisar título, slug, palavras-chave…",
"admin.knowledge.searchAria": "Pesquisar artigos",
2026-08-16 18:18:39 +02:00
"admin.knowledge.publishFilterAria": "Filtro de estado de publicação",
"admin.knowledge.deleteArticleAria": "Eliminar artigo",
"admin.knowledge.deleteTemplateAria": "Eliminar modelo",
"admin.support.autoReplyStatus.matched": "FAQ correspondente",
"admin.support.autoReplyStatus.aiDraft": "Rascunho IA pendente",
"admin.support.autoReplyStatus.aiSent": "Resposta IA enviada",
"admin.support.autoReplyStatus.skipped": "Auto ignorado",
"admin.support.autoReplyStatus.failed": "Auto falhou",
"admin.support.autoReplyStatus.handedOff": "Precisa de humano",
"admin.support.autoReplyStatus.none": "Sem tentativa auto",
"admin.support.autoSource.kb": "Base de conhecimento",
"admin.support.autoSource.template": "Modelo",
"admin.support.autoSource.ai": "Assistido por IA",
"admin.support.autoSource.automated": "Automatizado",
"admin.knowledge.categoriesHeading": "Categorias",
2026-08-16 18:18:39 +02:00
"admin.knowledge.categoriesHint": "Buckets vazios preparados para agentes de conteúdo.",
"admin.knowledge.showingArticles": "A mostrar {shown} artigos (corpo carrega ao editar).",
"admin.knowledge.showingArticlesOf": "A mostrar {shown} de {total} artigos (corpo carrega ao editar).",
"admin.knowledge.templatesHint": "Respostas prontas com marcadores opcionais {{subject}} / {{category}}.",
2026-08-16 18:18:39 +02:00
"admin.knowledge.faqAutoMatchTitle": "Correspondência FAQ automática",
"admin.knowledge.faqAutoMatchDesc": "Correspondência de palavras-chave na criação do ticket. Limiar predefinido 0,78 (intervalo 0,50–0,95).",
"admin.knowledge.aiFallbackTitle": "Fallback de IA",
2026-08-16 18:18:39 +02:00
"admin.knowledge.aiFallbackDesc": "Usado quando a correspondência FAQ está abaixo do limiar. As respostas usam o papel de IA da plataforma {role}.",
"admin.knowledge.noModel": "sem modelo",
2026-08-16 18:18:39 +02:00
"admin.knowledge.keyLast4": "chave …{last4}",
"admin.knowledge.sourceLabel": "origem {source}",
2026-08-16 18:18:39 +02:00
"admin.knowledge.apiKeyNote": "A chave API vem sempre deste papel; os overrides acima só alteram fornecedor / modelo / URL base.",
"admin.knowledge.saveAutoSettings": "Guardar definições de auto-resposta",
"admin.knowledge.insertImage": "Inserir imagem",
2026-08-16 18:18:39 +02:00
"admin.knowledge.uploading": "A carregar…",
"admin.knowledge.imageUploadHint": "PNG / JPEG / WebP, máx. 2 MiB. Guardado em UPLOAD_DIR/support-kb (URL pública HMAC).",
"admin.knowledge.unavailableMsg": "O conhecimento de suporte não está disponível neste deployment. Contacte o administrador da plataforma.",
"admin.knowledge.loadFailed": "Falha ao carregar o conhecimento de suporte",
"admin.knowledge.loadArticleFailed": "Falha ao carregar o artigo",
"admin.knowledge.loadTemplateFailed": "Falha ao carregar o modelo",
"admin.knowledge.saveArticleFailed": "Falha ao guardar o artigo",
"admin.knowledge.saveTemplateFailed": "Falha ao guardar o modelo",
"admin.knowledge.deleteArticleFailed": "Falha ao eliminar o artigo",
"admin.knowledge.deleteTemplateFailed": "Falha ao eliminar o modelo",
2026-08-16 18:18:39 +02:00
"admin.knowledge.saveAutoFailed": "Falha ao guardar as definições de auto-resposta",
"admin.knowledge.uploadImageFailed": "Falha ao carregar a imagem",
"admin.translations.eyebrow": "Plataforma",
2026-08-16 18:18:39 +02:00
"admin.translations.title": "Traduções",
"admin.translations.description": "Reveja a cobertura da UI do painel e edite packs de locale baseados em ficheiros.",
2026-08-16 18:18:39 +02:00
"admin.translations.unavailable": "Traduções indisponíveis",
"admin.translations.sourceOfTruth": "Fonte da verdade",
"admin.translations.sourceOfTruthLabel": "Fonte da verdade:",
"admin.translations.colLocale": "Locale",
"admin.translations.colTranslated": "Traduzido",
"admin.translations.colMissing": "Em falta",
"admin.translations.colStatus": "Estado",
"admin.translations.badgeBase": "Base",
"admin.translations.badgeComplete": "Completo",
2026-08-16 18:18:39 +02:00
"admin.translations.badgeUnregistered": "Não registado",
"admin.translations.badgeGaps": "Lacunas",
"admin.translations.language": "Idioma",
"admin.translations.show": "Mostrar",
2026-08-16 18:18:39 +02:00
"admin.translations.filterMissing": "Só em falta",
"admin.translations.filterTranslated": "Só traduzidos",
"admin.translations.filterAll": "Todas as chaves",
"admin.translations.search": "Pesquisar",
2026-08-16 18:18:39 +02:00
"admin.translations.searchPlaceholder": "Chave ou texto…",
"admin.translations.noKeysMatch": "Nenhuma chave corresponde",
"admin.translations.badgeMissing": "Em falta",
2026-08-16 18:18:39 +02:00
"admin.translations.badgeUnsaved": "Não guardado",
"admin.translations.english": "Inglês",
"admin.bootstrap.title": "Acesso admin bootstrap",
2026-08-16 18:18:39 +02:00
"admin.bootstrap.description": "Confirme se a sua conta já tem acesso de admin da plataforma. Novos admins devem ser concedidos por um administrador existente.",
"admin.bootstrap.statusTitle": "Estado de admin da plataforma",
2026-08-16 18:18:39 +02:00
"admin.bootstrap.statusDesc": "O acesso de admin da plataforma é concedido por um administrador existente. Não há bootstrap self-serve para esta função.",
"admin.bootstrap.alreadyAdmin": "Já tem acesso de admin da plataforma.",
"admin.bootstrap.signedInAs": "Sessão iniciada como {email}. Abra o painel admin para continuar.",
"admin.bootstrap.signedInAsShort": "Sessão iniciada como {email}",
"admin.bootstrap.notAdminTitle": "Não é admin da plataforma",
"admin.bootstrap.notAdminMsg": "A sua conta está com sessão iniciada mas não está marcada como admin da plataforma. Peça a um admin existente que conceda acesso, depois termine a sessão e inicie novamente.",
"admin.bootstrap.goToPanel": "Ir para o painel admin",
"admin.bootstrap.loadFailed": "Falha ao carregar o perfil",
2026-08-16 18:18:39 +02:00
"admin.migrate.title": "Migração de organização",
"admin.migrate.description": "Esta ferramenta de migração está retirada e não altera quaisquer dados.",
"admin.migrate.notAvailable": "Não disponível",
"admin.migrate.body": "A migração de organização do fornecedor de identidade anterior já não é necessária. Empresas e auth local são geridas em Utilizadores e organizações.",
"admin.migrate.hint": "Se abriu isto a partir de um marcador antigo, continue com Utilizadores e organizações, Faturação da plataforma ou Produtos bloqueados.",
"admin.migrate.adminHome": "Início admin",
"admin.migrate.users": "Utilizadores",
2026-08-16 18:18:39 +02:00
"admin.redirect.diagnostics": "A redirecionar para Diagnósticos…",
"admin.redirect.stuck": "A redirecionar para Produtos bloqueados…",
"common.refresh": "Atualizar",
"common.delete": "Eliminar",
"common.clearSearch": "Limpar pesquisa",
2026-08-16 18:18:39 +02:00
"common.loading": "A carregar…",
"common.never": "Nunca",
"common.back": "Voltar",
2026-08-16 18:18:39 +02:00
"common.startOver": "Começar de novo",
"common.create": "Criar",
2026-08-16 18:18:39 +02:00
"common.required": "Obrigatório",
"common.actions": "Ações",
"common.status": "Estado",
"common.nameCol": "Nome",
"common.products": "Produtos",
"common.more": "+{count} mais",
"feeds.title": "Os seus feeds",
2026-08-16 18:18:39 +02:00
"feeds.loadingDesc": "A carregar os seus feeds de fornecedor…",
"feeds.desc": "{page} nesta página · {total} feeds no total — URL CSV/XML de fornecedor e carregamentos. Ligue a partir de Lojas para opções guiadas.",
"feeds.storesHub": "Centro de lojas",
"feeds.addFeed": "Adicionar Feed",
"feeds.searchPlaceholder": "Pesquisar feeds...",
"feeds.emptyTitle": "Ainda sem feeds de produtos",
2026-08-16 18:18:39 +02:00
"feeds.emptyMessage": "Ligue um URL CSV/XML de fornecedor ou carregue um ficheiro para sincronizar produtos no seu catálogo.",
"feeds.connectFeed": "Ligar feed",
"feeds.uploadCsvCta": "Carregar CSV",
"feeds.noMatchTitle": "Sem feeds correspondentes",
"feeds.noMatchMessage": "Experimente outro termo de pesquisa, ou limpe a pesquisa para ver todos os feeds.",
"feeds.col.source": "Origem",
"feeds.col.mapping": "Mapeamento",
2026-08-16 18:18:39 +02:00
"feeds.col.lastData": "Última sync",
"feeds.copyUrl": "Copiar URL",
"feeds.fieldsMapped": "{count} campos",
"feeds.fieldsMappedTitle": "{count} campo mapeado",
"feeds.fieldsMappedTitlePlural": "{count} campos mapeados",
"feeds.mappingsSaved": "Mapeamentos de campos guardados",
"feeds.mapped": "Mapeado",
2026-08-16 18:18:39 +02:00
"feeds.notMapped": "Não mapeado",
"feeds.notMappedTitle": "Ainda sem mapeamentos de campos — abra Mapear para configurar",
"feeds.productsFromFeed": "{count} produtos deste feed",
"feeds.noProductsYet": "Ainda sem produtos importados deste feed",
2026-08-16 18:18:39 +02:00
"feeds.syncing": "A sincronizar…",
"feeds.syncingShort": "A sincronizar",
"feeds.syncingHint": "Pode demorar alguns minutos em feeds grandes",
"feeds.liveSync": "Sync do feed",
2026-08-16 18:18:39 +02:00
"feeds.productData": "Dados do catálogo",
"feeds.mapFields": "Mapear campos",
"feeds.map": "Mapear",
"feeds.sync": "Sincronizar",
"feeds.syncNow": "Sincronizar agora",
2026-08-16 18:18:39 +02:00
"feeds.syncManualTitle": "Executar uma sincronização pontual agora. A sync automática usa o intervalo definido ao editar o feed.",
"feeds.syncInProgress": "Sync em curso",
"feeds.addTitle": "Adicionar Feed",
2026-08-16 18:18:39 +02:00
"feeds.addDesc": "Ligue um URL de feed de produtos ou carregue um CSV. Use as amostras abaixo para corresponder à estrutura esperada.",
"feeds.field.name": "Nome",
"feeds.field.namePlaceholder": "O meu feed de produtos",
"feeds.tab.url": "URL do feed",
"feeds.tab.file": "Ficheiro CSV",
"feeds.field.url": "URL do feed",
2026-08-16 18:18:39 +02:00
"feeds.field.urlPlaceholder": "https://…",
"feeds.field.type": "Tipo",
"feeds.field.file": "Ficheiro CSV",
2026-08-16 18:18:39 +02:00
"feeds.fileHint": "Máx. 5 MiB. Após criar, mapeie colunas e depois sincronize — mesmo fluxo dos feeds por URL.",
"feeds.field.interval": "Intervalo de sync automática (minutos)",
"feeds.field.intervalHint": "Com que frequência o Descrybe deve puxar este feed automaticamente enquanto estiver ativo. Use Sync na lista para um puxão pontual — isso não altera este agendamento.",
"feeds.createFeed": "Criar feed",
"feeds.editTitle": "Editar Feed",
2026-08-16 18:18:39 +02:00
"feeds.editDesc": "Atualize nome, tipo, agendamento de sync automática ou URL de origem. Sync na lista de feeds executa um puxão pontual.",
"feeds.csvSource": "Origem CSV",
"feeds.uploadedCsv": "CSV carregado",
"feeds.replaceFileHint": "Para substituir o ficheiro, crie um novo feed. A sync volta a ler o carregamento guardado.",
2026-08-16 18:18:39 +02:00
"feeds.csvTypeLocked": "Os feeds CSV carregados mantêm o tipo CSV.",
"feeds.saveChanges": "Guardar alterações",
"feeds.historyTitle": "Histórico de sync",
"feeds.historyDesc": "Trabalhos de sync recentes de “{name}”.",
"feeds.historyLastSynced": "Última sync bem-sucedida {relative} ({absolute}).",
"feeds.historyNeverSynced": "Ainda sem sync bem-sucedida.",
2026-08-16 18:18:39 +02:00
"feeds.historyLoading": "A carregar histórico de sync…",
"feeds.historyEmpty": "Ainda sem trabalhos de sync.",
"feeds.history.started": "Iniciado",
2026-08-16 18:18:39 +02:00
"feeds.history.completed": "Concluído",
"feeds.loadFailed": "Falha ao carregar feeds",
2026-08-16 18:18:39 +02:00
"feeds.copyFailed": "Não foi possível copiar o URL",
"feeds.created": "Feed criado",
"feeds.updated": "Feed atualizado.",
"feeds.mapBeforeSync": "Mapeie os campos antes de sincronizar este feed.",
"feeds.activateBeforeSync": "Ative o feed antes de sincronizar.",
2026-08-16 18:18:39 +02:00
"feeds.syncFinished": "Sincronização concluída",
"feeds.viewProducts": "Ver produtos",
"feeds.processing": "Processamento",
2026-08-16 18:18:39 +02:00
"feeds.syncFailed": "Falha na sincronização",
"feeds.statusUpdateFailed": "Não foi possível atualizar o estado",
"feeds.deleteConfirm": "Eliminar o feed “{name}”? Isto não pode ser anulado.",
"feeds.deleted": "Feed eliminado.",
2026-08-16 18:18:39 +02:00
"feeds.deleteFailed": "Não foi possível eliminar o feed",
"feeds.historyLoadFailed": "Não foi possível carregar o histórico de sync",
"feeds.ftpUnsupported": "A sync não está disponível para esta ligação de fornecedor. Carregue um ficheiro ou use um URL HTTPS do fornecedor.",
"feeds.ftpUnsupportedShort": "Sync FTP não suportada",
"feeds.ftpBadge": "FTP",
2026-08-16 18:18:39 +02:00
"feeds.ftpMigrateBanner": "Alguns feeds ainda usam FTP/FTPS. O Descrybe não consegue obter esses links. Mude para um URL HTTPS público, adicione um feed CSV ou carregue em Uploads.",
"feeds.ftpUploadCta": "Ir para Uploads",
"feeds.ftpHttpsCta": "Adicionar feed HTTPS",
"feeds.ftpCsvCta": "Carregar feed CSV",
"feeds.status.mappingIncomplete": "Mapeamento incompleto",
"feeds.status.readyForMapping": "Pronto para mapear",
"feeds.status.mapped": "Mapeado",
"feeds.status.active": "Ativo",
"feeds.status.inactive": "Inativo",
"feeds.status.error": "Erro",
"feeds.status.unknown": "Desconhecido",
2026-08-16 18:18:39 +02:00
"feeds.actions.menu": "Ações do feed",
"feeds.actions.menuSyncing": "Ações do feed (sync em curso)",
"feeds.actions.editFeed": "Editar Feed",
"feeds.actions.editMapping": "Editar mapeamento",
"feeds.actions.syncNow": "Sincronizar agora",
2026-08-16 18:18:39 +02:00
"feeds.actions.syncInProgress": "Sync em curso…",
"feeds.actions.activateToSync": "Ativar feed para sincronizar",
2026-08-16 18:18:39 +02:00
"feeds.actions.viewHistory": "Ver histórico de sync",
"feeds.actions.deactivate": "Desativar feed",
"feeds.actions.activate": "Ativar feed",
"feeds.actions.delete": "Eliminar feed",
"feeds.stats.totalFeeds": "Total de feeds",
2026-08-16 18:18:39 +02:00
"feeds.stats.activeMapped": "{active} ativos · {mapped} mapeados",
"feeds.stats.activeOnly": "{active} ativos",
"feeds.stats.totalProducts": "Produtos importados",
2026-08-16 18:18:39 +02:00
"feeds.stats.acrossFeeds": "Linhas em bruto (não catálogo + fila)",
"feeds.stats.processed": "No catálogo",
"feeds.stats.readyCatalog": "Linhas do catálogo — não uma parte dos importados",
"feeds.stats.unprocessed": "A aguardar processamento",
2026-08-16 18:18:39 +02:00
"feeds.stats.waiting": "Fila em bruto — não uma parte dos importados",
"feeds.format.howTo": "Como estruturar o seu feed",
2026-08-16 18:18:39 +02:00
"feeds.format.required": "Obrigatório:",
"feeds.preview.title": "Pré-visualização da origem do feed",
"feeds.preview.truncated": "Truncado",
2026-08-16 18:18:39 +02:00
"feeds.preview.refresh": "Atualizar pré-visualização",
"feeds.preview.copy": "Copiar pré-visualização",
"feeds.preview.loading": "A carregar pré-visualização…",
"feeds.preview.empty": "Extraia o esquema para pré-visualizar a origem do feed.",
"feeds.schema.search": "Pesquisar campos…",
"feeds.schema.fieldName": "Nome do campo",
"feeds.schema.sourcePath": "Caminho de origem",
"feeds.schema.confirm": "Confirmar",
"feeds.schema.apply": "Aplicar",
"feeds.preflight.missingItemPath": "Selecione um caminho de elemento de produto antes de sincronizar.",
"feeds.preflight.emptyMappings": "Mapeie pelo menos um campo de origem antes de sincronizar.",
2026-08-16 18:18:39 +02:00
"feeds.preflight.missingRequired": "Mapeie os campos obrigatórios antes de sincronizar: {fields}.",
"feeds.preflight.unknownSource": "Algumas origens mapeadas não foram encontradas no esquema extraído: {fields}{more}. Volte a extrair ou corrija caminhos antes de confiar nos valores de amostra.",
"feeds.preflight.emptySample": "Os campos obrigatórios têm valores de amostra vazios: {fields}. Verifique as colunas de origem antes de uma sync completa.",
"feeds.preflight.fix": "Corrija os mapeamentos de campos antes de sincronizar.",
"mapping.title": "Mapeamento de Feed",
"mapping.titleNamed": "Mapear: {name}",
"mapping.description": "Selecione o elemento de produto repetido, extraia os campos de origem e mapeie-os para os campos de produto Descrybe.",
"mapping.autoMap": "Mapear automaticamente",
"mapping.fuzzy": "{count} aproximado(s)",
"mapping.extractSchema": "Extrair esquema",
"mapping.backToFeeds": "Voltar aos Feeds",
"mapping.ftpStillEdit": "{message} Ainda pode editar os mapeamentos aqui.",
"mapping.ftpUploadCta": "Ir para Uploads",
"mapping.ftpHttpsCta": "Adicionar feed HTTPS",
"mapping.ftpCsvCta": "Carregar feed CSV",
2026-08-16 18:18:39 +02:00
"mapping.loading": "A carregar detalhes do feed…",
"mapping.step1": "Selecionar elemento de produto",
"mapping.step2": "Mapear campos",
"mapping.step1Heading": "Passo 1: Selecionar elemento de produto",
2026-08-16 18:18:39 +02:00
"mapping.csvHint": "Os feeds CSV usam cabeçalhos de coluna como campos de origem. Extraia o esquema para carregar as colunas e depois continue para as mapear.",
"mapping.howToSelect": "Como selecionar o elemento de produto:",
"mapping.howToHint": "Guia opcional",
2026-08-16 18:18:39 +02:00
"mapping.howTo.1": "Extraia o esquema ou clique numa etiqueta repetida na pré-visualização",
"mapping.howTo.2": "Cada elemento deve conter os detalhes de um único produto",
"mapping.howTo.3": "Confirme o caminho (por exemplo",
"mapping.howTo.4": "Continue para mapear os campos de origem para os campos de produto",
"mapping.productElementPath": "Caminho do elemento de produto",
"mapping.pathPlaceholder": "ex. rss/channel/item ou products/product",
2026-08-16 18:18:39 +02:00
"mapping.continue": "Continuar →",
"mapping.continueFields": "Continuar para o mapeamento de campos →",
"mapping.discovered": "Detetados {fields} campos de origem a partir de {rows} linha(s) de amostra.",
2026-08-16 18:18:39 +02:00
"mapping.suggestionsCount": "· {count} sugestão(ões) de mapeamento automático",
"mapping.step2Heading": "Passo 2: Mapear campos",
2026-08-16 18:18:39 +02:00
"mapping.requiredFieldsBadge": "{count} campos obrigatórios",
"mapping.unmappedRequired": "{count} obrigatório(s) por mapear",
"mapping.sourceFieldsBadge": "{count} campos de origem",
"mapping.suggestedBadge": "{count} sugerido(s)",
2026-08-16 18:18:39 +02:00
"mapping.step2Help": "Mapeie colunas de origem ou nós XPath para os seus campos de produto. Os campos obrigatórios estão marcados com *. Passe o rato sobre o ícone de ajuda para uma dica rápida do glossário.",
"mapping.requiredFields": "Campos obrigatórios",
"mapping.requiredMapped": "· {mapped}/{total} mapeados",
"mapping.requiredProgressDone": "Todos os campos obrigatórios mapeados — pronto para o passo seguinte.",
"mapping.requiredProgressHint": "Os campos marcados com * devem ser mapeados antes de este feed poder sincronizar produtos.",
2026-08-16 18:18:39 +02:00
"mapping.requiredProgressAria": "Progresso dos campos obrigatórios: {mapped} de {total} mapeados",
"mapping.nextAfterSaveReady": "Mappings saved. Next, sync a small sample to check products look right.",
"mapping.nextAfterSaveIncomplete": "Mappings saved. Finish the remaining required fields, then sync a sample.",
"mapping.nextCtaSyncSample": "Sync + process sample",
"mapping.nextCtaFinishRequired": "Show missing required fields",
2026-08-16 18:18:39 +02:00
"mapping.highConfidence": "{count} mapeamento de alta confiança pronto",
"mapping.highConfidencePlural": "{count} mapeamentos de alta confiança prontos",
"mapping.highConfidenceHelp": "Correspondências exatas e de alias (por exemplo EAN → GTIN). Aplique todas, ou aceite chips por linha na tabela.",
"mapping.reviewMappings": "Rever mapeamentos",
"mapping.needItemPath": "Introduza um caminho de elemento de produto antes de mapear campos.",
"mapping.removeMapping": "Remover mapeamento",
"mapping.sourcePlaceholder": "nome da coluna ou xpath",
2026-08-16 18:18:39 +02:00
"mapping.processAfterSync": "Produtos a processar após a sincronização",
"mapping.noFuzzyLeft": "Não restam correspondências aproximadas para confirmar.",
"mapping.syncedQueued": "Feed sincronizado e {queued} produto(s) colocado(s) na fila para processamento{jobId}.",
"mapping.saveMappings": "Guardar mapeamentos",
"mapping.syncProcessSample": "Sincronizar + processar amostra",
"mapping.badgeCsv": "CSV",
2026-08-16 18:18:39 +02:00
"mapping.requiredAria": "Ajuda dos campos obrigatórios",
"mapping.applySuggestions": "Aplicar sugestões ({count})",
"mapping.confirmFuzzy": "Confirmar aproximados ({count})",
2026-08-16 18:18:39 +02:00
"mapping.fuzzyNeedConfirm": "{count} correspondência aproximada precisa de confirmação",
"mapping.fuzzyNeedConfirmPlural": "{count} correspondências aproximadas precisam de confirmação",
"mapping.fuzzyHelp": "As correspondências de nome com baixa confiança não são aplicadas automaticamente. Confirme aqui ou aceite por linha na tabela.",
"mapping.missingRequiredTitle": "Os campos obrigatórios ainda precisam de um mapeamento de origem:",
"mapping.applyTip": "Dica: aplique as sugestões acima — muitos campos obrigatórios correspondem a nomes de origem comuns.",
"mapping.formatLabel": "Formato:",
"mapping.itemPathLabel": "Caminho do item:",
"mapping.reExtract": "Reextrair",
"mapping.manualRows": "Linhas manuais",
"mapping.schemaTable": "Tabela de esquema",
"mapping.addField": "Adicionar campo",
2026-08-16 18:18:39 +02:00
"mapping.noSchemaYet": "Ainda não há esquema extraído.",
"mapping.orManualRows": "ou use as linhas manuais abaixo.",
"mapping.sourceField": "Campo de origem",
2026-08-16 18:18:39 +02:00
"mapping.selectSource": "Selecionar origem…",
"mapping.mapsTo": "Mapeia para",
"mapping.none": "Nenhum",
2026-08-16 18:18:39 +02:00
"mapping.backToItem": "← Voltar à seleção de item",
"mapping.unsaved": "Alterações por guardar",
"mapping.requiredFieldsColon": "Campos obrigatórios:",
"mapping.sampleOptions": "Opções de amostra",
"mapping.sampleSize": "Tamanho da amostra",
2026-08-16 18:18:39 +02:00
"mapping.noExactAlias": "Não há sugestões exatas/de alias para aplicar. Reveja as correspondências aproximadas abaixo.",
"mapping.noSuggestionsExtract": "Sem sugestões — extraia primeiro o esquema.",
"mapping.schemaExtracted": "Esquema extraído: {fields} campos a partir de {rows} linha(s) de amostra.",
"mapping.saved": "Mapeamentos de campos guardados{version}.",
"mapping.savedVersion": " (v{version})",
2026-08-16 18:18:39 +02:00
"mapping.syncNoProducts": "Sincronização concluída; sem produtos para processar.",
"mapping.jobSuffix": " (tarefa {jobId})",
"mapping.appliedReplace": "Aplicado(s) {count} mapeamento(s) {kind}.",
"mapping.appliedNew": "Aplicado(s) {count} novo(s) mapeamento(s) {kind} ({total} no total).",
2026-08-16 18:18:39 +02:00
"mapping.kindHighConfidence": "de alta confiança",
"mapping.kindFuzzy": "aproximado",
2026-08-16 18:18:39 +02:00
"mapping.fuzzyConfirmFlash": "{count} correspondência aproximada precisa de confirmação — use Confirmar aproximados abaixo ou chips por linha.",
"mapping.fuzzyConfirmFlashPlural": "{count} correspondências aproximadas precisam de confirmação — use Confirmar aproximados abaixo ou chips por linha.",
"mapping.formatHelp.title": "Como estruturar o seu feed",
2026-08-16 18:18:39 +02:00
"mapping.formatHelp.required": "Obrigatório:",
"mapping.formatHelp.requiredBody": "{gtin} (EAN/UPC), {title} (ou {name}), {brand}",
2026-08-16 18:18:39 +02:00
"mapping.formatHelp.https": "Use URLs HTTPS públicas para feeds remotos (não FTP nem localhost). O carregamento de CSV funciona para ficheiros locais.",
"mapping.formatHelp.specs": "Especificações como pares Etiqueta: valor (ex. {ram}). Dimensões: {height}, {width}, {depth}, {mass}",
"mapping.formatHelp.also": "Também suportado: preços, stock, imagens, categoria, garantia, ID EPREL, descrições HTML, imagens extra, URL de vídeo e mais — descarregue a amostra completa.",
"mapping.formatHelp.downloadXml": "Descarregar amostra XML",
"mapping.formatHelp.downloadCsv": "Descarregar amostra CSV",
"mapping.formatHelp.xmlExample": "Exemplo XML",
2026-08-16 18:18:39 +02:00
"mapping.formatHelp.csvExample": "Exemplo CSV (cabeçalho + linhas)",
"mapping.sourcePreview.title": "Pré-visualização da origem do feed",
"mapping.sourcePreview.truncated": "Truncado",
2026-08-16 18:18:39 +02:00
"mapping.sourcePreview.refresh": "Atualizar pré-visualização",
"mapping.sourcePreview.copy": "Copiar pré-visualização",
"mapping.sourcePreview.loading": "A carregar amostra do feed…",
"mapping.sourcePreview.errorHint": "Ainda pode introduzir manualmente o caminho do elemento de produto. Extraia o esquema quando o URL do feed estiver acessível.",
"mapping.sourcePreview.retry": "Tentar novamente",
2026-08-16 18:18:39 +02:00
"mapping.sourcePreview.empty": "Ainda sem pré-visualização",
"mapping.sourcePreview.emptyHintXml": "Clique em “Extrair esquema” para descarregar uma amostra e descobrir campos, ou introduza um caminho de item manualmente.",
"mapping.sourcePreview.emptyHintCsv": "Clique em “Extrair esquema” para descarregar uma amostra e descobrir campos.",
"mapping.sourcePreview.selectPath": "Selecionar caminho: {path}",
"mapping.sourcePreview.clickTag": "Clique numa linha de etiqueta para definir o caminho do elemento de produto.",
2026-08-16 18:18:39 +02:00
"mapping.table.search": "Pesquisar campos…",
"mapping.table.all": "Todos os campos",
"mapping.table.mapped": "Mapeado",
"mapping.table.unmapped": "Por mapear",
"mapping.table.fieldName": "Nome do campo",
"mapping.table.sourcePath": "Caminho de origem",
"mapping.table.sampleValues": "Valores de amostra",
"mapping.table.type": "Tipo",
"mapping.table.mapTo": "Mapear para",
"mapping.table.emptySchema": "Extraia o esquema do feed para preencher os campos de origem, ou adicione mapeamentos manualmente.",
2026-08-16 18:18:39 +02:00
"mapping.table.noMatch": "Nenhum campo corresponde aos seus critérios.",
"mapping.table.unique": "{count} único(s)",
"mapping.table.nested": "aninhado",
"mapping.table.apply": "Aplicar",
"mapping.table.confirm": "Confirmar",
2026-08-16 18:18:39 +02:00
"mapping.table.suggestedMatch": "Correspondência sugerida {confidence}",
"mapping.table.confirmFuzzyMatch": "Confirmar correspondência aproximada ({percent}%)",
"mapping.preview.title": "Pré-visualização do mapeamento",
"mapping.preview.subtitle": "Forma de produto de amostra a partir dos seus mapeamentos de campos atuais",
2026-08-16 18:18:39 +02:00
"mapping.preview.usingSamples": "· a usar amostras extraídas",
"mapping.preview.formatCsv": "formato: csv",
"mapping.preview.item": "item: {path}",
2026-08-16 18:18:39 +02:00
"mapping.preview.sourceFields": "· {count} campos de origem",
"mapping.preview.empty": "Ainda sem campos mapeados",
2026-08-16 18:18:39 +02:00
"mapping.preview.emptyHint": "Mapeie colunas de origem ou nós XPath para campos de produto. Uma pré-visualização de produto de amostra aparecerá aqui.",
"mapping.preview.rawSample": "Fragmento de amostra em bruto",
"imports.title": "Carregamentos",
2026-08-16 18:18:39 +02:00
"imports.description": "Importações CSV guardadas neste espaço de trabalho — produtos, categorias e atributos.",
"imports.importProducts": "Importar produtos",
"imports.emptyTitle": "Ainda sem carregamentos",
2026-08-16 18:18:39 +02:00
"imports.emptyMessage": "As importações CSV de produtos, categorias e atributos aparecem aqui após o carregamento.",
"imports.goProducts": "Ir para produtos",
"imports.categories": "Categorias",
"imports.recent": "Carregamentos recentes",
"imports.fileCount": "{count} ficheiro",
"imports.fileCountPlural": "{count} ficheiros",
"imports.col.fileName": "Nome do ficheiro",
"imports.col.kind": "Tipo",
"imports.col.uploaded": "Carregado",
"imports.col.size": "Tamanho",
2026-08-16 18:18:39 +02:00
"imports.actions": "Ações de carregamento",
"imports.loadFailed": "Falha ao carregar carregamentos",
2026-08-16 18:18:39 +02:00
"imports.metadataOnlyNotice": "{count} upload records are metadata-only — file bytes were not migrated. Re-upload or resync storage if you need the originals.",
"imports.metadataOnlyBadge": "Metadata only (blob not migrated)",
2026-08-16 18:18:39 +02:00
"imports.deleteConfirm": "Eliminar “{name}”? Isto remove o registo de carregamento (e o blob local, se existir).",
"imports.deleted": "Carregamento eliminado.",
2026-08-16 18:18:39 +02:00
"imports.deleteFailed": "Não foi possível eliminar o carregamento",
"imports.status.uploaded": "Carregado",
2026-08-16 18:18:39 +02:00
"reviews.redirectLoading": "A abrir avaliações WooCommerce…",
"reviews.tab": "Avaliações",
"reviews.syncTitle": "Importação de avaliações (loja → Descrybe)",
"reviews.syncDesc": "Importação de entrada — trazer avaliações de produtos WooCommerce para o Descrybe para campanhas e reputação",
"reviews.syncQueued": "Sync de avaliações em fila",
"reviews.statusBadge": "Avaliações: {status}",
"reviews.syncedCount": "{count} sincronizados",
2026-08-16 18:18:39 +02:00
"reviews.lastSync": "Última sync: {date}",
"reviews.noSyncYet": "Ainda não foi concluída nenhuma sync de avaliações.",
"reviews.needsReconnect": "A importação de avaliações não pode correr até as credenciais serem reconectadas após a migração. No separador Ligação: Guardar, depois Testar ligação.",
"reviews.queueImport": "Colocar importação de avaliações na fila (loja → Descrybe)",
"reviews.queueing": "A colocar na fila...",
2026-08-16 18:18:39 +02:00
"reviews.saveTestFirst": "Guarde as credenciais e teste a ligação antes de sincronizar",
"reviews.refreshList": "Atualizar lista",
2026-08-16 18:18:39 +02:00
"reviews.loading": "A carregar avaliações…",
"reviews.emptyTitle": "Ainda sem avaliações",
"reviews.emptyMessage": "Coloque na fila uma sincronização de avaliações após ligar a loja. Este separador continua utilizável com lista vazia.",
"reviews.col.product": "Produto",
"reviews.col.reviewer": "Avaliador",
2026-08-16 18:18:39 +02:00
"reviews.col.rating": "Classificação",
"reviews.col.review": "Rever",
2026-08-16 18:18:39 +02:00
"reviews.queuedSuccess": "Sincronização de avaliações em fila. Será executada em breve.",
"reviews.queueFailed": "Não foi possível colocar a sincronização de avaliações na fila",
"campaigns.title": "Campanhas",
2026-08-16 18:18:39 +02:00
"campaigns.description": "Crie campanhas de e-mail sazonais a partir do seu catálogo — escolha uma estação, selecione produtos, defina o público e gere.",
"campaigns.new": "Nova campanha",
2026-08-16 18:18:39 +02:00
"campaigns.loading": "A carregar campanhas…",
"campaigns.loadFailed": "Falha ao carregar campanhas",
2026-08-16 18:18:39 +02:00
"campaigns.deleteConfirm": "Eliminar a campanha “{name}”? Isto não pode ser anulado.",
"campaigns.deleted": "Campanha eliminada",
"campaigns.deleteFailed": "Falha ao eliminar a campanha",
2026-08-16 18:18:39 +02:00
"campaigns.partialUnavailable": "As campanhas não estão totalmente acessíveis neste momento. Gerar e enviar podem falhar até o serviço voltar.",
"campaigns.searchPlaceholder": "Pesquisar campanhas…",
"campaigns.unavailableTitle": "Campanhas indisponíveis",
"campaigns.unavailableMessage": "O serviço de campanhas não está acessível. Pode abrir o assistente, mas gerar e enviar aguardam o regresso do serviço.",
"campaigns.openWizard": "Abrir assistente de criação",
"campaigns.backDashboard": "Voltar ao painel",
"campaigns.browseProducts": "Explorar produtos",
"campaigns.emptyTitle": "Ainda sem campanhas",
2026-08-16 18:18:39 +02:00
"campaigns.noMatches": "Sem correspondências",
"campaigns.emptyMessage": "Crie uma campanha de Black Friday, Natal ou personalizada em poucos passos — predefinições sazonais estão prontas para começar.",
"campaigns.noMatchesMessage": "Tente outro nome, época ou estado.",
"campaigns.create": "Criar campanha",
2026-08-16 18:18:39 +02:00
"campaigns.col.season": "Época",
"campaigns.col.updated": "Atualizado",
"campaigns.scheduled": "Agendado {date}",
"campaigns.newTitle": "Nova campanha",
2026-08-16 18:18:39 +02:00
"campaigns.newDesc": "Escolha uma estação, selecione produtos e público, escreva o prompt e depois gere, teste e agende.",
"campaigns.editTitle": "Editar campanha",
2026-08-16 18:18:39 +02:00
"campaigns.editDesc": "Atualize a estação, os produtos e o público — depois regenere, envie um teste ou agende.",
"campaignWizard.loading": "A carregar assistente de campanha…",
"campaignWizard.apiMissing": "A API de campanhas está temporariamente indisponível. Pode explorar o assistente; guardar / gerar / enviar precisam de /api/campaigns acessível.",
"campaignWizard.upgradeTitle": "As campanhas de IA são uma funcionalidade paga",
"campaignWizard.upgradeMessage": "Os planos Free podem preparar estações e públicos, mas Gerar IA requer Starter ou superior. Atualize para desbloquear rascunhos de e-mail IA.",
"campaignWizard.comparePlans": "Comparar planos",
2026-08-16 18:18:39 +02:00
"campaignWizard.step.season": "Época",
"campaignWizard.step.catalog": "Produtos",
2026-08-16 18:18:39 +02:00
"campaignWizard.step.audience": "Público",
"campaignWizard.step.prompt": "Prompt",
2026-08-16 18:18:39 +02:00
"campaignWizard.step.preview": "Pré-visualização",
"campaignWizard.step.send": "Enviar",
2026-08-16 18:18:39 +02:00
"campaignWizard.pickSeason": "Escolha uma estação",
"campaignWizard.pickSeasonHelp": "Comece a partir de um modelo — pode editar tudo depois.",
"campaignWizard.name": "Nome da campanha",
"campaignWizard.namePlaceholder": "Black Friday 2026",
"campaignWizard.catalogTitle": "Categorias e produtos",
2026-08-16 18:18:39 +02:00
"campaignWizard.catalogHelp": "Selecione o que este e-mail deve destacar. Só categorias bastam para um início rápido.",
"campaignWizard.categories": "Categorias",
2026-08-16 18:18:39 +02:00
"campaignWizard.noCategories": "Ainda sem categorias — adicione algumas em Catálogo.",
"campaignWizard.categoriesSelected": "{count} categoria selecionada",
"campaignWizard.categoriesSelectedPlural": "{count} categorias selecionadas",
"campaignWizard.productsOptional": "Produtos (opcional)",
"campaignWizard.selectedCount": "{count} selecionados",
2026-08-16 18:18:39 +02:00
"campaignWizard.searchProducts": "Pesquisar produtos…",
"campaignWizard.noProducts": "Não foram encontrados produtos.",
"campaignWizard.audienceTitle": "Quem deve receber isto?",
2026-08-16 18:18:39 +02:00
"campaignWizard.audienceHelp": "Por predefinição a todos. Restrinja com categorias ou compradores anteriores quando as encomendas estiverem sync.",
"campaignWizard.audience.all": "Todos os contactos",
"campaignWizard.audience.allHint": "Enviar para a lista completa (quando o fornecedor de e-mail estiver configurado).",
"campaignWizard.audience.byCategory": "Por interesse de categoria",
2026-08-16 18:18:39 +02:00
"campaignWizard.audience.byCategoryHint": "Pessoas associadas às categorias selecionadas.",
"campaignWizard.audience.purchased": "Comprado na categoria",
2026-08-16 18:18:39 +02:00
"campaignWizard.audience.purchasedHint": "Clientes que compraram produtos nas categorias de público (de encomendas sync).",
"campaignWizard.audience.notPurchased": "Ainda não comprado",
"campaignWizard.audience.notPurchasedHint": "Contactos que não compraram essas categorias — ótimo para reconquista.",
"campaignWizard.ordersHint": "A segmentação comprado / não comprado aparece após sync de encomendas WooCommerce.",
"campaignWizard.audienceCategories": "Categorias de público",
"campaignWizard.promptTitle": "Prompt de e-mail",
2026-08-16 18:18:39 +02:00
"campaignWizard.promptHelp": "Preenchemos um padrão sólido para {season}. Edite à vontade ou mantenha.",
"campaignWizard.promptSeasonFallback": "esta estação",
"campaignWizard.useDefaultPrompt": "Usar prompt sazonal predefinido",
"campaignWizard.promptLabel": "Prompt",
2026-08-16 18:18:39 +02:00
"campaignWizard.advanced": "Opções avançadas",
"campaignWizard.advancedHelp": "A geração IA usa o kit de marca (se definido) e os produtos selecionados. A pré-visualização só de modelo ignora a IA e serve de esboço de layout.",
"campaignWizard.planFree": "Grátis",
"campaignWizard.planPaid": "Pago",
"campaignWizard.planLine": "Plano:",
2026-08-16 18:18:39 +02:00
"campaignWizard.aiLocked": "— Gerar IA está bloqueado.",
"campaignWizard.generateAi": "Gerar IA",
2026-08-16 18:18:39 +02:00
"campaignWizard.templatePreview": "Pré-visualização do modelo",
"campaignWizard.saveDraft": "Guardar rascunho",
2026-08-16 18:18:39 +02:00
"campaignWizard.previewTitle": "Pré-visualização",
"campaignWizard.status": "Estado:",
"campaignWizard.generateToSee": "Gere um rascunho para ver o corpo do e-mail.",
2026-08-16 18:18:39 +02:00
"campaignWizard.noPreview": "Ainda sem pré-visualização. Volte a Prompt e execute Gerar IA ou Pré-visualização do modelo.",
"campaignWizard.backToPrompt": "Voltar ao prompt",
"campaignWizard.subject": "Assunto",
2026-08-16 18:18:39 +02:00
"campaignWizard.emailPreview": "Pré-visualização do e-mail",
"campaignWizard.regenerateAi": "Regenerar com IA",
"campaignWizard.regenerate": "Regenerar",
"campaignWizard.continueSend": "Continuar para enviar",
"campaignWizard.testSend": "Envio de teste",
2026-08-16 18:18:39 +02:00
"campaignWizard.testSendHelp": "Envie uma cópia a si próprio antes de agendar.",
"campaignWizard.testEmail": "E-mail de teste",
"campaignWizard.testEmailPlaceholder": "voce@empresa.com",
"campaignWizard.sendTest": "Enviar teste",
"campaignWizard.scheduleTitle": "Agendar",
"campaignWizard.scheduleHelp": "Escolha quando esta campanha deve sair.",
2026-08-16 18:18:39 +02:00
"campaignWizard.sendAt": "Enviar às",
"campaignWizard.schedule": "Agendar campanha",
"campaignWizard.generateToContinue": "Gere para continuar",
2026-08-16 18:18:39 +02:00
"campaignWizard.done": "Concluído",
"campaignWizard.loadFailed": "Falha ao carregar o assistente",
"campaignWizard.pickCatalog": "Escolha pelo menos uma categoria ou produto",
2026-08-16 18:18:39 +02:00
"campaignWizard.pickAudienceCats": "Escolha categorias de audiência para este filtro",
"campaignWizard.completeStep": "Conclua este passo para continuar",
"campaignWizard.aiDraftReady": "Rascunho de IA gerado",
2026-08-16 18:18:39 +02:00
"campaignWizard.templateReady": "Pré-visualização do modelo pronta",
"campaignWizard.unavailableSave": "As campanhas não estão disponíveis. Os rascunhos não podem ser guardados até a funcionalidade estar ativa.",
"campaignWizard.generateFailed": "Falha ao gerar",
2026-08-16 18:18:39 +02:00
"campaignWizard.generateFirst": "Gere primeiro uma pré-visualização",
"campaignWizard.enterTestEmail": "Introduza um endereço de e-mail de teste",
"campaignWizard.testFailed": "Falha no envio de teste",
"campaignWizard.pickSchedule": "Escolha data e hora",
"campaignWizard.scheduled": "Campanha agendada",
"campaignWizard.scheduleFailed": "Falha ao agendar",
"campaignWizard.draftSaved": "Rascunho guardado",
2026-08-16 18:18:39 +02:00
"campaignWizard.unavailableShort": "As campanhas não estão disponíveis neste momento.",
"campaignWizard.saveFailed": "Falha ao guardar",
2026-08-16 18:18:39 +02:00
"marketing.calendarTitle": "Calendário de conteúdos",
"marketing.calendarDesc": "Ligue campanhas sazonais a datas e prepare um feed de exportação com predefinições de shopping.",
"marketing.loadFailed": "Falha ao carregar o calendário",
"marketing.prepared": "Campanha preparada",
2026-08-16 18:18:39 +02:00
"marketing.alreadyReady": "A campanha já está pronta",
"marketing.exportFeedsHint": "{name} → Feeds de exportação",
"marketing.prepareFailed": "Não foi possível preparar a campanha",
"marketing.requestFailed": "Pedido falhou",
"marketing.emptyTitle": "Sem presets sazonais",
2026-08-16 18:18:39 +02:00
"marketing.emptyMessage": "Os presets do calendário aparecerão aqui quando a API de marketing estiver disponível.",
"marketing.openCampaigns": "Abrir campanhas de e-mail",
"marketing.window": "Janela:",
2026-08-16 18:18:39 +02:00
"marketing.linkedExport": "Exportação ligada:",
"marketing.openPrepared": "Abrir feed preparado",
2026-08-16 18:18:39 +02:00
"marketing.preparing": "A preparar…",
"marketing.prepareNamed": "Preparar campanha {name}",
2026-08-16 18:18:39 +02:00
"marketing.footer": "As campanhas de e-mail ficam em {link} — esta página só prepara feeds de exportação do catálogo.",
"common.done": "Concluído",
"common.copied": "Copiado para a área de transferência.",
"common.copyFailed": "Não foi possível copiar. Selecione o texto e copie manualmente.",
"common.submitting": "A submeter…",
"common.sending": "A enviar…",
"settings.companyAdminOnlyView": "Só os admins da empresa podem alterar as definições. Pode ver os detalhes do espaço de trabalho atual.",
"settings.activeCompanyHelp": "Espaço de trabalho para catálogo, feeds, faturação e chaves API. Mude a qualquer momento daqui ou no cabeçalho.",
"settings.noCompanySelected": "Nenhuma empresa selecionada",
2026-08-16 18:18:39 +02:00
"settings.creditsOverviewHelp": "Saldo de créditos de IA da empresa ativa. A utilização detalhada está em Faturação.",
"settings.billingLabel": "Faturação",
"settings.remainingLabel": "Restantes",
2026-08-16 18:18:39 +02:00
"settings.creditsUnavailable": "O saldo de créditos ainda não está disponível para este espaço de trabalho.",
"settings.openBilling": "Abrir utilização e faturação",
"settings.companyNameHelp": "Este nome aparece em convites e definições da organização",
"settings.contentSettingsHelp": "Configure o idioma e a correspondência de produtos para o conteúdo gerado",
"settings.mergeProductsHelp": "Quando ativado, as importações CSV combinam linhas com o mesmo GTIN num produto. Desative para manter cada linha independente.",
"settings.emailIntegrationHelp": "Configure o Resend ou SMTP para convites, campanhas e e-mail transacional.",
"settings.configureEmail": "Configurar e-mail",
2026-08-16 18:18:39 +02:00
"settings.aiIntegrationsHelp": "Créditos da plataforma ou a sua própria chave, mais prompts editáveis para títulos, descrições, SEO e campanhas. Chaves encriptadas em repouso.",
"settings.openAiIntegrations": "Abrir integrações de IA",
"settings.companyNameRequired": "Introduza um nome de empresa.",
2026-08-16 18:18:39 +02:00
"settings.companySaved": "Definições da empresa guardadas.",
"settings.companyUpdateFailed": "Não foi possível atualizar a empresa",
"settings.mergeOn": "Os produtos com o mesmo GTIN serão unidos entre feeds.",
"settings.mergeOff": "Os produtos com o mesmo GTIN mantêm-se separados.",
"settings.mergeUpdateFailed": "Não foi possível atualizar a definição de união",
"settings.inAppToastsHelp": "Apenas neste browser. As falhas estão ativas por predefinição; as conclusões são silenciadas para reduzir ruído. Feedback de formulários e Anular nunca são silenciados.",
"settings.emailAlertsHelp": "As preferências de alerta por e-mail chegam em breve. Alertas de falha estarão ativas por predefinição (como na app); e-mails de conclusão ficam off salvo opt-in.",
"settings.emailAlertsBody": "Por agora, configure o correio transacional em Empresa → Integração de e-mail. Os alertas in-app acima continuam a aplicar-se.",
"settings.apiKeysLegacyNotice": "As chaves API legado não foram migradas. Crie uma nova para restaurar o acesso — o segredo é mostrado apenas uma vez.",
"settings.apiKeysAdminOnly": "Só os administradores podem criar ou revogar chaves API. Pode ver os prefixos existentes.",
"settings.apiKeysCopyUnavailableNotice": "Cópia indisponível para chaves existentes — só o prefixo é guardado. Crie uma nova para copiar o segredo uma vez e revogue a antiga se necessário.",
"settings.apiKeysForbidden": "Não tem permissão para ver chaves API. Peça ajuda a um administrador da empresa.",
"settings.noApiKeys": "Ainda sem chaves API",
2026-08-16 18:18:39 +02:00
"settings.noApiKeysHelpAdmin": "As chaves API legado não foram migradas. Crie uma nova para autenticar pedidos Descrybe (X-API-Key). O segredo completo é mostrado apenas uma vez.",
"settings.noApiKeysHelpMember": "Ainda sem chaves API para esta empresa. As legado não foram migradas — peça a um administrador para criar uma.",
"settings.unnamedKey": "Chave sem nome",
"settings.neverUsed": "Nunca usado",
2026-08-16 18:18:39 +02:00
"settings.apiKeyActions": "Ações de chave API",
"settings.copyUnavailable": "Cópia indisponível",
"settings.copyUnavailableTitle": "O segredo completo é mostrado apenas uma vez quando a chave é criada",
"settings.revoke": "Revogar",
"settings.apiKeyNameRequired": "Introduza um nome para esta chave API.",
2026-08-16 18:18:39 +02:00
"settings.apiKeyCreatedOnce": "Chave API criada. Copie-a agora — não será mostrada novamente.",
"settings.apiKeyCreated": "Chave API criada.",
2026-08-16 18:18:39 +02:00
"settings.apiKeyCreateFailed": "Não foi possível criar a chave API",
"settings.apiKeyRevokeConfirm": "Revogar esta chave API? Os pedidos que a usam deixarão de funcionar.",
"settings.apiKeyRevoked": "Chave API revogada.",
2026-08-16 18:18:39 +02:00
"settings.apiKeyRevokeFailed": "Não foi possível revogar a chave API",
"settings.apiKeyCopied": "Chave API copiada.",
2026-08-16 18:18:39 +02:00
"settings.createApiKeyOnceHelp": "Copie esta chave agora — não será mostrada novamente. Use-a como Authorization: Bearer ou X-API-Key em /api/v1.",
"settings.createApiKeyNameHelp": "Dê um nome à chave para a distinguir depois. Após criar, envie-a como Authorization: Bearer (preferido) ou X-API-Key.",
"settings.keyNamePlaceholder": "p.ex. Production",
"settings.newApiKeyAria": "Nova chave API mostrada uma vez",
"settings.copyApiKeyAria": "Copiar chave API",
"settings.alert.sync_fail.title": "Falhas de sync",
2026-08-16 18:18:39 +02:00
"settings.alert.sync_fail.description": "Quando uma sincronização de feed expira ou a API devolve um erro.",
"settings.alert.sync_done.title": "Sync concluída",
"settings.alert.sync_done.description": "Quando uma sincronização de feed termina com sucesso.",
"settings.alert.ai_fail.title": "Falhas de IA / processamento",
2026-08-16 18:18:39 +02:00
"settings.alert.ai_fail.description": "Quando falha o início ou a execução de um trabalho de processamento.",
"settings.alert.ai_done.title": "IA / processamento concluído",
"settings.alert.ai_done.description": "Quando um trabalho em segundo plano termina com sucesso. Os toasts de início ficam sempre ativos para Anular permanecer disponível.",
"settings.alert.export_fail.title": "Falhas de exportação",
"settings.alert.export_fail.description": "Quando falha a exportação de um produto ou feed de exportação.",
"settings.alert.export_done.title": "Exportação concluída",
"settings.alert.export_done.description": "Quando uma exportação termina com sucesso.",
"settings.alert.support_reply.title": "Respostas da equipa de suporte",
"settings.alert.support_reply.description": "Quando um agente da plataforma responde ao seu ticket de suporte.",
2026-08-16 18:18:39 +02:00
"settings.alert.support_status.title": "Alterações de estado do suporte",
"settings.alert.support_status.description": "Quando um ticket de suporte passa a pendente ou resolvido.",
2026-08-16 18:18:39 +02:00
"empty.forbidden.title.company": "Permissão negada",
"empty.forbidden.title.platform": "Acesso restrito",
2026-08-16 18:18:39 +02:00
"empty.forbidden.message.company": "Não tem permissão para isto. Peça ajuda a um administrador da empresa.",
"empty.forbidden.message.platform": "Esta área só está disponível para administradores da plataforma.",
"empty.forbidden.message.support": "Esta área só está disponível para a equipa de suporte e administradores da plataforma.",
"empty.forbidden.backDashboard": "Voltar ao painel",
2026-08-16 18:18:39 +02:00
"empty.forbidden.apiKeys": "Não tem permissão para ver chaves API. Peça ajuda a um administrador da empresa.",
"empty.forbidden.ai": "Não tem permissão para ver as definições do fornecedor de IA. Peça ajuda a um administrador.",
"empty.forbidden.email": "Não tem permissão para ver as definições do fornecedor de e-mail. Peça ajuda a um administrador.",
"confirm.defaultTitle": "Confirmar eliminação",
"confirm.defaultDescription": "Tem a certeza?",
"confirm.defaultConfirm": "Confirmar",
2026-08-16 18:18:39 +02:00
"confirm.deleteFeed": "Eliminar o feed “{name}”? Isto não pode ser anulado.",
"confirm.deleteCampaign": "Eliminar a campanha “{name}”? Isto não pode ser anulado.",
"confirm.deleteExportFeed": "Tem a certeza de que pretende eliminar este feed de exportação?",
"confirm.rotateExportToken": "Rodar o token do URL do feed? O URL publico antigo deixa de funcionar de imediato.",
2026-08-16 18:18:39 +02:00
"confirm.deleteUpload": "Eliminar “{name}”? Isto remove o registo de carregamento (e o blob local, se existir).",
"confirm.revokeApiKey": "Revogar esta chave API? Os pedidos que a usam deixarão de funcionar.",
"confirm.deleteKnowledgeArticle": "Eliminar este artigo de conhecimento?",
"confirm.deleteReplyTemplate": "Eliminar este modelo de resposta?",
2026-08-16 18:18:39 +02:00
"confirm.deleteStructuredField": "Tem a certeza de que quer eliminar este campo? Esta ação não pode ser anulada.",
"toast.campaign.pickAudience": "Escolha pelo menos uma categoria ou produto",
2026-08-16 18:18:39 +02:00
"toast.campaign.pickCategories": "Escolha categorias de audiência para este filtro",
"toast.campaign.completeStep": "Conclua este passo para continuar",
"toast.campaign.aiDraft": "Rascunho de IA gerado",
2026-08-16 18:18:39 +02:00
"toast.campaign.templatePreview": "Pré-visualização do modelo pronta",
"toast.campaign.generateFirst": "Gere primeiro uma pré-visualização",
"toast.campaign.testSent": "E-mail de teste enviado para {email}",
"toast.campaign.scheduled": "Campanha agendada",
"toast.campaign.draftSaved": "Rascunho guardado",
"toast.campaign.deleted": "Campanha eliminada",
"toast.campaign.prepared": "Campanha preparada",
2026-08-16 18:18:39 +02:00
"toast.campaign.alreadyReady": "A campanha já está pronta",
"toast.campaign.prepareFailed": "Não foi possível preparar a campanha",
"toast.campaign.deleteFailed": "Falha ao eliminar a campanha",
2026-08-16 18:18:39 +02:00
"toast.feed.copyFailed": "Não foi possível copiar o URL",
"toast.feed.created": "Feed criado",
"toast.feed.updated": "Feed atualizado.",
"toast.feed.mapBeforeSync": "Mapeie os campos antes de sincronizar este feed.",
"toast.feed.activateBeforeSync": "Ative o feed antes de sincronizar.",
2026-08-16 18:18:39 +02:00
"toast.feed.syncFinished": "Sincronização concluída",
"toast.feed.deleted": "Feed eliminado.",
2026-08-16 18:18:39 +02:00
"toast.feed.mappingLoadFailed": "Não foi possível carregar os mapeamentos. Abra o mapeamento para corrigir antes de sincronizar.",
"toast.feed.syncFailed": "Falha na sincronização",
"toast.feed.statusFailed": "Não foi possível atualizar o estado",
"toast.feed.deleteFailed": "Não foi possível eliminar o feed",
"toast.feed.beforeSampling": "Antes da amostragem",
2026-08-16 18:18:39 +02:00
"toast.processing.jobCompleted": "Processamento concluído",
"toast.processing.jobFailed": "Processamento falhou",
2026-08-16 18:18:39 +02:00
"toast.products.startFailed": "Não foi possível iniciar o processamento",
"toast.products.jobStarted": "Trabalho de processamento iniciado",
2026-08-16 18:18:39 +02:00
"toast.products.acceptUndone": "Aceitação anulada",
"toast.products.resetComplete": "Reposição concluída",
"toast.products.nameAcceptUndone": "Aceitação do nome anulada",
"toast.products.descAcceptUndone": "Aceitação da descrição anulada",
"toast.products.cancelOne": "Processamento cancelado",
"toast.products.cancelMany": "Trabalhos de processamento cancelados",
2026-08-16 18:18:39 +02:00
"toast.products.startJobFailed": "Não foi possível iniciar o trabalho de processamento",
"toast.products.acceptFailed": "Não foi possível aceitar o enriquecimento",
"toast.products.updateFailed": "Não foi possível atualizar o produto",
"toast.products.undoAcceptFailed": "Não foi possível anular a aceitação",
"toast.products.undoFieldAcceptFailed": "Não foi possível anular a aceitação do campo",
"toast.products.undoFieldDiscardFailed": "Não foi possível anular o descarte do campo",
"toast.products.rejectFailed": "Não foi possível rejeitar o enriquecimento",
"toast.products.exportFailed": "Não foi possível exportar os produtos selecionados",
"toast.products.resetFailed": "Não foi possível repor os produtos",
"toast.products.cancelFailed": "Não foi possível cancelar o trabalho de processamento",
"toast.support.ticketCreated": "Ticket criado",
"toast.support.replySent": "Resposta enviada",
"toast.support.thanksFeedback": "Obrigado pelo feedback",
2026-08-16 18:18:39 +02:00
"toast.support.createFailed": "Não foi possível criar o ticket",
"toast.support.unavailable": "Suporte indisponível",
"toast.support.loadFailed": "Falha ao carregar tickets de suporte",
"toast.support.loadTicketFailed": "Falha ao carregar o ticket",
2026-08-16 18:18:39 +02:00
"toast.support.replyFailed": "Não foi possível enviar a resposta",
"toast.support.ratingUnavailable": "Avaliação indisponível",
"toast.support.alreadyRated": "Já avaliado",
"toast.support.ratingFailed": "Não foi possível enviar a avaliação",
"toast.structured.fieldAdded": "Campo adicionado",
2026-08-16 18:18:39 +02:00
"toast.structured.fieldAddedBody": "O campo de descrição estruturada foi adicionado.",
"toast.structured.fieldDeleted": "Campo eliminado",
2026-08-16 18:18:39 +02:00
"toast.structured.fieldDeletedBody": "O campo de descrição estruturada foi eliminado.",
"toast.structured.addFailed": "Falha ao adicionar o campo",
"toast.structured.deleteFailed": "Falha ao eliminar o campo",
"toast.brand.saved": "Kit de marca guardado",
2026-08-16 18:18:39 +02:00
"toast.brand.logoUploaded": "Logótipo carregado",
"toast.brand.saveFailed": "Falha ao guardar o kit de marca",
2026-08-16 18:18:39 +02:00
"toast.brand.uploadFailed": "Falha ao carregar o logótipo",
"toast.vector.indexCreated": "Índice vetorial criado com sucesso",
"toast.vector.dbInitialized": "Base de dados vetorial inicializada com sucesso",
2026-08-16 18:18:39 +02:00
"toast.vector.indexFailed": "Falha ao criar o índice vetorial",
"toast.vector.initFailed": "Falha ao inicializar a base de dados vetorial",
"toast.vector.searchFailed": "Falha ao pesquisar categorias",
"toast.export.refreshFailed": "Falha ao atualizar o feed",
"toast.mapping.loadFailed": "Falha ao carregar o mapeamento do feed",
"toast.mapping.extractFailed": "Falha ao extrair o esquema",
"toast.mapping.saveFailed": "Falha ao guardar os mapeamentos de campos",
"toast.mapping.sampleFailed": "Falha ao sincronizar + processar a amostra",
"toast.attrs.createFailed": "Falha ao criar",
2026-08-16 18:18:39 +02:00
"toast.attrs.importFailed": "Falha na importação",
"toast.attrs.updateFailed": "Falha na atualização",
"toast.attrs.deleteFailed": "Falha ao eliminar",
2026-08-16 18:18:39 +02:00
"toast.switcher.loadUsersFailed": "Não foi possível carregar os utilizadores comutáveis",
"toast.switcher.switchFailed": "Não foi possível mudar de utilizador",
"toast.switcher.returnFailed": "Não foi possível voltar ao utilizador original",
"toast.switcher.companyFailed": "Não foi possível mudar de empresa",
"toast.requestFailed": "Pedido falhou",
2026-08-16 18:18:39 +02:00
"flash.campaign.unavailableDraft": "As campanhas não estão disponíveis. Os rascunhos não podem ser guardados até a funcionalidade estar ativa.",
"flash.campaign.testEmailRequired": "Introduza um endereço de e-mail de teste",
"flash.campaign.scheduleRequired": "Escolha data e hora",
2026-08-16 18:18:39 +02:00
"flash.campaign.unavailable": "As campanhas não estão disponíveis neste momento.",
"flash.campaign.generateFailed": "Falha ao gerar",
"flash.campaign.testFailed": "Falha no envio de teste",
"flash.campaign.scheduleFailed": "Falha ao agendar",
"flash.campaign.saveFailed": "Falha ao guardar",
2026-08-16 18:18:39 +02:00
"flash.feed.copyFailed": "Não foi possível copiar o URL",
"flash.feed.csvRequired": "Escolha um ficheiro .csv.",
"flash.feed.csvFileRequired": "Escolha um ficheiro CSV.",
2026-08-16 18:18:39 +02:00
"flash.feed.urlRequired": "O URL do feed é obrigatório.",
"flash.feed.updated": "Feed atualizado.",
2026-08-16 18:18:39 +02:00
"flash.feed.syncFinishedNamed": "Sincronização concluída para \"{name}\" ({status}: {products}).",
"flash.feed.deleted": "Feed eliminado.",
2026-08-16 18:18:39 +02:00
"flash.feed.createFailed": "Não foi possível criar o feed",
"flash.feed.updateFailed": "Não foi possível atualizar o feed",
"flash.settings.companyNameRequired": "Introduza um nome de empresa.",
2026-08-16 18:18:39 +02:00
"flash.settings.companySaved": "Definições da empresa guardadas.",
"flash.settings.companyFailed": "Não foi possível atualizar a empresa",
"flash.settings.mergeFailed": "Não foi possível atualizar a definição de união",
"flash.settings.apiKeyNameRequired": "Introduza um nome para esta chave API.",
2026-08-16 18:18:39 +02:00
"flash.settings.apiKeyCreatedFailed": "Não foi possível criar a chave API",
"flash.settings.apiKeyRevoked": "Chave API revogada.",
2026-08-16 18:18:39 +02:00
"flash.settings.apiKeyRevokeFailed": "Não foi possível revogar a chave API",
"flash.settings.copyFailed": "Não foi possível copiar. Selecione o texto e copie manualmente.",
"flash.products.accepted": "Aceites {count} produto(s) — movidos para Processados.",
"flash.products.updated": "Produto atualizado.",
2026-08-16 18:18:39 +02:00
"flash.products.enrichmentAccepted": "Enriquecimento aceite — movido para Processados.",
"flash.products.originalEmpty": "O valor original está vazio; o enriquecimento não pode ser limpo via PATCH.",
"flash.products.selectExport": "Selecione pelo menos um produto para exportar.",
2026-08-16 18:18:39 +02:00
"flash.products.exported": "Exportados {count} produto(s) via feed de exportação.",
"flash.support.missingId": "Falta o id do ticket",
2026-08-16 18:18:39 +02:00
"flash.support.notFound": "Ticket não encontrado",
"flash.support.unavailable": "O suporte está temporariamente indisponível.",
"flash.support.ratingUnavailable": "A avaliação está temporariamente indisponível. Tente novamente mais tarde.",
"flash.support.alreadyRated": "Já avaliou este ticket.",
"flash.support.queueUnavailable": "A fila de suporte não está disponível neste deployment.",
"flash.support.deploymentUnavailable": "O suporte não está disponível neste deployment.",
"flash.support.replyRequired": "O corpo da resposta é obrigatório.",
"flash.support.draftRequired": "O corpo do rascunho é obrigatório antes de aprovar.",
"flash.support.claimed": "Ticket reclamado.",
2026-08-16 18:18:39 +02:00
"flash.support.unassigned": "Ticket sem atribuição.",
"flash.support.assigneeCleared": "Responsável limpo.",
"flash.support.assigneeUpdated": "Responsável atualizado.",
"flash.support.draftApproved": "Rascunho de IA aprovado e enviado ao cliente.",
"flash.support.draftSent": "Rascunho enviado como resposta da equipa.",
"flash.support.draftDiscarded": "Rascunho de IA descartado. Ticket enviado para a fila humana.",
2026-08-16 18:18:39 +02:00
"flash.support.autoReplyDisabled": "Resposta automática desativada (rascunho mantido como nota interna).",
"flash.structured.keyRequired": "A chave do campo é obrigatória",
"flash.category.nameRequired": "O nome e o ID único são obrigatórios.",
"flash.category.textEmpty": "O texto não pode estar vazio",
"flash.export.noConfigs": "Ainda sem feeds de exportação. Crie um em Feeds de exportação e volte para exportar a sua seleção.",
"flash.export.selectFormat": "Selecione um feed de exportação.",
"flash.files.deleted": "Carregamento eliminado.",
2026-08-16 18:18:39 +02:00
"flash.mapping.noSuggestions": "Sem sugestões — verifique os nomes dos campos de origem.",
"flash.mapping.allMapped": "Todas as sugestões já estão mapeadas. Reveja os chips de confiança na tabela.",
"flash.mapping.extractFirst": "Sem sugestões — extraia primeiro o esquema.",
"flash.mapping.pathRequired": "Introduza um caminho de elemento de produto antes de mapear campos.",
2026-08-16 18:18:39 +02:00
"flash.billing.checkoutCanceled": "O Checkout foi cancelado. Não foram feitas alterações.",
"flash.billing.portalReturn": "Regressou do portal de faturação. Faça a gestão do plano aqui ou em Plans.",
"flash.billing.invalidAmount": "Introduza um montante de créditos válido.",
"flash.billing.companyNotFound": "Empresa não encontrada.",
"flash.billing.creditsAdded": "Foram adicionados {amount} créditos.",
"flash.unsubscribe.missingToken": "Falta o token de anulação de subscrição.",
"flash.unsubscribe.loadFailed": "Não foi possível carregar o estado de anulação.",
"flash.unsubscribe.failed": "Falha ao anular a subscrição.",
"flash.seo.filledMeta": "Meta preenchida para “{label}” ({mode}).",
"flash.shopify.saved": "Definições Shopify guardadas.",
"flash.woo.saved": "Definições WooCommerce guardadas.",
"flash.woo.syncSaved": "Definições de sincronização guardadas.",
"flash.woo.autoCategories": "Mapeadas automaticamente {count} categorias.",
"flash.woo.autoAttributes": "Mapeados automaticamente {count} atributos.",
2026-08-16 18:18:39 +02:00
"flash.ai.promptsSaved": "Modelos de prompt guardados. Aplicam-se à próxima execução de IA.",
"flash.ai.promptRestored": "Prompt predefinido integrado restaurado.",
2026-08-16 18:18:39 +02:00
"flash.ai.connectionOk": "Ligação OK ({detail}).",
"flash.ai.connectionByok": ", a sua própria chave",
"flash.email.saved": "Fornecedor de e-mail guardado. Verifique o domínio e envie um teste.",
"flash.email.testDryRun": "Teste registado em modo de simulação — nenhum e-mail foi enviado.",
"flash.email.testSent": "E-mail de teste enviado. O endereço de origem é marcado como verificado se a entrega for bem-sucedida.",
"flash.fields.apiUnavailable": "A API de campos standard não está disponível. As alterações não podem ser guardadas.",
"flash.fields.updated": "Campo atualizado com sucesso",
"flash.fields.created": "Campo criado com sucesso",
"flash.fields.enabledRecommended": "Campos de ecommerce recomendados ativados",
"flash.fields.deleted": "Campo eliminado com sucesso",
"flash.fields.groupUpdated": "Grupo atualizado com sucesso",
"flash.fields.groupCreated": "Grupo criado com sucesso",
"flash.fields.groupDeleted": "Grupo eliminado com sucesso",
"flash.processing.cancelled": "\"{name}\" foi cancelado.",
"flash.processing.retried": "\"{name}\" em fila para nova tentativa.",
2026-08-16 18:18:39 +02:00
"flash.admin.staffRoleUpdated": "Função de pessoal atualizada para {email}.",
"flash.admin.staffRoleUnavailable": "As atualizações de função de pessoal ainda não estão disponíveis neste servidor.",
"flash.admin.catalogCloned": "Copied {source} into {dest}: {products} products, {categories} taxonomy categories, {mapped_with} with mapped category.",
2026-08-16 18:36:56 +02:00
"flash.admin.syncA1Success": "Synced A1 for {name}: dump_mapped {dump_mapped} ({dump_status}), prompts {prompts}, hashes {hashes}, processed←mapped {categories}, mapped←processed {mapped_backfilled}. Coverage: {mapped_with}/{mapped_total} ({taxonomy} taxonomy).",
"flash.admin.syncA1Error": "Falha na sincronização A1 de {name}.",
2026-08-16 18:18:39 +02:00
"flash.admin.planAssigned": "Plano atribuído a {name}.",
"flash.admin.planAssignedShort": "Plano atribuído.",
"flash.admin.creditsUpdated": "Créditos atualizados.",
"flash.admin.cyclesProcessed": "Ciclos de faturação processados: {count}",
"flash.admin.invitesSummary": "Convites para definir palavra-passe: {parts}. Entrega de e-mail: {smtp}.",
"flash.admin.smtpOn": "ligado",
"flash.admin.smtpOff": "desligado",
"flash.admin.localPasswordSet": "Palavra-passe local definida para {email}.",
2026-08-16 18:18:39 +02:00
"flash.admin.localPasswordUnavailable": "As ferramentas de palavra-passe local não estão disponíveis neste ambiente.",
"flash.admin.switchedUser": "Utilizador alterado. A recarregar…",
"flash.admin.switchUnavailable": "A mudança de utilizador não está disponível neste ambiente.",
"flash.admin.diagnosticsRateLimit": "Limite de diagnósticos atingido (20/min). Aguarde um minuto e atualize.",
"flash.admin.smtpSaved": "Definições SMTP da plataforma guardadas. As palavras-passe permanecem ocultas.",
"flash.admin.integrationSaved": "Definições de integração guardadas. Os campos secretos nunca são mostrados de novo na íntegra.",
"flash.admin.aiSaved": "Definições de IA {label} guardadas. As chaves API nunca são mostradas de novo.",
"flash.admin.cleanup": "Limpeza: {jobs} trabalhos falharam, {products} produtos repostos.",
2026-08-16 18:18:39 +02:00
"flash.admin.orphanDryRun": "Dry-run only — {total} orphan(s) would be deleted. Nothing removed.",
"flash.admin.orphanDeleted": "Deleted {deleted} orphan row(s). Remaining: {remaining}.",
"flash.admin.articleUpdated": "Artigo atualizado.",
"flash.admin.articleCreated": "Artigo criado.",
"flash.admin.templateUpdated": "Modelo atualizado.",
"flash.admin.templateCreated": "Modelo criado.",
"flash.admin.articleDeleted": "Artigo eliminado.",
"flash.admin.templateDeleted": "Modelo eliminado.",
2026-08-16 18:18:39 +02:00
"flash.admin.autoReplySaved": "Definições de resposta automática guardadas.",
"flash.admin.imageUploaded": "Imagem carregada e inserida no markdown.",
2026-08-16 18:18:39 +02:00
"flash.admin.translationsSaved": "Guardadas {count} cadeia(s) para {locale}. Faça commit do pack quando estiver pronto.",
"flash.admin.featuresUpdated": "Atualizado {key}.",
"flash.admin.featuresAllOn": "Todas as funcionalidades ativadas para este plano.",
"flash.admin.featuresAllOff": "Todas as funcionalidades desativadas para este plano.",
"flash.admin.profileApplied": "Perfil {label} aplicado a {name}.",
2026-08-16 18:18:39 +02:00
"flash.admin.overridesCleared": "Substituições limpas — a usar predefinições do nome do plano.",
"empty.plans.none": "Nenhum plano encontrado.",
"empty.plans.noMatch": "Nenhum plano corresponde a este filtro.",
"empty.plans.selectPackage": "Selecione um pacote para editar funcionalidades.",
"empty.products.processingTitle": "Nenhum produto em processamento",
2026-08-16 18:18:39 +02:00
"empty.products.processingMessageCan": "O progresso em direto está em Processamento. Abra um trabalho em curso para ver o estado dos passos; este separador listará produtos em curso quando o filtro por itens estiver disponível.",
"empty.products.processingMessageCannot": "Os produtos num trabalho aparecem aqui assim que o processamento começar a partir do catálogo.",
"empty.products.reviewTitle": "Nenhum produto a precisar de revisão",
"empty.products.reviewMessage": "Após um trabalho, os produtos enriquecidos aparecem aqui. Abra uma linha para comparar original vs enriquecido e Aceitar, editar ou Rejeitar.",
"empty.products.errorTitle": "Nenhum produto com erros",
"empty.products.errorMessage": "Quando um trabalho falha para um produto, ele aparece aqui para poder tentar novamente.",
2026-08-16 18:18:39 +02:00
"empty.products.filterTitleUnprocessed": "Sem correspondências não processadas",
"empty.products.filterTitle": "Nenhum produto corresponde",
2026-08-16 18:18:39 +02:00
"empty.products.filterMessage": "Tente outra pesquisa, categoria ou feed — ou limpe os filtros para ver tudo.",
"empty.products.unprocessedTitle": "Ainda sem produtos não processados",
"empty.products.unprocessedMessage": "Ligue um feed de fornecedor ou carregue um CSV para importar produtos.",
"empty.products.noneTitle": "Ainda sem produtos",
2026-08-16 18:18:39 +02:00
"empty.products.noneMessageStores": "Importe de um feed ou loja e inicie um trabalho para construir o catálogo.",
"empty.products.noneMessage": "Importe de um feed ou carregue um CSV e inicie um trabalho.",
"empty.products.viewJobs": "Ver trabalhos",
"empty.products.startJob": "Iniciar um trabalho",
"empty.products.clearFilters": "Limpar filtros",
"empty.products.viewProcessed": "Ver processados",
2026-08-16 18:18:39 +02:00
"empty.products.retryCatalog": "Tentar novamente a partir do catálogo",
"empty.products.connectFeed": "Ligar feed",
"empty.products.addProduct": "Adicionar produto",
"empty.products.uploadCsv": "Carregar CSV",
"empty.feeds.noneTitle": "Ainda sem feeds de produtos",
2026-08-16 18:18:39 +02:00
"empty.feeds.noneMessage": "Ligue um URL CSV/XML de fornecedor ou carregue um ficheiro. Seguinte: Map → Sync → Process.",
"empty.feeds.noMatchTitle": "Sem feeds correspondentes",
"empty.feeds.noMatchMessage": "Experimente outro termo de pesquisa, ou limpe a pesquisa para ver todos os feeds.",
2026-08-16 18:18:39 +02:00
"empty.export.loadFailedTitle": "Não foi possível carregar os feeds de exportação",
"empty.export.loadFailedMessage": "Algo correu mal ao carregar as suas exportações. Tente novamente ou veja o erro acima para detalhes.",
"empty.export.noneTitle": "Ainda sem feeds de exportação",
"empty.export.noneMessage": "Crie um feed Google Shopping, Meta ou CSV/XML personalizado para escolher que produtos e campos saem. Gere um URL público para Merchant Center ou qualquer parceiro — ou exporte um subconjunto em Produtos.",
"empty.export.noMatchTitle": "Sem feeds correspondentes",
"empty.export.noMatchMessage": "Tente outro termo de pesquisa.",
"empty.files.noneTitle": "Ainda sem carregamentos",
2026-08-16 18:18:39 +02:00
"empty.files.noneMessage": "Importações CSV de produtos, categorias e atributos aparecem aqui após o carregamento. Após uma migração de plataforma, os conteúdos dos ficheiros (blobs) não foram copiados — volte a carregar se precisar deles.",
"empty.files.uploadCta": "Carregar CSV",
"empty.export.fromProductsCta": "Exportar a partir de Produtos",
"empty.dashboard.noJobsTitle": "Sem trabalhos recentes",
2026-08-16 18:18:39 +02:00
"empty.dashboard.noJobsMessage": "Os trabalhos aparecem aqui depois de iniciar o processamento em Produtos. Enriqueça títulos e descrições antes de exportar.",
"empty.stores.noneTitle": "Ainda sem loja ligada",
2026-08-16 18:18:39 +02:00
"empty.stores.noneMessage": "Ligue o WooCommerce ou Shopify para sincronizar catálogo e encomendas. Prefere um ficheiro de fornecedor? Use URL de feed ou carregamento CSV.",
"empty.stores.noneTitleMember": "Ainda sem loja ligada",
2026-08-16 18:18:39 +02:00
"empty.stores.noneMessageMember": "Só os admins da empresa podem ligar WooCommerce ou Shopify. Peça ajuda a um admin, ou use Feed URL/CSV se o seu papel permitir.",
"empty.woo.openConnection": "Abrir definições de ligação",
"empty.shopify.openConnection": "Abrir definições de ligação",
"empty.processing.noneTitle": "Ainda sem trabalhos",
2026-08-16 18:18:39 +02:00
"empty.processing.noneMessage": "Inicie um trabalho a partir de Produtos quando estiver pronto. O progresso e o histórico aparecem aqui.",
"empty.campaigns.unavailableTitle": "Campanhas indisponíveis",
"empty.campaigns.unavailableMessage": "O serviço de campanhas não está acessível. Pode abrir o assistente, mas gerar e enviar aguardam o regresso do serviço.",
"empty.calendar.noneTitle": "Sem presets sazonais",
2026-08-16 18:18:39 +02:00
"empty.calendar.noneMessage": "Os presets do calendário aparecerão aqui quando a API de marketing estiver disponível.",
"empty.seo.noneTitle": "Sem catálogo para pontuar",
"empty.seo.noneMessage": "Processe produtos ou adicione categorias primeiro. As pontuações SEO aparecem quando há dados de catálogo.",
"empty.vector.unavailableTitle": "Categorias vetoriais indisponíveis",
"empty.vector.noMatchTitle": "Ainda sem correspondências",
"empty.vector.noMatchMessage": "Introduza uma descrição de produto e pesquise para ver correspondências vetoriais.",
"empty.structured.unavailableTitle": "Descrições estruturadas indisponíveis",
"empty.structured.unavailableMessage": "Esta API ainda não está neste backend. Não pode gerir campos Export ID até /api/structured-descriptions estar ligada.",
"empty.structured.noneTitle": "Ainda sem campos de descrição estruturada",
"empty.structured.noneMessage": "Adicione um campo aqui ou crie Export IDs numa fórmula de descrição de categoria — aparecerão para feeds de exportação.",
"empty.support.unavailableTitle": "Suporte indisponível",
"empty.support.noneTitle": "Ainda sem tickets",
2026-08-16 18:18:39 +02:00
"empty.support.unavailableMessage": "A API de suporte não está acessível. Tente em breve ou abra um novo ticket quando o serviço estiver ativo.",
"empty.support.filterMessage": "Nenhum ticket corresponde a este estado. Tente outro filtro ou crie um novo ticket.",
2026-08-16 18:18:39 +02:00
"empty.support.noneMessage": "Descreva o problema e a equipa responderá neste tópico. Também receberá uma notificação na app quando a equipa responder.",
"empty.support.createTicket": "Criar ticket",
"empty.support.clearFilter": "Limpar filtro",
2026-08-16 18:18:39 +02:00
"empty.support.ticketNotFoundTitle": "Ticket não encontrado",
"empty.support.ticketNotFoundMessage": "Este ticket pode ter sido removido ou não tem acesso.",
"empty.support.noMessagesTitle": "Sem mensagens",
2026-08-16 18:18:39 +02:00
"empty.support.noMessagesMessage": "Este tópico ainda não tem mensagens.",
"empty.settings.noApiKeysTitle": "Ainda sem chaves API",
"empty.shopify.noOrdersTitle": "Ainda sem encomendas",
2026-08-16 18:18:39 +02:00
"empty.shopify.noOrdersMessage": "As encomendas aparecem após ligar o Shopify e executar uma importação. Listas vazias são normais até ao primeiro sync.",
"empty.woo.noOrdersTitle": "Ainda sem encomendas",
2026-08-16 18:18:39 +02:00
"empty.woo.noOrdersMessage": "As encomendas aparecem após ligar o WooCommerce e executar uma sincronização. Listas vazias são normais até ao primeiro sync.",
"empty.woo.noReviewsTitle": "Ainda sem avaliações",
"empty.woo.noReviewsMessage": "As avaliações aparecem após colocar na fila uma importação de uma loja ligada. Este separador continua utilizável com a lista vazia.",
"empty.admin.noProviderTitle": "Sem linhas de fornecedor",
"empty.admin.noProviderMessage": "Os tokens aparecem aqui depois de os produtos registarem um tipo de fornecedor.",
"empty.admin.noCompaniesTitle": "Sem empresas",
2026-08-16 18:18:39 +02:00
"empty.admin.noCompaniesMessage": "A lista de empresas está vazia.",
"empty.admin.noCyclesTitle": "Ainda sem ciclos de faturação",
"empty.admin.noCyclesMessage": "Os ciclos aparecem depois de as execuções de faturação criarem linhas históricas.",
"empty.admin.noCompaniesFound": "Nenhuma empresa encontrada.",
"empty.admin.noCompaniesMatch": "Nenhuma empresa corresponde a este filtro.",
2026-08-16 18:18:39 +02:00
"empty.admin.notPlatformTitle": "Não é admin da plataforma",
"empty.admin.notPlatformMessage": "A sua conta está com sessão iniciada mas não está marcada como admin da plataforma. Peça a um admin existente que conceda acesso, depois termine a sessão e inicie novamente.",
"empty.admin.noJobsFilter": "Não há trabalhos para este filtro.",
"empty.admin.noAdminUsers": "Nenhum utilizador admin encontrado",
"empty.admin.noJobs": "Nenhum trabalho encontrado.",
2026-08-16 18:18:39 +02:00
"empty.admin.queueUnavailable": "A fila de suporte não está disponível. Contacte o administrador da plataforma se persistir.",
"empty.admin.noTicketsQueue": "Não há tickets nesta fila.",
"empty.admin.knowledgeTitle": "Conhecimento de suporte",
2026-08-16 18:18:39 +02:00
"empty.admin.knowledgeNotReadyTitle": "O conhecimento de suporte não está pronto",
"empty.admin.knowledgeNotReadyMessage": "Artigos e resposta automática ainda não estão configurados neste deployment.",
"empty.admin.noTemplatesTitle": "Sem modelos de resposta",
2026-08-16 18:18:39 +02:00
"empty.admin.noTemplatesMessage": "Os modelos são correspondidos como artigos e publicados como respostas automáticas etiquetadas.",
"empty.admin.ticketNotFound": "Ticket não encontrado.",
"empty.admin.supportUnavailable": "O suporte não está disponível neste deployment.",
"empty.admin.ticketLoadFailed": "Não foi possível carregar este ticket.",
"empty.admin.noMessages": "Ainda sem mensagens.",
2026-08-16 18:18:39 +02:00
"empty.admin.translationsUnavailableTitle": "Traduções indisponíveis",
"empty.admin.translationsUnavailableMessage": "O endpoint do catálogo de traduções não está disponível nesta build.",
"empty.admin.noKeysMatchTitle": "Nenhuma chave corresponde",
2026-08-16 18:18:39 +02:00
"empty.admin.noKeysMatchMessage": "Tente outro filtro ou pesquisa, ou atualize após novas chaves serem adicionadas ao inglês.",
"empty.admin.noUsersMatch": "Nenhum utilizador corresponde a este filtro.",
"empty.admin.noCompaniesMatchFilter": "Nenhuma empresa corresponde a este filtro.",
"blast.title": "Confirmar envio em massa",
2026-08-16 18:18:39 +02:00
"blast.dryRunDescription": "O modo de simulação está ativo — nenhum e-mail real sairá do Descrybe. Confirme para registar o envio de teste.",
"blast.liveDescription": "Isto enviará e-mails reais para o seu público. Escreva I understand para continuar.",
"blast.recipients": "Destinatários neste pedido: {count}",
"blast.typePhrase": "Escreva “I understand”",
"blast.placeholder": "I understand",
2026-08-16 18:18:39 +02:00
"blast.runDryRun": "Executar simulação",
"blast.send": "Enviar blast",
"marketing.footerBefore": "As campanhas de e-mail ficam em",
2026-08-16 18:18:39 +02:00
"marketing.footerAfter": "— esta página só prepara feeds de exportação do catálogo.",
"support.title": "Centro de suporte",
2026-08-16 18:18:39 +02:00
"support.description": "Abrir a ticket for faturação, bugs, or account help. Pessoal replies show here and as in-app notifications.",
"support.newTicket": "Novo ticket",
"support.createTicket": "Criar ticket",
2026-08-16 18:18:39 +02:00
"support.loadingTickets": "A carregar tickets…",
"support.loadFailed": "Falha ao carregar tickets de suporte",
2026-08-16 18:18:39 +02:00
"support.unavailableBanner": "Suporte is not fully disponível yet. You can still prepare a ticket; submitting may wait until the service is ready.",
"support.yourTickets": "Os seus tickets",
"support.ticketCount": "{count} tickets",
"support.ticketCountOne": "{count} ticket",
2026-08-16 18:18:39 +02:00
"support.statusFilterSuffix": "· estado {status}",
"support.filterByStatus": "Filtrar by status",
2026-08-16 18:18:39 +02:00
"support.unavailableTitle": "Suporte indisponível",
"support.emptyTitle": "Ainda sem tickets",
2026-08-16 18:18:39 +02:00
"support.unavailableEmpty": "A API de suporte não está acessível. Tente em breve ou abra um novo ticket quando o serviço estiver ativo.",
"support.emptyFiltered": "Nenhum ticket corresponde a este estado. Tente outro filtro ou crie um novo ticket.",
2026-08-16 18:18:39 +02:00
"support.emptyHelp": "Descreva o problema e a equipa responderá neste tópico. Também receberá uma notificação na app quando a equipa responder.",
"support.clearFilter": "Limpar filtro",
"support.table.subject": "Assunto",
"support.table.category": "Categoria",
"support.table.status": "Estado",
"support.table.priority": "Prioridade",
"support.table.updated": "Atualizado",
"support.openTicketAria": "Abrir ticket {subject}",
"support.status.all": "Tudo",
"support.status.open": "Abrir",
"support.status.pending": "Pendente",
"support.status.resolved": "Resolvido",
"support.status.closed": "Fechado",
"support.new.title": "Novo ticket de suporte",
"support.new.description": "Diga-nos com o que precisa de ajuda. Inclua passos, mensagens de erro ou dados de fatura quando relevante.",
"support.new.back": "Voltar to tickets",
"support.new.details": "Detalhes do ticket",
"support.new.detailsHelp": "Estado starts as open. You may get an automated answer first; a human teammate can take over anytime from the same thread.",
"support.new.subject": "Assunto",
"support.new.subjectPlaceholder": "Resumo curto",
"support.new.category": "Categoria",
"support.new.priority": "Prioridade",
"support.new.optional": "Opcional details",
2026-08-16 18:18:39 +02:00
"support.new.optionalHint": "(SKU, etiquetas — ajuda o encaminhamento)",
"support.new.relatedSku": "SKU relacionado",
"support.new.relatedSkuPlaceholder": "p. ex. ABC-123",
"support.new.relatedSkuHelp": "Produto or feed SKU if this is about a specific item.",
"support.new.tags": "Etiquetas",
2026-08-16 18:18:39 +02:00
"support.new.tagsPlaceholder": "login, fatura (separados por vírgulas)",
"support.new.tagsHelp": "Até 10 rótulos curtos. Normalizamos espaços e pontuação.",
"support.new.tagsWillSend": "Será enviado: {tags}",
"support.new.message": "Mensagem",
"support.new.messagePlaceholder": "Descreva o problema, o que esperava e o que ajudar a reproduzi-lo.",
"support.new.createdTitle": "Ticket criado",
2026-08-16 18:18:39 +02:00
"support.new.createdBody": "Responderemos neste tópico. Fique atento às notificações in-app.",
"support.new.viewTicket": "Ver ticket",
2026-08-16 18:18:39 +02:00
"support.new.unavailable": "Suporte is temporarily indisponível. Your message was not submitted — try again shortly.",
"support.new.unavailableTitle": "Suporte indisponível",
"support.new.createFailed": "Não foi possível criar o ticket",
"support.ticket.fallbackTitle": "Suporte ticket",
"support.ticket.description": "Conversation thread with Descrybe suporte.",
2026-08-16 18:18:39 +02:00
"support.ticket.meta": "{category} · {priority} · Atualizado {when}",
"support.ticket.allTickets": "Tudo tickets",
2026-08-16 18:18:39 +02:00
"support.ticket.loading": "A carregar ticket…",
"support.ticket.missingId": "Falta o id do ticket",
2026-08-16 18:18:39 +02:00
"support.ticket.notFound": "Ticket não encontrado",
"support.ticket.notFoundMessage": "Este ticket pode ter sido removido ou não tem acesso.",
"support.ticket.backCenter": "Voltar to Suporte Center",
2026-08-16 18:18:39 +02:00
"support.ticket.unavailable": "O suporte está temporariamente indisponível.",
"support.ticket.loadFailed": "Falha ao carregar o ticket",
2026-08-16 18:18:39 +02:00
"support.ticket.openedMeta": "Abrired {when} · {category} · {priority} priority",
"support.ticket.sku": "SKU {sku}",
"support.ticket.messagesAria": "Mensagens do ticket",
"support.ticket.noMessages": "Sem mensagens",
2026-08-16 18:18:39 +02:00
"support.ticket.noMessagesHelp": "Este tópico ainda não tem mensagens.",
"support.ticket.yourReply": "A sua resposta",
2026-08-16 18:18:39 +02:00
"support.ticket.replyPlaceholder": "Add details or reply to suporte…",
"support.ticket.sendReply": "Enviar resposta",
"support.ticket.replySent": "Resposta enviada",
2026-08-16 18:18:39 +02:00
"support.ticket.reopened": "Ticket reaberto para revisão da equipa.",
"support.ticket.replyAdded": "A sua mensagem foi adicionada ao tópico.",
"support.ticket.replyFailed": "Não foi possível enviar a resposta",
"support.ticket.reopenHint": "Responder reabre este ticket para a equipa.",
"support.ticket.humanHint": "Replying asks a human teammate to continue from aqui.",
"support.ticket.closedBanner": "This ticket is closed. Criar a new ticket if you still need help.",
2026-08-16 18:18:39 +02:00
"support.kind.you": "Você",
"support.kind.human": "Suporte",
"support.kind.auto": "Automatizado",
"support.kind.ai": "Assistido por IA",
"support.kind.system": "Sistema",
"support.kind.autoBadge": "Resposta automatizada",
"support.kind.aiBadge": "Assistido por IA",
"support.progress.closed.title": "Ticket fechado",
"support.progress.closed.message": "This conversation is closed. Abrir a new ticket if you still need help.",
"support.progress.resolved.title": "Marcado como resolvido",
2026-08-16 18:18:39 +02:00
"support.progress.resolved.message": "Acreditamos que está resolvido. Responda para reabrir, ou deixe uma avaliação rápida abaixo.",
"support.progress.quickAnswer.title": "Resposta rápida enviada",
"support.progress.quickAnswer.message": "We shared an automated reply below. If it does not solve it, reply aqui — a human will take over.",
"support.progress.onIt.title": "Estamos a tratar",
"support.progress.onIt.handedMessage": "A suporte teammate has your ticket and will reply in this thread.",
"support.progress.onIt.pendingMessage": "Suporte is reviewing your message. You will see updates in this thread.",
"support.progress.received.title": "Ticket recebido",
2026-08-16 18:18:39 +02:00
"support.progress.received.message": "Obrigado — temos o seu pedido. Pode surgir ajuda automática em breve, ou um colega responderá.",
"support.category.billing": "Faturação",
"support.category.billing.help": "Faturas, payment methods, plan changes, and Stripe receipts.",
2026-08-16 18:18:39 +02:00
"support.category.billing_credits": "Faturação / credits",
"support.category.billing_credits.help": "Saldo de créditos, quotas de utilização e recargas.",
"support.category.bug": "Bug / erro",
2026-08-16 18:18:39 +02:00
"support.category.bug.help": "Erros inesperados, ecrãs partidos ou passos que falham sempre.",
"support.category.account": "Conta / acesso",
"support.category.account.help": "Login, invites, empresa membership, and permissions.",
2026-08-16 18:18:39 +02:00
"support.category.integrations": "Integrações",
"support.category.integrations.help": "WooCommerce, Shopify, API pública ou configuração do conector.",
"support.category.processing": "Processamento / AI",
"support.category.processing.help": "Produto processamento, AI prompts, and generation quality.",
"support.category.export": "Exportar / channels",
"support.category.export.help": "Exportar feeds, channels, and sync destinations.",
2026-08-16 18:18:39 +02:00
"support.category.migration": "Migração / dados",
"support.category.migration.help": "Dados em falta ou incorretos após o cutover — produtos, feeds, lojas, faturação ou equipa.",
"support.category.other": "Outro",
2026-08-16 18:18:39 +02:00
"support.category.other.help": "Qualquer outra coisa — encaminhamos ao colega certo.",
"support.priority.low": "Baixo",
2026-08-16 18:18:39 +02:00
"support.priority.low.help": "Desejável ou não bloqueante — trataremos por ordem.",
"support.priority.normal": "Normal",
2026-08-16 18:18:39 +02:00
"support.priority.normal.help": "Pedido padrão. A maioria dos tickets usa isto.",
"support.priority.high": "Alto",
2026-08-16 18:18:39 +02:00
"support.priority.high.help": "Bloqueia o trabalho ou afeta receita — use com parcimónia.",
"support.csat.thanks": "Obrigado pelo feedback",
2026-08-16 18:18:39 +02:00
"support.csat.unavailable": "A avaliação está temporariamente indisponível. Tente novamente mais tarde.",
"support.csat.unavailableTitle": "Avaliação indisponível",
"support.csat.alreadyRated": "Já avaliou este ticket.",
"support.csat.alreadyRatedTitle": "Já avaliado",
"support.csat.submitFailed": "Não foi possível enviar a avaliação",
"support.csat.yourRating": "A sua avaliação",
"support.csat.ratedOutOf": "Avaliou este ticket com {score} de 5",
2026-08-16 18:18:39 +02:00
"support.csat.howDidWeDo": "Como nos saímos?",
"support.csat.formHelp": "This ticket is {status}. Rate your experience (1–5). Opcional comment helps us improve.",
"support.csat.rating": "Classificação",
"support.csat.scoreAria": "{value} — {label}",
"support.csat.whatWentWrong": "What went wrong? (opcional)",
"support.csat.whatWentWrongPlaceholder": "Uma nota breve ajuda-nos no seguimento.",
"support.csat.anythingElse": "Anything else? (opcional)",
"support.csat.optionalFeedback": "Opcional feedback",
2026-08-16 18:18:39 +02:00
"support.csat.submit": "Enviar avaliação",
"support.csat.score.1": "Muito insatisfeito",
"support.csat.score.2": "Insatisfeito",
"support.csat.score.3": "OK",
"support.csat.score.4": "Satisfeito",
"support.csat.score.5": "Muito satisfeito",
"catalog.delete": "Eliminar",
2026-08-16 18:18:39 +02:00
"catalog.deleting": "A eliminar…",
"catalog.saving": "A guardar…",
"catalog.adding": "A adicionar…",
"catalog.assigning": "A atribuir…",
"catalog.uploading": "A carregar…",
"catalog.create": "Criar",
"catalog.createFailed": "Falha ao criar",
2026-08-16 18:18:39 +02:00
"catalog.updateFailed": "Falha na atualização",
"catalog.deleteFailed": "Falha ao eliminar",
2026-08-16 18:18:39 +02:00
"catalog.importFailed": "Falha na importação",
"catalog.confirm": "Confirmar",
2026-08-16 18:18:39 +02:00
"catalog.confirmDeletion": "Confirmar eliminação",
"catalog.areYouSure": "Tem a certeza?",
"catalog.previous": "Anterior",
"catalog.next": "Seguinte",
"catalog.expand": "Expandir",
"catalog.collapse": "Recolher",
"catalog.clearSearch": "Limpar pesquisa",
"catalog.clearFilters": "Limpar filtros",
2026-08-16 18:18:39 +02:00
"catalog.clearSelection": "Limpar seleção",
"catalog.add": "Adicionar",
"catalog.update": "Atualizar",
"catalog.edit": "Editar",
"catalog.accept": "Aceitar",
"catalog.reject": "Rejeitar",
"catalog.reset": "Repor",
"catalog.undo": "Anular",
"catalog.close": "Fechar",
"catalog.closePanel": "Fechar painel",
"catalog.closeMenus": "Fechar menus",
"catalog.openMenu": "Abrir menu",
2026-08-16 18:18:39 +02:00
"catalog.loading": "A carregar…",
"catalog.empty": "Vazio",
2026-08-16 18:18:39 +02:00
"catalog.required": "Obrigatório",
"catalog.optional": "Opcional",
"catalog.features": "Funcionalidades",
2026-08-16 18:18:39 +02:00
"catalog.csvImportFinished": "Importação CSV concluída.",
"catalog.comparePlans": "Comparar planos",
2026-08-16 18:18:39 +02:00
"catalog.saveChanges": "Guardar alterações",
"catalog.saveFormula": "Guardar fórmula",
"catalog.saveFormulaShort": "Guardar fórmula",
"catalog.noResults": "Sem resultados",
"products.title": "Produtos",
2026-08-16 18:18:39 +02:00
"products.description": "Explore, reveja e processe o seu catálogo.",
"products.loadFailed": "Falha ao carregar produtos",
"products.unnamed": "Produto sem nome",
"products.tabs.navLabel": "Vistas de produtos",
"products.tab.processed": "Processados",
2026-08-16 18:18:39 +02:00
"products.tab.processedHint": "Produtos concluídos prontos para exportar ou sincronizar",
"products.tab.needsReview": "Precisa de revisão",
"products.tab.needsReviewHint": "Produtos enriquecidos a aceitar, editar ou rejeitar",
"products.tab.needsReviewShort": "Rever",
"products.tab.error": "Erros",
"products.tab.errorHint": "Produtos que falharam durante um trabalho",
"products.tab.processing": "Em curso",
2026-08-16 18:18:39 +02:00
"products.tab.processingHint": "Produtos num trabalho em execução",
"products.tab.busy": "Em curso",
2026-08-16 18:18:39 +02:00
"products.tab.unprocessed": "Não processados",
"products.tab.unprocessedHint": "Produtos do catálogo ainda não processados",
"products.tab.raw": "Não processados",
"products.status.processed": "Processados",
2026-08-16 18:18:39 +02:00
"products.status.needsReview": "Precisa de revisão",
"products.status.processing": "Processamento",
"products.status.error": "Erro",
"products.status.failed": "Falhado",
2026-08-16 18:18:39 +02:00
"products.status.unprocessed": "Não processados",
"products.status.pending": "Pendente",
"products.status.unknown": "Desconhecido",
2026-08-16 18:18:39 +02:00
"products.pagination.showing": "A mostrar {start}–{end} de {total}",
"products.empty.processing.title": "Ainda sem trabalhos",
2026-08-16 18:18:39 +02:00
"products.empty.processing.messageJobs": "Nada está a correr agora. Inicie um trabalho a partir de Não processados, ou abra Processamento para ver o progresso.",
"products.empty.processing.messageBasic": "Os produtos aparecem aqui enquanto um trabalho está a decorrer.",
"products.empty.needsReview.title": "Nenhum produto a precisar de revisão",
"products.empty.needsReview.message": "Após um trabalho, os produtos enriquecidos aparecem aqui. Abra uma linha para comparar original vs enriquecido e Aceitar, editar ou Rejeitar.",
"products.empty.error.title": "Nenhum produto com erros",
"products.empty.error.message": "Quando um trabalho falha para um produto, ele aparece aqui para poder tentar novamente.",
2026-08-16 18:18:39 +02:00
"products.empty.noUnprocessedMatches": "Sem correspondências não processadas",
"products.empty.noMatch": "Nenhum produto corresponde",
2026-08-16 18:18:39 +02:00
"products.empty.filtersHint": "Tente outra pesquisa, categoria ou feed — ou limpe os filtros para ver tudo.",
"products.empty.noUnprocessed.title": "Ainda sem produtos não processados",
"products.empty.noUnprocessed.message": "Ligue um feed de fornecedor ou carregue um CSV para importar produtos.",
"products.empty.none.title": "Ainda sem produtos",
2026-08-16 18:18:39 +02:00
"products.empty.none.messageStores": "Conclua primeiro Feeds → Map → Sync e depois Process. Importe de um feed ou loja.",
"products.empty.none.messageBasic": "Conclua primeiro Feeds → Map → Sync e depois Process. Ligue um feed ou carregue um CSV.",
"products.actions.viewJobs": "Ver trabalhos",
"products.actions.startJob": "Iniciar um trabalho",
"products.actions.viewProcessed": "Ver processados",
2026-08-16 18:18:39 +02:00
"products.actions.retryFromCatalog": "Tentar novamente a partir do catálogo",
"products.actions.connectFeed": "Ligar feed",
"products.actions.addProduct": "Adicionar produto",
"products.actions.uploadCsv": "Carregar CSV",
"products.actions.exportSelected": "Exportar selecionados",
"products.export.title": "Exportar produtos selecionados",
2026-08-16 18:18:39 +02:00
"products.export.confirm": "Confirmar exportação",
"products.export.loadFailed": "Falha ao carregar as opções de feed de exportação. Tente novamente.",
"products.export.noneFound": "Ainda sem feeds de exportação. Crie um em Feeds de exportação e volte para exportar a sua seleção.",
"products.export.selectFormat": "Selecione um feed de exportação.",
"products.export.failed": "Não foi possível exportar os produtos selecionados",
"products.upload.title": "Carregar CSV",
2026-08-16 18:18:39 +02:00
"products.upload.description": "Importe produtos de um CSV (GTIN/EAN, nome, categoria, …). Descarregue o exemplo para o conjunto completo de colunas.",
"products.upload.submit": "Carregar e importar",
"products.upload.chooseFirst": "Escolha primeiro um ficheiro CSV.",
"products.upload.csvOnly": "Carregue um ficheiro CSV.",
"products.upload.tooLarge": "CSV must be 5 MB or smaller.",
"products.processing.started": "Trabalho de processamento iniciado",
2026-08-16 18:18:39 +02:00
"products.processing.startFailed": "Não foi possível iniciar o processamento",
"products.processing.startJobFailed": "Não foi possível iniciar o trabalho de processamento",
"products.processing.cancelled": "Processamento cancelado",
"products.processing.jobsCancelled": "Trabalhos de processamento cancelados",
2026-08-16 18:18:39 +02:00
"products.processing.cancelFailed": "Não foi possível cancelar o trabalho de processamento",
"products.processing.justCancelled": "O trabalho recém-iniciado foi cancelado.",
"products.processing.viewInProcessing": "Ver em Processamento",
"products.processing.confirm": "Confirmar processamento",
2026-08-16 18:18:39 +02:00
"products.processing.freePlanTitle": "Plano Free — processamento sem IA",
"products.processing.freePlanBody": "Normalizar, especificações, preencher e EPREL não consomem créditos. Títulos/descrições AI requerem um plano pago ou créditos.",
"products.enrichment.acceptTitle": "Aceitar o enriquecimento?",
2026-08-16 18:18:39 +02:00
"products.enrichment.acceptConfirm": "Confirmar aceitação do enriquecimento",
"products.enrichment.acceptSelected": "Aceitar o enriquecimento de {count} produto(s) selecionado(s)? Passarão para Processados.",
"products.enrichment.rejectConfirm": "Confirmar rejeição do enriquecimento",
"products.enrichment.rejectBody": "Rejeitar o enriquecimento e devolver este produto a não processado? Pode voltar a processar mais tarde.",
"products.enrichment.rejectSelectedConfirm": "Confirmar rejeição dos selecionados",
"products.enrichment.resetConfirm": "Confirmar reposição para não processado",
"products.enrichment.resetSelected": "Repor {count} produto(s) selecionado(s) para não processado? Voltarão a aparecer como itens não processados.",
"products.enrichment.accepted": "Enriquecimento aceite — movido para Processados.",
"products.enrichment.rejected": "Enriquecimento rejeitado — produto devolvido a não processado.",
"products.enrichment.acceptFailed": "Não foi possível aceitar o enriquecimento",
"products.enrichment.rejectFailed": "Não foi possível rejeitar o enriquecimento",
"products.enrichment.acceptUndone": "Aceitação anulada",
"products.enrichment.undoAcceptFailed": "Não foi possível anular a aceitação",
"products.enrichment.resetDone": "Produto devolvido a não processado.",
"products.enrichment.resetFailed": "Não foi possível repor os produtos",
"products.enrichment.valueReset": "Valor enriquecido reposto para o original.",
2026-08-16 18:18:39 +02:00
"products.enrichment.originalEmpty": "O valor original está vazio; o enriquecimento não pode ser limpo via PATCH.",
"products.enrichment.staysNeedsReview": "O produto permanece em Needs Review até aceitar tudo.",
"products.field.nameAcceptUndone": "Aceitação do nome anulada",
"products.field.descriptionAcceptUndone": "Aceitação da descrição anulada",
"products.field.nameDiscardUndone": "Descarte do nome anulado",
2026-08-16 18:18:39 +02:00
"products.field.descriptionDiscardUndone": "Descarte da descrição anulado",
"products.field.undoAcceptFailed": "Não foi possível anular a aceitação do campo",
"products.field.undoDiscardFailed": "Não foi possível anular o descarte do campo",
"products.updateFailed": "Não foi possível atualizar o produto",
"products.keyboardTips": "Atalhos de teclado",
"products.keyboardTipsShort": "Atalhos de teclado (?)",
"products.option.categories": "Categorias",
2026-08-16 18:18:39 +02:00
"products.option.attributes": "Atributos / especificações",
"products.option.titlesAi": "Títulos (IA)",
"products.option.descriptionsAi": "Descrições (IA)",
"products.enrichment.piece.name": "Nome",
2026-08-16 18:18:39 +02:00
"products.enrichment.piece.description": "Descrição",
"products.enrichment.piece.attributes": "Atributos",
"products.enrichment.piece.category": "Categoria",
"products.enrichment.state.processed": "Processados",
"products.enrichment.state.feed": "Do feed",
"products.enrichment.state.missing": "Em falta",
2026-08-16 18:18:39 +02:00
"products.enrichment.help.name": "Título do produto. Verde = nome processado com AI; laranja = apenas nome do feed/original; cinzento = em falta.",
"products.enrichment.help.description": "Descrição do produto. Verde = processada com AI; laranja = apenas feed/original; cinzento = em falta.",
"products.enrichment.help.attributes": "Especificações e atributos. Verde = atributos AI/enriquecidos; laranja = apenas do feed; cinzento = nenhum.",
"products.enrichment.help.category": "Categoria atribuída. Verde = categoria definida; cinzento = em falta.",
"products.enrichment.chipTitle": "{label}: {state}. {help}",
2026-08-16 18:18:39 +02:00
"products.enrichment.complete": "Completo — {parts}",
"products.enrichment.missingSummary": "Falta {missing} — {parts}",
"products.issue.title": "título",
"products.issue.gtin": "GTIN",
"products.issue.category": "categoria",
"products.filters.allCategories": "Todas as categorias",
"products.filters.allFeeds": "Todos os feeds",
"products.filters.allCoverage": "Toda a cobertura",
2026-08-16 18:18:39 +02:00
"products.filters.anyFeedChange": "Qualquer alteração de feed",
"products.filters.eprelAll": "EPREL: todos",
2026-08-16 18:18:39 +02:00
"products.filters.feedChangesAll": "Alterações de feed: todas",
"products.filters.byCategory": "Filtrar por categoria",
"products.filters.byCoverage": "Filtrar by coverage",
"products.filters.byFeed": "Filtrar por feed",
"products.filters.byEprel": "Filtrar por EPREL",
"products.filters.byFeedSync": "Filtrar by feed sync changes",
2026-08-16 18:18:39 +02:00
"products.filters.coverageHint": "Filtrar por completude de Nome / Descrição / Atributos / Categoria",
"products.filters.feedSyncHint": "Filtrar by price/stock/title changes from the latest feed sync",
2026-08-16 18:18:39 +02:00
"products.filters.eprelHint": "Filtrar produtos que têm ou não um id de registo EPREL de etiqueta energética",
"products.filters.availabilityChanged": "Disponibilidade alterada",
"products.eprel.badgeTitle": "Id EPREL presente neste produto (European Product Registry for Energy Labelling).",
2026-08-16 18:18:39 +02:00
"products.eprel.help": "O id European Product Registry for Energy Labelling (EPREL) está presente neste produto.",
"products.feedData": "Dados do feed",
"attributes.title": "Atributos",
2026-08-16 18:18:39 +02:00
"attributes.description": "Defina campos de produto, valores de lista e atribuições de categoria.",
"attributes.loadFailed": "Falha ao carregar os atributos",
2026-08-16 18:18:39 +02:00
"attributes.loading": "A carregar atributos…",
"attributes.zero": "0 atributos",
"attributes.addNew": "Adicionar novo atributo",
"attributes.create": "Criar atributo",
"attributes.edit": "Editar atributo",
"attributes.delete": "Eliminar atributo",
"attributes.displayName": "Nome a mostrar do atributo",
2026-08-16 18:18:39 +02:00
"attributes.actions": "Ações do atributo",
"attributes.created": "Atributo criado.",
2026-08-16 18:18:39 +02:00
"attributes.createdAssignFailed": "Atributo criado, mas a atribuição de categoria falhou.",
"attributes.updated": "Atributo atualizado.",
"attributes.deleted": "Atributo eliminado.",
"attributes.addValue": "Adicionar valor",
"attributes.manageValues": "Adicionar, editar ou remover valores para este atributo de lista.",
2026-08-16 18:18:39 +02:00
"attributes.valueTypeHint": "Escolha como os valores são introduzidos para este atributo.",
"attributes.createDescription": "Crie uma nova definição de atributo. Pode atribuí-la a uma categoria durante a criação.",
"attributes.assignToCategories": "Atribuir atributos a categorias",
2026-08-16 18:18:39 +02:00
"attributes.assignFailed": "Não foi possível atribuir o atributo à categoria selecionada.",
"attributes.bulkAssignFailed": "Falha na atribuição em massa",
"attributes.filterByCategory": "Filtrar por categoria",
2026-08-16 18:18:39 +02:00
"attributes.saveValueFailed": "Não foi possível guardar o valor",
"attributes.deleteValueFailed": "Não foi possível eliminar o valor",
"attributes.csvNeedHeader": "O CSV deve incluir um cabeçalho e pelo menos uma linha",
"attributes.csvNeedColumns": "O CSV deve incluir as colunas \"category_id\" e \"attribute_key\"",
"attributes.type.string": "Texto",
2026-08-16 18:18:39 +02:00
"attributes.type.stringHint": "Texto livre — nomes, modelos, notas curtas",
"attributes.type.number": "Número",
"attributes.type.numberHint": "Valor numérico; adicione uma unidade se for útil (cm, kg, W)",
"attributes.type.boolean": "Sim / Não",
"attributes.type.booleanHint": "Verdadeiro ou falso — ex. tem GPS, carregamento sem fios",
"attributes.type.date": "Data",
2026-08-16 18:18:39 +02:00
"attributes.type.dateHint": "Uma data de calendário (lançamento, fim de garantia, …)",
"attributes.type.list": "Lista pendente",
2026-08-16 18:18:39 +02:00
"attributes.type.listHint": "Escolha exatamente uma opção de uma lista definida",
"attributes.type.multiselect": "Seleção múltipla",
"attributes.type.multiselectHint": "Escolha uma ou mais opções de uma lista",
"attributes.color": "Cor",
"categories.title": "Categorias",
2026-08-16 18:18:39 +02:00
"categories.description": "Organize a hierarquia do catálogo. Edite uma categoria para abrir fórmulas de título/descrição e prompts IA.",
"categories.loadFailed": "Falha ao carregar as categorias",
"categories.add": "Adicionar categoria",
"categories.edit": "Editar categoria",
"categories.delete": "Eliminar categoria",
2026-08-16 18:18:39 +02:00
"categories.deleteConfirm": "Tem a certeza de que pretende eliminar esta categoria? Esta ação não pode ser anulada.",
"categories.name": "Nome da categoria",
"categories.namePlaceholder": "Nome da categoria",
2026-08-16 18:18:39 +02:00
"categories.descriptionPlaceholder": "Descrição opcional da categoria",
"categories.uniqueIdPlaceholder": "Identificador exclusivo opcional",
"categories.searchPlaceholder": "Pesquisar por nome ou ID...",
"categories.created": "{name} foi criado.",
"categories.updated": "A categoria foi atualizada com sucesso.",
"categories.deleted": "A categoria foi eliminada com sucesso.",
2026-08-16 18:18:39 +02:00
"categories.notFound": "Categoria não encontrada.",
"categories.loadCategoryFailed": "Falha ao carregar a categoria",
"categories.noCategoriesYet": "Ainda sem categorias",
2026-08-16 18:18:39 +02:00
"categories.noMatch": "Nenhuma categoria corresponde a “{query}”. Limpe a pesquisa ou tente outro termo.",
"categories.emptyHint": "Adicione uma categoria ou importe um CSV para construir a árvore.",
"categories.promptCountOne": "{count} categoria tem um prompt de geração IA. Abra o menu ⋮ → Editar prompt IA, ou edite uma categoria e escolha Editar prompt IA.",
"categories.promptCountMany": "{count} categorias têm um prompt de geração IA. Abra o menu ⋮ → Editar prompt IA, ou edite uma categoria e escolha Editar prompt IA.",
"categories.actions": "Ações de categoria",
"categories.chooseCsv": "Escolher CSV",
2026-08-16 18:18:39 +02:00
"categories.createSingleOrImport": "Crie uma única categoria ou importe várias a partir de CSV.",
"categories.createSingle": "Criar uma única categoria.",
"categories.missingNameColumn": "Falta a coluna obrigatória 'name'",
"categories.missingUniqueIdColumn": "Falta a coluna obrigatória 'unique_id'",
"categories.nameAndIdRequired": "O nome e o ID único são obrigatórios.",
"categories.csvNeedRows": "O ficheiro deve ter uma linha de cabeçalho e pelo menos uma linha de dados",
"categories.titleFormula": "Fórmula de título",
"categories.descriptionFormula": "Fórmula de descrição",
"categories.setTitleFormula": "Definir fórmula de título",
"categories.editTitleFormula": "Editar fórmula de título",
"categories.setDescriptionFormula": "Definir fórmula de descrição",
"categories.editDescriptionFormula": "Editar fórmula de descrição",
"categories.setAiPrompt": "Definir prompt IA",
"categories.editAiPrompt": "Editar prompt IA",
"categories.editAiPromptShort": "Editar prompt IA",
2026-08-16 18:18:39 +02:00
"categories.aiPromptSet": "Há um prompt de geração IA definido",
"categories.aiPromptTitle": "Prompt IA da categoria",
2026-08-16 18:18:39 +02:00
"categories.aiPromptDescription": "Modelo de geração por categoria usado ao enriquecer produtos nesta categoria.",
"categories.aiPromptSaved": "Prompt IA guardado.",
"categories.aiPromptCleared": "Prompt IA limpo (aplica-se o predefinido da empresa).",
"categories.aiPromptSaveFailed": "Falha ao guardar o prompt",
"categories.aiPromptAssignFailed": "Falha ao atribuir o prompt",
"categories.assignAiPrompt": "Atribuir prompt IA",
2026-08-16 18:18:39 +02:00
"categories.assignAiPromptHelp": "Copie este prompt de geração IA para outras categorias.",
"categories.loadingPrompt": "A carregar prompt…",
"categories.brandVoice": "Voz da marca",
"categories.productName": "Nome do produto",
"categories.gtin": "GTIN",
2026-08-16 18:18:39 +02:00
"categories.backToCategories": "Voltar às categorias",
"categories.cancelReturn": "Cancelar e voltar às categorias",
"categories.assignFormula": "Atribuir fórmula",
"categories.assignFormulaOther": "Atribuir fórmula a outras categorias",
"categories.assignTitleFormula": "Atribuir fórmula de título",
"categories.assignDescriptionFormula": "Atribuir fórmula de descrição",
"categories.assignSelectHelp": "Selecione as categorias a que aplicar este modelo.",
2026-08-16 18:18:39 +02:00
"categories.assignTitleHelp": "Selecione as categorias a que aplicar este modelo de fórmula de título.",
"categories.assignDescriptionHelp": "Selecione as categorias a que aplicar este modelo de fórmula de descrição.",
"categories.searchCategories": "Pesquisar categorias…",
"categories.matching": " correspondentes",
2026-08-16 18:18:39 +02:00
"categories.titleFormulaHelp": "Crie títulos de produto a partir de variáveis e texto estático para esta categoria.",
"categories.descriptionFormulaHelp": "Defina o texto meta SEO e as secções de corpo que a IA deve gerar para esta categoria.",
"categories.loadingFormula": "A carregar fórmula…",
"categories.titleFormulaSaved": "Fórmula de título guardada com êxito",
"categories.titleFormulaRemoved": "Fórmula de título removida com êxito",
"categories.titleFormulaSaveFailed": "Falha ao guardar a fórmula de título",
"categories.titleFormulaAssignFailed": "Falha ao atribuir a fórmula de título",
"categories.descriptionFormulaRemoved": "Fórmula de descrição removida com êxito",
"categories.descriptionFormulaSaved": "Fórmula de descrição guardada com sucesso",
"categories.descriptionFormulaSavedWithExports": "Fórmula de descrição guardada com sucesso e {count} IDs de exportação sincronizados",
"categories.descriptionFormulaSaveFailed": "Falha ao guardar a fórmula de descrição",
"categories.descriptionFormulaAssignFailed": "Falha ao atribuir a fórmula de descrição",
"categories.seoTitlePlaceholder": "Indique à IA como escrever o título SEO…",
"categories.seoDescriptionPlaceholder": "Indique à IA como escrever a descrição SEO…",
"categories.sectionPromptPlaceholder": "O que deve a IA escrever nesta secção?",
"categories.sectionKeyPlaceholder": "p. ex. short_description (letras, números, _)",
"categories.formulaElementTypes": "Tipos de elemento de fórmula",
"categories.formulaElements": "Elementos de fórmula",
"categories.elementSeparator": "Separador de elementos",
2026-08-16 18:18:39 +02:00
"categories.elementSeparatorHint": "Espaço, travessão, etc.",
"categories.dragToReorder": "Arraste para reordenar",
2026-08-16 18:18:39 +02:00
"categories.addCustomVariable": "Adicionar variável personalizada",
"categories.editCustomVariable": "Editar variável personalizada",
"categories.customVariableHelp": "Defina uma variável reutilizável para fórmulas de título.",
"categories.manageVariables": "Gerir variáveis",
"categories.manageVariablesHelp": "Ver, editar e adicionar variáveis para as suas fórmulas de título.",
"categories.searchVariables": "Pesquisar variáveis…",
"categories.variableAdded": "Variável adicionada com êxito",
"categories.variableUpdated": "Variável atualizada com êxito",
"categories.variableDeleted": "Variável eliminada com sucesso",
"categories.variableDeleteFailed": "Falha ao eliminar a variável",
"categories.variableNameRequired": "O nome da variável é obrigatório",
"categories.displayNameRequired": "O nome a apresentar é obrigatório",
"categories.variableNamePattern": "O nome só pode conter letras, números e underscores",
"categories.deleteVariableConfirm": "Tem a certeza de que pretende eliminar esta variável? Pode afetar fórmulas que a usam.",
"categories.removeElementConfirm": "Tem a certeza de que pretende remover este elemento da fórmula?",
"categories.addTextElement": "Adicionar elemento de texto",
2026-08-16 18:18:39 +02:00
"categories.addTextElementHelp": "Adicione um elemento de texto estático à sua fórmula.",
"categories.editTextElement": "Editar elemento de texto",
2026-08-16 18:18:39 +02:00
"categories.editTextElementHelp": "Edite o elemento de texto da sua fórmula.",
"categories.staticTextPlaceholder": "Introduzir texto estático",
"categories.textCannotBeEmpty": "O texto não pode estar vazio",
"categories.exampleProductName": "Nome do produto",
"categories.exampleWidget": "Acme Widget Pro (exemplo)",
2026-08-16 18:18:39 +02:00
"fields.title": "Campos padrão",
"fields.description": "Defina campos de produto padrão e organize-os em grupos",
"fields.loading": "A carregar campos standard…",
"fields.loadFailed": "Falha ao carregar os campos",
"fields.loadGroupsFailed": "Falha ao carregar os grupos de campos",
"fields.addField": "Adicionar novo campo",
"fields.addGroup": "Adicionar novo grupo",
"fields.createField": "Criar campo",
"fields.createGroup": "Criar grupo",
"fields.editField": "Editar campo",
"fields.editGroup": "Editar grupo",
2026-08-16 18:18:39 +02:00
"fields.basicInfo": "Informação básica",
"fields.createFieldHelp": "Crie um novo campo padrão para os seus dados de produto",
"fields.editFieldHelp": "Atualize os detalhes deste campo padrão",
"fields.createGroupHelp": "Crie um novo grupo para organizar os seus campos padrão",
"fields.editGroupHelp": "Atualize os detalhes deste grupo de campos",
"fields.dataTypeHint": "Tipo de dados deste campo",
"fields.defaultValueOptional": "Valor predefinido (opcional)",
2026-08-16 18:18:39 +02:00
"fields.fieldDescriptionPlaceholder": "Introduza uma descrição para este campo",
"fields.groupDescriptionPlaceholder": "Introduza uma descrição para este grupo",
"fields.keyHint": "Apenas letras minúsculas, números e underscores",
"fields.exampleTitle": "Título do produto",
"fields.noFields": "Nenhum campo encontrado. Clique em \"Adicionar campo\" para criar um.",
2026-08-16 18:18:39 +02:00
"fields.noFieldsMatch": "Nenhum campo corresponde à pesquisa",
"fields.noGroups": "Nenhum grupo encontrado. Crie o seu primeiro grupo.",
2026-08-16 18:18:39 +02:00
"fields.noGroupsMatch": "Nenhum grupo corresponde à pesquisa",
"fields.fieldCreated": "Campo criado com sucesso",
"fields.fieldUpdated": "Campo atualizado com sucesso",
"fields.fieldDeleted": "Campo eliminado com sucesso",
"fields.groupCreated": "Grupo criado com sucesso",
"fields.groupUpdated": "Grupo atualizado com sucesso",
"fields.groupDeleted": "Grupo eliminado com sucesso",
"fields.saveFieldFailed": "Falha ao guardar o campo",
"fields.saveGroupFailed": "Falha ao guardar o grupo",
"fields.updateFieldFailed": "Falha ao atualizar o campo",
"fields.updateUnitFailed": "Falha ao atualizar a unidade",
"fields.deleteFieldFailed": "Falha ao eliminar o campo",
"fields.deleteGroupFailed": "Falha ao eliminar o grupo",
2026-08-16 18:18:39 +02:00
"fields.bulkUpdateFailed": "Falha na atualização em massa",
"fields.enableRecommendedFailed": "Falha ao ativar os campos recomendados",
"fields.enabledRecommended": "Campos de ecommerce recomendados ativados",
2026-08-16 18:18:39 +02:00
"fields.deleteFieldConfirm": "Esta ação não pode ser anulada. Eliminará permanentemente o campo e removê-lo-á de quaisquer modelos que o usem.",
"fields.deleteGroupConfirm": "Esta ação não pode ser anulada. Eliminará permanentemente o grupo. Os campos deste grupo terão de ser reatribuídos.",
"fields.type.string": "Texto",
2026-08-16 18:18:39 +02:00
"fields.type.stringHint": "Texto livre: nomes, códigos, notas curtas",
"fields.type.number": "Número",
"fields.type.numberHint": "Valor numérico; adicione uma unidade quando for útil (EUR, pcs)",
"fields.type.boolean": "Sim / Não",
"fields.type.booleanHint": "Verdadeiro ou falso",
"fields.type.date": "Data",
2026-08-16 18:18:39 +02:00
"fields.type.dateHint": "Uma data de calendário",
"fields.type.url": "URL",
2026-08-16 18:18:39 +02:00
"fields.type.urlHint": "Ligação web (página de produto, vídeo, fabricante)",
"fields.type.image": "Imagem",
"fields.type.imageHint": "URL de imagem ou imagem de galeria",
2026-08-16 18:18:39 +02:00
"fields.type.dimension": "Dimensão",
"fields.type.dimensionHint": "Medida de comprimento (largura, altura, profundidade)",
"fields.type.weight": "Peso",
"fields.type.weightHint": "Massa / peso de envio",
"fields.type.color": "Cor",
2026-08-16 18:18:39 +02:00
"fields.type.colorHint": "Nome ou código de cor",
"fields.type.custom": "Personalizado",
"fields.type.customHint": "Campo especial / livre",
"empty.admin.knowledgeHeading": "Conhecimento de suporte",
2026-08-16 18:18:39 +02:00
"empty.admin.translationsHeading": "Traduções",
"flash.attrs.createdLinkFailed": "Atributo criado, mas a atribuição de categoria falhou.",
"flash.attrs.created": "Atributo criado.",
2026-08-16 18:18:39 +02:00
"flash.attrs.csvImported": "Importação CSV concluída.",
"flash.attrs.updated": "Atributo atualizado.",
"flash.attrs.deleted": "Atributo eliminado.",
"flash.attrs.valueDeleted": "Valor eliminado.",
2026-08-16 18:18:39 +02:00
"flash.attrs.assignedLinks": "Atribuída(s) {count} ligação(ões) categoria–atributo.",
"flash.brand.saved": "Kit de marca guardado.",
2026-08-16 18:18:39 +02:00
"flash.brand.logoType": "O logótipo deve ser PNG, JPEG ou WebP",
"flash.brand.logoSize": "O logótipo excede o limite de 2 MiB",
"flash.brand.logoUploaded": "Logótipo carregado.",
"flash.categories.updated": "A categoria foi atualizada com sucesso.",
"flash.categories.deleted": "A categoria foi eliminada com sucesso.",
2026-08-16 18:18:39 +02:00
"flash.categories.csvImported": "Importação CSV concluída.",
"flash.products.csvImported": "Product CSV import finished.",
2026-08-16 18:18:39 +02:00
"flash.categories.descFormulaAssigned": "Fórmula de descrição atribuída a {count} categorias",
"flash.categories.promptAssigned": "Prompt atribuído a {count} {noun}.",
"flash.categories.promptNounOne": "categoria",
"flash.categories.promptNounMany": "categorias",
2026-08-16 18:18:39 +02:00
"flash.categories.titleFormulaAssigned": "Fórmula de título atribuída a {count} {noun}",
"flash.categories.variableDeleted": "Variável eliminada com sucesso",
"flash.export.updated": "Feed de exportação atualizado.",
"flash.export.created": "Feed de exportação criado.",
"flash.export.urlCopied": "URL público do feed {format} copiado. Cole-o em qualquer sistema que obtenha feeds de produto.",
"flash.export.copyFailed": "Falha ao copiar o URL para a área de transferência",
"flash.export.refreshed": "Feed atualizado.",
"flash.export.refreshedWithCount": "Feed atualizado ({count} produtos).",
2026-08-16 18:18:39 +02:00
"flash.export.deleted": "Feed de exportação eliminado com sucesso.",
"flash.export.tokenRotated": "Token do URL publico rodado. Atualize sistemas que usam o URL antigo.",
"common.edit": "Editar",
"common.previous": "Anterior",
"common.next": "Seguinte",
2026-08-16 18:18:39 +02:00
"common.saving": "A guardar…",
"common.deleting": "A eliminar…",
"common.adding": "A adicionar…",
"common.processing": "A processar…",
"common.upload": "Carregar",
"common.expand": "Expandir",
"common.collapse": "Recolher",
"common.optional": "Opcional",
"common.enabled": "Ativado",
"common.on": "Ligado",
"common.off": "Desligado",
"common.system": "Sistema",
"common.type": "Tipo",
"common.unit": "Unidade",
"common.group": "Grupo",
"common.search": "Pesquisar",
"common.openMenu": "Abrir menu",
"common.areYouSure": "Tem a certeza?",
"common.selectGroup": "Selecionar um grupo",
"attributes.addAttribute": "Adicionar atributo",
2026-08-16 18:18:39 +02:00
"attributes.searchPlaceholder": "Pesquisar atributos…",
"attributes.searchAria": "Pesquisar atributos (prima Enter para pesquisar)",
"attributes.filterCategoryAria": "Filtrar por categoria",
"attributes.allCategories": "Todas as categorias",
"attributes.col.name": "Nome",
"attributes.col.key": "Chave do atributo",
"attributes.col.type": "Tipo",
"attributes.col.unit": "Unidade",
"attributes.col.categories": "Categorias",
2026-08-16 18:18:39 +02:00
"attributes.col.updated": "Última atualização",
"attributes.col.actions": "Ações",
"attributes.emptyTitle": "Nenhum atributo encontrado",
"attributes.emptyFiltered": "Tente limpar a pesquisa ou o filtro de categoria.",
2026-08-16 18:18:39 +02:00
"attributes.emptyHint": "Adicione um atributo ou importe um CSV para começar.",
"attributes.noValues": "Sem valores",
2026-08-16 18:18:39 +02:00
"attributes.actionsAria": "Ações do atributo",
"attributes.editDetails": "Editar detalhes",
"attributes.loadingValues": "A carregar valores...",
"attributes.noValuesYetHint": "Ainda sem valores. Use \"Manage Values\" para adicionar valores.",
"attributes.pageZero": "0 atributos",
2026-08-16 18:18:39 +02:00
"attributes.pageShowing": "A mostrar {from}–{to} de {total} atributos",
"attributes.linkCategoryFailed": "Não foi possível atribuir o atributo à categoria selecionada.",
"attributes.createdLinkFailed": "Atributo criado, mas a atribuição de categoria falhou.",
"attributes.createFailed": "Falha ao criar",
2026-08-16 18:18:39 +02:00
"attributes.importFinished": "Importação CSV concluída.",
"attributes.importFailed": "Falha na importação",
"attributes.updateFailed": "Falha na atualização",
"attributes.deleteFailed": "Falha ao eliminar",
"attributes.valueUpdated": "Valor atualizado.",
"attributes.valueAdded": "Valor adicionado.",
2026-08-16 18:18:39 +02:00
"attributes.valueSaveFailed": "Não foi possível guardar o valor",
"attributes.valueDeleted": "Valor eliminado.",
2026-08-16 18:18:39 +02:00
"attributes.valueDeleteFailed": "Não foi possível eliminar o valor",
"attributes.csvNeedRows": "O CSV deve incluir um cabeçalho e pelo menos uma linha",
"attributes.rowUnknown": "Linha {row}: categoria ou atributo desconhecido",
"attributes.rowLinkFailed": "Linha {row}: {detail}",
2026-08-16 18:18:39 +02:00
"attributes.linkFailedShort": "falha no vínculo",
"attributes.assignedLinks": "Atribuída(s) {count} ligação(ões) categoria–atributo.",
"attributes.rowsFailed": "{count} linha(s) falharam.",
"attributes.addTitle": "Adicionar novo atributo",
2026-08-16 18:18:39 +02:00
"attributes.addDesc": "Crie uma nova definição de atributo. Pode atribuí-la a uma categoria durante a criação.",
"attributes.tab.single": "Individual",
2026-08-16 18:18:39 +02:00
"attributes.tab.bulk": "Importação em massa",
"attributes.field.key": "Chave do atributo",
"attributes.field.keyPlaceholder": "atributo-key",
"attributes.field.displayName": "Nome a mostrar",
"attributes.field.displayNamePlaceholder": "Nome a mostrar do atributo",
"attributes.field.type": "Tipo",
2026-08-16 18:18:39 +02:00
"attributes.field.typeDefaultHint": "Escolha como os valores são introduzidos para este atributo.",
"attributes.field.category": "Categoria",
2026-08-16 18:18:39 +02:00
"attributes.field.categoryPlaceholder": "Selecionar uma categoria…",
"attributes.field.categoryHint": "Selecione a categoria a que este atributo pertence. Os atributos devem ser atribuídos a uma categoria.",
"attributes.field.unitOptional": "Unidade (opcional)",
"attributes.field.unitPlaceholder": "p. ex. cm, kg, etc.",
"attributes.field.exampleOptional": "Exemplo (opcional)",
"attributes.field.examplePlaceholder": "p. ex. 100x200",
"attributes.createAttribute": "Criar atributo",
"attributes.bulk.fileLabel": "Ficheiro CSV ou TSV",
"attributes.bulk.downloadCsv": "Transferir modelo CSV",
"attributes.bulk.downloadTsv": "Transferir modelo TSV",
"attributes.bulk.uploadHint": "Carregue um ficheiro CSV ou TSV com as seguintes colunas:",
2026-08-16 18:18:39 +02:00
"attributes.bulk.col.key": "Identificador único (obrigatório)",
"attributes.bulk.col.name": "Nome a mostrar (obrigatório)",
"attributes.bulk.col.valueType": "string (Texto), number, boolean (Sim/Não), date, list (Lista pendente), multiselect",
"attributes.bulk.col.categoryId": "ID único da categoria",
"attributes.bulk.col.unitExample": "opcional",
"attributes.bulk.col.parentKey": "Chave pai para valores de lista",
"attributes.editTitle": "Editar atributo",
"attributes.editDesc": "Atualizar os detalhes do atributo \"{name}\"",
2026-08-16 18:18:39 +02:00
"attributes.field.keyHint": "Identificador único deste atributo",
"attributes.field.displayNameHint": "O nome que será mostrado aos utilizadores",
"attributes.deleteTitle": "Eliminar atributo",
2026-08-16 18:18:39 +02:00
"attributes.deleteDesc": "Tem a certeza de que pretende eliminar \"{name}\"? Esta ação não pode ser anulada.",
"attributes.deleteWarningValues": "Aviso: isto também eliminará todos os valores associados a este atributo.",
"attributes.manageTitleNamed": "Gerir valores de {name}",
"attributes.manageTitle": "Gerir valores",
"attributes.manageDesc": "Adicionar, editar ou remover valores para este atributo de lista.",
"attributes.valueKey": "Chave do valor",
2026-08-16 18:18:39 +02:00
"attributes.valueKeyHint": "Identificador único deste valor",
"attributes.displayValue": "Valor a mostrar",
"attributes.displayValuePlaceholder": "Valor a mostrar",
2026-08-16 18:18:39 +02:00
"attributes.displayValueHint": "O nome a mostrar que será apresentado para este valor",
"attributes.updateValue": "Atualizar valor",
"attributes.noValuesYet": "Ainda sem valores.",
"attributes.assignTitle": "Atribuir atributos a categorias",
2026-08-16 18:18:39 +02:00
"attributes.assignDesc": "Carregue um CSV que mapeia IDs únicos de categoria para chaves de atributo.",
"attributes.downloadTemplate": "Transferir modelo",
"attributes.csvFile": "Ficheiro CSV",
2026-08-16 18:18:39 +02:00
"attributes.assignSuccess": "Atribuições aplicadas com sucesso.",
"attributes.assigning": "A atribuir…",
"attributes.uploadAndAssign": "Carregar e atribuir",
"attributes.type.string.label": "Texto",
2026-08-16 18:18:39 +02:00
"attributes.type.string.hint": "Texto livre — nomes, modelos, notas curtas",
"attributes.type.number.label": "Número",
"attributes.type.number.hint": "Valor numérico; adicione uma unidade se for útil (cm, kg, W)",
"attributes.type.boolean.label": "Sim / Não",
"attributes.type.boolean.hint": "Verdadeiro ou falso — ex. tem GPS, carregamento sem fios",
"attributes.type.date.label": "Data",
2026-08-16 18:18:39 +02:00
"attributes.type.date.hint": "Uma data de calendário (lançamento, fim de garantia, …)",
"attributes.type.list.label": "Lista pendente",
2026-08-16 18:18:39 +02:00
"attributes.type.list.hint": "Escolha exatamente uma opção de uma lista definida",
"attributes.type.multiselect.label": "Seleção múltipla",
"attributes.type.multiselect.hint": "Escolha uma ou mais opções de uma lista",
"standardFields.title": "Campos padrão",
"standardFields.description": "Defina campos de produto padrão e organize-os em grupos",
"standardFields.apiUnavailable": "A API de campos standard não está disponível. As alterações não podem ser guardadas.",
"standardFields.apiUnreachable": "A API de campos padrão não está acessível agora. Criar/editar permanece desativado até /api/standard-fields e /api/field-groups responderem.",
"standardFields.loading": "A carregar campos standard…",
"standardFields.tab.fields": "Campos",
"standardFields.tab.groups": "Grupos",
2026-08-16 18:18:39 +02:00
"standardFields.heading": "Campos padrão",
"standardFields.headingHint": "Ative campos para mapeamento e processamento — um interruptor por linha.",
"standardFields.enableRecommended": "Ativar recomendados",
"standardFields.enableSelected": "Ativar selecionados ({count})",
"standardFields.disableSelected": "Desativar selecionados",
"standardFields.addField": "Adicionar campo",
"standardFields.searchFields": "Pesquisar campos...",
"standardFields.col.enabled": "Ativado",
"standardFields.col.name": "Nome",
"standardFields.col.key": "Chave",
"standardFields.col.type": "Tipo",
"standardFields.col.unit": "Unidade",
"standardFields.col.group": "Grupo",
"standardFields.col.status": "Estado",
2026-08-16 18:18:39 +02:00
"standardFields.emptySearch": "Nenhum campo corresponde à pesquisa",
"standardFields.emptyHint": "Nenhum campo encontrado. Clique em \"Adicionar campo\" para criar um.",
"standardFields.selectFieldAria": "Selecionar {name}",
"standardFields.enableFieldAria": "Ativar {name}",
2026-08-16 18:18:39 +02:00
"standardFields.systemFieldTitle": "Campo de sistema — não pode ser eliminado",
"standardFields.groupsHeading": "Grupos de campos",
"standardFields.addGroup": "Adicionar grupo",
"standardFields.searchGroups": "Pesquisar grupos...",
2026-08-16 18:18:39 +02:00
"standardFields.col.description": "Descrição",
"standardFields.col.displayOrder": "Ordem de apresentação",
"standardFields.emptyGroupsSearch": "Nenhum grupo corresponde à pesquisa",
"standardFields.emptyGroupsHint": "Nenhum grupo encontrado. Crie o seu primeiro grupo.",
"standardFields.unknownGroup": "Grupo desconhecido",
"standardFields.loadGroupsFailed": "Falha ao carregar os grupos de campos",
"standardFields.loadFieldsFailed": "Falha ao carregar os campos",
"standardFields.fieldUpdated": "Campo atualizado com sucesso",
"standardFields.fieldCreated": "Campo criado com sucesso",
"standardFields.saveFieldFailed": "Falha ao guardar o campo",
"standardFields.enabledNamed": "Ativado {name}",
"standardFields.disabledNamed": "{name} desativado",
"standardFields.updateFieldFailed": "Falha ao atualizar o campo",
"standardFields.updateUnitFailed": "Falha ao atualizar a unidade",
"standardFields.bulkEnabled": "{count} campo(s) ativado(s)",
"standardFields.bulkDisabled": "{count} campo(s) desativado(s)",
2026-08-16 18:18:39 +02:00
"standardFields.bulkFailed": "Falha na atualização em massa",
"standardFields.recommendedEnabled": "Campos de ecommerce recomendados ativados",
"standardFields.recommendedFailed": "Falha ao ativar os campos recomendados",
"standardFields.fieldDeleted": "Campo eliminado com sucesso",
"standardFields.deleteFieldFailed": "Falha ao eliminar o campo",
"standardFields.groupUpdated": "Grupo atualizado com sucesso",
"standardFields.groupCreated": "Grupo criado com sucesso",
"standardFields.saveGroupFailed": "Falha ao guardar o grupo",
"standardFields.groupDeleted": "Grupo eliminado com sucesso",
"standardFields.deleteGroupFailed": "Falha ao eliminar o grupo",
"standardFields.editField": "Editar campo",
"standardFields.addNewField": "Adicionar novo campo",
2026-08-16 18:18:39 +02:00
"standardFields.editFieldDesc": "Atualize os detalhes deste campo padrão",
"standardFields.addFieldDesc": "Crie um novo campo padrão para os seus dados de produto",
"standardFields.field.name": "Nome",
2026-08-16 18:18:39 +02:00
"standardFields.field.namePlaceholder": "Título do produto",
"standardFields.field.nameHint": "Nome a mostrar deste campo",
"standardFields.field.key": "Chave",
"standardFields.field.keyPlaceholder": "titulo_produto",
2026-08-16 18:18:39 +02:00
"standardFields.field.keyTitle": "Apenas letras minúsculas, números e underscores",
"standardFields.field.keyHint": "Identificador exclusivo (minúsculas, sem espaços)",
"standardFields.field.type": "Tipo",
"standardFields.field.typeDefaultHint": "Tipo de dados deste campo",
"standardFields.field.group": "Grupo",
"standardFields.field.groupHint": "Grupo a que este campo pertence",
"standardFields.field.enabled": "Ativado",
"standardFields.field.enabledHint": "Usar este campo no mapeamento e no processamento",
2026-08-16 18:18:39 +02:00
"standardFields.field.required": "Campo obrigatório",
"standardFields.field.requiredHint": "Os campos obrigatórios devem ser mapeados em cada feed antes de os produtos poderem sincronizar.",
"standardFields.field.unit": "Unidade",
2026-08-16 18:18:39 +02:00
"standardFields.field.unitPlaceholder": "kg, EUR, cm…",
"standardFields.field.unitHint": "Unidade opcional mostrada com este campo",
2026-08-16 18:18:39 +02:00
"standardFields.field.description": "Descrição",
"standardFields.field.descriptionPlaceholder": "Introduza uma descrição para este campo",
"standardFields.field.default": "Valor predefinido",
"standardFields.field.defaultPlaceholder": "Valor predefinido (opcional)",
2026-08-16 18:18:39 +02:00
"standardFields.field.defaultHint": "Valor predefinido quando nenhum valor é fornecido",
"standardFields.saveUnavailable": "Guardar (indisponível)",
"standardFields.updateField": "Atualizar campo",
"standardFields.createField": "Criar campo",
"standardFields.editGroup": "Editar grupo",
"standardFields.addNewGroup": "Adicionar novo grupo",
"standardFields.editGroupDesc": "Atualize os detalhes deste grupo de campos",
2026-08-16 18:18:39 +02:00
"standardFields.addGroupDesc": "Crie um novo grupo para organizar os seus campos padrão",
"standardFields.group.name": "Nome",
2026-08-16 18:18:39 +02:00
"standardFields.group.namePlaceholder": "Informação básica",
"standardFields.group.nameHint": "Nome a mostrar deste grupo",
2026-08-16 18:18:39 +02:00
"standardFields.group.description": "Descrição",
"standardFields.group.descriptionPlaceholder": "Introduza uma descrição para este grupo",
"standardFields.group.descriptionHint": "Descrição opcional que explica o propósito deste grupo",
"standardFields.group.order": "Ordem de apresentação",
"standardFields.group.orderHint": "Números mais baixos aparecem primeiro",
"standardFields.updateGroup": "Atualizar grupo",
"standardFields.createGroup": "Criar grupo",
2026-08-16 18:18:39 +02:00
"standardFields.deleteFieldDesc": "Esta ação não pode ser anulada. Eliminará permanentemente o campo e removê-lo-á de quaisquer modelos que o usem.",
"standardFields.deleteGroupDesc": "Esta ação não pode ser anulada. Eliminará permanentemente o grupo. Os campos deste grupo terão de ser reatribuídos.",
"standardFields.type.string.label": "Texto",
2026-08-16 18:18:39 +02:00
"standardFields.type.string.hint": "Texto livre: nomes, códigos, notas curtas",
"standardFields.type.number.label": "Número",
"standardFields.type.number.hint": "Valor numérico; adicione uma unidade quando for útil (EUR, pcs)",
"standardFields.type.boolean.label": "Sim / Não",
"standardFields.type.boolean.hint": "Verdadeiro ou falso",
"standardFields.type.date.label": "Data",
2026-08-16 18:18:39 +02:00
"standardFields.type.date.hint": "Uma data de calendário",
"standardFields.type.url.label": "URL",
2026-08-16 18:18:39 +02:00
"standardFields.type.url.hint": "Ligação web (página de produto, vídeo, fabricante)",
"standardFields.type.image.label": "Imagem",
"standardFields.type.image.hint": "URL de imagem ou imagem de galeria",
2026-08-16 18:18:39 +02:00
"standardFields.type.dimension.label": "Dimensão",
"standardFields.type.dimension.hint": "Medida de comprimento (largura, altura, profundidade)",
"standardFields.type.weight.label": "Peso",
"standardFields.type.weight.hint": "Massa / peso de envio",
"standardFields.type.color.label": "Cor",
2026-08-16 18:18:39 +02:00
"standardFields.type.color.hint": "Nome ou código de cor",
"standardFields.type.custom.label": "Personalizado",
"standardFields.type.custom.hint": "Campo especial / livre",
"standardFields.fallback.gtin": "GTIN/EAN",
"standardFields.fallback.title": "Nome do produto",
"standardFields.fallback.brand": "Marca",
2026-08-16 18:18:39 +02:00
"standardFields.fallback.description": "Descrição",
"standardFields.fallback.product_model": "Modelo do produto",
2026-08-16 18:18:39 +02:00
"standardFields.fallback.price": "Preço",
"standardFields.fallback.sale_price": "Preço promocional",
"standardFields.fallback.purchase_price": "Preço de compra",
"standardFields.fallback.currency": "Moeda",
"standardFields.fallback.image_url": "URL da imagem",
"standardFields.fallback.main_image": "Imagem principal",
"standardFields.fallback.additional_image_urls": "Imagens adicionais",
"standardFields.fallback.product_url": "URL do produto",
2026-08-16 18:18:39 +02:00
"standardFields.fallback.official_link": "Ligação oficial",
"standardFields.fallback.sku": "SKU",
"standardFields.fallback.mpn": "MPN",
"standardFields.fallback.category": "Categoria",
"standardFields.fallback.availability": "Disponibilidade",
2026-08-16 18:18:39 +02:00
"standardFields.fallback.stock": "Existências",
"standardFields.fallback.color": "Cor",
"standardFields.fallback.size": "Tamanho",
"standardFields.fallback.material": "Material",
"standardFields.fallback.warranty": "Garantia",
2026-08-16 18:18:39 +02:00
"standardFields.fallback.service": "Serviço",
"standardFields.fallback.weight": "Peso",
2026-08-16 18:18:39 +02:00
"standardFields.fallback.net_depth": "Profundidade líquida",
"standardFields.fallback.net_height": "Altura líquida",
"standardFields.fallback.net_width": "Largura líquida",
"standardFields.fallback.net_mass": "Massa líquida",
"standardFields.fallback.video_url": "URL do vídeo",
"standardFields.fallback.eprel_id": "ID EPREL",
2026-08-16 18:18:39 +02:00
"standardFields.fallback.specs": "Especificações",
"standardFields.fallback.specifications": "Especificações (legacy)",
"standardFields.tip.gtin": "Global Trade Item Number — código de barras/EAN/UPC que identifica o produto.",
"standardFields.tip.title": "Nome do produto voltado ao cliente, mostrado em catálogos e canais.",
"standardFields.tip.brand": "Nome do fabricante ou da marca (não do retalhista).",
"standardFields.tip.description": "Texto de produto mais longo; usado para enriquecimento e listagens de canal.",
2026-08-16 18:18:39 +02:00
"standardFields.tip.product_model": "Nome/número de modelo do fabricante.",
"standardFields.tip.price": "Preço de venda regular (numérico; moeda mapeada em separado).",
"standardFields.tip.sale_price": "Preço com desconto ou promocional em promoção.",
"standardFields.tip.purchase_price": "O seu custo / preço de compra (interno).",
"standardFields.tip.currency": "Código ISO de moeda para campos de preço (p. ex. EUR, USD).",
"standardFields.tip.image_url": "URL da imagem principal do produto.",
"standardFields.tip.main_image": "URL da imagem principal da galeria (alias de image).",
2026-08-16 18:18:39 +02:00
"standardFields.tip.additional_image_urls": "URL de imagens adicionais (separadas por vírgulas ou nós repetidos).",
"standardFields.tip.product_url": "URL pública da página do produto na sua loja ou site.",
"standardFields.tip.official_link": "URL da página do fabricante ou da marca.",
"standardFields.tip.sku": "Stock Keeping Unit — o seu código interno de artigo.",
"standardFields.tip.mpn": "Manufacturer Part Number — código de peça do fornecedor.",
"standardFields.tip.category": "Categoria de produto ou caminho de taxonomia.",
2026-08-16 18:18:39 +02:00
"standardFields.tip.availability": "Estado do tipo em stock / esgotado / pré-encomenda.",
"standardFields.tip.stock": "Quantidade de inventário numérica.",
"standardFields.tip.color": "Atributo de cor para variantes.",
"standardFields.tip.size": "Atributo de tamanho para variantes.",
2026-08-16 18:18:39 +02:00
"standardFields.tip.material": "Material principal ou composição.",
"standardFields.tip.warranty": "Prazo ou texto de garantia.",
2026-08-16 18:18:39 +02:00
"standardFields.tip.service": "Notas de serviço ou suporte.",
"standardFields.tip.weight": "Peso de envio ou líquido.",
"standardFields.tip.eprel_id": "Identificador de produto do rótulo energético da UE (EPREL).",
"standardFields.tip.specs": "Especificações técnicas estruturadas.",
"standardFields.tip.specifications": "Campo de specs legado; preferir specs quando ambos existirem.",
"export.dialog.title": "Exportar produtos selecionados",
2026-08-16 18:18:39 +02:00
"export.dialog.description": "Exportar {count} produto(s) selecionado(s). Escolha o feed de exportação que define formato e campos — como escolher o que sincronizar, mas para download ou parceiro.",
"export.dialog.loadFailed": "Falha ao carregar as opções de feed de exportação. Tente novamente.",
"export.dialog.selectPlaceholder": "Selecione um feed de exportação…",
"export.dialog.help": "A sua seleção escolhe os produtos; o feed escolhe o formato do canal e os campos mapeados.",
"export.dialog.emptyTitle": "Ainda sem feeds de exportação",
"export.dialog.emptyMessage": "Crie um feed de exportação para escolher formato e campos e volte para exportar esta seleção.",
"export.dialog.createFeedCta": "Criar feed de exportação",
"export.dialog.confirmAria": "Confirmar exportação",
"export.dialog.export": "Exportar",
2026-08-16 18:18:39 +02:00
"billing.title": "Uso e faturação",
"billing.loadFailed": "Falha ao carregar a faturação",
"billing.usageLoadFailed": "Falha ao carregar a utilização",
"billing.checkoutComplete": "Checkout concluído. O seu plano e créditos serão atualizados em breve.",
"billing.checkoutCompletePlan": "Plano atualizado. Os seus créditos {plan} estão prontos.",
"billing.checkoutCanceled": "O Checkout foi cancelado. Não foram feitas alterações.",
"billing.portalReturned": "Regressou do portal de faturação. Faça a gestão do plano aqui ou em Plans.",
"billing.comparePlans": "Comparar planos",
"billing.managePayment": "Gerir pagamento",
2026-08-16 18:18:39 +02:00
"billing.addCredits": "Adicionar créditos",
"billing.addingCredits": "A adicionar…",
"billing.addCreditsTitle": "Adicionar créditos",
"billing.addCreditsDescription": "Apenas administrador da plataforma. Os créditos ficam disponíveis de imediato para títulos de IA, descrições e outros passos pagos.",
"billing.creditAmount": "Montante de crédito",
"billing.invalidCreditAmount": "Introduza um montante de créditos válido.",
"billing.companyNotFound": "Empresa não encontrada.",
"billing.creditsAdded": "Foram adicionados {amount} créditos.",
"billing.addCreditsFailed": "Falha ao adicionar créditos. Pode ser necessário acesso de administrador da plataforma.",
"billing.planApplied": "Plano aplicado. Os seus créditos estão prontos.",
"billing.checkoutFailed": "Checkout falhou",
2026-08-16 18:18:39 +02:00
"billing.portalFailed": "Não foi possível abrir o portal de faturação",
"billing.noPlanAssigned": "Nenhum plano atribuído",
"billing.unlimited": "Ilimitado",
"billing.payAsYouGo": "Pagamento conforme o uso",
2026-08-16 18:18:39 +02:00
"billing.noMonthlyAiCredits": "Sem créditos de IA mensais",
"billing.header.noPlan": "Ainda sem plano atribuído. Escolha um plano ou peça a um administrador.",
"billing.header.free": "Mapeie feeds e limpe dados de produto sem créditos de IA.",
"billing.header.enterprise": "Produtos e capacidade de IA ilimitados.",
2026-08-16 18:18:39 +02:00
"billing.header.payg": "Pay as you go — os créditos vêm da carteira da empresa.",
"billing.header.remaining": "{remaining} créditos de IA restantes neste período.",
"billing.na": "N/D",
2026-08-16 18:18:39 +02:00
"billing.range.7d": "últimos 7 dias",
"billing.range.30d": "últimos 30 dias",
"billing.range.cycle": "ciclo de faturação atual",
"billing.range.all": "de sempre",
2026-08-16 18:18:39 +02:00
"billing.rangeOpt.7d": "Últimos 7 dias",
"billing.rangeOpt.30d": "Últimos 30 dias",
"billing.rangeOpt.cycle": "Ciclo atual",
"billing.rangeOpt.all": "De sempre",
2026-08-16 18:18:39 +02:00
"billing.freeBannerTitle": "Está no plano Free",
"billing.freeBannerMessage": "Atualize para títulos e descrições de IA e limites de produtos mais elevados.",
"billing.outOfCreditsTitle": "Ficou sem créditos de IA",
"billing.productLimitTitle": "Limite de produtos atingido",
2026-08-16 18:18:39 +02:00
"billing.outOfCreditsMessage": "Os títulos e descrições de IA estão em pausa até adicionar créditos ou atualizar o plano.",
"billing.productLimitMessage": "Atualize para mais capacidade de produtos.",
2026-08-16 18:18:39 +02:00
"billing.lowCreditsTitle": "Créditos a esgotar-se",
"billing.lowCreditsMessage": "Restam apenas {remaining} créditos em {plan}. Atualize antes do próximo lote grande.",
"billing.currentPlan": "Plano atual",
2026-08-16 18:18:39 +02:00
"billing.periodEnds": "O período de faturação termina a {date}",
"billing.openEndedContract": "Contrato aberto",
2026-08-16 18:18:39 +02:00
"billing.creditWallet": "Carteira de créditos",
"billing.creditsRemaining": "Créditos restantes",
"billing.enterpriseCapacity": "Capacidade gerida empresarial",
2026-08-16 18:18:39 +02:00
"billing.paygUsed": "{used} usados · sem atribuição mensal",
"billing.trialLeftover": "Créditos de teste / restantes",
"billing.aiLockedFree": "IA bloqueada no Free",
"billing.usedOf": "{used} usados de {total}",
2026-08-16 18:18:39 +02:00
"billing.noBalanceTitle": "Ainda sem saldo de créditos",
"billing.noBalanceBody": "Os créditos do seu plano aparecerão aqui assim que a faturação estiver configurada neste espaço de trabalho.",
"billing.needCapacity": "Precisa de mais capacidade?",
2026-08-16 18:18:39 +02:00
"billing.selfServeUpgrade": "Atualização self-service para Starter, Growth ou Business",
"billing.viaStripe": "via Stripe",
2026-08-16 11:37:42 +02:00
"billing.checkoutUnavailable": "As compras self-service nao estao disponiveis ate o Stripe ser configurado. Contacte as vendas para um plano.",
"billing.upgradeToGrowth": "Atualizar para Growth",
2026-08-16 18:18:39 +02:00
"billing.askAdminPlan": "Peça a um administrador da empresa para alterar o plano.",
"billing.usage": "Uso",
2026-08-16 18:18:39 +02:00
"billing.productsProcessed": "{count} produtos processados · {range}",
"billing.updating": "A atualizar…",
"billing.productsByDay": "Produtos por dia",
2026-08-16 18:18:39 +02:00
"billing.chartAmber": "Âmbar = tokens. Intervalo: {range}.",
"billing.chartRange": "Intervalo: {range}.",
"billing.nothingToChartTitle": "Ainda nada para graficar",
2026-08-16 18:18:39 +02:00
"billing.nothingToChartBody": "Adicione produtos ou ligue um feed — a utilização aparecerá aqui.",
"billing.dailyChartsHint": "Os gráficos diários estão disponíveis para os últimos 7 dias, 30 dias ou o ciclo de faturação atual.",
"billing.noNewProducts": "Sem produtos novos em {range}",
2026-08-16 18:18:39 +02:00
"billing.catalogOverall": "O catálogo tem {count} produtos no total.",
"billing.chartProducts": "Produtos",
"billing.chartTokens": "Fichas",
2026-08-16 18:18:39 +02:00
"billing.chartEmpty": "Sem produtos neste período.",
"billing.adminStats": "{tokens} tokens · {jobs} trabalhos · {input} feeds de entrada / {export} de exportação",
"billing.whatUsesCredits": "O que consome créditos",
"billing.burnsCredits": "Consome créditos",
"billing.noCreditCost": "Sem custo de créditos",
"billing.publicPricing": "Preços públicos",
"billing.managePlanOnPlans": "Gerir plano em Planos",
"billing.recovery.pastDueTitle": "Pagamento em atraso",
2026-08-16 18:18:39 +02:00
"billing.recovery.pastDueAdmin": "O pagamento da sua subscrição falhou. Atualize o pagamento no Customer Portal — o acesso permanece aberto durante este período de carência.",
"billing.recovery.pastDueMember": "A faturação precisa de atenção. Peça a um administrador da empresa para atualizar o pagamento no Customer Portal. O acesso permanece aberto durante este período de carência.",
"billing.recovery.openPortal": "Abrir Customer Portal",
"billing.recovery.contactAdmin": "Contactar um administrador",
2026-08-16 18:18:39 +02:00
"billing.recovery.goToBilling": "Ir para Faturação",
"billing.recovery.missingPlanTitle": "Sem plano atribuído",
"billing.recovery.missingPlanMessage": "Esta empresa não tem um plano ativo (muitas vezes após uma migração ignorada). Atribua um plano via Checkout ou peça apoio — não assuma capacidade Unlimited.",
"billing.recovery.choosePlan": "Escolha um plano",
"billing.upgrade": "Atualizar",
2026-08-16 18:18:39 +02:00
"billing.askCompanyAdmin": "Peça a um administrador da empresa",
"billing.memberHint": "Só os administradores da empresa podem alterar planos ou abrir Checkout.",
"billing.unlimitedPlanWallet": "Plano ilimitado · carteira {wallet}",
"billing.creditsSuffix": "{label} créditos",
"billing.perMonth": "{amount} / mês",
"billing.zeroPerMonth": "0 / mês",
"billing.upTo": "Até {count}",
"billing.skusUnlimited": "{used} SKUs (ilimitado)",
"billing.skusOnly": "{used} SKUs",
"billing.skusOf": "{used} / {max} SKUs",
"billing.planKind.none": "Sem plano ativo",
"billing.planKind.enterprise": "Empresarial / personalizado",
2026-08-16 18:18:39 +02:00
"billing.planKind.trial": "Período de avaliação",
"billing.planKind.standard": "Plano padrão",
"billing.creditUsage.normalize.label": "Normalizar, specs e preencher",
2026-08-16 18:18:39 +02:00
"billing.creditUsage.normalize.detail": "A limpeza de dados e o preenchimento de atributos correm sem gastar créditos de IA.",
"billing.creditUsage.ai.label": "Títulos e descrições de IA",
"billing.creditUsage.ai.detail": "Cobrado por produto com base na funcionalidade de IA e na quantidade de texto gerado.",
2026-08-16 18:18:39 +02:00
"billing.creditUsage.eprel.label": "EPREL / rótulos energéticos",
"billing.creditUsage.eprel.detail": "Dados EPREL da UE públicos e gratuitos em todos os planos (sem créditos).",
"billing.creditUsage.campaign.label": "IA de campanha e aplicação de marca",
"billing.creditUsage.campaign.detail": "Os passos de IA pagos que usam o modelo gerido consomem créditos da empresa.",
"exports.title": "Feeds de exportação",
"exports.description": "Escolha o que publicar por canal — que produtos e campos — e partilhe um URL de feed público (sem login).",
"exports.descriptionFiltered": "Ligações públicas Google Shopping, Meta e feeds personalizados. A mostrar {filtered} de {total} feeds.",
"exports.loadFailed": "Falha ao carregar os feeds de exportação",
"exports.loadFeedFailed": "Falha ao carregar o feed de exportação",
"exports.refresh": "Atualizar",
2026-08-16 18:18:39 +02:00
"exports.refreshing": "A atualizar…",
"exports.create": "Criar feed de exportação",
"exports.edit": "Editar feed de exportação",
"exports.editDescription": "Atualize o nome, o estado, que produtos estão incluídos e que campos estão mapeados.",
"exports.howToTitle": "Como escolher o que exportar",
"exports.howTo.choose": "O que entra no feed",
2026-08-16 18:18:39 +02:00
"exports.howTo.chooseBody": "— defina o feed de origem e os estados do produto ao criar/editar para que o URL público só inclua esses produtos.",
"exports.howTo.subset": "Subconjunto pontual",
2026-08-16 18:18:39 +02:00
"exports.howTo.subsetBody": "— em",
"exports.howTo.productsLink": "Produtos",
2026-08-16 18:18:39 +02:00
"exports.howTo.subsetTail": ", selecione linhas e Exporte para descarregar só esses produtos com o formato e campos do feed.",
"exports.howTo.google": "Google Shopping",
2026-08-16 18:18:39 +02:00
"exports.howTo.googleBody": "— crie uma predefinição CSV ou XML, Generate, copie o URL público para Merchant Center → Products → Feeds → scheduled fetch.",
"exports.howTo.meta": "Catálogo Meta",
"exports.howTo.metaBody": "— predefinição CSV para fontes de dados do Commerce Manager.",
"exports.howTo.custom": "CSV/XML personalizado",
2026-08-16 18:18:39 +02:00
"exports.howTo.customBody": "— qualquer parceiro; o mesmo URL público funciona para pollers cron / webhook.",
"exports.howTo.rest": "REST",
2026-08-16 18:18:39 +02:00
"exports.howTo.restBody": "— chaves API em",
"exports.howTo.settingsApiKeys": "Definições → Chaves API",
"exports.howTo.restTail": "(chaves legacy não migradas) pull",
"exports.howTo.openapi": "OpenAPI",
"exports.feedStatus": "Estado do feed",
2026-08-16 18:18:39 +02:00
"exports.generating": "A gerar exportação — pode demorar um pouco para catálogos grandes.",
"exports.generationFailed": "Falha na geração. Veja o erro acima e tente Refresh Feed novamente.",
"exports.exportedProducts": "{count} produtos exportados",
2026-08-16 18:18:39 +02:00
"exports.lastGenerated": "Última geração: {time}",
"exports.neverGenerated": "Nunca gerado",
"exports.searchPlaceholder": "Pesquisar feeds...",
"exports.searchAria": "Pesquisar feeds",
"exports.clearSearch": "Limpar pesquisa",
2026-08-16 18:18:39 +02:00
"exports.loading": "A carregar feeds…",
"exports.loadErrorTitle": "Não foi possível carregar os feeds de exportação",
"exports.loadErrorBody": "Algo correu mal ao carregar as suas exportações. Tente novamente ou veja o erro acima para detalhes.",
"exports.tryAgain": "Tentar novamente",
2026-08-16 18:18:39 +02:00
"exports.emptyTitle": "Ainda sem feeds de exportação",
"exports.emptyBody": "Crie um feed Google Shopping, Meta ou CSV/XML personalizado para escolher que produtos e campos saem. Gere um URL público para Merchant Center ou qualquer parceiro — ou exporte um subconjunto em Produtos.",
"exports.emptyCta": "Criar feed Google Shopping",
"exports.noMatchTitle": "Sem feeds correspondentes",
"exports.noMatchBody": "Tente outro termo de pesquisa.",
"exports.col.name": "Nome",
"exports.col.format": "Formato",
"exports.col.feedUrl": "URL do feed",
2026-08-16 18:18:39 +02:00
"exports.col.lastGenerated": "Última geração",
"exports.col.status": "Estado",
2026-08-16 18:18:39 +02:00
"exports.col.actions": "Ações",
"exports.working": "Em curso.",
2026-08-16 18:18:39 +02:00
"exports.generatingShort": "A gerar…",
"exports.copyUrl": "Copiar URL",
"exports.openMenu": "Abrir menu",
2026-08-16 18:18:39 +02:00
"exports.preview": "Pré-visualização",
"exports.download": "Descarregar",
"exports.refreshFeed": "Atualizar feed",
"exports.editAction": "Editar",
"exports.delete": "Eliminar",
"exports.rotateToken": "Rodar token do URL",
"exports.rotateFailed": "Falha ao rodar o token do URL do feed",
2026-08-16 18:18:39 +02:00
"exports.deleting": "A eliminar…",
"exports.channelPreset": "Predefinição de canal",
"exports.name": "Nome",
"exports.format": "Formato",
"exports.sourceFeed": "Feed de origem (opcional)",
2026-08-16 18:18:39 +02:00
"exports.sourceFeedHelp": "Limite este feed a produtos de um feed de entrada, ou deixe Todos os produtos — é assim que escolhe o que o URL público inclui.",
"exports.allProducts": "Todos os produtos",
"exports.rootElement": "Elemento raiz",
"exports.itemElement": "Elemento de item",
2026-08-16 18:18:39 +02:00
"exports.productStatuses": "Estados de produto (separados por vírgulas)",
"exports.productStatusesHelp": "Inclua apenas produtos com estes estados (por exemplo active). Deixe em branco para todos os estados.",
"exports.status": "Estado",
"exports.active": "Ativo",
"exports.inactive": "Inativo",
"exports.fieldMappings": "Mapeamentos de campos",
"exports.addField": "Adicionar campo",
2026-08-16 18:18:39 +02:00
"exports.outputKey": "Chave de saída",
"exports.source": "Origem",
"exports.customSource": "Personalizado (attr.* / spec.*)",
"exports.removeField": "Remover campo",
2026-08-16 18:18:39 +02:00
"exports.fieldHelp": "As exportações leem produtos processados (com mapped_data em bruto como fallback). Use eprel_* / energy_* para campos EPREL, spec.* para uma especificação, ou specifications.* para expandir todas as specs como nós XML.",
"exports.saving": "A guardar…",
"exports.saveChanges": "Guardar alterações",
"exports.createFeed": "Criar feed",
2026-08-16 18:18:39 +02:00
"exports.updated": "Feed de exportação atualizado.",
"exports.created": "Feed de exportação criado.",
"exports.saveFailed": "Falha ao guardar",
2026-08-16 18:18:39 +02:00
"exports.urlCopied": "URL público do feed {format} copiado. Cole-o em qualquer sistema que obtenha feeds de produto.",
"exports.copyFailed": "Falha ao copiar o URL para a área de transferência",
"exports.refreshed": "Feed atualizado",
"exports.refreshedWithCount": "Feed atualizado ({count} produtos).",
"exports.refreshFailed": "Falha ao atualizar o feed",
2026-08-16 18:18:39 +02:00
"exports.deleteConfirm": "Tem a certeza de que pretende eliminar este feed de exportação?",
"exports.deleted": "Feed de exportação eliminado com sucesso.",
"exports.deleteFailed": "Falha ao eliminar o feed de exportação",
"exports.defaultName": "Novo feed de exportação",
"exports.fallbackName": "Feed de exportação",
"exports.dialog.selectTitle": "Exportar produtos selecionados",
2026-08-16 18:18:39 +02:00
"exports.dialog.selectDescription": "Escolha uma configuração de feed de exportação para os {count} produtos selecionados.",
"exports.dialog.noneFound": "Nenhuma configuração de feed de exportação encontrada. Crie uma na secção Export Feeds.",
"exports.dialog.loadFailed": "Falha ao carregar as opções de feed de exportação. Tente novamente.",
"exports.dialog.selectRequired": "Selecione um formato de feed de exportação.",
"exports.dialog.selectPlaceholder": "Selecione um formato de feed de exportação...",
"exports.dialog.confirmAria": "Confirmar exportação",
"exports.dialog.export": "Exportar",
"exports.preset.google_shopping_csv.label": "Google Shopping (CSV)",
"exports.preset.google_shopping_csv.shortLabel": "Google Shopping CSV",
2026-08-16 18:18:39 +02:00
"exports.preset.google_shopping_csv.description": "Feed de produtos do Merchant Center com as colunas Google standard (id, title, price, gtin, …).",
"exports.preset.google_shopping_csv.hint": "Depois de atualizar o feed, copie o URL CSV público para Google Merchant Center → Products → Feeds → Add feed → Scheduled fetch.",
"exports.preset.google_shopping_csv.defaultName": "Google Shopping CSV",
"exports.preset.google_shopping_xml.label": "Google Shopping (XML)",
"exports.preset.google_shopping_xml.shortLabel": "Google Shopping XML",
2026-08-16 18:18:39 +02:00
"exports.preset.google_shopping_xml.description": "As mesmas colunas Google que os elementos XML (g:id, g:title, …) para feeds XML do Merchant Center.",
"exports.preset.google_shopping_xml.hint": "Cole o URL XML público no Merchant Center como scheduled fetch. Se necessário, mapeie os campos da loja em falta (link, price) em Field mappings.",
"exports.preset.google_shopping_xml.defaultName": "Google Shopping XML",
2026-08-16 18:18:39 +02:00
"exports.preset.meta_csv.label": "Catálogo Meta (CSV)",
"exports.preset.meta_csv.shortLabel": "Meta CSV",
2026-08-16 18:18:39 +02:00
"exports.preset.meta_csv.description": "Colunas do catálogo Facebook / Instagram Commerce (id, title, availability, price, image_link, …).",
"exports.preset.meta_csv.hint": "No Meta Commerce Manager → Catalog → Data sources → Add items → Use data feed, cole o URL CSV público.",
"exports.preset.meta_csv.defaultName": "Catálogo Meta CSV",
"exports.preset.custom_csv.label": "CSV personalizado",
"exports.preset.custom_csv.shortLabel": "CSV personalizado",
2026-08-16 18:18:39 +02:00
"exports.preset.custom_csv.description": "Escolha as suas próprias colunas e fontes de produto para qualquer parceiro ou webhook.",
"exports.preset.custom_csv.hint": "Adicione ou renomeie livremente as chaves de saída. O URL público não precisa de login para descarregar.",
"exports.preset.custom_csv.defaultName": "Exportação CSV personalizada",
"exports.preset.custom_xml.label": "XML personalizado",
"exports.preset.custom_xml.shortLabel": "XML personalizado",
2026-08-16 18:18:39 +02:00
"exports.preset.custom_xml.description": "Crie uma forma XML personalizada com os seus próprios nomes root/item e mapeamentos de campos.",
"exports.preset.custom_xml.hint": "Defina os nomes dos elementos root e item e mapeie cada chave de saída para uma fonte de produto.",
"exports.preset.custom_xml.defaultName": "Exportação XML personalizada",
"processing.title": "Processamento",
2026-08-16 18:18:39 +02:00
"processing.description": "Progresso em direto do pipeline para trabalhos de processamento de produtos. Atualiza automaticamente enquanto este separador está visível. Os trabalhos concluídos ligam a Needs Review para aceitar / editar / rejeitar.",
"processing.refresh": "Atualizar",
"processing.loadFailed": "Falha ao carregar os trabalhos de processamento",
2026-08-16 18:18:39 +02:00
"processing.tooManyRequests": "Demasiados pedidos — aguarde um momento e tente novamente.",
"processing.serverError": "{fallback} (erro do servidor {status}). Tente novamente em breve.",
"processing.httpError": "{fallback} (HTTP {status})",
2026-08-16 18:18:39 +02:00
"processing.cancelFailed": "Não foi possível cancelar esta tarefa",
"processing.retryFailed": "Não foi possível repetir esta tarefa",
"processing.cancelledMsg": "\"{name}\" foi cancelado.",
"processing.queuedRetry": "\"{name}\" em fila para nova tentativa.",
"processing.jobFallback": "Trabalho {id}",
"processing.tasks": "Tarefas",
2026-08-16 18:18:39 +02:00
"processing.pipelineHint": "Pipeline: normalize → specs → fill → EPREL → AI. Inícios grandes podem dividir-se em trabalhos irmãos.",
"processing.emptyTitle": "Ainda sem tarefas em segundo plano",
"processing.emptyBody": "Ainda sem tarefas em segundo plano. Inicie um novo trabalho a partir de Products quando estiver pronto.",
"processing.startJob": "Iniciar um trabalho",
"processing.connectFeed": "Ligar feed",
2026-08-16 18:18:39 +02:00
"processing.splitBatch": "Lote dividido · {jobs} trabalhos · {products} produtos",
"processing.col.task": "Tarefa",
"processing.col.status": "Estado",
"processing.col.steps": "Passos",
"processing.col.progress": "Progresso",
"processing.col.started": "Iniciado",
2026-08-16 18:18:39 +02:00
"processing.col.completed": "Concluído",
"processing.col.actions": "Ações",
"processing.partOfBatch": "· parte do lote",
"processing.nowStep": "Agora: {step}",
"processing.skip": "(saltar)",
"processing.reviewResults": "Rever resultados",
"processing.reviewTitle": "Abra Needs Review para aceitar, editar ou rejeitar o enriquecimento",
"processing.cancel": "Cancelar",
2026-08-16 18:18:39 +02:00
"processing.cancelling": "A cancelar…",
"processing.cancelTitle": "Cancelar este trabalho pendente ou em execução",
"processing.retry": "Tentar novamente",
2026-08-16 18:18:39 +02:00
"processing.retrying": "A tentar novamente…",
"processing.actions.onPage": "{count} nesta página",
"processing.actions.clearSelection": "Limpar seleção",
"processing.actions.processSelected": "Processar seleção",
"processing.actions.processAria": "Processar produtos selecionados",
2026-08-16 18:18:39 +02:00
"processing.actions.processAriaCount": "Processar {count} produto{plural} selecionado(s) nesta página",
"processing.actions.whatToProcess": "O que processar",
2026-08-16 18:18:39 +02:00
"processing.actions.freeNoAiTitle": "Plano Free — sem créditos de IA",
"processing.actions.freeNoAiBody": "Normalize, specs, fill e EPREL continuam a correr. Títulos/descrições de IA precisam de um plano pago ou créditos.",
"processing.actions.comparePlans": "Comparar planos",
"processing.actions.selectAll": "Selecionar tudo",
"processing.actions.selectAllAria": "Selecionar todos os modos de processamento",
2026-08-16 18:18:39 +02:00
"processing.actions.upgradeRequired": "{label} (atualização necessária)",
"processing.actions.upgradeSuffix": " · atualizar",
"processing.actions.credits": "{credits} créditos",
"processing.actions.free": "grátis",
"processing.actions.autoCategorizeTitle": "A adicionar categorização automaticamente",
"processing.actions.autoCategorizeBody": "{count} produto(s) precisam de categorização para o processamento de {types}",
"processing.actions.aiLocked": "As opções de IA estão bloqueadas no Free. Atualize para processar títulos/descrições.",
"processing.actions.totalCredits": "Créditos totais ({count} nesta página):",
"processing.actions.starting": "A iniciar…",
"processing.actions.processCount": "Processar {count} nesta página",
"processing.actions.close": "Fechar",
"processing.actions.accept": "Aceitar",
"processing.actions.acceptEnrichment": "Aceitar enriquecimento",
"processing.actions.export": "Exportar",
2026-08-16 18:18:39 +02:00
"processing.actions.exportSelected": "Exportar seleção",
"processing.actions.reject": "Rejeitar",
"processing.actions.rejectReset": "Rejeitar (repor)",
2026-08-16 18:18:39 +02:00
"processing.actions.resetUnprocessed": "Repor para Não processado",
"processing.actions.confirmTitle": "Confirmar processamento",
2026-08-16 18:18:39 +02:00
"processing.actions.confirmBody": "Processar {count} produto(s) nesta página por {credits} créditos. Os créditos são consumidos quando o trabalho começa e não podem ser anulados a partir desta ação.",
"processing.actions.confirmStart": "Iniciar processamento",
"processing.option.category": "Categorias",
"processing.option.attributes": "Atributos / specs",
2026-08-16 18:18:39 +02:00
"processing.option.title": "Títulos (IA)",
"processing.option.description": "Descrições (IA)",
"processing.receipt.view": "Ver em Processamento",
"processing.receipt.undo": "Anular",
2026-08-16 18:18:39 +02:00
"processing.receipt.format": "{succeeded} com sucesso · {skipped} ignorados · {failed} falhados",
"processing.receipt.cancelledOne": "Processamento cancelado",
"processing.receipt.cancelledMany": "Trabalhos de processamento cancelados",
2026-08-16 18:18:39 +02:00
"processing.receipt.cancelledDesc": "O trabalho recém-iniciado foi cancelado.",
"processing.receipt.cancelFailed": "Não foi possível cancelar o trabalho de processamento",
"unsubscribe.title": "Cancelar subscrição",
"unsubscribe.me": "Cancelar a minha subscrição",
"unsubscribe.invalidLink": "Ligação inválida",
"unsubscribe.failedShort": "Falha ao cancelar a subscrição",
"unsubscribe.already": "Já cancelou a subscrição.",
"unsubscribe.confirmPrompt": "Confirme abaixo para cancelar a subscrição dos e-mails de marketing.",
"unsubscribe.done": "A sua subscrição foi cancelada.",
"stores.title": "Lojas e fontes",
2026-08-16 18:18:39 +02:00
"stores.description": "Ligue qualquer loja ou fornecedor num só sítio — Woo, Shopify, URL de feed ou CSV. Lojas live: produtos Descrybe → loja; encomendas/avaliações loja → Descrybe. Exporte quando o catálogo estiver pronto.",
"stores.allInputFeeds": "Todos os feeds de entrada",
2026-08-16 18:18:39 +02:00
"stores.exportFeeds": "Feeds de exportação",
"stores.migrationNote": "Após uma migração da plataforma Descrybe, as credenciais de WooCommerce e Shopify podem precisar ser reintroduzidas — é um passo de religação, não uma sync avariada.",
"stores.docsPrefix": "Docs:",
2026-08-16 18:18:39 +02:00
"stores.docsApiOverview": "Visão geral da API",
"stores.docsSuffix": "para acesso público a produtos; use WooCommerce ou Shopify abaixo para a sync em direto da loja.",
"stores.connectorsHeading": "Conectores de loja e catálogo",
"stores.statusAria": "Estado: {label}",
"stores.ctaAria": "{cta}: {title}",
2026-08-16 18:18:39 +02:00
"stores.startTitle": "Por onde começar?",
"stores.startBody": "Loja Woo → WooCommerce. Shopify ou outra plataforma → URL de feed ou carregamento CSV. Pronto para Merchant Center ou parceiros → Feeds de exportação (predefinição Google Shopping ou campos personalizados). Após uma migração, volte a ligar Woo/Shopify antes de esperar que a sync funcione.",
"stores.startBodyMember": "Peça a um admin da empresa para ligar WooCommerce ou Shopify. Ainda pode abrir lojas ligadas para sincronizar e navegar, e usar Feed URL, CSV ou feeds de exportação conforme o plano.",
"stores.wizard.title": "Configuração guiada da loja",
"stores.wizard.description": "Ligue uma loja, teste a ligação, coloque a primeira sync de produtos na fila e está feito.",
"stores.wizard.guidedSetup": "Configuração guiada",
"stores.wizard.guidedSetupAria": "Iniciar configuração guiada da loja",
"stores.wizard.adminOnly": "Só os admins da empresa podem executar a configuração guiada (guardar credenciais e primeira sincronização). Ainda pode abrir lojas ligadas.",
"stores.wizard.pickChannel": "Escolha um conector de loja",
2026-08-16 18:18:39 +02:00
"stores.wizard.pickChannelBody": "Escolha WooCommerce ou Shopify. Conclua ligar → testar → primeira sync na página do conector e volte aqui.",
"stores.wizard.channel.shopify": "Shopify",
"stores.wizard.channel.woocommerce": "WooCommerce",
"stores.wizard.channelLabel": "A configurar: {channel}",
"stores.wizard.changeChannel": "Mudar conector",
2026-08-16 18:18:39 +02:00
"stores.wizard.noChannels": "Não há conectores de loja no seu plano. Atualize ou peça a um admin.",
"stores.wizard.progress": "{done} de {total} concluídos",
"stores.wizard.stepsLabel": "Passos de configuração da loja",
"stores.wizard.step.connect.title": "Ligar",
2026-08-16 18:18:39 +02:00
"stores.wizard.step.connect.body": "Guarde as credenciais na página do conector.",
"stores.wizard.step.test.title": "Testar ligação",
"stores.wizard.step.test.body": "Execute Testar ligação até ter sucesso.",
"stores.wizard.step.sync.title": "Primeira sincronização",
"stores.wizard.step.sync.body": "Coloque a primeira sync de produtos na fila (ative a sync se necessário).",
"stores.wizard.step.done.title": "Concluído",
"stores.wizard.step.done.body": "A loja está ligada e uma sync foi iniciada ou concluída.",
"stores.wizard.openConnector": "Abrir conector",
"stores.wizard.viewProducts": "Ver produtos",
2026-08-16 18:18:39 +02:00
"stores.wizard.backToHub": "Voltar às lojas",
"stores.wizard.banner.generic": "Configuração guiada: conclua este passo e volte ao assistente.",
"stores.wizard.banner.test": "Configuração guiada — teste a ligação e volte ao assistente.",
"stores.wizard.banner.sync": "Configuração guiada — coloque a primeira sync de produtos na fila e volte ao assistente.",
"stores.wizard.banner.return": "Voltar ao assistente",
"stores.wizard.banner.dismiss": "Dispensar",
"stores.woo.title": "WooCommerce",
2026-08-16 18:18:39 +02:00
"stores.woo.description": "Envie produtos Descrybe → WooCommerce. Importe encomendas e avaliações WooCommerce → Descrybe.",
"stores.woo.ctaReconnect": "Voltar a ligar Woo",
"stores.woo.ctaOpen": "Abrir Woo",
"stores.woo.ctaConnect": "Ligar Woo",
"stores.woo.ctaView": "Ver Woo",
"stores.shopify.title": "Shopify",
2026-08-16 18:18:39 +02:00
"stores.shopify.description": "Envie produtos Descrybe → Shopify. Importe encomendas Shopify → Descrybe. Avaliações não estão disponíveis na Admin API da Shopify.",
"stores.shopify.ctaReconnect": "Voltar a ligar Shopify",
"stores.shopify.ctaOpen": "Abrir Shopify",
"stores.shopify.ctaConnect": "Ligar Shopify",
"stores.shopify.ctaView": "Ver Shopify",
"stores.feedUrl.title": "URL do feed",
"stores.feedUrl.description": "Pull any supplier or loja catalog from a public CSV or XML URL on a schedule. Map fields, then sync.",
"stores.feedUrl.cta": "Adicionar URL do feed",
"stores.csv.title": "Carregamento CSV",
2026-08-16 18:18:39 +02:00
"stores.csv.description": "Carregue um CSV de produtos como feed de entrada. Ideal para ficheiros de fornecedor pontuais ou exportações do admin Shopify.",
"stores.csv.cta": "Carregar CSV",
"stores.export.title": "Exportar / REST",
2026-08-16 18:18:39 +02:00
"stores.export.description": "Publique Google Shopping ou CSV/XML personalizado com URL pública. Ou obtenha produtos via chave API (/api/v1).",
"stores.export.cta": "Abrir exportações",
"stores.apiKeys.title": "Chaves API",
2026-08-16 18:18:39 +02:00
"stores.apiKeys.description": "As chaves API antigas não foram migradas. Crie uma nova chave em Definições para restaurar o acesso a /api/v1 — o segredo só é mostrado uma vez.",
"stores.apiKeys.descriptionMember": "Chaves API da empresa para /api/v1. As legado não foram migradas — só admins podem criar ou revogar; pode ver prefixos em Definições.",
"stores.apiKeys.cta": "Gerir chaves API",
"stores.apiKeys.ctaView": "Ver chaves API",
2026-08-16 18:18:39 +02:00
"stores.status.needsReconnect": "Precisa de religação",
"stores.status.connected": "Ligado",
2026-08-16 18:18:39 +02:00
"stores.status.notConnected": "Não ligado",
"stores.status.ready": "Pronto",
2026-08-16 18:18:39 +02:00
"stores.status.outbound": "De saída",
"stores.status.reissue": "Reemitir",
2026-08-16 18:18:39 +02:00
"store.tab.connection": "Ligação",
"store.tab.orders": "Encomendas",
2026-08-16 18:18:39 +02:00
"store.tab.settings": "Definições",
"store.tab.categories": "Categorias",
"store.tab.attributes": "Atributos",
2026-08-16 18:18:39 +02:00
"store.tab.reviews": "Avaliações",
"store.badge.credentialsOnFile": "Credenciais guardadas",
"store.badge.syncEnabled": "Envio de produtos ativado",
"store.badge.syncDisabled": "Envio de produtos desativado",
"store.badge.syncQueued": "Envio de produtos na fila",
2026-08-16 18:18:39 +02:00
"store.badge.dryRun": "Simulação",
"store.badge.testStatus": "Teste: {status}",
"store.badge.syncStatus": "Envio de produtos: {status}",
"store.badge.ordersQueued": "Sync de encomendas em fila",
"store.badge.ordersStatus": "Encomendas: {status}",
"store.badge.syncedCount": "{count} sincronizados",
"store.badge.mappedCount": "{count} mapeados",
"store.badge.productsCount": "{count} produtos",
2026-08-16 18:18:39 +02:00
"store.badge.optionsCount": "{count} opções",
"store.lastSync": "Última sync: {date}",
"store.noOrdersSyncYet": "Ainda não foi concluída nenhuma sync de encomendas.",
"store.save": "Guardar",
"store.saving": "A guardar...",
"store.testing": "A testar...",
2026-08-16 18:18:39 +02:00
"store.testConnection": "Testar ligação",
"store.queueing": "A colocar na fila...",
2026-08-16 18:18:39 +02:00
"store.queueProductPush": "Colocar envio de produtos na fila (Descrybe → loja)",
"store.queueFirstProductSync": "Colocar primeiro envio de produtos na fila (Descrybe → loja)",
"store.queueOrdersImport": "Colocar importação de encomendas na fila (loja → Descrybe)",
"store.refreshList": "Atualizar lista",
"store.saveBeforeTest": "Guarde as credenciais antes de testar",
2026-08-16 18:18:39 +02:00
"store.saveTestBeforeQueue": "Guarde as credenciais e teste a ligação antes de sincronizar",
"store.connectionOk": "Ligação OK",
"store.connectionSuccessful": "Ligação bem-sucedida",
"store.connectionSuccessfulDot": "Ligação bem-sucedida.",
"store.connectionFailed": "Falha na ligação",
"store.connectionFailedDot": "Falha na ligação.",
"store.connectionTestFailed": "Teste de ligação falhou",
"store.testFailed": "Teste falhou",
2026-08-16 18:18:39 +02:00
"store.setupSteps": "Passos de configuração",
"store.col.order": "Encomenda",
"store.col.customer": "Cliente",
"store.col.status": "Estado",
"store.col.total": "Total",
"store.col.date": "Data",
2026-08-16 18:18:39 +02:00
"store.loadingOrders": "A carregar encomendas…",
"store.loadingOrdersDot": "A carregar encomendas.",
2026-08-16 18:18:39 +02:00
"flash.store.saveFailed": "Não foi possível guardar as definições",
"flash.store.queueSyncFailed": "Não foi possível colocar a sincronização na fila",
"flash.store.queueOrdersFailed": "Não foi possível colocar a sincronização de encomendas na fila",
"flash.store.connectedTo": "Ligado a {name}.",
2026-08-16 18:18:39 +02:00
"flash.shopify.loadFailed": "Falha ao carregar a configuração Shopify",
"flash.shopify.productSyncQueued": "Sincronização de produtos em fila. O worker irá executá-la em breve.",
"flash.shopify.ordersSyncQueued": "Sincronização de encomendas em fila. O worker irá executá-la em breve.",
"flash.woo.loadFailed": "Falha ao carregar a configuração WooCommerce",
"flash.woo.productSyncQueued": "Sincronização de produtos em fila. Será executada em breve.",
"flash.woo.ordersSyncQueued": "Sincronização de encomendas em fila. Será executada em breve.",
"flash.woo.reviewsSyncQueued": "Sincronização de avaliações em fila. Será executada em breve.",
"flash.woo.queueReviewsFailed": "Não foi possível colocar a sincronização de avaliações na fila",
"flash.woo.remoteMapsFailed": "Falha ao carregar os mapas remotos",
2026-08-16 18:18:39 +02:00
"flash.woo.syncSettingsFailed": "Não foi possível guardar as definições de sincronização",
"flash.woo.categoryAutoMapFailed": "Falha no mapeamento automático de categorias",
"flash.woo.attributeAutoMapFailed": "Falha no mapeamento automático de atributos",
"shopify.title": "Integração Shopify",
"shopify.description": "Connect a Shopify store with Dev Dashboard client credentials (recommended) or a legacy Admin API token. Products: Descrybe → Shopify. Orders: Shopify → Descrybe.",
"shopify.adminOnly": "Only empresa admins can change Shopify connection definições. Sincronizar and browse stay disponível.",
"shopify.lockedTitle": "Ligação Shopify bloqueada",
"shopify.noCredentialsMember": "Ainda não há credenciais Shopify. Peça a um administrador da empresa para ligar a loja. Sync e consulta de encomendas ficam disponíveis após guardar e testar a ligação.",
"shopify.enterToken": "Introduzir credenciais",
2026-08-16 18:18:39 +02:00
"shopify.noCredentials": "Sem credenciais Shopify. Introduza o domínio *.myshopify.com e o Client ID + secret do Dev Dashboard (ou um token Admin API legado), depois Guardar e Testar ligação. Após uma migração de plataforma, os segredos antigos não são transferidos — reconecte com um token novo.",
"shopify.allConnectors": "Todos os conectores de loja",
2026-08-16 18:18:39 +02:00
"shopify.setupDesc": "New Shopify apps are created in the Dev Dashboard (not Develop apps in Admin). Paste Client ID + secret below — Descrybe exchanges them for Admin API tokens and refreshes before they expire.",
"shopify.setup.oauthNote": "Still manual: create/install the app in Shopify and paste Client ID + secret here. Descrybe does not host a one-click App Store install. Legacy permanent shpat_ tokens from older Admin custom apps still work.",
2026-08-16 18:18:39 +02:00
"shopify.setup.scopesTitle": "Scopes Admin API necessários",
"shopify.setup.scopesIntro": "Add these scopes on the app version in the Dev Dashboard before you release and install:",
"shopify.setup.step3.scopes": "write_products, read_products, read_orders",
"shopify.setup.step3.mid": ", then",
"shopify.setup.step3.release": "Release",
"shopify.setup.step4.install": "Install app",
"shopify.setup.step5.before": "In app Settings, copy",
"shopify.setup.step5.clientId": "Client ID",
"shopify.setup.step5.and": "and",
"shopify.setup.step5.clientSecret": "Client secret",
2026-08-16 18:18:39 +02:00
"shopify.setup.step5.mid": ". Below: enter shop domain, paste both, enable sync →",
"shopify.setup.step5.save": "Save",
2026-08-16 18:18:39 +02:00
"shopify.setup.step5.arrow": "→",
"shopify.setup.step5.test": "Test Connection",
"shopify.setup.step5.after": ". Descrybe stores secrets encrypted and refreshes the short-lived access token automatically.",
"shopify.setup.step6.products": "Products",
2026-08-16 18:18:39 +02:00
"shopify.setup.step6.productsTail": "Descrybe → Shopify (outbound push).",
"shopify.setup.step6.orders": "Orders",
2026-08-16 18:18:39 +02:00
"shopify.setup.step6.ordersTail": "Shopify → Descrybe (inbound pull).",
"shopify.setup.step7.before": "No live shop yet? Enable",
"shopify.setup.step7.dryRun": "Dry run",
"shopify.setup.step7.after": "(or use the special dry-run access token) to walk through the flow without calling Shopify.",
"shopify.setup.openDevDashboard": "Open Dev Dashboard",
"shopify.setup.openDevelopApps": "Open shop Develop apps",
"shopify.setup.openDevelopAppsNeedDomain": "Enter your shop domain below to unlock a direct Admin link for this store.",
2026-08-16 18:18:39 +02:00
"shopify.setup.openDevelopAppsHint": "Opens Shopify Admin → Develop apps for this shop (legacy apps / install approvals). New apps start in the Dev Dashboard.",
"shopify.setup.copyScopes": "Copy required scopes",
"shopify.setup.scopesCopied": "Scopes copied",
"shopify.setup.docsCreate": "Create app docs",
"shopify.setup.docsTokens": "Access token docs",
2026-08-16 18:18:39 +02:00
"shopify.setup.showLegacyToken": "I have a legacy Admin API access token (shpat_…)",
"shopify.setup.hideLegacyToken": "Hide legacy token field",
2026-08-16 18:18:39 +02:00
"shopify.field.shopDomainHelp": "Admin API host only — use the *.myshopify.com name, not a custom storefront domain.",
"shopify.field.clientId": "Client ID",
"shopify.field.clientSecret": "Client secret",
2026-08-16 18:18:39 +02:00
"shopify.field.clientSecretHelp": "From Dev Dashboard → your app → Settings. Descrybe exchanges these for a short-lived Admin API token and refreshes it automatically.",
"shopify.field.accessTokenHelp": "Only for custom apps created in Shopify Admin before January 2026. New apps should use Client ID + secret instead.",
"shopify.placeholder.clientId": "Client ID from Dev Dashboard",
2026-08-16 18:18:39 +02:00
"shopify.placeholder.clientIdKeep": "Client ID on file — enter a new one to replace",
"shopify.placeholder.clientSecret": "Client secret",
2026-08-16 18:18:39 +02:00
"shopify.placeholder.clientSecretKeep": "Secret on file — enter a new one to replace",
"shopify.setup.scope.write_products": "write_products",
2026-08-16 18:18:39 +02:00
"shopify.setup.scope.write_productsWhy": "Criar e atualizar produtos na Shopify (push de saída)",
"shopify.setup.scope.read_products": "read_products",
"shopify.setup.scope.read_productsWhy": "Encontrar produtos existentes por SKU antes de atualizar",
"shopify.setup.scope.read_orders": "read_orders",
"shopify.setup.scope.read_ordersWhy": "Importar encomendas para o Descrybe (entrada)",
2026-08-16 18:18:39 +02:00
"shopify.setup.step1": "Se ligou o Shopify antes de uma migração de plataforma: crie uma nova app no Dev Dashboard (ou reconecte com um token legado novo) — os segredos guardados não são transferidos.",
"shopify.setup.step2.before": "Open the",
"shopify.setup.step2.path": "Shopify Dev Dashboard",
2026-08-16 18:18:39 +02:00
"shopify.setup.step2.after": "→ Apps → Create app → Start from Dev Dashboard (or use the deep link below).",
"shopify.setup.step3.before": "Create a version: set App URL (default home is fine for API-only), add scopes",
"shopify.setup.step3.after": ".",
"shopify.setup.step4.before": "From the app Home tab,",
"shopify.setup.step4.after": "on your store (merchant must approve scopes).",
2026-08-16 18:18:39 +02:00
"shopify.testSectionTitle": "Verificar ligação",
"shopify.testHint": "Guarde primeiro o domínio da loja e o token e depois execute Testar ligação. Um teste bem-sucedido confirma o token e os scopes antes de enfileirar a sync.",
"shopify.overwriteTitle": "Substituir produtos Shopify?",
2026-08-16 18:18:39 +02:00
"shopify.overwriteBodyCount": "Isto coloca na fila um envio de produtos de saída. {count} produto(s) Shopify previamente ligados podem ser atualizados com o conteúdo Descrybe.",
"shopify.overwriteBody": "Isto coloca na fila um envio de produtos de saída. Os produtos Shopify correspondentes podem ser atualizados com o conteúdo Descrybe.",
"shopify.credentialsTitle": "Credenciais da loja",
2026-08-16 18:18:39 +02:00
"shopify.credentialsDesc.before": "O domínio da loja deve ser o seu",
"shopify.credentialsDesc.code": "*.myshopify.com",
"shopify.credentialsDesc.after": "domain. Prefer Dev Dashboard Client ID + secret; legacy Admin API tokens still work.",
2026-08-16 18:18:39 +02:00
"shopify.field.shopDomain": "Domínio da loja",
"shopify.field.accessToken": "Token de acesso Admin API",
2026-08-16 18:18:39 +02:00
"shopify.field.apiVersion": "Versão da API",
"shopify.placeholder.tokenKeep": "******** (deixar em branco para manter)",
2026-08-16 18:18:39 +02:00
"shopify.enableSync": "Ativar envio de produtos (Descrybe → Shopify)",
"shopify.dryRunLabel": "Simulação (sem chamadas Shopify ao vivo)",
"shopify.ordersTitle": "Importação de encomendas (Shopify → Descrybe)",
"shopify.ordersDesc": "Shopify → Descrybe — importa encomendas e linhas para o Descrybe (não escreve de volta na Shopify).",
"shopify.ordersNeedsReconnect": "A importação de encomendas não pode correr até as credenciais serem reconectadas após a migração. No separador Ligação: Guardar, depois Testar ligação.",
"shopify.notesTitle": "Notas",
"shopify.notesDesc": "Capacidades do conector Shopify",
2026-08-16 18:18:39 +02:00
"shopify.notes.productsLabel": "Produtos (Descrybe → Shopify)",
"shopify.notes.productsBody": "— os produtos Descrybe processados são criados ou atualizados no Shopify (correspondência por SKU via GraphQL quando não há id de produto Shopify em cache). Uma re-sync pode sobrescrever campos remotos correspondentes.",
"shopify.notes.ordersLabel": "Encomendas (Shopify → Descrybe)",
"shopify.notes.ordersBody": "— obtidos para relatórios e futuros fluxos de audiência.",
"shopify.notes.reviewsLabel": "Avaliações",
"shopify.notes.reviewsBody": "-- not suporteed. Shopify has no first-party produto reviews Admin API (third-party review apps are out of scope here).",
2026-08-16 18:18:39 +02:00
"shopify.notes.encryption.before": "Os tokens são encriptados em repouso com",
"woo.title": "Integração WooCommerce",
"woo.description": "Create a WordPress REST API key, connect your store, then push products (Descrybe → WooCommerce) and pull orders/reviews (WooCommerce → Descrybe).",
"woo.allStores": "Todas as lojas",
2026-08-16 18:18:39 +02:00
"woo.adminOnly": "Apenas administradores da empresa podem alterar a ligação e o mapeamento WooCommerce. A sincronização e a navegação continuam disponíveis.",
"woo.enterCredentials": "Introduzir credenciais",
2026-08-16 18:18:39 +02:00
"woo.noCredentials": "Sem credenciais WooCommerce. Introduza o URL da loja, crie uma chave REST API Read/Write no WordPress, cole Consumer Key e Secret, depois Guardar e Testar ligação. Após uma migração de plataforma, os segredos antigos não são transferidos — reconecte com uma chave nova.",
"woo.lockedTitle": "Ligação WooCommerce bloqueada",
"woo.noCredentialsMember": "Ainda não há credenciais WooCommerce. Peça a um administrador da empresa para ligar a loja. Sync, encomendas e avaliações ficam disponíveis após guardar e testar a ligação.",
"woo.setupDesc": "Follow these steps to create a WooCommerce REST API key in WordPress and connect it here. Descrybe never creates keys on your store for you.",
2026-08-16 18:18:39 +02:00
"woo.setup.step1": "Se ligou o WooCommerce antes de uma migração de plataforma: crie uma nova chave REST API — as credenciais guardadas antigas não são utilizáveis.",
"woo.setup.step2.before": "Enter your store",
"woo.setup.step2.path": "HTTPS URL",
"woo.setup.step2.after": "in the form below (example: https://yourstore.com).",
"woo.setup.step3.before": "In WordPress admin, open",
2026-08-16 18:18:39 +02:00
"woo.setup.step3.path": "WooCommerce → Settings → Advanced → REST API",
"woo.setup.step3.after": "(or use the deep link once your store URL is filled in).",
"woo.setup.step4.before": "Click",
"woo.setup.step4.addKey": "Add key",
"woo.setup.step4.mid": ", set permissions to",
"woo.setup.step4.permissions": "Read/Write",
2026-08-16 18:18:39 +02:00
"woo.setup.step4.after": ", then copy the Consumer Key (ck_…) and Consumer Secret (cs_…). The secret is shown only once.",
"woo.setup.step5.before": "Paste the key and secret below, enable sync if ready, then",
"woo.setup.step5.save": "Save",
2026-08-16 18:18:39 +02:00
"woo.setup.step5.arrow": "→",
"woo.setup.step5.test": "Test Connection",
"woo.setup.step5.after": ".",
"woo.setup.step6.products": "Products",
2026-08-16 18:18:39 +02:00
"woo.setup.step6.productsTail": "Descrybe → WooCommerce (outbound push).",
"woo.setup.step6.orders": "Orders",
"woo.setup.step6.and": "and",
"woo.setup.step6.reviews": "reviews",
2026-08-16 18:18:39 +02:00
"woo.setup.step6.inboundTail": "WooCommerce → Descrybe (inbound pull). Sync runs in the background — check status badges on this page.",
"woo.setup.openKeys": "Abrir chaves REST API",
"woo.setup.addKey": "Adicionar chave",
2026-08-16 18:18:39 +02:00
"woo.setup.openKeysHint": "Abre o admin WordPress → WooCommerce → Definições → Avançadas → REST API.",
"woo.setup.openKeysNeedUrl": "Guarde primeiro um URL de loja válido para abrir ligações de admin.",
"woo.setup.docsLink": "Documentação da REST API do WooCommerce",
"woo.overwriteTitle": "Substituir produtos WooCommerce?",
2026-08-16 18:18:39 +02:00
"woo.overwriteBodyCount": "Isto coloca na fila um envio de produtos de saída. {count} produto(s) WooCommerce previamente ligados podem ser atualizados com o conteúdo Descrybe.",
"woo.overwriteBody": "Isto coloca na fila um envio de produtos de saída. Os produtos WooCommerce correspondentes podem ser atualizados com o conteúdo Descrybe.",
"woo.connectionTitle": "Store connection",
"woo.connectionDesc": "Paste your store URL and a Read/Write REST API key pair. Save, then Test Connection before queuing syncs.",
2026-08-16 18:18:39 +02:00
"woo.enableSync": "Ativar envio de produtos (Descrybe → WooCommerce)",
"woo.field.storeUrl": "URL da loja",
2026-08-16 18:18:39 +02:00
"woo.field.storeUrlHelp": "URL público do site com https. Usado na REST API do WooCommerce e em ligações profundas ao admin WordPress.",
"woo.field.consumerKey": "Consumer Key",
"woo.field.consumerSecret": "Consumer Secret",
"woo.field.credentialsHelp": "Consumer Key e Secret com leitura/escrita. Deixe em branco para manter as credenciais existentes.",
2026-08-16 18:18:39 +02:00
"woo.placeholder.keep": "******** (sem alteração)",
"woo.keepCredentialsHint": "Deixe chave/segredo em branco ao guardar para manter as credenciais existentes.",
2026-08-16 18:18:39 +02:00
"woo.saveConfiguration": "Guardar configuração",
"woo.categoryMappingTitle": "Mapeamento de categorias",
"woo.categoryMappingDesc": "Mapeie as suas categorias internas para as categorias WooCommerce",
"woo.autoMapCategories": "Mapear categorias automaticamente",
2026-08-16 18:18:39 +02:00
"woo.autoMapping": "Mapeamento automático...",
"woo.refreshCategories": "Atualizar categorias",
2026-08-16 18:18:39 +02:00
"woo.availableCategories": "Categorias WooCommerce disponíveis",
"woo.categoriesEmptyHint": "Teste a ligação e depois atualize para carregar categorias WooCommerce.",
"woo.attributeMappingTitle": "Mapeamento de atributos",
"woo.attributeMappingDesc": "Mapeie os seus atributos internos para os atributos WooCommerce",
"woo.autoMapAttributes": "Mapear atributos automaticamente",
"woo.refreshAttributes": "Atualizar atributos",
2026-08-16 18:18:39 +02:00
"woo.availableAttributes": "Atributos WooCommerce disponíveis",
"woo.attributesEmptyHint": "Teste a ligação e depois atualize para carregar atributos WooCommerce.",
"woo.ordersTitle": "Importação de encomendas (WooCommerce → Descrybe)",
"woo.ordersDesc": "WooCommerce → Descrybe — importa encomendas e linhas para o Descrybe (não escreve de volta na loja).",
"woo.ordersNeedsReconnect": "A importação de encomendas não pode correr até as credenciais serem reconectadas após a migração. No separador Ligação: Guardar, depois Testar ligação.",
"woo.syncSettingsTitle": "Definições de sync",
"woo.syncSettingsDesc": "Configure como os produtos são enviados Descrybe → WooCommerce",
"woo.matchStrategy": "Produto Matching Strategy",
2026-08-16 18:18:39 +02:00
"woo.matchStrategyHelp": "O envio de produtos (Descrybe → WooCommerce) corresponde produtos remotos por SKU ou EAN/GTIN. Coloque na fila no separador Ligação (manual).",
"woo.lastSyncLabel": "Última sync",
"woo.saveSyncSettings": "Guardar definições de sync",
"woo.match.sku": "SKU",
"woo.match.ean": "EAN/GTIN",
"plan.feature.section.shell": "Ambiente",
"plan.feature.section.dashboard": "Painel",
2026-08-16 18:18:39 +02:00
"plan.feature.section.catalog": "Catálogo",
"plan.feature.section.feeds": "Feeds",
"plan.feature.section.stores": "Lojas",
"plan.feature.section.processing": "Processamento",
"plan.feature.section.marketing": "Marketing",
2026-08-16 18:18:39 +02:00
"plan.feature.section.integrations": "Integrações",
"plan.feature.section.billing": "Faturação",
"plan.feature.section.settings": "Definições",
"plan.feature.section.support": "Suporte",
"plan.feature.section.capabilities": "Capacidades",
2026-08-16 18:18:39 +02:00
"plan.feature.shell.navigation": "Navegação lateral",
"plan.feature.shell.command_palette": "Paleta de comandos",
"plan.feature.shell.company_switcher": "Seletor de empresa",
2026-08-16 18:18:39 +02:00
"plan.feature.shell.support_notifications": "Sino de notificações de suporte",
"plan.feature.shell.tutorial": "Tutorial do produto",
"plan.feature.shell.account_menu": "Menu da conta",
2026-08-16 18:18:39 +02:00
"plan.feature.shell.billing_recovery_banner": "Banner de recuperação de faturação",
"plan.feature.dashboard.overview": "Visão geral do painel",
"plan.feature.dashboard.stats": "Cartões de estatísticas",
"plan.feature.dashboard.quick_links": "Ligações rápidas",
"plan.feature.dashboard.recent_jobs": "Tarefas recentes",
2026-08-16 18:18:39 +02:00
"plan.feature.dashboard.news_feed": "Feed de notícias",
"plan.feature.dashboard.activation_checklist": "Lista de ativação",
"plan.feature.dashboard.migrated_checklist": "Lista da coorte migrada",
"plan.feature.dashboard.etl_gaps": "Painel de lacunas ETL",
2026-08-16 18:18:39 +02:00
"plan.feature.dashboard.store_reconnect": "Banner de reconexão da loja",
"plan.feature.dashboard.upgrade_banners": "Banners de atualização",
"plan.feature.catalog.products": "Produtos",
"plan.feature.catalog.products.tab_processed": "Produtos - separador Processados",
2026-08-16 18:18:39 +02:00
"plan.feature.catalog.products.tab_needs_review": "Produtos - separador Precisa de revisão",
"plan.feature.catalog.products.tab_error": "Produtos - separador Erro",
"plan.feature.catalog.products.tab_processing": "Produtos - separador A processar",
2026-08-16 18:18:39 +02:00
"plan.feature.catalog.products.tab_unprocessed": "Produtos - separador Não processados",
"plan.feature.catalog.products.process_categories": "Processar categorias",
2026-08-16 18:18:39 +02:00
"plan.feature.catalog.products.process_attributes": "Processar atributos / especificações",
"plan.feature.catalog.products.process_ai_titles": "Processar títulos com IA",
"plan.feature.catalog.products.process_ai_descriptions": "Processar descrições com IA",
"plan.feature.catalog.products.enrichment_review": "Painel de revisão de enriquecimento",
"plan.feature.catalog.products.export_selection": "Exportar produtos selecionados",
2026-08-16 18:18:39 +02:00
"plan.feature.catalog.products.upgrade_prompt": "Avisos de atualização de produtos",
"plan.feature.catalog.categories": "Categorias",
2026-08-16 18:18:39 +02:00
"plan.feature.catalog.categories.title_formula": "Fórmula de título de categoria",
"plan.feature.catalog.categories.description_formula": "Fórmula de descrição de categoria",
"plan.feature.catalog.attributes": "Atributos",
2026-08-16 18:18:39 +02:00
"plan.feature.catalog.attributes.bulk_import": "Importação em massa de atributos",
"plan.feature.catalog.standard_fields": "Campos padrão",
"plan.feature.catalog.standard_fields.groups": "Grupos de campos padrão",
"plan.feature.catalog.structured_descriptions": "Campos de descrição estruturada",
"plan.feature.catalog.vector_categories": "Categorias vetoriais",
2026-08-16 18:18:39 +02:00
"plan.feature.feeds.list": "Feeds de importação",
"plan.feature.feeds.add_url": "Adicionar URL do feed",
"plan.feature.feeds.add_csv": "Adicionar feed por carregamento CSV",
"plan.feature.feeds.sync": "Sincronizar feed",
"plan.feature.feeds.mapping": "Mapeamento de feed",
"plan.feature.feeds.mapping.select_item": "Mapeamento - selecionar elemento item",
"plan.feature.feeds.mapping.map_fields": "Mapeamento - mapear campos",
2026-08-16 18:18:39 +02:00
"plan.feature.feeds.export_feeds": "Feeds de exportação",
"plan.feature.feeds.export_feeds.create": "Criar feed de exportação",
"plan.feature.feeds.export_feeds.generate": "Gerar feed de exportação",
"plan.feature.feeds.uploads": "Carregamentos de ficheiros",
"plan.feature.stores.hub": "Centro de lojas",
2026-08-16 18:18:39 +02:00
"plan.feature.stores.woocommerce": "Integração WooCommerce",
"plan.feature.stores.woocommerce.connection": "Ligação WooCommerce",
"plan.feature.stores.woocommerce.categories": "Sincronização de categorias WooCommerce",
"plan.feature.stores.woocommerce.attributes": "Sincronização de atributos WooCommerce",
"plan.feature.stores.woocommerce.orders": "Encomendas WooCommerce",
2026-08-16 18:18:39 +02:00
"plan.feature.stores.woocommerce.reviews": "Avaliações WooCommerce",
"plan.feature.stores.woocommerce.settings": "Definições WooCommerce",
"plan.feature.stores.shopify": "Integração Shopify",
"plan.feature.stores.shopify.connection": "Ligação Shopify",
"plan.feature.stores.shopify.orders": "Encomendas Shopify",
2026-08-16 18:18:39 +02:00
"plan.feature.stores.shopify.settings": "Definições Shopify",
"plan.feature.processing.monitor": "Monitor de processamento",
"plan.feature.marketing.campaigns": "Campanhas",
"plan.feature.marketing.campaigns.create": "Assistente de nova campanha",
2026-08-16 18:18:39 +02:00
"plan.feature.marketing.campaigns.generate_ai": "Geração de campanha com IA",
"plan.feature.marketing.campaigns.send": "Envio / blast de campanha",
2026-08-16 18:18:39 +02:00
"plan.feature.marketing.content_calendar": "Calendário de conteúdos",
"plan.feature.marketing.brand_kit": "Kit de marca",
"plan.feature.marketing.brand_ai_apply": "Aplicar marca IA nos prompts",
2026-08-16 18:18:39 +02:00
"plan.feature.marketing.seo": "Recomendações SEO",
"plan.feature.marketing.seo.template_fill": "Preenchimento de modelo SEO",
"plan.feature.marketing.seo.ai_rewrite": "Reescrita SEO com IA",
2026-08-16 18:18:39 +02:00
"plan.feature.marketing.reviews": "Avaliações",
"plan.feature.integrations.ai": "Integrações de IA",
"plan.feature.integrations.ai.byok": "Use a sua própria chave de IA",
"plan.feature.integrations.email": "Envio de e-mail",
"plan.feature.integrations.email.test": "Envio de e-mail de teste",
"plan.feature.integrations.email.blast": "Envio em massa de e-mail",
2026-08-16 18:18:39 +02:00
"plan.feature.billing.overview": "Visão geral da faturação",
"plan.feature.billing.customer_portal": "Portal de cliente Stripe",
2026-08-16 18:18:39 +02:00
"plan.feature.billing.quick_upgrade": "Checkout de atualização rápida",
"plan.feature.billing.plans_compare": "Comparar planos",
"plan.feature.billing.checkout": "Checkout Stripe",
2026-08-16 18:18:39 +02:00
"plan.feature.settings.profile": "Definições de perfil",
"plan.feature.settings.company": "Definições da empresa",
"plan.feature.settings.alerts": "Preferências de alertas",
"plan.feature.settings.api_keys": "Chaves API",
2026-08-16 18:18:39 +02:00
"plan.feature.settings.team": "Gestão da equipa",
"plan.feature.settings.team_invite": "Convidar colega",
"plan.feature.support.center": "Centro de suporte",
"plan.feature.support.ticket_create": "Novo ticket de suporte",
"plan.feature.support.ticket_thread": "Thread do ticket de suporte",
"plan.feature.capability.sku_cap": "Limite de SKU de produto",
2026-08-16 18:18:39 +02:00
"plan.feature.capability.ai_credits": "Carteira de créditos de IA",
"plan.feature.capability.ai_processing": "Tarefas de processamento com IA",
"plan.feature.capability.eprel": "Enriquecimento EPREL",
2026-08-16 18:18:39 +02:00
"plan.feature.capability.normalize_specs_fill": "Normalizar / especificações / preencher",
"plan.feature.capability.campaign_ai": "Geração de campanha com IA",
"plan.feature.capability.email_live_send": "Entrega de e-mail em direto",
"plan.feature.capability.brand_ai_apply": "Voz da marca nos prompts de IA",
"plan.feature.capability.seo_ai_rewrite": "Reescrita SEO com IA",
"plan.feature.capability.feed_source_limit": "Limite de fontes de feed (marketing)",
2026-08-16 18:18:39 +02:00
"plan.feature.capability.export_feed_limit": "Limite de feeds de exportação (marketing)",
"plan.feature.capability.storage_limit": "Limite de armazenamento (marketing)",
2026-08-16 18:18:39 +02:00
"plan.feature.capability.api_access": "Acesso à API REST (marketing)",
"plan.feature.capability.byok": "Use a sua própria chave de IA",
"billing.plan.free": "Grátis",
"products.actions.selectAll": "Selecionar tudo",
2026-08-16 18:18:39 +02:00
"products.actions.upgradeSuffix": " · atualizar",
"products.actions.upgradeRequired": "{label} (atualização necessária)",
"products.actions.free": "grátis",
"products.actions.credits": "{credits} créditos",
"products.actions.autoCategorizeTitle": "A adicionar categorização automaticamente",
"products.actions.autoCategorizeBody": "{count} produto(s) precisam de categorização para o processamento de {types}",
"products.actions.aiLocked": "As opções de IA estão bloqueadas no Free. Atualize para processar títulos/descrições.",
"products.actions.processSelected": "Processar selecionados",
"products.actions.markProcessed": "Marcar como processado",
2026-08-16 18:18:39 +02:00
"products.actions.resetUnprocessed": "Repor para não processado",
"products.actions.export": "Exportar",
"products.upload.dropHint": "Largue um CSV aqui ou clique para procurar",
2026-08-16 18:18:39 +02:00
"products.upload.supportsHint": "Suporta importações de produtos .csv (ean, name, category…)",
"products.export.chooseConfig": "Exportar {count} produto(s) selecionado(s). Escolha o feed de exportação que define formato e campos.",
"products.export.selectPlaceholder": "Selecione um feed de exportação…",
"fields.typeLabel": "Tipo",
"fields.groupLabel": "Grupo",
"fields.selectGroup": "Selecionar um grupo",
"fields.groupBelongsHint": "Grupo a que este campo pertence",
"fields.addFieldShort": "Adicionar campo",
"fields.enableRecommended": "Ativar recomendados",
"feeds.activated": "Feed ativado.",
"feeds.deactivated": "Feed desativado.",
2026-08-16 18:18:39 +02:00
"feeds.syncTimeout": "Sincronizar timed out waiting for the server. The job may still finish — open Sincronizar History to check status.",
"feeds.createdMapHint": "Feed criado. Mapeie campos antes de sincronizar.",
"feeds.createdPlain": "Feed criado.",
"feeds.createdMapDesc": "Mapeie colunas de origem para campos de produto e depois sincronize.",
2026-08-16 18:18:39 +02:00
"feeds.lastLiveSync": "Última sync bem-sucedida do feed: {when}",
"feeds.noLiveSyncProducts": "Ainda sem sync bem-sucedida do feed. Catálogo atualizado pela última vez {when}.",
"feeds.noDataYet": "Ainda sem sync ou dados de catálogo.",
"products.filters.incomplete": "Incompleto",
"products.filters.complete44": "Completo (4/4)",
"products.filters.missingName": "Nome em falta",
2026-08-16 18:18:39 +02:00
"products.filters.missingDescription": "Descrição em falta",
"products.filters.missingAttributes": "Atributos em falta",
"products.filters.missingCategory": "Categoria em falta",
"products.filters.hasEprel": "Tem EPREL",
"products.filters.noEprel": "Sem EPREL",
2026-08-16 18:18:39 +02:00
"products.filters.priceChanged": "Preço alterado",
"products.filters.stockChanged": "Stock alterado",
2026-08-16 18:18:39 +02:00
"products.filters.titleChanged": "Título alterado",
"products.filters.newFromFeed": "Novo do feed",
2026-08-16 18:18:39 +02:00
"products.filters.otherFieldChange": "Outra alteração de campo",
"products.filters.sortUpdatedNewest": "Atualizado (mais recente)",
"products.filters.sortUpdatedOldest": "Atualizado (mais antigo)",
"products.filters.sortNameAsc": "Nome (A-Z)",
"products.filters.sortNameDesc": "Nome (Z-A)",
"products.filters.searchPlaceholder": "Pesquisar produtos...",
"products.filters.searchCategories": "Pesquisar categorias...",
"products.filters.selectFeed": "Selecionar feed",
2026-08-16 18:18:39 +02:00
"products.filters.loadingFeeds": "A carregar feeds…",
"products.table.loading": "A carregar produtos",
"products.table.uncategorized": "Sem categoria",
"products.table.assignCategory": "Atribuir categoria",
"products.table.changeCategory": "Alterar categoria de {name}",
2026-08-16 18:18:39 +02:00
"products.table.selectCategory": "Selecionar categoria…",
"products.table.saveCategory": "Guardar categoria",
2026-08-16 18:18:39 +02:00
"products.table.cancelCategory": "Cancelar edição da categoria",
"products.table.categoryRequired": "Escolha uma categoria",
2026-08-16 18:18:39 +02:00
"products.table.noCategoriesAvailable": "Ainda sem categorias — crie uma em Catálogo",
"products.table.qualityUnavailable": "Qualidade indisponível",
"products.table.full": "Cheio",
"products.table.empty": "Vazio",
"products.table.saveName": "Guardar nome",
2026-08-16 18:18:39 +02:00
"products.table.cancelRename": "Cancelar mudança de nome",
"products.table.noSyncYet": "Ainda sem sync",
2026-08-16 18:18:39 +02:00
"products.feedSync.feedAndWhen": "{feed} · {when}",
"products.feedSync.syncedWhen": "Sincronizado {when}",
2026-08-16 18:18:39 +02:00
"products.table.productOptions": "Opções de produto",
"products.edit.details": "Detalhes do produto",
"products.edit.noEprel": "Sem id EPREL neste produto.",
2026-08-16 18:18:39 +02:00
"products.edit.specsPresent": "As especificações técnicas estão presentes neste produto.",
"products.edit.noEnrichedName": "Sem nome enriquecido",
"products.edit.resetName": "Repor o nome enriquecido para o original",
2026-08-16 18:18:39 +02:00
"products.edit.cannotClearName": "O original está vazio — não é possível limpar o nome enriquecido via PATCH",
"products.edit.showPreview": "Mostrar pré-visualização",
"products.edit.editHtml": "Editar HTML",
2026-08-16 18:18:39 +02:00
"products.edit.noEnrichedDescription": "Sem descrição enriquecida",
"products.edit.resetDescription": "Repor a descrição enriquecida para o original",
"products.edit.cannotClearDescription": "O original está vazio — não é possível limpar a descrição enriquecida via PATCH",
"products.edit.unknownFeed": "Feed desconhecido",
2026-08-16 18:18:39 +02:00
"products.edit.noProcessedName": "Sem nome processado disponível",
"products.edit.feedNamed": "Feed · {name}",
"products.edit.noAiDescription": "Sem descrição de IA",
"products.edit.sourceLabel": "Etiqueta de origem",
2026-08-16 18:18:39 +02:00
"products.edit.coverageTitle": "Quantos de Nome, Descrição, Atributos e Categoria estão presentes (feed ou processados).",
"products.edit.coverageReady": "{count}/4 prontos",
2026-08-16 18:18:39 +02:00
"products.edit.eprelPresentTitle": "O id European Product Registry for Energy Labelling (EPREL) está presente neste produto.",
"products.edit.noEprelBadge": "Sem EPREL",
"products.edit.specsBadge": "Especs",
"products.edit.reviewBannerTitle": "Reveja os campos enriquecidos antes de aceitar",
2026-08-16 18:18:39 +02:00
"products.edit.reviewBannerHelp": "Use o separador Revisão para comparar originais vs IA. Atalhos: A aceitar · R rejeitar · Alt+1/2 campo · ⌘/Ctrl+Enter aceitar tudo.",
"products.edit.tab.review": "Rever",
"products.edit.tab.details": "Detalhes",
2026-08-16 18:18:39 +02:00
"products.edit.tab.content": "Conteúdo",
"products.edit.tab.attributes": "Atributos",
"products.edit.tab.feed": "Feed",
"products.edit.changed": "Alterado",
"products.edit.matched": "Correspondente",
"products.edit.original": "Original",
"products.edit.enriched": "Enriquecido",
"products.edit.discardName": "Descartar nome",
"products.edit.acceptName": "Aceitar nome",
2026-08-16 18:18:39 +02:00
"products.edit.discardDescription": "Descartar descrição",
"products.edit.acceptDescription": "Aceitar descrição",
"products.edit.noCategory": "No Categoria",
2026-08-16 18:18:39 +02:00
"products.edit.whatsFilledIn": "O que está preenchido",
"products.edit.coverageLegend": "Cinzento = em falta · Laranja = do feed · Verde = processado",
"products.edit.feedSource": "Origem do feed",
2026-08-16 18:18:39 +02:00
"products.edit.updatedRelative": "· atualizado {when}",
"products.edit.viewAllFeedFields": "Ver all feed fields ({filled}/{total})",
"products.edit.productIdentity": "Produto identity",
"products.edit.aiProcessedName": "Nome processado com AI",
"products.edit.originalName": "Nome original",
"products.edit.productIdSku": "Produto ID / SKU",
"products.edit.rowUpdated": "Linha do produto atualizada {when}",
"products.edit.noRawUpdateTime": "No raw produto update time",
2026-08-16 18:18:39 +02:00
"products.edit.feedSyncLabel": "· sincronização do feed {when}",
"products.edit.neverRecorded": "nunca registado",
2026-08-16 18:18:39 +02:00
"products.edit.feedFilledCount": "{filled} preenchidos · {total} campos",
"products.edit.noMappedFeedFields": "No mapped feed fields on this produto.",
"products.edit.fieldCol": "Campo",
"products.edit.valueFromFeed": "Valor from feed",
2026-08-16 18:18:39 +02:00
"products.edit.core": "Núcleo",
"products.edit.aiProcessedDescription": "AI-Processed Descrição",
"products.edit.originalDescription": "Descrição original",
"products.edit.noAttrsYet": "No atributo or specification data on this produto yet.",
"products.edit.fromFeed": "Do feed",
2026-08-16 18:18:39 +02:00
"products.edit.feedAttrsHelp": "Valores analisados do feed (especificações HTML, garantia, dimensões, EPREL). As chaves são ligadas a attribute_key quando possível.",
"products.edit.fieldsCount": "{count} campos",
"products.edit.originalAttributes": "Atributos originais",
"products.edit.aiAttributes": "Atributos IA / enriquecidos",
2026-08-16 18:18:39 +02:00
"products.edit.editableAttributes": "Atributos editáveis",
"products.edit.editableAttributesHelp": "As alterações guardam-se no mapa de atributos do produto. As linhas de feed e IA abaixo ficam como referência quando diferem.",
"products.edit.addAttribute": "Adicionar atributo",
"products.edit.attrKeyPlaceholder": "Chave",
"products.edit.attrValuePlaceholder": "Valor",
"products.edit.removeAttribute": "Remover {key}",
2026-08-16 18:18:39 +02:00
"products.edit.noEditableAttrs": "Ainda sem atributos editáveis. Adicione um par chave/valor.",
"products.edit.reject": "Rejeitar",
"products.edit.accept": "Aceitar",
"taskIndicator.title": "Tarefas em segundo plano",
"taskIndicator.activeOne": "1 tarefa em curso",
"taskIndicator.activeMany": "{count} tarefas em curso",
"taskIndicator.view": "Ver progresso",
"taskIndicator.expand": "Expandir lista de tarefas",
"taskIndicator.collapse": "Fechar lista de tarefas",
"taskIndicator.progressAria": "Progresso da tarefa {pct} por cento",
"taskIndicator.progressCounts": "{done} de {total} produtos",
"attributes.assignBulk": "Atribuir a categorias",
"products.filters.search": "Pesquisar",
2026-08-16 18:18:39 +02:00
"products.filters.sortAria": "Ordenação: {label}",
"products.filters.sortLabel": "Ordenação: {label}",
"products.table.colIdName": "ID/Nome",
"products.table.colCoverage": "Cobertura",
2026-08-16 18:18:39 +02:00
"products.table.coverageTitle": "Cobertura: N=Nome, D=Descrição, A=Atributos, C=Categoria. Cinzento=em falta, laranja=do feed, verde=processado. EPREL mostra o id do registo de etiqueta energética.",
"products.table.colFeed": "Feed",
"products.table.colCategory": "Categoria",
"products.table.colStatus": "Estado",
2026-08-16 18:18:39 +02:00
"products.table.colUpdated": "Última atualização",
"products.table.colActions": "Ações",
"products.table.loadingDots": "A carregar produtos…",
"products.table.noneFound": "Não foram encontrados produtos.",
"products.table.selectProduct": "Selecionar produto {name}",
"products.table.rename": "Mudar nome de {name}",
"products.table.productNameAria": "Nome do produto para {name}",
"products.table.selectPage": "Selecionar {count} on this page",
2026-08-16 18:18:39 +02:00
"products.table.deselectPage": "Desselecionar {count} nesta página",
"categories.assign": "Atribuir",
2026-08-16 18:18:39 +02:00
"categories.titleFormulaSubtitle": "Configure como os títulos de produto devem ser gerados para {name}",
"categories.addText": "Adicionar texto",
2026-08-16 18:18:39 +02:00
"categories.aboutTitleFormulas": "Sobre as fórmulas de título",
"categories.aboutTitleFormulasHelp": "Os títulos são montados da esquerda para a direita a partir dos elementos abaixo.",
"categories.variablesReplacedHelp": "As variáveis são substituídas por dados do produto quando disponíveis. Valores em falta são ignorados.",
"categories.variableTypeHelp": "Campo dinâmico dos dados do produto (exemplo: marca).",
"categories.textTypeHelp": "Texto estático que aparece sempre como escrito.",
"categories.assignTitleCopyHelp": "Use Atribuir para copiar esta fórmula para outras categorias que devam partilhar o mesmo padrão de título.",
"categories.titleFormulaInvalid": "Esta página de fórmula de título precisa de uma categoria válida. Volte a categorias e abra novamente Editar fórmula de título.",
"categories.preview.title": "Pré-visualização do título",
"categories.preview.description": "Assim serão estruturados os títulos dos seus produtos",
"categories.preview.exampleTab": "Pré-visualização de exemplo",
"categories.preview.structureTab": "Estrutura da fórmula",
"categories.preview.noElements": "Ainda sem elementos",
"categories.brandTips.title": "Dicas com base na marca",
2026-08-16 18:18:39 +02:00
"categories.brandTips.freePlan": "O kit de marca é editável no plano Free; a aplicação com IA desbloqueia-se nos planos pagos.",
"categories.brandTips.editBrandKit": "Editar kit de marca",
"categories.brandTips.emptyBefore": "Adicione voz ou termos preferidos em ",
"categories.brandTips.emptyAfter": " para ver dicas aqui.",
"categories.brandTips.brandKit": "Kit de marca",
2026-08-16 18:18:39 +02:00
"categories.brandTips.descGuidanceBefore": "Orientação do seu ",
"categories.brandTips.descGuidanceAfter": " para as secções de descrição.",
"categories.formulaElementsTitle": "Elementos da fórmula",
"categories.formulaElementsHelp": "Arraste e largue elementos para os reordenar",
"categories.noElementsAdded": "Nenhum elemento adicionado",
2026-08-16 18:18:39 +02:00
"categories.addElementsHint": "Adicione variáveis ou texto a partir do painel à direita",
"categories.editTextElementAria": "Editar elemento de texto {value}",
"categories.removeElementAria": "Remover elemento {type} {value}",
"categories.tab.single": "Individual",
"categories.tab.bulk": "Carregamento em massa",
2026-08-16 18:18:39 +02:00
"categories.uniqueIdLabel": "ID único",
"categories.parentLabel": "Principal",
"categories.noneRoot": "Nenhum (raiz)",
2026-08-16 18:18:39 +02:00
"categories.descriptionLabel": "Descrição",
"categories.csvUploadHelp": "Carregue um CSV com as colunas name, unique_id e, opcionalmente, parent_unique_id e description.",
"categories.downloadTemplate": "Descarregar modelo",
"categories.variableNameKey": "Nome (chave)",
"categories.displayName": "Nome a apresentar",
"categories.exampleValue": "Valor de exemplo",
2026-08-16 18:18:39 +02:00
"categories.variableExists": "Já existe uma variável com o nome \"{name}\".",
"categories.addVariable": "Adicionar variável",
"categories.updateVariable": "Atualizar variável",
"categories.col.displayName": "Nome a apresentar",
"categories.col.key": "Chave",
2026-08-16 18:18:39 +02:00
"categories.col.description": "Descrição",
"categories.col.example": "Exemplo",
2026-08-16 18:18:39 +02:00
"categories.noVariablesFound": "Nenhuma variável encontrada",
"categories.availableVariables": "Variáveis disponíveis",
"categories.manage": "Gerir",
2026-08-16 18:18:39 +02:00
"categories.noVariablesMatch": "Nenhuma variável corresponde a “{query}”.",
"categories.noUnusedVariables": "Não restam variáveis não usadas. Adicione uma variável personalizada ou remova um elemento para libertar uma.",
"categories.exampleColon": "Exemplo: {value}",
"categories.editVariableAria": "Editar {label}",
"categories.deleteVariableAria": "Eliminar {label}",
"categories.addVariableAria": "Adicionar {label}",
"categories.textLabel": "Texto",
2026-08-16 18:18:39 +02:00
"categories.textAppearsAsWritten": "Este texto aparecerá exatamente como escrito nos seus títulos",
"categories.addTextButton": "Adicionar texto",
"categories.updateTextButton": "Atualizar texto",
2026-08-16 18:18:39 +02:00
"categories.structureDescriptionsFor": "Estruture as descrições de produto para {name}",
"categories.metaInformation": "Informação meta",
"categories.metaInformationHelp": "Instruções que a IA usa para as etiquetas de título SEO e meta description.",
"categories.metaTitleFormula": "Fórmula de meta título",
"categories.metaTitleHint": "Mostrada nos resultados de pesquisa e separadores do browser (cerca de 50–60 caracteres).",
"categories.metaDescriptionFormula": "Fórmula de meta descrição",
"categories.metaDescriptionHint": "Mostrada sob o título nos resultados de pesquisa (cerca de 120–155 caracteres).",
"categories.resetToDefault": "Repor predefinição",
"categories.descriptionSections": "Secções de descrição",
"categories.descriptionSectionsHelp": "Arraste secções para definir a ordem da descrição gerada.",
"categories.noSectionsYet": "Ainda sem secções",
"categories.addSectionsHint": "Adicione um cabeçalho, parágrafo ou lista para começar.",
"categories.aiInstructions": "Instruções de IA",
"categories.exportIdOptional": "ID de exportação (opcional)",
"categories.exportIdUnique": "O ID de exportação deve ser único",
"categories.addSection": "Adicionar secção",
"categories.aboutDescriptionFormulas": "Sobre as fórmulas de descrição",
"categories.aboutDescriptionFormulasHelp": "Estas instruções dizem à IA como escrever descrições para produtos nesta categoria.",
"categories.sectionTypesHeading": "Tipos de secção",
"categories.sectionTypeHeadings": "Cabeçalhos (H1–H4):",
"categories.sectionTypeHeadingsHelp": "Títulos e subtítulos",
"categories.sectionTypeParagraphs": "Parágrafos:",
"categories.sectionTypeParagraphsHelp": "Blocos de conteúdo principais",
"categories.sectionTypeLists": "Listas com marcadores:",
2026-08-16 18:18:39 +02:00
"categories.sectionTypeListsHelp": "Funcionalidades e especificações",
"categories.aiInstructionsHeading": "Instruções de IA",
"categories.aiInstructionsBody": "Escreva um objetivo claro por secção (o que cobrir, tom, extensão). Pedidos vagos produzem textos vagos.",
"categories.exportIdsHeading": "IDs de exportação",
"categories.exportIdsBody": "IDs opcionais associam uma secção a feeds de exportação (por exemplo short_description).",
"categories.assignDescCopyHelp": "Use Atribuir para copiar este modelo para outras categorias que devam partilhar a mesma estrutura.",
2026-08-16 18:18:39 +02:00
"categories.descriptionFormulaInvalid": "Esta página de fórmula de descrição precisa de uma categoria válida. Volte a categorias e abra novamente Editar fórmula de descrição.",
"categories.sectionType.h1": "Cabeçalho 1",
"categories.sectionType.h2": "Cabeçalho 2",
"categories.sectionType.h3": "Cabeçalho 3",
"categories.sectionType.h4": "Cabeçalho 4",
"categories.sectionType.p": "Parágrafo",
"categories.sectionType.ul": "Lista com marcadores",
2026-08-16 18:18:39 +02:00
"categories.aiGenerationPrompt": "Prompt de geração com IA",
"categories.aiPromptOverrides": "Substitui o prompt de utilizador de melhoria de produto da empresa para {name}",
"categories.promptTemplate": "Modelo de prompt",
2026-08-16 18:18:39 +02:00
"categories.promptTemplateHelp": "Use marcadores como {{name}} e {{description}}. Deixe vazio para usar o predefinido da empresa em Integrações → IA.",
"categories.clear": "Limpar",
"categories.promptLabel": "Prompt",
"categories.charactersCount": "{count} caracteres",
2026-08-16 18:18:39 +02:00
"categories.activeOverride": "· substituição ativa para esta categoria",
"categories.usingCompanyDefault": "· a usar o predefinido da empresa / incorporado",
"categories.usingCompanyDefaultForLang": "· vazio para este idioma — aplica-se o predefinido da empresa / integrado",
"categories.aiPromptSavedLang": "Prompt IA guardado para {lang}.",
"categories.aiPromptClearedLang": "Prompt IA limpo para {lang} (aplica-se o predefinido da empresa).",
2026-08-16 18:18:39 +02:00
"contentLang.switcherLabel": "Idioma de conteúdo",
"contentLang.primary": "principal",
"contentLang.hasOverride": "personalizado",
2026-08-16 18:18:39 +02:00
"contentLang.addLanguage": "Adicionar idioma…",
"contentLang.add": "Adicionar",
"contentLang.removeLanguage": "Remover {lang}",
2026-08-16 18:18:39 +02:00
"contentLang.resultsHint": "Mude de idioma para rever títulos e descrições de IA de cada idioma de conteúdo.",
"contentLang.settingsTitle": "Idiomas de conteúdo",
"contentLang.settingsHelp": "O idioma principal é usado por predefinição. Idiomas extra têm os seus próprios prompts e resultados de IA (cada passagem consome créditos).",
"ai.prompts.languageHelp": "Edite os prompts da empresa por idioma de conteúdo. Um idioma vazio usa o valor predefinido integrado para esse idioma.",
"header.accountSettingsAria": "Definições da conta de {email}",
"switcher.switchUserAria": "Mudar de utilizador: {label}",
2026-08-16 18:18:39 +02:00
"switcher.unavailable": "A mudança de utilizador não está disponível neste ambiente.",
"switcher.loadFailed": "Não foi possível carregar os utilizadores.",
"support.notifications.aria": "Notificações de suporte",
"support.notifications.ariaUnread": "Notificações de suporte, {count} por ler",
"time.never": "Nunca",
2026-08-16 18:18:39 +02:00
"time.invalid": "Data inválida",
"time.unknown": "Data desconhecida",
"time.justNow": "agora mesmo",
"time.neverUsed": "Nunca usado",
"billing.plan.enterprise": "Empresarial",
2026-08-16 18:18:39 +02:00
"news.heading": "Atualizações da plataforma",
"news.subtitle": "Funcionalidades e melhorias mais recentes",
"news.keyFeatures": "Funcionalidades principais:",
"news.badge.new": "Novo",
2026-08-16 18:18:39 +02:00
"news.footer": "É tudo por agora — volte após a próxima versão.",
"news.category.enhancement": "Melhoria",
"news.category.feature": "Funcionalidade",
2026-08-16 18:18:39 +02:00
"news.category.integration": "Integração",
"news.category.newFeature": "Nova funcionalidade",
2026-08-16 18:18:39 +02:00
"news.category.billing": "Faturação",
"news.uxImprovements.description": "Usabilidade melhorada com controlos do tour, melhorias de API e melhor navegação.",
"news.uxImprovements.f1": "Ignorar/ocultar o tour",
"news.uxImprovements.f2": "Melhorias de fiabilidade da API",
2026-08-16 18:18:39 +02:00
"news.uxImprovements.f3": "Navegação de interface melhorada",
"news.uxImprovements.f4": "Maior eficiência do fluxo de trabalho",
"news.multiselect.title": "Suporte a atributos de seleção múltipla",
"news.multiselect.description": "Os produtos podem ter vários valores em atributos do tipo lista.",
"news.multiselect.f1": "Tipo de atributo de seleção múltipla",
"news.multiselect.f2": "Seleção múltipla na edição de produtos",
"news.multiselect.f3": "Vários valores num único atributo",
"news.multiselect.f4": "Extração melhorada para campos de seleção múltipla",
"news.multiselect.f5": "Melhor compatibilidade com feeds de exportação",
"news.csvEan.title": "Carregamento CSV de EAN",
2026-08-16 18:18:39 +02:00
"news.csvEan.description": "Carregue CSV com códigos EAN para processar centenas de produtos de uma vez.",
"news.csvEan.f1": "Carregamento CSV com arrastar e largar",
2026-08-16 18:18:39 +02:00
"news.csvEan.f2": "Validação de formato EAN (EAN-8, EAN-13, UPC-12, GTIN-14)",
"news.csvEan.f3": "Deteção automática de duplicados",
"news.csvEan.f4": "Processamento em massa de produtos",
2026-08-16 18:18:39 +02:00
"news.csvEan.f5": "Estatísticas detalhadas de processamento",
"news.brick.title": "Suporte a atributos com código BRICK",
"news.brick.description": "Sistema de atributos com códigos BRICK para classificação e exportação padronizadas.",
"news.brick.f1": "Gestão de atributos com código BRICK",
"news.brick.f2": "Formatação automática de códigos nas exportações",
"news.brick.f3": "Integração de códigos BRICK em feeds XML",
"news.brick.f4": "Melhorias de compatibilidade dos feeds de exportação",
"news.apiV1.title": "Lançamento da API v1",
"news.apiV1.description": "Novos endpoints API v1 para categorias, atributos, feeds, produtos e exportações.",
"news.apiV1.f1": "Endpoints RESTful da API v1",
2026-08-16 18:18:39 +02:00
"news.apiV1.f2": "Gestão de categorias e atributos",
"news.apiV1.f3": "Criação e gestão de feeds",
"news.apiV1.f4": "Processamento de produtos via API",
2026-08-16 18:18:39 +02:00
"news.apiV1.f5": "Acesso programático a feeds de exportação",
"news.apiV1.f6": "Autenticação e autorização",
"news.feedFiltering.title": "Filtragem de feeds na página de produtos",
"news.feedFiltering.description": "Página de produtos com filtragem de feeds otimizada, estados de carregamento e melhor desempenho.",
"news.feedFiltering.f1": "Filtragem de feeds melhorada",
"news.feedFiltering.f2": "Estados de carregamento melhorados",
"news.feedFiltering.f3": "Desempenho de consultas otimizado",
2026-08-16 18:18:39 +02:00
"news.feedFiltering.f4": "Melhor gestão da paginação",
"news.feedFiltering.f5": "Melhorias da funcionalidade de exportação",
"news.exportFeeds.title": "Sistema de feeds de exportação",
"news.exportFeeds.description": "Sistema completo de feeds de exportação XML/CSV com configurações personalizadas.",
"news.exportFeeds.f1": "Formatos de exportação XML e CSV",
"news.exportFeeds.f2": "Mapeamento personalizado de campos",
2026-08-16 18:18:39 +02:00
"news.exportFeeds.f3": "Pré-visualização da exportação",
"news.exportFeeds.f4": "Exportação de produtos baseada em trabalhos",
"news.exportFeeds.f5": "Integração de dados EPREL",
"news.exportFeeds.f6": "URL públicas de feeds de exportação",
"news.woocommerce.title": "Integração WooCommerce",
"news.woocommerce.description": "Sincronize produtos, categorias e atributos com lojas WooCommerce.",
2026-08-16 18:18:39 +02:00
"news.woocommerce.f1": "Configuração de credenciais da loja",
"news.woocommerce.f2": "Mapeamento de categorias e atributos",
2026-08-16 18:18:39 +02:00
"news.woocommerce.f3": "Sincronização bidirecional de produtos",
"news.woocommerce.f4": "Opções de estratégia de correspondência",
"news.eprel.title": "Integração de rótulos energéticos EPREL",
"news.eprel.description": "Integração com o registo europeu de rotulagem energética para dados de eficiência.",
"news.eprel.f1": "Processamento automático de IDs EPREL",
"news.eprel.f2": "Obtenção de imagens do rótulo energético",
"news.eprel.f3": "Downloads de fichas energéticas do produto",
"news.eprel.f4": "Extração da classe energética",
"news.eprel.f5": "Suporte multilingue",
2026-08-16 18:18:39 +02:00
"news.aiCategorization.title": "Categorização de produtos melhorada",
"news.aiCategorization.description": "Sistema de categorização por IA com melhor precisão e suporte hierárquico.",
"news.aiCategorization.f1": "Navegação hierárquica de categorias",
"news.aiCategorization.f2": "Pontuação de confiança",
"news.aiCategorization.f3": "Suporte multilingue",
2026-08-16 18:18:39 +02:00
"news.aiCategorization.f4": "Gestão automática de alternativas",
"news.standardFields.title": "Gestão de campos padrão",
"news.standardFields.description": "Faça a gestão de campos de produto padrão com grupos, validação e valores predefinidos.",
"news.standardFields.f1": "Organização por grupos de campos",
"news.standardFields.f2": "Campos de sistema e personalizados",
2026-08-16 18:18:39 +02:00
"news.standardFields.f3": "Regras de validação de campos",
"news.standardFields.f4": "Suporte a valores predefinidos",
2026-08-16 18:18:39 +02:00
"news.standardFields.f5": "Configuração automática de campos",
"news.billingSystem.title": "Faturação baseada em créditos",
"news.billingSystem.description": "Novo sistema de faturação por créditos com monitorização de utilização e opções de pagamento flexíveis.",
"news.billingSystem.f1": "Processamento baseado em créditos",
"news.billingSystem.f2": "Análise de utilização",
"news.billingSystem.f3": "Ciclos de faturação flexíveis",
"news.billingSystem.f4": "Gestão de métodos de pagamento",
"news.billingSystem.f5": "Geração de faturas",
"products.pageTitle": "Gestão de produtos",
"products.pageDescriptionStoresBefore": "Faça a gestão, processe e otimize o catálogo. Ligue uma loja ou importe CSV via",
"products.pageDescriptionBasic": "Faça a gestão, processe e otimize o catálogo. Importe via Feeds ou carregue um CSV.",
"products.keyboard.esc": "— feche o painel de edição ou os diálogos",
"products.keyboard.toggle": "— alternar esta dica",
"products.keyboard.reviewPrefix": "No painel Needs Review:",
"products.keyboard.acceptAll": "aceitar tudo",
"products.keyboard.rejectShort": "rejeitar",
2026-08-16 18:18:39 +02:00
"products.keyboard.acceptFields": "aceitar nome / descrição",
"products.connectStore": "Ligar loja",
2026-08-16 18:18:39 +02:00
"products.updating": "A atualizar…",
"products.needLinkedRaw": "Os produtos selecionados precisam de um produto em bruto ligado para processar.",
"products.selectToProcess": "Selecione pelo menos um produto para processar.",
2026-08-16 18:18:39 +02:00
"products.undoResetHint": "Anular devolve o produto a não processado via reposição.",
"products.field.accepted": "{label} aceite no produto.",
2026-08-16 18:18:39 +02:00
"products.field.acceptFailed": "Não foi possível aceitar {field}",
"products.field.discarded": "Enriquecimento de {label} descartado.",
2026-08-16 18:18:39 +02:00
"products.field.discardFailed": "Não foi possível descartar {field}",
"products.upgradeRequired": "É necessário atualizar o plano",
"products.upgradeBody": "Esta funcionalidade precisa de um plano pago ou créditos de IA.",
"products.enrichment.rejectTitle": "Rejeitar enriquecimento?",
"products.enrichment.rejectSelectedTitle": "Rejeitar produtos selecionados?",
2026-08-16 18:18:39 +02:00
"products.enrichment.resetTitle": "Repor para não processado?",
"products.selectedOnPage": "{count} selecionados nesta página",
"products.selectionPageOnly": "A mostrar {shown} de {total} — a seleção é só esta página",
"products.edit.coverageHint": "Quantos de Nome, Descrição, Atributos e Categoria estão presentes (feed ou processados).",
"products.edit.noEprelShort": "Sem EPREL",
"products.edit.specs": "Especs",
2026-08-16 18:18:39 +02:00
"products.edit.reviewBannerBody": "Use o separador Revisão para comparar originais vs IA. Atalhos: A aceitar · R rejeitar · Alt+1/2 campo · ⌘/Ctrl+Enter aceitar tudo.",
"products.edit.whatsFilled": "O que está preenchido",
"products.edit.legend": "Cinzento = em falta · Laranja = do feed · Verde = processado",
"products.edit.updatedAgo": "· atualizado {relative}",
"products.edit.status": "Estado",
"products.edit.noRawUpdate": "No raw produto update time",
2026-08-16 18:18:39 +02:00
"products.edit.feedSyncPart": "· sync de feed",
"products.edit.filledFields": "{filled} preenchidos · {total} campos",
"products.edit.noMappedFields": "No mapped feed fields on this produto.",
"products.edit.emptyBadge": "Vazio",
2026-08-16 18:18:39 +02:00
"products.edit.coreBadge": "Núcleo",
"products.edit.feedAttrsHint": "Valores analisados do feed (especificações HTML, garantia, dimensões, EPREL). As chaves são ligadas a attribute_key quando possível.",
"products.edit.originalAttrs": "Atributos originais",
"products.edit.aiAttrs": "Atributos IA / enriquecidos",
"mapping.confidence.exact": "Exato",
"mapping.confidence.alias": "Alias",
"mapping.confidence.fuzzy": "Aproximado",
2026-08-16 18:18:39 +02:00
"field.group.basic": "Informação básica",
"field.group.pricing": "Preços",
"field.group.media": "Multimédia",
"field.group.taxonomy": "Taxonomia",
2026-08-16 18:18:39 +02:00
"field.group.inventory": "Inventário",
"field.group.attributes": "Atributos",
"field.group.shipping": "Envio",
"field.group.compliance": "Conformidade",
"field.group.other": "Outro",
"common.yes": "Sim",
2026-08-16 18:18:39 +02:00
"common.no": "Não",
"status.running": "Em execução",
"flash.admin.analyticsLoadFailed": "Falha ao carregar as análises",
"flash.admin.diagnosticsLoadFailed": "Falha ao carregar os diagnósticos",
"flash.admin.diagnosticsUnavailable": "Os diagnósticos não estão disponíveis neste deployment. Contacte o administrador da plataforma.",
"flash.admin.diagnosticsUnreachable": "Não foi possível alcançar a API de diagnósticos. Verifique se a API está a correr e se PUBLIC_API_URL / o proxy Vite apontam para ela.",
"admin.charts.statusEmpty": "Ainda sem linhas nesta divisão.",
"admin.charts.seriesEmpty": "Ainda sem dados neste período.",
"admin.charts.primaryDefault": "Principal",
2026-08-16 18:18:39 +02:00
"admin.charts.statusAria": "Distribuição por estado",
"admin.charts.seriesAria": "Gráfico de {label}",
"admin.analytics.lastNDaysAria": "Últimos {days} dias",
"admin.analytics.overview": "Visão geral",
"admin.analytics.overviewHint": "Totais da plataforma com contexto do período dos últimos {days} dias.",
"admin.analytics.tokensInPeriod": "{tokens} no período · de produtos processados",
"admin.analytics.creditsRemainingOf": "{remaining} restantes de {allocated} atribuídos",
"admin.analytics.noJobsYet": "Ainda sem trabalhos",
2026-08-16 18:18:39 +02:00
"admin.analytics.feedsVolume": "{input} de entrada · {export} feeds de exportação",
"admin.analytics.usersCompaniesRaw": "{users} utilizadores · {companies} empresas · {raw} em bruto",
"admin.analytics.operations": "Operações",
"admin.analytics.operationsHint": "Sinais de fiabilidade, chaves e crescimento do período selecionado.",
"admin.analytics.failedCompleted": "{failed} falhados · {completed} concluídos",
"admin.analytics.runningOver2h": "Em execução > 2 h ·",
"admin.analytics.apiKeysTotal": "{total} no total (revogadas incluídas)",
"admin.analytics.signupsDetail": "utilizadores · {companies} empresas · {tickets} tickets abertos/pendentes",
"admin.analytics.providerMix": "Mix de fornecedores",
2026-08-16 18:18:39 +02:00
"admin.analytics.providerMixHint": "Consumo de tokens conforme as credenciais de IA estão configuradas.",
"admin.analytics.productsJobs": "{products} produtos · {jobs} trabalhos",
"admin.analytics.trends": "Tendências",
"admin.analytics.trendsHint": "Séries diárias de tokens, fornecedores, trabalhos e registos.",
"admin.analytics.tokensByDayHint": "Tokens do processamento de produtos concluído (secundária = produtos nesse dia)",
"admin.analytics.seriesTokens": "Fichas",
"admin.analytics.seriesProducts": "Produtos",
2026-08-16 18:18:39 +02:00
"admin.analytics.emptyTokens": "Sem produtos processados com tokens neste período.",
"admin.analytics.tokensByProviderHint": "Divisão diária: interno / popular / personalizado (por tipo de fornecedor)",
"admin.analytics.emptyProviderTokens": "Ainda sem tokens etiquetados por fornecedor neste período.",
"admin.analytics.providerDayTip": "{date}: Interno {internal} · Popular {popular} · Personalizado {custom}",
"admin.analytics.seriesCreated": "Criado",
"admin.analytics.seriesFailed": "Falhado",
2026-08-16 18:18:39 +02:00
"admin.analytics.emptyJobsSeries": "Nenhum trabalho de processamento criado neste período.",
"admin.analytics.seriesUsers": "Utilizadores",
"admin.analytics.seriesCompanies": "Empresas",
2026-08-16 18:18:39 +02:00
"admin.analytics.emptySignups": "Sem registos de utilizadores ou empresas neste período.",
"admin.analytics.statusMix": "Mix de estados",
2026-08-16 18:18:39 +02:00
"admin.analytics.statusMixHint": "Filas históricas de trabalhos, sync de feeds e suporte.",
"admin.analytics.jobStatus": "Estado dos trabalhos",
"admin.analytics.feedSyncQueue": "Fila de sync de feeds",
"admin.analytics.supportTickets": "Tickets de suporte",
"admin.analytics.emptyJobStatus": "Ainda sem trabalhos de processamento.",
"admin.analytics.emptyFeedSync": "Ainda sem trabalhos de sync de feeds.",
"admin.analytics.emptyTickets": "Ainda sem tickets de suporte.",
2026-08-16 18:18:39 +02:00
"admin.analytics.usageDetail": "Detalhe de utilização",
"admin.analytics.usageDetailHint": "Modos de fornecedor, principais empresas e resumos de ciclo de faturação.",
"admin.analytics.companyUsage": "Utilização por empresa",
"admin.analytics.jobsCol": "Trabalhos",
2026-08-16 18:18:39 +02:00
"admin.analytics.billingCycles": "Faturação cycles",
"admin.analytics.billingCyclesHint": "Resumos históricos de ciclos de faturação passados (podem atrasar em relação à subscrição ativa)",
"admin.analytics.periodCol": "Período",
"admin.analytics.creditsCol": "Créditos",
"admin.analytics.dataNotes": "Notas de dados",
2026-08-16 18:18:39 +02:00
"admin.diagnostics.endpointNotMounted": "Endpoint não montado",
"admin.diagnostics.noPayload": "Sem payload de diagnóstico",
"admin.diagnostics.unavailableShort": "Os diagnósticos não estão disponíveis neste deployment.",
"admin.diagnostics.fixThenRefresh": "Corrija o erro acima e depois atualize.",
2026-08-16 18:18:39 +02:00
"admin.diagnostics.refreshOrConfirm": "Atualize ou confirme que a API está saudável.",
"admin.diagnostics.systemStatus": "Estado do sistema",
2026-08-16 18:18:39 +02:00
"admin.diagnostics.snapshot": "Instantâneo {when}",
"admin.diagnostics.queueTotal": "{total} no total",
2026-08-16 18:18:39 +02:00
"admin.diagnostics.queueStuck": "processing_jobs · presos em execução (>2 h):",
"admin.diagnostics.driver": "Driver: {driver}",
"admin.diagnostics.openStuck": "Abrir produtos presos",
2026-08-16 18:18:39 +02:00
"admin.diagnostics.configPresence": "Presença de configuração",
"admin.diagnostics.configHint": "Apenas booleanos · env {env} · RPM {rpm} · lote {batch} · retries {retries}",
"admin.diagnostics.cutoverTitle": "Prontidão de cutover",
"admin.diagnostics.cutoverHint": "Apenas flags de presença — dicas goose, idade do worker, planos em falta. Sem Stripe/SMTP ao vivo.",
"admin.diagnostics.cutoverGoose": "Goose",
2026-08-16 18:18:39 +02:00
"admin.diagnostics.cutoverGooseVersion": "version_max {max} · esperado ≥ {min}",
"admin.diagnostics.cutoverGooseRequired": "Migrações obrigatórias",
"admin.diagnostics.cutoverWorker": "Worker",
2026-08-16 18:18:39 +02:00
"admin.diagnostics.cutoverWorkerAge": "visto há {age}s · obsoleto após {stale}s",
"admin.diagnostics.cutoverWorkerAgeUnknown": "idade indisponível · obsoleto após {stale}s",
"admin.diagnostics.cutoverPlansMissing": "Empresas sem plano",
2026-08-16 18:18:39 +02:00
"admin.diagnostics.cutoverPlansUnavailable": "Contagem de planos indisponível",
"admin.diagnostics.cutoverApiKeysMissing": "Companies without API keys",
"admin.diagnostics.cutoverApiKeysUnavailable": "API key inventory unavailable",
2026-08-16 18:18:39 +02:00
"admin.diagnostics.cutoverApiKeysHint": "Legacy keys were not migrated — tenants must create a new dk_ key (no fake import).",
"admin.diagnostics.cutoverApiKeysLink": "List companies needing reissue",
"admin.diagnostics.cutoverApplied": "aplicada",
"admin.diagnostics.cutoverPending": "pendente",
"admin.diagnostics.etlInventoryTitle": "ETL gap inventory",
2026-08-16 18:18:39 +02:00
"admin.diagnostics.etlInventoryHint": "Read-only COUNTs — no fake import. Blob bytes and default job history stay unmigrated unless ops ran optional domain jobs.",
"admin.diagnostics.etlInventoryFiles": "Files metadata-only",
"admin.diagnostics.etlInventoryFilesDetail": "metadata-only / total file rows",
"admin.diagnostics.etlInventoryJobs": "Jobs migrated tag",
"admin.diagnostics.etlInventoryJobsDefault": "jobs domain not run (empty history expected)",
"admin.diagnostics.etlInventoryJobsRan": "optional jobs domain backfill detected",
"admin.diagnostics.etlInventoryTasks": "Tasks rows",
"admin.diagnostics.etlInventoryTasksDetail": "legacy task history present in Postgres",
"admin.diagnostics.recentJobs": "Tarefas recentes",
"admin.diagnostics.recentAiFailures": "Falhas recentes de IA de suporte",
2026-08-16 18:18:39 +02:00
"admin.diagnostics.aiFailuresHint": "support_ticket_activity · kind=ai_failed",
"admin.diagnostics.relatedTools": "Ferramentas ops relacionadas",
"admin.diagnostics.toolStuckTitle": "Produtos bloqueados",
2026-08-16 18:18:39 +02:00
"admin.diagnostics.toolStuckDesc": "Limpar trabalhos em execução há mais de 2 horas.",
"admin.diagnostics.toolOrphanTitle": "Orphan processed",
2026-08-16 18:18:39 +02:00
"admin.diagnostics.toolOrphanDesc": "Cutover ops #7 — dry-run report, then confirm delete.",
"admin.diagnostics.toolAnalyticsTitle": "Análises",
"admin.diagnostics.toolAnalyticsDesc": "Tendências e gráficos de utilização da plataforma.",
"admin.diagnostics.toolBootstrapTitle": "Bootstrap",
"admin.diagnostics.toolBootstrapDesc": "Confirmar acesso de admin da plataforma para esta conta.",
2026-08-16 18:18:39 +02:00
"admin.diagnostics.toolSettingsTitle": "Definições",
"admin.diagnostics.toolSettingsDesc": "Mail, IA e modo de sistema da plataforma.",
2026-08-16 18:18:39 +02:00
"admin.diagnostics.config.maintenance_mode": "Modo de manutenção",
"admin.diagnostics.config.read_only_mode": "Modo só de leitura",
"admin.diagnostics.config.session_secure": "Cookie de sessão seguro",
"admin.diagnostics.config.smtp_enabled": "SMTP ativado",
"admin.diagnostics.config.email_dry_run": "Email dry-run",
"admin.diagnostics.config.smtp_host_set": "Host SMTP definido",
"admin.diagnostics.config.stripe_mock": "Stripe mock",
"admin.diagnostics.config.eprel_enabled": "EPREL ativado",
2026-08-16 18:18:39 +02:00
"admin.diagnostics.config.upload_dir_configured": "Diretório de upload configurado",
"admin.diagnostics.config.trusted_proxies_configured": "Proxies de confiança definidos",
"admin.diagnostics.config.web_origin_set": "Origem web definida",
2026-08-16 18:18:39 +02:00
"admin.diagnostics.config.public_api_url_set": "URL pública da API definida",
"admin.diagnostics.config.token_signing_secret_set": "Segredo de assinatura de tokens definido",
"admin.diagnostics.config.openai_key_set": "Chave OpenAI definida",
"admin.diagnostics.config.pinecone_key_set": "Chave Pinecone definida",
"admin.diagnostics.config.stripe_secret_set": "Segredo Stripe definido",
"admin.diagnostics.config.stripe_webhook_secret_set": "Segredo de webhook Stripe definido",
2026-08-16 18:18:39 +02:00
"admin.diagnostics.config.stripe_mock_rejected_in_prod": "Mock Stripe rejeitado em produção",
"admin.diagnostics.config.credentials_encryption_key_set": "Chave de encriptação de credenciais definida",
"categories.selectAll": "Selecionar tudo",
"categories.selectedCount": "{count} selecionados",
"categories.noMatchingCategories": "Nenhuma categoria correspondente",
2026-08-16 18:18:39 +02:00
"categories.assigningProgress": "A atribuir… {progress}%",
"categories.assignToCount": "Atribuir a {count}",
2026-08-16 18:18:39 +02:00
"categories.aiPromptSavedForCategory": "Um prompt de geração com IA está guardado para esta categoria.",
"categories.titleAndDescriptionFormulasSaved": "As fórmulas de título e descrição estão guardadas para esta categoria.",
"categories.titleFormulaSavedForCategory": "Uma fórmula de título está guardada para esta categoria.",
"categories.descriptionFormulaSavedForCategory": "Uma fórmula de descrição está guardada para esta categoria.",
"site.account": "Conta",
"site.goToApp": "Ir para a app",
2026-08-16 18:18:39 +02:00
"site.logIn": "Iniciar sessão",
"site.getStarted": "Começar",
"site.nav.primary": "Principal",
2026-08-16 18:18:39 +02:00
"site.nav.mobile": "Telemóvel",
"site.nav.home": "Início",
"site.nav.pricing": "Preços",
"site.nav.apiDocs": "Docs da API",
2026-08-16 18:18:39 +02:00
"seo.home.title": "Descrybe — Converta feeds de fornecedores em fichas de produto prontas",
"seo.home.description": "Ligue feeds CSV ou XML de fornecedores, associe-os às suas categorias e atributos, gere títulos e descrições segundo as suas regras e exporte ou sincronize com o WooCommerce.",
"seo.pricing.title": "Preços — Free, Starter, Growth, Business | Descrybe",
"seo.pricing.description": "Comece gratuitamente com 100 produtos e mapeamento de feeds. Os planos pagos acrescentam títulos e descrições com IA, mais SKU, feeds de exportação e sync WooCommerce — a partir de 49 $/mês. Enterprise para catálogos ilimitados.",
"seo.privacy.title": "Política de privacidade | Descrybe",
"seo.privacy.description": "Como a Descrybe recolhe, utiliza e protege os dados de conta, catálogos de produtos e feeds de fornecedores quando utiliza a nossa plataforma de dados de produto.",
"seo.terms.title": "Termos de serviço | Descrybe",
"seo.terms.description": "Termos de utilização da Descrybe: importação de feeds, enriquecimento de catálogo, conteúdo assistido por IA, exportações e sincronização com WooCommerce para o seu negócio.",
"seo.features.title": "Funcionalidades — Feeds, enriquecimento e exportação | Descrybe",
"seo.features.description": "Descubra como a Descrybe importa feeds de fornecedores, mapeia campos para a sua taxonomia, enriquece dados de produto e envia catálogos através de feeds de exportação, WooCommerce ou API.",
"pricing.page.eyebrow": "Preços",
"pricing.page.title": "Planos simples para catálogos em crescimento",
"pricing.page.lead": "Comece grátis com mapeamento de feeds e limpeza básica. Faça upgrade quando precisar de títulos e descrições com IA, mais produtos, feeds de exportação ou sync WooCommerce — de Starter a Enterprise.",
"pricing.page.subscribedBefore": "Já é subscritor? Gerir utilização em",
"pricing.page.subscribedMid": "ou comparar planos em",
"pricing.page.plansLink": "Planos",
"pricing.page.subscribedAfter": ".",
2026-08-16 18:18:39 +02:00
"legal.lastUpdated": "Última atualização: {date}",
"legal.backHome": "← Voltar ao início",
"legal.emailLabel": "E-mail:",
"legal.postalLabel": "Morada postal:",
2026-08-16 18:18:39 +02:00
"legal.privacy.title": "Política de privacidade",
"legal.privacy.intro.h": "Introdução",
"legal.privacy.intro.p1": "Na Descrybe (\"nós\", \"nosso\" ou \"nos\"), respeitamos a sua privacidade e comprometemo-nos a proteger as suas informações pessoais. Esta Política de privacidade explica como recolhemos, utilizamos, divulgamos e protegemos as suas informações quando utiliza a plataforma de dados de produto da Descrybe e os serviços relacionados (em conjunto, os \"Serviços\").",
"legal.privacy.intro.p2": "Ao aceder ou utilizar os nossos Serviços, aceita as práticas descritas nesta Política de privacidade. Se não concordar com as políticas e práticas aqui descritas, não utilize os nossos Serviços.",
"legal.privacy.collect.h": "Informações que recolhemos",
"legal.privacy.collect.lead": "Recolhemos vários tipos de informação de e sobre os utilizadores dos nossos Serviços, incluindo:",
"legal.privacy.collect.personal.h": "Informações pessoais",
"legal.privacy.collect.personal.p": "Quando se regista para obter uma conta, recolhemos informações que poderão ser utilizadas para o identificar, como o seu nome, endereço de correio eletrónico, número de telefone, nome da empresa e informações de faturação. Recolhemos estas informações diretamente junto de si quando as faculta.",
"legal.privacy.collect.userData.h": "Dados de utilizador",
2026-08-16 18:18:39 +02:00
"legal.privacy.collect.userData.p": "Para prestar os nossos Serviços, recolhemos e tratamos dados de produto, feeds de fornecedores, descrições de produto e outro conteúdo que carrega, introduz ou envia de outro modo para a nossa plataforma. Isto pode incluir atributos de produto, estruturas de taxonomia, modelos e outros dados necessários ao funcionamento dos nossos Serviços.",
"legal.privacy.collect.usage.h": "Informações de utilização",
"legal.privacy.collect.usage.p": "Recolhemos automaticamente certas informações sobre o seu dispositivo e sobre a forma como interage com os nossos Serviços, incluindo o endereço IP, o tipo de dispositivo, o tipo de navegador, o sistema operativo, as horas de acesso, as páginas visualizadas, as funcionalidades utilizadas e outra atividade do sistema. Utilizamos estas informações para melhorar os nossos Serviços e a experiência do utilizador.",
"legal.privacy.collect.cookies.h": "Cookies e tecnologias de rastreio",
2026-08-16 18:18:39 +02:00
"legal.privacy.collect.cookies.p": "Utilizamos cookies, web beacons e tecnologias de rastreio semelhantes para recolher informações sobre as suas atividades de navegação no nosso sítio web. Pode controlar os cookies através das definições do seu navegador e de outras ferramentas. No entanto, se bloquear determinados cookies, poderá não conseguir utilizar todas as funcionalidades dos nossos Serviços.",
"legal.privacy.use.h": "Como utilizamos as suas informações",
"legal.privacy.use.lead": "Utilizamos as informações que recolhemos para diversos fins, incluindo:",
"legal.privacy.use.li1": "Prestar, manter e melhorar os nossos Serviços",
"legal.privacy.use.li2": "Processar transações e enviar informações relacionadas, incluindo confirmações, faturas e notificações do serviço",
"legal.privacy.use.li3": "Desenvolver novos produtos, serviços, funcionalidades e características",
"legal.privacy.use.li4": "Personalizar a sua experiência e oferecer conteúdo e funcionalidades relevantes para os seus interesses",
"legal.privacy.use.li5": "Responder aos seus pedidos, comentários e perguntas",
"legal.privacy.use.li6": "Enviar-lhe avisos técnicos, atualizações, alertas de segurança e mensagens de suporte e administração",
"legal.privacy.use.li7": "Monitorizar e analisar tendências, utilização e atividades relacionadas com os nossos Serviços",
"legal.privacy.use.li8": "Detetar, investigar e prevenir transações fraudulentas e outras atividades ilegais",
"legal.privacy.use.li9": "Proteger os nossos direitos, propriedade e segurança, bem como os direitos, a propriedade e a segurança dos nossos utilizadores ou de outras pessoas",
"legal.privacy.use.li10": "Cumprir obrigações legais e fazer cumprir os nossos termos de serviço",
"legal.privacy.ai.h": "IA e aprendizagem automática",
"legal.privacy.ai.p1": "Os nossos Serviços utilizam tecnologias de inteligência artificial e aprendizagem automática para processar dados de produto, gerar conteúdo e oferecer outras funcionalidades automatizadas. Os dados que fornece aos nossos Serviços podem ser utilizados para treinar e melhorar os nossos modelos de IA. No entanto, aplicamos salvaguardas adequadas para proteger os seus dados e manter a sua confidencialidade.",
"legal.privacy.ai.p2": "Não utilizamos informações de identificação pessoal para treinar os nossos modelos gerais de IA sem o seu consentimento explícito. Os dados de produto utilizados para o treino de IA são anonimizados e agregados sempre que possível.",
"legal.privacy.share.h": "Como partilhamos as suas informações",
"legal.privacy.share.lead": "Podemos partilhar as suas informações nas seguintes circunstâncias:",
"legal.privacy.share.providers.h": "Prestadores de serviços",
"legal.privacy.share.providers.p": "Podemos partilhar as suas informações com fornecedores externos, prestadores de serviços, contratantes ou agentes que realizam serviços em nosso nome, como o processamento de pagamentos, a análise de dados, o envio de correio eletrónico, o alojamento, o apoio ao cliente e a assistência de marketing.",
"legal.privacy.share.transfers.h": "Transferências empresariais",
"legal.privacy.share.transfers.p": "Se participarmos numa fusão, aquisição, financiamento, reorganização, insolvência ou venda de ativos da empresa, as suas informações podem ser transferidas como parte dessa operação. Informá-lo-emos de qualquer alteração deste tipo na titularidade ou no controlo das suas informações pessoais.",
"legal.privacy.share.legal.h": "Requisitos legais",
2026-08-16 18:18:39 +02:00
"legal.privacy.share.legal.p": "Podemos divulgar as suas informações se a lei o exigir ou em resposta a pedidos válidos de autoridades públicas (p. ex., um tribunal ou um organismo governamental). Também podemos divulgar as suas informações para fazer cumprir os nossos termos de serviço, proteger os nossos direitos, privacidade, segurança ou propriedade, e/ou os das nossas afiliadas, utilizadores ou outras pessoas.",
"legal.privacy.share.consent.h": "Com o seu consentimento",
2026-08-16 18:18:39 +02:00
"legal.privacy.share.consent.p": "Podemos partilhar as suas informações com terceiros quando nos tiver dado o seu consentimento para tal.",
"legal.privacy.security.h": "Segurança dos dados",
"legal.privacy.security.p1": "Implementámos medidas técnicas e organizativas adequadas concebidas para proteger as suas informações pessoais contra a perda acidental e contra o acesso, utilização, alteração e divulgação não autorizados. Toda a informação que nos faculta é armazenada em servidores seguros atrás de firewalls.",
"legal.privacy.security.p2": "A segurança das suas informações também depende de si. Quando lhe tivermos facultado (ou quando tiver escolhido) uma palavra-passe para aceder a determinadas partes dos nossos Serviços, é responsável por manter essa palavra-passe em confidencialidade. Pedimos-lhe que não partilhe a sua palavra-passe com ninguém.",
"legal.privacy.security.p3": "Infelizmente, a transmissão de informações através da Internet não é completamente segura. Embora façamos tudo o que está ao nosso alcance para proteger as suas informações pessoais, não podemos garantir a segurança das informações pessoais transmitidas aos nossos Serviços. Qualquer transmissão de informações pessoais é efetuada por sua conta e risco.",
"legal.privacy.rights.h": "Os seus direitos e opções",
"legal.privacy.rights.lead": "Esforçamo-nos por lhe oferecer opções relativamente às informações pessoais que nos faculta. Consoante a sua localização, pode ter determinados direitos sobre as suas informações pessoais, incluindo:",
"legal.privacy.rights.li1": "Aceder e atualizar as suas informações pessoais",
"legal.privacy.rights.li2": "Solicitar a eliminação das suas informações pessoais",
"legal.privacy.rights.li3": "Opor-se ou restringir o tratamento das suas informações pessoais",
"legal.privacy.rights.li4": "Portabilidade dos dados",
2026-08-16 18:18:39 +02:00
"legal.privacy.rights.li5": "Retirar o consentimento (quando aplicável)",
"legal.privacy.rights.footer": "Para exercer os seus direitos, contacte-nos utilizando as informações de contacto que figuram no final desta Política de privacidade. Tenha em atenção que alguns destes direitos podem estar limitados ou não ser aplicáveis consoante a sua localização e as circunstâncias concretas.",
"legal.privacy.retention.h": "Conservação de dados",
"legal.privacy.retention.p1": "Conservaremos as suas informações pessoais durante o tempo necessário para cumprir os fins descritos nesta Política de privacidade, salvo se a lei exigir ou permitir um prazo de conservação mais longo. Ao determinar durante quanto tempo conservar as suas informações, consideramos a quantidade, a natureza e a sensibilidade das informações, o risco potencial de dano por utilização ou divulgação não autorizadas, os fins do tratamento e os requisitos legais aplicáveis.",
"legal.privacy.retention.p2": "Podemos conservar certas informações após o encerramento da sua conta, entre outros fins para cumprir as nossas obrigações legais, resolver litígios e fazer cumprir os nossos acordos.",
"legal.privacy.intl.h": "Transferências internacionais de dados",
"legal.privacy.intl.p1": "As suas informações pessoais podem ser transferidas e tratadas em países diferentes do país em que reside. Esses países podem ter leis de proteção de dados diferentes das do seu país.",
"legal.privacy.intl.p2": "Se transferirmos as suas informações pessoais para países fora do Espaço Económico Europeu ou de outras regiões com leis abrangentes de proteção de dados, asseguraremos que existem salvaguardas adequadas para proteger as suas informações pessoais e que a transferência cumpre a regulamentação aplicável em matéria de proteção de dados.",
"legal.privacy.children.h": "Privacidade dos menores",
2026-08-16 18:18:39 +02:00
"legal.privacy.children.p": "Os nossos Serviços não se destinam a menores de 16 anos, e não recolhemos conscientemente informações pessoais de menores de 16 anos. Se descobrirmos que recolhemos ou recebemos informações pessoais de um menor de 16 anos sem verificação do consentimento parental, eliminaremos essas informações. Se acredita que poderemos ter informações de ou sobre um menor de 16 anos, contacte-nos.",
"legal.privacy.changes.h": "Alterações à nossa Política de privacidade",
"legal.privacy.changes.p1": "Podemos atualizar a nossa Política de privacidade periodicamente. Se efetuarmos alterações substanciais na forma como tratamos as informações pessoais dos utilizadores, notificá-lo-emos por correio eletrónico para o endereço indicado na sua conta e/ou através de um aviso no nosso sítio web.",
"legal.privacy.changes.p2": "A data da última revisão da Política de privacidade é indicada na parte superior da página. É responsável por assegurar que dispomos de um endereço de correio eletrónico atualizado, ativo e suscetível de entrega, e por visitar periodicamente o nosso sítio web e esta Política de privacidade para verificar se existem alterações.",
"legal.privacy.contact.h": "Contacto",
2026-08-16 18:18:39 +02:00
"legal.privacy.contact.lead": "Se tiver perguntas ou preocupações sobre a nossa Política de privacidade ou as nossas práticas de dados, contacte-nos em:",
"legal.terms.title": "Termos de serviço",
"legal.terms.s1.h": "1. Aceitação dos termos",
"legal.terms.s1.p": "Ao aceder ou utilizar a plataforma de dados de produto da Descrybe e os serviços relacionados (em conjunto, os \"Serviços\"), aceita ficar vinculado a estes Termos de serviço e a todas as leis e regulamentações aplicáveis. Se não concordar com algum destes termos, está proibido de utilizar ou aceder aos Serviços.",
"legal.terms.s2.h": "2. Licença de utilização",
"legal.terms.s2.p1": "Sob reserva do cumprimento destes Termos de serviço, a Descrybe concede-lhe uma licença limitada, não exclusiva, intransmissível e revogável para aceder e utilizar os Serviços para fins empresariais.",
"legal.terms.s2.lead": "Esta licença não inclui:",
"legal.terms.s2.li1": "Modificar ou copiar os Serviços nem qualquer conteúdo dos mesmos",
"legal.terms.s2.li2": "Utilizar os Serviços para qualquer fim comercial distinto da utilização empresarial autorizada",
"legal.terms.s2.li3": "Tentar descompilar ou realizar engenharia inversa de qualquer software contido nos Serviços",
"legal.terms.s2.li4": "Eliminar qualquer aviso de direitos de autor ou de propriedade dos materiais",
"legal.terms.s2.li5": "Transferir os materiais para outra pessoa ou \"espelhar\" os materiais em qualquer outro servidor",
2026-08-16 18:18:39 +02:00
"legal.terms.s2.p2": "Esta licença extinguir-se-á automaticamente se incumprir qualquer uma destas restrições e poderá ser terminada pela Descrybe a qualquer momento.",
"legal.terms.s3.h": "3. Subscrição e pagamento",
"legal.terms.s3.p1": "O acesso aos Serviços pode exigir uma subscrição paga. Os termos de pagamento serão especificados durante o processo de subscrição. Todos os pagamentos são não reembolsáveis salvo se a Descrybe o especificar por escrito.",
"legal.terms.s3.p2": "A Descrybe reserva-se o direito de modificar as tarifas de subscrição com um pré-aviso razoável. A utilização continuada dos Serviços após uma alteração de tarifa constitui a aceitação das novas tarifas.",
"legal.terms.s4.h": "4. Conteúdo do utilizador",
"legal.terms.s4.p1": "Conserva todos os direitos sobre qualquer conteúdo que envie, publique ou apresente em ou através dos Serviços (\"Conteúdo do utilizador\"). Ao fornecer Conteúdo do utilizador à Descrybe, concede à Descrybe uma licença mundial, não exclusiva e isenta de royalties para utilizar, reproduzir, modificar, adaptar, publicar, traduzir e distribuir esse conteúdo em relação à prestação dos Serviços.",
"legal.terms.s4.lead": "Declara e garante que:",
2026-08-16 18:18:39 +02:00
"legal.terms.s4.li1": "Possui ou controla todos os direitos sobre o Conteúdo do utilizador que fornece",
"legal.terms.s4.li2": "O Conteúdo do utilizador não viola estes Termos de serviço",
"legal.terms.s4.li3": "O Conteúdo do utilizador não causará dano a nenhuma pessoa ou entidade",
"legal.terms.s5.h": "5. Inteligência artificial",
"legal.terms.s5.p1": "Os Serviços utilizam tecnologias de inteligência artificial e aprendizagem automática. Reconhece que o conteúdo gerado por IA pode não ser perfeito e aceita rever todo o conteúdo gerado por IA antes de o utilizar nas suas operações empresariais.",
"legal.terms.s5.p2": "A Descrybe pode utilizar Conteúdo do utilizador anonimizado e agregado para treinar e melhorar os nossos modelos de IA, sob reserva da nossa Política de privacidade. Pode optar por não permitir que os seus dados sejam utilizados para o treino de IA contactando-nos.",
"legal.terms.s6.h": "6. Propriedade intelectual",
2026-08-16 18:18:39 +02:00
"legal.terms.s6.p": "Os Serviços e o seu conteúdo, funcionalidades e funcionalidade originais são propriedade da Descrybe e estão protegidos pelas leis internacionais de direitos de autor, marcas, patentes, segredos comerciais e outros direitos de propriedade intelectual ou de propriedade.",
"legal.terms.s7.h": "7. Exclusão de garantias",
"legal.terms.s7.p1": "Os Serviços são fornecidos \"tal como estão\" e \"conforme disponíveis\". A Descrybe não formula garantias, expressas ou implícitas, e renuncia desde já a todas as garantias, incluindo, sem limitação, as garantias implícitas de comercialização, adequação a um fim determinado, não infração ou curso de execução.",
"legal.terms.s7.p2": "A Descrybe não garante que os Serviços funcionem de forma ininterrupta, segura ou disponível num momento ou local concretos, nem que sejam corrigidos erros ou defeitos.",
"legal.terms.s8.h": "8. Limitação de responsabilidade",
"legal.terms.s8.lead": "Em caso algum a Descrybe será responsável por danos indiretos, incidentais, especiais, consequentes ou punitivos, incluindo, sem limitação, a perda de lucros, dados, utilização, fundo de comércio ou outras perdas intangíveis, decorrentes de:",
"legal.terms.s8.li1": "O seu acesso ou utilização, ou a impossibilidade de aceder ou utilizar, os Serviços",
"legal.terms.s8.li2": "Qualquer conduta ou conteúdo de terceiros nos Serviços",
"legal.terms.s8.li3": "Qualquer conteúdo obtido dos Serviços",
"legal.terms.s8.li4": "O acesso, utilização ou alteração não autorizados das suas transmissões ou conteúdo",
"legal.terms.s9.h": "9. Rescisão",
"legal.terms.s9.p1": "A Descrybe pode terminar ou suspender o seu acesso aos Serviços imediatamente, sem prévio aviso nem responsabilidade, por qualquer motivo, incluindo, sem limitação, se incumprir estes Termos de serviço.",
"legal.terms.s9.p2": "Após a rescisão, o seu direito de utilizar os Serviços cessará imediatamente. Se desejar terminar a sua conta, pode simplesmente deixar de utilizar os Serviços ou contactar-nos para solicitar a eliminação da conta.",
"legal.terms.s10.h": "10. Lei aplicável",
"legal.terms.s10.p": "Estes Termos reger-se-ão e serão interpretados de acordo com as leis da Eslovénia, sem ter em conta os seus princípios sobre conflito de leis.",
"legal.terms.s11.h": "11. Alterações aos termos",
"legal.terms.s11.p": "A Descrybe reserva-se o direito de modificar ou substituir estes Termos de serviço a qualquer momento. É da sua responsabilidade rever periodicamente estes Termos para verificar se existem alterações. A utilização continuada dos Serviços após a publicação de qualquer alteração constitui a aceitação dessas alterações.",
"legal.terms.s12.h": "12. Contacto",
2026-08-16 18:18:39 +02:00
"legal.terms.s12.lead": "Se tiver perguntas sobre estes Termos de serviço, contacte-nos em:",
"plans.loadFailed": "Não foi possível carregar os planos",
"plans.loading": "A carregar planos…",
"plans.apiUnavailable": "A API de planos ainda não está disponível neste backend. A mostrar a comparação pública de preços.",
"plans.title": "Escolha o seu plano",
2026-08-16 18:18:39 +02:00
"plans.sub.onPrefix": "Está no",
"plans.sub.enterpriseSuffix": "— produtos e IA ilimitados. Não é necessário um upgrade de autosserviço.",
"plans.sub.paygSuffix": "— pagamento por utilização. Compare os planos públicos abaixo ou fale com as vendas para Enterprise.",
"plans.sub.creditsMid": "com {remaining} créditos de IA restantes.",
"plans.sub.creditsSuffix": "Melhore Starter → Growth → Business com Checkout, ou fale com as vendas para Enterprise.",
"plans.sub.none": "Ainda não há um plano atribuído (por exemplo após uma migração omitida). Escolha um plano abaixo — a capacidade não é Ilimitada até que o Checkout ou um administrador atribua um.",
"plans.stripeHint": "Os upgrades de autosserviço utilizam o Stripe Checkout.",
2026-08-16 11:37:42 +02:00
"plans.checkoutUnavailable": "O checkout self-service nao esta disponivel ate o Stripe ser configurado. Contacte as vendas para um plano.",
"plans.fallbackName": "Plano",
2026-08-16 18:18:39 +02:00
"plans.fallbackDescription": "Capacidade para o seu catálogo",
"plans.badge.current": "Atual",
"plans.badge.popular": "Mais popular",
"plans.price.custom": "Personalizado",
"plans.price.forever": "para sempre",
2026-08-16 18:18:39 +02:00
"plans.price.perMonth": "/mês",
"plans.price.seePricing": "Ver preços",
"plans.capacity.unlimitedSkus": "SKU ilimitados",
2026-08-16 18:18:39 +02:00
"plans.capacity.unlimitedAi": "Créditos de IA ilimitados",
"plans.capacity.upToProducts": "Até {count} produtos",
"plans.capacity.creditsPerMonth": "{count} créditos de IA / mês",
"plans.cta.requestUpgrade": "Solicitar melhoria",
"plans.cta.current": "Plano atual",
"plans.cta.contactSales": "Contactar vendas",
2026-08-16 18:18:39 +02:00
"plans.cta.switchInBilling": "Mudar na faturação",
"plans.cta.upgradeTo": "Melhorar para {name}",
2026-08-16 18:18:39 +02:00
"plans.cta.startingCheckout": "A iniciar checkout…",
"plans.planApplied": "Plano {plan} aplicado. Os seus créditos estão prontos.",
"plans.faq.title": "Perguntas frequentes",
"plans.faq.limit.q": "O que acontece se atingir um limite?",
2026-08-16 18:18:39 +02:00
"plans.faq.limit.a": "Primeiro verá avisos suaves. Quando ficar sem créditos de IA ou atingir o limite de SKU, os trabalhos que necessitem dessa capacidade são bloqueados até libertar espaço, aguardar o próximo ciclo ou melhorar o plano.",
"plans.faq.selfServe.q": "Posso melhorar o plano eu próprio?",
"plans.faq.selfServe.a": "Os administradores da empresa podem contratar Starter, Growth e Business por autosserviço através do Checkout no cartão do plano. Os membros devem pedir a um administrador — o Checkout requer o papel de administrador. Enterprise passa sempre pelas vendas. Os administradores da plataforma ainda podem atribuir planos no Billing Admin.",
"plans.faq.enterprise.q": "Enterprise e milhões de SKU",
"plans.faq.enterprise.a": "A capacidade personalizada, a chave de IA própria (BYOK), o SLA e a gestão de conta passam pelas vendas. Reserve tempo no Calendly — Enterprise não é autosserviço à escala de milhões de SKU. A app mostra Ilimitado para capacidade de SKU e IA.",
"plans.faq.pricing.q": "Onde está o preço público?",
"plans.faq.pricing.aBefore": "Consulte a comparação de marketing na",
"plans.faq.pricing.pricingPage": "página de Preços",
"plans.faq.pricing.aMid": "— os CTA são Começar (registo) ou Contactar vendas. Faça a gestão da utilização a qualquer momento em",
"plans.faq.pricing.aAfter": ".",
"plans.custom.title": "Precisa de um plano personalizado?",
2026-08-16 18:18:39 +02:00
"plans.custom.body": "A capacidade Enterprise, a chave de IA própria e os SLA são geridos com a nossa equipa.",
"plans.custom.looking": "Procura detalhes dos planos públicos?",
"ai.title": "Integrações de IA",
"ai.description": "Escolha créditos da plataforma ou a sua própria chave e personalize prompts com variáveis.",
"ai.crumb": "Integrações de IA",
"ai.adminOnly": "Apenas administradores da empresa podem alterar as definições de IA. Pode ver a configuração atual.",
"ai.badge.ownKey": "A sua própria chave",
"ai.badge.platform": "Créditos / chave da plataforma",
"ai.badge.active": "Ativo: {label}",
2026-08-16 18:18:39 +02:00
"ai.badge.platformKeyAvailable": "Chave da plataforma disponível",
"ai.badge.lastTest": "Último teste: {status}",
"ai.providerMode.title": "Modo do fornecedor",
2026-08-16 18:18:39 +02:00
"ai.providerMode.desc": "A plataforma usa créditos Descrybe e a nossa chave. Popular ou Personalizado usa a sua chave compatível com OpenAI (a chamada ao fornecedor em si não gasta créditos da plataforma; as regras de créditos das funcionalidades continuam a aplicar-se).",
"ai.whoPays": "Quem paga o modelo?",
2026-08-16 18:18:39 +02:00
"ai.mode.internal": "Plataforma (créditos / chave Descrybe)",
"ai.mode.popular": "A sua chave — fornecedor popular",
"ai.mode.custom": "A sua chave — endpoint personalizado",
"ai.useCompanyKey": "Usar esta chave da empresa para processamento, SEO com IA e campanhas com IA",
"ai.popular.title": "Fornecedor popular",
2026-08-16 18:18:39 +02:00
"ai.popular.desc": "Endpoints compatíveis com OpenAI. Anthropic via OpenRouter.",
"ai.field.provider": "Fornecedor",
"ai.field.model": "Modelo",
"ai.placeholder.modelId": "id do modelo",
"ai.baseUrlLabel": "URL base: {url}",
"ai.custom.title": "Endpoint personalizado",
"ai.custom.desc": "Introduza o URL base HTTPS do seu fornecedor de IA.",
"ai.field.baseUrl": "URL base",
"ai.apiKey.title": "Chave API",
2026-08-16 18:18:39 +02:00
"ai.apiKey.desc": "Deixe em branco para manter a chave existente. Segredos em bruto nunca são devolvidos — apenas um last4 mascarado.",
"ai.storedKey": "Chave guardada: {masked}",
"ai.field.apiKey": "Chave API",
2026-08-16 18:18:39 +02:00
"ai.placeholder.keepKey": "•••• deixe em branco para manter",
"ai.clearStoredKey": "Limpar chave API guardada",
"ai.saveProvider": "Guardar fornecedor",
2026-08-16 18:18:39 +02:00
"ai.testConnection": "Testar ligação",
"ai.prompts.title": "Modelos de prompt",
2026-08-16 18:18:39 +02:00
"ai.prompts.descBefore": "Personalize prompts de sistema e de utilizador para textos de produto, meta SEO e emails de campanha. Insira variáveis como",
"ai.prompts.descMid": "— são preenchidas em tempo de execução. A voz do kit de marca está disponível como",
"ai.prompts.descAfter": ".",
"ai.field.feature": "Funcionalidade",
"ai.badge.custom": "Personalizado",
2026-08-16 18:18:39 +02:00
"ai.badge.builtin": "Predefinição integrada",
"ai.badge.disabledDefault": "Desativado → a usar a predefinição",
"ai.useCustomPrompt": "Usar este prompt personalizado (desligado = predefinição integrada)",
"ai.insertVariableInto": "Inserir variável em",
"ai.insert.system": "Sistema",
"ai.insert.user": "Utilizador",
"ai.field.systemPrompt": "Prompt de sistema",
"ai.field.userPrompt": "Prompt de utilizador",
"ai.savePrompts": "Guardar prompts",
2026-08-16 18:18:39 +02:00
"ai.resetDefault": "Repor predefinição",
"ai.editBrandVoice": "Editar voz da marca",
2026-08-16 18:18:39 +02:00
"ai.flash.loadFailed": "Falha ao carregar as definições de IA",
"ai.flash.usingPlatform": "A usar a IA da plataforma (créditos / chave Descrybe quando configurados).",
"ai.flash.providerSaved": "Fornecedor de IA guardado. As chaves são encriptadas e nunca são mostradas novamente.",
"ai.flash.saveFailed": "Não foi possível guardar",
"ai.flash.savePromptsFailed": "Não foi possível guardar os prompts",
"ai.flash.resetFailed": "Não foi possível repor o prompt",
"ai.flash.connectionFailed": "Falha na ligação",
"ai.flash.testFailed": "Falha no teste",
2026-08-16 18:18:39 +02:00
"ai.action.changeSettings": "alterar as definições do fornecedor de IA",
"ai.action.changePrompts": "alterar os prompts de IA",
"ai.action.testProvider": "testar o fornecedor de IA",
"email.title": "Envio de email",
"email.description": "Resend ou SMTP para campanhas de marketing. Segredos encriptados em repouso.",
2026-08-16 18:18:39 +02:00
"email.adminOnly": "Apenas administradores da empresa podem alterar as definições do fornecedor de email. Pode ver a configuração atual.",
"email.crumb": "Integração de email",
"email.dryRunForced": "O dry-run está forçado ({reason}). Planos Free e EMAIL_DRY_RUN nunca enviam envios em massa reais.",
"email.dryRunPolicy": "política",
"email.badge.verified": "Verificado",
2026-08-16 18:18:39 +02:00
"email.badge.notVerified": "Não verificado",
"email.badge.canSendReal": "Pode enviar real",
"email.badge.realBlocked": "Envio real bloqueado",
2026-08-16 18:18:39 +02:00
"email.badge.lastTest": "Último teste: {status}",
"email.provider.title": "Fornecedor",
2026-08-16 18:18:39 +02:00
"email.provider.desc": "Configuração por empresa. O SMTP/Resend de ambiente da plataforma é apenas fallback quando faltam segredos.",
"email.field.provider": "Fornecedor",
"email.provider.resend": "Resend",
"email.provider.smtp": "SMTP",
"email.field.fromEmail": "Email do remetente",
2026-08-16 18:18:39 +02:00
"email.field.domain": "Domínio",
"email.field.from": "De",
"email.field.fromName": "Nome do remetente",
"email.field.replyTo": "Reply-To",
2026-08-16 18:18:39 +02:00
"email.resendKeySaved": "Chave API Resend (guardada — deixe em branco para manter)",
"email.resendKey": "Chave API Resend",
"email.field.smtpHost": "Host SMTP",
"email.field.port": "Porta",
"email.field.username": "Nome de utilizador",
"email.field.passwordSaved": "Palavra-passe (guardada)",
"email.field.password": "Palavra-passe",
2026-08-16 18:18:39 +02:00
"email.verifyDomain": "Verificar domínio",
"email.testGate.title": "Teste e controlo de envios",
2026-08-16 18:18:39 +02:00
"email.testGate.desc": "Os envios de teste verificam o endereço do remetente. Envios em massa reais exigem escrever “I understand”.",
"email.field.recipient": "Destinatário",
"email.sendTest": "Enviar teste",
2026-08-16 18:18:39 +02:00
"email.confirmBlast": "Confirmar envio em massa…",
"email.flash.loadFailed": "Falha ao carregar as definições de email",
"email.flash.saveFailed": "Não foi possível guardar",
"email.flash.verifyUpdated": "Verificação atualizada.",
"email.flash.verifyFailed": "Falha na verificação",
"email.flash.testFailed": "Falha no envio de teste",
2026-08-16 18:18:39 +02:00
"email.flash.blastDryRun": "Verificação de entrega registada em modo dry-run — nenhum email foi enviado.",
"email.flash.blastDone": "Verificação de entrega concluída: {sent} enviados, {failed} falhados.",
"email.flash.blastFailed": "Falha no envio em massa",
2026-08-16 18:18:39 +02:00
"email.blast.subject": "Verificação de entrega de email Descrybe",
"email.blast.body": "Esta é uma verificação de entrega a um único endereço da Descrybe para confirmar que a sua integração de email pode enviar. Destinatário: {recipient}",
"email.action.changeSettings": "alterar as definições do fornecedor de email",
"email.action.verifyDomain": "verificar o domínio de email",
"email.action.sendTest": "enviar email de teste",
"email.action.sendBlasts": "enviar envios em massa de email",
2026-08-16 18:18:39 +02:00
"seo.title": "Recomendações SEO",
"seo.description": "Pontuações de checklist para meta do catálogo, títulos, imagens e palavras-chave. O preenchimento por modelo é gratuito; a reescrita com IA é paga.",
"seo.upgradeTitle": "A reescrita com IA é uma funcionalidade paga",
"seo.upgradeMessage": "Planos Free ainda podem corrigir meta em falta com modelos baseados em regras. Faça upgrade ou adicione créditos para usar reescritas com IA.",
"seo.comparePlans": "Comparar planos",
"seo.openProducts": "Abrir produtos",
2026-08-16 18:18:39 +02:00
"seo.overallScore": "Pontuação SEO global",
"seo.overallScoreHint": "Média dos itens da checklist",
"seo.productsScanned": "Produtos analisados",
"seo.productsScannedHint": "Produtos processados na empresa",
"seo.categoriesScanned": "Categorias analisadas",
2026-08-16 18:18:39 +02:00
"seo.categoriesScannedHint": "Inclui verificações de fórmulas meta",
"seo.aiRewrite": "Reescrita com IA",
2026-08-16 18:18:39 +02:00
"seo.available": "Disponível",
"seo.gated": "Restrito",
"seo.templateFree": "O preenchimento por modelo continua gratuito em todos os planos",
"seo.checklist": "Checklist",
2026-08-16 18:18:39 +02:00
"seo.affectedFindings": "{affected} afetados · {count} resultados",
"seo.fixable": "Corrigível",
"seo.clearFilter": "Limpar filtro",
"seo.findings": "Resultados",
2026-08-16 18:18:39 +02:00
"seo.noFindings": "Sem resultados para este filtro — bom trabalho.",
"seo.col.issue": "Problema",
"seo.col.entity": "Entidade",
"seo.col.severity": "Gravidade",
2026-08-16 18:18:39 +02:00
"seo.col.actions": "Ações",
"seo.filling": "A preencher…",
"seo.templateFill": "Preenchimento por modelo",
2026-08-16 18:18:39 +02:00
"seo.aiTitleAllowed": "Reescrever com IA (usa créditos)",
"seo.aiTitleGated": "Requer plano pago ou créditos",
"seo.rewriting": "A reescrever…",
"seo.aiRewriteBtn": "Reescrita com IA",
"seo.viewProduct": "Ver produto",
2026-08-16 18:18:39 +02:00
"seo.flash.loadFailed": "Falha ao carregar recomendações SEO",
"seo.flash.aiPaid": "A reescrita com IA requer um plano pago ou créditos.",
"seo.flash.applyFailed": "Falha ao aplicar a correção",
"brand.title": "Kit de marca",
2026-08-16 18:18:39 +02:00
"brand.description": "Defina voz, diretrizes e cores para que títulos e descrições de produto se mantenham alinhados com a marca.",
"brand.loading": "A carregar kit de marca…",
"brand.adminOnly": "Apenas administradores da empresa podem editar o kit de marca. Pode ver a voz, as cores e o logótipo atuais.",
"brand.aiApplyFreeAdmin": "Pode editar o seu kit de marca no Free. A aplicação com IA (injetar a voz da marca nos prompts de enhance) desbloqueia a partir do Starter.",
"brand.aiApplyGated": "A aplicação com IA (injetar a voz da marca nos prompts de enhance) desbloqueia a partir do Starter.",
"brand.aiEnhanceUses": "O enhance com IA usará esta voz de marca ao processar produtos.",
"brand.comparePlans": "Comparar planos",
"brand.voice.title": "Voz e diretrizes",
2026-08-16 18:18:39 +02:00
"brand.voice.desc": "Tom, regras do/don’t e redação preferida",
"brand.field.voiceTone": "Voz / tom",
2026-08-16 18:18:39 +02:00
"brand.placeholder.voiceTone": "ex. Confiante, conciso, técnico mas acessível",
"brand.field.dos": "Fazer (um por linha)",
2026-08-16 18:18:39 +02:00
"brand.placeholder.dos": "Comece pelo benefício principal\nMantenha títulos com menos de 80 caracteres",
"brand.field.donts": "Não fazer (um por linha)",
"brand.placeholder.donts": "Sem MAIÚSCULAS\nEvite superlativos sem prova",
"brand.field.preferredTerms": "Termos preferidos (um por linha ou separados por vírgulas)",
"brand.placeholder.preferredTerms": "sem fios, premium, classe energética",
"brand.visual.title": "Identidade visual",
2026-08-16 18:18:39 +02:00
"brand.visual.desc": "Cores e logótipo usados em dicas e campanhas conscientes da marca",
"brand.field.primaryColor": "Cor primária",
"brand.field.secondaryColor": "Cor secundária",
"brand.field.logoImage": "Imagem do logótipo",
"brand.logoHint": "PNG, JPEG ou WebP até 2 MiB. Guardado nos uploads da sua empresa.",
"brand.uploading": "A carregar…",
"brand.uploadLogo": "Carregar logótipo",
"brand.clear": "Limpar",
2026-08-16 18:18:39 +02:00
"brand.field.logoUrl": "URL do logótipo",
"brand.placeholder.logoUrl": "https://… ou carregado /api/brand/logo/files/…",
"brand.logoAlt": "Pré-visualização do logótipo da marca",
"brand.tipsTitle": "Dicas de fórmula / pré-visualização",
"brand.saving": "A guardar…",
"brand.save": "Guardar kit de marca",
"brand.flash.loadFailed": "Falha ao carregar o kit de marca",
2026-08-16 18:18:39 +02:00
"structured.title": "Campos de descrição estruturada",
"structured.loading": "A carregar campos de descrição estruturada…",
"structured.backDashboard": "Voltar ao painel",
2026-08-16 18:18:39 +02:00
"structured.categoryFormulas": "Fórmulas de categoria",
"structured.exportFeeds": "Feeds de exportação",
"structured.intro": "Estes campos são criados automaticamente quando adiciona Export IDs às secções da fórmula de descrição. Podem ser usados nos seus feeds de exportação para incluir partes específicas das descrições de produto.",
"structured.addField": "Adicionar campo",
"structured.openCategories": "Abrir categorias",
2026-08-16 18:18:39 +02:00
"structured.tableCaption": "Estes campos estruturam partes das descrições de produto para exportação.",
"structured.col.fieldKey": "Chave do campo",
"structured.col.type": "Tipo",
"structured.col.created": "Criado",
2026-08-16 18:18:39 +02:00
"structured.col.actions": "Ações",
"structured.dialogTitle": "Adicionar campo de descrição estruturada",
"structured.fieldKeyLabel": "Chave do campo (obrigatória)",
"structured.fieldKeyPlaceholder": "ex., features, specifications",
"structured.fieldTypeLabel": "Tipo de campo",
"structured.type.text": "Texto",
2026-08-16 18:18:39 +02:00
"structured.type.number": "Número",
"structured.type.boolean": "Booleano",
"structured.type.list": "Lista",
"structured.adding": "A adicionar...",
2026-08-16 18:18:39 +02:00
"structured.flash.loadFailed": "Falha ao carregar campos de descrição estruturada",
"assistant.ariaLabel": "Assistente do sistema",
"assistant.title": "Assistente do sistema",
2026-08-16 18:18:39 +02:00
"assistant.subtitle": "Navegue, oriente e execute ações suportadas",
"assistant.resetAria": "Reiniciar conversa",
"assistant.resetTitle": "Reiniciar",
"assistant.closeAria": "Fechar assistente",
"assistant.messageLabel": "Mensagem",
2026-08-16 18:18:39 +02:00
"assistant.placeholder": "ex. adicionar URL de feed, chaves API, atributos, processamento…",
"assistant.sendAria": "Enviar",
"site.bookDemo": "Agendar uma demo",
"site.demoShort": "Demo",
"site.allRightsReserved": "Todos os direitos reservados.",
2026-08-16 18:18:39 +02:00
"site.cookiePolicy": "Política de cookies",
"site.cookieSettings": "Definições de cookies",
"consent.title": "Cookies e análise",
"consent.description": "Usamos cookies necessários para o Descrybe funcionar. Cookies opcionais de análise e marketing ajudam-nos a compreender a utilização e medir campanhas. Pode alterar a escolha a qualquer momento.",
"consent.acceptAll": "Aceitar todos",
2026-08-16 18:18:39 +02:00
"consent.rejectNonEssential": "Rejeitar não essenciais",
"consent.customize": "Personalizar",
2026-08-16 18:18:39 +02:00
"consent.save": "Guardar preferências",
"consent.necessary": "Necessários",
"consent.necessaryDesc": "Obrigatórios para início de sessão, segurança (CSRF), tema, idioma e lembrar esta escolha.",
"consent.alwaysOn": "Sempre ativos",
2026-08-16 18:18:39 +02:00
"consent.analytics": "Análise",
"consent.analyticsDesc": "Ajuda-nos a compreender como o produto é usado (Google Analytics via GTM).",
"consent.marketing": "Marketing",
2026-08-16 18:18:39 +02:00
"consent.marketingDesc": "Para medição publicitária e personalização quando há tags de anúncios no GTM.",
"consent.policyLink": "Ler a Política de cookies",
"seo.cookies.title": "Política de cookies | Descrybe",
"seo.cookies.description": "Como o Descrybe usa cookies necessários, de análise e marketing, incluindo GTM e GA4, e como alterar o consentimento.",
"legal.cookies.title": "Política de cookies",
"legal.cookies.intro.h": "Visão geral",
"legal.cookies.intro.p1": "Esta Política de cookies explica como o Descrybe usa cookies e tecnologias semelhantes no site e na aplicação. Leia em conjunto com a Política de privacidade.",
"legal.cookies.intro.p2": "Quando exigido, pedimos consentimento antes de ativar cookies de análise ou marketing. Cookies necessários prestam o serviço de forma segura e não requerem consentimento.",
"legal.cookies.types.h": "Categorias de cookies",
2026-08-16 18:18:39 +02:00
"legal.cookies.necessary.h": "Necessários",
"legal.cookies.necessary.p": "Mantêm a sessão, protegem formulários com CSRF, guardam tema e idioma e lembram a escolha de cookies. Sem eles o produto não funciona corretamente.",
"legal.cookies.analytics.h": "Análise",
"legal.cookies.analytics.p": "Se permitir análise, carregamos tags GTM que podem definir cookies GA4 para medir páginas e eventos. Os eventos ficam bloqueados até conceder analytics_storage.",
"legal.cookies.marketing.h": "Marketing",
2026-08-16 18:18:39 +02:00
"legal.cookies.marketing.p": "Se permitir marketing, tags publicitárias no GTM podem usar armazenamento de anúncios e sinais relacionados para medição e personalização.",
"legal.cookies.gtm.h": "Google Tag Manager e GA4",
2026-08-16 18:18:39 +02:00
"legal.cookies.gtm.p": "Quando configurado, o Descrybe carrega um contentor GTM. O GA4 é configurado nesse contentor. O Consent Mode v2 nega por predefinição o armazenamento de análise e anúncios até aceitar as categorias.",
"legal.cookies.third.h": "Terceiros",
2026-08-16 18:18:39 +02:00
"legal.cookies.third.p": "A Google (Tag Manager / Analytics) pode processar dados técnicos (URL, dispositivo/browser, nomes de eventos) com consentimento. Não enviamos intencionalmente palavras-passe, chaves API ou contactos em eventos de análise.",
"legal.cookies.manage.h": "Como alterar o consentimento",
2026-08-16 18:18:39 +02:00
"legal.cookies.manage.p": "Use Definições de cookies no rodapé (ou o botão abaixo) para reabrir o banner. Também pode limpar os dados do site no browser.",
"site.privacyPolicy": "Política de privacidade",
"site.termsOfService": "Termos de serviço",
"site.legalNav": "Legal",
"site.footer.aria": "Site",
2026-08-16 18:18:39 +02:00
"site.footer.description": "A Descrybe transforma feeds de fornecedores em catálogos de produto limpos e prontos para canais — mapeie campos, enriqueça atributos e textos, depois exporte ou sincronize com o WooCommerce.",
"site.footer.rightsLine": "© {year} {name}. Todos os direitos reservados.",
"site.footer.navTitle": "Navegação",
"site.footer.platform": "Plataforma",
2026-08-16 18:18:39 +02:00
"site.footer.solutions": "Soluções",
"site.footer.contact": "Contacte-nos",
"home.hero.tagline": "Dados de produto para equipas de ecommerce",
2026-08-16 18:18:39 +02:00
"home.hero.title": "De feeds de fornecedores a páginas de produto",
"home.hero.lead": "Ligue feeds de fornecedores, mapeie-os para as suas categorias, preencha atributos obrigatórios e escreva títulos e descrições segundo as suas regras — depois exporte ou sincronize com a sua loja.",
"home.hero.learnMore": "Saber mais",
"home.hero.apply": "Pedir acesso",
"home.hero.supportedBy": "Com o apoio de",
"home.hero.msAlt": "Microsoft for Startups",
2026-08-16 18:18:39 +02:00
"home.image.previewAlt": "Pré-visualização da plataforma Descrybe: do feed à ficha de produto",
"home.how.title": "Veja como a Descrybe poupa tempo a colocar produtos no mercado",
2026-08-16 18:18:39 +02:00
"home.how.lead": "Importe dados desorganizados de fornecedores uma só vez. A Descrybe ajuda a categorizá-los, preencher atributos, redigir fichas e enviar produtos prontos para os seus canais.",
"home.how.apply": "Pedir acesso",
"home.how.step1.title": "Importe a sua taxonomia",
2026-08-16 18:18:39 +02:00
"home.how.step1.desc": "Configure as categorias e atributos que a sua loja já usa",
"home.how.step1.f1": "Defina atributos obrigatórios por categoria",
"home.how.step1.f2": "Defina fórmulas de título por categoria",
"home.how.step1.f3": "Defina modelos de descrição e snippet de pesquisa",
"home.how.step2.title": "Importe dados de fornecedores",
"home.how.step2.desc": "Ligue um URL de feed ou carregue um ficheiro de produtos",
"home.how.step2.f1": "Importe a partir de fontes CSV, XML ou API",
2026-08-16 18:18:39 +02:00
"home.how.step2.f2": "Agende importações automáticas dos seus fornecedores",
"home.how.step2.f3": "Mapeie campos de origem com uma interface simples de arrastar e largar",
2026-08-16 18:18:39 +02:00
"home.how.step3.title": "Transforme e enriqueça",
"home.how.step3.desc": "Escolha os produtos a processar e deixe a Descrybe:",
"home.how.step3.f1": "Atribuir as categorias certas",
2026-08-16 18:18:39 +02:00
"home.how.step3.f2": "Preencher os atributos de produto obrigatórios",
"home.how.step3.f3": "Criar títulos e descrições claros e adequados à pesquisa",
"home.how.step4.title": "Exporte para canais",
"home.how.step4.desc": "Envie dados de produto prontos para onde vende",
2026-08-16 18:18:39 +02:00
"home.how.step4.f1": "Gere feeds de produto específicos por canal",
"home.how.step4.f2": "Mantenha o controlo total dos campos que exporta",
"home.how.step4.f3": "Mantenha-se atualizado quando os dados do fornecedor mudarem",
"home.benefits.title": "Tudo o que precisa para dados de produto mais limpos",
2026-08-16 18:18:39 +02:00
"home.benefits.lead": "Da importação do feed às fichas prontas para o canal — sem reconstruir cada ficheiro à mão.",
"home.benefits.shield.title": "Detete fichas incompletas a tempo",
2026-08-16 18:18:39 +02:00
"home.benefits.shield.desc": "Verifique os dados face às regras de categoria para corrigir atributos em falta e textos fracos antes de publicar.",
"home.benefits.chart.title": "Fichas mais claras, conversão mais forte",
"home.benefits.chart.desc": "Títulos e descrições que destacam o que importa aos compradores — benefícios, especificações e termos de pesquisa do seu catálogo.",
"home.benefits.database.title": "Uma estrutura de produto coerente",
2026-08-16 18:18:39 +02:00
"home.benefits.database.desc": "Mantenha a mesma árvore de categorias e forma de atributos em exportações e canais para que os clientes encontrem produtos da mesma forma em todo o lado.",
"home.benefits.search.title": "Conteúdo de produto pensado para a pesquisa",
"home.benefits.search.desc": "Escreva títulos, descrições e meta snippets mais fáceis de compreender para compradores e motores de pesquisa.",
"home.benefits.cost.title": "Menos introdução manual de dados",
"home.benefits.cost.desc": "Automatize o mapeamento, o preenchimento de atributos e os textos das fichas para a equipa se focar no merchandising — não em limpar folhas de cálculo.",
"home.benefits.scale.title": "Pronto para cada canal de venda",
2026-08-16 18:18:39 +02:00
"home.benefits.scale.desc": "Adapte feeds de exportação e a sync WooCommerce aos formatos que cada canal espera, sem reconstruir o catálogo à mão.",
"home.cta.titleLead": "Coloque produtos no mercado ",
"home.cta.titleHighlight": "mais depressa",
2026-08-16 18:18:39 +02:00
"home.cta.description": "Deixe de reconstruir dados de produto em cada ficheiro de fornecedor. Mapeie uma vez, enriqueça com as suas regras e publique fichas prontas a vender.",
"home.cta.f1": "Demo personalizada",
"home.cta.f2": "Consulta com especialistas",
2026-08-16 18:18:39 +02:00
"home.cta.f3": "Próximos passos claros",
"home.cta.apply": "Pedir acesso",
2026-08-16 18:18:39 +02:00
"home.cta.imageAlt": "Páginas de produto Descrybe",
"home.product.eyebrow": "O que a Descrybe faz",
2026-08-16 18:18:39 +02:00
"home.product.title": "Feeds de fornecedor à entrada. Fichas prontas à saída — export, WooCommerce ou API.",
"home.product.description": "A Descrybe ajuda equipas de ecommerce a transformar feeds CSV e XML de fornecedores em catálogos limpos. Mapeie campos para as suas categorias, enriqueça atributos e textos e envie dados por feeds de exportação, sync WooCommerce ou a API pública.",
"home.product.pipelineAria": "Pipeline de produto",
"home.product.p1.label": "Feeds de entrada",
"home.product.p1.detail": "CSV / XML a partir de URLs de fornecedor",
"home.product.p2.label": "Mapear",
"home.product.p2.detail": "Associe colunas aos seus campos",
"home.product.p3.label": "Enriquecer",
2026-08-16 18:18:39 +02:00
"home.product.p3.detail": "Categorias, atributos, títulos",
"home.product.p4.label": "Publicar",
2026-08-16 18:18:39 +02:00
"home.product.p4.detail": "Export · Woo · API",
"pricing.section.badge": "Capacidade de SKU + créditos de IA",
"pricing.section.title": "Comece grátis. Escala quando o catálogo crescer.",
"pricing.section.lead": "O Free inclui mapeamento de feeds, limpeza básica de produto e rótulos energéticos da UE (EPREL) até 100 SKUs (sem créditos de IA). Os planos pagos adicionam títulos e descrições com IA, mais capacidade e opções de exportação — Starter, Growth, Business, ou fale com as vendas para Enterprise.",
"pricing.section.billingPeriod": "Período de faturação",
"pricing.section.monthly": "Mensal",
"pricing.section.yearly": "Anual",
"pricing.section.savePercent": "Poupe 20%",
2026-08-16 18:18:39 +02:00
"pricing.section.publicBefore": "Planos públicos: Free, Starter, Growth, Business e Enterprise. Crie uma conta Free e depois faça upgrade em",
"pricing.section.publicOr": "ou",
"pricing.section.publicAfter": "via Stripe Checkout. O Enterprise continua a ser gerido pelas vendas.",
"pricing.section.plansLink": "Planos",
2026-08-16 18:18:39 +02:00
"pricing.section.billingLink": "Faturação",
"pricing.section.capabilitiesTitle": "Para que está pensado cada plano",
"pricing.section.capabilitiesLead": "Importe feeds, enriqueça o catálogo e depois exporte ou sincronize com o WooCommerce",
"pricing.section.faqTitle": "Perguntas frequentes",
"pricing.section.readyTitle": "Pronto para mapear o seu primeiro feed?",
2026-08-16 18:18:39 +02:00
"pricing.section.readyLead": "Crie uma conta Free — sem cartão. Já tem uma? Abra a app ou compare planos.",
"pricing.section.contactSales": "Contactar vendas",
2026-08-16 18:18:39 +02:00
"pricing.cap.feeds": "De feeds a catálogo",
"pricing.cap.feeds.f1": "Feeds de fornecedor CSV / XML / URL",
2026-08-16 18:18:39 +02:00
"pricing.cap.feeds.f2": "Mapeamento e validação de campos",
"pricing.cap.feeds.f3": "Fusão multi-fornecedor",
"pricing.cap.feeds.f4": "Sincronização agendada",
"pricing.cap.feeds.f5": "Transformações com base na categoria",
"pricing.cap.processing": "Processamento e IA",
"pricing.cap.processing.f1": "Limpeza de dados e preenchimento de atributos (todos os planos)",
2026-08-16 18:18:39 +02:00
"pricing.cap.processing.f2": "Títulos e descrições com IA (planos pagos)",
"pricing.cap.processing.f3": "Rótulos energéticos UE / EPREL (todos os planos)",
"pricing.cap.processing.f4": "Fórmulas, voz de marca, variáveis",
"pricing.cap.processing.f5": "Créditos geridos ou a sua própria chave de IA",
"pricing.cap.export": "Exportação e canais",
"pricing.cap.export.f1": "Feeds de exportação XML / CSV",
"pricing.cap.export.f2": "Sync WooCommerce / Shopify",
"pricing.cap.export.f3": "API completa",
2026-08-16 18:18:39 +02:00
"pricing.cap.export.f4": "Formatos específicos por canal",
"pricing.cap.export.f5": "Atualizações em massa",
"pricing.cap.limits": "Limites e controlo",
"pricing.cap.limits.f1": "Limites de SKU (produtos)",
2026-08-16 18:18:39 +02:00
"pricing.cap.limits.f2": "Pacotes mensais de créditos de IA",
"pricing.cap.limits.f3": "Funções e convites de equipa",
"pricing.cap.limits.f4": "Opções de SLA Enterprise",
"pricing.faq.credits.q": "O que são créditos de IA?",
"pricing.faq.credits.a": "Os créditos de IA pagam passos como gerar títulos e descrições. O Free inclui 0 créditos de IA — ainda pode mapear feeds e limpar dados. Pacotes mensais pagos: Starter 150, Plus 500, Growth 1.200, Business 4.000, Scale 8.000. O Enterprise inclui um grande pacote gerido (e a sua própria chave). A partir do Growth, pode opcionalmente usar a sua chave em vez dos créditos geridos.",
"pricing.faq.packs.q": "Can I buy extra AI credits?",
"pricing.faq.packs.a": "Yes. One-time packs: Starter $19 / 500 credits, Growth $59 / 2,000, Catalog $199 / 10,000, Scale $599 / 40,000. Buy from Billing after you have a paid plan (or Free with leftover trial credits). Packs do not change your SKU or feed limits.",
2026-08-16 18:18:39 +02:00
"pricing.faq.limits.q": "O que acontece se atingir o limite de produtos ou créditos?",
"pricing.faq.limits.a": "Avisamos quando se aproximar. Quando atingir o teto de produtos ou ficar sem créditos de IA, os trabalhos que precisam dessa capacidade pausam até libertar espaço, esperar o ciclo seguinte ou fazer upgrade.",
"pricing.faq.change.q": "Posso fazer upgrade ou downgrade?",
2026-08-16 18:18:39 +02:00
"pricing.faq.change.a": "Sim. Comece no Free e depois passe para Starter, Plus, Growth, Business ou Scale em Planos ou Faturação (Stripe Checkout). O Enterprise é sempre gerido pelas vendas.",
"pricing.faq.free.q": "O que inclui o Free?",
2026-08-16 18:18:39 +02:00
"pricing.faq.free.a": "Free para sempre: 50 produtos, um feed, limpeza de dados e preenchimento de atributos, rótulos energéticos UE (EPREL — dados públicos, sem créditos), mais uma exportação manual — com 0 créditos de IA. Sem cartão. Faça upgrade quando precisar de títulos e descrições com IA ou de mais capacidade.",
"pricing.faq.why.q": "Porque não pagar por produto como as ferramentas só de conteúdo?",
"pricing.faq.why.a": "A Descrybe cobre o caminho completo do feed de fornecedor ao catálogo até ao WooCommerce ou exportação — não só textos com IA. Paga pela capacidade da plataforma (produtos e feeds); a IA é uma camada de utilização por cima.",
"pricing.faq.annual.q": "Como funciona a faturação anual?",
"pricing.faq.annual.a": "A faturação anual é cerca de 20% menos do que o preço mensal. Comece grátis e escolha anual no Checkout ao fazer upgrade (ou contacte as vendas).",
"pricing.calc.badge": "Plan calculator",
"pricing.calc.title": "Find the right plan",
"pricing.calc.lead": "Enter feeds, catalog size, and how many products you want to enhance with AI (count each language pass).",
"pricing.calc.feeds": "Feed sources",
"pricing.calc.feedsHint": "Supplier / import feeds you need to connect",
"pricing.calc.skus": "Catalog products (SKUs)",
"pricing.calc.skusHint": "Total products you will store and process",
"pricing.calc.aiVolume": "AI process volume",
2026-08-16 18:18:39 +02:00
"pricing.calc.aiHint": "Roughly products × languages you want to enhance per month",
"pricing.calc.recommendedLabel": "Recommended",
"pricing.calc.budgetLabel": "Budget option",
"pricing.calc.coversCredits": "Needs about {count} AI credits / month",
"pricing.calc.aiIncluded": "Included monthly credits cover this AI volume",
2026-08-16 18:18:39 +02:00
"pricing.calc.aiNeedsPacks": "Add {count}× {pack} (~{usd}) for the AI shortfall",
"pricing.calc.orYearly": "or ~{amount}/mo yearly",
"pricing.calc.budgetNote": "Lower list price with yearly discount and/or credit packs when that still fits.",
"pricing.calc.noBudget": "The recommended plan is already the leanest fit for these inputs.",
"pricing.calc.enterpriseTitle": "Sounds like Enterprise",
"pricing.calc.enterpriseBody": "Your feeds or catalog size exceed self-serve caps. Talk to sales for unlimited capacity and a managed AI grant or BYOK.",
"pricing.calc.ctaPlan": "Choose {name}",
"pricing.calc.disclaimer": "Estimates use list prices and ~2 credits per AI product enhance. Checkout prices come from Stripe. A1 and other client deals stay admin-only.",
"pricing.card.mostPopular": "Mais popular",
"pricing.card.custom": "Personalizado",
"pricing.card.forever": "para sempre",
2026-08-16 18:18:39 +02:00
"pricing.card.perMonth": "mês",
"pricing.card.perYear": "ano",
2026-08-16 18:18:39 +02:00
"pricing.card.savePerMonth": "Poupe ${amount}/mês",
"pricing.card.discountBadge": "-20%",
"pricing.card.unlimitedSkus": "SKUs ilimitados",
"pricing.card.oneMSkus": "Mais de 1M de SKUs",
2026-08-16 18:18:39 +02:00
"pricing.card.upToSkus": "Até {count} SKUs",
"pricing.card.unlimitedAi": "Créditos de IA ilimitados",
"pricing.card.zeroCredits": "0 créditos de IA / mês",
"pricing.card.creditsPerMonth": "{count} créditos de IA / mês",
"pricing.card.showLess": "Mostrar menos",
"pricing.card.showMoreFeature": "Mostrar mais {count} funcionalidade",
"pricing.card.showMoreFeatures": "Mostrar mais {count} funcionalidades",
"pricing.card.upgradeTo": "Fazer upgrade para {name}",
2026-08-16 18:18:39 +02:00
"pricing.plan.free.description": "Mapeie um feed de amostra e limpe dados de produto — sem cartão",
"pricing.plan.starter.description": "Catálogos pequenos que precisam de títulos e descrições com IA",
"pricing.plan.plus.description": "Mais produtos, feeds e IA para catálogos em crescimento",
"pricing.plan.growth.description": "Feeds multi-fornecedor para lojas e exportações shopping",
"pricing.plan.business.description": "Catálogos mid-market com BYOK",
"pricing.plan.scale.description": "Catálogos à escala de distribuidor com suporte prioritário",
"pricing.plan.enterprise.description": "Capacidade ilimitada, SLA e uma equipa de conta dedicada",
"pricing.feature.credits100": "100 AI credits / month (~50% catalog cover)",
"pricing.feature.credits100starter": "100 AI credits / month (~50% catalog cover)",
"pricing.feature.credits400": "400 AI credits / month (~50% catalog cover)",
"pricing.feature.credits600": "600 AI credits / month (~10% credit base)",
"pricing.feature.credits1800": "1,800 AI credits / month (~6% credit base)",
"pricing.feature.credits2700": "2,700 AI credits / month (~15% credit base)",
"pricing.feature.credits5000base": "5,000 AI credits / month (~10% credit base)",
"pricing.feature.credits7000": "7,000 AI credits / month (~20% credit base)",
"pricing.feature.credits12000": "12,000 AI credits / month (~50% catalog cover)",
"pricing.feature.credits16000": "16,000 AI credits / month (~16% credit base)",
"pricing.feature.upTo1mSkus": "Up to 1,000,000 SKUs",
"pricing.feature.upTo15kSkus": "Up to 15,000 SKUs",
"pricing.feature.credits15000": "15,000 AI credits / month (~75% catalog cover)",
"pricing.feature.credits60000": "60,000 AI credits / month (~75% catalog cover)",
2026-08-16 18:18:39 +02:00
"pricing.feature.upTo50Skus": "Até 50 SKUs",
"pricing.feature.upTo100Skus": "Up to 100 SKUs",
"pricing.feature.upTo400Skus": "Up to 400 SKUs",
"pricing.feature.upTo1200Skus": "Up to 1,200 SKUs",
"pricing.feature.upTo4kSkus": "Up to 4,000 SKUs",
"pricing.feature.upTo12kSkus": "Up to 12,000 SKUs",
"pricing.feature.oneFeedSource": "1 fonte de feed",
"pricing.feature.twoFeedSources": "2 feed sources",
"pricing.feature.threeFeedSources": "3 fontes de feed",
"pricing.feature.fourFeedSources": "4 feed sources",
"pricing.feature.sixFeedSources": "6 feed sources",
"pricing.feature.twelveFeedSources": "12 feed sources",
"pricing.feature.twentyFiveFeedSources": "25 feed sources",
"pricing.feature.cleanData": "Limpe dados, analise specs e preencha campos",
2026-08-16 18:18:39 +02:00
"pricing.feature.eprel": "Rótulos energéticos UE (EPREL)",
"pricing.feature.zeroCredits": "0 créditos de IA / mês",
"pricing.feature.oneManualExport": "1 feed de exportação manual",
"pricing.feature.twoExports": "2 export feeds",
"pricing.feature.fourExports": "4 export feeds",
2026-08-16 18:18:39 +02:00
"pricing.feature.wooTestOnly": "Apenas teste de ligação WooCommerce",
"pricing.feature.upTo2Seats": "Até 2 lugares",
"pricing.feature.aiTitles": "Títulos e descrições com IA",
"pricing.feature.liveStoreSync": "Sync em direto com a loja",
2026-08-16 18:18:39 +02:00
"pricing.feature.apiAccess": "Acesso à API",
"pricing.feature.byok": "Traga a sua própria chave de IA",
"pricing.feature.upTo500Skus": "Até 500 SKUs",
"pricing.feature.upTo1000Skus": "Up to 1,000 SKUs",
"pricing.feature.fiveFeedSources": "5 feed sources",
"pricing.feature.fiveExports": "5 export feeds",
"pricing.feature.credits250": "250 AI credits / month (~25% catalog cover)",
"pricing.feature.credits1000": "1,000 AI credits / month (~50% catalog cover)",
"pricing.feature.credits1000full": "1,000 AI credits / month (full primary-language catalog)",
"pricing.feature.credits10000full": "10,000 AI credits / month (full primary-language catalog)",
"pricing.feature.credits50000full": "50,000 AI credits / month (full primary-language catalog)",
"pricing.feature.credits100000": "100,000 AI credits / month (full primary-language catalog)",
"pricing.feature.credits225000": "225,000 AI credits / month (~75% catalog cover)",
"pricing.feature.credits12500": "12,500 AI credits / month (~25% catalog cover)",
"pricing.feature.credits30000": "30,000 AI credits / month (~20% catalog cover)",
"pricing.feature.upTo75kSkus": "Up to 75,000 SKUs",
2026-08-16 18:18:39 +02:00
"pricing.feature.threeExports": "3 feeds de exportação",
"pricing.feature.sixExports": "6 export feeds",
"pricing.feature.tenExports": "10 export feeds",
"pricing.feature.fullWooSync": "Sync completa WooCommerce",
2026-08-16 18:18:39 +02:00
"pricing.feature.readApi": "Acesso de leitura à API",
"pricing.feature.emailSupport": "Suporte por email",
"pricing.feature.creditPacks": "Buy extra AI credit packs",
2026-08-16 18:18:39 +02:00
"pricing.feature.upTo2500Skus": "Até 2.500 SKUs",
"pricing.feature.upTo1500Skus": "Up to 1,500 SKUs",
"pricing.feature.upTo3500Skus": "Up to 3,500 SKUs",
"pricing.feature.upTo9500Skus": "Up to 9,500 SKUs",
"pricing.feature.upTo18kSkus": "Up to 18,000 SKUs",
"pricing.feature.upTo55kSkus": "Up to 55,000 SKUs",
"pricing.feature.upTo5000Skus": "Up to 5,000 SKUs",
"pricing.feature.eightFeedSources": "8 fontes de feed",
2026-08-16 18:18:39 +02:00
"pricing.feature.credits500": "500 créditos de IA / mês",
"pricing.feature.credits1250": "1,250 AI credits / month (~25% catalog cover)",
"pricing.feature.credits5000": "5,000 AI credits / month (~25% catalog cover)",
2026-08-16 18:18:39 +02:00
"pricing.feature.eightExports": "8 feeds de exportação",
"pricing.feature.fifteenExports": "15 export feeds",
"pricing.feature.wooShopifySync": "Sync completa WooCommerce + Shopify",
2026-08-16 18:18:39 +02:00
"pricing.feature.upTo10kSkus": "Até 10.000 SKUs",
"pricing.feature.upTo25kSkus": "Up to 25,000 SKUs",
"pricing.feature.fifteenFeedSources": "15 fontes de feed",
"pricing.feature.tenFeedSources": "10 feed sources",
"pricing.feature.twentyFeedSources": "20 feed sources",
"pricing.feature.thirtyFeedSources": "30 feed sources",
2026-08-16 18:18:39 +02:00
"pricing.feature.credits1200": "1.200 créditos de IA / mês",
"pricing.feature.credits10000": "10,000 AI credits / month (~50% catalog cover)",
"pricing.feature.credits25000": "25,000 AI credits / month (~50% catalog cover)",
2026-08-16 18:18:39 +02:00
"pricing.feature.twentyExports": "20 feeds de exportação",
"pricing.feature.fortyExports": "40 export feeds",
2026-08-16 18:18:39 +02:00
"pricing.feature.fullFormulas": "Fórmulas e variáveis completas",
"pricing.feature.fullApi": "Acesso completo à API",
"pricing.feature.byokAddon": "Add-on bring-your-own-key",
"pricing.feature.emailSupport24h": "Suporte por email (24h)",
2026-08-16 18:18:39 +02:00
"pricing.feature.upTo40kSkus": "Até 40.000 SKUs",
"pricing.feature.upTo50kSkus": "Up to 50,000 SKUs",
"pricing.feature.fortyFeedSources": "40 fontes de feed",
"pricing.feature.fiftyFeedSources": "50 feed sources",
2026-08-16 18:18:39 +02:00
"pricing.feature.credits4000": "4.000 créditos de IA / mês",
"pricing.feature.credits40000": "40,000 AI credits / month (~50% catalog cover)",
"pricing.feature.credits50000half": "50,000 AI credits / month (~50% catalog cover)",
2026-08-16 18:18:39 +02:00
"pricing.feature.unlimitedExports": "Feeds de exportação ilimitados",
"pricing.feature.fullApiWebhooks": "API completa",
2026-08-16 18:18:39 +02:00
"pricing.feature.byokIncluded": "A sua chave de IA incluída",
"pricing.feature.priorityEmail": "Suporte prioritário por email",
"pricing.feature.upTo100kSkus": "Até 100.000 SKUs",
"pricing.feature.upTo150kSkus": "Up to 150,000 SKUs",
"pricing.feature.hundredFeedSources": "100 fontes de feed",
"pricing.feature.hundredFiftyFeedSources": "150 feed sources",
2026-08-16 18:18:39 +02:00
"pricing.feature.credits8000": "8.000 créditos de IA / mês",
"pricing.feature.credits50000": "50,000 AI credits / month (~25% catalog cover)",
"pricing.feature.credits120000": "120,000 AI credits / month (~40% catalog cover)",
2026-08-16 18:18:39 +02:00
"pricing.feature.prioritySlack": "Suporte prioritário + Slack",
"pricing.feature.unlimitedSkus": "SKUs ilimitados",
"pricing.feature.unlimitedFeeds": "Fontes de feed ilimitadas",
2026-08-16 18:18:39 +02:00
"pricing.feature.unlimitedAiOwnKey": "Créditos de IA ilimitados / chave própria",
"pricing.feature.ssoWebhooksAm": "SSO, gestor de conta dedicado",
2026-08-16 18:18:39 +02:00
"pricing.feature.customIntegrations": "Integrações à medida",
"pricing.feature.slaPriority": "SLA e suporte prioritário",
"pricing.pack.tiny.name": "Nano pack",
2026-08-16 18:18:39 +02:00
"pricing.pack.tiny.desc": "Smoke tests / tiny fixes (25 credits ≈ 12 AI products)",
"pricing.pack.small.name": "Starter pack",
"pricing.pack.small.desc": "Extra AI for fixes and tests (~250 products)",
"pricing.pack.medium.name": "Growth pack",
"pricing.pack.medium.desc": "Keep enhancing after the monthly plan allowance (~1,000 products)",
"pricing.pack.large.name": "Catalog pack",
"pricing.pack.large.desc": "Big top-up for large catalogs and re-runs (~5,000 products)",
"pricing.pack.xl.name": "Scale pack",
"pricing.pack.xl.desc": "Heavy usage / agency bursts (~20,000 products)",
"pricing.pack.xxl.name": "Business pack",
2026-08-16 18:18:39 +02:00
"pricing.pack.xxl.desc": "Large multi-language buffer (3,000 credits ≈ 1,500 AI products)",
"pricing.pack.mega.name": "Scale pack",
2026-08-16 18:18:39 +02:00
"pricing.pack.mega.desc": "Distributor / agency burst (8,000 credits ≈ 4,000 AI products)",
"pricing.section.faqDescription": "Respostas diretas sobre planos, créditos e o que o Free inclui.",
"billing.buyCreditPacks": "Buy AI credit packs",
2026-08-16 18:18:39 +02:00
"billing.buyCreditPacksHint": "Plans cover ~75% of your SKU cap with AI. Top up anytime for the rest, fixes, and tests — without changing your plan.",
"billing.packCredits": "{credits} créditos",
"billing.packApproxProducts": "~{count} AI products",
"billing.buyPack": "Buy",
2026-08-16 18:18:39 +02:00
"billing.checkoutCompletePack": "Credit pack purchased — {credits} AI credits added.",
"billing.packCheckoutFailed": "Could not start credit pack checkout.",
"empty.default.noItems": "Nenhum item encontrado.",
"settings.tabLockedHint": "Not on your plan",
"stores.connectorLocked": "Not on your plan",
"stores.connectorUpgrade": "Upgrade to unlock",
2026-08-16 18:18:39 +02:00
"plan.upgrade.title": "Esta funcionalidade não está no seu plano",
"plan.upgrade.message": "Faça upgrade para desbloquear esta parte do Descrybe.",
"plan.upgrade.defaultMessage": "O seu plano atual não inclui esta parte do Descrybe. Faça upgrade para a desbloquear, ou peça a um administrador da empresa se não puder alterar a faturação.",
"plan.upgrade.sectionOff.title": "Esta funcionalidade está temporariamente indisponível",
"plan.upgrade.sectionOff.message": "Esta parte do Descrybe está desativada na plataforma neste momento. Não é um problema de upgrade — tente mais tarde ou contacte o suporte.",
"plan.upgrade.sectionOff.cta": "Voltar ao painel",
2026-08-16 18:18:39 +02:00
"plan.upgrade.stores.message": "Os conectores WooCommerce e Shopify precisam de um plano que inclua Lojas. Faça upgrade para ligar essas lojas — ou continue com feeds e a API no plano atual.",
"plan.upgrade.stillWorks.title": "O que ainda funciona no seu plano",
"plan.upgrade.stillWorks.feeds.label": "Feeds de entrada",
2026-08-16 18:18:39 +02:00
"plan.upgrade.stillWorks.feeds.description": "Adicione URLs CSV ou XML e carregamentos de ficheiros para sincronizar catálogos sem conectores de loja.",
"plan.upgrade.stillWorks.export.label": "Feeds de exportação",
"plan.upgrade.stillWorks.export.description": "Gere feeds de saída para canais de compras e parceiros.",
"plan.upgrade.stillWorks.processing.label": "Tarefas em segundo plano",
2026-08-16 18:18:39 +02:00
"plan.upgrade.stillWorks.processing.description": "Monitorize trabalhos de IA e catálogo em Processamento — disponíveis no seu plano mesmo sem conectores de loja.",
"plan.upgrade.stillWorks.api.label": "Chaves API",
2026-08-16 18:18:39 +02:00
"plan.upgrade.stillWorks.api.description": "Crie uma chave em Definições para usar /api/v1 — o segredo só é mostrado uma vez.",
"plan.upgrade.stillWorks.docs.label": "Docs da API",
2026-08-16 18:18:39 +02:00
"plan.upgrade.stillWorks.docs.description": "Leia a visão geral da API e integre sem WooCommerce nem Shopify.",
"plan.upgrade.feature.settings.api_keys": "As chaves API precisam de um plano pago",
2026-08-16 18:18:39 +02:00
"plan.upgrade.feature.catalog.products.process_ai_titles": "Títulos com IA são uma funcionalidade paga",
"plan.upgrade.feature.catalog.products.process_ai_descriptions": "Descrições com IA são uma funcionalidade paga",
"plan.upgrade.feature.marketing.campaigns.generate_ai": "A IA de campanhas precisa de um plano pago",
"plan.upgrade.feature.marketing.campaigns.send": "O envio real de campanhas precisa de um plano pago",
"plan.upgrade.feature.marketing.brand_ai_apply": "A voz da marca na IA precisa de um plano pago",
"plan.upgrade.feature.marketing.seo.ai_rewrite": "A reescrita SEO com IA precisa de um plano pago",
2026-08-16 18:18:39 +02:00
"plan.upgrade.feature.integrations.ai.byok": "Trazer a sua própria chave de IA começa no Growth",
"plan.upgrade.feature.capability.byok": "Trazer a sua própria chave de IA começa no Growth",
"plan.upgrade.feature.marketing.campaigns": "As campanhas não estão no seu plano",
"plan.upgrade.feature.marketing.content_calendar": "O calendário de conteúdos não está no seu plano",
"plan.upgrade.feature.marketing.seo": "As ferramentas SEO não estão no seu plano",
"plan.upgrade.feature.marketing.brand_kit": "O kit de marca não está no seu plano",
"plan.upgrade.feature.marketing.reviews": "As avaliações não estão no seu plano",
"plan.upgrade.feature.integrations.ai": "As integrações de IA não estão no seu plano",
"plan.upgrade.feature.integrations.email": "O envio de email não está no seu plano",
"plan.upgrade.feature.processing.monitor": "O processamento não está no seu plano",
"plan.upgrade.feature.stores.hub": "Os conectores de loja não estão no seu plano",
"plan.upgrade.feature.stores.woocommerce": "O WooCommerce não está no seu plano",
"plan.upgrade.feature.stores.shopify": "O Shopify não está no seu plano",
"plan.upgrade.feature.support.center": "O Centro de suporte não está no seu plano",
"plan.upgrade.feature.support.ticket_create": "Criar tickets de suporte não está no seu plano",
"plan.upgrade.feature.support.ticket_thread": "Os tópicos de tickets de suporte não estão no seu plano",
"plan.upgrade.feature.catalog.structured_descriptions": "As descrições estruturadas não estão no seu plano",
"plan.upgrade.feature.catalog.vector_categories": "As categorias vetoriais não estão no seu plano",
"plan.checkingAccess": "A verificar o acesso ao plano…",
"upgradeBanner.comparePlans": "Comparar planos",
"upgradeBanner.talkToSales": "Falar com vendas",
"commandPalette.closeAria": "Fechar pesquisa",
2026-08-16 18:18:39 +02:00
"commandPalette.ariaLabel": "Pesquisar páginas",
"commandPalette.placeholder": "Pesquisar páginas…",
"commandPalette.searchAria": "Pesquisar páginas",
"commandPalette.destinationsAria": "Páginas",
"commandPalette.noMatches": "Nenhuma página correspondente",
"commandPalette.announceIdleOne": "Pesquisa. {count} página.",
"commandPalette.announceIdleMany": "Pesquisa. {count} páginas.",
"commandPalette.announceNone": "Nenhuma página correspondente.",
"commandPalette.announceMatchOne": "{count} página correspondente.",
"commandPalette.announceMatchMany": "{count} páginas correspondentes.",
"vector.title": "Teste de categorias vetoriais",
2026-08-16 18:18:39 +02:00
"vector.description": "Pesquise o índice de categorias vetoriais quando o Pinecone estiver configurado. Criar índice e inicializar ainda não estão disponíveis na v2.",
"vector.probing": "A verificar a API de categorias vetoriais…",
"vector.unavailable": "As categorias vetoriais ainda não estão neste backend. Não há nada a executar aqui até /api/vector-categories/* estar ligado.",
"vector.browseCategories": "Explorar categorias",
"vector.initHeading": "Inicializar base de dados vetorial",
2026-08-16 18:18:39 +02:00
"vector.initComingSoon": "Criar índice e Inicializar BD vetorial ainda não estão disponíveis na v2 (em breve). A pesquisa continua a funcionar quando o Pinecone está configurado.",
"vector.createIndex": "Criar índice",
"vector.initDb": "Inicializar BD vetorial",
"vector.searchHeading": "Pesquisar categorias",
2026-08-16 18:18:39 +02:00
"vector.searchPlaceholder": "Introduza a descrição do produto…",
"vector.results": "Resultados:",
"vector.categoryLabel": "Categoria:",
"vector.idLabel": "ID:",
2026-08-16 18:18:39 +02:00
"vector.scoreLabel": "Pontuação:",
"switcher.switching": "A mudar…",
"switcher.returnTo": "Voltar a {email}",
"switcher.switchUser": "Mudar de utilizador",
2026-08-16 18:18:39 +02:00
"switcher.loadingUsers": "A carregar utilizadores…",
"switcher.empty": "Nenhum utilizador comutável encontrado.",
"switcher.noCompany": "Sem empresa",
"switcher.unknownCompany": "Empresa desconhecida",
"companySwitcher.select": "Selecionar empresa",
"companySwitcher.switchAria": "Mudar de empresa: {label}",
"companySwitcher.companies": "Empresas",
2026-08-14 00:06:43 +02:00
"companySwitcher.returnTo": "Voltar para {name}",
"companySwitcher.returnHome": "Voltar para a empresa de origem",
"storeReconnect.primaryLabel": "Reconectar loja",
2026-08-16 18:18:39 +02:00
"storeReconnect.titlePlural": "Reconectar lojas após a migração",
"storeReconnect.titleChannel": "Reconectar {channel} após a migração",
"storeReconnect.titleSingular": "Reconectar loja após a migração",
"storeReconnect.messageWithItems": "As credenciais da API da loja não foram transferidas (ou não podem ser usadas) após a migração da plataforma. Isto não é uma sincronização avariada — reconecte cada loja e depois Teste a ligação antes de enfileirar uma sincronização.",
"storeReconnect.messageSingle": "As credenciais da API de {channel} não foram transferidas (ou não podem ser usadas) após a migração da plataforma. Isto não é uma sincronização avariada — cole credenciais novas, Guarde e depois Teste a ligação antes de enfileirar uma sincronização.",
"storeReconnect.channelFallback": "Loja",
2026-08-16 18:18:39 +02:00
"storeReconnect.askAdmin": "Peça a um administrador da empresa para reconectar — só os administradores podem guardar credenciais da loja.",
"storeReconnect.reconnectItem": "Reconectar {label}",
"admin.storeReconnect.channel.other": "Other",
"admin.storeReconnect.channel.woocommerce": "WooCommerce",
"admin.storeReconnect.channel.shopify": "Shopify",
"admin.storeReconnect.reason.other": "Other",
"admin.storeReconnect.reason.missingCredentials": "Missing credentials",
"admin.storeReconnect.enabledNo": "No",
"admin.storeReconnect.enabledYes": "Yes",
"admin.storeReconnect.colLastTest": "Last test",
"admin.storeReconnect.colEnabled": "Enabled",
"admin.storeReconnect.colReason": "Reason",
"admin.storeReconnect.colIdentity": "Identity",
"admin.storeReconnect.colChannel": "Channel",
"admin.storeReconnect.colCompany": "Company",
"admin.storeReconnect.noRows": "No rows in this page.",
"admin.storeReconnect.noneFound": "No stores need reconnect right now.",
"admin.storeReconnect.needsBadge": "Needs reconnect",
"admin.storeReconnect.cleanBadge": "No gaps",
"admin.storeReconnect.listDesc": "Store URL / shop domain present without usable secrets (matches merchant reconnect banner).",
"admin.storeReconnect.listTitle": "Connected but invalid",
"admin.storeReconnect.metric.showing": "Rows shown",
"admin.storeReconnect.metric.total": "Gaps total",
2026-08-16 18:18:39 +02:00
"admin.storeReconnect.cutoverHint": "Read-only inventory. Merchants reconnect via /stores/wizard or the channel Connection tab — this page does not mutate credentials.",
"admin.storeReconnect.loadFailed": "Could not load store reconnect inventory.",
"admin.storeReconnect.refresh": "Refresh",
"admin.storeReconnect.description": "Companies with a connected store identity but missing or unusable API credentials (cutover credential gaps).",
"admin.storeReconnect.title": "Store reconnect inventory",
"admin.nav.storeReconnect": "Store reconnect",
"storeReconnect.wizardHint": "Prefer a step-by-step flow? Open Guided setup (/stores/wizard), or reconnect the channel below and Test Connection before syncing.",
"storeReconnect.wizardLabel": "Guided setup",
2026-08-16 18:18:39 +02:00
"storeReconnect.reviewsHint": "A importação de avaliações não pode correr até as credenciais serem reconectadas após a migração. No separador Ligação: Guardar, depois Testar ligação.",
"storeReconnect.ordersHint": "A importação de encomendas não pode correr até as credenciais serem reconectadas após a migração. No separador Ligação: Guardar, depois Testar ligação.",
"productSync.directionTitle": "Produtos: Descrybe → loja",
"productSync.outbound": "Descrybe → {channel}",
"productSync.outboundBody": "— envia produtos Descrybe processados para a loja (criar ou atualizar produtos remotos correspondentes). Não importa o catálogo da loja para o Descrybe.",
"productSync.firstSync": "Primeira sincronização",
"productSync.firstSyncBody": "— produtos sem correspondência são criados em {channel}. Sincronizações posteriores atualizam produtos já ligados por id ou estratégia de correspondência.",
"productSync.reSync": "Re-sincronizar",
2026-08-16 18:18:39 +02:00
"productSync.reSyncBody": "— produtos remotos correspondentes podem ser sobrescritos com conteúdo Descrybe ({count} ligados até agora).",
"productSync.queued": "Sincronização de produtos em fila",
"productSync.live.queued": "Em fila — à espera do worker",
"productSync.live.running": "Sincronização em curso",
"productSync.live.watching": "A acompanhar o estado… as contagens aparecem quando terminar.",
"productSync.live.success": "Sync concluída: {total} total · {created} criados · {updated} atualizados · {failed} falhados · {skipped} ignorados",
"productSync.live.partial": "Sync com falhas: {total} total · {created} criados · {updated} atualizados · {failed} falhados · {skipped} ignorados",
"productSync.live.failed": "Sync falhou{detail}.",
2026-08-16 18:18:39 +02:00
"productSync.live.timedOut": "Ainda a correr — atualize mais tarde para o estado e contagens finais.",
"productSync.live.ordersSuccess": "Sync de encomendas concluída ({status}).",
"productSync.live.reviewsSuccess": "Sync de avaliações concluída ({status}).",
"productSync.retry": "Repetir sync",
2026-08-16 18:18:39 +02:00
"productSync.lastStatus": "Última: {status}",
"productSync.dryRun": "Simulação",
"productSync.lastSyncAt": "Última sincronização de produtos: {date}",
"productSync.noneYet": "Ainda não foi concluída nenhuma sincronização de produtos.",
"productSync.lastRun": "Última execução: {total} total · {created} criados · {updated} atualizados · {failed} falhados · {skipped} ignorados",
"productSync.needsReconnect": "A sincronização de produtos não pode correr até as credenciais serem reconectadas após a migração. No separador Ligação: Guardar, depois Testar ligação.",
"productSync.scheduleTitle": "Automatic product sync schedule",
2026-08-16 18:18:39 +02:00
"productSync.scheduleHelp": "Como os intervalos dos feeds: defina com que frequência o Descrybe envia produtos para a loja, ou pause o agendamento. A fila manual continua a funcionar com pausa. Webhooks da loja não são usados — só polling/fila.",
"productSync.scheduleInterval": "Intervalo de sync (horas)",
2026-08-16 18:18:39 +02:00
"productSync.scheduleIntervalHint": "1–168 horas. O padrão é 6 horas se não estiver definido no servidor.",
"productSync.schedulePause": "Pausar sync automática",
"productSync.schedulePauseHint": "Para apenas os envios agendados. Ainda pode colocar um sync de produtos na fila manualmente.",
"productSync.scheduleSave": "Save schedule",
"productSync.scheduleSaved": "Product sync schedule saved.",
"productSync.schedulePausedSaved": "Automatic product sync paused.",
"productSync.scheduleSaveFailed": "Could not save product sync schedule",
"productSync.schedulePausedBadge": "Schedule paused",
"productSync.scheduleActiveBadge": "Schedule active",
"productSync.scheduleNeedsConfig": "Save store connection first",
"productSync.scheduleAdminOnly": "Company admin required",
2026-08-16 18:18:39 +02:00
"productSync.delivery.title": "Atualizações por polling, não por webhooks da loja",
"productSync.delivery.body": "A Descrybe não recebe webhooks da Shopify ou WooCommerce. Os envios de produtos correm quando os coloca em fila ou no horário automático. Esta página acompanha o progresso ao consultar o estado da ligação — não via eventos push em direto da loja.",
"productSync.delivery.inboundNote": "Encomendas e avaliações também usam pulls em fila (agendados ou manuais), não webhooks em direto.",
"productSync.delivery.hubNote": "Os conectores de loja sincronizam por horário ou quando coloca um job em fila — não via webhooks em direto da loja.",
"productSync.delivery.badge.manual": "Fila manual",
"productSync.delivery.badge.scheduled": "Agendado a cada {hours} h",
2026-08-16 18:18:39 +02:00
"productSync.delivery.badge.scheduledDefault": "Agendado (predefinição do servidor)",
"productSync.delivery.badge.paused": "Agenda em pausa",
2026-08-16 18:18:39 +02:00
"productSync.delivery.badge.webhooksOff": "Webhooks da loja: indisponíveis",
"productSync.scope.title": "What to sync",
"productSync.scope.hint": "Optional filters for this push only. Leave blank to sync the latest processed products up to the limit.",
"productSync.scope.status": "Status",
"productSync.scope.statusAll": "All statuses",
"productSync.scope.statusCompleted": "Completed",
"productSync.scope.statusNeedsReview": "Needs review",
"productSync.scope.statusProcessing": "Processing",
"productSync.scope.statusError": "Error",
"productSync.scope.category": "Category",
"productSync.scope.categoryPlaceholder": "Exact category name (optional)",
"productSync.scope.limit": "Max products",
"productSync.scope.products": "Specific products",
"productSync.scope.productsHint": "Optional. Search and select processed products to push only those.",
"productSync.scope.productsOverrideHint": "Selected products override status, category, and max-products filters for this sync.",
2026-08-16 18:18:39 +02:00
"productSync.scope.productsSearch": "Search products…",
"productSync.scope.productsLoading": "Loading products…",
"productSync.scope.productsEmpty": "No processed products found.",
"productSync.scope.productsSelected": "{count} selected",
"productSync.scope.productsSelectedList": "Selected products",
"productSync.scope.productsClear": "Clear selection",
"productSync.scope.productsMax": "Maximum {max} products",
2026-08-16 18:18:39 +02:00
"store.syncingLive": "A sincronizar…",
"files.recentUploads": "Carregamentos recentes",
"files.colFileName": "Nome do ficheiro",
"files.colKind": "Tipo",
"files.colUploaded": "Carregado",
"files.colRows": "Linhas",
2026-08-16 18:18:39 +02:00
"files.loading": "A carregar carregamentos…",
"files.empty": "Ainda sem carregamentos.",
"products.filters.sortProducts": "Ordenar produtos",
2026-08-16 18:18:39 +02:00
"products.table.options": "Opções",
};