- 在 api.type.ts 中为支付渠道、存款配置和取款字段添加新的接口属性 - 替换桌面端规则模态框中的纯文本内容为支持 Markdown 格式的组件 - 重构桌面端充值组件的 UI 结构,使用自定义按钮替代原生选择器 - 为取款组件添加最低最高金额验证及支付方式选择功能 - 更新英文本地化文件中的游戏规则内容,提供详细的玩法指南
830 lines
30 KiB
TypeScript
830 lines
30 KiB
TypeScript
/* 以下为多语言中重复出现的文案,统一声明一次后在下方各 key 复用,避免同一文案多处声明。 */
|
||
/** @description 登录的统一文案。 */
|
||
const TEXT_LOGIN = 'Masuk'
|
||
|
||
/** @description 注册的统一文案。 */
|
||
const TEXT_REGISTER = 'Daftar'
|
||
|
||
/** @description “是”的统一文案。 */
|
||
const TEXT_YES = 'Ya'
|
||
|
||
/** @description “否”的统一文案。 */
|
||
const TEXT_NO = 'Tidak'
|
||
|
||
/** @description “查看”的统一文案。 */
|
||
const TEXT_VIEW = 'Lihat'
|
||
|
||
/** @description 自动托管的统一文案。 */
|
||
const TEXT_AUTO_HOSTING = 'Auto Spin'
|
||
|
||
/** @description 钱包流水的统一文案。 */
|
||
const TEXT_WALLET_RECORDS = 'Riwayat Dompet'
|
||
|
||
/** @description 站内消息的统一文案。 */
|
||
const TEXT_SITE_MESSAGES = 'Pesan'
|
||
|
||
/** @description 分页“第x页/共x条”的统一文案。 */
|
||
const TEXT_PAGE_INDICATOR = 'Halaman {{page}} / total {{total}}'
|
||
|
||
/** @description 上一页的统一文案。 */
|
||
const TEXT_PREV_PAGE = 'Sebelumnya'
|
||
|
||
/** @description 下一页的统一文案。 */
|
||
const TEXT_NEXT_PAGE = 'Berikutnya'
|
||
|
||
/** @description “时间”的统一文案。 */
|
||
const TEXT_TIME = 'Waktu'
|
||
|
||
/** @description 超过单次投注限额的统一文案。 */
|
||
const TEXT_BET_LIMIT_EXCEEDED = 'Melebihi batas taruhan tunggal'
|
||
|
||
/** @description “提交中...”的统一文案。 */
|
||
const TEXT_SUBMITTING = 'Mengirim...'
|
||
|
||
/** @description 手机号字段标签的统一文案。 */
|
||
const TEXT_MOBILE_LABEL = 'Nomor Ponsel:'
|
||
|
||
/** @description 手机号输入占位的统一文案。 */
|
||
const TEXT_MOBILE_PLACEHOLDER = 'Masukkan nomor ponsel'
|
||
|
||
/** @description 密码字段标签的统一文案。 */
|
||
const TEXT_PASSWORD_LABEL = 'Kata Sandi:'
|
||
|
||
/** @description 密码输入占位的统一文案。 */
|
||
const TEXT_PASSWORD_PLACEHOLDER = 'Masukkan kata sandi'
|
||
|
||
/** @description “确认”按钮的统一文案。 */
|
||
const TEXT_CONFIRM = 'Konfirmasi'
|
||
|
||
/** @description “加载中...”的统一文案。 */
|
||
const TEXT_LOADING = 'Memuat...'
|
||
|
||
/** @description 货币类型的统一文案。 */
|
||
const TEXT_CURRENCY_TYPE = 'Jenis Mata Uang'
|
||
|
||
/** @description 支付渠道的统一文案。 */
|
||
const TEXT_PAYMENT_CHANNEL = 'Saluran Pembayaran'
|
||
|
||
/** @description “已封盘”的统一文案。 */
|
||
const TEXT_LOCKED = 'Terkunci'
|
||
|
||
/** @description “已结算”的统一文案。 */
|
||
const TEXT_SETTLED = 'Selesai'
|
||
|
||
export default {
|
||
nav: {
|
||
home: 'Beranda',
|
||
game: 'Game',
|
||
},
|
||
shell: {
|
||
eyebrow: '36 Character Flower',
|
||
subtitle: 'Frontend game undian real-time untuk mobile dan desktop',
|
||
},
|
||
notFound: {
|
||
eyebrow: '404',
|
||
title: 'Halaman yang kamu minta tidak ditemukan.',
|
||
description: 'Rute ini tidak ada. Kembali ke halaman utama scaffold.',
|
||
home: 'Kembali ke beranda',
|
||
},
|
||
home: {
|
||
eyebrow: 'Shell game sedang dibangun',
|
||
title: 'Framework game dual-device 36-character-flower sedang dibangun.',
|
||
description:
|
||
'Proyek ini sudah melewati tahap scaffold umum. Sekarang strukturnya dibangun dengan rute game bersama, state bersama, serta tampilan mobile dan desktop terpisah untuk pengalaman betting real-time.',
|
||
cards: {
|
||
routingMode: 'Routing',
|
||
dataLayer: 'Model state',
|
||
transport: 'Real-time',
|
||
auth: 'Produk',
|
||
metadata: 'Fokus saat ini',
|
||
},
|
||
values: {
|
||
routingMode: 'URL bersama + tampilan device terpisah',
|
||
dataLayer: 'Round / Bet / User / UI / Connection',
|
||
transport: 'HTTP + WebSocket',
|
||
auth: 'Gameplay live draw 36-grid',
|
||
metadata: 'Bangun struktur dulu sebelum polishing state machine',
|
||
},
|
||
footnote:
|
||
'Berikutnya: rute utama game, model bisnis bersama, dan shell halaman mobile serta desktop.',
|
||
primaryAction: 'Masuk lobby game',
|
||
secondaryAction: 'Lihat struktur proyek',
|
||
},
|
||
language: {
|
||
label: 'Bahasa',
|
||
zhCN: '中文',
|
||
enUS: 'English',
|
||
msMY: 'Melayu',
|
||
idID: 'Indonesia',
|
||
},
|
||
game: {
|
||
metaTitle: 'Lobby Game',
|
||
metaDescription: 'Lobby game live 36-character-flower.',
|
||
lobbyTitle: 'Lobby 36 Character Flower',
|
||
lobbySubtitle:
|
||
'Dalam satu rute bisnis bersama, mobile dan desktop memasang tampilan berbeda di atas data dan state game yang sama.',
|
||
status: {
|
||
roundState: 'Status ronde',
|
||
currentRound: 'Ronde saat ini {{id}}',
|
||
tablePool: 'Pool meja',
|
||
onlineCount: '{{count}} online',
|
||
activeChip: 'Chip aktif',
|
||
announcementsRead: '{{read}}/{{total}} pengumuman dibaca',
|
||
connection: 'Koneksi',
|
||
connectionHealthy: 'Sinkronisasi stabil',
|
||
connectionRecovering: 'Menunggu pemulihan',
|
||
synced: 'Tersinkron',
|
||
degraded: 'Menurun',
|
||
},
|
||
board: {
|
||
historyTitle: 'Riwayat ronde',
|
||
historySubtitle: 'Jejak undian dan payout terbaru',
|
||
trendTitle: 'Radar tren',
|
||
trendSubtitle: 'Ringkasan momentum dan miss streak',
|
||
stageTitle: 'Panggung undian',
|
||
stageSubtitle:
|
||
'Panggung ini menampung papan utama dan struktur kontrol sebelum integrasi penuh state machine dan animasi.',
|
||
currentPhase: 'Fase saat ini',
|
||
selectedBet: 'Bet {{amount}}',
|
||
hitCount: '{{count}} hit',
|
||
hitBadge: '{{count}}x',
|
||
badgeWin: 'Menang',
|
||
badgeBet: 'Bet',
|
||
cellLabel: 'Sel {{id}}',
|
||
winningCell: 'Sel pemenang {{id}}',
|
||
missedRounds: 'Miss {{count}} ronde',
|
||
rising: 'Naik',
|
||
falling: 'Turun',
|
||
steady: 'Stabil',
|
||
hitTotal: '{{count}} hit',
|
||
},
|
||
phases: {
|
||
betting: 'Betting',
|
||
locked: TEXT_LOCKED,
|
||
settled: TEXT_SETTLED,
|
||
},
|
||
roundBettingStart: {
|
||
title: 'Ronde {{roundId}}',
|
||
action: 'Mulai Bertaruh',
|
||
},
|
||
jackpotBroadcast: {
|
||
ariaLabel: 'Siaran jackpot',
|
||
ariaMessage:
|
||
'{{nickname}} sedang streak {{streak}} menang dan memenangkan {{amount}}',
|
||
iconAlt: 'Siaran',
|
||
prefix: 'Jackpot kena',
|
||
separator: 'dengan',
|
||
streak: 'streak {{count}} menang',
|
||
winAction: 'memenangkan',
|
||
},
|
||
actions: {
|
||
unifiedBetHint: 'Bet seragam',
|
||
totalBet: 'Total bet',
|
||
canBet: 'Bisa bet',
|
||
yes: TEXT_YES,
|
||
no: TEXT_NO,
|
||
quickBet: 'Quick bet 08',
|
||
clearPending: 'Hapus pending',
|
||
autoModeDemo: 'Demo mode auto',
|
||
stopAuto: 'Stop auto',
|
||
},
|
||
modals: {
|
||
login: {
|
||
title: TEXT_LOGIN,
|
||
},
|
||
register: {
|
||
title: TEXT_REGISTER,
|
||
},
|
||
notice: {
|
||
title: 'Pengumuman Acara',
|
||
content:
|
||
'Bagian ini nantinya akan memuat konten pengumuman acara yang sebenarnya, materi visual, dan pesan panjang yang dapat digulir. Versi saat ini fokus pada sambungan modal multibahasa.',
|
||
check: TEXT_VIEW,
|
||
},
|
||
entryNotice: {
|
||
title: 'Pengumuman Situs',
|
||
subtitle:
|
||
'Silakan baca pengumuman berikut dan konfirmasi sebelum masuk ke game.',
|
||
loading: 'Memuat pengumuman...',
|
||
loadFailed: 'Gagal memuat pengumuman. Silakan coba lagi.',
|
||
retry: 'Muat Ulang',
|
||
agreement: 'Saya telah membaca dan setuju.',
|
||
enterGame: 'Masuk Game',
|
||
},
|
||
rules: {
|
||
title: 'Aturan Permainan',
|
||
content: [
|
||
'## 36 Zihua · Panduan Permainan',
|
||
'',
|
||
'### 1. Pengenalan Permainan',
|
||
'',
|
||
'**36 Zihua** adalah permainan tebak angka berkecepatan tinggi dengan **satu putaran setiap 30 detik**. Setiap putaran, sistem mengeluarkan **satu nomor pemenang** dari **36 simbol** (Tikus, Kerbau, Harimau… Naga Biru, Harimau Putih, Burung Merah, Kura-kura Hitam, dan lainnya). Selama periode taruhan, pemain memilih nomor dan memasang taruhan. Tebak dengan benar untuk memenangkan hadiah. Menang berturut-turut dapat meningkatkan hadiah Anda — **10 kemenangan berturut-turut** dapat memberikan **Jackpot Satu Juta**.',
|
||
'',
|
||
'---',
|
||
'',
|
||
'### 2. Cara Bermain',
|
||
'',
|
||
'Setiap putaran berlangsung sekitar **30 detik**:',
|
||
'',
|
||
'**Langkah 1 — Periode taruhan (0–20 detik)**',
|
||
'Pilih nomor pada grid 36 kotak (default maksimum **5 nomor**), pilih nilai chip (mis. 💎1, 5, 10, 25, 50, 100), lalu konfirmasi taruhan. Saldo Anda akan dipotong dan taruhan dikonfirmasi.',
|
||
'',
|
||
'**Langkah 2 — Penutupan (pada detik ke-20)**',
|
||
'Tidak ada taruhan baru yang diterima. Taruhan yang dipasang setelah penutupan tidak berlaku.',
|
||
'',
|
||
'**Langkah 3 — Pengundian & penyelesaian (20–30 detik)**',
|
||
'Nomor pemenang diumumkan dan hadiah dibayarkan sesuai aturan hadiah.',
|
||
'',
|
||
'**Langkah 4 — Putaran berikutnya**',
|
||
'Setelah penyelesaian, putaran berikutnya dimulai secara otomatis.',
|
||
'',
|
||
'---',
|
||
'',
|
||
'### 3. Aturan Kemenangan',
|
||
'',
|
||
'- Hanya **satu** nomor pemenang yang dikeluarkan setiap putaran (dari 1 hingga 36).',
|
||
'- Anda menang jika **nomor yang dipilih mencakup nomor pemenang**.',
|
||
'- Jika tidak kena, tidak ada hadiah untuk putaran tersebut.',
|
||
'',
|
||
'**Jumlah taruhan pada nomor kena:**',
|
||
'- Jika setiap nomor dipilih dengan jumlah taruhan yang sama:',
|
||
' **Jumlah taruhan pada nomor kena = total taruhan ÷ jumlah nomor yang dipilih**',
|
||
'- Contoh: 5 nomor, total taruhan 💎50 → 💎10 per nomor. Jika nomor pemenang termasuk dalam pilihan Anda, 💎10 digunakan untuk perhitungan hadiah.',
|
||
'',
|
||
'---',
|
||
'',
|
||
'### 4. Jenis Hadiah',
|
||
'',
|
||
'Hadiah kemenangan berturut-turut terdiri dari **dua jenis**. Setiap tingkat hanya menggunakan **satu jenis** — **tidak digabungkan**:',
|
||
'',
|
||
'#### Jenis A — Hadiah Koefisien',
|
||
'',
|
||
'Hadiah dihitung menggunakan pengali odds:',
|
||
'',
|
||
'```',
|
||
'Hadiah = jumlah taruhan pada nomor kena × koefisien odds',
|
||
'```',
|
||
'',
|
||
'#### Jenis B — Hadiah Tetap',
|
||
'',
|
||
'Anda menerima **jumlah tetap** yang ditetapkan dalam konfigurasi.',
|
||
'**Tidak bergantung pada jumlah taruhan dan tidak menggunakan koefisien odds.**',
|
||
'',
|
||
'```',
|
||
'Hadiah = jumlah tetap',
|
||
'```',
|
||
'',
|
||
'**Perbandingan (contoh Tingkat 10):**',
|
||
'',
|
||
'| Jenis Hadiah | Jumlah Taruhan pada Nomor Kena | Hadiah |',
|
||
'|:---:|:---:|:---:|',
|
||
'| Koefisien (1:330) | 💎50 | 💎50 × 330 = **16.500** |',
|
||
'| Hadiah tetap | Berapa pun | **1.000.000** (nilai konfigurasi) |',
|
||
'',
|
||
'---',
|
||
'',
|
||
'### 5. Aturan Kemenangan Berturut-turut',
|
||
'',
|
||
'Saat Anda **menang berturut-turut**, hadiah meningkat sesuai tingkat kemenangan. Secara default, **hadiah koefisien** digunakan dengan odds yang meningkat:',
|
||
'',
|
||
'| Kemenangan Berturut-turut | Odds | Koefisien |',
|
||
'|:---:|:---:|:---:|',
|
||
'| Kemenangan ke-1 | 1:33 | 33 |',
|
||
'| 2 berturut-turut | 1:66 | 66 |',
|
||
'| 3 berturut-turut | 1:99 | 99 |',
|
||
'| 4 berturut-turut | 1:132 | 132 |',
|
||
'| 5 berturut-turut | 1:165 | 165 |',
|
||
'| 6 berturut-turut | 1:198 | 198 |',
|
||
'| 7 berturut-turut | 1:231 | 231 |',
|
||
'| 8 berturut-turut | 1:264 | 264 |',
|
||
'| 9 berturut-turut | 1:297 | 297 |',
|
||
'| 10 berturut-turut | 1:330 | 330 |',
|
||
'',
|
||
'**Aturan kemenangan berturut-turut:**',
|
||
'',
|
||
'- Hadiah dihitung berdasarkan **status kemenangan berturut-turut saat Anda memasang taruhan**: jika Anda sudah memiliki N kemenangan berturut-turut, kemenangan putaran ini dibayar pada tingkat **(N+1)**.',
|
||
'- **Putaran tanpa kemenangan** akan mengatur ulang kemenangan berturut-turut ke nol — Anda mulai lagi dari tingkat 1.',
|
||
'- **Melewatkan putaran** (tidak memasang taruhan) selama kemenangan berturut-turut aktif juga akan **mengatur ulang kemenangan berturut-turut ke nol**.',
|
||
'',
|
||
'**Contoh (hadiah koefisien):**',
|
||
'',
|
||
'| Skenario | Jumlah Taruhan pada Nomor Kena | Tingkat | Odds | Hadiah |',
|
||
'|:---:|:---:|:---:|:---:|:---:|',
|
||
'| Kemenangan pertama | 💎10 | Ke-1 | 1:33 | **330** |',
|
||
'| 3 kemenangan berturut-turut | 💎50 | Ke-3 | 1:99 | **4.950** |',
|
||
'| 10 kemenangan berturut-turut | 💎50 | Ke-10 | 1:330 | **16.500** |',
|
||
'',
|
||
'---',
|
||
'',
|
||
'### 6. Jackpot Satu Juta',
|
||
'',
|
||
'Saat pemain **bertaruh dan menang 10 putaran berturut-turut**, dan setiap taruhan selama kemenangan berturut-turut **minimal 💎50**, Jackpot Satu Juta akan dipicu.',
|
||
'',
|
||
'**Syarat:**',
|
||
'',
|
||
'1. **10 putaran berturut-turut** dengan taruhan dipasang dan dimenangkan di setiap putaran;',
|
||
'2. **Setiap putaran** dalam kemenangan berturut-turut harus memiliki taruhan **minimal 💎50**;',
|
||
'3. Jika ada putaran dalam kemenangan berturut-turut di bawah 💎50, Anda hanya menerima hadiah kemenangan berturut-turut biasa — **Jackpot Satu Juta tidak berlaku**.',
|
||
'',
|
||
'**Cara pembayaran (tergantung konfigurasi backend):**',
|
||
'',
|
||
'- **Hadiah tetap**: Jika tingkat 10 ditetapkan sebagai jumlah tetap, 10 kemenangan berturut-turut membayar **💎1.000.000** secara langsung.',
|
||
'- **Hadiah koefisien**: Jika tingkat 10 menggunakan odds koefisien, Anda menerima hadiah reguler pada **1:330** terlebih dahulu, ditambah jackpot tambahan sesuai aturan kampanye.',
|
||
'',
|
||
'**Contoh — hadiah tetap pada tingkat 10 (💎1.000.000), jumlah taruhan pada nomor kena 💎50 setiap putaran:**',
|
||
'',
|
||
'- 10 kemenangan berturut-turut → **💎1.000.000**',
|
||
'- Kemenangan berturut-turut diatur ulang ke **nol** setelah jackpot diberikan',
|
||
'',
|
||
'**Contoh — hadiah koefisien pada tingkat 10 (1:330), jumlah taruhan pada nomor kena 💎50:**',
|
||
'',
|
||
'- Hadiah reguler tingkat 10: 💎50 × 330 = **💎16.500**',
|
||
'- Jika kampanye Jackpot terpisah berlaku, hadiah satu juta tambahan dapat ditambahkan di atasnya',
|
||
].join('\n'),
|
||
confirm: 'Saya Mengerti',
|
||
},
|
||
procedures: {
|
||
title: 'Isi Ulang / Tarik Dana',
|
||
contentPlaceholder: 'Pilih tindakan yang ingin kamu lanjutkan',
|
||
withdraw: 'Tarik Dana',
|
||
topup: 'Isi Ulang',
|
||
},
|
||
autoSetting: {
|
||
title: TEXT_AUTO_HOSTING,
|
||
startAutoSpin: 'Mulai Auto Spin',
|
||
rows: {
|
||
stopIfBalanceLowerThan: 'Berhenti jika saldo lebih rendah dari',
|
||
stopIfSingleWinExceeds: 'Berhenti jika kemenangan tunggal melebihi',
|
||
stopOnAnyJackpot: 'Berhenti pada jackpot apa pun',
|
||
},
|
||
},
|
||
userInfo: {
|
||
title: 'Info Pengguna',
|
||
tabs: {
|
||
profile: 'Profil',
|
||
financeRecords: 'Riwayat Isi Ulang / Penarikan',
|
||
walletRecords: TEXT_WALLET_RECORDS,
|
||
message: TEXT_SITE_MESSAGES,
|
||
},
|
||
profile: {
|
||
name: 'Nama',
|
||
tel: 'Telepon',
|
||
registeredAt: 'Tanggal daftar',
|
||
copyInviteLink: 'Salin tautan undangan',
|
||
logout: 'Keluar',
|
||
loggingOut: 'Keluar...',
|
||
signature:
|
||
'Tanda tanganku seunik diriku. Bagian ini nantinya akan menampilkan ringkasan profil yang sebenarnya.',
|
||
},
|
||
message: {
|
||
title: TEXT_SITE_MESSAGES,
|
||
back: 'Kembali',
|
||
loading: 'Memuat pesan...',
|
||
loadFailed: 'Gagal memuat pesan. Silakan coba lagi nanti.',
|
||
empty: 'Belum ada pesan',
|
||
read: 'Sudah dibaca',
|
||
unread: 'Belum dibaca',
|
||
eventBonus:
|
||
'[Event Bonus Isi Ulang] Dari 1 Oktober hingga 7 Oktober 2026, klaim hadiah rebate kamu...',
|
||
check: TEXT_VIEW,
|
||
deleteRecords: 'Hapus riwayat',
|
||
},
|
||
financeRecords: {
|
||
deposit: 'Riwayat Isi Ulang',
|
||
withdraw: 'Riwayat Penarikan',
|
||
orderNo: 'No. Pesanan',
|
||
amount: 'Jumlah',
|
||
bonusAmount: 'Jumlah Bonus',
|
||
status: 'Status',
|
||
statuses: {
|
||
pending_review: 'Menunggu Tinjauan',
|
||
approved: 'Disetujui',
|
||
rejected: 'Ditolak',
|
||
failed: 'Gagal',
|
||
},
|
||
loading: 'Memuat riwayat...',
|
||
loadFailed: 'Gagal memuat riwayat. Silakan coba lagi nanti.',
|
||
empty: 'Belum ada riwayat',
|
||
page: TEXT_PAGE_INDICATOR,
|
||
previous: TEXT_PREV_PAGE,
|
||
next: TEXT_NEXT_PAGE,
|
||
},
|
||
walletRecords: {
|
||
amount: 'Jumlah',
|
||
balanceAfter: 'Sesudah',
|
||
balanceBefore: 'Sebelum',
|
||
empty: 'Belum ada riwayat dompet',
|
||
loadFailed: 'Gagal memuat riwayat dompet. Silakan coba lagi nanti.',
|
||
loading: 'Memuat riwayat dompet...',
|
||
next: TEXT_NEXT_PAGE,
|
||
page: TEXT_PAGE_INDICATOR,
|
||
previous: TEXT_PREV_PAGE,
|
||
remark: 'Catatan',
|
||
time: TEXT_TIME,
|
||
type: TEXT_WALLET_RECORDS,
|
||
},
|
||
},
|
||
withdrawTopup: {
|
||
applyWithdraw: 'Ajukan Penarikan',
|
||
applyTopup: 'Ajukan Isi Ulang',
|
||
},
|
||
},
|
||
autoSpin: {
|
||
eyebrow: 'Auto spin',
|
||
title: 'Auto spin berjalan',
|
||
description:
|
||
'Mode auto akan menutupi board sambil mempertahankan fokus sel target dan progres.',
|
||
runningRounds: 'Auto spin berjalan, {{count}} ronde selesai',
|
||
trailingLabel: 'Input manual terkunci',
|
||
},
|
||
footer: {
|
||
implementationTitle: 'Implementasi saat ini',
|
||
implementationSubtitle:
|
||
'Iterasi ini memprioritaskan shell dual-device, model bersama, dan wiring bisnis.',
|
||
implementationBody:
|
||
'Langkah berikutnya adalah API nyata, WebSocket, UI store penuh, dan state machine siklus ronde.',
|
||
limitsTitle: 'Batas meja',
|
||
limitsSubtitle: 'Berasal dari data lobby saat ini',
|
||
minBet: 'Bet minimum',
|
||
maxBet: 'Bet maksimum',
|
||
},
|
||
},
|
||
commonUi: {
|
||
dialog: {
|
||
close: 'Tutup notifikasi',
|
||
confirm: 'OK',
|
||
no: TEXT_NO,
|
||
yes: TEXT_YES,
|
||
},
|
||
modal: {
|
||
close: 'Tutup modal',
|
||
defaultAriaLabel: 'Modal',
|
||
},
|
||
boot: {
|
||
loading: 'Memuat sumber daya',
|
||
syncing: 'Menyinkronkan deck bunga dan antarmuka game',
|
||
},
|
||
support: {
|
||
title: 'Dukungan Langsung',
|
||
connecting: 'Menghubungkan ke dukungan',
|
||
},
|
||
toast: {
|
||
lobbyInitFailed: 'Gagal memuat lobby game',
|
||
loginRequired: 'Silakan masuk sebelum memasuki game',
|
||
loginSuccess: 'Berhasil masuk',
|
||
logoutSuccess: 'Berhasil keluar',
|
||
logoutLocalOnly: 'Permintaan keluar gagal. Sesi lokal telah dibersihkan.',
|
||
registerSuccess: 'Pendaftaran berhasil',
|
||
inviteLinkCopied: 'Tautan undangan disalin',
|
||
inviteLinkCopyFailed:
|
||
'Gagal menyalin tautan undangan. Silakan salin secara manual.',
|
||
insufficientBalance: 'Saldo tidak cukup. Silakan sesuaikan taruhan.',
|
||
betLimitExceeded: TEXT_BET_LIMIT_EXCEEDED,
|
||
betUnavailable: 'Taruhan tidak tersedia untuk ronde ini',
|
||
betPlaced: 'Taruhan berhasil dikirim',
|
||
noRecentSuccessfulBet:
|
||
'Tidak ada riwayat taruhan berhasil dari ronde sebelumnya',
|
||
repeatSelectionsRestored:
|
||
'Pilihan dari ronde berhasil terakhir telah dipulihkan',
|
||
betRejected: 'Taruhan tidak diterima',
|
||
betPlaceFailed: 'Gagal mengirim taruhan. Silakan coba lagi.',
|
||
selectNumbersBeforeAutoHosting: 'Pilih angka terlebih dahulu',
|
||
autoHostingStarted: 'Auto spin dimulai',
|
||
autoHostingStopped: 'Auto spin berhenti',
|
||
autoHostingStoppedBalance:
|
||
'Kondisi saldo tercapai. Auto spin telah berhenti.',
|
||
autoHostingStoppedBetLimit:
|
||
'Melebihi batas taruhan tunggal. Auto spin telah berhenti.',
|
||
autoHostingStoppedWin:
|
||
'Kondisi kemenangan tunggal tercapai. Auto spin telah berhenti.',
|
||
autoHostingStoppedJackpot: 'Jackpot tercapai. Auto spin telah berhenti.',
|
||
autoHostingSubmitFailed:
|
||
'Taruhan auto-hosting gagal. Auto-hosting telah dihentikan.',
|
||
requestFailed: 'Permintaan gagal. Silakan coba lagi nanti.',
|
||
configError: 'Kesalahan konfigurasi. Silakan hubungi dukungan.',
|
||
},
|
||
},
|
||
auth: {
|
||
common: {
|
||
arrowIconAlt: 'Panah',
|
||
actions: {
|
||
submitting: TEXT_SUBMITTING,
|
||
},
|
||
passwordVisibility: {
|
||
hide: 'Sembunyikan kata sandi',
|
||
show: 'Tampilkan kata sandi',
|
||
},
|
||
},
|
||
login: {
|
||
actions: {
|
||
submit: TEXT_LOGIN,
|
||
},
|
||
fields: {
|
||
username: {
|
||
label: TEXT_MOBILE_LABEL,
|
||
placeholder: TEXT_MOBILE_PLACEHOLDER,
|
||
},
|
||
password: {
|
||
label: TEXT_PASSWORD_LABEL,
|
||
placeholder: TEXT_PASSWORD_PLACEHOLDER,
|
||
},
|
||
},
|
||
footer: {
|
||
registerAccount: 'Daftar akun',
|
||
forgotPassword: 'Lupa kata sandi',
|
||
},
|
||
errors: {
|
||
submitFailed: 'Login gagal. Silakan coba lagi nanti.',
|
||
invalidCredentials: 'Akun atau kata sandi salah.',
|
||
},
|
||
},
|
||
register: {
|
||
actions: {
|
||
submit: TEXT_REGISTER,
|
||
},
|
||
fields: {
|
||
mobile: {
|
||
label: TEXT_MOBILE_LABEL,
|
||
placeholder: TEXT_MOBILE_PLACEHOLDER,
|
||
},
|
||
captcha: {
|
||
label: 'Kode:',
|
||
placeholder: 'Masukkan kode verifikasi',
|
||
},
|
||
password: {
|
||
label: TEXT_PASSWORD_LABEL,
|
||
placeholder: TEXT_PASSWORD_PLACEHOLDER,
|
||
},
|
||
confirmPassword: {
|
||
label: 'Konfirmasi Kata Sandi:',
|
||
placeholder: 'Masukkan ulang kata sandi',
|
||
},
|
||
inviteCode: {
|
||
label: 'Kode Undangan:',
|
||
placeholder: 'Masukkan kode undangan',
|
||
},
|
||
},
|
||
footer: {
|
||
alreadyHaveAccount: 'Sudah punya akun',
|
||
needHelp: 'Butuh bantuan',
|
||
},
|
||
errors: {
|
||
submitFailed: 'Pendaftaran gagal. Silakan coba lagi nanti.',
|
||
unauthorized: 'Pendaftaran tidak diizinkan. Silakan coba lagi nanti.',
|
||
},
|
||
sms: {
|
||
countdown: '{{seconds}}d',
|
||
errors: {
|
||
submitFailed: 'Gagal mengirim kode. Silakan coba lagi nanti.',
|
||
},
|
||
send: 'Ambil kode',
|
||
sending: TEXT_SUBMITTING,
|
||
success: 'Kode verifikasi telah dikirim.',
|
||
},
|
||
},
|
||
validation: {
|
||
captcha: {
|
||
required: 'Silakan masukkan kode verifikasi.',
|
||
},
|
||
username: {
|
||
required: 'Silakan masukkan nomor ponsel.',
|
||
invalidPhone: 'Silakan masukkan nomor ponsel yang valid.',
|
||
},
|
||
password: {
|
||
min: 'Kata sandi minimal 6 karakter.',
|
||
max: 'Kata sandi maksimal 32 karakter.',
|
||
},
|
||
inviteCode: {
|
||
required: 'Silakan masukkan kode undangan.',
|
||
max: 'Kode undangan maksimal 32 karakter.',
|
||
},
|
||
confirmPassword: {
|
||
mismatch: 'Kedua kata sandi tidak sama.',
|
||
},
|
||
},
|
||
errors: {
|
||
requestFailed: 'Permintaan gagal. Silakan coba lagi nanti.',
|
||
authTokenConfigMissing:
|
||
'Konfigurasi autentikasi tidak ada. Silakan hubungi dukungan.',
|
||
timeout: 'Permintaan habis waktu. Silakan coba lagi nanti.',
|
||
serviceUnavailable:
|
||
'Layanan sedang tidak tersedia. Silakan coba lagi nanti.',
|
||
},
|
||
},
|
||
gameDesktop: {
|
||
header: {
|
||
systemTime: 'Waktu Sistem',
|
||
rules: 'Aturan',
|
||
message: TEXT_SITE_MESSAGES,
|
||
bgm: 'BGM',
|
||
id: 'ID',
|
||
fullscreen: 'Layar',
|
||
login: TEXT_LOGIN,
|
||
register: TEXT_REGISTER,
|
||
},
|
||
control: {
|
||
trend: 'Tren',
|
||
map: 'Peta',
|
||
selected: 'Dipilih',
|
||
totalBet: 'Total Bet',
|
||
confirm: TEXT_CONFIRM,
|
||
selectNumbers: 'Pilih Nombor',
|
||
insufficientBalance: 'Saldo Tidak Cukup',
|
||
betLimitExceeded: 'Batas Terlampaui',
|
||
submitting: TEXT_SUBMITTING,
|
||
actions: {
|
||
clear: 'Hapus',
|
||
repeat: 'Ulang',
|
||
'auto-spin': TEXT_AUTO_HOSTING,
|
||
},
|
||
},
|
||
status: {
|
||
odds: 'Odds',
|
||
streak: 'Streak',
|
||
limit: 'Batas',
|
||
roundId: 'Ronde',
|
||
phase: {
|
||
betting: {
|
||
label: 'Buka',
|
||
description: '(Menerima Bet)',
|
||
},
|
||
locked: {
|
||
label: TEXT_LOCKED,
|
||
description: '(Bet Ditutup)',
|
||
},
|
||
revealing: {
|
||
label: 'Drawing',
|
||
description: '(Mengungkap Hasil)',
|
||
},
|
||
settled: {
|
||
label: 'Drawing',
|
||
description: '(Ronde Selesai)',
|
||
},
|
||
waiting: {
|
||
label: 'Menunggu',
|
||
description: '(Menunggu Ronde Berikutnya)',
|
||
},
|
||
},
|
||
},
|
||
title: {
|
||
announcement: 'Pengumuman',
|
||
},
|
||
animal: {
|
||
insufficientBalanceRecharge: 'Saldo tidak cukup, silakan isi ulang',
|
||
betLimitExceeded: TEXT_BET_LIMIT_EXCEEDED,
|
||
loading: 'Memuat',
|
||
selectionLimitReached: 'Melebihi pilihan yang diizinkan',
|
||
tapToEnter: 'Ketuk Untuk Masuk',
|
||
getStart: 'Mulai',
|
||
noBet: 'Belum Bertaruh',
|
||
noReward: 'Belum Menang Ronde Ini',
|
||
selectedResult: 'Pilihan Kamu',
|
||
winningResult: 'Bunga Menang',
|
||
},
|
||
history: {
|
||
title: 'Riwayat',
|
||
pending: 'PENDING',
|
||
win: 'WIN',
|
||
lost: 'LOST',
|
||
orderNo: 'No. Order',
|
||
roundId: 'ID Ronde',
|
||
numbers: 'Nomor Taruhan',
|
||
createdAt: TEXT_TIME,
|
||
settledAt: 'Waktu Selesai',
|
||
totalPoolAmount: 'Jumlah Taruhan',
|
||
winningResult: 'Hasil Menang',
|
||
payout: 'Jumlah Menang',
|
||
empty: 'Belum ada riwayat',
|
||
end: 'Tidak ada catatan lagi',
|
||
loading: TEXT_LOADING,
|
||
settled: TEXT_SETTLED,
|
||
},
|
||
periodHistory: {
|
||
title: 'Riwayat Hasil Undian',
|
||
close: 'Tutup riwayat hasil undian',
|
||
empty: 'Belum ada hasil undian',
|
||
failed: 'Gagal memuat hasil undian',
|
||
loading: TEXT_LOADING,
|
||
retry: 'Coba lagi',
|
||
},
|
||
topup: {
|
||
title: 'Konfigurasi Isi Ulang',
|
||
platformCoinLabel: 'Koin Platform',
|
||
currencyLabel: TEXT_CURRENCY_TYPE,
|
||
channelLabel: TEXT_PAYMENT_CHANNEL,
|
||
rateHint:
|
||
'Kurs hanya sebagai referensi. Jumlah akhir mengikuti kurs saat isi ulang.',
|
||
flow: {
|
||
channelTitle: 'Pilih Saluran Pembayaran',
|
||
currencyTitle: 'Mata Uang',
|
||
methodTitle: 'Metode Isi Ulang',
|
||
bankTitle: 'Bank',
|
||
bankPlaceholder: 'Pilih bank',
|
||
noBank: 'Tidak ada bank tersedia',
|
||
paymentMethods: {
|
||
QR: 'Kode QR',
|
||
ONLINE_DEBIT: 'Perbankan Online',
|
||
E_WALLET: 'Dompet Elektronik',
|
||
},
|
||
},
|
||
tier: {
|
||
bonus: 'Bonus',
|
||
coins: 'Koin Masuk',
|
||
createSuccess: 'Order isi ulang berhasil dibuat',
|
||
empty: 'Belum ada tier isi ulang',
|
||
failed: 'Gagal memuat tier isi ulang',
|
||
loading: 'Memuat tier isi ulang...',
|
||
missingPayUrl:
|
||
'Tautan pembayaran tidak tersedia. Silakan coba lagi nanti.',
|
||
openPayUrlFailed:
|
||
'Gagal membuka halaman pembayaran. Periksa pengaturan popup browser Anda.',
|
||
source: 'Endpoint tier isi ulang',
|
||
title: 'Tier Isi Ulang',
|
||
},
|
||
preview: {
|
||
title: 'Pratinjau Isi Ulang',
|
||
depositTitle: 'Pilih mata uang isi ulang dan saluran pembayaran',
|
||
depositRate: 'Rasio Isi Ulang ({{currency}})',
|
||
depositRateValue: '1 {{currency}} = {{coins}} {{platformCoinLabel}}',
|
||
amount: 'Contoh Kredit',
|
||
},
|
||
},
|
||
mobile: {
|
||
placeholder: 'Halaman mobile sedang dibangun',
|
||
},
|
||
withdraw: {
|
||
availableBalance: 'Saldo tersedia: {{amount}}',
|
||
currencySelection: 'Pilihan jenis mata uang',
|
||
selectCurrency: 'Pilih jenis mata uang',
|
||
referenceRateNotice:
|
||
'Kurs hanya sebagai referensi. Jumlah akhir mengikuti kurs saat penarikan.',
|
||
eWallet: 'Dompet elektronik',
|
||
bank: 'Bank',
|
||
minimumAmount: 'Minimum {{currency}} {{amount}}',
|
||
processingTime: 'Waktu proses',
|
||
arrivalTimeValue: 'Masuk dalam 30 detik',
|
||
notice: 'Perhatian',
|
||
feeNotice:
|
||
'Transaksi antara RM10 dan RM99.99 akan dikenakan biaya penarikan minimum RM 1.',
|
||
cancel: 'Batal',
|
||
confirm: TEXT_CONFIRM,
|
||
submitSuccess: 'Permintaan penarikan berhasil dikirim',
|
||
withdrawal: 'Penarikan',
|
||
fields: {
|
||
diamondAmount: 'Jumlah Berlian Penarikan',
|
||
currencyType: TEXT_CURRENCY_TYPE,
|
||
paymentChannel: TEXT_PAYMENT_CHANNEL,
|
||
paymentType: 'Jenis Pembayaran',
|
||
bankCode: 'Kode Bank',
|
||
cardHolderName: 'Nama Pemilik Rekening',
|
||
bankAccountNumber: 'Nomor Rekening Bank',
|
||
receiverEmail: 'Email Penerima',
|
||
receiverPhone: 'Telepon Penerima',
|
||
},
|
||
placeholders: {
|
||
bankCode: 'Pilih kode bank',
|
||
paymentType: 'Pilih jenis pembayaran',
|
||
cardHolderName: 'Masukkan nama pemilik rekening',
|
||
bankAccountNumber: 'Masukkan nomor rekening bank',
|
||
receiverEmail: 'Masukkan email penerima',
|
||
receiverPhone: 'Masukkan nomor telepon penerima',
|
||
},
|
||
errors: {
|
||
amountRequired: 'Silakan masukkan jumlah diamond penarikan.',
|
||
amountBelowMinimum:
|
||
'Jumlah penarikan tidak boleh lebih kecil dari minimum ({{currency}} {{amount}} / {{diamonds}} diamond).',
|
||
amountBelowPaymentMinimum:
|
||
'Jumlah penarikan tidak boleh lebih kecil dari minimum jenis pembayaran ini ({{amount}}).',
|
||
amountAbovePaymentMaximum:
|
||
'Jumlah penarikan tidak boleh melebihi maksimum jenis pembayaran ini ({{amount}}).',
|
||
bankCodeRequired: 'Silakan pilih kode bank.',
|
||
bankCodeUnavailable: 'Saat ini tidak ada kode bank yang tersedia.',
|
||
cardHolderNameRequired: 'Silakan masukkan nama pemilik rekening.',
|
||
bankAccountRequired: 'Silakan masukkan nomor rekening bank.',
|
||
paymentChannelRequired: 'Silakan pilih saluran pembayaran.',
|
||
paymentChannelUnavailable:
|
||
'Saat ini tidak ada saluran pembayaran yang tersedia.',
|
||
paymentTypeRequired: 'Silakan pilih jenis pembayaran.',
|
||
receiverEmailInvalid: 'Silakan masukkan alamat email yang valid.',
|
||
receiverPhoneInvalid: 'Silakan masukkan nomor telepon yang valid.',
|
||
amountExceedsBalance:
|
||
'Jumlah penarikan tidak boleh melebihi saldo saat ini.',
|
||
},
|
||
success: {
|
||
orderNo: 'No. pesanan: {{orderNo}}',
|
||
actualArrivalCoin: 'Diamond masuk aktual: {{amount}}',
|
||
feeCoin: 'Diamond biaya: {{amount}}',
|
||
reviewRequired: 'Perlu tinjauan risiko: {{value}}',
|
||
},
|
||
preview: {
|
||
title: 'Pratinjau Penukaran',
|
||
diamondAmount: 'Jumlah Berlian',
|
||
exchangeRate: 'Rasio Penukaran ({{currency}})',
|
||
exchangeRateValue: '{{coins}} {{platformCoinLabel}} = 1 {{currency}}',
|
||
convertible: 'Bisa Ditukar {{currency}}',
|
||
fixedExchangeDiamondAmount: 'Jumlah Berlian Tukar Tetap',
|
||
},
|
||
},
|
||
},
|
||
} as const
|