Bahasa Indonesia UI Conventions
RetailOS is built for Indonesian users. This guide covers language conventions, formatting rules, and tone of voice for all UI text.
Tone & Formality
| App Type | Register | Pronoun | Example |
|---|---|---|---|
| Admin portals (HO, Store Admin, HR) | Formal | "Anda" | "Apakah Anda yakin ingin menghapus?" |
| Customer-facing (Customer App) | Casual | "kamu" | "Mau redeem poin kamu?" |
| POS (cashier-facing) | Neutral | — (imperative) | "Scan barcode produk" |
| Error messages | Polite | — | "Koneksi terputus. Coba lagi?" |
Common UI Terms
| English | Indonesian | Context |
|---|---|---|
| Save | Simpan | Form submit (non-destructive) |
| Cancel | Batal | Dismiss action |
| Delete | Hapus | Destructive action |
| Submit | Kirim | Form submission to server |
| Search | Cari | Search input |
| Close | Tutup | Close modal/sheet |
| Edit | Ubah | Modify existing data |
| Add | Tambah | Create new item |
| Back | Kembali | Navigation |
| Next | Lanjut | Multi-step wizard |
| Previous | Sebelumnya | Navigation |
| Confirm | Konfirmasi | Confirmation dialog |
| Loading | Memuat... | Loading state |
| Refresh | Muat ulang | Reload data |
| Settings | Pengaturan | App settings |
| Profile | Profil | User profile |
| Logout | Keluar | Sign out |
| Login | Masuk | Sign in |
| Register | Daftar | Create account |
| Filter | Filter | (loan word, accepted) |
| Export | Ekspor | Download data |
| Import | Impor | Upload data |
| Upload | Unggah | File upload |
| Download | Unduh | File download |
| Select | Pilih | Choose from options |
| All | Semua | Filter: show all |
| None | Tidak ada | Empty selection |
| Yes | Ya | Confirmation |
| No | Tidak | Rejection |
| Done | Selesai | Completion |
| Pending | Menunggu | Awaiting action |
| Approved | Disetujui | Approval granted |
| Rejected | Ditolak | Approval denied |
Number Formatting
Indonesian convention uses dots for thousands and commas for decimals (opposite of English).
| Format | Correct | Incorrect |
|---|---|---|
| Thousands separator | 12.450.000 | 12,450,000 |
| Decimal separator | 3,5 | 3.5 |
| Currency | Rp 12.450.000 | Rp 12,450,000 or IDR 12450000 |
| Percentage | 12,4% | 12.4% |
| Quantity | 1.250 pcs | 1,250 pcs |
Currency Rules
| Rule | Example |
|---|---|
| Prefix: "Rp" with space | Rp 12.450.000 |
| No decimal for IDR | Rp 12.450.000 not Rp 12.450.000,00 |
| Negative: minus before Rp | -Rp 150.000 |
| Abbreviated: use "rb" or "jt" | Rp 12,4jt (informal, charts only) |
Code Implementation
function formatIDR(amount: number): string {
return `Rp ${amount.toLocaleString('id-ID')}`
}
// formatIDR(12450000) → "Rp 12.450.000"
// formatIDR(-150000) → "-Rp 150.000"Date & Time
Date Formats
| Context | Format | Example |
|---|---|---|
| Full (formal) | EEEE, dd MMMM yyyy | Sabtu, 22 Maret 2026 |
| Medium | dd MMM yyyy | 22 Mar 2026 |
| Short | dd/MM/yyyy | 22/03/2026 |
| Relative (recent) | Natural language | 2 jam lalu, Kemarin |
| Table columns | dd MMM yyyy | 22 Mar 2026 |
| Timestamps | dd MMM, HH:mm | 22 Mar, 14:32 |
Indonesian Day Names
| Day | Full | Abbreviated |
|---|---|---|
| Monday | Senin | Sen |
| Tuesday | Selasa | Sel |
| Wednesday | Rabu | Rab |
| Thursday | Kamis | Kam |
| Friday | Jumat | Jum |
| Saturday | Sabtu | Sab |
| Sunday | Minggu | Min |
Indonesian Month Names
| Month | Full | Abbreviated |
|---|---|---|
| January | Januari | Jan |
| February | Februari | Feb |
| March | Maret | Mar |
| April | April | Apr |
| May | Mei | Mei |
| June | Juni | Jun |
| July | Juli | Jul |
| August | Agustus | Agu |
| September | September | Sep |
| October | Oktober | Okt |
| November | November | Nov |
| December | Desember | Des |
Time Format
Always use 24-hour format:
| Correct | Incorrect |
|---|---|
14:32 | 2:32 PM |
08:05 | 8:05 AM |
00:00 | 12:00 AM |
Code Implementation
import { format } from 'date-fns'
import { id } from 'date-fns/locale'
// Full date
format(date, 'EEEE, dd MMMM yyyy', { locale: id })
// → "Sabtu, 22 Maret 2026"
// Medium date
format(date, 'dd MMM yyyy', { locale: id })
// → "22 Mar 2026"
// Timestamp
format(date, 'dd MMM, HH:mm', { locale: id })
// → "22 Mar, 14:32"Error Messages
Write error messages that are polite, specific, and suggest a next action.
| Pattern | Good | Bad |
|---|---|---|
| Connection error | "Koneksi terputus. Coba lagi?" | "Network error" |
| Not found | "Produk tidak ditemukan" | "404 Not Found" |
| Validation | "Nama harus diisi" | "Field required" |
| Permission | "Anda tidak memiliki akses ke halaman ini" | "403 Forbidden" |
| Server error | "Terjadi kesalahan. Tim kami sedang memperbaiki." | "Internal Server Error" |
| Timeout | "Permintaan terlalu lama. Coba lagi." | "Request timeout" |
Always actionable
Every error message should answer: "What happened?" and "What can I do about it?"
Success Messages
Keep success messages concise. Users don't need a sentence --- a word or two is enough.
| Context | Good | Bad |
|---|---|---|
| Save | "Tersimpan" | "Data berhasil disimpan ke database" |
| Delete | "Terhapus" | "Item telah berhasil dihapus dari sistem" |
| Send | "Terkirim" | "Pesan Anda telah berhasil dikirim" |
| Update | "Diperbarui" | "Perubahan telah berhasil diterapkan" |
| Copy | "Tersalin" | "Teks berhasil disalin ke clipboard" |
Empty States
Empty states should be friendly and guide users to take action.
| Context | Good | Bad |
|---|---|---|
| No transactions today | "Belum ada transaksi hari ini" | "No data found" |
| Empty search | "Tidak ada hasil untuk '{query}'" | "0 results" |
| No items | "Belum ada produk. Tambah produk pertama?" | "Empty" |
| No notifications | "Semua sudah ditangani!" | "No notifications" |
Confirmation Dialogs
Structure: Question + Context + Actions
Hapus produk ini?
"Indomie Goreng (SKU: 001234)" akan dihapus secara permanen.
[Batal] [Hapus]- Title: question format ("Hapus produk ini?")
- Body: name the specific item in quotes, state consequence
- Cancel button: left, ghost style
- Destructive button: right, red style
Pluralization
Indonesian does not conjugate for plural. Context or explicit numbers handle it:
| English | Indonesian |
|---|---|
| 1 item | 1 item |
| 5 items | 5 item |
| No items | Tidak ada item |
Do NOT use "item-item" or reduplication in UI text.
Consistency
Use the same Indonesian term for the same concept across all apps. If "Simpan" is used for save in HO Finance, use "Simpan" everywhere --- never mix with "Save" or "Taruh".