diff --git a/frontend/src/components/Login.tsx b/frontend/src/components/Login.tsx index 9e05c07..06a8a9c 100644 --- a/frontend/src/components/Login.tsx +++ b/frontend/src/components/Login.tsx @@ -70,7 +70,7 @@ export function Login({ onLogin }: { onLogin: (user: UserType) => void }) { setToken(res.token); onLogin(res.user); } catch (err) { - setError(err instanceof Error ? err.message : "Invalid code"); + setError(err instanceof Error ? err.message : t("login.totpInvalid")); } finally { setBusy(false); } @@ -100,7 +100,7 @@ export function Login({ onLogin }: { onLogin: (user: UserType) => void }) { onChange={(e) => setCode(e.target.value.replace(/\D/g, "").slice(0, 6))} autoComplete="one-time-code" placeholder="000000" - aria-label="Authenticator code" + aria-label={t("login.totpAria")} inputMode="numeric" required /> @@ -111,14 +111,14 @@ export function Login({ onLogin }: { onLogin: (user: UserType) => void }) {

)} ) : ( diff --git a/frontend/src/components/dialogs.tsx b/frontend/src/components/dialogs.tsx index 17cb779..31eaad8 100644 --- a/frontend/src/components/dialogs.tsx +++ b/frontend/src/components/dialogs.tsx @@ -891,7 +891,4 @@ function SecuritySection({ onKeyRotated }: { onKeyRotated?: () => void }) { /> ); -} - - ); } diff --git a/frontend/src/lib/i18n.ts b/frontend/src/lib/i18n.ts index 6458f6d..0355df8 100644 --- a/frontend/src/lib/i18n.ts +++ b/frontend/src/lib/i18n.ts @@ -1532,8 +1532,12 @@ const pt: Dict = { "login.forgot": "Esqueceste a chave?", "login.perk1": "Privado por design — sem cookies nem rastreio", "login.perk2": "Os teus modelos, em tempo real", - "login.adminNote": - "A chave admin vive no .env do servidor; as chaves são emitidas pelo admin.", + "login.adminNotePre": "A chave admin vive no .env do servidor", + "login.adminNotePost": "; as chaves são emitidas pelo admin.", + "login.totpIntro": "Dois fatores para @{user} — escreve o código de 6 dígitos da app.", + "login.totpAria": "Código do autenticador", + "login.totpInvalid": "Código inválido", + "login.verify": "Verificar", "sidebar.newChat": "Novo chat", "sidebar.collapse": "Ocultar barra lateral",