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

@@ -1,6 +1,7 @@
<script setup lang="ts">
import { ref, computed } from 'vue';
import { useI18n } from 'vue-i18n';
import { PARLAY_MIN_LEGS, PARLAY_MAX_LEGS } from '@thebet365/shared';
import { useBetSlipStore } from '../stores/betSlip';
import api from '../api';
@@ -29,11 +30,19 @@ async function placeBet() {
success.value = '';
try {
if (slip.mode === 'parlay' && slip.items.length >= 2) {
if (slip.mode === 'parlay' && slip.items.length >= PARLAY_MIN_LEGS) {
if (slip.hasSameMatch) {
error.value = t('bet.parlay_same_match');
return;
}
if (slip.items.length > PARLAY_MAX_LEGS) {
error.value = t('bet.parlay_max_legs');
return;
}
if (!slip.canPlaceParlay) {
error.value = t('bet.parlay_need_more');
return;
}
await api.post('/player/bets/parlay', {
legs: slip.items.map((i) => ({
selectionId: i.selectionId,
@@ -110,7 +119,7 @@ async function placeBet() {
<button
type="button"
class="btn-primary"
:disabled="loading || !slip.items.length"
:disabled="loading || !slip.items.length || (slip.mode === 'parlay' && !slip.canPlaceParlay)"
@click="placeBet"
>
{{ loading ? t('bet.placing') : t('bet.place_bet') }}