9
Dukungan Multi-Bahasa
Setiap kategori di repository ini punya dua berkas data: data/<kategori>/id.json dan data/<kategori>/en.json. Keduanya memakai schema yang sama, tetapi nilai categoryName dan description sudah ditulis dalam bahasa berkasnya masing-masing. Ada 20 kategori, sehingga totalnya 40 berkas JSON. src/build.ts:13-151
Nama berkas tanpa ekstensi berfungsi sebagai kunci bahasa. getLanguage mengambil path.basename lalu membuang ekstensinya, sehingga id.json menjadi id dan en.json menjadi en. src/utils/index.ts:9-112
Dari kunci bahasa ke berkas keluaran
Satu pipeline build menghasilkan dua README. Kunci bahasa mengelompokkan kategori ke data[language], lalu nama berkas keluaran disusun dengan ['README', language === 'id' ? null : language, 'md'].filter(...): bahasa id mendapat README.md, bahasa en mendapat README.en.md. src/build.ts:79-903
Berkas keluaran dibaca dulu dari disk, kemudian blok di antara marker diganti dengan hasil markdownBuilder(categories, language). src/build.ts:984 Rincian penggantian marker ada di Pipeline Build Markdown.
graph TD
idjson["data/books/id.json"] --> gl["getLanguage(file) -> 'id'"]
enjson["data/books/en.json"] --> gl
gl --> bucket["data[language]"]
bucket --> loop["for language of Object.keys(data)"]
loop --> name["fileName: README.md / README.en.md"]
name --> mb["markdownBuilder(categories, language)"]
mb --> tr["translate(key, language)"]
vocab["src/data/vocabularies.json"] --> tr
tr -.-> mb
mb -->|"id"| idmd["README.md"]
mb -->|"en"| enmd["README.en.md"]
style idjson fill:#336791,color:#fff
style enjson fill:#336791,color:#fff
style vocab fill:#336791,color:#fff
style gl fill:#f59e0b,color:#000
style name fill:#f59e0b,color:#000
style bucket fill:#8b5cf6,color:#fff
style mb fill:#8b5cf6,color:#fff
style idmd fill:#2d7d46,color:#fff
style enmd fill:#2d7d46,color:#fff
%% fig: Satu pipeline, dua berkas keluaran
%% desc: Berkas id.json dan en.json dikelompokkan per kunci bahasa, lalu tiap kelompok ditulis ke README yang sesuai dengan label dari vocabularies.json.Label kolom dari vocabularies.json
translate membaca vocabularies[language][key] dan jatuh ke string Unknown bila key tidak ditemukan. src/utils/markdown.ts:4-65 vocabularies.json hanya memuat dua kunci bahasa, id dan en, masing-masing dengan enam label. src/data/vocabularies.json:1-186
key | id | en |
|---|---|---|
apiName | Nama API | API Name |
developer | Pengembang | Developer |
documentation | Dokumentasi | Documentation |
status | Status | Status |
description | Deskripsi | Description |
authentication | Autentikasi | Authentication |
Hanya status yang kebetulan identik di kedua bahasa. markdownBuilder memanggil translate sekali per kolom header, lalu menambahkan baris pemisah | - | - | - | - | - | - | yang sama untuk semua bahasa. src/utils/markdown.ts:8-177
Isi sel yang tidak melewati translate
Yang diterjemahkan saat build hanya header tabel. Isi sel diambil apa adanya dari JSON bahasa yang sedang diproses, jadi terjemahan sebenarnya dikerjakan saat kontributor menulis berkas data. Perbandingan berkas data/books memperlihatkan polanya: categoryName menjadi Buku di satu berkas dan Books di berkas lain. data/books/id.json:1-28 data/books/en.json:1-39
| Bagian sel | Sumber nilai | Melewati translate |
|---|---|---|
| header kolom | vocabularies[language] | ya |
judul ### ... per kategori | categoryName dari JSON bahasa itu | tidak |
| kolom nama API | apiName | tidak |
| kolom pengembang | developer.name, dibungkus [nama](profileUrl) bila profileUrl terisi | tidak |
| kolom dokumentasi | literal [Link]( ditambah documentationUrl | tidak |
| kolom status | literal ✅ atau ❎ dari api.status | tidak |
| kolom deskripsi | description | tidak |
| kolom autentikasi | authentication, atau literal false dalam backtick bila kosong | tidak |
| baris pemisah | satu tanda - per kolom | tidak |
Pembentukan tautan pengembang dan tautan dokumentasi terjadi di dalam loop apis, sehingga kedua bahasa memakai aturan yang sama persis. src/utils/markdown.ts:19-2710
Urutan judul mengikuti bahasa
Kategori di-sort dengan localeCompare atas categoryName sebelum ditulis, sehingga urutan judul berbeda antar berkas keluaran. src/build.ts:79-903
| Berkas keluaran | Judul pertama | Judul terakhir |
|---|---|---|
README.md | Agama Islam | Utilitas |
README.en.md | Books | Weather |
Daftar isi ikut urutan itu karena generateToc membaca hasil akhir markdown. README.md:19-3811 README.en.md:21-4012
Prosa dan tautan silang ditulis manual
Bagian di luar marker seperti judul, paragraf pembuka, dan bagian penutup tidak disentuh build; itulah tempat tautan antar-bahasa ditulis tangan. README.md menautkan ./README.en.md, dan README.en.md menautkan balik ./README.md. README.md:7-913 README.en.md:9-1114
Struktur tabel yang dihasilkan juga sudah terlihat pada hasil yang di-commit, misalnya tabel kategori Books dengan header berbahasa Inggris. README.en.md:50-5615
⚠️
translatemengindeksvocabularies[language]tanpa penjagaan. Menambahdata/<kategori>/ja.jsontanpa menambah kuncijadivocabularies.jsonmembuat akses itu gagal saatmarkdownBuilderdijalankan untuk bahasa tersebut. src/utils/markdown.ts:4-65
⚠️ Kunci bahasa baru juga menuntut berkas keluaran baru.
buildmembaca berkas tujuan lebih dulu, jadiREADME.ja.mdharus sudah ada dengan pasangan markerAPI START/API ENDdanTOC START/TOC ENDsebelumbuilddijalankan. src/build.ts:79-903