feat(player): 注册账号、登录双模式与移动端性能优化

注册必填 7-32 位账号,手机号区号/本地号分存;登录默认账号模式并支持切换手机号登录;Player i18n 拆包与赛事接口优化。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-12 10:56:51 +08:00
parent 83f0f380c5
commit 312c3c5816
35 changed files with 1944 additions and 1394 deletions

View File

@@ -0,0 +1,43 @@
import type { Locale } from '@thebet365/shared';
export const PLAYER_LOCALE_STORAGE_KEY = 'locale';
export type PlayerLocale = Locale;
const localeLoaders: Record<PlayerLocale, () => Promise<{ default: Record<string, unknown> }>> = {
'zh-CN': () => import('./zh-CN'),
'en-US': () => import('./en-US'),
'ms-MY': () => import('./ms-MY'),
};
export async function loadLocaleMessages(locale: PlayerLocale) {
const loader = localeLoaders[locale] ?? localeLoaders['zh-CN'];
const mod = await loader();
return mod.default;
}
const loadedLocales = new Set<PlayerLocale>();
export function markLocaleLoaded(locale: PlayerLocale) {
loadedLocales.add(locale);
}
/** 切换语言时按需加载文案包(与首屏单语言拆包配合) */
export async function ensurePlayerLocale(
composer: {
mergeLocaleMessage: (locale: string, message: Record<string, unknown>) => void;
availableLocales: string[];
},
locale: PlayerLocale,
) {
if (loadedLocales.has(locale) || composer.availableLocales.includes(locale)) return;
const messages = await loadLocaleMessages(locale);
composer.mergeLocaleMessage(locale, messages);
loadedLocales.add(locale);
}
export function readStoredLocale(): PlayerLocale {
const raw = localStorage.getItem(PLAYER_LOCALE_STORAGE_KEY) || 'zh-CN';
if (raw in localeLoaders) return raw as PlayerLocale;
return 'zh-CN';
}