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

@@ -0,0 +1,239 @@
/** 管理后台列表 / 弹窗 — Bahasa Melayu */
export const adminPagesMs: Record<string, string> = {
'common.detail': 'Butiran',
'common.create': 'Cipta',
'common.save': 'Simpan',
'common.close': 'Tutup',
'common.import': 'Import',
'common.publish': 'Terbitkan',
'common.topup': 'Tambah baki',
'common.adjust_credit': 'Laraskan kredit',
'common.freeze': 'Bekukan',
'common.unfreeze': 'Nyahbeku',
'common.settle': 'Selesaikan',
'common.close_betting': 'Tutup pertaruhan',
'common.never_login': 'Belum pernah log masuk',
'common.optional': 'Pilihan',
'common.to': 'Hingga',
'common.module': 'Modul',
'common.col_id': 'ID',
'common.times': 'kali',
'common.bets_count_unit': 'pertaruhan',
'user.create_btn': '+ Pemain baharu',
'user.filter.username_ph': 'Nama pengguna',
'user.filter.agent': 'Ejen',
'user.filter.agent_ph': 'Semua',
'user.col.username': 'Nama pengguna',
'user.col.agent': 'Ejen',
'user.col.balance': 'Tersedia / Dibekukan',
'user.col.bets': 'Pertaruhan',
'user.col.stake_payout': 'Stake / Bayaran',
'user.col.last_login': 'Log masuk terakhir',
'user.col.created': 'Daftar',
'user.status.ACTIVE': 'Aktif',
'user.status.SUSPENDED': 'Digantung',
'user.dialog.create': 'Pemain baharu',
'user.dialog.edit': 'Edit pemain',
'user.dialog.deposit': 'Tambah baki pemain',
'user.dialog.detail': 'Butiran pemain',
'user.field.password': 'Kata laluan',
'user.field.confirm_password': 'Sahkan kata laluan',
'user.field.initial_balance': 'Baki permulaan',
'user.field.deposit_remark': 'Nota tambah baki',
'user.field.amount': 'Jumlah',
'user.field.remark': 'Nota',
'user.field.account_status': 'Status akaun',
'user.field.available': 'Baki tersedia',
'user.field.frozen_balance': 'Baki dibekukan',
'user.field.bets_summary': 'Pertaruhan / stake',
'user.field.total_payout': 'Jumlah bayaran',
'user.field.login_fail': 'Log masuk gagal',
'user.field.phone': 'Telefon',
'user.field.email': 'E-mel',
'user.ph.username_unique': 'Nama log masuk unik',
'user.ph.no_agent': 'Tiada (terus platform)',
'user.hint.no_agent': 'Biarkan kosong untuk pemain diurus platform',
'user.hint.initial_balance': 'Auto tambah baki semasa cipta; 0 = tiada bonus',
'user.hint.deposit_remark': 'Ditulis ke lejar jika baki permulaan > 0',
'user.hint.freeze_in_list': 'Beku/nyahbeku dari lajur tindakan senarai',
'user.hint.agent_change': 'Kosong = terus platform; perubahan dikira semula kredit ejen',
'user.btn.create': 'Cipta',
'user.btn.save_profile': 'Simpan',
'user.btn.confirm_deposit': 'Sahkan tambah baki',
'user.deposit_remark_default': 'Tambah baki admin',
'agent.create_btn': '+ Ejen peringkat 1 baharu',
'agent.filter.username_ph': 'Nama pengguna',
'agent.col.level': 'Peringkat',
'agent.col.credit': 'Had / Digunakan / Tersedia',
'agent.col.direct_players': 'Pemain terus',
'agent.col.cashback': 'Kadar rebat',
'agent.col.phone': 'Telefon',
'agent.col.created': 'Dicipta',
'agent.dialog.create': 'Ejen peringkat 1 baharu',
'agent.dialog.edit': 'Edit ejen',
'agent.dialog.credit': 'Laraskan had kredit',
'agent.field.agent_id': 'ID ejen',
'agent.dialog.detail': 'Butiran ejen',
'agent.field.credit_limit': 'Had kredit',
'agent.field.cashback_rate': 'Kadar rebat',
'agent.field.adjust_amount': 'Pelarasan',
'agent.field.used_credit': 'Kredit digunakan',
'agent.field.available_credit': 'Kredit tersedia',
'agent.field.player_liability': 'Liabiliti pemain',
'agent.field.sub_agent_exposure': 'Pendedahan sub-ejen',
'agent.hint.credit_limit': 'Had maksimum tambah baki untuk pemain terus',
'agent.hint.cashback_example': 'cth. 0.01 = 1%',
'agent.hint.credit_adjust': 'Positif menambah, negatif mengurangkan',
'agent.hint.credit_remark': 'Pilihan, ditulis ke lejar kredit',
'agent.section.credit_log': 'Perubahan kredit terkini',
'agent.credit.increase': 'Tambah',
'agent.credit.decrease': 'Kurang',
'agent.col.credit_type': 'Jenis',
'agent.col.credit_change': 'Perubahan',
'agent.col.credit_after': 'Selepas',
'agent.col.no_records': 'Tiada rekod',
'agent.btn.confirm_adjust': 'Sahkan',
'match.create_btn': '+ Perlawanan baharu',
'match.filter.keyword_ph': 'Nama perlawanan / kod pasukan',
'match.col.matchup': 'Perlawanan',
'match.col.kickoff': 'Masa mula',
'match.dialog.create': 'Perlawanan baharu',
'match.dialog.edit': 'Edit perlawanan',
'match.dialog.import': 'Import perlawanan',
'match.field.league_en': 'Liga (EN)',
'match.field.league_zh': 'Liga (ZH)',
'match.field.kickoff': 'Masa mula',
'match.field.home_en': 'Tuan rumah (EN)',
'match.field.home_zh': 'Tuan rumah (ZH)',
'match.field.away_en': 'Pelawat (EN)',
'match.field.away_zh': 'Pelawat (ZH)',
'match.field.featured': 'Pilihan utama',
'match.hint.create_draft': 'Disimpan sebagai draf; klik Terbitkan dalam senarai untuk buka pasaran.',
'match.hint.edit_published': 'Diterbitkan: edit masa mula, pilihan utama, nama paparan; tertutup/selesai dikunci.',
'bet.filter.keyword_ph': 'No. pertaruhan / nama pengguna',
'bet.filter.date_from': 'Tarikh pertaruhan dari',
'bet.filter.date_start_ph': 'Mula',
'bet.filter.date_end_ph': 'Tamat',
'bet.col.serial': 'No.',
'bet.col.bet_no': 'No. pertaruhan',
'bet.col.player': 'Pemain',
'bet.col.agent': 'Ejen',
'bet.col.selection': 'Pilihan',
'bet.col.stake': 'Stake',
'bet.col.odds': 'Odds',
'bet.col.payout': 'Bayaran',
'bet.col.placed_at': 'Masa pertaruhan',
'bet.dialog.detail': 'Butiran pertaruhan',
'bet.field.total_odds': 'Jumlah odds',
'bet.field.currency': 'Mata wang',
'bet.field.potential_win': 'Menang berpotensi',
'bet.field.actual_payout': 'Bayaran sebenar',
'bet.field.bet_status': 'Status pertaruhan',
'bet.field.settlement_status': 'Penyelesaian',
'bet.field.settled_at': 'Diselesaikan pada',
'bet.field.request_id': 'ID permintaan',
'bet.selections_title': 'Pilihan ({n})',
'bet.col.market': 'Pasaran',
'bet.col.period': 'Tempoh',
'bet.col.line': 'Garisan',
'bet.col.result': 'Keputusan',
'audit.module_ph': 'cth. USERS, AGENTS',
'audit.col.action': 'Tindakan',
'audit.col.module': 'Modul',
'audit.col.target_id': 'ID sasaran',
'audit.col.time': 'Masa',
'cashback.start_date': 'Tarikh mula',
'cashback.end_date': 'Tarikh tamat',
'cashback.preview_btn': 'Pratonton',
'cashback.preview_title': 'Pratonton rebat',
'cashback.stat.players': 'Pemain',
'cashback.stat.total': 'Jumlah rebat',
'cashback.confirm_issue': 'Sahkan bayaran',
'user.field.player_id': 'ID pemain',
'user.field.bet_count': 'Bilangan pertaruhan',
'user.field.total_stake': 'Jumlah stake',
'user.field.registered_at': 'Daftar',
'user.ph.remark_initial': 'Nota lejar apabila baki permulaan > 0',
'user.bets_edit_value': '{n} pertaruhan / {stake}',
'user.login_fail_value': '{n} kali',
'match.import_hint': 'Tampal JSON dengan array matches. Import sebagai draf; terbitkan dari senarai.',
'match.import_start': 'Import',
'match.import_json_ph': '{"matches":[...]}',
'match.delete_confirm_title': 'Padam perlawanan',
'match.delete_confirm_body': 'Padam "{title}"? Hanya draf tanpa pertaruhan.',
'match.ph.league_en': 'FIFA World Cup 2026',
'match.ph.league_zh': 'Piala Dunia 2026',
'match.ph.kickoff': '2026-06-11T19:00:00Z',
'match.ph.home_en': 'Mexico',
'match.ph.home_zh': 'Mexico',
'match.ph.away_en': 'South Africa',
'match.ph.away_zh': 'Afrika Selatan',
'err.username_required': 'Sila isi nama pengguna',
'err.password_min': 'Kata laluan sekurang-kurangnya 8 aksara',
'err.password_mismatch': 'Kata laluan tidak sepadan',
'err.credit_negative': 'Had kredit tidak boleh negatif',
'err.kickoff_required': 'Sila isi masa mula',
'err.teams_required': 'Isi nama pasukan tuan rumah dan pelawat (ZH atau EN)',
'err.league_required': 'Sila isi nama liga',
'settlement.ht_score': 'Skor separuh masa',
'settlement.ft_score': 'Skor penuh masa',
'settlement.record_score': 'Simpan skor',
'settlement.preview_btn': 'Pratonton penyelesaian',
'settlement.preview_title': 'Pratonton penyelesaian',
'settlement.single_count': 'Pertaruhan tunggal',
'settlement.est_payout': 'Anggaran bayaran',
'settlement.refund_amount': 'Jumlah bayaran balik',
'settlement.confirm_btn': 'Sahkan penyelesaian',
'msg.score_recorded': 'Skor disimpan',
'msg.settlement_confirmed': 'Penyelesaian disahkan',
'agent_portal.create_player_section': 'Cipta pemain',
'agent_portal.deposit_section': 'Tambah baki',
'agent_portal.create_player_btn': '+ Pemain baharu',
'agent_portal.create_tier2_btn': '+ Sub-ejen baharu',
'agent_portal.username_ph': 'Masukkan nama pengguna',
'agent_portal.agent_username_ph': 'Nama pengguna ejen',
'agent_portal.player_id_ph': 'ID pemain',
'agent_portal.withdraw_btn': 'Keluarkan {amount}',
'msg.agent_sub_created': 'Sub-ejen dicipta',
'msg.withdraw_ok': 'Pengeluaran berjaya',
'msg.form_invalid': 'Sila semak borang',
'msg.player_created': 'Pemain dicipta',
'msg.agent_created': 'Ejen dicipta',
'msg.create_failed': 'Gagal mencipta',
'msg.saved': 'Disimpan',
'msg.save_failed': 'Gagal menyimpan',
'msg.deleted': 'Dipadam',
'msg.delete_failed': 'Gagal memadam',
'msg.match_created_draft': 'Perlawanan dicipta (draf)',
'msg.published': 'Diterbitkan dengan pasaran',
'msg.closed': 'Pertaruhan ditutup',
'msg.invalid_json': 'JSON tidak sah',
'msg.import_failed': 'Import gagal',
'msg.import_done': 'Import: {imported} ok, {skipped} dilangkau, {failed} gagal / {total} jumlah',
'msg.topup_ok': 'Tambah baki berjaya',
'msg.topup_failed': 'Tambah baki gagal',
'msg.amount_gt_zero': 'Jumlah mesti lebih daripada 0',
'msg.credit_zero': 'Pelarasan tidak boleh 0',
'msg.credit_adjusted': 'Kredit dikemas kini',
'msg.credit_adjust_failed': 'Pelarasan gagal',
'msg.outright_no_edit': 'Outright tidak boleh diedit di sini',
'msg.load_matches_failed': 'Gagal memuatkan perlawanan',
'msg.cashback_issued': 'Rebat telah dikeluarkan',
'msg.freeze_confirm_title': '{action} akaun',
'msg.freeze_confirm_body': '{action} pemain "{name}"?{extra}',
'msg.freeze_extra': ' Mereka tidak akan dapat log masuk.',
'msg.freeze_done': '{action} selesai',
'msg.freeze_failed': '{action} gagal',
};