Read-only mirrors. Development, issues and pull requests are on GitHub.

summaryrefslogtreecommitdiffhomepage
path: root/frontend/src/content/landing.ts
blob: c12eb4beb143bb0e1a903f25818d441bcf874491 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
// SPDX-FileCopyrightText: 2026 Progmasoft <support@progmasoft.com>
// SPDX-License-Identifier: AGPL-3.0-or-later WITH AdditionRef-Progmasoft-Patent-Grant-1.1

import type { Locale } from "../locales";
import type { Site } from "../site";
import { talafmtLanding } from "./talafmt.ts";
import { talalintLanding } from "./talalint.ts";

/** One tab of a "Why" section: a strength, a sentence about it and a sample that shows it. */
export type WhyTab = { label: string; caption: string; file: string; code: string };

/** The first page of a site in one language. */
export type LandingText = {
  title: string;
  description: string;
  headline: string;
  lead: string;
  primary: { label: string; to: string };
  secondary: { label: string; to: string };
  whyHeading: string;
  tabs: readonly WhyTab[];
  nextHeading: string;
  next: readonly { label: string; href: string }[];
  copy: string;
  copied: string;
};

// The Tala samples are the programs of Examples/ in the compiler repository, from the namespace line on; a test
// compares them. The terminal samples are what talac 0.2.0 printed on Windows, the LLVM IR included.
export const helloWorld = `namespace Examples.HelloWorld;

public class HelloWorld {
    public static void Main() {
        String language = "Tala";
        Console.Println("Hello from " + language + "!");
    }
}`;

export const primeNumbers = `namespace Examples.PrimeNumbers;

public class PrimeNumbers {
    private static bool IsPrime(int candidate) {
        if (candidate < 2) {
            return false;
        }

        int divisor = 2;
        while (divisor * divisor <= candidate) {
            if (candidate % divisor == 0) {
                return false;
            }
            divisor++;
        }
        return true;
    }

    public static void Main() {
        int candidate = 2;
        while (candidate <= 50) {
            if (IsPrime(candidate)) {
                Console.Println(candidate);
            }
            candidate++;
        }
    }
}`;

export const gcd = `namespace Examples.GCD;

public class GCD {
    -- Euclid's algorithm is a compact example of loop-carried state.
    public static int Compute(int left, int right) {
        int a = left;
        int b = right;
        while (b \\= 0) {
            int remainder = a % b;
            a = b;
            b = remainder;
        }
        return a;
    }

    public static void Main() {
        Console.Printfn("gcd(1071, 462) = %d", Compute(1071, 462));
    }
}`;

// Not an example of the compiler repository: the smallest program that shows an argument evaluated by need.
export const lazyArguments = `namespace Examples.Lazy;

public class Lazy {
    -- An argument is evaluated when the body needs it, and only then.
    public static int Choose(bool first, int left, int right) {
        if (first) {
            return left;
        }
        return right;
    }

    public static void Main() {
        int zero = 0;
        -- The second argument would divide by zero; it is never needed.
        Console.Println(Choose(true, 42, 1 / zero));
    }
}`;

const gcdIr = `$ talac GCD.tala --entry=Examples.GCD.GCD --emit=llvm-ir -O2
talac: wrote 'GCD.ll' from verified Core through CorePrep, Xpp, Xmm and LLVM

define i64 @Examples.GCD.Compute.2(i64 %0, i64 %1) local_unnamed_addr #0 {
block.0:
  %not.equal.not7 = icmp eq i64 %1, 0
  br i1 %not.equal.not7, label %block.3, label %block.5

block.3:                                          ; preds = %block.5, %block.0
  %r3.0.lcssa = phi i64 [ %0, %block.0 ], [ %r4.08, %block.5 ]
  ret i64 %r3.0.lcssa

block.5:                                          ; preds = %block.0, %block.5
  %r3.09 = phi i64 [ %r4.08, %block.5 ], [ %0, %block.0 ]
  %r4.08 = phi i64 [ %rem, %block.5 ], [ %1, %block.0 ]
  %2 = icmp eq i64 %r3.09, -9223372036854775808
  %3 = icmp eq i64 %r4.08, -1
  %quotient.wraps = and i1 %3, %2
  %divisor = select i1 %quotient.wraps, i64 1, i64 %r4.08
  %rem = srem i64 %r3.09, %divisor
  %not.equal.not = icmp eq i64 %rem, 0
  br i1 %not.equal.not, label %block.3, label %block.5
}`;

const talacOneCommand = `$ talac GCD.tala --entry=Examples.GCD.GCD
talac: linked native executable 'GCD.exe'
$ .\\GCD.exe
gcd(1071, 462) = 21`;
const talacCheck = `$ talac GCD.tala --entry=Examples.GCD.GCD --emit=metadata
talac: compiler artifact 'GCD.tala' is valid through its requested pipeline boundary
talac: wrote 'GCD.talameta'
$ cat GCD.talameta
talameta 1
compiler 0.2.0
entry Examples.GCD.GCD
input GCD.tala`;
const talacStages = `$ talac GCD.tala --entry=Examples.GCD.GCD --emit=core
talac: wrote 'GCD.core'
$ talac GCD.tala --entry=Examples.GCD.GCD --emit=xpp
talac: wrote verified Xpp artifact 'GCD.xpp'
$ talac GCD.tala --entry=Examples.GCD.GCD --emit=xmm
talac: wrote verified Xmm artifact 'GCD.xmm'
$ talac GCD.tala --entry=Examples.GCD.GCD --emit=llvm-ir
talac: wrote 'GCD.ll' from verified Core through CorePrep, Xpp, Xmm and LLVM`;
const talacDiagnostic = `$ talac Broken.tala --entry=Demo.Program
Broken.tala:5:9: TAT0002: binding initializer has the wrong type
talac: frontend: Broken.tala:5:9: TAT0002: binding initializer has the wrong type

-- Broken.tala, line 5:
--         int count = "three";`;

const tazelProject = `project {
  name = "Example"
  version = "0.1.0"
}

compiler {
  buildMode = BuildMode.RELEASE
  warnings = Warnings.ALL
}

sources {
  executable {
    entry = "Example.Program"
  }
}`;
const tazelCommands = `tazel check
tazel build
tazel run -- --port 8080
tazel fmt -- --check
tazel lint -- --fix`;
const tazelTargets = `tazel build --vipkg Server
tazel build -e Client -e Admin
tazel lint --workspace -- --fix`;
const tazelGraph = `$ tazel lock graph
Demo
├── Publisher.Json 1.1.0 [by feature Json]
├── Publisher.Name 1.0.0
├── Local.vipkg (local)
└── [test]
    └── Publisher.Name 2.0.0`;
const tazelHints = `$ tazel biuld
error: 'biuld' is not a command of tazel; write tazel help for the commands
 hint: did you mean tazel build? So close the keys almost had it.`;
const languageTazel = `${tazelProject}

// tazel build
// tazel run`;

type TabWords<K extends string> = Record<K, { label: string; caption: string }>;

function languageTabs(
  words: TabWords<"simple" | "loops" | "lazy" | "inspect" | "tazel">,
): WhyTab[] {
  return [
    { ...words.simple, file: "HelloWorld.tala", code: helloWorld },
    { ...words.loops, file: "PrimeNumbers.tala", code: primeNumbers },
    { ...words.lazy, file: "Lazy.tala", code: lazyArguments },
    { ...words.inspect, file: "terminal", code: gcdIr },
    { ...words.tazel, file: "BUILD.kts", code: languageTazel },
  ];
}

function talacTabs(
  words: TabWords<"one" | "check" | "stages" | "native" | "diagnostics">,
): WhyTab[] {
  return [
    { ...words.one, file: "terminal", code: talacOneCommand },
    { ...words.check, file: "terminal", code: talacCheck },
    { ...words.stages, file: "terminal", code: talacStages },
    { ...words.native, file: "terminal", code: gcdIr },
    { ...words.diagnostics, file: "terminal", code: talacDiagnostic },
  ];
}

function tazelTabs(
  words: TabWords<"project" | "commands" | "targets" | "graph" | "hints">,
): WhyTab[] {
  return [
    { ...words.project, file: "BUILD.kts", code: tazelProject },
    { ...words.commands, file: "terminal", code: tazelCommands },
    { ...words.targets, file: "terminal", code: tazelTargets },
    { ...words.graph, file: "terminal", code: tazelGraph },
    { ...words.hints, file: "terminal", code: tazelHints },
  ];
}

const repository = "https://github.com/Progmasoft/tala";
const tazelRepository = "https://github.com/Progmasoft/tazel";

export const landing: Record<Site, Record<Locale, LandingText>> = {
  language: {
    "en-US": {
      title: "Tala — Make the whole program understandable",
      description:
        "Meet Tala: a native programming language built around readable source, explicit ownership, and an inspectable compiler pipeline.",
      headline: "Make the whole program understandable.",
      lead: "Tala is a native language with readable source, explicit ownership and a compiler whose every stage you can look at.",
      primary: { label: "Get started", to: "/docs/getting-started" },
      secondary: { label: "Read the overview", to: "/docs/overview" },
      whyHeading: "Why Tala?",
      tabs: languageTabs({
        simple: {
          label: "Simple",
          caption: "A class holds the entry point, and the first program says what it does.",
        },
        loops: {
          label: "Loops and conditions",
          caption: "while, if and return read the way they run; \\= means not equal.",
        },
        lazy: {
          label: "Lazy by default",
          caption:
            "An argument is evaluated when the body needs it. This program prints 42 and never divides by zero.",
        },
        inspect: {
          label: "A compiler you can inspect",
          caption:
            "Talac shows what it made of your code: here, the LLVM IR of the gcd loop of an example program.",
        },
        tazel: {
          label: "Builds with Tazel",
          caption: "A Kotlin project file and one command for each job.",
        },
      }),
      nextHeading: "Next",
      next: [
        { label: "Syntax", href: "/docs/syntax" },
        { label: "Specification", href: `${repository}/tree/main/Spec` },
        { label: "Examples", href: `${repository}/tree/main/Examples` },
      ],
      copy: "Copy",
      copied: "Copied",
    },
    "de-DE": {
      title: "Tala — Das ganze Programm verstehen",
      description:
        "Tala ist eine native Programmiersprache mit lesbarem Quellcode, explizitem Ownership und nachvollziehbarer Compiler-Pipeline.",
      headline: "Das ganze Programm verstehen.",
      lead: "Tala ist eine native Sprache mit lesbarem Quellcode, explizitem Ownership und einem Compiler, dessen Stufen man alle einsehen kann.",
      primary: { label: "Erste Schritte", to: "/docs/getting-started" },
      secondary: { label: "Zum Überblick", to: "/docs/overview" },
      whyHeading: "Warum Tala?",
      tabs: languageTabs({
        simple: {
          label: "Einfach",
          caption:
            "Eine Klasse enthält den Einstiegspunkt, und das erste Programm sagt, was es tut.",
        },
        loops: {
          label: "Schleifen und Bedingungen",
          caption: "while, if und return lesen sich, wie sie laufen; \\= heißt ungleich.",
        },
        lazy: {
          label: "Standardmäßig lazy",
          caption:
            "Ein Argument wird ausgewertet, wenn der Rumpf es braucht. Dieses Programm gibt 42 aus und teilt nie durch null.",
        },
        inspect: {
          label: "Ein Compiler zum Hineinsehen",
          caption:
            "Talac zeigt, was er aus Ihrem Code gemacht hat: hier das LLVM-IR der gcd-Schleife eines Beispielprogramms.",
        },
        tazel: {
          label: "Bauen mit Tazel",
          caption: "Eine Projektdatei in Kotlin und ein Befehl für jede Aufgabe.",
        },
      }),
      nextHeading: "Weiter",
      next: [
        { label: "Syntax", href: "/docs/syntax" },
        { label: "Spezifikation", href: `${repository}/tree/main/Spec` },
        { label: "Beispiele", href: `${repository}/tree/main/Examples` },
      ],
      copy: "Kopieren",
      copied: "Kopiert",
    },
    "ru-RU": {
      title: "Tala — Сделать понятной всю программу",
      description:
        "Tala — нативный язык программирования с читаемым исходным кодом, явным владением и прозрачным конвейером компилятора.",
      headline: "Сделать понятной всю программу.",
      lead: "Tala — нативный язык с читаемым кодом, явным владением и компилятором, каждую стадию которого можно увидеть.",
      primary: { label: "Начать", to: "/docs/getting-started" },
      secondary: { label: "Обзор языка", to: "/docs/overview" },
      whyHeading: "Почему Tala?",
      tabs: languageTabs({
        simple: {
          label: "Просто",
          caption: "Точка входа — в классе, а первая программа говорит, что делает.",
        },
        loops: {
          label: "Циклы и условия",
          caption: "while, if и return читаются так, как выполняются; \\= означает «не равно».",
        },
        lazy: {
          label: "Ленивый по умолчанию",
          caption:
            "Аргумент вычисляется, когда он нужен телу. Эта программа печатает 42 и никогда не делит на ноль.",
        },
        inspect: {
          label: "Компилятор, который видно",
          caption:
            "Talac показывает, во что он превратил код: здесь LLVM IR цикла gcd из программы-примера.",
        },
        tazel: {
          label: "Сборка с Tazel",
          caption: "Файл проекта на Kotlin и одна команда на каждую задачу.",
        },
      }),
      nextHeading: "Дальше",
      next: [
        { label: "Синтаксис", href: "/docs/syntax" },
        { label: "Спецификация", href: `${repository}/tree/main/Spec` },
        { label: "Примеры", href: `${repository}/tree/main/Examples` },
      ],
      copy: "Копировать",
      copied: "Скопировано",
    },
    "he-IL": {
      title: "Tala — להפוך את התוכנית כולה למובנת",
      description:
        "הכירו את Tala: שפת תכנות שמהודרת לקוד מכונה והבנויה סביב קוד מקור קריא, בעלות מפורשת ותהליך הידור שאפשר לבחון.",
      headline: "להפוך את התוכנית כולה למובנת.",
      lead: "Tala היא שפה נייטיב עם קוד קריא, בעלות מפורשת ומהדר שאפשר לראות כל שלב שלו.",
      primary: { label: "צעדים ראשונים", to: "/docs/getting-started" },
      secondary: { label: "לסקירה", to: "/docs/overview" },
      whyHeading: "למה Tala?",
      tabs: languageTabs({
        simple: {
          label: "פשוטה",
          caption: "מחלקה מחזיקה את נקודת הכניסה, והתוכנית הראשונה אומרת מה היא עושה.",
        },
        loops: {
          label: "לולאות ותנאים",
          caption: "‏while, ‏if ו-return נקראים כפי שהם רצים; ‎\\= פירושו שונה.",
        },
        lazy: {
          label: "עצלה כברירת מחדל",
          caption:
            "ארגומנט מחושב כשגוף המתודה צריך אותו. התוכנית הזאת מדפיסה 42 ואף פעם לא מחלקת באפס.",
        },
        inspect: {
          label: "מהדר שאפשר לראות",
          caption: "‏Talac מראה מה הוא עשה מהקוד: כאן, ה-LLVM IR של לולאת gcd מתוכנית לדוגמה.",
        },
        tazel: {
          label: "בנייה עם Tazel",
          caption: "קובץ פרויקט ב-Kotlin ופקודה אחת לכל משימה.",
        },
      }),
      nextHeading: "המשך",
      next: [
        { label: "תחביר", href: "/docs/syntax" },
        { label: "מפרט", href: `${repository}/tree/main/Spec` },
        { label: "דוגמאות", href: `${repository}/tree/main/Examples` },
      ],
      copy: "העתקה",
      copied: "הועתק",
    },
  },
  talac: {
    "en-US": {
      title: "Talac — The Tala compiler",
      description:
        "Talac compiles Tala to a native program, checks a program without building it, and writes every stage of the pipeline on request.",
      headline: "From source to a native program, one stage at a time.",
      lead: "Talac is the compiler of Tala: one command builds a native program, and every stage on the way is yours to look at.",
      primary: { label: "Command line", to: "/docs/command-line" },
      secondary: { label: "Outputs", to: "/docs/outputs" },
      whyHeading: "Why Talac?",
      tabs: talacTabs({
        one: {
          label: "One command",
          caption: "Sources in, a native executable out, named after the first input.",
        },
        check: {
          label: "Check without building",
          caption:
            "--emit=metadata runs every verifier and writes a short record instead of a program.",
        },
        stages: {
          label: "Every stage",
          caption:
            "Core, Xpp, Xmm and LLVM IR can each be written out, and each is verified before it is.",
        },
        native: {
          label: "Native code",
          caption:
            "LLVM optimizes the verified Xmm; -O2 turned the gcd loop of an example into this.",
        },
        diagnostics: {
          label: "Diagnostics",
          caption: "An error names its file, line, column and a stable code.",
        },
      }),
      nextHeading: "Next",
      next: [
        { label: "Tala", href: "https://tala.run/" },
        { label: "Tazel", href: "https://tazel.tala.run/" },
        { label: "Source", href: `${repository}/tree/main/Talac` },
      ],
      copy: "Copy",
      copied: "Copied",
    },
    "de-DE": {
      title: "Talac — Der Compiler von Tala",
      description:
        "Talac übersetzt Tala in ein natives Programm, prüft ein Programm, ohne es zu bauen, und schreibt auf Wunsch jede Stufe der Pipeline.",
      headline: "Vom Quellcode zum nativen Programm, Stufe für Stufe.",
      lead: "Talac ist der Compiler von Tala: Ein Befehl baut ein natives Programm, und jede Stufe auf dem Weg können Sie einsehen.",
      primary: { label: "Kommandozeile", to: "/docs/command-line" },
      secondary: { label: "Ausgaben", to: "/docs/outputs" },
      whyHeading: "Warum Talac?",
      tabs: talacTabs({
        one: {
          label: "Ein Befehl",
          caption:
            "Quellen hinein, eine native ausführbare Datei heraus, benannt nach der ersten Eingabe.",
        },
        check: {
          label: "Prüfen ohne Bauen",
          caption:
            "--emit=metadata führt jeden Verifier aus und schreibt statt eines Programms einen kurzen Eintrag.",
        },
        stages: {
          label: "Jede Stufe",
          caption:
            "Core, Xpp, Xmm und LLVM-IR lassen sich einzeln schreiben, und jede wird vorher verifiziert.",
        },
        native: {
          label: "Nativer Code",
          caption:
            "LLVM optimiert das verifizierte Xmm; -O2 hat die gcd-Schleife eines Beispiels so übersetzt.",
        },
        diagnostics: {
          label: "Diagnosen",
          caption: "Ein Fehler nennt Datei, Zeile, Spalte und einen festen Code.",
        },
      }),
      nextHeading: "Weiter",
      next: [
        { label: "Tala", href: "https://tala.run/" },
        { label: "Tazel", href: "https://tazel.tala.run/" },
        { label: "Quellcode", href: `${repository}/tree/main/Talac` },
      ],
      copy: "Kopieren",
      copied: "Kopiert",
    },
    "ru-RU": {
      title: "Talac — Компилятор Tala",
      description:
        "Talac компилирует Tala в нативную программу, проверяет программу без сборки и по запросу записывает каждую стадию конвейера.",
      headline: "От исходного кода к нативной программе, стадия за стадией.",
      lead: "Talac — компилятор Tala: одна команда собирает нативную программу, а каждую стадию по пути можно посмотреть.",
      primary: { label: "Командная строка", to: "/docs/command-line" },
      secondary: { label: "Результаты", to: "/docs/outputs" },
      whyHeading: "Почему Talac?",
      tabs: talacTabs({
        one: {
          label: "Одна команда",
          caption:
            "На входе исходники, на выходе нативный исполняемый файл с именем первого входа.",
        },
        check: {
          label: "Проверка без сборки",
          caption:
            "--emit=metadata запускает все верификаторы и вместо программы записывает короткую запись.",
        },
        stages: {
          label: "Каждая стадия",
          caption:
            "Core, Xpp, Xmm и LLVM IR можно записать по отдельности, и каждая сначала проверяется.",
        },
        native: {
          label: "Нативный код",
          caption: "LLVM оптимизирует проверенный Xmm; с -O2 цикл gcd из примера стал таким.",
        },
        diagnostics: {
          label: "Диагностика",
          caption: "Ошибка называет файл, строку, столбец и постоянный код.",
        },
      }),
      nextHeading: "Дальше",
      next: [
        { label: "Tala", href: "https://tala.run/" },
        { label: "Tazel", href: "https://tazel.tala.run/" },
        { label: "Исходный код", href: `${repository}/tree/main/Talac` },
      ],
      copy: "Копировать",
      copied: "Скопировано",
    },
    "he-IL": {
      title: "Talac — המהדר של Tala",
      description:
        "‏Talac מהדר את Tala לתוכנית נייטיב, בודק תוכנית בלי לבנות אותה, וכותב לפי בקשה כל שלב בצינור.",
      headline: "מקוד מקור לתוכנית נייטיב, שלב אחר שלב.",
      lead: "‏Talac הוא המהדר של Tala: פקודה אחת בונה תוכנית נייטיב, ואת כל שלב בדרך אפשר לראות.",
      primary: { label: "שורת הפקודה", to: "/docs/command-line" },
      secondary: { label: "פלטים", to: "/docs/outputs" },
      whyHeading: "למה Talac?",
      tabs: talacTabs({
        one: {
          label: "פקודה אחת",
          caption: "קבצי מקור נכנסים, קובץ הרצה נייטיב יוצא, בשם הקלט הראשון.",
        },
        check: {
          label: "בדיקה בלי בנייה",
          caption: "‎--emit=metadata מריץ כל מאמת וכותב רשומה קצרה במקום תוכנית.",
        },
        stages: {
          label: "כל שלב",
          caption: "אפשר לכתוב כל אחד מ-Core, ‏Xpp, ‏Xmm ו-LLVM IR, וכל אחד מאומת לפני כן.",
        },
        native: {
          label: "קוד נייטיב",
          caption: "‏LLVM מבצע אופטימיזציה ל-Xmm המאומת; עם ‎-O2 לולאת gcd מדוגמה הפכה לזה.",
        },
        diagnostics: {
          label: "אבחונים",
          caption: "שגיאה מציינת קובץ, שורה, עמודה וקוד קבוע.",
        },
      }),
      nextHeading: "המשך",
      next: [
        { label: "Tala", href: "https://tala.run/" },
        { label: "Tazel", href: "https://tazel.tala.run/" },
        { label: "קוד מקור", href: `${repository}/tree/main/Talac` },
      ],
      copy: "העתקה",
      copied: "הועתק",
    },
  },
  tazel: {
    "en-US": {
      title: "Tazel — The build system of Tala",
      description:
        "Tazel builds, runs, formats and lints Tala projects from a Kotlin project file, and keeps their dependencies in a lockfile.",
      headline: "One project file. One command for each job.",
      lead: "Tazel reads a Kotlin project file and starts Talac, talafmt and talalint for you. The name joins Tala and Bazel.",
      primary: { label: "Commands", to: "/docs/commands" },
      secondary: { label: "The project file", to: "/docs/project-file" },
      whyHeading: "Why Tazel?",
      tabs: tazelTabs({
        project: {
          label: "Kotlin project file",
          caption:
            "BUILD.kts is a Kotlin script with a typed DSL, so an editor completes and checks it.",
        },
        commands: {
          label: "Everyday commands",
          caption:
            "check, build, run, fmt and lint; what follows -- goes to the program or the tool.",
        },
        targets: {
          label: "Selecting targets",
          caption: "Work on one ViPkg, one executable or a whole workspace.",
        },
        graph: {
          label: "Lockfile and graph",
          caption:
            "Dependencies are recorded in LOCK.sqlite3; lock graph shows them and who uses what.",
        },
        hints: {
          label: "Helpful errors",
          caption: "A mistyped command, flag or name gets a hint with what was probably meant.",
        },
      }),
      nextHeading: "Next",
      next: [
        { label: "Tala", href: "https://tala.run/" },
        { label: "Talac", href: "https://talac.tala.run/" },
        { label: "Source", href: tazelRepository },
      ],
      copy: "Copy",
      copied: "Copied",
    },
    "de-DE": {
      title: "Tazel — Das Build-System von Tala",
      description:
        "Tazel baut, startet, formatiert und prüft Tala-Projekte aus einer Kotlin-Projektdatei und hält ihre Abhängigkeiten in einer Lockdatei fest.",
      headline: "Eine Projektdatei. Ein Befehl für jede Aufgabe.",
      lead: "Tazel liest eine Projektdatei in Kotlin und startet Talac, talafmt und talalint für Sie. Der Name verbindet Tala und Bazel.",
      primary: { label: "Befehle", to: "/docs/commands" },
      secondary: { label: "Die Projektdatei", to: "/docs/project-file" },
      whyHeading: "Warum Tazel?",
      tabs: tazelTabs({
        project: {
          label: "Projektdatei in Kotlin",
          caption:
            "BUILD.kts ist ein Kotlin-Skript mit typisierter DSL, also ergänzt und prüft es ein Editor.",
        },
        commands: {
          label: "Alltägliche Befehle",
          caption:
            "check, build, run, fmt und lint; was nach -- folgt, geht an das Programm oder das Werkzeug.",
        },
        targets: {
          label: "Ziele auswählen",
          caption: "An einem ViPkg, einer ausführbaren Datei oder einem ganzen Workspace arbeiten.",
        },
        graph: {
          label: "Lockdatei und Graph",
          caption:
            "Abhängigkeiten stehen in LOCK.sqlite3; lock graph zeigt sie und wer was verwendet.",
        },
        hints: {
          label: "Hilfreiche Fehler",
          caption:
            "Ein vertippter Befehl, eine Option oder ein Name bekommt einen Hinweis auf das Gemeinte.",
        },
      }),
      nextHeading: "Weiter",
      next: [
        { label: "Tala", href: "https://tala.run/" },
        { label: "Talac", href: "https://talac.tala.run/" },
        { label: "Quellcode", href: tazelRepository },
      ],
      copy: "Kopieren",
      copied: "Kopiert",
    },
    "ru-RU": {
      title: "Tazel — Система сборки Tala",
      description:
        "Tazel собирает, запускает, форматирует и проверяет проекты Tala по файлу проекта на Kotlin и хранит их зависимости в lock-файле.",
      headline: "Один файл проекта. Одна команда на каждую задачу.",
      lead: "Tazel читает файл проекта на Kotlin и сам запускает Talac, talafmt и talalint. Название соединяет Tala и Bazel.",
      primary: { label: "Команды", to: "/docs/commands" },
      secondary: { label: "Файл проекта", to: "/docs/project-file" },
      whyHeading: "Почему Tazel?",
      tabs: tazelTabs({
        project: {
          label: "Файл проекта на Kotlin",
          caption:
            "BUILD.kts — скрипт Kotlin с типизированным DSL, поэтому редактор дополняет и проверяет его.",
        },
        commands: {
          label: "Повседневные команды",
          caption:
            "check, build, run, fmt и lint; всё после -- передаётся программе или инструменту.",
        },
        targets: {
          label: "Выбор целей",
          caption:
            "Работа с одним ViPkg, одним исполняемым файлом или целым рабочим пространством.",
        },
        graph: {
          label: "Lock-файл и граф",
          caption:
            "Зависимости записаны в LOCK.sqlite3; lock graph показывает их и кто что использует.",
        },
        hints: {
          label: "Понятные ошибки",
          caption:
            "Команда, параметр или имя с опечаткой получают подсказку о том, что имелось в виду.",
        },
      }),
      nextHeading: "Дальше",
      next: [
        { label: "Tala", href: "https://tala.run/" },
        { label: "Talac", href: "https://talac.tala.run/" },
        { label: "Исходный код", href: tazelRepository },
      ],
      copy: "Копировать",
      copied: "Скопировано",
    },
    "he-IL": {
      title: "Tazel — מערכת הבנייה של Tala",
      description:
        "Tazel בונה, מריץ, מעצב ובודק פרויקטים של Tala מקובץ פרויקט ב-Kotlin, ושומר את התלויות שלהם בקובץ נעילה.",
      headline: "קובץ פרויקט אחד. פקודה אחת לכל משימה.",
      lead: "Tazel קורא קובץ פרויקט ב-Kotlin ומפעיל בשבילכם את Talac, ‏talafmt ו-talalint. השם מחבר את Tala ואת Bazel.",
      primary: { label: "פקודות", to: "/docs/commands" },
      secondary: { label: "קובץ הפרויקט", to: "/docs/project-file" },
      whyHeading: "למה Tazel?",
      tabs: tazelTabs({
        project: {
          label: "קובץ פרויקט ב-Kotlin",
          caption: "‏BUILD.kts הוא סקריפט Kotlin עם DSL בעל טיפוסים, כך שעורך משלים ובודק אותו.",
        },
        commands: {
          label: "פקודות יומיומיות",
          caption: "‏check, ‏build, ‏run, ‏fmt ו-lint; מה שאחרי ‎-- עובר לתוכנית או לכלי.",
        },
        targets: {
          label: "בחירת יעדים",
          caption: "עבודה על ViPkg אחד, על קובץ הרצה אחד או על סביבת עבודה שלמה.",
        },
        graph: {
          label: "קובץ נעילה וגרף",
          caption: "התלויות נרשמות ב-LOCK.sqlite3; ‏lock graph מציג אותן ומי משתמש במה.",
        },
        hints: {
          label: "שגיאות מועילות",
          caption: "פקודה, אפשרות או שם עם שגיאת הקלדה מקבלים רמז למה שהתכוונתם.",
        },
      }),
      nextHeading: "המשך",
      next: [
        { label: "Tala", href: "https://tala.run/" },
        { label: "Talac", href: "https://talac.tala.run/" },
        { label: "קוד מקור", href: tazelRepository },
      ],
      copy: "העתקה",
      copied: "הועתק",
    },
  },
  talafmt: talafmtLanding,
  talalint: talalintLanding,
};