Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion astro.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@ import sitemap from "@astrojs/sitemap";
import { rehypeTableHeaders } from "./src/plugins/rehype-table-headers.mjs";

// D4: i18n in the architecture from day one, phased in content.
// `fr` and `es` are reserved in routing but ship no pages until their phase.
// `en`, `ar`, and `fr` are all routed and all ship the full page set; `es` is
// not a locale yet — adding one stays content + config only.
// D7 / FR-1: static-first — no adapter, zero client JS by default.
export default defineConfig({
site: "https://keeltrading.com",
Expand Down
14 changes: 14 additions & 0 deletions src/components/pages/AboutPage.astro
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,13 @@ const c = about[locale];
{item.answer.map((paragraph) => (
<p>{paragraph}</p>
))}
{item.link ? (
<p>
<a href={`${localePath(locale, item.link.page)}${item.link.hash ?? ""}`}>
{item.link.label}
</a>
</p>
) : null}
</div>
))
}
Expand All @@ -54,6 +61,13 @@ const c = about[locale];
{item.answer.map((paragraph) => (
<p>{paragraph}</p>
))}
{item.link ? (
<p>
<a href={`${localePath(locale, item.link.page)}${item.link.hash ?? ""}`}>
{item.link.label}
</a>
</p>
) : null}
</div>
))
}
Expand Down
2 changes: 1 addition & 1 deletion src/components/pages/CompliancePage.astro
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ const honestLinks = [
</ul>
</section>

<section>
<section id="is-this-shariah-law">
<h2>{c.framing.title}</h2>
{c.framing.body.map((paragraph) => <p>{paragraph}</p>)}
</section>
Expand Down
6 changes: 3 additions & 3 deletions src/i18n/config.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
/**
* FR-7 — i18n & RTL in the architecture from day one.
*
* `en` is the source of truth; `ar` is the launch translation. `fr`/`es` are
* reserved in routing (astro.config.mjs) but ship no pages until their phase
* (D4) — adding a locale must be content + config only.
* `en` is the source of truth; `ar` was the launch translation and `fr` has
* since shipped the full page set. `es` is not a locale yet (D4) — adding one
* must stay content + config only.
*/
export const locales = ["en", "ar", "fr"] as const;
export type Locale = (typeof locales)[number];
Expand Down
47 changes: 41 additions & 6 deletions src/i18n/pages/about.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { LocalizedPage } from "../config";
import type { LocalizedPage, PageKey } from "../config";

/**
* About (FR-2): license, trademarks, brand FAQ including the keel.sh
Expand All @@ -7,6 +7,8 @@ import type { LocalizedPage } from "../config";
export interface FaqItem {
question: string;
answer: string[];
/** Optional deep link after the answer; AboutPage builds the path with localePath. */
link?: { label: string; page: PageKey; hash?: `#${string}` };
}

export interface AboutContent {
Expand All @@ -24,7 +26,7 @@ export interface AboutContent {

export const about: LocalizedPage<AboutContent> = {
en: {
rev: "2026-08-20.2",
rev: "2026-08-26.1",
title: "About keel — Name, License, keel.sh & KEEL FAQ",
description:
"Who runs keeltrading.com, licensing, and the brand FAQ — why this keel is not Kubernetes Keel (keel.sh) nor Keel Infrastructure (KEEL).",
Expand Down Expand Up @@ -53,6 +55,17 @@ export const about: LocalizedPage<AboutContent> = {
"No. A Nasdaq-listed bitcoin-mining company (formerly Bitfarms) trades under the ticker KEEL, so a search for “keel trading” or “keel crypto” may show its stock chart near these results. It has no connection to this project. This keel is an open-source compliance engine by CodeGate Software — if you landed on keeltrading.com, you are in the right place.",
],
},
{
question: "Is this “Shariah law”?",
answer: [
"No. keel constrains its operator's own trading and governs nobody else's conduct. No ruling is embedded in the software: the ruling is an input the operator records, not an output the engine produces. The honest description is a compliance engine that happens to have been built for one ethical framework.",
],
link: {
label: "The full argument, on the compliance page",
page: "compliance",
hash: "#is-this-shariah-law",
},
},
{
question: "Why is it called keel?",
answer: [
Expand Down Expand Up @@ -107,8 +120,8 @@ export const about: LocalizedPage<AboutContent> = {
},

ar: {
rev: "2026-08-20.2",
translatedFromRev: "2026-08-20.2",
rev: "2026-08-26.1",
translatedFromRev: "2026-08-26.1",
title: "حول كيل — الاسم والترخيص وأسئلة keel.sh وKEEL",
description:
"مَن يُشغّل keeltrading.com، والتراخيص، والأسئلة الشائعة عن الاسم — ولماذا ليس هذا كيلَ Kubernetes‏ (keel.sh) ولا شركةَ Keel Infrastructure‏ (KEEL).",
Expand Down Expand Up @@ -137,6 +150,17 @@ export const about: LocalizedPage<AboutContent> = {
"لا. فثمّة شركةُ تعدين بيتكوين مدرجةٌ في ناسداك (كانت تُعرف سابقًا بـ Bitfarms) تتداول تحت الرمز KEEL، وقد يُظهر البحث عن «keel trading» أو «keel crypto» مخطّطَ سهمها قرب هذه النتائج. ولا صلة لها بهذا المشروع. فكيل هذا محرّكُ امتثالٍ مفتوح المصدر من CodeGate Software — وإن كنت قد وصلت إلى keeltrading.com فأنت في المكان الصحيح.",
],
},
{
question: "أهذا «القانون الشريعي»؟",
answer: [
"لا. فكيل يقيّد تداول مشغّله وحده، ولا يحكم سلوكَ أحدٍ غيره. ولا حُكمَ مضمّنًا في البرمجية: فالحُكم مُدخَلٌ يسجّله المشغّل، لا مخرجٌ ينتجه المحرّك. والوصفُ الصادق: محرّكُ امتثالٍ صُدِف أن بُني لإطارٍ أخلاقيٍّ واحد.",
],
link: {
label: "الحجّة كاملةً في صفحة الامتثال",
page: "compliance",
hash: "#is-this-shariah-law",
},
},
{
question: "لماذا سُمّي المشروع «كيل»؟",
answer: [
Expand Down Expand Up @@ -191,8 +215,8 @@ export const about: LocalizedPage<AboutContent> = {
},

fr: {
rev: "2026-08-20.2",
translatedFromRev: "2026-08-20.2",
rev: "2026-08-26.1",
translatedFromRev: "2026-08-26.1",
title: "À propos de keel — nom, licence et FAQ keel.sh & KEEL",
description:
"Qui édite keeltrading.com, les licences, et la FAQ de la marque — pourquoi ce keel n'est ni le Keel de Kubernetes (keel.sh) ni Keel Infrastructure (KEEL).",
Expand Down Expand Up @@ -221,6 +245,17 @@ export const about: LocalizedPage<AboutContent> = {
"Non. Une société de minage de bitcoin cotée au Nasdaq (ex-Bitfarms) est cotée sous le symbole KEEL : une recherche sur « keel trading » ou « keel crypto » peut donc faire remonter son cours de Bourse. Elle n'a aucun lien avec ce projet. Ce keel-ci est un moteur de conformité open-source signé CodeGate Software — si vous êtes arrivé sur keeltrading.com, vous êtes au bon endroit.",
],
},
{
question: "Est-ce « la loi shariah » ?",
answer: [
"Non. keel contraint le trading de son opérateur, et ne gouverne la conduite de personne d'autre. Aucun jugement n'est encodé dans le logiciel : le jugement est une entrée que l'opérateur enregistre, pas une sortie que le moteur produit. La description honnête : un moteur de conformité qu'il est advenu qu'on bâtisse pour un cadre éthique précis.",
],
link: {
label: "L'argument complet, sur la page Conformité",
page: "compliance",
hash: "#is-this-shariah-law",
},
},
{
question: "Pourquoi ce nom, keel ?",
answer: [
Expand Down
Loading