mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-06-19 13:21:46 +00:00
a876fb2634
* feat(auth): passkey (WebAuthn) login — server endpoints, schema + admin toggle Add @simplewebauthn/server registration and primary (discoverable) login ceremonies under /api/auth/passkey, a webauthn_credentials + single-use webauthn_challenges schema (migration), the instance-wide passkey_login toggle (default off) enforced before auth by a guard, and require_mfa satisfaction via a verified passkey. RP ID/origin come only from server config (webauthn_rp_id/origins -> APP_URL), never request headers. * feat(auth): passkey enrolment, login button + admin settings UI PasskeysSection in account settings (add/rename/remove with a current-password step-up), a 'Sign in with a passkey' button on the login page, the admin enable + RP-ID/origins controls, and a per-user admin reset action. * i18n(auth): passkey strings across all locales Add login/settings/admin passkey keys to en and all 19 translated locales.
99 lines
5.1 KiB
TypeScript
99 lines
5.1 KiB
TypeScript
import type { TranslationStrings } from '../types';
|
|
|
|
const login: TranslationStrings = {
|
|
'login.error': 'Falha no login. Verifique suas credenciais.',
|
|
'login.tagline': 'Suas viagens.\nSeu plano.',
|
|
'login.description':
|
|
'Planeje viagens em equipe com mapas interativos, orçamento e sincronização em tempo real.',
|
|
'login.features.maps': 'Mapas interativos',
|
|
'login.features.mapsDesc': 'Google Places, rotas e agrupamento',
|
|
'login.features.realtime': 'Sincronização em tempo real',
|
|
'login.features.realtimeDesc': 'Planejem juntos via WebSocket',
|
|
'login.features.budget': 'Controle de orçamento',
|
|
'login.features.budgetDesc': 'Categorias, gráficos e custo por pessoa',
|
|
'login.features.collab': 'Colaboração',
|
|
'login.features.collabDesc': 'Vários usuários com viagens compartilhadas',
|
|
'login.features.packing': 'Listas de malas',
|
|
'login.features.packingDesc': 'Categorias, progresso e sugestões',
|
|
'login.features.bookings': 'Reservas',
|
|
'login.features.bookingsDesc': 'Voos, hotéis, restaurantes e mais',
|
|
'login.features.files': 'Documentos',
|
|
'login.features.filesDesc': 'Envie e gerencie documentos',
|
|
'login.features.routes': 'Rotas inteligentes',
|
|
'login.features.routesDesc': 'Otimize e exporte para o Google Maps',
|
|
'login.selfHosted': 'Auto-hospedado · Código aberto · Seus dados são seus',
|
|
'login.title': 'Entrar',
|
|
'login.subtitle': 'Bem-vindo de volta',
|
|
'login.signingIn': 'Entrando…',
|
|
'login.signIn': 'Entrar',
|
|
'login.createAdmin': 'Criar conta de administrador',
|
|
'login.createAdminHint':
|
|
'Configure a primeira conta de administrador do TREK.',
|
|
'login.setNewPassword': 'Definir nova senha',
|
|
'login.setNewPasswordHint': 'Você deve alterar sua senha antes de continuar.',
|
|
'login.createAccount': 'Criar conta',
|
|
'login.createAccountHint': 'Cadastre uma nova conta.',
|
|
'login.creating': 'Criando…',
|
|
'login.noAccount': 'Não tem conta?',
|
|
'login.hasAccount': 'Já tem conta?',
|
|
'login.register': 'Cadastrar',
|
|
'login.emailPlaceholder': 'seu@email.com',
|
|
'login.username': 'Nome de usuário',
|
|
'login.oidc.registrationDisabled':
|
|
'Cadastro desativado. Fale com o administrador.',
|
|
'login.oidc.noEmail': 'Nenhum e-mail recebido do provedor.',
|
|
'login.oidc.tokenFailed': 'Falha na autenticação.',
|
|
'login.oidc.invalidState': 'Sessão inválida. Tente novamente.',
|
|
'login.demoFailed': 'Falha no login de demonstração',
|
|
'login.oidcSignIn': 'Entrar com {name}',
|
|
'login.oidcOnly': 'Login por senha desativado. Use o provedor SSO.',
|
|
'login.oidcLoggedOut':
|
|
'Você foi desconectado. Entre novamente usando o provedor SSO.',
|
|
'login.demoHint': 'Experimente a demonstração — sem cadastro',
|
|
'login.mfaTitle': 'Autenticação em duas etapas',
|
|
'login.mfaSubtitle': 'Digite o código de 6 dígitos do seu app autenticador.',
|
|
'login.mfaCodeLabel': 'Código de verificação',
|
|
'login.mfaCodeRequired': 'Digite o código do app autenticador.',
|
|
'login.mfaHint': 'Abra o Google Authenticator, Authy ou outro app TOTP.',
|
|
'login.mfaBack': '← Voltar ao login',
|
|
'login.mfaVerify': 'Verificar',
|
|
'login.invalidInviteLink': 'Link de convite inválido ou expirado',
|
|
'login.oidcFailed': 'Falha no login OIDC',
|
|
'login.usernameRequired': 'Nome de usuário é obrigatório',
|
|
'login.passwordMinLength': 'A senha deve ter pelo menos 8 caracteres',
|
|
'login.forgotPassword': 'Esqueceu a senha?',
|
|
'login.forgotPasswordTitle': 'Redefinir sua senha',
|
|
'login.forgotPasswordBody':
|
|
'Digite o e-mail cadastrado. Se houver uma conta, enviaremos um link de redefinição.',
|
|
'login.forgotPasswordSubmit': 'Enviar link',
|
|
'login.forgotPasswordSentTitle': 'Verifique seu e-mail',
|
|
'login.forgotPasswordSentBody':
|
|
'Se houver uma conta para esse e-mail, o link está a caminho. Ele expira em 60 minutos.',
|
|
'login.forgotPasswordSmtpHintOff':
|
|
'Observação: seu administrador não configurou SMTP, então o link de redefinição será gravado no console do servidor em vez de ser enviado por e-mail.',
|
|
'login.backToLogin': 'Voltar ao login',
|
|
'login.newPassword': 'Nova senha',
|
|
'login.confirmPassword': 'Confirmar nova senha',
|
|
'login.passwordsDontMatch': 'As senhas não coincidem',
|
|
'login.mfaCode': 'Código 2FA',
|
|
'login.resetPasswordTitle': 'Definir uma nova senha',
|
|
'login.resetPasswordBody':
|
|
'Escolha uma senha forte que você ainda não tenha usado aqui. Mínimo de 8 caracteres.',
|
|
'login.resetPasswordMfaBody':
|
|
'Digite seu código 2FA ou um código de backup para concluir a redefinição.',
|
|
'login.resetPasswordSubmit': 'Redefinir senha',
|
|
'login.resetPasswordVerify': 'Verificar e redefinir',
|
|
'login.resetPasswordSuccessTitle': 'Senha atualizada',
|
|
'login.resetPasswordSuccessBody':
|
|
'Agora você pode entrar com sua nova senha.',
|
|
'login.resetPasswordInvalidLink': 'Link de redefinição inválido',
|
|
'login.resetPasswordInvalidLinkBody':
|
|
'Este link está ausente ou corrompido. Solicite um novo para continuar.',
|
|
'login.resetPasswordFailed':
|
|
'Falha na redefinição. O link pode ter expirado.',
|
|
'login.passkey.signIn': 'Entrar com uma passkey',
|
|
'login.passkey.failed':
|
|
'Falha ao entrar com passkey. Tente novamente.',
|
|
};
|
|
export default login;
|