feat: WC2026 赛事 seed、生产上线初始化脚本与目录归档

重构 seed 为 WC2026 72 场小组赛与 48 强优胜盘;新增 production 模式仅保留 admin 与赛事示例;提供 prod-init-db 全量重置脚本;管理端 i18n 分包与赛事归档能力。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-12 18:17:00 +08:00
parent 8f14e85ebd
commit e7e938f261
94 changed files with 12332 additions and 976 deletions

View File

@@ -273,12 +273,20 @@ export const adminPagesMs: Record<string, string> = {
'league.status.PUBLISHED': 'Diterbitkan',
'league.status.UNPUBLISHED': 'Tidak diterbitkan',
'league.btn.unpublish': 'Nyahterbit',
'league.confirm_unpublish': 'Pemain tidak lagi melihat kejohanan ini; anda masih boleh edit dan terbitkan semula di admin. Teruskan?',
'msg.league_published': 'Kejohanan diterbitkan',
'msg.league_unpublished': 'Kejohanan dinyahterbit',
'match.btn.unpublish': 'Nyahterbit',
'match.confirm_unpublish': 'Perlawanan kembali ke draf: tersembunyi dari pemain dan tiada pertaruhan baharu; pertaruhan belum selesai kekal. Teruskan?',
'msg.match_unpublished': 'Perlawanan dinyahterbit',
'match.hint.edit_published': 'Diterbitkan: edit masa mula, pilihan utama, nama paparan; tertutup/selesai dikunci.',
'match.expand_league_hint': 'Kembangkan liga untuk urus perlawanan; odds juara di tab Odds juara.',
'match.expand_outright_hint': 'Kembangkan liga untuk sunting odds juara; pasukan perlawanan disegerakkan auto, boleh tambah pasukan belum dijadualkan.',
'outright.odds_only_hint': 'Pasukan daripada perlawanan disegerakkan auto; boleh tambah pasukan manual dan sunting odds di sini.',
'outright.odds_only_hint': 'Pasukan daripada perlawanan disegerakkan auto; boleh tambah pasukan manual dan sunting odds di sini. Pasaran juara ikut terbitan liga — tiada langkah terbit berasingan.',
'outright.league_unpublished_hint': 'Liga belum diterbitkan. Tetapkan liga kepada Diterbitkan di halaman ini untuk membuka pertaruhan juara secara automatik.',
'outright.unsettled_fixtures_hint': '{n} perlawanan dalam liga ini masih belum diselesaikan. Selesaikan dahulu sebelum juara.',
'outright.btn.reopen': 'Buka semula pertaruhan',
'outright.confirm_reopen': 'Membuka semula akan menerima pertaruhan juara baharu. Teruskan?',
'outright.fixture_sync_added': '{n} pasukan disegerakkan auto daripada perlawanan',
'outright.col.teams_from_fixtures': 'Pasukan (daripada perlawanan)',
'outright.col.teams_total': 'Pasukan odds juara',
@@ -415,7 +423,27 @@ export const adminPagesMs: Record<string, string> = {
'match.import_start': 'Import',
'match.import_json_ph': '{"matches":[...]}',
'match.delete_confirm_title': 'Padam perlawanan',
'match.delete_confirm_body': 'Padam "{title}"? Hanya draf tanpa pertaruhan.',
'match.delete_confirm_body': 'Padam "{title}"? Data kekal tetapi disembunyikan.',
'archive.match_title': 'Padam perlawanan',
'archive.league_title': 'Padam liga',
'archive.target': 'Perlawanan: {title}',
'archive.league_target': 'Liga: {name}',
'archive.soft_delete_hint': 'Padam lembut: data kekal, disembunyikan dari senarai.',
'archive.pending_summary': '{count} pertaruhan tertunda, stake {stake}',
'archive.refund_pending': 'Bayar balik pertaruhan tertunda',
'archive.parlay_void_hint': 'Slip parlay yang melibatkan perlawanan ini akan dibatalkan sepenuhnya.',
'archive.force_delete': 'Padam paksa',
'archive.msg_done': 'Dipadam',
'archive.msg_done_refund': 'Dipadam; {n} pertaruhan dibayar balik',
'archive.league_hint': 'Liga hanya boleh dipadam apabila semua perlawanan dan outright selesai tanpa pertaruhan tertunda.',
'archive.league_blocked': 'Masih ada perlawanan belum selesai atau pertaruhan tertunda.',
'archive.league_ready': 'Liga ini boleh dipadam; semua acara anak akan disembunyikan.',
'archive.league_confirm': 'Padam liga',
'archive.league_done': 'Liga dipadam',
'archive.warning.PENDING_BETS': 'Terdapat pertaruhan tertunda',
'archive.warning.UNSETTLED_MATCH': 'Perlawanan belum dalam status akhir',
'archive.warning.PREVIEW_BATCH': 'Terdapat batch pratonton penyelesaian',
'common.type': 'Jenis',
'match.ph.league_en': 'FIFA World Cup 2026',
'match.ph.league_zh': 'Piala Dunia 2026',
'match.ph.kickoff': '2026-06-11T19:00:00Z',
@@ -528,6 +556,12 @@ export const adminPagesMs: Record<string, string> = {
'settlement.preview_failed': 'Gagal menjana pratonton penyelesaian',
'settlement.err_score_not_recorded': 'Sila masukkan skor separuh masa dan penuh masa sebelum penyelesaian',
'settlement.must_close_first': 'Tutup pertaruhan sebelum penyelesaian',
'settlement.outright.page_title': 'Penyelesaian juara',
'settlement.outright.title': 'Juara outright',
'settlement.outright.winner': 'Pasukan juara',
'settlement.outright.winner_ph': 'Pilih juara',
'settlement.outright.preview_hint': 'Pilih juara, pratonton bayaran, kemudian sahkan penyelesaian',
'settlement.outright.winner_required': 'Sila pilih pasukan juara dahulu',
'settlement.preview_title': 'Pratonton penyelesaian',
'settlement.single_count': 'Pertaruhan tunggal',
'settlement.est_payout': 'Anggaran bayaran',
@@ -739,6 +773,9 @@ export const adminPagesMs: Record<string, string> = {
'teamLogo.kind.crest': 'Lambang',
'outright.err_country': 'Sila pilih negara',
'outright.btn.save_odds': 'Simpan semua odds',
'outright.btn.close': 'Tutup pertaruhan',
'outright.btn.settle': 'Selesaikan',
'outright.confirm_close': 'Selepas tutup, tiada pertaruhan juara baharu. Teruskan?',
'outright.btn.apply_canonical': 'Guna data jadual asas',
'msg.outright_canonical_applied': 'Odds 48 pasukan telah dikemas kini',
'outright.team_count': '{n} / {total} pasukan',
@@ -867,3 +904,5 @@ export const adminPagesMs: Record<string, string> = {
'media.refresh': 'Muat Semula',
'media.unused_count': '{n} tidak digunakan',
};
export default adminPagesMs;