feat(admin,api,player): 赛事分组管理、盘口独立页与多语言展示优化

- 管理端按联赛展示单场,新增赛事/单场流程与列表展开状态保持

- 盘口赔率迁至独立页面,保存按钮仅在有修改时高亮

- API 新增联赛列表与子场查询,按 locale 返回队名并修复编译

- 波胆其它选项与促销标签等 i18n 补齐,文案更易懂
This commit is contained in:
2026-06-04 16:25:03 +08:00
parent c68abadceb
commit cc737e2924
39 changed files with 3330 additions and 378 deletions

View File

@@ -97,16 +97,79 @@ export function countryFlagUrl(country: BuiltinCountry | string): string {
return `https://flagcdn.com/w40/${c.iso}.png`;
}
export function searchBuiltinCountries(keyword: string): BuiltinCountry[] {
/** 按后台当前语言显示国家名(下拉只显示一种语言) */
export function countryDisplayName(c: BuiltinCountry, locale: string): string {
if (locale === 'en-US') return c.nameEn;
if (locale === 'ms-MY') return countryNameMs(c);
return c.nameZh;
}
export function countryOptionLabel(c: BuiltinCountry, locale: string): string {
return `${countryDisplayName(c, locale)} (${c.code})`;
}
/** 常用国家队马来语名(无则用英文,避免与中文混排) */
const COUNTRY_MS: Partial<Record<string, string>> = {
CAN: 'Kanada',
USA: 'Amerika Syarikat',
MEX: 'Mexico',
BRA: 'Brazil',
ARG: 'Argentina',
ENG: 'England',
FRA: 'Perancis',
GER: 'Jerman',
ESP: 'Sepanyol',
POR: 'Portugal',
NED: 'Belanda',
BEL: 'Belgium',
CRO: 'Croatia',
SUI: 'Switzerland',
POL: 'Poland',
SWE: 'Sweden',
NOR: 'Norway',
DEN: 'Denmark',
JPN: 'Jepun',
KOR: 'Korea Selatan',
AUS: 'Australia',
RSA: 'Afrika Selatan',
MAR: 'Maghribi',
SEN: 'Senegal',
GHA: 'Ghana',
EGY: 'Mesir',
TUN: 'Tunisia',
ALG: 'Algeria',
KSA: 'Arab Saudi',
QAT: 'Qatar',
IRN: 'Iran',
IRQ: 'Iraq',
CHN: 'China',
THA: 'Thailand',
VIE: 'Vietnam',
IDN: 'Indonesia',
MAS: 'Malaysia',
BIH: 'Bosnia',
SCO: 'Scotland',
WAL: 'Wales',
NZL: 'New Zealand',
};
function countryNameMs(c: BuiltinCountry): string {
return COUNTRY_MS[c.code] ?? c.nameEn;
}
export function searchBuiltinCountries(keyword: string, locale = 'zh-CN'): BuiltinCountry[] {
const k = keyword.trim().toLowerCase();
if (!k) return BUILTIN_COUNTRIES;
return BUILTIN_COUNTRIES.filter(
(c) =>
return BUILTIN_COUNTRIES.filter((c) => {
const display = countryDisplayName(c, locale);
return (
c.code.toLowerCase().includes(k) ||
c.nameZh.includes(keyword.trim()) ||
c.nameEn.toLowerCase().includes(k) ||
c.iso.toLowerCase().includes(k),
);
display.toLowerCase().includes(k) ||
c.iso.toLowerCase().includes(k)
);
});
}
export function resolveCountryCode(