Files
36-character-flower/src/locales/id-ID/common.ts
JiaJun dbfe5701aa feat(game): 优化界面组件
- 在国际化文件中添加钱包流水相关翻译项
- 在用户个人资料页面添加复制邀请链接功能
- 优化桌面端动物组件的视觉效果和动画参数
- 添加虚拟滚动功能到财务记录标签页提升性能
- 为桌面端控制面板添加投注数量调节按钮
- 更新消息模态框为通知列表和详情展示
- 在头部余额显示旁添加充值图标入口
2026-05-28 11:34:02 +08:00

539 lines
19 KiB
TypeScript

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: 'Bahasa Melayu',
idID: 'Bahasa 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: 'Terkunci',
revealing: 'Mengungkap',
settled: 'Selesai',
},
actions: {
unifiedBetHint: 'Bet seragam',
totalBet: 'Total bet',
canBet: 'Bisa bet',
yes: 'Ya',
no: 'Tidak',
quickBet: 'Quick bet 08',
clearPending: 'Hapus pending',
autoModeDemo: 'Demo mode auto',
stopAuto: 'Stop auto',
},
modals: {
login: {
title: 'Masuk',
},
register: {
title: 'Daftar',
},
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: 'Lihat',
},
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:
'1. Gameplay Dasar\n1) Setelah setiap ronde dimulai, pemain dapat memilih satu atau beberapa angka di papan untuk memasang taruhan.\n2) Setelah taruhan ditutup, sistem masuk ke fase undian dan menyelesaikan hadiah berdasarkan hasil ronde.\n3) Level chip yang berbeda mewakili jumlah taruhan yang berbeda, mengikuti batas meja dan konfigurasi saat ini.\n\n2. Catatan Taruhan\n1) Taruhan hanya bisa dikirim saat fase taruhan berlangsung.\n2) Sebelum konfirmasi, periksa kembali angka yang dipilih, nominal chip, dan total taruhan.\n3) Jika saldo tidak cukup, ronde tidak lagi valid, atau taruhan sudah ditutup, permintaan akan ditolak.\n\n3. Undian dan Penyelesaian\n1) Hasil undian akhir yang ditampilkan sistem adalah hasil yang berlaku.\n2) Aturan kena, odds, pembayaran, dan performa streak diselesaikan secara real time sesuai konfigurasi room saat ini.\n3) Jika terjadi gangguan jaringan, silakan mengacu pada data resmi setelah sinkronisasi ulang.\n\n4. Catatan Tambahan\n1) Mohon atur waktu bermain secara bertanggung jawab.\n2) Segala tindakan tidak wajar untuk mengganggu sistem, mengeksploitasi hadiah, atau menghindari kontrol risiko dilarang keras.\n3) Platform berhak meninjau pesanan, pembayaran, dan status akun dalam kondisi khusus.',
confirm: 'Saya Mengerti',
},
procedures: {
title: 'Isi Ulang / Tarik Dana',
contentPlaceholder: 'Pilih tindakan yang ingin kamu lanjutkan',
withdraw: 'Tarik Dana',
topup: 'Isi Ulang',
},
autoSetting: {
title: 'Auto Spin',
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: 'Riwayat Dompet',
message: 'Pesan',
},
profile: {
name: 'Nama',
tel: 'Telepon',
registeredAt: 'Tanggal daftar',
copyInviteLink: 'Salin tautan undangan',
signature:
'Tanda tanganku seunik diriku. Bagian ini nantinya akan menampilkan ringkasan profil yang sebenarnya.',
},
message: {
title: 'Pesan',
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: 'Lihat',
deleteRecords: 'Hapus riwayat',
},
financeRecords: {
deposit: 'Riwayat Isi Ulang',
withdraw: 'Riwayat Penarikan',
orderNo: 'No. Pesanan',
amount: 'Jumlah',
bonusAmount: 'Jumlah Bonus',
loading: 'Memuat riwayat...',
loadFailed: 'Gagal memuat riwayat. Silakan coba lagi nanti.',
empty: 'Belum ada riwayat',
page: 'Halaman {{page}} / total {{total}}',
previous: 'Sebelumnya',
next: 'Berikutnya',
},
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: 'Berikutnya',
page: 'Halaman {{page}} / total {{total}}',
previous: 'Sebelumnya',
remark: 'Catatan',
time: 'Waktu',
type: 'Riwayat Dompet',
},
},
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: 'Tidak',
yes: 'Ya',
},
modal: {
close: 'Tutup modal',
defaultAriaLabel: 'Modal',
},
toast: {
lobbyInitFailed: 'Gagal memuat lobby game',
loginRequired: 'Silakan masuk sebelum memasuki game',
loginSuccess: 'Berhasil masuk',
registerSuccess: 'Pendaftaran berhasil',
inviteLinkCopied: 'Tautan undangan disalin',
inviteLinkCopyFailed:
'Gagal menyalin tautan undangan. Silakan salin secara manual.',
insufficientBalance: 'Saldo tidak cukup. Silakan sesuaikan taruhan.',
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.',
autoHostingStoppedWin:
'Kondisi kemenangan tunggal tercapai. Auto spin telah berhenti.',
autoHostingStoppedJackpot: 'Jackpot tercapai. Auto spin telah berhenti.',
autoHostingSubmitFailed:
'Taruhan auto spin gagal. Auto spin telah berhenti.',
},
},
auth: {
common: {
arrowIconAlt: 'Panah',
actions: {
submitting: 'Mengirim...',
},
},
login: {
actions: {
submit: 'Masuk',
},
fields: {
username: {
label: 'Akun / Telepon:',
placeholder: 'Masukkan akun atau nomor ponsel',
},
password: {
label: 'Kata Sandi:',
placeholder: 'Masukkan kata sandi',
},
},
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: 'Daftar',
},
fields: {
username: {
label: 'Akun / Telepon:',
placeholder: 'Masukkan akun atau nomor ponsel',
},
password: {
label: 'Kata Sandi:',
placeholder: 'Masukkan kata sandi',
},
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.',
},
},
validation: {
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: 'Pesan',
bgm: 'BGM',
id: 'ID',
fullscreen: 'Layar Penuh',
login: 'Masuk',
register: 'Daftar',
},
control: {
trend: 'Tren',
map: 'Peta',
selected: 'Dipilih',
totalBet: 'Total Bet',
confirm: 'Konfirmasi',
selectNumbers: 'Pilih Nombor',
insufficientBalance: 'Saldo Tidak Cukup',
submitting: 'Mengirim...',
actions: {
clear: 'Hapus',
repeat: 'Ulang',
'auto-spin': 'Auto Spin',
},
},
status: {
odds: 'Odds',
streak: 'Streak',
limit: 'Batas',
roundId: 'Ronde',
phase: {
betting: {
label: 'Buka',
description: '(Menerima Bet)',
},
locked: {
label: 'Terkunci',
description: '(Bet Ditutup)',
},
revealing: {
label: 'Drawing',
description: '(Mengungkap Hasil)',
},
settled: {
label: 'Selesai',
description: '(Ronde Selesai)',
},
waiting: {
label: 'Menunggu',
description: '(Menunggu Ronde Berikutnya)',
},
},
},
title: {
announcement: 'Pengumuman',
},
animal: {
insufficientBalanceRecharge: 'Saldo tidak cukup, silakan isi ulang',
loading: 'Memuat',
selectionLimitReached: 'Melebihi pilihan yang diizinkan',
tapToEnter: 'Ketuk Untuk Masuk',
getStart: 'Mulai',
},
history: {
title: 'Riwayat',
pending: 'PENDING',
win: 'WIN',
lost: 'LOST',
orderNo: 'No. Order',
roundId: 'ID Ronde',
numbers: 'Nomor Taruhan',
settledAt: 'Waktu Selesai',
totalPoolAmount: 'Jumlah Taruhan',
winningResult: 'Hasil Menang',
payout: 'Jumlah Menang',
empty: 'Belum ada riwayat',
end: 'Tidak ada catatan lagi',
loading: 'Memuat...',
settled: 'Selesai',
},
topup: {
title: 'Konfigurasi Isi Ulang',
platformCoinLabel: 'Koin Platform',
currencyLabel: 'Jenis Mata Uang',
channelLabel: 'Saluran Pembayaran',
rateHint:
'Kurs hanya sebagai referensi. Jumlah akhir mengikuti kurs saat isi ulang.',
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: 'Konfirmasi',
submitSuccess: 'Permintaan penarikan berhasil dikirim',
withdrawal: 'Penarikan',
fields: {
diamondAmount: 'Jumlah Berlian Penarikan',
currencyType: 'Jenis Mata Uang',
paymentChannel: 'Saluran Pembayaran',
bankCode: 'Kode Bank',
cardHolderName: 'Nama Pemilik Rekening',
bankAccountNumber: 'Nomor Rekening Bank',
receiverEmail: 'Email Penerima',
receiverPhone: 'Telepon Penerima',
},
placeholders: {
bankCode: 'Pilih kode bank',
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).',
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.',
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