feat(i18n): 管理端与玩家端三语支持(中/英/马来语)

- 管理后台 adminT 文案库、结算与代理端页面、表单校验
- 玩家端 vue-i18n 补全首页/公告/串关与 ms 文案
- Element Plus ms 语言包与共享 locale 工具
This commit is contained in:
2026-06-03 15:05:36 +08:00
parent 80adc0e928
commit cbfa18d1d3
63 changed files with 3081 additions and 1038 deletions

View File

@@ -8,10 +8,21 @@ import './styles.css';
const i18n = createI18n({
legacy: false,
locale: localStorage.getItem('locale') || 'zh-CN',
fallbackLocale: 'en-US',
fallbackLocale: ['en-US', 'zh-CN'],
messages: {
'zh-CN': {
nav: { home: '主页', bet: '投注', bet_history: '历史投注', wallet: '账单', profile: '我的' },
home: {
hot_matches: '热门赛事',
no_matches: '暂无赛事',
announcement_badge: '公告',
announcement_default:
'欢迎光临 TheBet365 · 足球赛事火热进行中 · 理性投注,量力而行',
banner_prev: '上一张',
banner_next: '下一张',
banner_slide: '第 {n} 张',
banner_fallback: 'Banner',
},
history: {
league_default: '足球',
stake: '投注 Stake',
@@ -69,7 +80,16 @@ const i18n = createI18n({
no_outright: '暂无冠军盘口',
cancel: '取消',
parlay_title: '串关投注',
parlay_desc: '选择3-10场比赛来创建串关投注。组合赔率相乘可赢得更多',
parlay_guide_title: '串关怎么投?',
parlay_guide_help: '查看串关说明',
parlay_desc: '选择 25 场赛前赛事组合串关2 串 1 至 5 串 1。赔率相乘不含滚球、冠军盘与四分盘让球/大小。',
parlay_guide_1: '在列表中点击各场赔率,选中项显示金边;再点同一项可取消',
parlay_guide_2: '须选 25 场不同赛事,不可同场串关;冠军盘与四分盘让球/大小不可选',
parlay_guide_3: '选好后点底部「确认下单」打开投注单,填写金额并提交',
parlay_max_legs: '串关最多 5 项',
parlay_block_outright: '冠军盘不可串关',
parlay_block_quarter: '四分盘让球/大小不可串关',
parlay_block_not_allowed: '该玩法不可串关',
parlay_filter_all: '全部',
parlay_empty: '暂无可用串关赛事',
parlay_same_match: '同一场比赛不能串关',
@@ -91,6 +111,13 @@ const i18n = createI18n({
market_ht_handicap: '半场 让球',
market_ht_ou: '半场 大小',
market_ht_1x2: '半场 独赢盘',
parlay_sel_home: '主',
parlay_sel_away: '客',
parlay_sel_draw: '和',
parlay_sel_over: '大',
parlay_sel_under: '小',
parlay_sel_odd: '单',
parlay_sel_even: '双',
col_home: '主场',
col_draw: '平',
col_away: '客场',
@@ -111,6 +138,9 @@ const i18n = createI18n({
guide_cs_1: '点「展开玩法」在表格里填各比分金额',
guide_cs_2: '填好金额后点该玩法底部「确认下单」,核对后提交',
guide_cs_3: '可一次填多个比分,会拆成多笔注单',
guide_flow_parlay: '串关25 场)',
guide_parlay_1: '本页为单关/波胆。串关:底部导航点「投注」,在页面顶部切换到「串关投注」,选 25 场不同赛事后在投注单提交。',
guide_rules_link: '完整规则见「我的」→ 投注规则。',
mode_cs_tag: '本页直接下注',
mode_slip_tag: '加入投注单',
cs_confirm_btn: '确认下注',
@@ -126,7 +156,7 @@ const i18n = createI18n({
cs_top_hint: '① 在比分格填金额 ② 点上方「确认下注」',
slip_empty_hint: '点击赔率加入投注单',
slip_remove: '移除',
slip_singles_hint: '共 {n} 笔单关(串关请「串关投注」',
slip_singles_hint: '共 {n} 笔单关(串关请到「投注」页顶部「串关投注」)',
slip_stake_per_bet: '每笔投注金额',
slip_est_return: '预计总返还',
slip_parlay_odds: '组合赔率 {odds}',
@@ -155,10 +185,27 @@ const i18n = createI18n({
password_failed: '密码修改失败',
password_mismatch: '两次新密码不一致',
password_incomplete: '修改密码需填写当前密码、新密码及确认密码',
rules_title: '投注规则',
rules_p1: '本平台第一版仅支持足球赛前盘不含滚球、Cash Out、改单及系统串关。',
rules_p2: '串关为 2 串 1 至 5 串 1不可同场串关冠军盘、四分盘让球/大小不可进入串关。',
rules_p3: '赛果由平台根据官方录入的半场/全场比分结算,结算预览经确认后入账。',
rules_p4: '若本说明与后台公告冲突,以最新公告及实际盘口规则为准。',
rules_p5: '操作步骤:进入任意赛事详情,点右上角「?」查看玩法说明。',
},
},
'en-US': {
nav: { home: 'Home', bet: 'Bet', bet_history: 'History', wallet: 'Wallet', profile: 'Profile' },
home: {
hot_matches: 'Hot matches',
no_matches: 'No matches',
announcement_badge: 'Notice',
announcement_default:
'Welcome to TheBet365 · Football events are live · Bet responsibly',
banner_prev: 'Previous slide',
banner_next: 'Next slide',
banner_slide: 'Slide {n}',
banner_fallback: 'Banner',
},
history: {
league_default: 'Football',
stake: 'Stake 投注',
@@ -216,7 +263,16 @@ const i18n = createI18n({
no_outright: 'No outright markets',
cancel: 'Cancel',
parlay_title: 'Parlay',
parlay_desc: 'Pick 3-10 matches. Combined odds multiply your potential win!',
parlay_guide_title: 'How to parlay',
parlay_guide_help: 'Parlay help',
parlay_desc: 'Combine 25 pre-match legs (2-fold to 5-fold). No live, outright, or quarter-ball HDP/O-U in parlay.',
parlay_guide_1: 'Tap odds in the list; selected cells show a gold border. Tap again to remove',
parlay_guide_2: 'Pick 25 different matches only. No same match, outright, or quarter-ball HDP/O-U',
parlay_guide_3: 'Tap Confirm order at the bottom, enter stake in the bet slip, and submit',
parlay_max_legs: 'Parlay allows up to 5 legs',
parlay_block_outright: 'Outright cannot be parlayed',
parlay_block_quarter: 'Quarter-ball HDP/O-U cannot be parlayed',
parlay_block_not_allowed: 'This market cannot be parlayed',
parlay_filter_all: 'All',
parlay_empty: 'No matches available for parlay betting',
parlay_same_match: 'Cannot parlay selections from the same match',
@@ -238,6 +294,13 @@ const i18n = createI18n({
market_ht_handicap: 'HT Handicap',
market_ht_ou: 'HT O/U',
market_ht_1x2: 'HT 1X2',
parlay_sel_home: 'H',
parlay_sel_away: 'A',
parlay_sel_draw: 'D',
parlay_sel_over: 'O',
parlay_sel_under: 'U',
parlay_sel_odd: 'Odd',
parlay_sel_even: 'Even',
col_home: 'Home',
col_draw: 'Draw',
col_away: 'Away',
@@ -258,6 +321,9 @@ const i18n = createI18n({
guide_cs_1: 'Expand and enter stake on each score',
guide_cs_2: 'Enter stakes, then tap Place order at the bottom of that market',
guide_cs_3: 'Multiple scores = multiple bets',
guide_flow_parlay: 'Parlay (25 legs)',
guide_parlay_1: 'This page is for singles and correct score. Parlay: tap Bet in the bottom nav, then the Parlay tab at the top of that page, pick 25 different matches, and submit from the bet slip.',
guide_rules_link: 'Full rules: Profile → Betting Rules.',
mode_cs_tag: 'Bet here',
mode_slip_tag: 'Add to slip',
cs_confirm_btn: 'Confirm bet',
@@ -273,7 +339,7 @@ const i18n = createI18n({
cs_top_hint: '① Enter stake ② Tap Confirm bet above',
slip_empty_hint: 'Tap odds to add to bet slip',
slip_remove: 'Remove',
slip_singles_hint: '{n} single bet(s). Use Parlay tab for parlays.',
slip_singles_hint: '{n} single bet(s). Parlay: Bet page → top Parlay tab.',
slip_stake_per_bet: 'Stake per bet',
slip_est_return: 'Est. total return',
slip_parlay_odds: 'Combined odds {odds}',
@@ -302,6 +368,12 @@ const i18n = createI18n({
password_failed: 'Password change failed',
password_mismatch: 'Passwords do not match',
password_incomplete: 'Fill current, new and confirm password to change password',
rules_title: 'Betting Rules',
rules_p1: 'Football pre-match only in v1. No live betting, Cash Out, bet edits, or system parlays.',
rules_p2: 'Parlays: 25 legs, different matches only. Outright and quarter-ball HDP/O-U are excluded from parlays.',
rules_p3: 'Results use admin-entered half-time and full-time scores; payouts apply after settlement preview is confirmed.',
rules_p4: 'If this text conflicts with site notices, the latest notice and market rules prevail.',
rules_p5: 'How to bet: open any match, tap the ? icon on the top right.',
},
},
'ms-MY': {
@@ -312,18 +384,29 @@ const i18n = createI18n({
wallet: 'Bil',
profile: 'Profil',
},
home: {
hot_matches: 'Perlawanan popular',
no_matches: 'Tiada perlawanan',
announcement_badge: 'Notis',
announcement_default:
'Selamat datang ke TheBet365 · Perlawanan bola sepak sedang berlangsung · Bertaruh secara bertanggungjawab',
banner_prev: 'Slaid sebelumnya',
banner_next: 'Slaid seterusnya',
banner_slide: 'Slaid {n}',
banner_fallback: 'Banner',
},
history: {
league_default: 'Bola Sepak',
stake: 'Stake 投注',
return: 'Return 回报',
est_return: 'Est. Return 预计回报',
parlay_title: 'Parlay · {n} perlawanan',
parlay_league: 'Parlay 串关',
stake: 'Stake',
return: 'Pulangan',
est_return: 'Anggaran pulangan',
parlay_title: 'Berganda · {n} perlawanan',
parlay_league: 'Berganda',
empty: 'Tiada rekod pertaruhan',
status_won: 'WON 赢',
status_pending: 'PENDING 待定',
status_lost: 'LOST 输',
status_push: 'PUSH 走盘',
status_won: 'MENANG',
status_pending: 'MENUNGGU',
status_lost: 'KALAH',
status_push: 'SERI',
},
auth: {
login: 'Log Masuk',
@@ -369,9 +452,18 @@ const i18n = createI18n({
no_outright: 'Tiada pasaran juara',
cancel: 'Batal',
parlay_title: 'Pertaruhan Berganda',
parlay_desc: 'Pilih 3-10 perlawanan. Gabungan odds didarab!',
parlay_guide_title: 'Cara parlay',
parlay_guide_help: 'Bantuan parlay',
parlay_desc: 'Gabung 25 perlawanan pra-perlawanan (2 hingga 5 liputan). Tiada live, outright atau suku bola HDP/O-U.',
parlay_guide_1: 'Ketik odds dalam senarai; pilihan dipilih ada sempadan emas. Ketik lagi untuk batal',
parlay_guide_2: 'Pilih 25 perlawanan berbeza. Tiada perlawanan sama, outright atau suku bola HDP/O-U',
parlay_guide_3: 'Ketik Sahkan pesanan di bawah, isi pegangan dalam slip, dan hantar',
parlay_max_legs: 'Maksimum 5 pilihan parlay',
parlay_block_outright: 'Outright tidak boleh parlay',
parlay_block_quarter: 'HDP/O-U suku bola tidak boleh parlay',
parlay_block_not_allowed: 'Pasaran ini tidak boleh parlay',
parlay_filter_all: 'Semua',
parlay_empty: 'No matches available for parlay betting',
parlay_empty: 'Tiada perlawanan untuk pertaruhan berganda',
parlay_same_match: 'Perlawanan sama tidak boleh berganda',
parlay_need_more: 'Pilih sekurang-kurangnya 2 pilihan',
back: 'Kembali',
@@ -391,6 +483,13 @@ const i18n = createI18n({
market_ht_handicap: 'Handicap Separuh',
market_ht_ou: 'Atas/Bawah Separuh',
market_ht_1x2: '1X2 Separuh',
parlay_sel_home: 'R',
parlay_sel_away: 'P',
parlay_sel_draw: 'S',
parlay_sel_over: 'Atas',
parlay_sel_under: 'Bwh',
parlay_sel_odd: 'G',
parlay_sel_even: 'Gn',
col_home: 'Home',
col_draw: 'Seri',
col_away: 'Away',
@@ -411,6 +510,9 @@ const i18n = createI18n({
guide_cs_1: 'Kembang dan isi jumlah setiap skor',
guide_cs_2: 'Isi jumlah, kemudian Sahkan pesanan di bawah pasaran itu',
guide_cs_3: 'Beberapa skor = beberapa pertaruhan',
guide_flow_parlay: 'Parlay (25 perlawanan)',
guide_parlay_1: 'Halaman ini untuk tunggal dan skor tepat. Parlay: ketik Pertaruhan di nav bawah, kemudian tab Parlay di bahagian atas halaman, pilih 25 perlawanan berbeza, hantar dari slip.',
guide_rules_link: 'Peraturan penuh: Profil → Peraturan Pertaruhan.',
mode_cs_tag: 'Pertaruhan di sini',
mode_slip_tag: 'Tambah ke slip',
cs_confirm_btn: 'Sahkan pertaruhan',
@@ -426,7 +528,7 @@ const i18n = createI18n({
cs_top_hint: '① Isi jumlah ② Ketik Sahkan di atas',
slip_empty_hint: 'Ketik odds untuk tambah ke slip',
slip_remove: 'Buang',
slip_singles_hint: '{n} pertaruhan tunggal. Guna tab Berganda untuk parlay.',
slip_singles_hint: '{n} pertaruhan tunggal. Parlay: halaman Pertaruhan → tab Berganda di atas.',
slip_stake_per_bet: 'Jumlah setiap pertaruhan',
slip_est_return: 'Anggaran pulangan',
slip_parlay_odds: 'Odds gabungan {odds}',
@@ -455,6 +557,12 @@ const i18n = createI18n({
password_failed: 'Gagal tukar kata laluan',
password_mismatch: 'Kata laluan tidak sepadan',
password_incomplete: 'Isi kata laluan semasa, baharu dan pengesahan untuk menukar',
rules_title: 'Peraturan Pertaruhan',
rules_p1: 'Versi pertama: hanya bola sepak pra-perlawanan. Tiada live, Cash Out, edit pertaruhan atau parlay sistem.',
rules_p2: 'Parlay 25 perlawanan, bukan perlawanan sama. Outright dan suku bola HDP/O-U tidak boleh parlay.',
rules_p3: 'Keputusan berdasarkan skor separuh masa/penuh yang dimasukkan admin; bayaran selepas pratonton disahkan.',
rules_p4: 'Jika bercanggah dengan notis laman, ikut notis terkini dan peraturan pasaran.',
rules_p5: 'Langkah operasi: buka butiran perlawanan, ketik ikon ? di atas kanan.',
},
},
},