diff --git a/api/controllers/console/auth/forgot_password.py b/api/controllers/console/auth/forgot_password.py index 1a88d7d5d7..7b63b36e7d 100644 --- a/api/controllers/console/auth/forgot_password.py +++ b/api/controllers/console/auth/forgot_password.py @@ -31,18 +31,23 @@ class ForgotPasswordSendEmailApi(Resource): def post(self): parser = reqparse.RequestParser() parser.add_argument("email", type=email, required=True, location="json") + parser.add_argument("language", type=str, required=False, location="json") args = parser.parse_args() account = Account.query.filter_by(email=args["email"]).first() token = None if account is None: if dify_config.ALLOW_REGISTER: - token = AccountService.send_reset_password_email(email=args["email"]) + token = AccountService.send_reset_password_email( + email=args["email"], language=args["language"] or "en-US" + ) else: raise NotAllowedRegister() elif account: try: - token = AccountService.send_reset_password_email(account=account, email=args["email"]) + token = AccountService.send_reset_password_email( + account=account, email=args["email"], language=args["language"] or "en-US" + ) except RateLimitExceededError: logging.warning(f"Rate limit exceeded for email: {args['email']}") raise PasswordResetRateLimitExceededError() diff --git a/api/controllers/console/auth/login.py b/api/controllers/console/auth/login.py index 53278f44bd..a419561d42 100644 --- a/api/controllers/console/auth/login.py +++ b/api/controllers/console/auth/login.py @@ -81,16 +81,19 @@ class ResetPasswordSendEmailApi(Resource): def post(self): parser = reqparse.RequestParser() parser.add_argument("email", type=email, required=True, location="json") + parser.add_argument("language", type=str, required=False, location="json") args = parser.parse_args() account = AccountService.get_user_through_email(args["email"]) if account is None: if dify_config.ALLOW_REGISTER: - token = AccountService.send_reset_password_email(email=args["email"]) + token = AccountService.send_reset_password_email( + email=args["email"], language=args["language"] or "en-US" + ) else: raise NotAllowedRegister() else: - token = AccountService.send_reset_password_email(account=account) + token = AccountService.send_reset_password_email(account=account, language=args["language"]) return {"result": "success", "data": token} @@ -100,16 +103,19 @@ class EmailCodeLoginSendEmailApi(Resource): def post(self): parser = reqparse.RequestParser() parser.add_argument("email", type=email, required=True, location="json") + parser.add_argument("language", type=str, required=False, location="json") args = parser.parse_args() account = AccountService.get_user_through_email(args["email"]) if account is None: if dify_config.ALLOW_REGISTER: - token = AccountService.send_email_code_login_email(email=args["email"]) + token = AccountService.send_email_code_login_email( + email=args["email"], language=args["language"] or "en-US" + ) else: raise NotAllowedRegister() else: - token = AccountService.send_email_code_login_email(account=account) + token = AccountService.send_email_code_login_email(account=account, language=args["language"]) return {"result": "success", "data": token} diff --git a/api/services/account_service.py b/api/services/account_service.py index 59be3f7199..53e983d2e5 100644 --- a/api/services/account_service.py +++ b/api/services/account_service.py @@ -255,9 +255,11 @@ class AccountService: return AccountService.load_user(account_id) @classmethod - def send_reset_password_email(cls, account: Optional[Account] = None, email: Optional[str] = None): + def send_reset_password_email( + cls, account: Optional[Account] = None, email: Optional[str] = None, language: Optional[str] = "en-US" + ): account_email = account.email if account else email - account_language = account.interface_language if account else languages[0] + account_language = account.interface_language if account else language if cls.reset_password_rate_limiter.is_rate_limited(account_email): raise RateLimitExceededError(f"Rate limit exceeded for email: {account_email}. Please try again later.") @@ -283,7 +285,9 @@ class AccountService: return TokenManager.get_token_data(token, "reset_password") @classmethod - def send_email_code_login_email(cls, account: Optional[Account] = None, email: Optional[str] = None): + def send_email_code_login_email( + cls, account: Optional[Account] = None, email: Optional[str] = None, language: Optional[str] = "en-US" + ): if cls.email_code_login_rate_limiter.is_rate_limited(email): raise RateLimitExceededError(f"Rate limit exceeded for email: {email}. Please try again later.") @@ -292,7 +296,7 @@ class AccountService: account=account, email=email, token_type="email_code_login", additional_data={"code": code} ) send_email_code_login_mail_task.delay( - language=account.interface_language if account else languages[0], + language=account.interface_language if account else language, to=account.email if account else email, code=code, )