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,7 +1,10 @@
<script setup lang="ts">
import { ref } from 'vue';
import api from '../api';
import { ElMessage } from 'element-plus';
import { useAdminLocale } from '../composables/useAdminLocale';
import api from '../api';
const { t } = useAdminLocale();
const preview = ref<Record<string, unknown> | null>(null);
const period = ref({
@@ -20,7 +23,7 @@ async function generatePreview() {
async function confirm() {
if (!preview.value?.batch) return;
await api.post(`/admin/cashbacks/${(preview.value.batch as { id: string }).id}/confirm`);
ElMessage.success('返水已发放');
ElMessage.success(t('msg.cashback_issued'));
preview.value = null;
}
</script>
@@ -28,43 +31,43 @@ async function confirm() {
<template>
<div class="page-scroll">
<div class="page-header">
<h2 class="page-title">返水管理</h2>
<span class="page-desc">按周期生成返水并发放</span>
<h2 class="page-title">{{ t('page.cashback.title') }}</h2>
<span class="page-desc">{{ t('page.cashback.desc') }}</span>
</div>
<el-card class="tool-card" shadow="never">
<div class="filter-row">
<el-form inline>
<el-form-item label="开始日期">
<el-form-item :label="t('cashback.start_date')">
<el-date-picker v-model="period.start" type="date" value-format="YYYY-MM-DD" style="width: 150px" />
</el-form-item>
<el-form-item label="结束日期">
<el-form-item :label="t('cashback.end_date')">
<el-date-picker v-model="period.end" type="date" value-format="YYYY-MM-DD" style="width: 150px" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="generatePreview">生成预览</el-button>
<el-button type="primary" @click="generatePreview">{{ t('cashback.preview_btn') }}</el-button>
</el-form-item>
</el-form>
</div>
</el-card>
<el-card v-if="preview" class="preview-card" shadow="never">
<div class="preview-title">返水预览</div>
<div class="preview-title">{{ t('cashback.preview_title') }}</div>
<el-row :gutter="20" class="preview-stats">
<el-col :span="8">
<div class="pstat">
<div class="pstat-value">{{ (preview.batch as { playerCount: number })?.playerCount ?? 0 }}</div>
<div class="pstat-label">涉及玩家数</div>
<div class="pstat-label">{{ t('cashback.stat.players') }}</div>
</div>
</el-col>
<el-col :span="8">
<div class="pstat">
<div class="pstat-value">{{ preview.totalAmount }}</div>
<div class="pstat-label">返水总金额</div>
<div class="pstat-label">{{ t('cashback.stat.total') }}</div>
</div>
</el-col>
</el-row>
<el-button type="success" @click="confirm" style="margin-top: 20px">确认发放</el-button>
<el-button type="success" @click="confirm" style="margin-top: 20px">{{ t('cashback.confirm_issue') }}</el-button>
</el-card>
</div>
</template>