Skip to content

Commit 265c395

Browse files
author
Daihyxsk (Dx)
committed
feat: add bilingual technology glossary (FR/EN)
Two-section glossary page listing all technologies taught in the course and those powering the site, with official links. Includes styled tables, sidebar navigation entry, and i18n parity check.
1 parent 21059f0 commit 265c395

File tree

6 files changed

+485
-0
lines changed

6 files changed

+485
-0
lines changed

cspell-words.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ Eleventy
4646
Nunjucks
4747
Pagefind
4848
pagefind
49+
esbuild
4950
frontmatter
5051
cspell
5152
keydown

scripts/pipeline/check-i18n-parity.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@ const PAIRS = [
1515
{ fr: "fr/codex", en: "en/codex", byFilename: true },
1616
];
1717

18+
// Standalone pages that must exist in both languages
19+
const STANDALONE_PAGES = [
20+
{ fr: "fr/glossaire.njk", en: "en/glossary.njk" },
21+
];
22+
1823
let errors = 0;
1924
let matched = 0;
2025

@@ -111,6 +116,21 @@ for (const pair of PAIRS) {
111116
}
112117
}
113118

119+
// Check standalone pages
120+
for (const sp of STANDALONE_PAGES) {
121+
const frExists = fs.existsSync(path.join(SRC, sp.fr));
122+
const enExists = fs.existsSync(path.join(SRC, sp.en));
123+
if (frExists && !enExists) {
124+
console.error(`MISSING EN: ${sp.fr} exists but ${sp.en} is missing`);
125+
errors++;
126+
} else if (!frExists && enExists) {
127+
console.error(`MISSING FR: ${sp.en} exists but ${sp.fr} is missing`);
128+
errors++;
129+
} else if (frExists && enExists) {
130+
matched++;
131+
}
132+
}
133+
114134
if (errors > 0) {
115135
console.error(`\ni18n parity: ${errors} issue(s) found`);
116136
process.exit(1);

src/assets/css/style.css

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1588,6 +1588,78 @@ tbody tr:hover {
15881588
}
15891589
}
15901590

1591+
/* ============================================================
1592+
Glossary Tables
1593+
============================================================ */
1594+
1595+
.glossary-table {
1596+
width: 100%;
1597+
border-collapse: collapse;
1598+
margin: 0.8rem 0 1.5rem;
1599+
font-size: 0.95rem;
1600+
}
1601+
1602+
.glossary-table thead th {
1603+
background: var(--color-brown-dark);
1604+
color: var(--color-gold-light);
1605+
font-weight: 600;
1606+
padding: 0.6rem 0.9rem;
1607+
text-align: left;
1608+
}
1609+
1610+
.glossary-table thead th:first-child {
1611+
border-radius: 6px 0 0 0;
1612+
width: 30%;
1613+
}
1614+
1615+
.glossary-table thead th:last-child {
1616+
border-radius: 0 6px 0 0;
1617+
}
1618+
1619+
.glossary-table tbody td {
1620+
padding: 0.55rem 0.9rem;
1621+
border-bottom: 1px solid var(--color-parchment-dark);
1622+
vertical-align: top;
1623+
}
1624+
1625+
.glossary-table tbody tr:last-child td {
1626+
border-bottom: none;
1627+
}
1628+
1629+
.glossary-table tbody tr:hover {
1630+
background: var(--color-parchment-light);
1631+
}
1632+
1633+
.glossary-table tbody td:first-child {
1634+
font-weight: 600;
1635+
white-space: nowrap;
1636+
}
1637+
1638+
.glossary-table tbody td a {
1639+
color: var(--color-brown-dark);
1640+
text-decoration: none;
1641+
border-bottom: 1px dashed var(--color-gold);
1642+
transition: color 0.15s, border-color 0.15s;
1643+
}
1644+
1645+
.glossary-table tbody td a:hover {
1646+
color: var(--color-gold-dark);
1647+
border-bottom-style: solid;
1648+
}
1649+
1650+
@media (max-width: 600px) {
1651+
.glossary-table thead th:first-child {
1652+
width: 40%;
1653+
}
1654+
.glossary-table {
1655+
font-size: 0.88rem;
1656+
}
1657+
.glossary-table tbody td,
1658+
.glossary-table thead th {
1659+
padding: 0.45rem 0.6rem;
1660+
}
1661+
}
1662+
15911663
/* ============================================================
15921664
Search FAB + Modal (Pagefind)
15931665
============================================================ */

src/assets/js/nav.js

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,12 @@
118118
}
119119
}
120120

121+
// Check if we're on the glossary page
122+
var glossarySlug = lang === 'fr' ? '/fr/glossaire/' : '/en/glossary/';
123+
if (path === glossarySlug) {
124+
return { type: 'glossary' };
125+
}
126+
121127
// Check if we're on a codex page
122128
var codexPrefix = getCodexPathPrefix();
123129
if (path.indexOf(codexPrefix) !== -1) {
@@ -191,6 +197,14 @@
191197
});
192198
html += '</div>';
193199

200+
// Glossary
201+
var glossaryHref = lang === 'fr' ? '/fr/glossaire/' : '/en/glossary/';
202+
var glossaryLabel = lang === 'fr' ? 'Glossaire' : 'Glossary';
203+
html += '<div class="arc-group">';
204+
html += '<a href="' + glossaryHref + '" class="quest-link' + (context.type === 'glossary' ? ' active' : '') + '">';
205+
html += glossaryLabel;
206+
html += '</a></div>';
207+
194208
nav.innerHTML = html;
195209
}
196210

src/en/glossary.njk

Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
1+
---
2+
layout: layouts/base.njk
3+
lang: en
4+
title: "Technology Glossary"
5+
permalink: /en/glossary/
6+
---
7+
8+
<!-- Hero -->
9+
<section class="hero">
10+
<h1>Technology Glossary</h1>
11+
<p class="subtitle">Every technology mentioned in the Chronicles</p>
12+
</section>
13+
14+
<section>
15+
<div class="narrative">
16+
<p>
17+
This glossary lists all the tools and technologies you will encounter throughout
18+
your learning journey, as well as those powering this site. Each entry links
19+
to the official documentation.
20+
</p>
21+
</div>
22+
</section>
23+
24+
<!-- ============================================================
25+
Section 1: Technologies taught in the course
26+
============================================================ -->
27+
28+
<section>
29+
<h2 class="codex-section-title">Technologies taught in the course</h2>
30+
31+
<h3>Version control</h3>
32+
<table class="glossary-table">
33+
<thead><tr><th>Name</th><th>Description</th></tr></thead>
34+
<tbody>
35+
<tr><td><a href="https://git-scm.com/" target="_blank" rel="noopener">Git</a></td><td>Distributed version control system, at the heart of every quest</td></tr>
36+
<tr><td><a href="https://git-scm.com/docs/git-lfs" target="_blank" rel="noopener">Git LFS</a></td><td>Git extension for managing large files (binaries, assets)</td></tr>
37+
<tr><td><a href="https://semver.org/" target="_blank" rel="noopener">Semantic Versioning</a></td><td>Version naming convention (MAJOR.MINOR.PATCH)</td></tr>
38+
</tbody>
39+
</table>
40+
41+
<h3>Platforms and forges</h3>
42+
<table class="glossary-table">
43+
<thead><tr><th>Name</th><th>Description</th></tr></thead>
44+
<tbody>
45+
<tr><td><a href="https://github.com/" target="_blank" rel="noopener">GitHub</a></td><td>Most popular Git hosting platform</td></tr>
46+
<tr><td><a href="https://about.gitlab.com/" target="_blank" rel="noopener">GitLab</a></td><td>Complete DevOps platform, self-hostable</td></tr>
47+
<tr><td><a href="https://bitbucket.org/" target="_blank" rel="noopener">Bitbucket</a></td><td>Atlassian's Git forge</td></tr>
48+
<tr><td><a href="https://forgejo.org/" target="_blank" rel="noopener">Forgejo</a></td><td>Lightweight, open source, self-hostable Git forge</td></tr>
49+
<tr><td><a href="https://gitea.com/" target="_blank" rel="noopener">Gitea</a></td><td>Lightweight Git forge written in Go</td></tr>
50+
<tr><td><a href="https://radicle.xyz/" target="_blank" rel="noopener">Radicle</a></td><td>Peer-to-peer, decentralized and sovereign Git forge</td></tr>
51+
</tbody>
52+
</table>
53+
54+
<h3>CI/CD and automation</h3>
55+
<table class="glossary-table">
56+
<thead><tr><th>Name</th><th>Description</th></tr></thead>
57+
<tbody>
58+
<tr><td><a href="https://docs.github.com/en/actions" target="_blank" rel="noopener">GitHub Actions</a></td><td>CI/CD system integrated into GitHub (YAML workflows)</td></tr>
59+
<tr><td><a href="https://docs.gitlab.com/ci/" target="_blank" rel="noopener">GitLab CI</a></td><td>CI/CD pipeline integrated into GitLab</td></tr>
60+
<tr><td><a href="https://support.atlassian.com/bitbucket-cloud/docs/get-started-with-bitbucket-pipelines/" target="_blank" rel="noopener">Bitbucket Pipelines</a></td><td>CI/CD integrated into Bitbucket</td></tr>
61+
<tr><td><a href="https://www.jenkins.io/" target="_blank" rel="noopener">Jenkins</a></td><td>Historical open source automation server</td></tr>
62+
</tbody>
63+
</table>
64+
65+
<h3>Infrastructure and deployment</h3>
66+
<table class="glossary-table">
67+
<thead><tr><th>Name</th><th>Description</th></tr></thead>
68+
<tbody>
69+
<tr><td><a href="https://www.docker.com/" target="_blank" rel="noopener">Docker</a></td><td>Application containerization platform</td></tr>
70+
<tr><td><a href="https://kubernetes.io/" target="_blank" rel="noopener">Kubernetes</a></td><td>Container orchestrator for large-scale deployment</td></tr>
71+
<tr><td><a href="https://www.terraform.io/" target="_blank" rel="noopener">Terraform</a></td><td>Multi-cloud Infrastructure as Code (IaC)</td></tr>
72+
<tr><td><a href="https://argo-cd.readthedocs.io/" target="_blank" rel="noopener">ArgoCD</a></td><td>GitOps continuous deployment tool for Kubernetes</td></tr>
73+
<tr><td><a href="https://fluxcd.io/" target="_blank" rel="noopener">Flux</a></td><td>GitOps tool for Kubernetes synchronization</td></tr>
74+
<tr><td><a href="https://kustomize.io/" target="_blank" rel="noopener">Kustomize</a></td><td>Kubernetes configuration management without templates</td></tr>
75+
<tr><td><a href="https://pages.github.com/" target="_blank" rel="noopener">GitHub Pages</a></td><td>Free static site hosting from a GitHub repository</td></tr>
76+
</tbody>
77+
</table>
78+
79+
<h3>Monorepos and build</h3>
80+
<table class="glossary-table">
81+
<thead><tr><th>Name</th><th>Description</th></tr></thead>
82+
<tbody>
83+
<tr><td><a href="https://nx.dev/" target="_blank" rel="noopener">Nx</a></td><td>Smart build system for JavaScript/TypeScript monorepos</td></tr>
84+
<tr><td><a href="https://turbo.build/" target="_blank" rel="noopener">Turborepo</a></td><td>High-performance build system for JS monorepos</td></tr>
85+
<tr><td><a href="https://bazel.build/" target="_blank" rel="noopener">Bazel</a></td><td>Google's multi-language build system</td></tr>
86+
</tbody>
87+
</table>
88+
89+
<h3>Data Science and Machine Learning</h3>
90+
<table class="glossary-table">
91+
<thead><tr><th>Name</th><th>Description</th></tr></thead>
92+
<tbody>
93+
<tr><td><a href="https://jupyter.org/" target="_blank" rel="noopener">Jupyter</a></td><td>Interactive notebooks for scientific computing</td></tr>
94+
<tr><td><a href="https://dvc.org/" target="_blank" rel="noopener">DVC</a></td><td>Data Version Control - data and ML pipeline versioning</td></tr>
95+
<tr><td><a href="https://onnx.ai/" target="_blank" rel="noopener">ONNX</a></td><td>Open format for machine learning model exchange</td></tr>
96+
<tr><td><a href="https://jupytext.readthedocs.io/" target="_blank" rel="noopener">Jupytext</a></td><td>Sync Jupyter notebooks with plain text files</td></tr>
97+
<tr><td><a href="https://github.com/kynan/nbstripout" target="_blank" rel="noopener">nbstripout</a></td><td>Git filter to strip notebook outputs</td></tr>
98+
</tbody>
99+
</table>
100+
101+
<h3>Hardware and electronics</h3>
102+
<table class="glossary-table">
103+
<thead><tr><th>Name</th><th>Description</th></tr></thead>
104+
<tbody>
105+
<tr><td><a href="https://www.kicad.org/" target="_blank" rel="noopener">KiCad</a></td><td>Open source electronic design suite (schematics, PCB)</td></tr>
106+
<tr><td><a href="https://github.com/Gasman2014/KiCad-Diff" target="_blank" rel="noopener">kidiff</a></td><td>Visual diff tool for KiCad schematics</td></tr>
107+
<tr><td><a href="https://github.com/leandrosq/plotgitsch" target="_blank" rel="noopener">plotgitsch</a></td><td>Schematic change visualization in Git</td></tr>
108+
</tbody>
109+
</table>
110+
111+
<h3>Design and creation</h3>
112+
<table class="glossary-table">
113+
<thead><tr><th>Name</th><th>Description</th></tr></thead>
114+
<tbody>
115+
<tr><td><a href="https://www.figma.com/" target="_blank" rel="noopener">Figma</a></td><td>Collaborative online design tool</td></tr>
116+
<tr><td><a href="https://www.abstract.com/" target="_blank" rel="noopener">Abstract</a></td><td>Version control for design files</td></tr>
117+
</tbody>
118+
</table>
119+
120+
<h3>Security and authentication</h3>
121+
<table class="glossary-table">
122+
<thead><tr><th>Name</th><th>Description</th></tr></thead>
123+
<tbody>
124+
<tr><td><a href="https://www.openssh.com/" target="_blank" rel="noopener">SSH</a></td><td>Secure protocol for authentication and transfer</td></tr>
125+
<tr><td><a href="https://gnupg.org/" target="_blank" rel="noopener">GPG</a></td><td>Cryptographic encryption and commit signing</td></tr>
126+
</tbody>
127+
</table>
128+
</section>
129+
130+
<div class="fancy-separator"></div>
131+
132+
<!-- ============================================================
133+
Section 2: Technologies powering this site
134+
============================================================ -->
135+
136+
<section>
137+
<h2 class="codex-section-title">Technologies powering this site</h2>
138+
139+
<div class="narrative">
140+
<p>
141+
This site is itself an open source project. Here is the tech stack that makes it run.
142+
</p>
143+
</div>
144+
145+
<h3>Generation and templates</h3>
146+
<table class="glossary-table">
147+
<thead><tr><th>Name</th><th>Description</th></tr></thead>
148+
<tbody>
149+
<tr><td><a href="https://www.11ty.dev/" target="_blank" rel="noopener">Eleventy (11ty)</a></td><td>Simple and fast static site generator (v3)</td></tr>
150+
<tr><td><a href="https://mozilla.github.io/nunjucks/" target="_blank" rel="noopener">Nunjucks</a></td><td>Template engine used for all pages (.njk)</td></tr>
151+
</tbody>
152+
</table>
153+
154+
<h3>Search</h3>
155+
<table class="glossary-table">
156+
<thead><tr><th>Name</th><th>Description</th></tr></thead>
157+
<tbody>
158+
<tr><td><a href="https://pagefind.app/" target="_blank" rel="noopener">Pagefind</a></td><td>Client-side static search engine, bilingual</td></tr>
159+
</tbody>
160+
</table>
161+
162+
<h3>Build and optimization</h3>
163+
<table class="glossary-table">
164+
<thead><tr><th>Name</th><th>Description</th></tr></thead>
165+
<tbody>
166+
<tr><td><a href="https://esbuild.github.io/" target="_blank" rel="noopener">esbuild</a></td><td>Ultra-fast JavaScript bundler, used for CSS/JS minification</td></tr>
167+
<tr><td><a href="https://github.com/terser/html-minifier-terser" target="_blank" rel="noopener">html-minifier-terser</a></td><td>HTML minification in production</td></tr>
168+
</tbody>
169+
</table>
170+
171+
<h3>Code quality</h3>
172+
<table class="glossary-table">
173+
<thead><tr><th>Name</th><th>Description</th></tr></thead>
174+
<tbody>
175+
<tr><td><a href="https://cspell.org/" target="_blank" rel="noopener">cspell</a></td><td>Spell checker for code and content (FR/EN)</td></tr>
176+
<tr><td><a href="https://typicode.github.io/husky/" target="_blank" rel="noopener">Husky</a></td><td>Git hooks manager (pre-commit)</td></tr>
177+
</tbody>
178+
</table>
179+
180+
<h3>Hosting and CI/CD</h3>
181+
<table class="glossary-table">
182+
<thead><tr><th>Name</th><th>Description</th></tr></thead>
183+
<tbody>
184+
<tr><td><a href="https://pages.github.com/" target="_blank" rel="noopener">GitHub Pages</a></td><td>Production hosting for this site</td></tr>
185+
<tr><td><a href="https://docs.github.com/en/actions" target="_blank" rel="noopener">GitHub Actions</a></td><td>Automated build, tests and deployment on every push</td></tr>
186+
<tr><td><a href="https://lychee.cli.rs/" target="_blank" rel="noopener">Lychee</a></td><td>Dead link checker for the site</td></tr>
187+
</tbody>
188+
</table>
189+
</section>

0 commit comments

Comments
 (0)