DEV Community

Cover image for Projek Jawi Converter: Belajar Golang Sambil Mendigitalkan Warisan Bahasa
hardyweb
hardyweb

Posted on Edited on

Projek Jawi Converter: Belajar Golang Sambil Mendigitalkan Warisan Bahasa

Aku percaya bahawa, cara terbaik untuk belajar bahasa pengaturcaraan baru adalah dengan membangunkan projek kecil yang praktikal. Untuk projek kali ini, membangunkan tools Rumi ke Jawi Converter di jawi.hardyweb.net dengan bahasa pengaturcaran Golang.

Selain Jawi, aku juga pernah buat projek seperti QR Code generator, mod_sec_audit parser, dan parser Waktu Solat dari e-solat.gov.my. Semua projek ni kecil tapi memberi pengalaman langsung dalam bermain dengan fungsi string manipulation, API integration, dan text processing.

Idea Projek & Perbualan Dengan AI

Pada mulanya, aku tanya GPT:
“Boleh tak buat Jawi converter guna Golang?”

Cadangan GPT ialah:

  1. Mapping Huruf – setiap huruf Rumi dipetakan kepada huruf Jawi/Hijaiyah.

  2. Special Words / Daftar Kata – perkataan yang ejaannya unik atau tidak tepat jika mapping, akan disimpan dalam pangkalan data untuk digunakan kembali.

Contoh Mapping Huruf

Mapping ni terus menukar huruf satu-per-satu.

Special Words

Special words digunakan untuk perkataan yang mapping huruf biasa tidak menghasilkan bunyi atau ejaan tepat. Contohnya:
specialWords := map[string]string{
"allah": "الله",

"akhirat": "اخرَة",
"akhlak": "اخلاق",
"amalan": "عملن",
}

Proses Tukar Tulisan

Projek ni ikut empat langkah utama: ( ini versi awal )

  1. Clean & Tokenize ◦ Buang whitespace / trim ◦ Pecahkan ayat kepada perkataan ◦ Kecilkan semua huruf ( change to lower case )

  1. Cek Special Words ◦ Kalau perkataan ada dalam special_words, terus guna versi Jawi tersebut
  2. Mapping Huruf ◦ Kalau perkataan tiada dalam special_words, tukar huruf menggunakan mapping
  3. Gabungkan Kembali ◦ Combine token Jawi untuk membentuk ayat
for _, word := range sentenceTokens {
    cleaned := clean(word)
    if val, ok := specialWords[cleaned]; ok {
        output += val
    } else {
        output += mapLetters(cleaned)
    }
}
Enter fullscreen mode Exit fullscreen mode

Cabaran Linguistik

Mapping huruf sahaja tidak mencukupi, contohnya:
• Perkataan “saya”
◦ Mapping biasa → سایا
◦ Bunyi sebenar → ساي
◦ Maka perlu dimasukkan ke special_words.
• Imbuhan depan & belakang (me-, di-, ter-, -kan, -i) memerlukan logic tambahan.
• Perkataan seperti “makan”, “dimakan”, “memakan”, “termakan”, “makanan”, “pemakan” perlu di-handle untuk ejaan yang tepat.

Menyesuaikan Dengan Peraturan Jawi Lanjutan

Apabila aku membaca nota dari Jawi Makmur dan karya Ahmad Ali Karim tentang hukum hamzah, terdapat beberapa peraturan tambahan yang perlu diambil kira selain flow asas yang dicadangkan oleh AI:
1. Penempatan Hamzah – hamzah boleh berada di atas alif (أ), bawah alif (إ), atau di atas waw/ya (ؤ/ئ) bergantung pada vokal dan kedudukan huruf.
2. Huruf Ikut Bunyi – sesetengah perkataan memerlukan penyesuaian huruf berdasarkan sebutan, bukan sekadar mapping huruf literal.
3. Gabungan Huruf & Alif Mati – dalam perkataan tertentu, alif mati atau huruf panjang perlu ditambah/ditinggalkan untuk memastikan ejaan betul.
4. Gelinciran – bunyi akhir tertentu mempengaruhi cara huruf dipetakan, terutama untuk kata nama khas dan kata ganda.

Dengan memasukkan peraturan ini ke dalam projek, output Jawi menjadi lebih tepat dan mendekati sebutan sebenar, berbanding hanya mengikut mapping AI standard + special words.
1. Hukum Derlung
◦ Singkirkan huruf ‘a’ pada akhir perkataan jika bukan ‘da, la, ra, wa, nga’.
2. padanan Huruf h dan k
3. Gelinciran / Kata Ganda / Akronim / Tiga Suku Kata
4. Ejaan Lazim & Kata Asal Arab

Contoh:
// Hukum Derlung

func applyDerlung(word string) string {
    endings := []string{"da","la","ra","wa","nga"}
    for _, e := range endings {
        if strings.HasSuffix(word, e) {
            return word
        }
    }
    // Buang huruf 'a' akhir
    if strings.HasSuffix(word, "a") {
        return word[:len(word)-1]
    }
    return word
}
Enter fullscreen mode Exit fullscreen mode

Contoh Salah & Betul:
• Salah: باچا / ممباچا / ترباچا / ديباچا / باچاکان / باچاکانلاه / باچاان
• Betul: باچ / ممباچ / ترباچ / دباچ / باچکن / باچکنله / باچاءن.

Berikut adalah pipeline yang digunakan dalam jawi conveter semasa artikel ini ditulis, ia berevolusi dari 4 langkah awal sebagaimana dinyatakan di awal artikel,berkembang kerana melibatkan hukum dan peraturan-peraturan tatabahasa.

1. normalize → tokenize → standardize input.
2. specialWords → override perkataan tertentu.
3. diftong, prefix, suffix, digraph, gelinciran, hukum derlung 
4. morpho/phonological rules.
5. applyVowelAndEVariant → baru proses vowel-specific rules (awalan vokal + pepet/taling).
6. applyReduplikasi → last step sebelum mapping, sebab dia modify bentuk token.
7.mapToJawi → transliterasi.
8. joinTokens → final output string.

Enter fullscreen mode Exit fullscreen mode

*pipeline 5 dan 6 tu , masih ada bug, kadang-kadang dia baca , tapi masih tak boleh tukar e pepet dan e taling dengan betul, kata ganda tu pun tak di tukar ke angka dua arab (٢) dengan betul *

Insight & Pembelajaran

1. AI + Programming = Learning Accelerator
    ◦ GPT bantu cadangkan struktur, tapi ketepatan Jawi masih bergantung pada rule + daftar perkataan.
2. Rujukan Akademik & Linguistik
    ◦ DBP & Jawi Makmur jadi rujukan untuk ejaan tepat.
    ◦ Belajar asas Jawi melalui sumber online:
        ▪ ejawimakmur.my
        ▪ Ahmad Ali Karim – Jenis Hamzah
        ▪ Ahmad Ali Karim – Tulisan Jawi Bicara
3. String Manipulation + Loops = Core Logic
    ◦ Semua proses boleh dilakukan menggunakan operasi string standard dalam programming.
4. Edge Cases & Imbuhan
    ◦ Kaedah mapping huruf sahaja tidak cukup; perlu hukum & pengecualian untuk bunyi sebenar.
Enter fullscreen mode Exit fullscreen mode

Kenapa Buat Jawi Converter Sendiri Walaupun Ada Jawi Makmur & e-Jawi?
Walaupun platform rasmi wujud, projek ini berfungsi sebagai eksperimen akademik untuk menguji teori linguistik, menguji rule, imbuhan, kata ganda, dan hukum Jawi, sambil menyokong kajian computational linguistics dan digitasi warisan bahasa secara interaktif.

_Digitasi adalah proses mengubah sesuatu yang berbentuk bukan digital kepada digital. Contohnya, apabila menukarkan dokumen kertas dan
menyimpannya dalam data komputer sebagai dokumen digital. _

=================

Rujukan Hukum Ejaan Jawi ΓÇö PUEJBM DBP

Nota recall untuk projek Jawi Converter (Golang). Sumber utama:

  • PUEJBM (Pedoman Umum Ejaan Jawi Bahasa Melayu) ΓÇö DBP
  • ejawimakmur.my
  • ejaan.jawi.net.my
  • Ahmad Ali Karim (jenis hamzah)

Contoh yang ditanda ? = perlu semak semula di Jawi Makmur/eJawi sebelum diguna dalam code.


1. Huruf Vokal

Vokal Aturan Contoh
a Suku kata tertutup: tak ditulis (harakat tak dipakai). Suku kata terbuka akhir: biasanya gugur (lihat Hukum Derlung) کيت (kita), ڤاڬي (pagi)
i Hujung suku kata terbuka → ي کيري (kiri), دوري (duri)
u Hujung suku kata terbuka → و ساتو (satu), بوکو (buku), دودوق (duduk)
o → و موتور (motor), روتي (roti), بولا (bola)
e pepet TAK dilambangkan بلاجر (belajar), ڬلس (gelas), دڠن (dengan)
e taling Suku kata terbuka awal → ا امڤت (empat), ڬلاڠ (gelang)

Bug yang disebut dalam artikel (e pepet vs e taling) berpunca dari aturan di atas ΓÇö kedua-duanya perlu jadi peraturan berasingan sebelum mapping.

2. Diftong (hujung kata)

Diftong Tulis Contoh
au و ڤولاو (pulau)
ai ي ڤنتاي (pantai)
oi وي کالوي (kaloi)

3. Konsonan Homorganik "n"

Bunyi n di akhir suku kata pertama bergantung pada konsonan berikut:

Bunyi Contoh
n → m (sebelum p,b) سمڤن (sampan), لمبڠ (lambang)
n → n (sebelum t,d,s,c,j) بينتڠ (bintang)
n → ng (sebelum k,g) بڠس (bangsa), ڤڠک (pangkat)

Mapping huruf literal (n → ن) tak cukup — kena tukar ikut konsonan berikut.

4. "k" Ghaib Akhir → ق

k di akhir yang tak disebut (ghaib), selepas vokal → ditulis ق:

  • ╪º┘å┘é (anak), ┘à╪º╪│┘ê┘é (masuk), ╪¿╪º┘ä┘è┘é (balik), ╪»┘ê╪»┘ê┘é (duduk), ╪¬┘è┌⌐┘é? (tidak)

5. "h" Ghaib Akhir → Dibuang / ه

  • ┘à┘ê╪»┘ç (mudah), ╪▒┘ê┘à┘ç (rumah), ╪¿┘ê╪»┘ê┘ç (bodoh), ╪¿╪º╪│┘ç? (basah)

Artikel sebut "padanan huruf h dan k" tanpa dedah aturan ΓÇö ini dia.

6. Awalan meN- / peN- (Asimilasi Nasal)

Awalan berubah ikut huruf awal kata dasar. Ejaan Jawi ikut bunyi, bukan ejaan Rumi.

Kata dasar mula dgn Awalan Contoh
p, b, f, m mem- / pem- ممباچ (membaca), ممينتا (meminta), ممباچ (pembaca)
t, d, s, c, j, z, n men- / pen- منوليس (menulis), مندڠر (mendengar), منچوري (mencuri)
s → ny meny- مڽاڤو (menyapu)
k, g, h, vokal, ng meng- / peng- مڠاجر (mengajar), مڠيکت (mengikat), مڠوندي (mengundi)
kata akar satu suku kata menge- مڠيچت (mengecat), مڠيبور (mengebor)
l, r, w, y me- (nasal gugur) ملوكيس (melukis), مراوات (merawat)

7. Imbuhan Lain

  • ber- ΓåÆ ╪¿╪▒┌⌐╪¼ (bekerja), ╪¿╪▒┘ä╪º╪▒┘è (berlari)
  • ter- ΓåÆ ╪¬╪▒╪¿╪º┌å (terbaca)
  • di- ΓåÆ ╪»╪¿╪º┌å (dibaca), ╪»╪¬┘ê┘ä┘è╪│ (ditulis)
  • ke-...an ΓåÆ ┌⌐╪▒╪º╪¼╪ú┘å? (kerajaan), ┌⌐┘à╪º╪¼┘ê╪º┘å? (kemajuan)
  • -kan ΓåÆ ╪¿╪º┌å┌⌐┘å (bacakan), ┘à╪º┌⌐┘å┌⌐┘å? (makanan ΓåÆ ┘à╪º┌⌐┘å┘å)
  • -an selepas vokal a ΓåÆ hamzah: ╪¿╪º┌å╪º╪í┘å (bacaan)
  • -an selepas konsonan ΓåÆ ┘à╪º┌⌐┘å┘å (makanan), ┘à┘è┘å┘ê┘à┘å (minuman)
  • -lah ΓåÆ ╪¿╪º┌å┘ä┘ç (bacalah)

8. Kata Sendi vs Imbuhan (di / ke)

Jenis Rumi Jawi
Kata sendi (jarak) di rumah د رومه
Imbuhan (cantum) ditulis دتوليس
Kata sendi ke sekolah کي سکوله?
Imbuhan kerajaan کراجأن?

Pipeline perlu bezakan ni SEBELUM tokenize, sebab konteks menentukan jarak/cantum.

9. Kata Pinjaman Arab ΓÇö Huruf Khas Mestilah Kekal

Jangan map huruf Melayu. Huruf khas: ث ذ ح خ ص ض ط ظ ع غ + ة.

  • ┘à╪│╪¼╪» (masjid), ╪«╪¿╪▒ (khabar), ╪╣╪º╪»╪⌐ (adat), ╪¡┌⌐┘à (hukum)
  • ╪╡┘ä╪º╪⌐ (solat), ╪┤╪▒┘è┘ü (syarif), ╪╖╪¿┘è╪¿? (tabib)
  • ╪º┘ä┘ä┘ç (Allah) ΓÇö special word tetap perlu

10. Ta Marbutah (ة)

Hanya untuk kata asal Arab yang berakhir bunyi a/at:

  • ╪│┘å╪⌐ (sunnah), ┘à╪»╪▒╪│╪⌐ (madrasah), ┘à┌⌐╪⌐ (Mekah)

Kata Melayu guna ه/ت biasa, bukan ة.

11. Kata Pinjaman Asing (Inggeris/Tamil/Cina/Siam)

Ejaan ikut bunyi, bukan huruf-ke-huruf:

  • ┌ñ╪▒┘ê┌¼╪▒╪º┘à (program), ╪│╪¬╪▒┌⌐╪¬┘ê╪▒ (struktur), ╪»┘ê┌⌐╪¬┘ê╪▒ (doktor)
  • ┌ñ┘ê┘ä┘è╪│ (polis), ╪¿┘è▌ó (beg), ╪¬┘ê┘ä┘å? (tuala ΓåÆ ╪¬┘ê┘ä╪º)
  • Kluster konsonan dipertahankan: ┌¼╪▒┘å? (green), ╪│┌⌐┘ê┘ä┘ç (sekolah)

12. Kata Ganda

  • Ganda penuh ΓåÆ angka dua Arab ┘ó: ╪º┘ê╪▒┌á┘ó (orang-orang), ╪▒┘ê┘à┘ç┘ó (rumah-rumah)
  • Ganda separa/berima ΓåÆ eja penuh: sayur-mayur, kuih-muih

Bug yang disebut (kata ganda tak jadi ٢) — fokus pada applyReduplikasi.

13. Hamzah

Jenis ikut kedudukan & vokal sekeliling:

  • ╪ú atas alif ΓÇö selepas bunyi a / permulaan
  • ╪Ñ bawah alif ΓÇö bunyi i awal
  • ╪ñ atas wau ΓÇö selepas bunyi u
  • ╪ª atas ya ΓÇö selepas bunyi i

Fungsi:

  • Pemisah dua vokal (hiatus) dalam kata pinjaman: ╪│╪ñ╪º┘ä (soal), ┘à╪¼┘à? (majmuk)
  • Penanda a sebelum akhiran -an: ╪¿╪º┌å╪º╪í┘å (bacaan)

14. Hukum Derlung

Buang a akhir kecuali kata berakhir da, la, ra, wa, nga:

func applyDerlung(word string) string {
    endings := []string{"da", "la", "ra", "wa", "nga"}
    for _, e := range endings {
        if strings.HasSuffix(word, e) {
            return word
        }
    }
    if strings.HasSuffix(word, "a") {
        return word[:len(word)-1]
    }
    return word
}
Enter fullscreen mode Exit fullscreen mode

Salah → Betul: باچا → باچ · ممباچا → ممباچ · ترباچا → ترباچ · ديباچا → دباچ

15. Gelinciran

Bunyi akhir mempengaruhi pemetaan huruf ΓÇö terutamanya kata nama khas & kata ganda. Perlu senarai pengecualian/perkataan, bukan formula tunggal.

16. Kata Nama Khas, Akronim, Singkatan

  • Kata nama khas: eja ikut sebutan tempatan, rujuk DBP
  • Akronim: eja huruf demi huruf, contoh ╪▒┘à? (RIM), ┘à┘ä╪º┘è┘ê? ΓÇö semak DBP
  • Singkatan: kekal huruf Latin dalam konteks teknikal? ΓÇö rujuk ejaan rasmi

17. Angka & Tanda Baca

  • Kata ganda penuh ΓåÆ ┘ó (bukan tulis dua kali)
  • Tanda baca Jawi: guna tanda baca standard (titik, koma, ? !) ΓÇö tidak ada bentuk khas
  • Nombor: guna angka Arab/rumi seperti biasa

Peta ke Pipeline Golang (yang sedia ada)

1. normalize → tokenize → standardize input
2. specialWords → override
3. diftong, prefix, suffix, digraph, gelinciran, hukum derlung
4. morpho/phonological rules
5. applyVowelAndEVariant          ← HUKUM #1 (vokal pepet/taling/a/i/u/o)
6. applyReduplikasi               ← HUKUM #12 (kata ganda ٢)
7. mapToJawi → transliterasi
8. joinTokens
Enter fullscreen mode Exit fullscreen mode

Yang PERLU DITAMBAH ke Pipeline

# Hukum Di mana masuk
1 Asimilasi nasal meN-/peN- Langkah 3 (prefix) ΓÇö sebelum mapping, ikut huruf awal kata dasar
2 Pengesanan kata pinjaman Arab → kekal huruf khas Langkah 2/3 — sebelum mapping huruf biasa
3 Ta marbutah (ة) Sama dengan #2
4 k ghaib → ق / h ghaib buang Langkah 4 (phonological)
5 n homorganik (→ m/ng/ny) Langkah 4
6 Vokal penuh (pepet/taling) Langkah 5 ΓÇö asingkan e pepet & e taling
7 Kluster konsonan pinjaman asing Langkah 4
8 Kata sendi vs imbuhan (di/ke) Sebelum tokenize (langkah 1)

Sumber

  1. PUEJBM ΓÇö DBP (rujukan utama, bukan hanya Jawi Makmur)
  2. https://ejawimakmur.my/02-modul-jawi.html
  3. https://ahmadalikarim.wordpress.com/2021/07/03/tulisan-jawi-kisah-hamzah-yang-digelar-tiga-suku/
  4. https://ahmadalikarim.wordpress.com/2021/07/04/tulisan-jawi-bicara-jenis-jenis-hamzah/
  5. https://ejaan.jawi.net.my

Nota: contoh bertanda ? belum disahkan ΓÇö semak dulu sebelum jadi rule.

Kesimpulan

Projek Jawi Converter bukan sekadar latihan pengaturcaran Golang. Ia adalah penghubung antara teknologi dan warisan budaya. Ini hanyalah satu usaha kecil aku untuk Malaysia – kendatipun begitu, projek Jawi Converter ini adalah sumbangan peribadi untuk melestarikan bahasa, budaya, dan warisan Melayu, sambil membina kemahiran teknologi moden.

Nota Kaki

Untuk perkataan Arab atau serapan perkataan Arab (perkatan Arab yang di Melayukan), seeloknya rujuk Ustaz- Ustazah, kerana ia melibatkan makraj dan sifat huruf Hijaiyah ( 30 abjad dalam bahasa Arab )

Rujukan / Citations
1. DBP & Jawi Makmur – sumber rasmi untuk ejaan Jawi standard
https://ejawimakmur.my/02-modul-jawi.html
2. Ahmad Ali Karim – Jenis Hamzah – pembelajaran asas hukum hamzah dan penulisan Jawi
https://ahmadalikarim.wordpress.com/2021/07/03/tulisan-jawi-kisah-hamzah-yang-digelar-tiga-suku/
3. Ahmad Ali Karim – Tulisan Jawi Bicara – panduan lanjut jenis hamzah & ejaan Jawi
https://ahmadalikarim.wordpress.com/2021/07/04/tulisan-jawi-bicara-jenis-jenis-hamzah/
4. Rumi → Jawi Mapping & Linguistic Rules – kombinasi rule-based & special words yang dirujuk dari DBP/Jawi Makmur

Top comments (0)