diff --git a/src/i18n/locales/en.ts b/src/i18n/locales/en.ts index c8f726a..4276f63 100644 --- a/src/i18n/locales/en.ts +++ b/src/i18n/locales/en.ts @@ -20,6 +20,7 @@ export default { quickAria: 'Registration portals', invalidMobile: 'Please enter a valid mobile number', invalidCaptcha: 'Please enter the 6-digit code', + invalidOrExpired: 'The verification code is invalid or has expired.', missingSlug: 'Missing competition address. Please use the official entry link.', competitionMissing: 'This competition is unavailable or unpublished.', competitionLoadFailed: 'Unable to load this competition. Please try again later.', diff --git a/src/i18n/locales/zh-CN.ts b/src/i18n/locales/zh-CN.ts index c9542ab..d79394d 100644 --- a/src/i18n/locales/zh-CN.ts +++ b/src/i18n/locales/zh-CN.ts @@ -20,6 +20,7 @@ export default { quickAria: '快捷入口', invalidMobile: '请先填写正确手机号', invalidCaptcha: '请输入 6 位验证码', + invalidOrExpired: '验证码无效或已过期', missingSlug: '缺少赛事访问地址,请从正确入口进入', competitionMissing: '赛事不存在或未发布,请核对访问地址', competitionLoadFailed: '暂时无法加载赛事信息,请稍后重试', diff --git a/src/views/LoginView.vue b/src/views/LoginView.vue index 53313b2..43c1f63 100644 --- a/src/views/LoginView.vue +++ b/src/views/LoginView.vue @@ -181,8 +181,19 @@ function onCaptchaInput(event: Event) { captchaFieldError.value = false } +function localizePortalApiMessage(message: string): string { + if (!isEnglishLogin.value) return message + if (message === '验证码无效或已过期') return t('login.invalidOrExpired') + if (message === '赛事不存在或未发布' || message.startsWith('赛事不存在或未发布')) { + return t('login.competitionMissing') + } + const frequent = message.match(/请勿频繁发送,请\s*(\d+)\s*秒后再试/) + if (frequent) return t('login.tooFrequent', { n: frequent[1] }) + return message +} + function parseJsonErrorPayload(data: unknown): string { - return userFacingApiMessage(data, t('login.requestFailed')) + return localizePortalApiMessage(userFacingApiMessage(data, t('login.requestFailed'))) } let loginHtmlClassApplied = false @@ -264,6 +275,7 @@ async function sendCode() { mobile: m, portal: isAudienceLogin.value ? 'audience' : 'participant', competition_slug: competitionSlug.value || undefined, + lang: portalLocale.value === 'en' ? 'en' : undefined, }), }) const data: unknown = await r.json().catch(() => ({}))