fix(player): redo font-family replacement without encoding corruption
This commit is contained in:
@@ -85,12 +85,12 @@ const SEL_TRANS: Record<string, Record<string, string>> = {
|
||||
'主胜': { 'en-US': 'Home Win', 'ms-MY': 'Rumah Menang' },
|
||||
'客胜': { 'en-US': 'Away Win', 'ms-MY': 'Tandang Menang' },
|
||||
'和局': { 'en-US': 'Draw', 'ms-MY': 'Seri' },
|
||||
'�: { 'en-US': 'Home', 'ms-MY': 'Rumah' },
|
||||
'å®?: { 'en-US': 'Away', 'ms-MY': 'Tandang' },
|
||||
'�: { 'en-US': 'Over', 'ms-MY': 'Atas' },
|
||||
'å°?: { 'en-US': 'Under', 'ms-MY': 'Bawah' },
|
||||
'å<EFBFBD>?: { 'en-US': 'Odd', 'ms-MY': 'Ganjil' },
|
||||
'å<EFBFBD>?: { 'en-US': 'Even', 'ms-MY': 'Genap' },
|
||||
'主': { 'en-US': 'Home', 'ms-MY': 'Rumah' },
|
||||
'客': { 'en-US': 'Away', 'ms-MY': 'Tandang' },
|
||||
'大': { 'en-US': 'Over', 'ms-MY': 'Atas' },
|
||||
'小': { 'en-US': 'Under', 'ms-MY': 'Bawah' },
|
||||
'单': { 'en-US': 'Odd', 'ms-MY': 'Ganjil' },
|
||||
'双': { 'en-US': 'Even', 'ms-MY': 'Genap' },
|
||||
'冠军': { 'en-US': 'Winner', 'ms-MY': 'Juara' },
|
||||
};
|
||||
|
||||
@@ -109,8 +109,8 @@ function translateSel(name: string): string {
|
||||
|
||||
function legResultIcon(status?: string | null) {
|
||||
switch (status?.toUpperCase()) {
|
||||
case 'WON': return '�;
|
||||
case 'LOST': return '�;
|
||||
case 'WON': return '✓';
|
||||
case 'LOST': return '✗';
|
||||
case 'PUSH': return '=';
|
||||
default: return '';
|
||||
}
|
||||
@@ -147,7 +147,7 @@ const displayLegs = computed(() => {
|
||||
<div class="modal-container" role="dialog" aria-modal="true" :aria-label="t('bet.detail_title')">
|
||||
<div class="modal-header">
|
||||
<span class="modal-title">{{ t('bet.detail_title') }}</span>
|
||||
<button type="button" class="modal-close" :aria-label="t('support.close')" @click="close">�/button>
|
||||
<button type="button" class="modal-close" :aria-label="t('support.close')" @click="close">✕</button>
|
||||
</div>
|
||||
|
||||
<div class="modal-body">
|
||||
|
||||
@@ -30,7 +30,7 @@ function formatPeriod(start: string, end: string) {
|
||||
const opts: Intl.DateTimeFormatOptions = { year: 'numeric', month: '2-digit', day: '2-digit' };
|
||||
const s = new Date(start).toLocaleDateString(locale.value, opts);
|
||||
const e = new Date(end).toLocaleDateString(locale.value, opts);
|
||||
return `${s} �${e}`;
|
||||
return `${s} – ${e}`;
|
||||
}
|
||||
|
||||
function formatRate(rate: string) {
|
||||
@@ -40,7 +40,7 @@ function formatRate(rate: string) {
|
||||
}
|
||||
|
||||
function formatTime(value: string | null) {
|
||||
if (!value) return '�;
|
||||
if (!value) return '—';
|
||||
return new Date(value).toLocaleString(locale.value);
|
||||
}
|
||||
</script>
|
||||
@@ -52,7 +52,7 @@ function formatTime(value: string | null) {
|
||||
<div class="modal-container" role="dialog" aria-modal="true" :aria-label="t('cashback.title')">
|
||||
<div class="modal-header">
|
||||
<span class="modal-title">{{ t('cashback.title') }}</span>
|
||||
<button type="button" class="modal-close" :aria-label="t('support.close')" @click="close">�/button>
|
||||
<button type="button" class="modal-close" :aria-label="t('support.close')" @click="close">✕</button>
|
||||
</div>
|
||||
|
||||
<div v-if="record" class="modal-body">
|
||||
|
||||
@@ -135,7 +135,7 @@ function auditNoteDisplayText(remark: { kind: 'note'; text: string }) {
|
||||
<div class="modal-container" role="dialog" aria-modal="true" :aria-label="t('recharge.order_detail')">
|
||||
<div class="modal-header">
|
||||
<span class="modal-title">{{ t('recharge.order_detail') }}</span>
|
||||
<button type="button" class="modal-close" :aria-label="t('support.close')" @click="close">�/button>
|
||||
<button type="button" class="modal-close" :aria-label="t('support.close')" @click="close">✕</button>
|
||||
</div>
|
||||
|
||||
<div class="modal-body">
|
||||
|
||||
@@ -119,7 +119,7 @@ function goCashbackDetail() {
|
||||
<div class="modal-container" role="dialog" aria-modal="true" :aria-label="t('wallet.transaction_detail')">
|
||||
<div class="modal-header">
|
||||
<span class="modal-title">{{ t('wallet.transaction_detail') }}</span>
|
||||
<button type="button" class="modal-close" :aria-label="t('support.close')" @click="close">�/button>
|
||||
<button type="button" class="modal-close" :aria-label="t('support.close')" @click="close">✕</button>
|
||||
</div>
|
||||
|
||||
<div class="modal-body">
|
||||
|
||||
@@ -66,12 +66,12 @@ const SEL_TRANS: Record<string, Record<string, string>> = {
|
||||
'主胜': { 'en-US': 'Home Win', 'ms-MY': 'Rumah Menang' },
|
||||
'客胜': { 'en-US': 'Away Win', 'ms-MY': 'Tandang Menang' },
|
||||
'和局': { 'en-US': 'Draw', 'ms-MY': 'Seri' },
|
||||
'�: { 'en-US': 'Home', 'ms-MY': 'Rumah' },
|
||||
'å®?: { 'en-US': 'Away', 'ms-MY': 'Tandang' },
|
||||
'�: { 'en-US': 'Over', 'ms-MY': 'Atas' },
|
||||
'å°?: { 'en-US': 'Under', 'ms-MY': 'Bawah' },
|
||||
'å<EFBFBD>?: { 'en-US': 'Odd', 'ms-MY': 'Ganjil' },
|
||||
'å<EFBFBD>?: { 'en-US': 'Even', 'ms-MY': 'Genap' },
|
||||
'主': { 'en-US': 'Home', 'ms-MY': 'Rumah' },
|
||||
'客': { 'en-US': 'Away', 'ms-MY': 'Tandang' },
|
||||
'大': { 'en-US': 'Over', 'ms-MY': 'Atas' },
|
||||
'小': { 'en-US': 'Under', 'ms-MY': 'Bawah' },
|
||||
'单': { 'en-US': 'Odd', 'ms-MY': 'Ganjil' },
|
||||
'双': { 'en-US': 'Even', 'ms-MY': 'Genap' },
|
||||
'冠军': { 'en-US': 'Winner', 'ms-MY': 'Juara' },
|
||||
};
|
||||
|
||||
@@ -90,8 +90,8 @@ function translateSel(name: string): string {
|
||||
|
||||
function legResultIcon(status?: string | null) {
|
||||
switch (status?.toUpperCase()) {
|
||||
case 'WON': return '�;
|
||||
case 'LOST': return '�;
|
||||
case 'WON': return '✓';
|
||||
case 'LOST': return '✗';
|
||||
case 'PUSH': return '=';
|
||||
default: return '';
|
||||
}
|
||||
@@ -125,7 +125,7 @@ const displayLegs = computed(() => {
|
||||
<main class="account-main">
|
||||
<div class="page-header">
|
||||
<button type="button" class="back-btn" @click="goBack">
|
||||
�{{ t('common.back') }}
|
||||
‹ {{ t('common.back') }}
|
||||
</button>
|
||||
<h1 class="page-title">{{ t('bet.detail_title') }}</h1>
|
||||
</div>
|
||||
|
||||
@@ -58,7 +58,7 @@ function formatPeriod(start: string, end: string) {
|
||||
const opts: Intl.DateTimeFormatOptions = { month: '2-digit', day: '2-digit' };
|
||||
const s = new Date(start).toLocaleDateString(locale.value, opts);
|
||||
const e = new Date(end).toLocaleDateString(locale.value, opts);
|
||||
return `${s} �${e}`;
|
||||
return `${s} – ${e}`;
|
||||
}
|
||||
|
||||
function formatRate(rate: string) {
|
||||
@@ -68,7 +68,7 @@ function formatRate(rate: string) {
|
||||
}
|
||||
|
||||
function formatTime(value: string | null) {
|
||||
if (!value) return '�;
|
||||
if (!value) return '—';
|
||||
return new Date(value).toLocaleString(locale.value, {
|
||||
month: '2-digit',
|
||||
day: '2-digit',
|
||||
|
||||
@@ -112,7 +112,7 @@ const balanceDisplay = computed(() =>
|
||||
|
||||
<div class="bank-card-footer">
|
||||
<div class="bank-card-field">
|
||||
<span class="bank-card-label">{{ t('profile.username') || '<EFBFBD><EFBFBD>㨃鈭? }}</span>
|
||||
<span class="bank-card-label">{{ t('profile.username') || '持卡人' }}</span>
|
||||
<span class="bank-card-holder">{{ profileRaw?.username }}</span>
|
||||
</div>
|
||||
<div class="bank-card-field bank-card-field--center">
|
||||
@@ -131,11 +131,11 @@ const balanceDisplay = computed(() =>
|
||||
<div class="info-card">
|
||||
<div class="info-header">{{ t('profile.account') || '账户信息' }}</div>
|
||||
<div class="info-row">
|
||||
<span class="info-label">{{ t('profile.username') || '<EFBFBD>冽<EFBFBD><EFBFBD>? }}</span>
|
||||
<span class="info-label">{{ t('profile.username') || '用户名' }}</span>
|
||||
<span class="info-val">{{ profileRaw?.username }}</span>
|
||||
</div>
|
||||
<div class="info-row">
|
||||
<span class="info-label">{{ t('profile.phone') || '<EFBFBD>𧢲㦤<EFBFBD>? }}</span>
|
||||
<span class="info-label">{{ t('profile.phone') || '手机号' }}</span>
|
||||
<span class="info-val">{{ profileRaw?.preferences?.phone || '-' }}</span>
|
||||
</div>
|
||||
<div class="info-actions">
|
||||
|
||||
@@ -187,7 +187,7 @@ onActivated(fetchMethods);
|
||||
<span class="detail-val">{{ selectedMethod.bankName }}</span>
|
||||
</div>
|
||||
<div class="detail-row">
|
||||
<span class="detail-label">{{ t('recharge.account_holder') || '<EFBFBD><EFBFBD>㨃鈭? }}</span>
|
||||
<span class="detail-label">{{ t('recharge.account_holder') || '持卡人' }}</span>
|
||||
<span class="detail-val">{{ selectedMethod.accountHolder }}</span>
|
||||
</div>
|
||||
<div class="detail-row">
|
||||
@@ -207,13 +207,13 @@ onActivated(fetchMethods);
|
||||
|
||||
<!-- Amount input -->
|
||||
<div class="field">
|
||||
<label class="field-label">{{ t('recharge.amount') || '<EFBFBD><EFBFBD><EFBFBD>潮<EFBFBD>憸? }}</label>
|
||||
<label class="field-label">{{ t('recharge.amount') || '充值金额' }}</label>
|
||||
<input
|
||||
v-model="amount"
|
||||
type="number"
|
||||
min="0"
|
||||
class="field-input"
|
||||
:placeholder="t('recharge.amount_placeholder') || '霂瑁<EFBFBD><EFBFBD>仿<EFBFBD>憸?"
|
||||
:placeholder="t('recharge.amount_placeholder') || '请输入金额'"
|
||||
/>
|
||||
</div>
|
||||
|
||||
@@ -222,7 +222,7 @@ onActivated(fetchMethods);
|
||||
<label class="field-label">{{ t('recharge.screenshot') || '上传凭证截图' }}</label>
|
||||
<div v-if="screenshotPreview" class="preview-wrap">
|
||||
<img :src="screenshotPreview" alt="preview" class="preview-img" />
|
||||
<button type="button" class="clear-btn" @click="clearFile"><EFBFBD>?/button>
|
||||
<button type="button" class="clear-btn" @click="clearFile">✕</button>
|
||||
</div>
|
||||
<label v-else class="upload-zone">
|
||||
<input type="file" accept="image/*" class="hidden-input" @change="handleFileChange" />
|
||||
@@ -241,7 +241,7 @@ onActivated(fetchMethods);
|
||||
@click="submit"
|
||||
>
|
||||
<GoldSpinner v-if="submitting" :size="18" />
|
||||
<span v-else>{{ t('recharge.submit') || '<EFBFBD>𣂷漱<EFBFBD><EFBFBD><EFBFBD>? }}</span>
|
||||
<span v-else>{{ t('recharge.submit') || '提交充值' }}</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -71,7 +71,7 @@ function txLabel(tx: TxDetail): string {
|
||||
<div class="detail-layout">
|
||||
<div class="page-header">
|
||||
<button type="button" class="back-btn" @click="goBack">
|
||||
�{{ t('common.back') || '返回' }}
|
||||
‹ {{ t('common.back') || '返回' }}
|
||||
</button>
|
||||
<h1 class="page-title">{{ t('wallet.transaction_detail') || '交易详情' }}</h1>
|
||||
</div>
|
||||
@@ -101,19 +101,19 @@ function txLabel(tx: TxDetail): string {
|
||||
<span class="row-val">{{ txSummaryLabel(detail, t) || '-' }}</span>
|
||||
</div>
|
||||
<div class="detail-row">
|
||||
<span class="row-label">{{ t('wallet.balance_before') || 'å<EFBFBD>˜åЍå‰<EFBFBD>ä½™é¢? }}</span>
|
||||
<span class="row-label">{{ t('wallet.balance_before') || '变动前余额' }}</span>
|
||||
<span class="row-val mono">{{ formatMoney(detail.balanceBefore, locale) }}</span>
|
||||
</div>
|
||||
<div class="detail-row">
|
||||
<span class="row-label">{{ t('wallet.balance_after') || 'å<EFBFBD>˜åЍå<EFBFBD>Žä½™é¢? }}</span>
|
||||
<span class="row-label">{{ t('wallet.balance_after') || '变动后余额' }}</span>
|
||||
<span class="row-val mono">{{ formatMoney(detail.balanceAfter, locale) }}</span>
|
||||
</div>
|
||||
<div v-if="parseFloat(detail.frozenBefore || '0') > 0 || parseFloat(detail.frozenAfter || '0') > 0" class="detail-row">
|
||||
<span class="row-label">{{ t('wallet.frozen_before') || '冻结� }}</span>
|
||||
<span class="row-label">{{ t('wallet.frozen_before') || '冻结前' }}</span>
|
||||
<span class="row-val mono">{{ formatMoney(detail.frozenBefore, locale) }}</span>
|
||||
</div>
|
||||
<div v-if="parseFloat(detail.frozenBefore || '0') > 0 || parseFloat(detail.frozenAfter || '0') > 0" class="detail-row">
|
||||
<span class="row-label">{{ t('wallet.frozen_after') || '冻结å<EFBFBD>? }}</span>
|
||||
<span class="row-label">{{ t('wallet.frozen_after') || '冻结后' }}</span>
|
||||
<span class="row-val mono">{{ formatMoney(detail.frozenAfter, locale) }}</span>
|
||||
</div>
|
||||
<div class="detail-row">
|
||||
@@ -121,13 +121,13 @@ function txLabel(tx: TxDetail): string {
|
||||
<span class="row-val">{{ new Date(detail.createdAt).toLocaleString() }}</span>
|
||||
</div>
|
||||
<div class="detail-row">
|
||||
<span class="row-label">{{ t('wallet.transaction_id') || 'æµ<EFBFBD>æ°´å<EFBFBD>? }}</span>
|
||||
<span class="row-label">{{ t('wallet.transaction_id') || '流水号' }}</span>
|
||||
<span class="row-val mono">{{ detail.transactionId }}</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div v-else class="empty-state">{{ t('common.not_found') || '未找到记� }}</div>
|
||||
<div v-else class="empty-state">{{ t('common.not_found') || '未找到记录' }}</div>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user