diff --git a/web/app/signin/components/__tests__/sso-auth.spec.tsx b/web/app/signin/components/__tests__/sso-auth.spec.tsx new file mode 100644 index 00000000000..331768ae6b2 --- /dev/null +++ b/web/app/signin/components/__tests__/sso-auth.spec.tsx @@ -0,0 +1,100 @@ +import { render, screen, waitFor } from '@testing-library/react' +import userEvent from '@testing-library/user-event' +import { beforeEach, describe, expect, it, vi } from 'vite-plus/test' +import SSOAuth from '../sso-auth' + +const mocks = vi.hoisted(() => ({ + push: vi.fn(), + toastError: vi.fn(), +})) + +vi.mock('@/next/navigation', () => ({ + useRouter: () => ({ push: mocks.push }), + useSearchParams: () => new URLSearchParams(), +})) + +vi.mock('@/app/notifications', () => ({ + toast: { error: mocks.toastError }, +})) + +const jsonResponse = (body: unknown, status = 200) => + new Response(JSON.stringify(body), { + status, + headers: { 'Content-Type': 'application/json' }, + }) + +const clickSSOButton = async () => { + const user = userEvent.setup() + const button = screen.getByRole('button', { name: 'login.withSSO' }) + await user.click(button) + return button +} + +describe('SSOAuth', () => { + beforeEach(() => { + vi.restoreAllMocks() + vi.clearAllMocks() + }) + + it.each(['saml', 'oidc', 'oauth2'] as const)( + 'should redirect to the %s provider url on success', + async (protocol) => { + const fetchSpy = vi + .spyOn(globalThis, 'fetch') + .mockResolvedValue(jsonResponse({ url: 'https://idp.example.com/login', state: 'state' })) + render() + + await clickSSOButton() + + await waitFor(() => expect(mocks.push).toHaveBeenCalledWith('https://idp.example.com/login')) + expect(String((fetchSpy.mock.calls[0]![0] as Request).url)).toContain( + `/enterprise/sso/${protocol}/login`, + ) + expect(mocks.toastError).not.toHaveBeenCalled() + }, + ) + + it.each(['saml', 'oidc', 'oauth2'] as const)( + 'should show an error and re-enable the button when the %s request fails', + async (protocol) => { + vi.spyOn(globalThis, 'fetch').mockRejectedValue(new TypeError('Failed to fetch')) + render() + + const button = await clickSSOButton() + + await waitFor(() => expect(mocks.toastError).toHaveBeenCalledWith('login.error.ssoFailed')) + expect(mocks.toastError).toHaveBeenCalledTimes(1) + expect(button).toBeEnabled() + expect(mocks.push).not.toHaveBeenCalled() + }, + ) + + it('should show an error when the server responds without a JSON error message', async () => { + vi.spyOn(globalThis, 'fetch').mockResolvedValue( + new Response('Bad Gateway', { + status: 502, + headers: { 'Content-Type': 'text/html' }, + }), + ) + render() + + const button = await clickSSOButton() + + await waitFor(() => expect(button).toBeEnabled()) + expect(mocks.toastError).toHaveBeenCalledTimes(1) + expect(mocks.toastError).toHaveBeenCalledWith('login.error.ssoFailed') + }) + + it('should only show the server message when the error response carries one', async () => { + vi.spyOn(globalThis, 'fetch').mockResolvedValue( + jsonResponse({ message: 'SSO provider unavailable' }, 500), + ) + render() + + const button = await clickSSOButton() + + await waitFor(() => expect(button).toBeEnabled()) + expect(mocks.toastError).toHaveBeenCalledTimes(1) + expect(mocks.toastError).toHaveBeenCalledWith('SSO provider unavailable') + }) +}) diff --git a/web/app/signin/components/sso-auth.tsx b/web/app/signin/components/sso-auth.tsx index 31d52d019ea..2f035ff88b6 100644 --- a/web/app/signin/components/sso-auth.tsx +++ b/web/app/signin/components/sso-auth.tsx @@ -13,6 +13,18 @@ type SSOAuthProps = { protocol: SsoProtocol } +// The request layer already toasts HTTP errors whose JSON body carries a message. +const hasNotifiedRequestError = async (error: unknown) => { + if (!(error instanceof Response) || error.status === 401) return false + try { + const body: unknown = await error.clone().json() + if (!body || typeof body !== 'object') return false + return ('message' in body && !!body.message) || ('error' in body && !!body.error) + } catch { + return false + } +} + const SSOAuth: FC = ({ protocol }) => { const router = useRouter() const { t } = useTranslation(['login']) @@ -21,6 +33,11 @@ const SSOAuth: FC = ({ protocol }) => { const [isLoading, setIsLoading] = useState(false) + const handleSSOError = async (error: unknown) => { + if (await hasNotifiedRequestError(error)) return + toast.error(t(($) => $['error.ssoFailed'], { ns: 'login' })) + } + const handleSSOLogin = () => { setIsLoading(true) if (protocol === zSsoProtocol.enum.saml) { @@ -28,6 +45,7 @@ const SSOAuth: FC = ({ protocol }) => { .then((res) => { router.push(res.url) }) + .catch(handleSSOError) .finally(() => { setIsLoading(false) }) @@ -37,6 +55,7 @@ const SSOAuth: FC = ({ protocol }) => { document.cookie = `user-oidc-state=${res.state};Path=/` router.push(res.url) }) + .catch(handleSSOError) .finally(() => { setIsLoading(false) }) @@ -46,6 +65,7 @@ const SSOAuth: FC = ({ protocol }) => { document.cookie = `user-oauth2-state=${res.state};Path=/` router.push(res.url) }) + .catch(handleSSOError) .finally(() => { setIsLoading(false) }) diff --git a/web/i18n/locales/ar-TN/login.json b/web/i18n/locales/ar-TN/login.json index 28e184eff74..3b04e6a872a 100644 --- a/web/i18n/locales/ar-TN/login.json +++ b/web/i18n/locales/ar-TN/login.json @@ -31,6 +31,7 @@ "error.passwordEmpty": "كلمة المرور مطلوبة", "error.passwordInvalid": "يجب أن تحتوي كلمة المرور على أحرف وأرقام، ويجب أن يكون الطول أكبر من 8", "error.registrationNotAllowed": "الحساب غير موجود. يرجى الاتصال بمسؤول النظام للتسجيل.", + "error.ssoFailed": "فشل تسجيل الدخول عبر SSO. يرجى المحاولة مرة أخرى أو الاتصال بالمسؤول.", "explore": "استكشاف Dify", "forget": "نسيت كلمة المرور؟", "forgotPassword": "نسيت كلمة المرور؟", diff --git a/web/i18n/locales/az-AZ/login.json b/web/i18n/locales/az-AZ/login.json index 6d6adbeb54d..aaf3c0e4abc 100644 --- a/web/i18n/locales/az-AZ/login.json +++ b/web/i18n/locales/az-AZ/login.json @@ -31,6 +31,7 @@ "error.passwordEmpty": "Parol tələb olunur", "error.passwordInvalid": "Parolda hərflər və rəqəmlər olmalı, uzunluğu isə 8 simvoldan çox olmalıdır", "error.registrationNotAllowed": "Hesab tapılmadı. Qeydiyyatdan keçmək üçün sistem inzibatçısı ilə əlaqə saxlayın.", + "error.ssoFailed": "SSO ilə giriş uğursuz oldu. Yenidən cəhd edin və ya administratorla əlaqə saxlayın.", "explore": "Dify ilə tanış ol", "forget": "Parolunuzu unutmusunuz?", "forgotPassword": "Parolunuzu unutmusunuz?", diff --git a/web/i18n/locales/de-DE/login.json b/web/i18n/locales/de-DE/login.json index be59c1cbeda..00541e80e76 100644 --- a/web/i18n/locales/de-DE/login.json +++ b/web/i18n/locales/de-DE/login.json @@ -31,6 +31,7 @@ "error.passwordEmpty": "Passwort wird benötigt", "error.passwordInvalid": "Das Passwort muss Buchstaben und Zahlen enthalten und länger als 8 Zeichen sein", "error.registrationNotAllowed": "Konto nicht gefunden. Bitte wenden Sie sich an den Systemadministrator, um sich zu registrieren.", + "error.ssoFailed": "SSO-Anmeldung fehlgeschlagen. Bitte versuchen Sie es erneut oder wenden Sie sich an Ihren Administrator.", "explore": "Dify erkunden", "forget": "Passwort vergessen?", "forgotPassword": "Passwort vergessen?", diff --git a/web/i18n/locales/en-US/login.json b/web/i18n/locales/en-US/login.json index f74820b01e1..dcf7b48cb8d 100644 --- a/web/i18n/locales/en-US/login.json +++ b/web/i18n/locales/en-US/login.json @@ -31,6 +31,7 @@ "error.passwordEmpty": "Password is required", "error.passwordInvalid": "Password must contain letters and numbers, and the length must be greater than 8", "error.registrationNotAllowed": "Account not found. Please contact the system admin to register.", + "error.ssoFailed": "SSO login failed. Please try again or contact your administrator.", "explore": "Explore Dify", "forget": "Forgot your password?", "forgotPassword": "Forgot your password?", diff --git a/web/i18n/locales/es-ES/login.json b/web/i18n/locales/es-ES/login.json index 229e61039d4..40457caea9d 100644 --- a/web/i18n/locales/es-ES/login.json +++ b/web/i18n/locales/es-ES/login.json @@ -31,6 +31,7 @@ "error.passwordEmpty": "Se requiere una contraseña", "error.passwordInvalid": "La contraseña debe contener letras y números, y tener una longitud mayor a 8", "error.registrationNotAllowed": "Cuenta no encontrada. Póngase en contacto con el administrador del sistema para registrarse.", + "error.ssoFailed": "Error al iniciar sesión con SSO. Inténtelo de nuevo o póngase en contacto con su administrador.", "explore": "Explorar Dify", "forget": "¿Olvidaste tu contraseña?", "forgotPassword": "¿Olvidaste tu contraseña?", diff --git a/web/i18n/locales/fa-IR/login.json b/web/i18n/locales/fa-IR/login.json index 18f72ea0a9d..443dd13c3f8 100644 --- a/web/i18n/locales/fa-IR/login.json +++ b/web/i18n/locales/fa-IR/login.json @@ -31,6 +31,7 @@ "error.passwordEmpty": "رمز عبور لازم است", "error.passwordInvalid": "رمز عبور باید شامل حروف و اعداد باشد و طول آن بیشتر از ۸ کاراکتر باشد", "error.registrationNotAllowed": "حساب پیدا نشد. لطفا برای ثبت نام با مدیر سیستم تماس حاصل فرمایید.", + "error.ssoFailed": "ورود با SSO ناموفق بود. لطفاً دوباره تلاش کنید یا با مدیر سیستم تماس بگیرید.", "explore": "کاوش Dify", "forget": "رمز عبور خود را فراموش کرده‌اید؟", "forgotPassword": "رمز عبور خود را فراموش کرده‌اید؟", diff --git a/web/i18n/locales/fr-FR/login.json b/web/i18n/locales/fr-FR/login.json index 115bb81c0d3..f3ff1b80ccd 100644 --- a/web/i18n/locales/fr-FR/login.json +++ b/web/i18n/locales/fr-FR/login.json @@ -31,6 +31,7 @@ "error.passwordEmpty": "Un mot de passe est requis", "error.passwordInvalid": "Le mot de passe doit contenir des lettres et des chiffres, et la longueur doit être supérieure à 8.", "error.registrationNotAllowed": "Compte introuvable. Veuillez contacter l’administrateur système pour vous inscrire.", + "error.ssoFailed": "Échec de la connexion SSO. Veuillez réessayer ou contacter votre administrateur.", "explore": "Explorez Dify", "forget": "Mot de passe oublié ?", "forgotPassword": "Mot de passe oublié?", diff --git a/web/i18n/locales/hi-IN/login.json b/web/i18n/locales/hi-IN/login.json index cb18bd09f49..e5fd91e9a04 100644 --- a/web/i18n/locales/hi-IN/login.json +++ b/web/i18n/locales/hi-IN/login.json @@ -31,6 +31,7 @@ "error.passwordEmpty": "पासवर्ड आवश्यक है", "error.passwordInvalid": "पासवर्ड में अक्षर और अंक होने चाहिए, और लंबाई 8 से अधिक होनी चाहिए", "error.registrationNotAllowed": "खाता नहीं मिला. रजिस्टर करने के लिए कृपया सिस्टम एडमिन से संपर्क करें।", + "error.ssoFailed": "SSO लॉगिन विफल रहा। कृपया पुनः प्रयास करें या अपने व्यवस्थापक से संपर्क करें।", "explore": "Dify का अन्वेषण करें", "forget": "क्या आप पासवर्ड भूल गए?", "forgotPassword": "क्या आपने अपना पासवर्ड भूल गए हैं?", diff --git a/web/i18n/locales/id-ID/login.json b/web/i18n/locales/id-ID/login.json index 62849a2462e..4cf103d0927 100644 --- a/web/i18n/locales/id-ID/login.json +++ b/web/i18n/locales/id-ID/login.json @@ -31,6 +31,7 @@ "error.passwordEmpty": "Kata sandi diperlukan", "error.passwordInvalid": "Kata sandi harus berisi huruf dan angka, dan panjangnya harus lebih besar dari 8", "error.registrationNotAllowed": "Akun tidak ditemukan. Silakan hubungi admin sistem untuk mendaftar.", + "error.ssoFailed": "Login SSO gagal. Silakan coba lagi atau hubungi administrator Anda.", "explore": "Jelajahi Dify", "forget": "Lupa Kata Sandi Anda?", "forgotPassword": "Lupa Kata Sandi Anda?", diff --git a/web/i18n/locales/it-IT/login.json b/web/i18n/locales/it-IT/login.json index 726ea3e35c3..285db98bf29 100644 --- a/web/i18n/locales/it-IT/login.json +++ b/web/i18n/locales/it-IT/login.json @@ -31,6 +31,7 @@ "error.passwordEmpty": "La password è obbligatoria", "error.passwordInvalid": "La password deve contenere lettere e numeri, e la lunghezza deve essere maggiore di 8", "error.registrationNotAllowed": "Account non trovato. Si prega di contattare l'amministratore di sistema per registrarsi.", + "error.ssoFailed": "Accesso SSO non riuscito. Riprova o contatta l'amministratore.", "explore": "Esplora Dify", "forget": "Hai dimenticato la password?", "forgotPassword": "Hai dimenticato la password?", diff --git a/web/i18n/locales/ja-JP/login.json b/web/i18n/locales/ja-JP/login.json index 49e24fd004d..848bc3312c7 100644 --- a/web/i18n/locales/ja-JP/login.json +++ b/web/i18n/locales/ja-JP/login.json @@ -31,6 +31,7 @@ "error.passwordEmpty": "パスワードは必須です", "error.passwordInvalid": "パスワードは文字と数字を含み、長さは 8 以上である必要があります", "error.registrationNotAllowed": "アカウントが見つかりません。登録するためにシステム管理者に連絡してください。", + "error.ssoFailed": "SSO ログインに失敗しました。もう一度お試しいただくか、管理者にお問い合わせください。", "explore": "Dify を探索する", "forget": "パスワードをお忘れですか?", "forgotPassword": "パスワードを忘れましたか?", diff --git a/web/i18n/locales/ko-KR/login.json b/web/i18n/locales/ko-KR/login.json index 8e8a64d15e3..e27229246be 100644 --- a/web/i18n/locales/ko-KR/login.json +++ b/web/i18n/locales/ko-KR/login.json @@ -31,6 +31,7 @@ "error.passwordEmpty": "비밀번호를 입력하세요.", "error.passwordInvalid": "비밀번호는 문자와 숫자를 포함하고 8 자 이상이어야 합니다.", "error.registrationNotAllowed": "계정을 찾을 수 없습니다. 등록하려면 시스템 관리자에게 문의하십시오.", + "error.ssoFailed": "SSO 로그인에 실패했습니다. 다시 시도하거나 관리자에게 문의하세요.", "explore": "Dify 를 탐색하세요", "forget": "비밀번호를 잊으셨나요?", "forgotPassword": "비밀번호를 잊으셨나요?", diff --git a/web/i18n/locales/lo-LA/login.json b/web/i18n/locales/lo-LA/login.json index de71953953b..69b7aab440d 100644 --- a/web/i18n/locales/lo-LA/login.json +++ b/web/i18n/locales/lo-LA/login.json @@ -31,6 +31,7 @@ "error.passwordEmpty": "ກະລຸນາປ້ອນລະຫັດຜ່ານ", "error.passwordInvalid": "ລະຫັດຜ່ານຕ້ອງປະກອບມີຕົວອັກສອນ ແລະ ຕົວເລກ, ແລະ ຕ້ອງມີຄວາມຍາວຫຼາຍກວ່າ 8 ຕົວອັກສອນ", "error.registrationNotAllowed": "ບໍ່ພົບບັນຊີ. ກະລຸນາຕິດຕໍ່ຜູ້ດູແລລະບົບເພື່ອລົງທະບຽນ.", + "error.ssoFailed": "ການເຂົ້າສູ່ລະບົບ SSO ລົ້ມເຫຼວ. ກະລຸນາລອງໃໝ່ ຫຼື ຕິດຕໍ່ຜູ້ດູແລລະບົບຂອງທ່ານ.", "explore": "ສຳຫຼວດ Dify", "forget": "ລືມລະຫັດຜ່ານ?", "forgotPassword": "ລືມລະຫັດຜ່ານ?", diff --git a/web/i18n/locales/nl-NL/login.json b/web/i18n/locales/nl-NL/login.json index 983f2911a8d..e552c1c97c8 100644 --- a/web/i18n/locales/nl-NL/login.json +++ b/web/i18n/locales/nl-NL/login.json @@ -31,6 +31,7 @@ "error.passwordEmpty": "Password is required", "error.passwordInvalid": "Password must contain letters and numbers, and the length must be greater than 8", "error.registrationNotAllowed": "Account not found. Please contact the system admin to register.", + "error.ssoFailed": "SSO-aanmelding mislukt. Probeer het opnieuw of neem contact op met je beheerder.", "explore": "Explore Dify", "forget": "Forgot your password?", "forgotPassword": "Forgot your password?", diff --git a/web/i18n/locales/pl-PL/login.json b/web/i18n/locales/pl-PL/login.json index 64c44fdbc03..1841cf639ca 100644 --- a/web/i18n/locales/pl-PL/login.json +++ b/web/i18n/locales/pl-PL/login.json @@ -31,6 +31,7 @@ "error.passwordEmpty": "Hasło jest wymagane", "error.passwordInvalid": "Hasło musi zawierać litery i cyfry, a jego długość musi być większa niż 8", "error.registrationNotAllowed": "Nie znaleziono konta. Skontaktuj się z administratorem systemu, aby się zarejestrować.", + "error.ssoFailed": "Logowanie SSO nie powiodło się. Spróbuj ponownie lub skontaktuj się z administratorem.", "explore": "Odkryj Dify", "forget": "Zapomniałeś hasła?", "forgotPassword": "Zapomniałeś hasła?", diff --git a/web/i18n/locales/pt-BR/login.json b/web/i18n/locales/pt-BR/login.json index 7dd4ad72861..dac67f3cdac 100644 --- a/web/i18n/locales/pt-BR/login.json +++ b/web/i18n/locales/pt-BR/login.json @@ -31,6 +31,7 @@ "error.passwordEmpty": "A senha é obrigatória", "error.passwordInvalid": "A senha deve conter letras e números e ter um comprimento maior que 8", "error.registrationNotAllowed": "Conta não encontrada. Entre em contato com o administrador do sistema para se registrar.", + "error.ssoFailed": "Falha no login via SSO. Tente novamente ou entre em contato com o administrador.", "explore": "Explorar o Dify", "forget": "Esqueceu sua senha?", "forgotPassword": "Esqueceu sua senha?", diff --git a/web/i18n/locales/ro-RO/login.json b/web/i18n/locales/ro-RO/login.json index 88d41b1f748..fb84c903aa3 100644 --- a/web/i18n/locales/ro-RO/login.json +++ b/web/i18n/locales/ro-RO/login.json @@ -31,6 +31,7 @@ "error.passwordEmpty": "Parola este obligatorie", "error.passwordInvalid": "Parola trebuie să conțină litere și cifre, iar lungimea trebuie să fie mai mare de 8 caractere", "error.registrationNotAllowed": "Contul nu a fost găsit. Vă rugăm să contactați administratorul de sistem pentru a vă înregistra.", + "error.ssoFailed": "Autentificarea SSO a eșuat. Încercați din nou sau contactați administratorul.", "explore": "Explorează Dify", "forget": "Ai uitat parola?", "forgotPassword": "Ați uitat parola?", diff --git a/web/i18n/locales/ru-RU/login.json b/web/i18n/locales/ru-RU/login.json index 9d682727109..2930c307091 100644 --- a/web/i18n/locales/ru-RU/login.json +++ b/web/i18n/locales/ru-RU/login.json @@ -31,6 +31,7 @@ "error.passwordEmpty": "Пароль обязателен", "error.passwordInvalid": "Пароль должен содержать буквы и цифры, а длина должна быть больше 8", "error.registrationNotAllowed": "Аккаунт не найден. Пожалуйста, свяжитесь с системным администратором для регистрации.", + "error.ssoFailed": "Не удалось войти через SSO. Попробуйте ещё раз или обратитесь к администратору.", "explore": "Изучить Dify", "forget": "Забыли пароль?", "forgotPassword": "Забыли пароль?", diff --git a/web/i18n/locales/sl-SI/login.json b/web/i18n/locales/sl-SI/login.json index 4b587835079..053dcc912a5 100644 --- a/web/i18n/locales/sl-SI/login.json +++ b/web/i18n/locales/sl-SI/login.json @@ -31,6 +31,7 @@ "error.passwordEmpty": "Geslo je obvezno", "error.passwordInvalid": "Geslo mora vsebovati črke in številke, dolžina pa mora biti več kot 8 znakov", "error.registrationNotAllowed": "Računa ni mogoče najti. Za registracijo se obrnite na skrbnika sistema.", + "error.ssoFailed": "Prijava SSO ni uspela. Poskusite znova ali se obrnite na skrbnika.", "explore": "Razišči Dify", "forget": "Ste pozabili geslo?", "forgotPassword": "Ste pozabili geslo?", diff --git a/web/i18n/locales/th-TH/login.json b/web/i18n/locales/th-TH/login.json index ca033d2de9c..52be3be2780 100644 --- a/web/i18n/locales/th-TH/login.json +++ b/web/i18n/locales/th-TH/login.json @@ -31,6 +31,7 @@ "error.passwordEmpty": "ต้องใช้รหัสผ่าน", "error.passwordInvalid": "รหัสผ่านต้องมีตัวอักษรและตัวเลข และความยาวต้องมากกว่า 8", "error.registrationNotAllowed": "ไม่พบบัญชี โปรดติดต่อผู้ดูแลระบบเพื่อลงทะเบียน", + "error.ssoFailed": "เข้าสู่ระบบด้วย SSO ไม่สำเร็จ โปรดลองอีกครั้งหรือติดต่อผู้ดูแลระบบของคุณ", "explore": "สํารวจ Dify", "forget": "ลืมรหัสผ่านใช่ไหม", "forgotPassword": "ลืมรหัสผ่านใช่ไหม", diff --git a/web/i18n/locales/tr-TR/login.json b/web/i18n/locales/tr-TR/login.json index 931b743998d..46f1d0e5f6b 100644 --- a/web/i18n/locales/tr-TR/login.json +++ b/web/i18n/locales/tr-TR/login.json @@ -31,6 +31,7 @@ "error.passwordEmpty": "Şifre gereklidir", "error.passwordInvalid": "Şifre harf ve rakamlardan oluşmalı ve uzunluğu 8 karakterden fazla olmalıdır", "error.registrationNotAllowed": "Hesap bulunamadı. Kayıt olmak için lütfen sistem yöneticisi ile iletişime geçin.", + "error.ssoFailed": "SSO ile giriş başarısız oldu. Lütfen tekrar deneyin veya yöneticinize başvurun.", "explore": "Dify'yi Keşfet", "forget": "Şifrenizi mi unuttunuz?", "forgotPassword": "Şifrenizi mi unuttunuz?", diff --git a/web/i18n/locales/uk-UA/login.json b/web/i18n/locales/uk-UA/login.json index d8821813dc7..646b95797ea 100644 --- a/web/i18n/locales/uk-UA/login.json +++ b/web/i18n/locales/uk-UA/login.json @@ -31,6 +31,7 @@ "error.passwordEmpty": "Пароль є обов’язковим", "error.passwordInvalid": "Пароль повинен містити літери та цифри, а довжина повинна бути більшою за 8", "error.registrationNotAllowed": "Аккаунт не знайдено. Будь ласка, зверніться до адміністратора системи для реєстрації.", + "error.ssoFailed": "Не вдалося увійти через SSO. Спробуйте ще раз або зверніться до адміністратора.", "explore": "Досліджуйте Dify", "forget": "Забули пароль?", "forgotPassword": "Забули пароль?", diff --git a/web/i18n/locales/vi-VN/login.json b/web/i18n/locales/vi-VN/login.json index e0d0eb0c0e5..49f960dd92a 100644 --- a/web/i18n/locales/vi-VN/login.json +++ b/web/i18n/locales/vi-VN/login.json @@ -31,6 +31,7 @@ "error.passwordEmpty": "Vui lòng nhập mật khẩu", "error.passwordInvalid": "Mật khẩu phải chứa cả chữ và số, và có độ dài ít nhất 8 ký tự", "error.registrationNotAllowed": "Không tìm thấy tài khoản. Vui lòng liên hệ với quản trị viên hệ thống để đăng ký.", + "error.ssoFailed": "Đăng nhập SSO không thành công. Vui lòng thử lại hoặc liên hệ với quản trị viên.", "explore": "Khám phá Dify", "forget": "Quên mật khẩu?", "forgotPassword": "Quên mật khẩu?", diff --git a/web/i18n/locales/zh-Hans/login.json b/web/i18n/locales/zh-Hans/login.json index 021005bf9fc..57a3e12d424 100644 --- a/web/i18n/locales/zh-Hans/login.json +++ b/web/i18n/locales/zh-Hans/login.json @@ -31,6 +31,7 @@ "error.passwordEmpty": "密码不能为空", "error.passwordInvalid": "密码必须包含字母和数字,且长度不小于 8 位", "error.registrationNotAllowed": "账户不存在,请联系系统管理员注册账户", + "error.ssoFailed": "SSO 登录失败。请重试或联系管理员。", "explore": "探索 Dify", "forget": "忘记密码?", "forgotPassword": "忘记密码?", diff --git a/web/i18n/locales/zh-Hant/login.json b/web/i18n/locales/zh-Hant/login.json index a9b01ed753e..2c5a2289838 100644 --- a/web/i18n/locales/zh-Hant/login.json +++ b/web/i18n/locales/zh-Hant/login.json @@ -31,6 +31,7 @@ "error.passwordEmpty": "密碼不能為空", "error.passwordInvalid": "密碼必須包含字母和數字,且長度不小於 8 位", "error.registrationNotAllowed": "找不到帳戶。請聯繫系統管理員進行註冊。", + "error.ssoFailed": "SSO 登入失敗。請重試或聯絡管理員。", "explore": "探索 Dify", "forget": "忘記密碼?", "forgotPassword": "忘記密碼?", diff --git a/web/i18n/resources.generated.d.ts b/web/i18n/resources.generated.d.ts index 3417ed31d9f..86dd9c7b6fc 100644 --- a/web/i18n/resources.generated.d.ts +++ b/web/i18n/resources.generated.d.ts @@ -3217,6 +3217,7 @@ export default interface Resources { 'error.passwordEmpty': 'Password is required' 'error.passwordInvalid': 'Password must contain letters and numbers, and the length must be greater than 8' 'error.registrationNotAllowed': 'Account not found. Please contact the system admin to register.' + 'error.ssoFailed': 'SSO login failed. Please try again or contact your administrator.' explore: 'Explore Dify' forget: 'Forgot your password?' forgotPassword: 'Forgot your password?'