diff --git a/ui/homepage/app/panel/account/MfaSetupPanel.tsx b/ui/homepage/app/panel/account/MfaSetupPanel.tsx index af039ae..58618e6 100644 --- a/ui/homepage/app/panel/account/MfaSetupPanel.tsx +++ b/ui/homepage/app/panel/account/MfaSetupPanel.tsx @@ -368,6 +368,8 @@ export default function MfaSetupPanel() { {isDisabling ? copy.disable.confirming : copy.disable.action} + + {error ?

{error}

: null} ) : (
@@ -375,75 +377,102 @@ export default function MfaSetupPanel() { {hasPendingMfa ? copy.pendingHint : copy.subtitle}

-
- {qrImage ? ( -
-

{copy.qrLabel}

-
- Authenticator QR code +
    +
  1. +

    {copy.guide.step1Title}

    +

    {copy.guide.step1Description}

    +
      +
    • {copy.guide.step1Ios}
    • +
    • {copy.guide.step1Android}
    • +
    +
  2. + +
  3. +

    {copy.guide.step2Title}

    +

    {copy.guide.step2Description}

    +
    + {qrImage ? ( +
    +
    + Authenticator QR code +
    +
    + ) : null} +
    +
    +

    {copy.secretLabel}

    + {secret} +
    + {uri ? ( +
    +

    {copy.uriLabel}

    + + {uri} + +
    + ) : null} +

    {copy.manualHint}

    +
    - ) : null} -
    -

    {copy.secretLabel}

    - {secret} -
    - {uri ? ( -
    -

    {copy.uriLabel}

    - - {uri} - -
    - ) : null} -

    {copy.manualHint}

    - -
+ -
- - setCode(event.target.value)} - placeholder={copy.codePlaceholder} - className="w-full rounded-md border border-gray-300 px-3 py-2 text-gray-900 shadow-sm focus:border-purple-500 focus:outline-none focus:ring-2 focus:ring-purple-200" - /> - -
+
  • +

    {copy.guide.step3Title}

    +

    {copy.guide.step3Description}

    +
    +
    + + setCode(event.target.value)} + placeholder={copy.codePlaceholder} + className="mt-2 w-full rounded-lg border border-gray-300 px-4 py-3 text-center text-2xl font-mono tracking-[0.6em] text-gray-900 shadow-sm focus:border-purple-500 focus:outline-none focus:ring-2 focus:ring-purple-200" + /> +
    + +
    +
  • + + + {error ?

    {error}

    : null}
    )} - {error ?

    {error}

    : null} -

    {copy.actions.help}

    {copy.actions.description}

    diff --git a/ui/homepage/i18n/translations.ts b/ui/homepage/i18n/translations.ts index f2cab8d..04a7264 100644 --- a/ui/homepage/i18n/translations.ts +++ b/ui/homepage/i18n/translations.ts @@ -683,6 +683,20 @@ export const translations: Record<'en' | 'zh', Translation> = { verifying: 'Verifying…', successTitle: 'Authenticator connected', successBody: 'Your account now requires an authenticator code at sign-in.', + guide: { + step1Title: '1. Install an authenticator app', + step1Description: + 'Download Alibaba Cloud Authenticator or Google Authenticator on your phone to get started.', + step1Ios: + 'iOS: Search for “Google Authenticator” or “Alibaba Cloud Authenticator” in the App Store and install it.', + step1Android: + 'Android: Search for “Google Authenticator” or “Alibaba Cloud Authenticator” in Google Play and install it.', + step2Title: '2. Scan the QR code to bind Google Authenticator', + step2Description: + 'Open the authenticator app and scan this QR code. Unable to scan? Enter the secret key manually.', + step3Title: '3. Enter the verification code to finish', + step3Description: 'Enter the 6-digit code generated by the authenticator app to complete binding.', + }, status: { issuedAt: 'Key generated at', confirmedAt: 'Enabled at', @@ -1033,6 +1047,16 @@ export const translations: Record<'en' | 'zh', Translation> = { verifying: '验证中…', successTitle: '认证器绑定成功', successBody: '以后登录时将需要动态验证码,账号更安全。', + guide: { + step1Title: '1 请在手机端下载阿里云 APP 或 Google Authenticator 身份验证器', + step1Description: '下载并安装验证器应用,准备开始绑定流程。', + step1Ios: '苹果:在 App Store 搜索 “Google Authenticator” 或 “阿里云 身份验证器” 并安装。', + step1Android: '安卓:在应用商店搜索 “Google Authenticator” 或 “阿里云 身份验证器” 并安装。', + step2Title: '2 使用阿里云或 Google Authenticator 身份验证器获取验证码', + step2Description: '打开验证器扫描下方二维码,如无法扫描可手动输入密钥。', + step3Title: '3 输入验证码完成绑定', + step3Description: '在验证器中查看 6 位验证码并输入完成绑定。', + }, status: { issuedAt: '密钥生成时间', confirmedAt: '启用时间',