diff --git a/apps/server/src/modules/auth/dto.ts b/apps/server/src/modules/auth/dto.ts index 2ee6f32..265bd95 100644 --- a/apps/server/src/modules/auth/dto.ts +++ b/apps/server/src/modules/auth/dto.ts @@ -9,7 +9,7 @@ export const createPasswordSchema = async () => { }; export const LoginSchema = z.object({ - email: z.string().email("Invalid email").describe("User email"), + emailOrUsername: z.string().min(1, "Email or username is required").describe("User email or username"), password: z.string().min(6, "Password must be at least 6 characters").describe("User password"), }); export type LoginInput = z.infer; diff --git a/apps/server/src/modules/auth/routes.ts b/apps/server/src/modules/auth/routes.ts index 534608c..9bd13be 100644 --- a/apps/server/src/modules/auth/routes.ts +++ b/apps/server/src/modules/auth/routes.ts @@ -17,7 +17,7 @@ export async function authRoutes(app: FastifyInstance) { const passwordSchema = await createPasswordSchema(); const loginSchema = z.object({ - email: z.string().email("Invalid email").describe("User email"), + emailOrUsername: z.string().min(1, "Email or username is required").describe("User email or username"), password: passwordSchema, }); diff --git a/apps/server/src/modules/auth/service.ts b/apps/server/src/modules/auth/service.ts index 05242f8..bc393c2 100644 --- a/apps/server/src/modules/auth/service.ts +++ b/apps/server/src/modules/auth/service.ts @@ -13,7 +13,7 @@ export class AuthService { private emailService = new EmailService(); async login(data: LoginInput) { - const user = await this.userRepository.findUserByEmail(data.email); + const user = await this.userRepository.findUserByEmailOrUsername(data.emailOrUsername); if (!user) { throw new Error("Invalid credentials"); } diff --git a/apps/server/src/modules/user/repository.ts b/apps/server/src/modules/user/repository.ts index f15e5dc..0de3ecc 100644 --- a/apps/server/src/modules/user/repository.ts +++ b/apps/server/src/modules/user/repository.ts @@ -7,6 +7,7 @@ export interface IUserRepository { findUserByEmail(email: string): Promise; findUserById(id: string): Promise; findUserByUsername(username: string): Promise; + findUserByEmailOrUsername(emailOrUsername: string): Promise; listUsers(): Promise; updateUser(data: UpdateUserInput & { password?: string }): Promise; deleteUser(id: string): Promise; @@ -41,6 +42,14 @@ export class PrismaUserRepository implements IUserRepository { return prisma.user.findUnique({ where: { username } }); } + async findUserByEmailOrUsername(emailOrUsername: string): Promise { + return prisma.user.findFirst({ + where: { + OR: [{ email: emailOrUsername }, { username: emailOrUsername }], + }, + }); + } + async listUsers(): Promise { return prisma.user.findMany(); } diff --git a/apps/web/messages/ar-SA.json b/apps/web/messages/ar-SA.json index 5d29bd7..069ff7d 100644 --- a/apps/web/messages/ar-SA.json +++ b/apps/web/messages/ar-SA.json @@ -202,6 +202,8 @@ "login": { "welcome": "مرحبا بك", "signInToContinue": "قم بتسجيل الدخول للمتابعة", + "emailOrUsernameLabel": "البريد الإلكتروني أو اسم المستخدم", + "emailOrUsernamePlaceholder": "أدخل بريدك الإلكتروني أو اسم المستخدم", "emailLabel": "البريد الإلكتروني", "emailPlaceholder": "أدخل بريدك الإلكتروني", "passwordLabel": "كلمة المرور", @@ -852,6 +854,7 @@ "passwordLength": "يجب أن تحتوي كلمة المرور على 8 أحرف على الأقل", "passwordsMatch": "كلمتا المرور غير متطابقتين", "emailRequired": "البريد الإلكتروني مطلوب", + "emailOrUsernameRequired": "البريد الإلكتروني أو اسم المستخدم مطلوب", "passwordRequired": "كلمة المرور مطلوبة", "nameRequired": "الاسم مطلوب", "required": "هذا الحقل مطلوب" diff --git a/apps/web/messages/de-DE.json b/apps/web/messages/de-DE.json index 813a0cd..7e7563c 100644 --- a/apps/web/messages/de-DE.json +++ b/apps/web/messages/de-DE.json @@ -202,6 +202,8 @@ "login": { "welcome": "Willkommen zu", "signInToContinue": "Melden Sie sich an, um fortzufahren", + "emailOrUsernameLabel": "E-Mail-Adresse oder Benutzername", + "emailOrUsernamePlaceholder": "Geben Sie Ihre E-Mail-Adresse oder Benutzernamen ein", "emailLabel": "E-Mail-Adresse", "emailPlaceholder": "Geben Sie Ihre E-Mail-Adresse ein", "passwordLabel": "Passwort", @@ -852,6 +854,7 @@ "passwordLength": "Das Passwort muss mindestens 8 Zeichen lang sein", "passwordsMatch": "Die Passwörter stimmen nicht überein", "emailRequired": "E-Mail ist erforderlich", + "emailOrUsernameRequired": "E-Mail oder Benutzername ist erforderlich", "passwordRequired": "Passwort ist erforderlich", "nameRequired": "Name ist erforderlich", "required": "Dieses Feld ist erforderlich" diff --git a/apps/web/messages/en-US.json b/apps/web/messages/en-US.json index 16aaeb5..b4cf177 100644 --- a/apps/web/messages/en-US.json +++ b/apps/web/messages/en-US.json @@ -202,6 +202,8 @@ "login": { "welcome": "Welcome to", "signInToContinue": "Sign in to continue", + "emailOrUsernameLabel": "Email or Username", + "emailOrUsernamePlaceholder": "Enter your email or username", "emailLabel": "Email Address", "emailPlaceholder": "Enter your email", "passwordLabel": "Password", @@ -909,6 +911,7 @@ "passwordLength": "Password must be at least 8 characters long", "passwordsMatch": "Passwords must match", "emailRequired": "Email is required", + "emailOrUsernameRequired": "Email or username is required", "passwordRequired": "Password is required", "passwordMinLength": "Password must be at least 6 characters", "nameRequired": "Name is required", diff --git a/apps/web/messages/es-ES.json b/apps/web/messages/es-ES.json index e2ce4e5..01154a4 100644 --- a/apps/web/messages/es-ES.json +++ b/apps/web/messages/es-ES.json @@ -202,6 +202,8 @@ "login": { "welcome": "Bienvenido a", "signInToContinue": "Inicia sesión para continuar", + "emailOrUsernameLabel": "Correo electrónico o nombre de usuario", + "emailOrUsernamePlaceholder": "Introduce tu correo electrónico o nombre de usuario", "emailLabel": "Dirección de correo electrónico", "emailPlaceholder": "Introduce tu correo electrónico", "passwordLabel": "Contraseña", @@ -852,6 +854,7 @@ "passwordLength": "La contraseña debe tener al menos 8 caracteres", "passwordsMatch": "Las contraseñas no coinciden", "emailRequired": "Se requiere el correo electrónico", + "emailOrUsernameRequired": "Se requiere el correo electrónico o nombre de usuario", "passwordRequired": "Se requiere la contraseña", "nameRequired": "El nombre es obligatorio", "required": "Este campo es obligatorio" diff --git a/apps/web/messages/fr-FR.json b/apps/web/messages/fr-FR.json index 2433f97..0598be4 100644 --- a/apps/web/messages/fr-FR.json +++ b/apps/web/messages/fr-FR.json @@ -202,6 +202,8 @@ "login": { "welcome": "Bienvenue à", "signInToContinue": "Connectez-vous pour continuer", + "emailOrUsernameLabel": "Email ou Nom d'utilisateur", + "emailOrUsernamePlaceholder": "Entrez votre email ou nom d'utilisateur", "emailLabel": "Adresse e-mail", "emailPlaceholder": "Entrez votre e-mail", "passwordLabel": "Mot de passe", @@ -852,6 +854,7 @@ "passwordLength": "Le mot de passe doit contenir au moins 8 caractères", "passwordsMatch": "Les mots de passe ne correspondent pas", "emailRequired": "L'email est requis", + "emailOrUsernameRequired": "L'email ou le nom d'utilisateur est requis", "passwordRequired": "Le mot de passe est requis", "nameRequired": "Nome é obrigatório", "required": "Este campo é obrigatório" diff --git a/apps/web/messages/hi-IN.json b/apps/web/messages/hi-IN.json index ab48252..f679e14 100644 --- a/apps/web/messages/hi-IN.json +++ b/apps/web/messages/hi-IN.json @@ -202,6 +202,8 @@ "login": { "welcome": "स्वागत है में", "signInToContinue": "जारी रखने के लिए साइन इन करें", + "emailOrUsernameLabel": "ईमेल या उपयोगकर्ता नाम", + "emailOrUsernamePlaceholder": "अपना ईमेल या उपयोगकर्ता नाम दर्ज करें", "emailLabel": "ईमेल पता", "emailPlaceholder": "अपना ईमेल दर्ज करें", "passwordLabel": "पासवर्ड", @@ -852,6 +854,7 @@ "passwordLength": "पासवर्ड कम से कम 8 अक्षर का होना चाहिए", "passwordsMatch": "पासवर्ड मेल नहीं खाते", "emailRequired": "ईमेल आवश्यक है", + "emailOrUsernameRequired": "ईमेल या उपयोगकर्ता नाम आवश्यक है", "passwordRequired": "पासवर्ड आवश्यक है", "nameRequired": "नाम आवश्यक है", "required": "यह फ़ील्ड आवश्यक है" diff --git a/apps/web/messages/it-IT.json b/apps/web/messages/it-IT.json index 0afc7b2..f13ea2d 100644 --- a/apps/web/messages/it-IT.json +++ b/apps/web/messages/it-IT.json @@ -202,6 +202,8 @@ "login": { "welcome": "Benvenuto in", "signInToContinue": "Accedi per continuare", + "emailOrUsernameLabel": "Email o Nome utente", + "emailOrUsernamePlaceholder": "Inserisci la tua email o nome utente", "emailLabel": "Indirizzo Email", "emailPlaceholder": "Inserisci la tua email", "passwordLabel": "Parola d'accesso", @@ -851,6 +853,7 @@ "passwordLength": "La parola d'accesso deve essere di almeno 8 caratteri", "passwordsMatch": "Le parole d'accesso devono corrispondere", "emailRequired": "L'indirizzo email è obbligatorio", + "emailOrUsernameRequired": "L'indirizzo email o il nome utente è obbligatorio", "passwordRequired": "La parola d'accesso è obbligatoria", "passwordMinLength": "La password deve contenere almeno 6 caratteri", "nameRequired": "Il nome è obbligatorio", diff --git a/apps/web/messages/ja-JP.json b/apps/web/messages/ja-JP.json index 33e97f0..861789d 100644 --- a/apps/web/messages/ja-JP.json +++ b/apps/web/messages/ja-JP.json @@ -202,6 +202,8 @@ "login": { "welcome": "ようこそへ", "signInToContinue": "続行するにはサインインしてください", + "emailOrUsernameLabel": "メールアドレスまたはユーザー名", + "emailOrUsernamePlaceholder": "メールアドレスまたはユーザー名を入力してください", "emailLabel": "メールアドレス", "emailPlaceholder": "メールアドレスを入力してください", "passwordLabel": "パスワード", @@ -852,6 +854,7 @@ "passwordLength": "パスワードは最低8文字必要です", "passwordsMatch": "パスワードが一致しません", "emailRequired": "メールアドレスは必須です", + "emailOrUsernameRequired": "メールアドレスまたはユーザー名は必須です", "passwordRequired": "パスワードは必須です", "nameRequired": "名前は必須です", "required": "このフィールドは必須です" diff --git a/apps/web/messages/ko-KR.json b/apps/web/messages/ko-KR.json index a8b7f66..e487704 100644 --- a/apps/web/messages/ko-KR.json +++ b/apps/web/messages/ko-KR.json @@ -202,6 +202,8 @@ "login": { "welcome": "에 오신 것을 환영합니다", "signInToContinue": "계속하려면 로그인하세요", + "emailOrUsernameLabel": "이메일 또는 사용자 이름", + "emailOrUsernamePlaceholder": "이메일 또는 사용자 이름을 입력하세요", "emailLabel": "이메일 주소", "emailPlaceholder": "이메일을 입력하세요", "passwordLabel": "비밀번호", @@ -852,6 +854,7 @@ "passwordLength": "비밀번호는 최소 8자 이상이어야 합니다", "passwordsMatch": "비밀번호가 일치하지 않습니다", "emailRequired": "이메일은 필수입니다", + "emailOrUsernameRequired": "이메일 또는 사용자 이름은 필수입니다", "passwordRequired": "비밀번호는 필수입니다", "nameRequired": "이름은 필수입니다", "required": "이 필드는 필수입니다" diff --git a/apps/web/messages/nl-NL.json b/apps/web/messages/nl-NL.json index d0f7663..fca8d7a 100644 --- a/apps/web/messages/nl-NL.json +++ b/apps/web/messages/nl-NL.json @@ -202,6 +202,8 @@ "login": { "welcome": "Welkom bij", "signInToContinue": "Log in om door te gaan", + "emailOrUsernameLabel": "E-mail of Gebruikersnaam", + "emailOrUsernamePlaceholder": "Voer je e-mail of gebruikersnaam in", "emailLabel": "E-mailadres", "emailPlaceholder": "Voer je e-mail in", "passwordLabel": "Wachtwoord", @@ -851,6 +853,7 @@ "passwordLength": "Wachtwoord moet minimaal 8 tekens zijn", "passwordsMatch": "Wachtwoorden moeten overeenkomen", "emailRequired": "E-mail is verplicht", + "emailOrUsernameRequired": "E-mail of gebruikersnaam is verplicht", "passwordRequired": "Wachtwoord is verplicht", "passwordMinLength": "Wachtwoord moet minimaal 6 tekens bevatten", "nameRequired": "Naam is verplicht", diff --git a/apps/web/messages/pl-PL.json b/apps/web/messages/pl-PL.json index 54dc9db..eb20a0b 100644 --- a/apps/web/messages/pl-PL.json +++ b/apps/web/messages/pl-PL.json @@ -202,6 +202,8 @@ "login": { "welcome": "Witaj w", "signInToContinue": "Zaloguj się, aby kontynuować", + "emailOrUsernameLabel": "E-mail lub nazwa użytkownika", + "emailOrUsernamePlaceholder": "Wprowadź swój e-mail lub nazwę użytkownika", "emailLabel": "Adres e-mail", "emailPlaceholder": "Wprowadź swój adres e-mail", "passwordLabel": "Hasło", @@ -909,6 +911,7 @@ "passwordLength": "Hasło musi mieć co najmniej 8 znaków", "passwordsMatch": "Hasła muszą być zgodne", "emailRequired": "E-mail jest wymagany", + "emailOrUsernameRequired": "E-mail lub nazwa użytkownika jest wymagana", "passwordRequired": "Hasło jest wymagane", "passwordMinLength": "Hasło musi mieć co najmniej 6 znaków", "nameRequired": "Nazwa jest wymagana", diff --git a/apps/web/messages/pt-BR.json b/apps/web/messages/pt-BR.json index 626d301..031cc3b 100644 --- a/apps/web/messages/pt-BR.json +++ b/apps/web/messages/pt-BR.json @@ -18,17 +18,17 @@ "click": "Clique para" }, "createShare": { - "title": "Criar Compartilhamento", - "nameLabel": "Nome do Compartilhamento", + "title": "Criar compartilhamento", + "nameLabel": "Nome do compartilhamento", "descriptionLabel": "Descrição", "descriptionPlaceholder": "Digite uma descrição (opcional)", - "expirationLabel": "Data de Expiração", + "expirationLabel": "Data de expiração", "expirationPlaceholder": "DD/MM/AAAA HH:MM", - "maxViewsLabel": "Máximo de Visualizações", + "maxViewsLabel": "Máximo de visualizações", "maxViewsPlaceholder": "Deixe vazio para ilimitado", "passwordProtection": "Protegido por Senha", "passwordLabel": "Senha", - "create": "Criar Compartilhamento", + "create": "Criar compartilhamento", "success": "Compartilhamento criado com sucesso", "error": "Falha ao criar compartilhamento" }, @@ -44,7 +44,7 @@ }, "emptyState": { "noFiles": "Nenhum arquivo enviado ainda", - "uploadFile": "Enviar Arquivo" + "uploadFile": "Enviar arquivo" }, "errors": { "invalidCredentials": "E-mail ou senha inválidos", @@ -53,13 +53,13 @@ "unexpectedError": "Ocorreu um erro inesperado. Por favor, tente novamente" }, "fileActions": { - "editFile": "Editar Arquivo", + "editFile": "Editar arquivo", "nameLabel": "Nome", "namePlaceholder": "Digite o novo nome", "extension": "Extensão", "descriptionLabel": "Descrição", "descriptionPlaceholder": "Digite a descrição do arquivo", - "deleteFile": "Excluir Arquivo", + "deleteFile": "Excluir arquivo", "deleteConfirmation": "Tem certeza que deseja excluir ?", "deleteWarning": "Esta ação não pode ser desfeita." }, @@ -154,9 +154,9 @@ "bulkActions": { "selected": "{count, plural, =1 {1 arquivo selecionado} other {# arquivos selecionados}}", "actions": "Ações", - "download": "Baixar Selecionados", - "share": "Compartilhar Selecionados", - "delete": "Excluir Selecionados" + "download": "Baixar selecionados", + "share": "Compartilhar selecionados", + "delete": "Excluir selecionados" } }, "footer": { @@ -175,23 +175,23 @@ "pageTitle": "Esqueceu a Senha" }, "generateShareLink": { - "generateTitle": "Gerar Link de Compartilhamento", - "updateTitle": "Atualizar Link de Compartilhamento", + "generateTitle": "Gerar link de compartilhamento", + "updateTitle": "Atualizar link de compartilhamento", "generateDescription": "Gere um link para compartilhar seus arquivos", "updateDescription": "Atualize o alias deste link de compartilhamento", "aliasPlaceholder": "Digite o alias", "linkReady": "Seu link de compartilhamento está pronto:", - "generateButton": "Gerar Link", - "updateButton": "Atualizar Link", - "copyButton": "Copiar Link", + "generateButton": "Gerar link", + "updateButton": "Atualizar link", + "copyButton": "Copiar link", "success": "Link gerado com sucesso", "error": "Erro ao gerar link", "copied": "Link copiado para a área de transferência" }, "shareFile": { - "title": "Compartilhar Arquivo", - "linkTitle": "Gerar Link", - "nameLabel": "Nome do Compartilhamento", + "title": "Compartilhar arquivo", + "linkTitle": "Gerar link", + "nameLabel": "Nome do compartilhamento", "namePlaceholder": "Digite o nome do compartilhamento", "descriptionLabel": "Descrição", "descriptionPlaceholder": "Digite uma descrição (opcional)", @@ -199,16 +199,16 @@ "expirationPlaceholder": "DD/MM/AAAA HH:MM", "maxViewsLabel": "Máximo de Visualizações", "maxViewsPlaceholder": "Deixe vazio para ilimitado", - "passwordProtection": "Protegido por Senha", + "passwordProtection": "Protegido por senha", "passwordLabel": "Senha", "passwordPlaceholder": "Digite a senha", "linkDescription": "Gere um link personalizado para compartilhar o arquivo", - "aliasLabel": "Alias do Link", + "aliasLabel": "Alias do link", "aliasPlaceholder": "Digite um alias personalizado", "linkReady": "Seu link de compartilhamento está pronto:", - "createShare": "Criar Compartilhamento", - "generateLink": "Gerar Link", - "copyLink": "Copiar Link" + "createShare": "Criar compartilhamento", + "generateLink": "Gerar link", + "copyLink": "Copiar link" }, "home": { "description": "A alternativa open-source ao WeTransfer. Compartilhe arquivos com segurança, sem rastreamento ou limitações.", @@ -223,7 +223,9 @@ }, "login": { "welcome": "Bem-vindo ao", - "signInToContinue": "Entre para continuar", + "signInToContinue": "Faça login para continuar", + "emailOrUsernameLabel": "E-mail ou Nome de Usuário", + "emailOrUsernamePlaceholder": "Digite seu e-mail ou nome de usuário", "emailLabel": "Endereço de E-mail", "emailPlaceholder": "Digite seu e-mail", "passwordLabel": "Senha", @@ -231,18 +233,18 @@ "signIn": "Entrar", "signingIn": "Entrando...", "forgotPassword": "Esqueceu a senha?", - "pageTitle": "Entrar", + "pageTitle": "Login", "or": "ou", "continueWithSSO": "Continuar com SSO", "processing": "Processando autenticação..." }, "logo": { "labels": { - "appLogo": "Logo do Aplicativo" + "appLogo": "Logo do aplicativo" }, "buttons": { - "upload": "Enviar Logo", - "remove": "Remover Logo" + "upload": "Enviar logo", + "remove": "Remover logo" }, "messages": { "uploadSuccess": "Logo enviado com sucesso", @@ -254,11 +256,11 @@ } }, "navbar": { - "logoAlt": "Logo do Aplicativo", + "logoAlt": "Logo do aplicativo", "profileMenu": "Menu do Perfil", "profile": "Perfil", "settings": "Configurações", - "usersManagement": "Gerenciar Usuários", + "usersManagement": "Gerenciar usuários", "logout": "Sair" }, "navigation": { @@ -865,18 +867,15 @@ } }, "validation": { - "invalidEmail": "Endereço de email inválido", - "passwordMinLength": "A senha deve ter pelo menos 6 caracteres", - "firstNameRequired": "Nome é obrigatório", - "lastNameRequired": "Sobrenome é obrigatório", - "usernameLength": "Nome de usuário deve ter pelo menos 3 caracteres", - "usernameSpaces": "Nome de usuário não pode conter espaços", + "invalidEmail": "Por favor, insira um endereço de e-mail válido", "passwordLength": "A senha deve ter pelo menos 8 caracteres", - "passwordsMatch": "As senhas não coincidem", + "passwordsMatch": "As senhas devem coincidir", "emailRequired": "Email é obrigatório", + "emailOrUsernameRequired": "E-mail ou nome de usuário é obrigatório", "passwordRequired": "Senha é obrigatória", - "required": "Este campo é obrigatório", - "nameRequired": "Nome é obrigatório" + "passwordMinLength": "A senha deve ter pelo menos 6 caracteres", + "nameRequired": "Nome é obrigatório", + "required": "Este campo é obrigatório" }, "bulkDownload": { "title": "Download em Lote", @@ -945,8 +944,8 @@ "noExpiration": "Este compartilhamento nunca expirará e permanecerá acessível indefinidamente.", "title": "Sobre expiração:" }, - "enableExpiration": "Habilitar Expiração", - "title": "Configurações de Expiração do Compartilhamento", + "enableExpiration": "Habilitar expiração", + "title": "Configurações de expiração do compartilhamento", "subtitle": "Configurar quando este compartilhamento expirará", "validation": { "dateMustBeFuture": "A data de expiração deve estar no futuro", @@ -957,7 +956,7 @@ "updateFailed": "Falha ao atualizar configurações de expiração" }, "expires": "Expira:", - "expirationDate": "Data de Expiração" + "expirationDate": "Data de expiração" }, "auth": { "errors": { @@ -969,10 +968,10 @@ } }, "reverseShares": { - "pageTitle": "Receber Arquivos", + "pageTitle": "Receber arquivos", "search": { - "title": "Gerenciar Links de Recebimento", - "createButton": "Criar Link", + "title": "Gerenciar links de recebimento", + "createButton": "Criar link", "placeholder": "Buscar links de recebimento...", "results": "Encontrados {filtered} de {total} links de recebimento" }, @@ -982,13 +981,13 @@ "status": "status", "access": "acesso", "description": "Descrição", - "pageLayout": "Layout da Página", + "pageLayout": "Layout da página", "security": "Segurança & Status", "limits": "Limites", - "maxFiles": "Máximo de Arquivos", - "maxFileSize": "Tamanho Máximo", - "allowedTypes": "Tipos Permitidos", - "filesReceived": "Arquivos Recebidos", + "maxFiles": "Máximo de arquivos", + "maxFileSize": "Tamanho máximo", + "allowedTypes": "Tipos permitidos", + "filesReceived": "Arquivos recebidos", "fileLimit": "Limite de Arquivos", "noLimit": "Sem limite", "noLinkCreated": "Nenhum link criado", diff --git a/apps/web/messages/ru-RU.json b/apps/web/messages/ru-RU.json index 508bc4a..e4b91eb 100644 --- a/apps/web/messages/ru-RU.json +++ b/apps/web/messages/ru-RU.json @@ -202,6 +202,8 @@ "login": { "welcome": "Добро пожаловать в", "signInToContinue": "Войдите, чтобы продолжить", + "emailOrUsernameLabel": "Электронная почта или имя пользователя", + "emailOrUsernamePlaceholder": "Введите электронную почту или имя пользователя", "emailLabel": "Адрес электронной почты", "emailPlaceholder": "Введите вашу электронную почту", "passwordLabel": "Пароль", @@ -852,6 +854,7 @@ "passwordLength": "Пароль должен содержать не менее 8 символов", "passwordsMatch": "Пароли не совпадают", "emailRequired": "Требуется электронная почта", + "emailOrUsernameRequired": "Электронная почта или имя пользователя обязательно", "passwordRequired": "Требуется пароль", "nameRequired": "Требуется имя", "required": "Это поле обязательно" diff --git a/apps/web/messages/tr-TR.json b/apps/web/messages/tr-TR.json index 8783b14..9cfa853 100644 --- a/apps/web/messages/tr-TR.json +++ b/apps/web/messages/tr-TR.json @@ -202,6 +202,8 @@ "login": { "welcome": "Hoş geldiniz'e", "signInToContinue": "Devam etmek için oturum açın", + "emailOrUsernameLabel": "E-posta veya Kullanıcı Adı", + "emailOrUsernamePlaceholder": "E-posta veya kullanıcı adınızı girin", "emailLabel": "E-posta Adresi", "emailPlaceholder": "E-posta adresinizi girin", "passwordLabel": "Şifre", @@ -852,6 +854,7 @@ "passwordLength": "Şifre en az 8 karakter olmalıdır", "passwordsMatch": "Şifreler eşleşmiyor", "emailRequired": "E-posta gerekli", + "emailOrUsernameRequired": "E-posta veya kullanıcı adı gereklidir", "passwordRequired": "Şifre gerekli", "nameRequired": "İsim gereklidir", "required": "Bu alan zorunludur" diff --git a/apps/web/messages/zh-CN.json b/apps/web/messages/zh-CN.json index 800e127..e7e66db 100644 --- a/apps/web/messages/zh-CN.json +++ b/apps/web/messages/zh-CN.json @@ -202,6 +202,8 @@ "login": { "welcome": "欢迎您", "signInToContinue": "请登录以继续", + "emailOrUsernameLabel": "电子邮件或用户名", + "emailOrUsernamePlaceholder": "请输入您的电子邮件或用户名", "emailLabel": "电子邮件地址", "emailPlaceholder": "请输入您的电子邮件", "passwordLabel": "密码", @@ -852,6 +854,7 @@ "passwordLength": "密码至少需要8个字符", "passwordsMatch": "密码不匹配", "emailRequired": "电子邮件为必填项", + "emailOrUsernameRequired": "电子邮件或用户名是必填项", "passwordRequired": "密码为必填项", "nameRequired": "名称为必填项", "required": "此字段为必填项" diff --git a/apps/web/src/app/login/components/login-form.tsx b/apps/web/src/app/login/components/login-form.tsx index 00d2ee1..840040d 100644 --- a/apps/web/src/app/login/components/login-form.tsx +++ b/apps/web/src/app/login/components/login-form.tsx @@ -23,7 +23,7 @@ export function LoginForm({ error, isVisible, onToggleVisibility, onSubmit }: Lo const form = useForm({ resolver: zodResolver(loginSchema), defaultValues: { - email: "", + emailOrUsername: "", password: "", }, }); @@ -37,18 +37,18 @@ export function LoginForm({ error, isVisible, onToggleVisibility, onSubmit }: Lo

); - const renderEmailField = () => ( + const renderEmailOrUsernameField = () => ( ( - {t("login.emailLabel")} + {t("login.emailOrUsernameLabel")} @@ -89,7 +89,7 @@ export function LoginForm({ error, isVisible, onToggleVisibility, onSubmit }: Lo {renderErrorMessage()}
- {renderEmailField()} + {renderEmailOrUsernameField()} {renderPasswordField()}