Translate pages

This commit is contained in:
Andras Schmelczer 2026-04-04 09:47:18 +01:00
parent a7aaf5effa
commit 96402228e3
49 changed files with 1458 additions and 926 deletions

View file

@ -1,4 +1,5 @@
import { useState, useCallback, useEffect } from 'react';
import { useTranslation } from 'react-i18next';
import { CloseIcon } from './icons/CloseIcon';
import { GoogleIcon } from './icons/GoogleIcon';
import { trackEvent } from '../../lib/analytics';
@ -26,6 +27,7 @@ export default function AuthModal({
onClearError: () => void;
initialTab?: 'login' | 'register';
}) {
const { t } = useTranslation();
const [view, setView] = useState<View>(initialTab);
const [email, setEmail] = useState('');
const [password, setPassword] = useState('');
@ -78,7 +80,11 @@ export default function AuthModal({
);
const title =
view === 'login' ? 'Log in' : view === 'register' ? 'Create account' : 'Reset password';
view === 'login'
? t('auth.logIn')
: view === 'register'
? t('auth.createAccount')
: t('auth.resetPassword');
return (
<div
@ -111,7 +117,7 @@ export default function AuthModal({
}`}
onClick={() => switchView('login')}
>
Log in
{t('auth.logIn')}
</button>
<button
className={`pb-2 text-sm font-medium border-b-2 transition-colors ${
@ -121,7 +127,7 @@ export default function AuthModal({
}`}
onClick={() => switchView('register')}
>
Create account
{t('auth.createAccount')}
</button>
</div>
)}
@ -130,7 +136,7 @@ export default function AuthModal({
{/* Value prop */}
{view !== 'forgot' && (
<p className="text-xs text-warm-500 dark:text-warm-400 text-center">
Save searches, bookmark properties, and pick up where you left off.
{t('auth.valueProp')}
</p>
)}
@ -145,14 +151,14 @@ export default function AuthModal({
className="w-full flex items-center justify-center gap-2 py-2 px-4 rounded border border-warm-200 dark:border-warm-700 bg-white dark:bg-warm-800 text-navy-950 dark:text-warm-100 text-sm font-medium hover:bg-warm-50 dark:hover:bg-warm-700 disabled:opacity-50 disabled:cursor-wait"
>
<GoogleIcon className="w-4 h-4" />
Continue with Google
{t('auth.continueWithGoogle')}
</button>
</div>
{/* Divider */}
<div className="flex items-center gap-3">
<div className="flex-1 h-px bg-warm-200 dark:bg-warm-700" />
<span className="text-xs text-warm-400 dark:text-warm-500">or</span>
<span className="text-xs text-warm-400 dark:text-warm-500">{t('common.or')}</span>
<div className="flex-1 h-px bg-warm-200 dark:bg-warm-700" />
</div>
</>
@ -162,7 +168,7 @@ export default function AuthModal({
<form onSubmit={handleSubmit} className="space-y-4">
<div>
<label className="block text-sm font-medium text-warm-700 dark:text-warm-300 mb-1">
Email
{t('auth.email')}
</label>
<input
type="email"
@ -170,14 +176,14 @@ export default function AuthModal({
onChange={(e) => setEmail(e.target.value)}
required
className="w-full px-3 py-2 text-sm rounded border border-warm-200 dark:border-warm-700 bg-white dark:bg-warm-800 text-navy-950 dark:text-white placeholder-warm-400 dark:placeholder-warm-500 outline-none focus:ring-2 ring-teal-400 dark:ring-teal-500"
placeholder="you@example.com"
placeholder={t('auth.emailPlaceholder')}
/>
</div>
{view !== 'forgot' && (
<div>
<label className="block text-sm font-medium text-warm-700 dark:text-warm-300 mb-1">
Password
{t('auth.password')}
</label>
<input
type="password"
@ -186,7 +192,7 @@ export default function AuthModal({
required
minLength={8}
className="w-full px-3 py-2 text-sm rounded border border-warm-200 dark:border-warm-700 bg-white dark:bg-warm-800 text-navy-950 dark:text-white placeholder-warm-400 dark:placeholder-warm-500 outline-none focus:ring-2 ring-teal-400 dark:ring-teal-500"
placeholder={view === 'register' ? 'Min 8 characters' : 'Your password'}
placeholder={view === 'register' ? t('auth.passwordPlaceholderRegister') : t('auth.passwordPlaceholderLogin')}
/>
{view === 'login' && (
<button
@ -194,7 +200,7 @@ export default function AuthModal({
onClick={() => switchView('forgot')}
className="mt-1 text-xs text-teal-600 dark:text-teal-400 hover:text-teal-800 dark:hover:text-teal-300"
>
Forgot password?
{t('auth.forgotPassword')}
</button>
)}
</div>
@ -202,7 +208,7 @@ export default function AuthModal({
{view === 'forgot' && resetSent && (
<p className="text-sm text-teal-700 dark:text-teal-400">
Check your email for a reset link.
{t('auth.resetSent')}
</p>
)}
@ -215,12 +221,12 @@ export default function AuthModal({
className="w-full py-2 rounded bg-teal-600 text-white text-sm font-medium hover:bg-teal-700 dark:hover:bg-teal-600 disabled:opacity-50 disabled:cursor-wait transition-colors"
>
{loading
? 'Please wait...'
? t('auth.pleaseWait')
: view === 'login'
? 'Log in'
? t('auth.logIn')
: view === 'register'
? 'Create account'
: 'Send reset link'}
? t('auth.createAccount')
: t('auth.sendResetLink')}
</button>
)}
@ -230,7 +236,7 @@ export default function AuthModal({
onClick={() => switchView('login')}
className="w-full text-center text-sm text-teal-600 dark:text-teal-400 hover:text-teal-800 dark:hover:text-teal-300"
>
Back to login
{t('auth.backToLogin')}
</button>
)}
</form>