import { t } from '@/shared/i18n' export const emailError = (email: string) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email) && new TextEncoder().encode(email).length <= 254 ? '' : t('validation.email.invalid') // 与后端 PasswordPolicy 默认档(src/config/auth.rs)对齐: // ≥8 位且含大写、小写、数字,避免用户提交后才收到服务端报错。 export const passwordError = (value: string) => { if (value.length < 8) return t('validation.password.short') if (!/[A-Z]/.test(value) || !/[a-z]/.test(value) || !/[0-9]/.test(value)) { return t('validation.password.weak') } return '' } export const usernameError = (value: string) => /^[a-zA-Z0-9_.-]{1,64}$/.test(value) ? '' : t('validation.username.invalid') export const normalizeEmail = (value: string) => value.trim().toLowerCase() export function birthError(year: string, month: string, day: string) { if (!year || !month || !day) return t('validation.birth.incomplete') const date = new Date(Date.UTC(Number(year), Number(month) - 1, Number(day))) const today = new Date() if ( Number(year) < 1900 || date.getUTCFullYear() !== Number(year) || date.getUTCMonth() !== Number(month) - 1 || date.getUTCDate() !== Number(day) || date > today ) return t('validation.birth.invalid') const age = today.getUTCFullYear() - Number(year) - (today.getUTCMonth() + 1 < Number(month) || (today.getUTCMonth() + 1 === Number(month) && today.getUTCDate() < Number(day)) ? 1 : 0) return age >= 13 ? '' : t('validation.birth.underage') }