Hasil strftime("%A, %d %B %Y") pada Chapter Parsing dan Formatting datetime berbunyi Sunday, 15 June 2025 — bahasa Inggris bawaan pustaka C. Untuk pengguna Indonesia, tampilan semacam itu terasa asing, dan angka pun punya kebiasaan berbeda: 1.234.567,89 versus 1,234,567.89. Chapter ini membahas tiga jalan menuju tampilan lokal: module locale dari standard library, pemetaan manual, dan pustaka pihak ketiga babel — beserta alasan jalan ketigalah yang paling layak dipakai produksi.

Konsep locale dan Kategori LC_TIME #

locale adalah pengaturan regional milik sistem operasi: bahasa, format tanggal, format angka, sampai mata uang. Python mengaksesnya lewat module locale yang mengelompokkan pengaturan ke dalam beberapa kategori:

KategoriMengatur
LC_TIMEnama hari, nama bulan, susunan tanggal
LC_NUMERICpemisah desimal dan ribuan pada angka
LC_MONETARYsimbol dan penulisan mata uang
LC_CTYPEklasifikasi karakter, misalnya huruf besar-kecil

Fungsi locale.setlocale(kategori, nama) mengganti pengaturan tersebut untuk seluruh proses Python yang berjalan — statusnya global, bukan per-function.

Mencoba locale id_ID pada Praktiknya #

Mekanismenya berjalan dua langkah: pasang nama locale pada kategori LC_TIME, lalu panggil strftime() seperti biasa. Berikut kondisi awal dan pemasangan locale C (locale minimal yang selalu ada):

python
import locale
from datetime import datetime

print(locale.getlocale(locale.LC_TIME))

locale.setlocale(locale.LC_TIME, "C")
print(datetime(2025, 6, 15).strftime("%A, %d %B %Y"))

Output yang Dihasilkan:

text
(None, None)
Sunday, 15 June 2025

Cetak pertama menunjukkan getlocale() bernilai (None, None) karena program Python tidak memasang locale apa pun secara bawaan. Setelah locale C dipasang, nama hari tetap bahasa Inggris — memang begitulah isi locale C. Sekarang kita coba nama locale Indonesia:

python
import locale

try:
    locale.setlocale(locale.LC_TIME, "id_ID.UTF-8")
except locale.Error as galat:
    print(type(galat).__name__, "->", galat)

Output yang Dihasilkan:

text
Error -> unsupported locale setting

Percobaan di atas dijalankan sungguhan pada mesin yang dipakai menulis materi ini, dan hasilnya gagal: locale id_ID.UTF-8 belum terpasang di sistem operasi tersebut. Inilah masalah inti module locale: nama locale hanya bekerja bila sudah digenerate oleh OS. Di Ubuntu/Debian, sudo locale-gen id_ID.UTF-8 memasangnya; di Windows, nama yang dikenal berbeda sama sekali (misalnya "id_ID" atau "Indonesian_Indonesia"). Bila locale id_ID.UTF-8 sudah aktif, kode strftime("%A, %d %B %Y") yang sama menghasilkan Minggu, 15 Juni 2025 — contoh ilustrasi, karena hasil persisnya bergantung pada mesin.

babel: Locale Tanpa Bergantung pada OS #

Pustaka babel membawa datanya sendiri (CLDR, Common Locale Data Repository), sehingga hasilnya konsisten di Linux, Windows, maupun macOS. Untuk tanggal, function format_date() dan format_datetime() menerima kode locale "id":

python
from datetime import date, datetime
from babel.dates import format_date, format_datetime

print(format_date(date(2025, 6, 15), format="full", locale="id"))
print(format_datetime(datetime(2025, 6, 15, 10, 30),
                      "EEEE, d MMMM y 'pukul' HH:mm", locale="id"))
print(format_date(date(2025, 6, 15), format="full", locale="en"))

Output yang Dihasilkan:

text
Minggu, 15 Juni 2025
Minggu, 15 Juni 2025 pukul 10:30
Sunday, June 15, 2025

Mari kita telaah apa yang terjadi pada baris-baris kode di atas:

  1. Baris 4 (format="full", locale="id"): pola bawaan paling lengkap diterapkan untuk bahasa Indonesia, menghasilkan Minggu, 15 Juni 2025.
  2. Baris 5-6 ("EEEE, d MMMM y 'pukul' HH:mm"): pola CLDR versi kustom — EEEE nama hari, MMMM nama bulan, dan teks dalam kutip tunggal dicetak apa adanya, termasuk kata “pukul”.
  3. Baris 7 (locale="en"): cukup ganti kode locale untuk mengganti bahasa tanpa menyentuh sistem operasi.

Untuk angka dan mata uang, babel.numbers menyediakan format_decimal() dan format_currency():

python
from babel.numbers import format_decimal, format_currency

print(format_decimal(1234567.89, locale="id"))
print(format_decimal(1234567.89, locale="en"))
print(format_currency(1500000, "IDR", locale="id"))

Output yang Dihasilkan:

text
1.234.567,89
1,234,567.89
Rp1.500.000,00

Format Indonesia memakai titik sebagai pemisah ribuan dan koma sebagai desimal — kebalikan dari format Inggris. Rupiah dikenali lewat kode mata uang "IDR" dan otomatis ditulis Rp1.500.000,00.

Memilih Pendekatan #

PendekatanKelebihanKekurangan
Module localebagian dari standard librarybergantung pada OS, status global, tidak thread-safe
Dictionary manualtanpa dependensi, kendali penuh atas tiap katadaftar terjemahan dikelola sendiri
babelkonsisten lintas OS, mendukung banyak bahasa dan mata uangpihak ketiga yang harus dipasang lewat pip

Untuk kebutuhan sempit seperti menampilkan nama hari dan bulan, dictionary manual dari Chapter Parsing dan Formatting datetime sudah memadai. Untuk aplikasi nyata yang melayani banyak bahasa dan format mata uang, babel adalah pilihan yang dapat diandalkan. Module locale cukup dipahami mekanismenya saja, lalu ditinggalkan begitu portabilitas menjadi kebutuhan.