auto-claude: subtask-1-3 - Add translation keys for rate limit messages
This commit is contained in:
@@ -33,7 +33,8 @@ export default function LoginForm() {
|
||||
const timeToReset = Math.ceil(rateLimiter.getTimeToReset(clientIp) / 1000 / 60);
|
||||
setIsLockedOut(true);
|
||||
setLockoutMinutes(timeToReset);
|
||||
throw new Error(`Too many attempts. Please try again in ${timeToReset} minutes.`);
|
||||
const unit = timeToReset === 1 ? t('rateLimit.locked.minute') : t('rateLimit.locked.minutes');
|
||||
throw new Error(t('rateLimit.locked.message', { minutes: timeToReset, unit }));
|
||||
}
|
||||
|
||||
const supabase = createClient();
|
||||
@@ -69,9 +70,12 @@ export default function LoginForm() {
|
||||
<div className="bg-red-500/10 border border-red-500/20 text-red-500 p-4 rounded-lg flex items-center">
|
||||
<AlertCircle className="h-5 w-5 mr-2 flex-shrink-0" />
|
||||
<div>
|
||||
<p className="font-medium">Account temporarily locked</p>
|
||||
<p className="font-medium">{t('rateLimit.locked.title')}</p>
|
||||
<p className="text-sm mt-1">
|
||||
Too many failed login attempts. Please try again in {lockoutMinutes} {lockoutMinutes === 1 ? 'minute' : 'minutes'}.
|
||||
{t('rateLimit.locked.message', {
|
||||
minutes: lockoutMinutes,
|
||||
unit: lockoutMinutes === 1 ? t('rateLimit.locked.minute') : t('rateLimit.locked.minutes')
|
||||
})}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
@@ -85,7 +89,10 @@ export default function LoginForm() {
|
||||
</div>
|
||||
{remainingAttempts !== null && remainingAttempts > 0 && (
|
||||
<p className="text-sm mt-2 ml-7">
|
||||
{remainingAttempts} {remainingAttempts === 1 ? 'attempt' : 'attempts'} remaining before temporary lockout.
|
||||
{t('rateLimit.warning.message', {
|
||||
attempts: remainingAttempts,
|
||||
unit: remainingAttempts === 1 ? t('rateLimit.warning.attempt') : t('rateLimit.warning.attempts')
|
||||
})}
|
||||
</p>
|
||||
)}
|
||||
</div>
|
||||
|
||||
@@ -50,5 +50,19 @@ export const login = {
|
||||
security: {
|
||||
secureConnection: 'Sichere Verbindung',
|
||||
privacyNote: 'Ihre Daten werden verschlüsselt übertragen'
|
||||
},
|
||||
// Ratenbegrenzung
|
||||
rateLimit: {
|
||||
locked: {
|
||||
title: 'Konto vorübergehend gesperrt',
|
||||
message: 'Zu viele fehlgeschlagene Anmeldeversuche. Bitte versuchen Sie es in {minutes} {unit} erneut.',
|
||||
minute: 'Minute',
|
||||
minutes: 'Minuten'
|
||||
},
|
||||
warning: {
|
||||
message: '{attempts} {unit} verbleibend vor vorübergehender Sperrung.',
|
||||
attempt: 'Versuch',
|
||||
attempts: 'Versuche'
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -50,5 +50,19 @@ export const login = {
|
||||
security: {
|
||||
secureConnection: 'Secure Connection',
|
||||
privacyNote: 'Your data is transmitted encrypted'
|
||||
},
|
||||
// Rate limiting
|
||||
rateLimit: {
|
||||
locked: {
|
||||
title: 'Account temporarily locked',
|
||||
message: 'Too many failed login attempts. Please try again in {minutes} {unit}.',
|
||||
minute: 'minute',
|
||||
minutes: 'minutes'
|
||||
},
|
||||
warning: {
|
||||
message: '{attempts} {unit} remaining before temporary lockout.',
|
||||
attempt: 'attempt',
|
||||
attempts: 'attempts'
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -50,5 +50,19 @@ export const login = {
|
||||
security: {
|
||||
secureConnection: 'Bezbedna veza',
|
||||
privacyNote: 'Vaši podaci se prenose u šifrovanom obliku'
|
||||
},
|
||||
// Ograničenje broja pokušaja
|
||||
rateLimit: {
|
||||
locked: {
|
||||
title: 'Nalog privremeno zaključan',
|
||||
message: 'Previše neuspešnih pokušaja prijave. Molimo pokušajte ponovo za {minutes} {unit}.',
|
||||
minute: 'minut',
|
||||
minutes: 'minuta'
|
||||
},
|
||||
warning: {
|
||||
message: '{attempts} {unit} preostalo pre privremenog zaključavanja.',
|
||||
attempt: 'pokušaj',
|
||||
attempts: 'pokušaja'
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user