- 在桌面端和移动端头部组件中添加余额刷新按钮 - 实现 useWalletBalanceRefresh 钩子用于余额刷新逻辑 - 添加刷新图标并集成到钻石币显示区域 - 支持多语言本地化包括英语、印尼语、马来语和中文 - 优化消息广播组件的动画过渡效果 - 添加防重复提交机制避免并发刷新请求 - 集成加载状态显示和错误处理通知功能
864 lines
32 KiB
TypeScript
864 lines
32 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',
|
||
},
|
||
jackpotPool: {
|
||
ariaLabel: 'Pool jackpot saat ini {{amount}}',
|
||
iconAlt: 'Pool jackpot',
|
||
label: 'Jackpot',
|
||
promoLine1: 'Menang 10 Ronde Beruntun',
|
||
promoLine2: 'Dan Raih Super Jackpot',
|
||
},
|
||
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: [
|
||
'## Panduan Peraturan 36 Zihua',
|
||
'',
|
||
'### 1. Pengenalan Game',
|
||
'',
|
||
'**36 Zihua** adalah permainan prediksi angka. Dalam setiap putaran, **1 nomor pemenang** akan dipilih dari **36 simbol**. Pemain memilih nomor dan memasang taruhan pada tahap taruhan. Jika tebakan benar, pemain akan mendapatkan hadiah. Kemenangan beruntun dapat meningkatkan hadiah, dan setelah mencapai tier jackpot, pemain juga berkesempatan memenangkan **Jackpot Satu Juta**.',
|
||
'',
|
||
'---',
|
||
'',
|
||
'### 2. Cara Bermain',
|
||
'',
|
||
'Setiap putaran dibagi menjadi beberapa tahap berikut:',
|
||
'',
|
||
'1. **Tahap Taruhan**',
|
||
' Pemain memilih nomor yang ingin dipertaruhkan dari 36 nomor, memilih chip, mengonfirmasi taruhan, dan sistem akan memotong saldo serta membuat catatan taruhan.',
|
||
' Jumlah maksimum nomor yang dapat dipilih per putaran bergantung pada konfigurasi sistem saat ini.',
|
||
'',
|
||
'2. **Tahap Penutupan Taruhan**',
|
||
' Setelah putaran memasuki tahap penutupan, sistem berhenti menerima taruhan baru.',
|
||
'',
|
||
'3. **Tahap Pengundian dan Penyelesaian**',
|
||
' Sistem akan mengumumkan nomor pemenang untuk putaran tersebut dan secara otomatis menyelesaikan hadiah sesuai aturan yang berlaku.',
|
||
'',
|
||
'4. **Putaran Berikutnya Dimulai**',
|
||
' Setelah putaran saat ini selesai diselesaikan, sistem akan otomatis memulai putaran berikutnya.',
|
||
'',
|
||
'---',
|
||
'',
|
||
'### 3. Aturan Kemenangan',
|
||
'',
|
||
'1. Hanya **1 nomor pemenang** yang akan dikeluarkan di setiap putaran.',
|
||
'2. Jika nomor yang dipilih pemain **mencakup nomor pemenang**, maka taruhan tersebut dianggap menang.',
|
||
'3. Dalam setiap putaran, pemain hanya boleh bertaruh pada **1–5 nomor**, dan tidak boleh melebihi **5 nomor**.',
|
||
'4. Jika pemain memilih beberapa nomor dan jumlah taruhan untuk setiap nomor sama, maka:',
|
||
'',
|
||
'```text',
|
||
'Nilai Taruhan Nomor Menang = Total Taruhan ÷ Jumlah Nomor yang Dipilih',
|
||
'```',
|
||
'',
|
||
'**Contoh:**',
|
||
'Jika pemain memilih **5 nomor** dengan total taruhan **💎50**, maka setiap nomor memiliki nilai taruhan **💎10**.',
|
||
'Jika nomor pemenang berada di antara 5 nomor tersebut, hadiah akan dihitung berdasarkan **💎10**.',
|
||
'',
|
||
'---',
|
||
'',
|
||
'### 4. Aturan Hadiah',
|
||
'',
|
||
'Hadiah kemenangan beruntun dibagi menjadi **dua jenis**, dan hanya satu jenis yang berlaku pada setiap tier kemenangan beruntun:',
|
||
'',
|
||
'#### 1. Hadiah Koefisien',
|
||
'',
|
||
'Hadiah dihitung dengan mengalikan nilai taruhan nomor menang dengan koefisien odds pada tier saat ini:',
|
||
'',
|
||
'```text',
|
||
'Jumlah Kemenangan = Nilai Taruhan Nomor Menang × Koefisien Odds',
|
||
'```',
|
||
'',
|
||
'#### 2. Hadiah Tetap',
|
||
'',
|
||
'Sistem akan langsung membayar jumlah tetap yang telah dikonfigurasi, tanpa bergantung pada jumlah taruhan pada putaran tersebut:',
|
||
'',
|
||
'```text',
|
||
'Jumlah Kemenangan = Jumlah Hadiah Tetap',
|
||
'```',
|
||
'',
|
||
'#### 3. Catatan Tabel Hadiah',
|
||
'',
|
||
'Tabel hadiah kemenangan beruntun saat ini mengikuti konfigurasi backend sistem, dan frontend harus menampilkannya berdasarkan data konfigurasi terbaru.',
|
||
'Setiap tier berisi informasi berikut:',
|
||
'',
|
||
'- Tier kemenangan beruntun',
|
||
'- Jenis hadiah',
|
||
'- Koefisien odds',
|
||
'- Jumlah hadiah tetap',
|
||
'- Apakah termasuk tier jackpot',
|
||
'',
|
||
'Dengan kata lain, tabel hadiah tidak ditulis tetap. Isi sebenarnya selalu mengikuti konfigurasi sistem saat ini.',
|
||
'',
|
||
'---',
|
||
'',
|
||
'### 5. Aturan Kemenangan Berturut-turut',
|
||
'',
|
||
'Saat pemain menang dalam beberapa putaran berturut-turut, pemain akan masuk ke status kemenangan beruntun. Semakin tinggi kemenangan beruntun, semakin tinggi tier hadiah.',
|
||
'',
|
||
'#### 1. Aturan Perhitungan Kemenangan Beruntun',
|
||
'',
|
||
'1. Setelah pemain menang, jumlah kemenangan beruntun akan bertambah.',
|
||
'2. Hadiah dihitung berdasarkan **tier kemenangan beruntun saat taruhan dipasang**.',
|
||
'3. Jika pemain kalah di putaran mana pun, kemenangan beruntun akan langsung direset ke **0**.',
|
||
'4. Dalam implementasi saat ini, kemenangan biasa akan melanjutkan kemenangan beruntun, tetapi jika pemain mengenai **tier jackpot**, maka kemenangan beruntun akan langsung direset ke **0** setelah putaran tersebut selesai diselesaikan.',
|
||
'',
|
||
'#### 2. Batas Taruhan Saat Kemenangan Beruntun Jackpot',
|
||
'',
|
||
'Ketika kemenangan beruntun pemain mencapai tier **jackpot pertama** yang dikonfigurasi oleh sistem, pemain akan masuk ke tahap pembatasan taruhan jackpot.',
|
||
'',
|
||
'Aturannya sebagai berikut:',
|
||
'',
|
||
'1. Dalam setiap putaran berikutnya, **total jumlah taruhan** **tidak boleh melebihi** jumlah taruhan dari **putaran pertama yang memenangkan jackpot** dalam kemenangan beruntun saat ini.',
|
||
'2. Batas ini akan tetap terkunci selama kemenangan beruntun saat ini berlangsung dan tidak akan berubah meskipun pemain kembali memenangkan jackpot setelah itu.',
|
||
'3. Setelah kemenangan beruntun terputus, pembatasan ini akan langsung dihapus.',
|
||
'4. Kemenangan beruntun biasa sebelum mencapai tier jackpot tidak terpengaruh oleh aturan ini.',
|
||
'',
|
||
'{{STREAK_REWARD_TABLE}}',
|
||
'',
|
||
'---',
|
||
'',
|
||
'### 6. Jackpot Satu Juta',
|
||
'',
|
||
'Ketika pemain mencapai tier jackpot yang dikonfigurasi sistem melalui kemenangan beruntun, dan tier jackpot tersebut dikonfigurasi sebagai hadiah tetap, pemain bisa menerima Jackpot Satu Juta.',
|
||
'',
|
||
'#### 1. Syarat Pemicu',
|
||
'',
|
||
'1. Pemain harus terus menang sampai mencapai tier jackpot yang saat ini dikonfigurasi oleh sistem.',
|
||
'2. Jika tier jackpot dikonfigurasi sebagai **hadiah tetap**, misalnya **💎1,000,000**, pemain akan langsung menerima Jackpot Satu Juta saat berhasil mengenai tier tersebut.',
|
||
'3. Dalam implementasi saat ini, **tidak ada syarat taruhan minimum tambahan**. Selama pemain memenuhi jumlah taruhan minimum yang diizinkan oleh platform, pemain dapat mengikuti kemenangan beruntun jackpot.',
|
||
'4. Setelah mengenai tier jackpot, begitu penyelesaian selesai, kemenangan beruntun akan direset ke **0**.',
|
||
'',
|
||
'#### 2. Aturan Pembayaran',
|
||
'',
|
||
'- Jika tier jackpot dikonfigurasi sebagai **hadiah tetap**, jumlah jackpot tetap yang telah dikonfigurasi akan dibayarkan langsung.',
|
||
'- Jika tier jackpot dikonfigurasi sebagai **hadiah koefisien**, hadiah akan dihitung sebagai **nilai taruhan nomor menang × koefisien odds**, dan satu juta tetap tidak akan dibayarkan secara otomatis.',
|
||
'',
|
||
'**Contoh:**',
|
||
'',
|
||
'- Jika tier jackpot dikonfigurasi sebagai hadiah tetap **💎1,000,000**',
|
||
'- Pemain mencapai tier jackpot tersebut dan menang',
|
||
'- Maka pemain akan langsung menerima **💎1,000,000**',
|
||
'',
|
||
'---',
|
||
].join('\n'),
|
||
confirm: 'Saya Mengerti',
|
||
streakRewardTable: {
|
||
title: 'Tabel Hadiah Kemenangan Beruntun',
|
||
columns: {
|
||
streak: 'Tier',
|
||
rewardType: 'Jenis Hadiah',
|
||
oddsFactor: 'Odds',
|
||
fixedAmount: 'Hadiah Tetap',
|
||
isJackpot: 'Jackpot',
|
||
},
|
||
rewardTypes: {
|
||
coefficient: 'Hadiah Koefisien',
|
||
fixed: 'Hadiah Tetap',
|
||
},
|
||
streakValue: 'Putaran {{streak}}',
|
||
yes: TEXT_YES,
|
||
no: TEXT_NO,
|
||
empty: 'Belum ada konfigurasi hadiah',
|
||
},
|
||
},
|
||
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: {
|
||
actions: {
|
||
refreshBalance: 'Segarkan saldo',
|
||
submitting: TEXT_SUBMITTING,
|
||
},
|
||
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}}',
|
||
handlingFee: 'Biaya Penanganan',
|
||
quickDiamondAmount: '{{amount}} diamond',
|
||
quickHandlingFee: 'Biaya dipotong: {{fee}}',
|
||
fixedExchangeDiamondAmount: 'Jumlah Berlian Tukar Tetap',
|
||
},
|
||
},
|
||
},
|
||
} as const
|