Lompat ke konten
dokumentasi.id
Commit 3ce63fd
v3
Star5,3 rb

Kamu membaca versi lama. Halaman ini hanya bisa dibaca.

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-15

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-11

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-90

Berkas keluaran dibaca dulu dari disk, kemudian blok di antara marker diganti dengan hasil markdownBuilder(categories, language). src/build.ts:98 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.
Fig. 1: Satu pipeline, dua berkas keluaranBerkas 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-6 vocabularies.json hanya memuat dua kunci bahasa, id dan en, masing-masing dengan enam label. src/data/vocabularies.json:1-18

keyiden
apiNameNama APIAPI Name
developerPengembangDeveloper
documentationDokumentasiDocumentation
statusStatusStatus
descriptionDeskripsiDescription
authenticationAutentikasiAuthentication

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-17

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-2 data/books/en.json:1-3

Bagian selSumber nilaiMelewati translate
header kolomvocabularies[language]ya
judul ### ... per kategoricategoryName dari JSON bahasa itutidak
kolom nama APIapiNametidak
kolom pengembangdeveloper.name, dibungkus [nama](profileUrl) bila profileUrl terisitidak
kolom dokumentasiliteral [Link]( ditambah documentationUrltidak
kolom statusliteral ✅ atau ❎ dari api.statustidak
kolom deskripsidescriptiontidak
kolom autentikasiauthentication, atau literal false dalam backtick bila kosongtidak
baris pemisahsatu tanda - per kolomtidak

Pembentukan tautan pengembang dan tautan dokumentasi terjadi di dalam loop apis, sehingga kedua bahasa memakai aturan yang sama persis. src/utils/markdown.ts:19-27

Urutan judul mengikuti bahasa

Kategori di-sort dengan localeCompare atas categoryName sebelum ditulis, sehingga urutan judul berbeda antar berkas keluaran. src/build.ts:79-90

Berkas keluaranJudul pertamaJudul terakhir
README.mdAgama IslamUtilitas
README.en.mdBooksWeather

Daftar isi ikut urutan itu karena generateToc membaca hasil akhir markdown. README.md:19-38 README.en.md:21-40

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-9 README.en.md:9-11

Struktur tabel yang dihasilkan juga sudah terlihat pada hasil yang di-commit, misalnya tabel kategori Books dengan header berbahasa Inggris. README.en.md:50-56

⚠️ translate mengindeks vocabularies[language] tanpa penjagaan. Menambah data/<kategori>/ja.json tanpa menambah kunci ja di vocabularies.json membuat akses itu gagal saat markdownBuilder dijalankan untuk bahasa tersebut. src/utils/markdown.ts:4-6

⚠️ Kunci bahasa baru juga menuntut berkas keluaran baru. build membaca berkas tujuan lebih dulu, jadi README.ja.md harus sudah ada dengan pasangan marker API START/API END dan TOC START/TOC END sebelum build dijalankan. src/build.ts:79-90