fix(player): redo font-family replacement without encoding corruption

This commit is contained in:
mars
2026-07-13 09:58:17 +08:00
parent 5a6a8195f8
commit 0a4e4c36c8
9 changed files with 40 additions and 40 deletions

View File

@@ -85,12 +85,12 @@ const SEL_TRANS: Record<string, Record<string, string>> = {
'主胜': { 'en-US': 'Home Win', 'ms-MY': 'Rumah Menang' }, '主胜': { 'en-US': 'Home Win', 'ms-MY': 'Rumah Menang' },
'客胜': { 'en-US': 'Away Win', 'ms-MY': 'Tandang Menang' }, '客胜': { 'en-US': 'Away Win', 'ms-MY': 'Tandang Menang' },
'和局': { 'en-US': 'Draw', 'ms-MY': 'Seri' }, '和局': { 'en-US': 'Draw', 'ms-MY': 'Seri' },
'ä¸?: { 'en-US': 'Home', 'ms-MY': 'Rumah' }, '主': { 'en-US': 'Home', 'ms-MY': 'Rumah' },
'å®?: { 'en-US': 'Away', 'ms-MY': 'Tandang' }, '客': { 'en-US': 'Away', 'ms-MY': 'Tandang' },
'å¤?: { 'en-US': 'Over', 'ms-MY': 'Atas' }, '大': { 'en-US': 'Over', 'ms-MY': 'Atas' },
'å°?: { 'en-US': 'Under', 'ms-MY': 'Bawah' }, '小': { 'en-US': 'Under', 'ms-MY': 'Bawah' },
'å<EFBFBD>?: { 'en-US': 'Odd', 'ms-MY': 'Ganjil' }, '单': { 'en-US': 'Odd', 'ms-MY': 'Ganjil' },
'å<EFBFBD>?: { 'en-US': 'Even', 'ms-MY': 'Genap' }, '双': { 'en-US': 'Even', 'ms-MY': 'Genap' },
'冠军': { 'en-US': 'Winner', 'ms-MY': 'Juara' }, '冠军': { 'en-US': 'Winner', 'ms-MY': 'Juara' },
}; };
@@ -109,8 +109,8 @@ function translateSel(name: string): string {
function legResultIcon(status?: string | null) { function legResultIcon(status?: string | null) {
switch (status?.toUpperCase()) { switch (status?.toUpperCase()) {
case 'WON': return 'âœ?; case 'WON': return '✓';
case 'LOST': return 'âœ?; case 'LOST': return '✗';
case 'PUSH': return '='; case 'PUSH': return '=';
default: 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-container" role="dialog" aria-modal="true" :aria-label="t('bet.detail_title')">
<div class="modal-header"> <div class="modal-header">
<span class="modal-title">{{ t('bet.detail_title') }}</span> <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>
<div class="modal-body"> <div class="modal-body">

View File

@@ -30,7 +30,7 @@ function formatPeriod(start: string, end: string) {
const opts: Intl.DateTimeFormatOptions = { year: 'numeric', month: '2-digit', day: '2-digit' }; const opts: Intl.DateTimeFormatOptions = { year: 'numeric', month: '2-digit', day: '2-digit' };
const s = new Date(start).toLocaleDateString(locale.value, opts); const s = new Date(start).toLocaleDateString(locale.value, opts);
const e = new Date(end).toLocaleDateString(locale.value, opts); const e = new Date(end).toLocaleDateString(locale.value, opts);
return `${s} �${e}`; return `${s} ${e}`;
} }
function formatRate(rate: string) { function formatRate(rate: string) {
@@ -40,7 +40,7 @@ function formatRate(rate: string) {
} }
function formatTime(value: string | null) { function formatTime(value: string | null) {
if (!value) return 'â€?; if (!value) return '—';
return new Date(value).toLocaleString(locale.value); return new Date(value).toLocaleString(locale.value);
} }
</script> </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-container" role="dialog" aria-modal="true" :aria-label="t('cashback.title')">
<div class="modal-header"> <div class="modal-header">
<span class="modal-title">{{ t('cashback.title') }}</span> <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>
<div v-if="record" class="modal-body"> <div v-if="record" class="modal-body">

View File

@@ -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-container" role="dialog" aria-modal="true" :aria-label="t('recharge.order_detail')">
<div class="modal-header"> <div class="modal-header">
<span class="modal-title">{{ t('recharge.order_detail') }}</span> <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>
<div class="modal-body"> <div class="modal-body">

View File

@@ -119,7 +119,7 @@ function goCashbackDetail() {
<div class="modal-container" role="dialog" aria-modal="true" :aria-label="t('wallet.transaction_detail')"> <div class="modal-container" role="dialog" aria-modal="true" :aria-label="t('wallet.transaction_detail')">
<div class="modal-header"> <div class="modal-header">
<span class="modal-title">{{ t('wallet.transaction_detail') }}</span> <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>
<div class="modal-body"> <div class="modal-body">

View File

@@ -66,12 +66,12 @@ const SEL_TRANS: Record<string, Record<string, string>> = {
'主胜': { 'en-US': 'Home Win', 'ms-MY': 'Rumah Menang' }, '主胜': { 'en-US': 'Home Win', 'ms-MY': 'Rumah Menang' },
'客胜': { 'en-US': 'Away Win', 'ms-MY': 'Tandang Menang' }, '客胜': { 'en-US': 'Away Win', 'ms-MY': 'Tandang Menang' },
'和局': { 'en-US': 'Draw', 'ms-MY': 'Seri' }, '和局': { 'en-US': 'Draw', 'ms-MY': 'Seri' },
'ä¸?: { 'en-US': 'Home', 'ms-MY': 'Rumah' }, '主': { 'en-US': 'Home', 'ms-MY': 'Rumah' },
'å®?: { 'en-US': 'Away', 'ms-MY': 'Tandang' }, '客': { 'en-US': 'Away', 'ms-MY': 'Tandang' },
'å¤?: { 'en-US': 'Over', 'ms-MY': 'Atas' }, '大': { 'en-US': 'Over', 'ms-MY': 'Atas' },
'å°?: { 'en-US': 'Under', 'ms-MY': 'Bawah' }, '小': { 'en-US': 'Under', 'ms-MY': 'Bawah' },
'å<EFBFBD>?: { 'en-US': 'Odd', 'ms-MY': 'Ganjil' }, '单': { 'en-US': 'Odd', 'ms-MY': 'Ganjil' },
'å<EFBFBD>?: { 'en-US': 'Even', 'ms-MY': 'Genap' }, '双': { 'en-US': 'Even', 'ms-MY': 'Genap' },
'冠军': { 'en-US': 'Winner', 'ms-MY': 'Juara' }, '冠军': { 'en-US': 'Winner', 'ms-MY': 'Juara' },
}; };
@@ -90,8 +90,8 @@ function translateSel(name: string): string {
function legResultIcon(status?: string | null) { function legResultIcon(status?: string | null) {
switch (status?.toUpperCase()) { switch (status?.toUpperCase()) {
case 'WON': return 'âœ?; case 'WON': return '✓';
case 'LOST': return 'âœ?; case 'LOST': return '✗';
case 'PUSH': return '='; case 'PUSH': return '=';
default: return ''; default: return '';
} }
@@ -125,7 +125,7 @@ const displayLegs = computed(() => {
<main class="account-main"> <main class="account-main">
<div class="page-header"> <div class="page-header">
<button type="button" class="back-btn" @click="goBack"> <button type="button" class="back-btn" @click="goBack">
â?{{ t('common.back') }} {{ t('common.back') }}
</button> </button>
<h1 class="page-title">{{ t('bet.detail_title') }}</h1> <h1 class="page-title">{{ t('bet.detail_title') }}</h1>
</div> </div>

View File

@@ -58,7 +58,7 @@ function formatPeriod(start: string, end: string) {
const opts: Intl.DateTimeFormatOptions = { month: '2-digit', day: '2-digit' }; const opts: Intl.DateTimeFormatOptions = { month: '2-digit', day: '2-digit' };
const s = new Date(start).toLocaleDateString(locale.value, opts); const s = new Date(start).toLocaleDateString(locale.value, opts);
const e = new Date(end).toLocaleDateString(locale.value, opts); const e = new Date(end).toLocaleDateString(locale.value, opts);
return `${s} �${e}`; return `${s} ${e}`;
} }
function formatRate(rate: string) { function formatRate(rate: string) {
@@ -68,7 +68,7 @@ function formatRate(rate: string) {
} }
function formatTime(value: string | null) { function formatTime(value: string | null) {
if (!value) return 'â€?; if (!value) return '—';
return new Date(value).toLocaleString(locale.value, { return new Date(value).toLocaleString(locale.value, {
month: '2-digit', month: '2-digit',
day: '2-digit', day: '2-digit',

View File

@@ -112,7 +112,7 @@ const balanceDisplay = computed(() =>
<div class="bank-card-footer"> <div class="bank-card-footer">
<div class="bank-card-field"> <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> <span class="bank-card-holder">{{ profileRaw?.username }}</span>
</div> </div>
<div class="bank-card-field bank-card-field--center"> <div class="bank-card-field bank-card-field--center">
@@ -131,11 +131,11 @@ const balanceDisplay = computed(() =>
<div class="info-card"> <div class="info-card">
<div class="info-header">{{ t('profile.account') || '账户信息' }}</div> <div class="info-header">{{ t('profile.account') || '账户信息' }}</div>
<div class="info-row"> <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> <span class="info-val">{{ profileRaw?.username }}</span>
</div> </div>
<div class="info-row"> <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> <span class="info-val">{{ profileRaw?.preferences?.phone || '-' }}</span>
</div> </div>
<div class="info-actions"> <div class="info-actions">

View File

@@ -187,7 +187,7 @@ onActivated(fetchMethods);
<span class="detail-val">{{ selectedMethod.bankName }}</span> <span class="detail-val">{{ selectedMethod.bankName }}</span>
</div> </div>
<div class="detail-row"> <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> <span class="detail-val">{{ selectedMethod.accountHolder }}</span>
</div> </div>
<div class="detail-row"> <div class="detail-row">
@@ -207,13 +207,13 @@ onActivated(fetchMethods);
<!-- Amount input --> <!-- Amount input -->
<div class="field"> <div class="field">
<label class="field-label">{{ t('recharge.amount') || '<EFBFBD><EFBFBD><EFBFBD><EFBFBD>? }}</label> <label class="field-label">{{ t('recharge.amount') || '充值金额' }}</label>
<input <input
v-model="amount" v-model="amount"
type="number" type="number"
min="0" min="0"
class="field-input" class="field-input"
:placeholder="t('recharge.amount_placeholder') || '霂瑁<EFBFBD><EFBFBD>仿<EFBFBD>憸?" :placeholder="t('recharge.amount_placeholder') || '请输入金额'"
/> />
</div> </div>
@@ -222,7 +222,7 @@ onActivated(fetchMethods);
<label class="field-label">{{ t('recharge.screenshot') || '上传凭证截图' }}</label> <label class="field-label">{{ t('recharge.screenshot') || '上传凭证截图' }}</label>
<div v-if="screenshotPreview" class="preview-wrap"> <div v-if="screenshotPreview" class="preview-wrap">
<img :src="screenshotPreview" alt="preview" class="preview-img" /> <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> </div>
<label v-else class="upload-zone"> <label v-else class="upload-zone">
<input type="file" accept="image/*" class="hidden-input" @change="handleFileChange" /> <input type="file" accept="image/*" class="hidden-input" @change="handleFileChange" />
@@ -241,7 +241,7 @@ onActivated(fetchMethods);
@click="submit" @click="submit"
> >
<GoldSpinner v-if="submitting" :size="18" /> <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> </button>
</div> </div>
</div> </div>

View File

@@ -71,7 +71,7 @@ function txLabel(tx: TxDetail): string {
<div class="detail-layout"> <div class="detail-layout">
<div class="page-header"> <div class="page-header">
<button type="button" class="back-btn" @click="goBack"> <button type="button" class="back-btn" @click="goBack">
â?{{ t('common.back') || 'è¿åž' }} {{ t('common.back') || '返回' }}
</button> </button>
<h1 class="page-title">{{ t('wallet.transaction_detail') || '交易详情' }}</h1> <h1 class="page-title">{{ t('wallet.transaction_detail') || '交易详情' }}</h1>
</div> </div>
@@ -101,19 +101,19 @@ function txLabel(tx: TxDetail): string {
<span class="row-val">{{ txSummaryLabel(detail, t) || '-' }}</span> <span class="row-val">{{ txSummaryLabel(detail, t) || '-' }}</span>
</div> </div>
<div class="detail-row"> <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> <span class="row-val mono">{{ formatMoney(detail.balanceBefore, locale) }}</span>
</div> </div>
<div class="detail-row"> <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> <span class="row-val mono">{{ formatMoney(detail.balanceAfter, locale) }}</span>
</div> </div>
<div v-if="parseFloat(detail.frozenBefore || '0') > 0 || parseFloat(detail.frozenAfter || '0') > 0" class="detail-row"> <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> <span class="row-val mono">{{ formatMoney(detail.frozenBefore, locale) }}</span>
</div> </div>
<div v-if="parseFloat(detail.frozenBefore || '0') > 0 || parseFloat(detail.frozenAfter || '0') > 0" class="detail-row"> <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> <span class="row-val mono">{{ formatMoney(detail.frozenAfter, locale) }}</span>
</div> </div>
<div class="detail-row"> <div class="detail-row">
@@ -121,13 +121,13 @@ function txLabel(tx: TxDetail): string {
<span class="row-val">{{ new Date(detail.createdAt).toLocaleString() }}</span> <span class="row-val">{{ new Date(detail.createdAt).toLocaleString() }}</span>
</div> </div>
<div class="detail-row"> <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> <span class="row-val mono">{{ detail.transactionId }}</span>
</div> </div>
</div> </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> </div>
</main> </main>
</div> </div>