From c6842e5d793d23d486bb3f3e139c39e556462a8a Mon Sep 17 00:00:00 2001 From: Hatem Hosny Date: Wed, 7 Oct 2026 22:17:25 +0300 Subject: [PATCH 1/3] feat(Compilers): add Janet language support --- .../language-support/references/languages.md | 1 + README.md | 2 +- docs/docs/languages/janet-wasm.mdx | 118 +++++++++++ docs/src/components/LanguageSliders.tsx | 1 + docs/src/components/TemplateList.tsx | 1 + e2e/specs/starter.spec.ts | 48 +++++ functions/vendors/templates.js | 1 + scripts/build.js | 1 + server/php/inc/starter-templates.json | 1 + src/livecodes/UI/command-menu-actions.ts | 1 + src/livecodes/assets/templates/janet.png | Bin 0 -> 34426 bytes src/livecodes/html/language-info.html | 33 +++ .../locales/en/language-info.lokalise.json | 12 ++ .../i18n/locales/en/language-info.ts | 5 + .../i18n/locales/en/translation.lokalise.json | 4 + src/livecodes/i18n/locales/en/translation.ts | 1 + .../__tests__/lang-janet-wasm.spec.ts | 21 ++ src/livecodes/languages/janet-wasm/index.ts | 1 + .../janet-wasm/lang-janet-wasm-script.ts | 190 ++++++++++++++++++ .../languages/janet-wasm/lang-janet-wasm.ts | 15 ++ src/livecodes/languages/languages.ts | 2 + src/livecodes/models.ts | 2 + src/livecodes/templates/starter/index.ts | 2 + .../templates/starter/janet-wasm-starter.ts | 87 ++++++++ src/livecodes/vendors.ts | 2 + src/sdk/models.ts | 4 + storybook/_stories/EmbedOptions/template.ts | 1 + .../stories/EmbedOptions/template.stories.ts | 14 +- .../stories/EmbedOptions/template.stories.ts | 14 +- .../stories/EmbedOptions/template.stories.ts | 14 +- .../stories/EmbedOptions/template.stories.ts | 14 +- .../stories/EmbedOptions/template.stories.ts | 14 +- .../stories/EmbedOptions/template.stories.ts | 14 +- vendor-licenses.md | 4 + 34 files changed, 638 insertions(+), 7 deletions(-) create mode 100644 docs/docs/languages/janet-wasm.mdx create mode 100644 src/livecodes/assets/templates/janet.png create mode 100644 src/livecodes/languages/janet-wasm/__tests__/lang-janet-wasm.spec.ts create mode 100644 src/livecodes/languages/janet-wasm/index.ts create mode 100644 src/livecodes/languages/janet-wasm/lang-janet-wasm-script.ts create mode 100644 src/livecodes/languages/janet-wasm/lang-janet-wasm.ts create mode 100644 src/livecodes/templates/starter/janet-wasm-starter.ts diff --git a/.agents/skills/livecodes/language-support/references/languages.md b/.agents/skills/livecodes/language-support/references/languages.md index cf010809be..fc139398d9 100644 --- a/.agents/skills/livecodes/language-support/references/languages.md +++ b/.agents/skills/livecodes/language-support/references/languages.md @@ -151,6 +151,7 @@ Enabled via `processors` config: | Swift (Wasm) | `swift-wasm`, `swift`, `wasm.swift` | Swift WASM | | Zig (Wasm) | `zig-wasm`, `zig` | Zig WASM | | V (Wasm) | `v-wasm`, `v`, `vlang`, `wasm.v`, `vsh` | V compiler in WASM | +| Janet (Wasm) | `janet-wasm`, `janet`, `wasm.janet` | Janet interpreter (WASM) | | Tcl | `tcl` | Tcl interpreter | | WebAssembly | `wat`, `wast`, `wasm`, `webassembly` | WAT format | | Assembly (Wasm) | `assembly-wasm`, `assembly`, `asm`, `asm-wasm`, `x86`, `x86-64`, `nasm`, `wasm.asm` | Keystone + Unicorn (WASM), x86-64 assembly | diff --git a/README.md b/README.md index b5c7177fe9..df5adff082 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ A [feature-rich](https://livecodes.io/docs/features/), open-source, **client-sid [![LiveCodes: npm version](https://img.shields.io/npm/v/livecodes)](https://www.npmjs.com/package/livecodes) [![LiveCodes: npm downloads](https://img.shields.io/npm/dm/livecodes)](https://www.npmjs.com/package/livecodes) [![LiveCodes: jsdelivr downloads](https://data.jsdelivr.com/v1/package/npm/livecodes/badge?style=rounded)](https://www.jsdelivr.com/package/npm/livecodes) -[![LiveCodes: languages](https://img.shields.io/badge/languages-118-blue)](https://livecodes.io/docs/languages/) +[![LiveCodes: languages](https://img.shields.io/badge/languages-119-blue)](https://livecodes.io/docs/languages/) [![LiveCodes: docs](https://img.shields.io/badge/Documentation-575757?logo=gitbook&logoColor=white)](https://livecodes.io/docs/) [![LiveCodes: llms.txt](https://img.shields.io/badge/llms.txt-575757?logo=googledocs&logoColor=white)](https://livecodes.io/docs/llms.txt) [![LiveCodes: llms-full.txt](https://img.shields.io/badge/llms--full.txt-575757?logo=googledocs&logoColor=white)](https://livecodes.io/docs/llms-full.txt) diff --git a/docs/docs/languages/janet-wasm.mdx b/docs/docs/languages/janet-wasm.mdx new file mode 100644 index 0000000000..30a731bc7b --- /dev/null +++ b/docs/docs/languages/janet-wasm.mdx @@ -0,0 +1,118 @@ +# Janet (Wasm) + +[Janet](https://janet-lang.org/) is a lightweight, embeddable, Lisp-like (Clojure-like), dynamically +typed programming language. + +In LiveCodes, Janet runs in the browser on the Janet interpreter compiled to WebAssembly, entirely +client-side. No server is involved. + +## Usage + +Demo: + +import LiveCodes from '../../src/components/LiveCodes.tsx'; + +export const janetConfig = { + activeEditor: 'script', + script: { + language: 'janet-wasm', + content: `(print "Hello, World!")`, + }, + mode: 'simple', + editor: 'auto', + tools: { + status: 'full', + }, +}; + + + +### Standard I/O + +The program runs on the [result page](../features/result.mdx). Anything it prints is captured and +shown in the [console](../features/console.mdx). Standard input is passed by setting the +`livecodes.janetWasm.input` property in JavaScript and is read in Janet with +`(file/read stdin :all)` and friends; a program that never reads never notices it was there. + +### Communication with JavaScript + +A few helper properties and methods are available in the browser global `livecodes.janetWasm` +object: + +- `livecodes.janetWasm.input`: the standard input passed to the program. +- `livecodes.janetWasm.loaded`: a promise that resolves when the interpreter has downloaded and the + program has run once. It rejects if the runtime fails to load. Other helpers should be used after + it resolves. +- `livecodes.janetWasm.output`: the program's output, standard output and standard error in the + order the program wrote them. +- `livecodes.janetWasm.error`: the interpreter diagnostics, if the program failed. +- `livecodes.janetWasm.exitCode`: the exit code of the program (`0` ok, `1` runtime error, `2` + compile error, `4` parse error). +- `livecodes.janetWasm.run(input)`: runs the code again with new input, returning a promise that + resolves to `{ output, error, exitCode }`. + +Example: + + + +## Language Info + +### Name + +`janet-wasm` + +### Aliases / Extensions + +`janet`, `wasm.janet` + +### Editor + +`script` + +## Compiler + +The [Janet](https://janet-lang.org/) interpreter compiled to WebAssembly (built with Emscripten), packaged by +[@live-codes/janet-wasm](https://www.npmjs.com/package/@live-codes/janet-wasm). + +### Version + +Janet 1.42.1. + +## Code Formatting + +Not currently supported. + +## Live Reload + +By default, new code changes are sent to the result page for re-evaluation without a full page +reload, avoiding the need to reload the interpreter. This behavior can be disabled by adding the code +comment `# __livecodes_reload__` to the Janet code, which forces a full page reload. + +This comment can be added in the [`hiddenContent` property of the editor](../configuration/configuration-object.mdx#markup) for embedded playgrounds. + +## Example Usage + +```janet +(defn fib [n] + (if (< n 2) + n + (+ (fib (- n 1)) (fib (- n 2))))) + +(each n (range 10) + (prin (fib n) " ")) +(print) +``` + +Each run is independent: definitions from one run do not survive into the next. + +## Starter Template + +https://livecodes.io/?template=janet-wasm + +## Links + +- [Janet official website](https://janet-lang.org/) +- [Janet documentation](https://janet-lang.org/docs/index.html) +- [Learn X in Y minutes, where X=Janet](https://learnxinyminutes.com/janet/) +- [Janet for Mortals](https://janet.guide/) +- [@live-codes/janet-wasm](https://www.npmjs.com/package/@live-codes/janet-wasm) diff --git a/docs/src/components/LanguageSliders.tsx b/docs/src/components/LanguageSliders.tsx index 13dd3005a0..6116778a29 100644 --- a/docs/src/components/LanguageSliders.tsx +++ b/docs/src/components/LanguageSliders.tsx @@ -80,6 +80,7 @@ export default function Sliders() { { name: 'ocaml', title: 'OCaml' }, { name: 'nim', title: 'Nim' }, { name: 'nim-wasm', title: 'Nim (Wasm)' }, + { name: 'janet-wasm', title: 'Janet (Wasm)' }, { name: 'python', title: 'Python' }, { name: 'python-wasm', title: 'Python (Wasm)' }, { name: 'r', title: 'R' }, diff --git a/docs/src/components/TemplateList.tsx b/docs/src/components/TemplateList.tsx index 2bf4915b38..24f4ed7845 100644 --- a/docs/src/components/TemplateList.tsx +++ b/docs/src/components/TemplateList.tsx @@ -39,6 +39,7 @@ const templates = [ { name: 'ocaml', title: 'Ocaml Starter', thumbnail: 'ocaml.svg' }, { name: 'nim', title: 'Nim Starter', thumbnail: 'nim.svg' }, { name: 'nim-wasm', title: 'Nim (Wasm) Starter', thumbnail: 'nim.svg' }, + { name: 'janet-wasm', title: 'Janet (Wasm) Starter', thumbnail: 'janet.svg' }, { name: 'python', title: 'Python Starter', thumbnail: 'python.svg' }, { name: 'python-wasm', title: 'Python (Wasm) Starter', thumbnail: 'python.svg' }, { name: 'r', title: 'R Starter', thumbnail: 'r.svg' }, diff --git a/e2e/specs/starter.spec.ts b/e2e/specs/starter.spec.ts index 1cd4c3b6a5..e284e5bec9 100644 --- a/e2e/specs/starter.spec.ts +++ b/e2e/specs/starter.spec.ts @@ -534,6 +534,32 @@ test.describe('Starter Templates from UI', () => { await expect(getResult().locator('h1')).toHaveText('Hello, Nim!'); await expect(getResult().locator('text=You clicked')).toHaveText('You clicked 3 times.'); }); + test('janet-wasm Starter', async ({ page, getTestUrl }) => { + // the interpreter (~0.9 MB) is downloaded on the first run + test.slow(); + + await page.goto(getTestUrl()); + + const { app, getResult, waitForResultUpdate } = await getLoadedApp(page); + + await app.click('[aria-label="Project"]'); + await app.click('text=New'); + await app.click('text=Janet (Wasm) Starter'); + + await waitForEditorFocus(app); + await waitForResultUpdate(); + + // the counter stays disabled until the interpreter has loaded and run once + await expect(getResult().locator('#counter-button')).toBeEnabled({ timeout: 120_000 }); + + await getResult().click('text=Click me'); + await getResult().click('text=Click me'); + await getResult().click('text=Click me'); + + await expect(getResult().locator('h1')).toHaveText('Hello, Janet!'); + await expect(getResult().locator('text=You clicked')).toHaveText('You clicked 3 times.'); + }); + test('haskell Starter', async ({ page, getTestUrl }) => { test.slow(); @@ -1320,6 +1346,28 @@ test.describe('Starter Templates from URL', () => { await expect(getResult().locator('h1')).toHaveText('Hello, Nim!'); await expect(getResult().locator('text=You clicked')).toHaveText('You clicked 3 times.'); }); + test('janet-wasm Starter (in URL)', async ({ page, getTestUrl }) => { + // the interpreter (~0.9 MB) is downloaded on the first run + test.slow(); + + await page.goto(getTestUrl({ template: 'janet-wasm' })); + + const { app, getResult, waitForResultUpdate } = await getLoadedApp(page); + + await waitForEditorFocus(app); + await waitForResultUpdate(); + + // the counter stays disabled until the interpreter has loaded and run once + await expect(getResult().locator('#counter-button')).toBeEnabled({ timeout: 120_000 }); + + await getResult().click('text=Click me'); + await getResult().click('text=Click me'); + await getResult().click('text=Click me'); + + await expect(getResult().locator('h1')).toHaveText('Hello, Janet!'); + await expect(getResult().locator('text=You clicked')).toHaveText('You clicked 3 times.'); + }); + test('haskell Starter (in URL)', async ({ page, getTestUrl }) => { test.slow(); diff --git a/functions/vendors/templates.js b/functions/vendors/templates.js index 9f4eaad59f..739552b506 100644 --- a/functions/vendors/templates.js +++ b/functions/vendors/templates.js @@ -39,6 +39,7 @@ export const starterTemplates = { "ocaml": "Ocaml Starter", "nim": "Nim Starter", "nim-wasm": "Nim (Wasm) Starter", + "janet-wasm": "Janet (Wasm) Starter", "python": "Python Starter", "python-wasm": "Python (Wasm) Starter", "r": "R Starter", diff --git a/scripts/build.js b/scripts/build.js index 3764c3832f..60cf2fc2da 100644 --- a/scripts/build.js +++ b/scripts/build.js @@ -229,6 +229,7 @@ const iifeBuild = () => 'languages/cpp/lang-cpp-script.ts', 'languages/clang-wasm/lang-clang-wasm-script.ts', 'languages/nim/lang-nim-wasm-script.ts', + 'languages/janet-wasm/lang-janet-wasm-script.ts', 'languages/fortran-wasm/lang-fortran-wasm-script.ts', 'languages/d-wasm/lang-d-wasm-script.ts', 'languages/cobol-wasm/lang-cobol-wasm-script.ts', diff --git a/server/php/inc/starter-templates.json b/server/php/inc/starter-templates.json index 068ab8c5fc..bc6c15a792 100644 --- a/server/php/inc/starter-templates.json +++ b/server/php/inc/starter-templates.json @@ -39,6 +39,7 @@ "ocaml": "Ocaml Starter", "nim": "Nim Starter", "nim-wasm": "Nim (Wasm) Starter", + "janet-wasm": "Janet (Wasm) Starter", "python": "Python Starter", "python-wasm": "Python (Wasm) Starter", "r": "R Starter", diff --git a/src/livecodes/UI/command-menu-actions.ts b/src/livecodes/UI/command-menu-actions.ts index ca1c7e9bf9..544e84566e 100644 --- a/src/livecodes/UI/command-menu-actions.ts +++ b/src/livecodes/UI/command-menu-actions.ts @@ -295,6 +295,7 @@ export const getCommandMenuActions = ({ 'ocaml', 'nim', 'nim-wasm', + 'janet-wasm', 'python', 'python-wasm', 'r', diff --git a/src/livecodes/assets/templates/janet.png b/src/livecodes/assets/templates/janet.png new file mode 100644 index 0000000000000000000000000000000000000000..ee9b99235d585c903b69c9dc8db9b52b13f49424 GIT binary patch literal 34426 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 Wu_-G{d~(VF0000Imba

  • Official website
  • +
    +

    Janet (Wasm)

    +
    + The Janet interpreter + compiled to WebAssembly, running entirely in the browser. It supports standard input and real + exit codes. +
    + +

    Java

    diff --git a/src/livecodes/i18n/locales/en/language-info.lokalise.json b/src/livecodes/i18n/locales/en/language-info.lokalise.json index c0c2f4cc9f..4712dac76b 100644 --- a/src/livecodes/i18n/locales/en/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/en/language-info.lokalise.json @@ -516,6 +516,18 @@ "notes": "", "translation": "Imba" }, + "janetWasm.desc": { + "notes": "### ###\n\n\n", + "translation": "The Janet interpreter compiled to WebAssembly, running entirely in the browser. It supports standard input and real exit codes." + }, + "janetWasm.link": { + "notes": "### ###\n
  • \n\n### ###\n\n\n### ###\n
  • \n\n### ###\n\n\n### ###\n
  • \n\n### ###\n\n\n### ###\n
  • \n\n### ###\n\n\n### ###\n
  • \n\n### ###\n\n\n", + "translation": " Janet official website Janet documentation Learn X in Y minutes, where X=Janet LiveCodes Documentation Load starter template " + }, + "janetWasm.name": { + "notes": "", + "translation": "Janet (Wasm)" + }, "java.desc": { "notes": "", "translation": "JVM running in the browser using DoppioJVM." diff --git a/src/livecodes/i18n/locales/en/language-info.ts b/src/livecodes/i18n/locales/en/language-info.ts index 3d17c4a968..44e984bb7d 100644 --- a/src/livecodes/i18n/locales/en/language-info.ts +++ b/src/livecodes/i18n/locales/en/language-info.ts @@ -228,6 +228,11 @@ const languageInfo = { link: '<1><2>Official website', name: 'Imba', }, + janetWasm: { + desc: 'The <1>Janet interpreter compiled to WebAssembly, running entirely in the browser. It supports standard input and real exit codes.', + link: '<1> <2>Janet official website <3> <4>Janet documentation <5> <6>Learn X in Y minutes, where X=Janet <7> <8>LiveCodes Documentation <9> <10>Load starter template ', + name: 'Janet (Wasm)', + }, java: { desc: 'JVM running in the browser using DoppioJVM.', link: '<1> <2>Java official website <3> <4>DoppioJVM <5> <6>Learn X in Y minutes, where X=java <7> <8>LiveCodes Documentation <9> <10>Load starter template ', diff --git a/src/livecodes/i18n/locales/en/translation.lokalise.json b/src/livecodes/i18n/locales/en/translation.lokalise.json index d872d070f9..deeb09852c 100644 --- a/src/livecodes/i18n/locales/en/translation.lokalise.json +++ b/src/livecodes/i18n/locales/en/translation.lokalise.json @@ -2696,6 +2696,10 @@ "notes": "", "translation": "Imba Starter" }, + "templates.starter.janet-wasm": { + "notes": "", + "translation": "Janet (Wasm) Starter" + }, "templates.starter.java": { "notes": "", "translation": "Java Starter" diff --git a/src/livecodes/i18n/locales/en/translation.ts b/src/livecodes/i18n/locales/en/translation.ts index 9c5f207032..890397c767 100644 --- a/src/livecodes/i18n/locales/en/translation.ts +++ b/src/livecodes/i18n/locales/en/translation.ts @@ -1020,6 +1020,7 @@ const translation = { 'haskell-wasm': 'Haskell (Wasm) Starter', heading: 'Starter Templates', imba: 'Imba Starter', + 'janet-wasm': 'Janet (Wasm) Starter', java: 'Java Starter', javascript: 'JavaScript Starter', jest: 'Jest Starter', diff --git a/src/livecodes/languages/janet-wasm/__tests__/lang-janet-wasm.spec.ts b/src/livecodes/languages/janet-wasm/__tests__/lang-janet-wasm.spec.ts new file mode 100644 index 0000000000..57d3b3872e --- /dev/null +++ b/src/livecodes/languages/janet-wasm/__tests__/lang-janet-wasm.spec.ts @@ -0,0 +1,21 @@ +import { janetWasm } from '../lang-janet-wasm'; + +describe('Janet (Wasm) language spec', () => { + test('is registered as janet-wasm, with the wasm runner script', () => { + expect(janetWasm.name).toBe('janet-wasm'); + expect(janetWasm.title).toBe('Janet (Wasm)'); + expect(janetWasm.compiler).toMatchObject({ + scriptType: 'text/janet-wasm', + compiledCodeLanguage: 'janet-wasm', + liveReload: true, + }); + }); + + test('accepts the Janet extensions', () => { + expect(janetWasm.extensions).toEqual(expect.arrayContaining(['janet', 'wasm.janet'])); + }); + + test('uses the script editor', () => { + expect(janetWasm.editor).toBe('script'); + }); +}); diff --git a/src/livecodes/languages/janet-wasm/index.ts b/src/livecodes/languages/janet-wasm/index.ts new file mode 100644 index 0000000000..375dce7a6a --- /dev/null +++ b/src/livecodes/languages/janet-wasm/index.ts @@ -0,0 +1 @@ +export * from './lang-janet-wasm'; diff --git a/src/livecodes/languages/janet-wasm/lang-janet-wasm-script.ts b/src/livecodes/languages/janet-wasm/lang-janet-wasm-script.ts new file mode 100644 index 0000000000..6d5de0f114 --- /dev/null +++ b/src/livecodes/languages/janet-wasm/lang-janet-wasm-script.ts @@ -0,0 +1,190 @@ +/* eslint-disable no-console */ +import { janetWasmBaseUrl } from '../../vendors'; +import { createLoadingReporter, runCompiler } from '../wasm-runtime'; +import { createWorkerRunner, type Runner } from '../worker-runner'; + +// Janet runs on the Janet interpreter compiled to WebAssembly (@live-codes/janet-wasm), loaded from +// its CDN build. The IIFE defines `self.janetWasm`, which the worker reaches with importScripts. +// +// The interpreter is a single instance - one stdout, one stdin, one environment - so it runs in a +// worker of its own. A Janet program that never returns cannot be interrupted, so Stop discards the +// worker rather than trying to stop the run inside it. +const SCRIPT_TYPE = 'text/janet-wasm'; + +interface RunResult { + input: string; + output: string | null; + error: string | null; + exitCode: number | null; +} + +interface JanetWasmApi { + ready: boolean; + failed: boolean; + input: string; + output: string | null; + error: string | null; + exitCode: number | null; + loaded: Promise; + init: Promise | null; + runner: Runner | null; + run: (input?: string) => Promise; +} + +declare const window: Window & { + livecodes: Record; +}; + +const getWorkerSrc = () => ` +importScripts(${JSON.stringify(janetWasmBaseUrl + 'dist/janet-wasm.global.js')}); + +let interpreter = null; + +const getInterpreter = () => { + interpreter = + interpreter || + self.janetWasm.createInterpreter({ + // Absolute, because inside the worker a relative URL would resolve against the worker's own + // URL rather than the page. The interpreter loads its glue and wasm from here. + baseUrl: ${JSON.stringify(janetWasmBaseUrl + 'assets/janet/')}, + }); + return interpreter; +}; + +addEventListener('message', async (event) => { + const { id, code, input } = event.data; + try { + const result = await (await getInterpreter()).run(code, input); + postMessage({ + id, + result: { + output: result.output, + // The interpreter's diagnostics as a list of lines, empty when the program ran. + errors: result.errors || [], + exitCode: result.exitCode, + }, + }); + } catch (error) { + postMessage({ id, error: String((error && error.message) || error) }); + } +}); + +getInterpreter().then( + () => postMessage({ type: 'ready' }), + (error) => postMessage({ type: 'error', message: String((error && error.message) || error) }), +); +`; + +// A single run is normally quick; a long timeout guards against hangs (e.g. an infinite loop in the +// user program) by killing and respawning the worker. +const RUN_TIMEOUT_MS = 120000; + +/** + * Reads the program out of the result page. + * + * The result page writes the code inline as the `innerHTML` of a ` +`.trimStart(), + }, + style: { + language: 'css', + content: ` +.container, +.container button { + text-align: center; + font: 1em sans-serif; +} +.logo { + width: 150px; +} +`.trimStart(), + }, + script: { + language: 'janet-wasm', + content: ` +# Read the counter from standard input; a blank or missing value counts as zero. +(def raw (string/trim (or (file/read stdin :all) ""))) +(def n (or (scan-number raw) 0)) +(print "Janet") +(print (inc n)) +`.trimStart(), + }, +}; diff --git a/src/livecodes/vendors.ts b/src/livecodes/vendors.ts index 50d2057a63..89d5af19cb 100644 --- a/src/livecodes/vendors.ts +++ b/src/livecodes/vendors.ts @@ -313,6 +313,8 @@ export const jsUntarUrl = /* @__PURE__ */ getUrl('js-untar@2.0.0/build/dist/unta export const jsZipUrl = /* @__PURE__ */ getUrl('jszip@3.10.1/dist/jszip.js'); +export const janetWasmBaseUrl = /* @__PURE__ */ getUrl('@live-codes/janet-wasm@0.1.0/'); + export const juliaWasmBaseUrl = /* @__PURE__ */ getUrl('@chriskoch/julia-wasm@1.0.4'); export const keystoneJsUrl = /* @__PURE__ */ getUrl( diff --git a/src/sdk/models.ts b/src/sdk/models.ts index 139b6fb96c..73b6951463 100644 --- a/src/sdk/models.ts +++ b/src/sdk/models.ts @@ -321,6 +321,9 @@ export type Language = | 'wasm.nim' | 'nim-js' | 'js.nim' + | 'janet' + | 'janet-wasm' + | 'wasm.janet' | 'tcl' | 'wat' | 'wast' @@ -497,6 +500,7 @@ export type TemplateName = | 'ocaml' | 'nim' | 'nim-wasm' + | 'janet-wasm' | 'python' | 'python-wasm' | 'r' diff --git a/storybook/_stories/EmbedOptions/template.ts b/storybook/_stories/EmbedOptions/template.ts index 6c61101a0f..d515bfb6a4 100644 --- a/storybook/_stories/EmbedOptions/template.ts +++ b/storybook/_stories/EmbedOptions/template.ts @@ -41,6 +41,7 @@ const storyDef: StoryDef = { Ocaml: { props: { template: 'ocaml' } }, Nim: { props: { template: 'nim' } }, NimWasm: { props: { template: 'nim-wasm' } }, + JanetWasm: { props: { template: 'janet-wasm' } }, Python: { props: { template: 'python' } }, PythonWasm: { props: { template: 'python-wasm' } }, R: { props: { template: 'r' } }, diff --git a/storybook/preact/stories/EmbedOptions/template.stories.ts b/storybook/preact/stories/EmbedOptions/template.stories.ts index 51eecb58d4..529d6d0fca 100644 --- a/storybook/preact/stories/EmbedOptions/template.stories.ts +++ b/storybook/preact/stories/EmbedOptions/template.stories.ts @@ -52,6 +52,9 @@ export const ReScript = livecodesStory({ template: 'rescript' }); ReScript.storyName = 'ReScript'; export const Reason = livecodesStory({ template: 'reason' }); export const Ocaml = livecodesStory({ template: 'ocaml' }); +export const Nim = livecodesStory({ template: 'nim' }); +export const NimWasm = livecodesStory({ template: 'nim-wasm' }); +export const JanetWasm = livecodesStory({ template: 'janet-wasm' }); export const Python = livecodesStory({ template: 'python' }); export const PythonWasm = livecodesStory({ template: 'python-wasm' }); export const R = livecodesStory({ template: 'r' }); @@ -65,14 +68,19 @@ export const Cpp = livecodesStory({ template: 'cpp' }); export const CWasm = livecodesStory({ template: 'c-wasm' }); export const CppWasm = livecodesStory({ template: 'cpp-wasm' }); export const ObjcWasm = livecodesStory({ template: 'objc-wasm' }); -export const FortranWasm = livecodesStory({ template: 'fortran-wasm' }); export const DWasm = livecodesStory({ template: 'd-wasm' }); +export const CobolWasm = livecodesStory({ template: 'cobol-wasm' }); +CobolWasm.storyName = 'COBOL (Wasm)'; +export const FortranWasm = livecodesStory({ template: 'fortran-wasm' }); +FortranWasm.storyName = 'Fortran (Wasm)'; export const VWasm = livecodesStory({ template: 'v-wasm' }); export const RustWasm = livecodesStory({ template: 'rust-wasm' }); export const SwiftWasm = livecodesStory({ template: 'swift-wasm' }); export const ZigWasm = livecodesStory({ template: 'zig-wasm' }); export const Java = livecodesStory({ template: 'java' }); export const CSharpWasm = livecodesStory({ template: 'csharp-wasm' }); +export const BlazorWasm = livecodesStory({ template: 'blazor-wasm' }); +BlazorWasm.storyName = 'Blazor (Wasm)'; export const VbWasm = livecodesStory({ template: 'vb-wasm' }); export const FSharp = livecodesStory({ template: 'fsharp' }); export const FSharpWasm = livecodesStory({ template: 'fsharp-wasm' }); @@ -91,10 +99,14 @@ export const Teal = livecodesStory({ template: 'teal' }); export const Fennel = livecodesStory({ template: 'fennel' }); export const Julia = livecodesStory({ template: 'julia' }); export const Tcl = livecodesStory({ template: 'tcl' }); +export const AdaWasm = livecodesStory({ template: 'ada-wasm' }); +export const Pascal = livecodesStory({ template: 'pascal' }); export const AssemblyScript = livecodesStory({ template: 'assemblyscript' }); AssemblyScript.storyName = 'AssemblyScript'; export const WebAssemblyText = livecodesStory({ template: 'wat' }); WebAssemblyText.storyName = 'WebAssembly Text'; +export const AssemblyWasm = livecodesStory({ template: 'assembly-wasm' }); +AssemblyWasm.storyName = 'Assembly (Wasm)'; export const SQL = livecodesStory({ template: 'sql' }); export const PostgreSQL = livecodesStory({ template: 'postgresql' }); export const Prolog = livecodesStory({ template: 'prolog' }); diff --git a/storybook/react/stories/EmbedOptions/template.stories.ts b/storybook/react/stories/EmbedOptions/template.stories.ts index 51eecb58d4..529d6d0fca 100644 --- a/storybook/react/stories/EmbedOptions/template.stories.ts +++ b/storybook/react/stories/EmbedOptions/template.stories.ts @@ -52,6 +52,9 @@ export const ReScript = livecodesStory({ template: 'rescript' }); ReScript.storyName = 'ReScript'; export const Reason = livecodesStory({ template: 'reason' }); export const Ocaml = livecodesStory({ template: 'ocaml' }); +export const Nim = livecodesStory({ template: 'nim' }); +export const NimWasm = livecodesStory({ template: 'nim-wasm' }); +export const JanetWasm = livecodesStory({ template: 'janet-wasm' }); export const Python = livecodesStory({ template: 'python' }); export const PythonWasm = livecodesStory({ template: 'python-wasm' }); export const R = livecodesStory({ template: 'r' }); @@ -65,14 +68,19 @@ export const Cpp = livecodesStory({ template: 'cpp' }); export const CWasm = livecodesStory({ template: 'c-wasm' }); export const CppWasm = livecodesStory({ template: 'cpp-wasm' }); export const ObjcWasm = livecodesStory({ template: 'objc-wasm' }); -export const FortranWasm = livecodesStory({ template: 'fortran-wasm' }); export const DWasm = livecodesStory({ template: 'd-wasm' }); +export const CobolWasm = livecodesStory({ template: 'cobol-wasm' }); +CobolWasm.storyName = 'COBOL (Wasm)'; +export const FortranWasm = livecodesStory({ template: 'fortran-wasm' }); +FortranWasm.storyName = 'Fortran (Wasm)'; export const VWasm = livecodesStory({ template: 'v-wasm' }); export const RustWasm = livecodesStory({ template: 'rust-wasm' }); export const SwiftWasm = livecodesStory({ template: 'swift-wasm' }); export const ZigWasm = livecodesStory({ template: 'zig-wasm' }); export const Java = livecodesStory({ template: 'java' }); export const CSharpWasm = livecodesStory({ template: 'csharp-wasm' }); +export const BlazorWasm = livecodesStory({ template: 'blazor-wasm' }); +BlazorWasm.storyName = 'Blazor (Wasm)'; export const VbWasm = livecodesStory({ template: 'vb-wasm' }); export const FSharp = livecodesStory({ template: 'fsharp' }); export const FSharpWasm = livecodesStory({ template: 'fsharp-wasm' }); @@ -91,10 +99,14 @@ export const Teal = livecodesStory({ template: 'teal' }); export const Fennel = livecodesStory({ template: 'fennel' }); export const Julia = livecodesStory({ template: 'julia' }); export const Tcl = livecodesStory({ template: 'tcl' }); +export const AdaWasm = livecodesStory({ template: 'ada-wasm' }); +export const Pascal = livecodesStory({ template: 'pascal' }); export const AssemblyScript = livecodesStory({ template: 'assemblyscript' }); AssemblyScript.storyName = 'AssemblyScript'; export const WebAssemblyText = livecodesStory({ template: 'wat' }); WebAssemblyText.storyName = 'WebAssembly Text'; +export const AssemblyWasm = livecodesStory({ template: 'assembly-wasm' }); +AssemblyWasm.storyName = 'Assembly (Wasm)'; export const SQL = livecodesStory({ template: 'sql' }); export const PostgreSQL = livecodesStory({ template: 'postgresql' }); export const Prolog = livecodesStory({ template: 'prolog' }); diff --git a/storybook/solid/stories/EmbedOptions/template.stories.ts b/storybook/solid/stories/EmbedOptions/template.stories.ts index 51eecb58d4..529d6d0fca 100644 --- a/storybook/solid/stories/EmbedOptions/template.stories.ts +++ b/storybook/solid/stories/EmbedOptions/template.stories.ts @@ -52,6 +52,9 @@ export const ReScript = livecodesStory({ template: 'rescript' }); ReScript.storyName = 'ReScript'; export const Reason = livecodesStory({ template: 'reason' }); export const Ocaml = livecodesStory({ template: 'ocaml' }); +export const Nim = livecodesStory({ template: 'nim' }); +export const NimWasm = livecodesStory({ template: 'nim-wasm' }); +export const JanetWasm = livecodesStory({ template: 'janet-wasm' }); export const Python = livecodesStory({ template: 'python' }); export const PythonWasm = livecodesStory({ template: 'python-wasm' }); export const R = livecodesStory({ template: 'r' }); @@ -65,14 +68,19 @@ export const Cpp = livecodesStory({ template: 'cpp' }); export const CWasm = livecodesStory({ template: 'c-wasm' }); export const CppWasm = livecodesStory({ template: 'cpp-wasm' }); export const ObjcWasm = livecodesStory({ template: 'objc-wasm' }); -export const FortranWasm = livecodesStory({ template: 'fortran-wasm' }); export const DWasm = livecodesStory({ template: 'd-wasm' }); +export const CobolWasm = livecodesStory({ template: 'cobol-wasm' }); +CobolWasm.storyName = 'COBOL (Wasm)'; +export const FortranWasm = livecodesStory({ template: 'fortran-wasm' }); +FortranWasm.storyName = 'Fortran (Wasm)'; export const VWasm = livecodesStory({ template: 'v-wasm' }); export const RustWasm = livecodesStory({ template: 'rust-wasm' }); export const SwiftWasm = livecodesStory({ template: 'swift-wasm' }); export const ZigWasm = livecodesStory({ template: 'zig-wasm' }); export const Java = livecodesStory({ template: 'java' }); export const CSharpWasm = livecodesStory({ template: 'csharp-wasm' }); +export const BlazorWasm = livecodesStory({ template: 'blazor-wasm' }); +BlazorWasm.storyName = 'Blazor (Wasm)'; export const VbWasm = livecodesStory({ template: 'vb-wasm' }); export const FSharp = livecodesStory({ template: 'fsharp' }); export const FSharpWasm = livecodesStory({ template: 'fsharp-wasm' }); @@ -91,10 +99,14 @@ export const Teal = livecodesStory({ template: 'teal' }); export const Fennel = livecodesStory({ template: 'fennel' }); export const Julia = livecodesStory({ template: 'julia' }); export const Tcl = livecodesStory({ template: 'tcl' }); +export const AdaWasm = livecodesStory({ template: 'ada-wasm' }); +export const Pascal = livecodesStory({ template: 'pascal' }); export const AssemblyScript = livecodesStory({ template: 'assemblyscript' }); AssemblyScript.storyName = 'AssemblyScript'; export const WebAssemblyText = livecodesStory({ template: 'wat' }); WebAssemblyText.storyName = 'WebAssembly Text'; +export const AssemblyWasm = livecodesStory({ template: 'assembly-wasm' }); +AssemblyWasm.storyName = 'Assembly (Wasm)'; export const SQL = livecodesStory({ template: 'sql' }); export const PostgreSQL = livecodesStory({ template: 'postgresql' }); export const Prolog = livecodesStory({ template: 'prolog' }); diff --git a/storybook/svelte/stories/EmbedOptions/template.stories.ts b/storybook/svelte/stories/EmbedOptions/template.stories.ts index 51eecb58d4..529d6d0fca 100644 --- a/storybook/svelte/stories/EmbedOptions/template.stories.ts +++ b/storybook/svelte/stories/EmbedOptions/template.stories.ts @@ -52,6 +52,9 @@ export const ReScript = livecodesStory({ template: 'rescript' }); ReScript.storyName = 'ReScript'; export const Reason = livecodesStory({ template: 'reason' }); export const Ocaml = livecodesStory({ template: 'ocaml' }); +export const Nim = livecodesStory({ template: 'nim' }); +export const NimWasm = livecodesStory({ template: 'nim-wasm' }); +export const JanetWasm = livecodesStory({ template: 'janet-wasm' }); export const Python = livecodesStory({ template: 'python' }); export const PythonWasm = livecodesStory({ template: 'python-wasm' }); export const R = livecodesStory({ template: 'r' }); @@ -65,14 +68,19 @@ export const Cpp = livecodesStory({ template: 'cpp' }); export const CWasm = livecodesStory({ template: 'c-wasm' }); export const CppWasm = livecodesStory({ template: 'cpp-wasm' }); export const ObjcWasm = livecodesStory({ template: 'objc-wasm' }); -export const FortranWasm = livecodesStory({ template: 'fortran-wasm' }); export const DWasm = livecodesStory({ template: 'd-wasm' }); +export const CobolWasm = livecodesStory({ template: 'cobol-wasm' }); +CobolWasm.storyName = 'COBOL (Wasm)'; +export const FortranWasm = livecodesStory({ template: 'fortran-wasm' }); +FortranWasm.storyName = 'Fortran (Wasm)'; export const VWasm = livecodesStory({ template: 'v-wasm' }); export const RustWasm = livecodesStory({ template: 'rust-wasm' }); export const SwiftWasm = livecodesStory({ template: 'swift-wasm' }); export const ZigWasm = livecodesStory({ template: 'zig-wasm' }); export const Java = livecodesStory({ template: 'java' }); export const CSharpWasm = livecodesStory({ template: 'csharp-wasm' }); +export const BlazorWasm = livecodesStory({ template: 'blazor-wasm' }); +BlazorWasm.storyName = 'Blazor (Wasm)'; export const VbWasm = livecodesStory({ template: 'vb-wasm' }); export const FSharp = livecodesStory({ template: 'fsharp' }); export const FSharpWasm = livecodesStory({ template: 'fsharp-wasm' }); @@ -91,10 +99,14 @@ export const Teal = livecodesStory({ template: 'teal' }); export const Fennel = livecodesStory({ template: 'fennel' }); export const Julia = livecodesStory({ template: 'julia' }); export const Tcl = livecodesStory({ template: 'tcl' }); +export const AdaWasm = livecodesStory({ template: 'ada-wasm' }); +export const Pascal = livecodesStory({ template: 'pascal' }); export const AssemblyScript = livecodesStory({ template: 'assemblyscript' }); AssemblyScript.storyName = 'AssemblyScript'; export const WebAssemblyText = livecodesStory({ template: 'wat' }); WebAssemblyText.storyName = 'WebAssembly Text'; +export const AssemblyWasm = livecodesStory({ template: 'assembly-wasm' }); +AssemblyWasm.storyName = 'Assembly (Wasm)'; export const SQL = livecodesStory({ template: 'sql' }); export const PostgreSQL = livecodesStory({ template: 'postgresql' }); export const Prolog = livecodesStory({ template: 'prolog' }); diff --git a/storybook/vue/stories/EmbedOptions/template.stories.ts b/storybook/vue/stories/EmbedOptions/template.stories.ts index 51eecb58d4..529d6d0fca 100644 --- a/storybook/vue/stories/EmbedOptions/template.stories.ts +++ b/storybook/vue/stories/EmbedOptions/template.stories.ts @@ -52,6 +52,9 @@ export const ReScript = livecodesStory({ template: 'rescript' }); ReScript.storyName = 'ReScript'; export const Reason = livecodesStory({ template: 'reason' }); export const Ocaml = livecodesStory({ template: 'ocaml' }); +export const Nim = livecodesStory({ template: 'nim' }); +export const NimWasm = livecodesStory({ template: 'nim-wasm' }); +export const JanetWasm = livecodesStory({ template: 'janet-wasm' }); export const Python = livecodesStory({ template: 'python' }); export const PythonWasm = livecodesStory({ template: 'python-wasm' }); export const R = livecodesStory({ template: 'r' }); @@ -65,14 +68,19 @@ export const Cpp = livecodesStory({ template: 'cpp' }); export const CWasm = livecodesStory({ template: 'c-wasm' }); export const CppWasm = livecodesStory({ template: 'cpp-wasm' }); export const ObjcWasm = livecodesStory({ template: 'objc-wasm' }); -export const FortranWasm = livecodesStory({ template: 'fortran-wasm' }); export const DWasm = livecodesStory({ template: 'd-wasm' }); +export const CobolWasm = livecodesStory({ template: 'cobol-wasm' }); +CobolWasm.storyName = 'COBOL (Wasm)'; +export const FortranWasm = livecodesStory({ template: 'fortran-wasm' }); +FortranWasm.storyName = 'Fortran (Wasm)'; export const VWasm = livecodesStory({ template: 'v-wasm' }); export const RustWasm = livecodesStory({ template: 'rust-wasm' }); export const SwiftWasm = livecodesStory({ template: 'swift-wasm' }); export const ZigWasm = livecodesStory({ template: 'zig-wasm' }); export const Java = livecodesStory({ template: 'java' }); export const CSharpWasm = livecodesStory({ template: 'csharp-wasm' }); +export const BlazorWasm = livecodesStory({ template: 'blazor-wasm' }); +BlazorWasm.storyName = 'Blazor (Wasm)'; export const VbWasm = livecodesStory({ template: 'vb-wasm' }); export const FSharp = livecodesStory({ template: 'fsharp' }); export const FSharpWasm = livecodesStory({ template: 'fsharp-wasm' }); @@ -91,10 +99,14 @@ export const Teal = livecodesStory({ template: 'teal' }); export const Fennel = livecodesStory({ template: 'fennel' }); export const Julia = livecodesStory({ template: 'julia' }); export const Tcl = livecodesStory({ template: 'tcl' }); +export const AdaWasm = livecodesStory({ template: 'ada-wasm' }); +export const Pascal = livecodesStory({ template: 'pascal' }); export const AssemblyScript = livecodesStory({ template: 'assemblyscript' }); AssemblyScript.storyName = 'AssemblyScript'; export const WebAssemblyText = livecodesStory({ template: 'wat' }); WebAssemblyText.storyName = 'WebAssembly Text'; +export const AssemblyWasm = livecodesStory({ template: 'assembly-wasm' }); +AssemblyWasm.storyName = 'Assembly (Wasm)'; export const SQL = livecodesStory({ template: 'sql' }); export const PostgreSQL = livecodesStory({ template: 'postgresql' }); export const Prolog = livecodesStory({ template: 'prolog' }); diff --git a/storybook/web-components/stories/EmbedOptions/template.stories.ts b/storybook/web-components/stories/EmbedOptions/template.stories.ts index 51eecb58d4..529d6d0fca 100644 --- a/storybook/web-components/stories/EmbedOptions/template.stories.ts +++ b/storybook/web-components/stories/EmbedOptions/template.stories.ts @@ -52,6 +52,9 @@ export const ReScript = livecodesStory({ template: 'rescript' }); ReScript.storyName = 'ReScript'; export const Reason = livecodesStory({ template: 'reason' }); export const Ocaml = livecodesStory({ template: 'ocaml' }); +export const Nim = livecodesStory({ template: 'nim' }); +export const NimWasm = livecodesStory({ template: 'nim-wasm' }); +export const JanetWasm = livecodesStory({ template: 'janet-wasm' }); export const Python = livecodesStory({ template: 'python' }); export const PythonWasm = livecodesStory({ template: 'python-wasm' }); export const R = livecodesStory({ template: 'r' }); @@ -65,14 +68,19 @@ export const Cpp = livecodesStory({ template: 'cpp' }); export const CWasm = livecodesStory({ template: 'c-wasm' }); export const CppWasm = livecodesStory({ template: 'cpp-wasm' }); export const ObjcWasm = livecodesStory({ template: 'objc-wasm' }); -export const FortranWasm = livecodesStory({ template: 'fortran-wasm' }); export const DWasm = livecodesStory({ template: 'd-wasm' }); +export const CobolWasm = livecodesStory({ template: 'cobol-wasm' }); +CobolWasm.storyName = 'COBOL (Wasm)'; +export const FortranWasm = livecodesStory({ template: 'fortran-wasm' }); +FortranWasm.storyName = 'Fortran (Wasm)'; export const VWasm = livecodesStory({ template: 'v-wasm' }); export const RustWasm = livecodesStory({ template: 'rust-wasm' }); export const SwiftWasm = livecodesStory({ template: 'swift-wasm' }); export const ZigWasm = livecodesStory({ template: 'zig-wasm' }); export const Java = livecodesStory({ template: 'java' }); export const CSharpWasm = livecodesStory({ template: 'csharp-wasm' }); +export const BlazorWasm = livecodesStory({ template: 'blazor-wasm' }); +BlazorWasm.storyName = 'Blazor (Wasm)'; export const VbWasm = livecodesStory({ template: 'vb-wasm' }); export const FSharp = livecodesStory({ template: 'fsharp' }); export const FSharpWasm = livecodesStory({ template: 'fsharp-wasm' }); @@ -91,10 +99,14 @@ export const Teal = livecodesStory({ template: 'teal' }); export const Fennel = livecodesStory({ template: 'fennel' }); export const Julia = livecodesStory({ template: 'julia' }); export const Tcl = livecodesStory({ template: 'tcl' }); +export const AdaWasm = livecodesStory({ template: 'ada-wasm' }); +export const Pascal = livecodesStory({ template: 'pascal' }); export const AssemblyScript = livecodesStory({ template: 'assemblyscript' }); AssemblyScript.storyName = 'AssemblyScript'; export const WebAssemblyText = livecodesStory({ template: 'wat' }); WebAssemblyText.storyName = 'WebAssembly Text'; +export const AssemblyWasm = livecodesStory({ template: 'assembly-wasm' }); +AssemblyWasm.storyName = 'Assembly (Wasm)'; export const SQL = livecodesStory({ template: 'sql' }); export const PostgreSQL = livecodesStory({ template: 'postgresql' }); export const Prolog = livecodesStory({ template: 'prolog' }); diff --git a/vendor-licenses.md b/vendor-licenses.md index c6d56d4214..0cc46b5d6d 100644 --- a/vendor-licenses.md +++ b/vendor-licenses.md @@ -362,6 +362,10 @@ LFortran (Wasm): [BSD 3-Clause License](https://github.com/lfortran/lfortran/blo V (Wasm): [MIT License](https://github.com/vlang/v/blob/master/LICENSE) (the V compiler and its standard library, compiled to WebAssembly by @live-codes/v-wasm; the Clang toolchain it links through is covered by LLVM / LLD below) +@live-codes/janet-wasm: [MIT License](https://github.com/live-codes/browser-janet/blob/main/packages/janet-wasm/LICENSE) + +Janet (Wasm): [MIT License](https://github.com/janet-lang/janet/blob/master/LICENSE) (the Janet interpreter, compiled to WebAssembly by @live-codes/janet-wasm) + LLVM / LLD (Wasm): [Apache License 2.0 with LLVM-exception](https://github.com/llvm/llvm-project/blob/main/LICENSE.TXT) @wasm-fmt/clang-format: [MIT License](https://github.com/wasm-fmt/clang-format/blob/6a84f2d980e5ff4145bd9178a49cd5146e48df78/LICENSE) From eaa6b04f29625a6038435d358e20be94861ce527 Mon Sep 17 00:00:00 2001 From: Hatem Hosny Date: Wed, 7 Oct 2026 22:51:28 +0300 Subject: [PATCH 2/3] janet editor support --- docs/src/components/TemplateList.tsx | 2 +- .../languages/janet-wasm/lang-janet-wasm.ts | 12 ++++++++++++ src/livecodes/vendors.ts | 2 +- 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/docs/src/components/TemplateList.tsx b/docs/src/components/TemplateList.tsx index 24f4ed7845..9b7916baf7 100644 --- a/docs/src/components/TemplateList.tsx +++ b/docs/src/components/TemplateList.tsx @@ -39,7 +39,7 @@ const templates = [ { name: 'ocaml', title: 'Ocaml Starter', thumbnail: 'ocaml.svg' }, { name: 'nim', title: 'Nim Starter', thumbnail: 'nim.svg' }, { name: 'nim-wasm', title: 'Nim (Wasm) Starter', thumbnail: 'nim.svg' }, - { name: 'janet-wasm', title: 'Janet (Wasm) Starter', thumbnail: 'janet.svg' }, + { name: 'janet-wasm', title: 'Janet (Wasm) Starter', thumbnail: 'janet.png' }, { name: 'python', title: 'Python Starter', thumbnail: 'python.svg' }, { name: 'python-wasm', title: 'Python (Wasm) Starter', thumbnail: 'python.svg' }, { name: 'r', title: 'R Starter', thumbnail: 'r.svg' }, diff --git a/src/livecodes/languages/janet-wasm/lang-janet-wasm.ts b/src/livecodes/languages/janet-wasm/lang-janet-wasm.ts index 4c90ea750f..963e1d8e54 100644 --- a/src/livecodes/languages/janet-wasm/lang-janet-wasm.ts +++ b/src/livecodes/languages/janet-wasm/lang-janet-wasm.ts @@ -1,4 +1,5 @@ import type { LanguageSpecs } from '../../models'; +import { codeMirrorBaseUrl, monacoLanguagesBaseUrl } from '../../vendors'; export const janetWasm: LanguageSpecs = { name: 'janet-wasm', @@ -12,4 +13,15 @@ export const janetWasm: LanguageSpecs = { }, extensions: ['janet', 'wasm.janet'], editor: 'script', + editorSupport: { + monaco: { + languageSupport: monacoLanguagesBaseUrl + 'janet.js', + language: 'janet', + }, + codemirror: { + languageSupport: async () => + (await import(codeMirrorBaseUrl + 'codemirror-lang-janet.js')).janet(), + }, + codejar: { language: 'clojure' }, + }, }; diff --git a/src/livecodes/vendors.ts b/src/livecodes/vendors.ts index 89d5af19cb..3d1a8a63c2 100644 --- a/src/livecodes/vendors.ts +++ b/src/livecodes/vendors.ts @@ -108,7 +108,7 @@ export const codeiumProviderUrl = /* @__PURE__ */ getUrl( '@live-codes/monaco-codeium-provider@0.2.2/dist/index.js', ); -export const codeMirrorBaseUrl = /* @__PURE__ */ getUrl('@live-codes/codemirror@0.4.4/build/'); +export const codeMirrorBaseUrl = /* @__PURE__ */ getUrl('@live-codes/codemirror@0.4.5/build/'); export const codemirrorMinimapUrl = /* @__PURE__ */ getUrl( '@replit/codemirror-minimap@0.5.2/dist/index.js', From ad002a8a7ca38f281f7ac878ac590a88616b2370 Mon Sep 17 00:00:00 2001 From: "pullfrog[bot]" <226033991+pullfrog[bot]@users.noreply.github.com> Date: Wed, 7 Oct 2026 20:03:39 +0000 Subject: [PATCH 3/3] feat(i18n): add Janet (Wasm) translations for all locales --- docs/docs/languages/janet-wasm.mdx | 5 +++-- .../i18n/locales/ar/language-info.lokalise.json | 9 +++++++++ src/livecodes/i18n/locales/ar/language-info.ts | 5 +++++ src/livecodes/i18n/locales/ar/translation.lokalise.json | 3 +++ src/livecodes/i18n/locales/ar/translation.ts | 1 + .../i18n/locales/bn/language-info.lokalise.json | 9 +++++++++ src/livecodes/i18n/locales/bn/language-info.ts | 5 +++++ src/livecodes/i18n/locales/bn/translation.lokalise.json | 3 +++ src/livecodes/i18n/locales/bn/translation.ts | 1 + .../i18n/locales/de/language-info.lokalise.json | 9 +++++++++ src/livecodes/i18n/locales/de/language-info.ts | 5 +++++ src/livecodes/i18n/locales/de/translation.lokalise.json | 3 +++ src/livecodes/i18n/locales/de/translation.ts | 1 + .../i18n/locales/es/language-info.lokalise.json | 9 +++++++++ src/livecodes/i18n/locales/es/language-info.ts | 5 +++++ src/livecodes/i18n/locales/es/translation.lokalise.json | 3 +++ src/livecodes/i18n/locales/es/translation.ts | 1 + .../i18n/locales/fa/language-info.lokalise.json | 9 +++++++++ src/livecodes/i18n/locales/fa/language-info.ts | 5 +++++ src/livecodes/i18n/locales/fa/translation.lokalise.json | 3 +++ src/livecodes/i18n/locales/fa/translation.ts | 1 + .../i18n/locales/fr/language-info.lokalise.json | 9 +++++++++ src/livecodes/i18n/locales/fr/language-info.ts | 5 +++++ src/livecodes/i18n/locales/fr/translation.lokalise.json | 3 +++ src/livecodes/i18n/locales/fr/translation.ts | 1 + .../i18n/locales/hi/language-info.lokalise.json | 9 +++++++++ src/livecodes/i18n/locales/hi/language-info.ts | 5 +++++ src/livecodes/i18n/locales/hi/translation.lokalise.json | 3 +++ src/livecodes/i18n/locales/hi/translation.ts | 1 + .../i18n/locales/hu/language-info.lokalise.json | 9 +++++++++ src/livecodes/i18n/locales/hu/language-info.ts | 5 +++++ src/livecodes/i18n/locales/hu/translation.lokalise.json | 3 +++ src/livecodes/i18n/locales/hu/translation.ts | 1 + .../i18n/locales/id/language-info.lokalise.json | 9 +++++++++ src/livecodes/i18n/locales/id/language-info.ts | 5 +++++ src/livecodes/i18n/locales/id/translation.lokalise.json | 3 +++ src/livecodes/i18n/locales/id/translation.ts | 1 + .../i18n/locales/it/language-info.lokalise.json | 9 +++++++++ src/livecodes/i18n/locales/it/language-info.ts | 5 +++++ src/livecodes/i18n/locales/it/translation.lokalise.json | 3 +++ src/livecodes/i18n/locales/it/translation.ts | 1 + .../i18n/locales/ja/language-info.lokalise.json | 9 +++++++++ src/livecodes/i18n/locales/ja/language-info.ts | 5 +++++ src/livecodes/i18n/locales/ja/translation.lokalise.json | 3 +++ src/livecodes/i18n/locales/ja/translation.ts | 1 + .../i18n/locales/nl/language-info.lokalise.json | 9 +++++++++ src/livecodes/i18n/locales/nl/language-info.ts | 5 +++++ src/livecodes/i18n/locales/nl/translation.lokalise.json | 3 +++ src/livecodes/i18n/locales/nl/translation.ts | 1 + .../i18n/locales/pt/language-info.lokalise.json | 9 +++++++++ src/livecodes/i18n/locales/pt/language-info.ts | 5 +++++ src/livecodes/i18n/locales/pt/translation.lokalise.json | 3 +++ src/livecodes/i18n/locales/pt/translation.ts | 1 + .../i18n/locales/ru/language-info.lokalise.json | 9 +++++++++ src/livecodes/i18n/locales/ru/language-info.ts | 5 +++++ src/livecodes/i18n/locales/ru/translation.lokalise.json | 3 +++ src/livecodes/i18n/locales/ru/translation.ts | 1 + .../i18n/locales/tr/language-info.lokalise.json | 9 +++++++++ src/livecodes/i18n/locales/tr/language-info.ts | 5 +++++ src/livecodes/i18n/locales/tr/translation.lokalise.json | 3 +++ src/livecodes/i18n/locales/tr/translation.ts | 1 + .../i18n/locales/ur/language-info.lokalise.json | 9 +++++++++ src/livecodes/i18n/locales/ur/language-info.ts | 5 +++++ src/livecodes/i18n/locales/ur/translation.lokalise.json | 3 +++ src/livecodes/i18n/locales/ur/translation.ts | 1 + .../i18n/locales/zh-CN/language-info.lokalise.json | 9 +++++++++ src/livecodes/i18n/locales/zh-CN/language-info.ts | 5 +++++ .../i18n/locales/zh-CN/translation.lokalise.json | 3 +++ src/livecodes/i18n/locales/zh-CN/translation.ts | 1 + 69 files changed, 309 insertions(+), 2 deletions(-) diff --git a/docs/docs/languages/janet-wasm.mdx b/docs/docs/languages/janet-wasm.mdx index 30a731bc7b..da405c5c0c 100644 --- a/docs/docs/languages/janet-wasm.mdx +++ b/docs/docs/languages/janet-wasm.mdx @@ -31,8 +31,9 @@ export const janetConfig = { The program runs on the [result page](../features/result.mdx). Anything it prints is captured and shown in the [console](../features/console.mdx). Standard input is passed by setting the -`livecodes.janetWasm.input` property in JavaScript and is read in Janet with -`(file/read stdin :all)` and friends; a program that never reads never notices it was there. +`livecodes.janetWasm.input` property in JavaScript before the program runs. It is read in Janet with +`(file/read stdin :all)` and friends; a program that never reads never notices it was there. To run +again with new input, call `livecodes.janetWasm.run(input)`. ### Communication with JavaScript diff --git a/src/livecodes/i18n/locales/ar/language-info.lokalise.json b/src/livecodes/i18n/locales/ar/language-info.lokalise.json index 7ed13a665c..ecacb9d946 100644 --- a/src/livecodes/i18n/locales/ar/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/ar/language-info.lokalise.json @@ -387,6 +387,15 @@ "imba.name": { "translation": "Imba" }, + "janetWasm.desc": { + "translation": "مفسر Janet المُجمَّع إلى WebAssembly يعمل بالكامل داخل المتصفح. يدعم الإدخال القياسي ورموز الخروج الحقيقية." + }, + "janetWasm.link": { + "translation": "الموقع الرسمي لـ Janet وثائق Janet تعلم X في Y دقيقة، حيث X = Janet وثائق LiveCodes تحميل قالب البدء " + }, + "janetWasm.name": { + "translation": "Janet (Wasm)" + }, "java.desc": { "translation": "JVM يعمل في المتصفح باستخدام DoppioJVM." }, diff --git a/src/livecodes/i18n/locales/ar/language-info.ts b/src/livecodes/i18n/locales/ar/language-info.ts index 9db3590f7d..6ad5552db2 100644 --- a/src/livecodes/i18n/locales/ar/language-info.ts +++ b/src/livecodes/i18n/locales/ar/language-info.ts @@ -219,6 +219,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>الموقع الرسمي', name: 'Imba', }, + janetWasm: { + desc: 'مفسر <1>Janet المُجمَّع إلى WebAssembly يعمل بالكامل داخل المتصفح. يدعم الإدخال القياسي ورموز الخروج الحقيقية.', + link: '<1><2>الموقع الرسمي لـ Janet <3> <4>وثائق Janet <5> <6>تعلم X في Y دقيقة، حيث X = Janet <7> <8>وثائق LiveCodes <9> <10>تحميل قالب البدء ', + name: 'Janet (Wasm)', + }, java: { desc: 'JVM يعمل في المتصفح باستخدام DoppioJVM.', link: '<1> <2>موقع جافا الرسمي <3> <4> DoppioJVM <5> <6> تعلم X في دقائق Y، حيث X = جافا <7> <8>وثائق LiveCodes <9> <10> تحميل قالب البدء ', diff --git a/src/livecodes/i18n/locales/ar/translation.lokalise.json b/src/livecodes/i18n/locales/ar/translation.lokalise.json index 1d95e3dc68..2f8a40d5e6 100644 --- a/src/livecodes/i18n/locales/ar/translation.lokalise.json +++ b/src/livecodes/i18n/locales/ar/translation.lokalise.json @@ -2022,6 +2022,9 @@ "templates.starter.imba": { "translation": "قالب Imba" }, + "templates.starter.janet-wasm": { + "translation": "قالب Janet (Wasm)" + }, "templates.starter.java": { "translation": "قالب Java" }, diff --git a/src/livecodes/i18n/locales/ar/translation.ts b/src/livecodes/i18n/locales/ar/translation.ts index 0b0c2cb55a..827b955a0a 100644 --- a/src/livecodes/i18n/locales/ar/translation.ts +++ b/src/livecodes/i18n/locales/ar/translation.ts @@ -1013,6 +1013,7 @@ const translation: I18nTranslation = { 'haskell-wasm': 'قالب Haskell (Wasm)', heading: 'قوالب البداية', imba: 'قالب Imba', + 'janet-wasm': 'قالب Janet (Wasm)', java: 'قالب Java', javascript: 'قالب JavaScript', jest: 'قالب Jest', diff --git a/src/livecodes/i18n/locales/bn/language-info.lokalise.json b/src/livecodes/i18n/locales/bn/language-info.lokalise.json index b0003018c9..c67b5a33c6 100644 --- a/src/livecodes/i18n/locales/bn/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/bn/language-info.lokalise.json @@ -387,6 +387,15 @@ "imba.name": { "translation": "Imba" }, + "janetWasm.desc": { + "translation": "Janet ইন্টারপ্রেটার WebAssembly-তে কম্পাইল করা হয়েছে এবং এটি সম্পূর্ণভাবে ব্রাউজারে চলে। এটি স্ট্যান্ডার্ড ইনপুট এবং প্রকৃত এক্সিট কোড সমর্থন করে।" + }, + "janetWasm.link": { + "translation": "Janet অফিসিয়াল ওয়েবসাইট Janet ডকুমেন্টেশন Y মিনিটে X শিখুন, যেখানে X=Janet লাইভকোড ডকুমেন্টেশন স্টার্টার টেমপ্লেট লোড করুন " + }, + "janetWasm.name": { + "translation": "Janet (Wasm)" + }, "java.desc": { "translation": "DoppioJVM ব্যবহার করে ব্রাউজারে চলমান JVM।" }, diff --git a/src/livecodes/i18n/locales/bn/language-info.ts b/src/livecodes/i18n/locales/bn/language-info.ts index 80cd7b1ab3..4402c8a2ac 100644 --- a/src/livecodes/i18n/locales/bn/language-info.ts +++ b/src/livecodes/i18n/locales/bn/language-info.ts @@ -220,6 +220,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>অফিসিয়াল ওয়েবসাইট', name: 'Imba', }, + janetWasm: { + desc: '<1>Janet ইন্টারপ্রেটার WebAssembly-তে কম্পাইল করা হয়েছে এবং এটি সম্পূর্ণভাবে ব্রাউজারে চলে। এটি স্ট্যান্ডার্ড ইনপুট এবং প্রকৃত এক্সিট কোড সমর্থন করে।', + link: '<1><2>Janet অফিসিয়াল ওয়েবসাইট <3> <4>Janet ডকুমেন্টেশন <5> <6>Y মিনিটে X শিখুন, যেখানে X=Janet <7> <8>লাইভকোড ডকুমেন্টেশন <9> <10>স্টার্টার টেমপ্লেট লোড করুন ', + name: 'Janet (Wasm)', + }, java: { desc: 'DoppioJVM ব্যবহার করে ব্রাউজারে চলমান JVM।', link: '<1> <2>Java অফিসিয়াল ওয়েবসাইট <3> <4>DoppioJVM <5> <6>Y মিনিটে X শিখুন, যেখানে X=java <7> <8>LiveCodes ডকুমেন্টেশন <9> <10>স্টার্টার টেমপ্লেট লোড করুন ', diff --git a/src/livecodes/i18n/locales/bn/translation.lokalise.json b/src/livecodes/i18n/locales/bn/translation.lokalise.json index b7b2d0ff7a..b6d7131662 100644 --- a/src/livecodes/i18n/locales/bn/translation.lokalise.json +++ b/src/livecodes/i18n/locales/bn/translation.lokalise.json @@ -2022,6 +2022,9 @@ "templates.starter.imba": { "translation": "Imba স্টার্টার" }, + "templates.starter.janet-wasm": { + "translation": "Janet (Wasm) স্টার্টার" + }, "templates.starter.java": { "translation": "Java স্টার্টার" }, diff --git a/src/livecodes/i18n/locales/bn/translation.ts b/src/livecodes/i18n/locales/bn/translation.ts index 95fe1623c2..6acfc6e34c 100644 --- a/src/livecodes/i18n/locales/bn/translation.ts +++ b/src/livecodes/i18n/locales/bn/translation.ts @@ -1013,6 +1013,7 @@ const translation: I18nTranslation = { 'haskell-wasm': 'Haskell (Wasm) স্টার্টার', heading: 'স্টার্টার টেমপ্লেট', imba: 'Imba স্টার্টার', + 'janet-wasm': 'Janet (Wasm) স্টার্টার', java: 'Java স্টার্টার', javascript: 'JavaScript স্টার্টার', jest: 'Jest স্টার্টার', diff --git a/src/livecodes/i18n/locales/de/language-info.lokalise.json b/src/livecodes/i18n/locales/de/language-info.lokalise.json index 9cf76f4dfb..d0cf8bfaa0 100644 --- a/src/livecodes/i18n/locales/de/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/de/language-info.lokalise.json @@ -387,6 +387,15 @@ "imba.name": { "translation": "Imba" }, + "janetWasm.desc": { + "translation": "Der Janet-Interpreter wird zu WebAssembly kompiliert und läuft vollständig im Browser. Er unterstützt Standardeingabe und echte Exit-Codes." + }, + "janetWasm.link": { + "translation": "Offizielle Janet-Website Janet-Dokumentation Lerne X in Y Minuten, wobei X = Janet LiveCodes-Dokumentation Startervorlage laden " + }, + "janetWasm.name": { + "translation": "Janet (Wasm)" + }, "java.desc": { "translation": "JVM läuft im Browser mit DoppioJVM." }, diff --git a/src/livecodes/i18n/locales/de/language-info.ts b/src/livecodes/i18n/locales/de/language-info.ts index ae295de461..6bf452354a 100644 --- a/src/livecodes/i18n/locales/de/language-info.ts +++ b/src/livecodes/i18n/locales/de/language-info.ts @@ -222,6 +222,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>Offizielle Website', name: 'Imba', }, + janetWasm: { + desc: 'Der <1>Janet-Interpreter wird zu WebAssembly kompiliert und läuft vollständig im Browser. Er unterstützt Standardeingabe und echte Exit-Codes.', + link: '<1><2>Offizielle Janet-Website <3> <4>Janet-Dokumentation <5> <6>Lerne X in Y Minuten, wobei X = Janet <7> <8>LiveCodes-Dokumentation <9> <10>Startervorlage laden ', + name: 'Janet (Wasm)', + }, java: { desc: 'JVM läuft im Browser mit DoppioJVM.', link: '<1> <2>Offizielle Java-Website <3> <4> DoppioJVM <5> <6> Lernen Sie X in Y Minuten, wobei X=java <7> <8>LiveCodes Dokumentation <9> <10> Laden Sie die Startvorlage ', diff --git a/src/livecodes/i18n/locales/de/translation.lokalise.json b/src/livecodes/i18n/locales/de/translation.lokalise.json index e731b522db..1ced5a1329 100644 --- a/src/livecodes/i18n/locales/de/translation.lokalise.json +++ b/src/livecodes/i18n/locales/de/translation.lokalise.json @@ -2022,6 +2022,9 @@ "templates.starter.imba": { "translation": "Imba-Starter" }, + "templates.starter.janet-wasm": { + "translation": "Janet (Wasm)-Starter" + }, "templates.starter.java": { "translation": "Java-Starter" }, diff --git a/src/livecodes/i18n/locales/de/translation.ts b/src/livecodes/i18n/locales/de/translation.ts index c624316dec..c9a63f7039 100644 --- a/src/livecodes/i18n/locales/de/translation.ts +++ b/src/livecodes/i18n/locales/de/translation.ts @@ -1015,6 +1015,7 @@ const translation: I18nTranslation = { 'haskell-wasm': 'Haskell (Wasm)-Starter', heading: 'Starter-Vorlagen', imba: 'Imba-Starter', + 'janet-wasm': 'Janet (Wasm)-Starter', java: 'Java-Starter', javascript: 'JavaScript-Starter', jest: 'Jest-Starter', diff --git a/src/livecodes/i18n/locales/es/language-info.lokalise.json b/src/livecodes/i18n/locales/es/language-info.lokalise.json index 68b852c42d..b6836edd42 100644 --- a/src/livecodes/i18n/locales/es/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/es/language-info.lokalise.json @@ -387,6 +387,15 @@ "imba.name": { "translation": "Imba" }, + "janetWasm.desc": { + "translation": "El intérprete de Janet se compila a WebAssembly y se ejecuta íntegramente en el navegador. Admite entrada estándar y códigos de salida reales." + }, + "janetWasm.link": { + "translation": "Página web oficial de Janet Documentación de Janet Aprende X en Y minutos, donde X = Janet Documentación de LiveCodes Cargar plantilla de inicio " + }, + "janetWasm.name": { + "translation": "Janet (Wasm)" + }, "java.desc": { "translation": "JVM ejecutándose en el navegador utilizando DoppioJVM." }, diff --git a/src/livecodes/i18n/locales/es/language-info.ts b/src/livecodes/i18n/locales/es/language-info.ts index dc99f54d31..8939677802 100644 --- a/src/livecodes/i18n/locales/es/language-info.ts +++ b/src/livecodes/i18n/locales/es/language-info.ts @@ -222,6 +222,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>Sitio web oficial', name: 'Imba', }, + janetWasm: { + desc: 'El intérprete de <1>Janet se compila a WebAssembly y se ejecuta íntegramente en el navegador. Admite entrada estándar y códigos de salida reales.', + link: '<1><2>Página web oficial de Janet <3> <4>Documentación de Janet <5> <6>Aprende X en Y minutos, donde X = Janet <7> <8>Documentación de LiveCodes <9> <10>Cargar plantilla de inicio ', + name: 'Janet (Wasm)', + }, java: { desc: 'JVM ejecutándose en el navegador utilizando DoppioJVM.', link: '<1> <2>Sitio web oficial de Java <3> <4> DoppioJVM <5> <6> Aprenda X en Y minutos, donde X=java <7> <8>Documentación de LiveCodes <9> <10> Cargue la plantilla de inicio ', diff --git a/src/livecodes/i18n/locales/es/translation.lokalise.json b/src/livecodes/i18n/locales/es/translation.lokalise.json index fcca52e95f..6952ed5cbe 100644 --- a/src/livecodes/i18n/locales/es/translation.lokalise.json +++ b/src/livecodes/i18n/locales/es/translation.lokalise.json @@ -2022,6 +2022,9 @@ "templates.starter.imba": { "translation": "Inicio Imba" }, + "templates.starter.janet-wasm": { + "translation": "Inicio Janet (Wasm)" + }, "templates.starter.java": { "translation": "Inicio Java" }, diff --git a/src/livecodes/i18n/locales/es/translation.ts b/src/livecodes/i18n/locales/es/translation.ts index a480c758d3..beb2e5a3de 100644 --- a/src/livecodes/i18n/locales/es/translation.ts +++ b/src/livecodes/i18n/locales/es/translation.ts @@ -1013,6 +1013,7 @@ const translation: I18nTranslation = { 'haskell-wasm': 'Inicio Haskell (Wasm)', heading: 'Plantillas de Inicio', imba: 'Inicio Imba', + 'janet-wasm': 'Inicio Janet (Wasm)', java: 'Inicio Java', javascript: 'Inicio JavaScript', jest: 'Inicio Jest', diff --git a/src/livecodes/i18n/locales/fa/language-info.lokalise.json b/src/livecodes/i18n/locales/fa/language-info.lokalise.json index e48b2a39a5..ad65cc88a6 100644 --- a/src/livecodes/i18n/locales/fa/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/fa/language-info.lokalise.json @@ -387,6 +387,15 @@ "imba.name": { "translation": "Imba" }, + "janetWasm.desc": { + "translation": "مفسر Janet که به WebAssembly کامپایل شده و کاملاً در مرورگر اجرا می‌شود. از ورودی استاندارد و کدهای خروج واقعی پشتیبانی می‌کند." + }, + "janetWasm.link": { + "translation": "وب‌سایت رسمی Janet اسناد Janet یادگیری X در Y دقیقه، که X=Janet مستندات LiveCodes بارگیری قالب شروع " + }, + "janetWasm.name": { + "translation": "Janet (Wasm)" + }, "java.desc": { "translation": "اجرای JVM در مرورگر با استفاده از DoppioJVM." }, diff --git a/src/livecodes/i18n/locales/fa/language-info.ts b/src/livecodes/i18n/locales/fa/language-info.ts index 9fb2bf347b..7c7695ade0 100644 --- a/src/livecodes/i18n/locales/fa/language-info.ts +++ b/src/livecodes/i18n/locales/fa/language-info.ts @@ -221,6 +221,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>وب‌سایت رسمی', name: 'Imba', }, + janetWasm: { + desc: 'مفسر <1>Janet که به WebAssembly کامپایل شده و کاملاً در مرورگر اجرا می‌شود. از ورودی استاندارد و کدهای خروج واقعی پشتیبانی می‌کند.', + link: '<1><2>وب‌سایت رسمی Janet <3> <4>اسناد Janet <5> <6>یادگیری X در Y دقیقه، که X=Janet <7> <8>مستندات LiveCodes <9> <10>بارگیری قالب شروع ', + name: 'Janet (Wasm)', + }, java: { desc: 'اجرای JVM در مرورگر با استفاده از DoppioJVM.', link: '<1> <2>وب‌سایت رسمی جاوا <3> <4>DoppioJVM <5> <6>یادگیری X در Y دقیقه، جایی که X=java <7> <8>مستندات LiveCodes <9> <10>بارگذاری قالب شروع کننده ', diff --git a/src/livecodes/i18n/locales/fa/translation.lokalise.json b/src/livecodes/i18n/locales/fa/translation.lokalise.json index 1cce6702a1..9bc68e397b 100644 --- a/src/livecodes/i18n/locales/fa/translation.lokalise.json +++ b/src/livecodes/i18n/locales/fa/translation.lokalise.json @@ -2022,6 +2022,9 @@ "templates.starter.imba": { "translation": "شروع کننده Imba" }, + "templates.starter.janet-wasm": { + "translation": "شروع کننده Janet (Wasm)" + }, "templates.starter.java": { "translation": "شروع کننده جاوا" }, diff --git a/src/livecodes/i18n/locales/fa/translation.ts b/src/livecodes/i18n/locales/fa/translation.ts index d94657414a..40ea1e79f9 100644 --- a/src/livecodes/i18n/locales/fa/translation.ts +++ b/src/livecodes/i18n/locales/fa/translation.ts @@ -1014,6 +1014,7 @@ const translation: I18nTranslation = { 'haskell-wasm': 'شروع کننده Haskell (Wasm)', heading: 'قالب‌های شروع کننده', imba: 'شروع کننده Imba', + 'janet-wasm': 'شروع کننده Janet (Wasm)', java: 'شروع کننده جاوا', javascript: 'شروع کننده جاوااسکریپت', jest: 'شروع کننده Jest', diff --git a/src/livecodes/i18n/locales/fr/language-info.lokalise.json b/src/livecodes/i18n/locales/fr/language-info.lokalise.json index b7f7ce4e04..c1ff8041eb 100644 --- a/src/livecodes/i18n/locales/fr/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/fr/language-info.lokalise.json @@ -387,6 +387,15 @@ "imba.name": { "translation": "Imba" }, + "janetWasm.desc": { + "translation": "L'interpréteur Janet compilé en WebAssembly s'exécute entièrement dans le navigateur. Il prend en charge l'entrée standard et les véritables codes de sortie." + }, + "janetWasm.link": { + "translation": "Site officiel de Janet Documentation Janet Apprenez X en Y minutes, où X = Janet Documentation LiveCodes Charger un modèle de démarrage " + }, + "janetWasm.name": { + "translation": "Janet (Wasm)" + }, "java.desc": { "translation": "JVM fonctionnant dans le navigateur à l'aide de DoppioJVM." }, diff --git a/src/livecodes/i18n/locales/fr/language-info.ts b/src/livecodes/i18n/locales/fr/language-info.ts index 557f68c3a8..da4179e002 100644 --- a/src/livecodes/i18n/locales/fr/language-info.ts +++ b/src/livecodes/i18n/locales/fr/language-info.ts @@ -222,6 +222,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>Site officiel', name: 'Imba', }, + janetWasm: { + desc: "L'interpréteur <1>Janet compilé en WebAssembly s'exécute entièrement dans le navigateur. Il prend en charge l'entrée standard et les véritables codes de sortie.", + link: '<1><2>Site officiel de Janet <3> <4>Documentation Janet <5> <6>Apprenez X en Y minutes, où X = Janet <7> <8>Documentation LiveCodes <9> <10>Charger un modèle de démarrage ', + name: 'Janet (Wasm)', + }, java: { desc: "JVM fonctionnant dans le navigateur à l'aide de DoppioJVM.", link: '<1> <2>Site officiel de Java <3> <4> DoppioJVM <5> <6> Apprendre X en Y minutes, où X=java <7> <8>Documentation LiveCodes <9> <10> Charger le modèle de démarrage ', diff --git a/src/livecodes/i18n/locales/fr/translation.lokalise.json b/src/livecodes/i18n/locales/fr/translation.lokalise.json index 37d59bf56a..b79bae534f 100644 --- a/src/livecodes/i18n/locales/fr/translation.lokalise.json +++ b/src/livecodes/i18n/locales/fr/translation.lokalise.json @@ -2022,6 +2022,9 @@ "templates.starter.imba": { "translation": "Démarrage Imba" }, + "templates.starter.janet-wasm": { + "translation": "Démarrage Janet (Wasm)" + }, "templates.starter.java": { "translation": "Démarrage Java" }, diff --git a/src/livecodes/i18n/locales/fr/translation.ts b/src/livecodes/i18n/locales/fr/translation.ts index fc89cfbca4..215de327c3 100644 --- a/src/livecodes/i18n/locales/fr/translation.ts +++ b/src/livecodes/i18n/locales/fr/translation.ts @@ -1015,6 +1015,7 @@ const translation: I18nTranslation = { 'haskell-wasm': 'Démarrage Haskell (Wasm)', heading: 'Modèles de Démarrage', imba: 'Démarrage Imba', + 'janet-wasm': 'Démarrage Janet (Wasm)', java: 'Démarrage Java', javascript: 'Démarrage JavaScript', jest: 'Démarrage Jest', diff --git a/src/livecodes/i18n/locales/hi/language-info.lokalise.json b/src/livecodes/i18n/locales/hi/language-info.lokalise.json index dfea82b146..5486e11bcb 100644 --- a/src/livecodes/i18n/locales/hi/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/hi/language-info.lokalise.json @@ -387,6 +387,15 @@ "imba.name": { "translation": "Imba" }, + "janetWasm.desc": { + "translation": "Janet इंटरप्रेटर को वेबअसेंबली में संकलित किया जाता है और यह पूरी तरह से ब्राउज़र में चलता है। यह मानक इनपुट और वास्तविक निकास कोड का समर्थन करता है।" + }, + "janetWasm.link": { + "translation": "Janet आधिकारिक वेबसाइट Janet दस्तावेज Y मिनट में X सीखें, जहाँ X=Janet लाइवकोड दस्तावेजीकरण स्टार्टर टेम्पलेट लोड करें " + }, + "janetWasm.name": { + "translation": "Janet (Wasm)" + }, "java.desc": { "translation": "DoppioJVM का उपयोग करके ब्राउज़र में JVM चल रहा है।" }, diff --git a/src/livecodes/i18n/locales/hi/language-info.ts b/src/livecodes/i18n/locales/hi/language-info.ts index 0764c5d7da..6bc8749236 100644 --- a/src/livecodes/i18n/locales/hi/language-info.ts +++ b/src/livecodes/i18n/locales/hi/language-info.ts @@ -221,6 +221,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>आधिकारिक वेबसाइट', name: 'Imba', }, + janetWasm: { + desc: '<1>Janet इंटरप्रेटर को वेबअसेंबली में संकलित किया जाता है और यह पूरी तरह से ब्राउज़र में चलता है। यह मानक इनपुट और वास्तविक निकास कोड का समर्थन करता है।', + link: '<1><2>Janet आधिकारिक वेबसाइट <3> <4>Janet दस्तावेज <5> <6>Y मिनट में X सीखें, जहाँ X=Janet <7> <8>लाइवकोड दस्तावेजीकरण <9> <10>स्टार्टर टेम्पलेट लोड करें ', + name: 'Janet (Wasm)', + }, java: { desc: 'DoppioJVM का उपयोग करके ब्राउज़र में JVM चल रहा है।', link: '<1> <2>जावा आधिकारिक वेबसाइट <3> <4>DoppioJVM <5> <6>वाई मिनटों में एक्स सीखें, जहां एक्स=जावा <7> <8>LiveCodes दस्तावेज़ीकरण <9> <10>स्टार्टर टेम्पलेट लोड करें ', diff --git a/src/livecodes/i18n/locales/hi/translation.lokalise.json b/src/livecodes/i18n/locales/hi/translation.lokalise.json index dbda261870..fbc6ec10c2 100644 --- a/src/livecodes/i18n/locales/hi/translation.lokalise.json +++ b/src/livecodes/i18n/locales/hi/translation.lokalise.json @@ -2022,6 +2022,9 @@ "templates.starter.imba": { "translation": "Imba स्टार्टर" }, + "templates.starter.janet-wasm": { + "translation": "Janet (Wasm) स्टार्टर" + }, "templates.starter.java": { "translation": "Java स्टार्टर" }, diff --git a/src/livecodes/i18n/locales/hi/translation.ts b/src/livecodes/i18n/locales/hi/translation.ts index a022126adb..4727fb6fb3 100644 --- a/src/livecodes/i18n/locales/hi/translation.ts +++ b/src/livecodes/i18n/locales/hi/translation.ts @@ -1013,6 +1013,7 @@ const translation: I18nTranslation = { 'haskell-wasm': 'Haskell (Wasm) स्टार्टर', heading: 'स्टार्टर टेम्पलेट्स', imba: 'Imba स्टार्टर', + 'janet-wasm': 'Janet (Wasm) स्टार्टर', java: 'Java स्टार्टर', javascript: 'JavaScript स्टार्टर', jest: 'Jest स्टार्टर', diff --git a/src/livecodes/i18n/locales/hu/language-info.lokalise.json b/src/livecodes/i18n/locales/hu/language-info.lokalise.json index 47d3b16a87..139778ef43 100644 --- a/src/livecodes/i18n/locales/hu/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/hu/language-info.lokalise.json @@ -387,6 +387,15 @@ "imba.name": { "translation": "Imba" }, + "janetWasm.desc": { + "translation": "A Janet értelmező WebAssembly-re van fordítva, és teljes egészében a böngészőben fut. Támogatja a szabványos bemenetet és a valódi kilépési kódokat." + }, + "janetWasm.link": { + "translation": "Az Janet hivatalos weboldala Janet dokumentáció Tanulj meg X-et Y perc alatt, ahol X=Janet LiveCodes dokumentáció Kezdő sablon betöltése " + }, + "janetWasm.name": { + "translation": "Janet (Wasm)" + }, "java.desc": { "translation": "JVM fut a böngészőben a DoppioJVM használatával." }, diff --git a/src/livecodes/i18n/locales/hu/language-info.ts b/src/livecodes/i18n/locales/hu/language-info.ts index 83c1d7ba59..4b3b7083df 100644 --- a/src/livecodes/i18n/locales/hu/language-info.ts +++ b/src/livecodes/i18n/locales/hu/language-info.ts @@ -222,6 +222,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>Hivatalos weboldal', name: 'Imba', }, + janetWasm: { + desc: 'A <1>Janet értelmező WebAssembly-re van fordítva, és teljes egészében a böngészőben fut. Támogatja a szabványos bemenetet és a valódi kilépési kódokat.', + link: '<1><2>Az Janet hivatalos weboldala <3> <4>Janet dokumentáció <5> <6>Tanulj meg X-et Y perc alatt, ahol X=Janet <7> <8>LiveCodes dokumentáció <9> <10>Kezdő sablon betöltése ', + name: 'Janet (Wasm)', + }, java: { desc: 'JVM fut a böngészőben a DoppioJVM használatával.', link: '<1> <2>Java hivatalos weboldal <3> <4>DoppioJVM <5> <6>Tanulj X-et Y perc alatt, ahol X=java <7> <8>LiveCodes dokumentáció <9> <10>Kezdő sablon betöltése ', diff --git a/src/livecodes/i18n/locales/hu/translation.lokalise.json b/src/livecodes/i18n/locales/hu/translation.lokalise.json index d6723871d6..e66a9aa7be 100644 --- a/src/livecodes/i18n/locales/hu/translation.lokalise.json +++ b/src/livecodes/i18n/locales/hu/translation.lokalise.json @@ -2022,6 +2022,9 @@ "templates.starter.imba": { "translation": "Imba kezdő" }, + "templates.starter.janet-wasm": { + "translation": "Janet (Wasm) kezdő" + }, "templates.starter.java": { "translation": "Java kezdő" }, diff --git a/src/livecodes/i18n/locales/hu/translation.ts b/src/livecodes/i18n/locales/hu/translation.ts index 17652c3700..81de979a54 100644 --- a/src/livecodes/i18n/locales/hu/translation.ts +++ b/src/livecodes/i18n/locales/hu/translation.ts @@ -1014,6 +1014,7 @@ const translation: I18nTranslation = { 'haskell-wasm': 'Haskell (Wasm) kezdő', heading: 'Kezdő sablonok', imba: 'Imba kezdő', + 'janet-wasm': 'Janet (Wasm) kezdő', java: 'Java kezdő', javascript: 'JavaScript kezdő', jest: 'Jest kezdő', diff --git a/src/livecodes/i18n/locales/id/language-info.lokalise.json b/src/livecodes/i18n/locales/id/language-info.lokalise.json index 76e1aa8708..8f35ebb3a0 100644 --- a/src/livecodes/i18n/locales/id/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/id/language-info.lokalise.json @@ -387,6 +387,15 @@ "imba.name": { "translation": "Imba" }, + "janetWasm.desc": { + "translation": "Interpreter Janet dikompilasi ke WebAssembly dan dijalankan sepenuhnya di dalam browser. Ini mendukung input standar dan kode keluar nyata." + }, + "janetWasm.link": { + "translation": "Situs web resmi Janet Dokumentasi Janet Belajar X dalam Y menit, di mana X = Janet Dokumentasi LiveCodes Muat templat awal " + }, + "janetWasm.name": { + "translation": "Janet (Wasm)" + }, "java.desc": { "translation": "JVM berjalan di browser menggunakan DoppioJVM." }, diff --git a/src/livecodes/i18n/locales/id/language-info.ts b/src/livecodes/i18n/locales/id/language-info.ts index 94b7005c42..e4100378b7 100644 --- a/src/livecodes/i18n/locales/id/language-info.ts +++ b/src/livecodes/i18n/locales/id/language-info.ts @@ -222,6 +222,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>Situs web resmi', name: 'Imba', }, + janetWasm: { + desc: 'Interpreter <1>Janet dikompilasi ke WebAssembly dan dijalankan sepenuhnya di dalam browser. Ini mendukung input standar dan kode keluar nyata.', + link: '<1><2>Situs web resmi Janet <3> <4>Dokumentasi Janet <5> <6>Belajar X dalam Y menit, di mana X = Janet <7> <8>Dokumentasi LiveCodes <9> <10>Muat templat awal ', + name: 'Janet (Wasm)', + }, java: { desc: 'JVM berjalan di browser menggunakan DoppioJVM.', link: '<1> <2>Situs web resmi Java <3> <4>DoppioJVM <5> <6>Pelajari X dalam Y menit, dengan X=java <7> <8>Dokumentasi LiveCodes <9> <10>Muat template pemula ', diff --git a/src/livecodes/i18n/locales/id/translation.lokalise.json b/src/livecodes/i18n/locales/id/translation.lokalise.json index 174adea164..58b18dbbf4 100644 --- a/src/livecodes/i18n/locales/id/translation.lokalise.json +++ b/src/livecodes/i18n/locales/id/translation.lokalise.json @@ -2022,6 +2022,9 @@ "templates.starter.imba": { "translation": "Pemula Imba" }, + "templates.starter.janet-wasm": { + "translation": "Pemula Janet (Wasm)" + }, "templates.starter.java": { "translation": "Pemula Java" }, diff --git a/src/livecodes/i18n/locales/id/translation.ts b/src/livecodes/i18n/locales/id/translation.ts index 9537fca7e6..21e6e191c1 100644 --- a/src/livecodes/i18n/locales/id/translation.ts +++ b/src/livecodes/i18n/locales/id/translation.ts @@ -1013,6 +1013,7 @@ const translation: I18nTranslation = { 'haskell-wasm': 'Pemula Haskell (Wasm)', heading: 'Template Pemula', imba: 'Pemula Imba', + 'janet-wasm': 'Pemula Janet (Wasm)', java: 'Pemula Java', javascript: 'Pemula JavaScript', jest: 'Pemula Jest', diff --git a/src/livecodes/i18n/locales/it/language-info.lokalise.json b/src/livecodes/i18n/locales/it/language-info.lokalise.json index 8094c8577c..91307a3c73 100644 --- a/src/livecodes/i18n/locales/it/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/it/language-info.lokalise.json @@ -387,6 +387,15 @@ "imba.name": { "translation": "Imba" }, + "janetWasm.desc": { + "translation": "L'interprete di Janet è compilato in WebAssembly ed eseguito interamente nel browser. Supporta input standard e codici di uscita reali." + }, + "janetWasm.link": { + "translation": "Sito web ufficiale di Janet Documentazione di Janet Impara X in Y minuti, dove X = Janet Documentazione di LiveCodes Carica il modello di avvio " + }, + "janetWasm.name": { + "translation": "Janet (Wasm)" + }, "java.desc": { "translation": "JVM in esecuzione nel browser utilizzando DoppioJVM." }, diff --git a/src/livecodes/i18n/locales/it/language-info.ts b/src/livecodes/i18n/locales/it/language-info.ts index 3dc3f898d3..98b9294ea7 100644 --- a/src/livecodes/i18n/locales/it/language-info.ts +++ b/src/livecodes/i18n/locales/it/language-info.ts @@ -221,6 +221,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>Sito ufficiale', name: 'Imba', }, + janetWasm: { + desc: "L'interprete di <1>Janet è compilato in WebAssembly ed eseguito interamente nel browser. Supporta input standard e codici di uscita reali.", + link: '<1><2>Sito web ufficiale di Janet <3> <4>Documentazione di Janet <5> <6>Impara X in Y minuti, dove X = Janet <7> <8>Documentazione di LiveCodes <9> <10>Carica il modello di avvio ', + name: 'Janet (Wasm)', + }, java: { desc: 'JVM in esecuzione nel browser utilizzando DoppioJVM.', link: '<1> <2>Sito ufficiale di Java <3> <4> DoppioJVM <5> <6> Imparare X in Y minuti, dove X=java <7> <8>Documentazione LiveCodes <9> <10> Caricare il modello iniziale ', diff --git a/src/livecodes/i18n/locales/it/translation.lokalise.json b/src/livecodes/i18n/locales/it/translation.lokalise.json index f5afd03e95..ebcf14e187 100644 --- a/src/livecodes/i18n/locales/it/translation.lokalise.json +++ b/src/livecodes/i18n/locales/it/translation.lokalise.json @@ -2022,6 +2022,9 @@ "templates.starter.imba": { "translation": "Starter Imba" }, + "templates.starter.janet-wasm": { + "translation": "Starter Janet (Wasm)" + }, "templates.starter.java": { "translation": "Starter Java" }, diff --git a/src/livecodes/i18n/locales/it/translation.ts b/src/livecodes/i18n/locales/it/translation.ts index 5093d4a29a..bb9606bf8b 100644 --- a/src/livecodes/i18n/locales/it/translation.ts +++ b/src/livecodes/i18n/locales/it/translation.ts @@ -1014,6 +1014,7 @@ const translation: I18nTranslation = { 'haskell-wasm': 'Starter Haskell (Wasm)', heading: 'Modelli di Partenza', imba: 'Starter Imba', + 'janet-wasm': 'Starter Janet (Wasm)', java: 'Starter Java', javascript: 'Starter JavaScript', jest: 'Starter Jest', diff --git a/src/livecodes/i18n/locales/ja/language-info.lokalise.json b/src/livecodes/i18n/locales/ja/language-info.lokalise.json index db15512843..133a486906 100644 --- a/src/livecodes/i18n/locales/ja/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/ja/language-info.lokalise.json @@ -387,6 +387,15 @@ "imba.name": { "translation": "Imba" }, + "janetWasm.desc": { + "translation": "Janet インタプリタは WebAssembly にコンパイルされ、完全にブラウザ内で実行されます。標準入力と実際の終了コードをサポートします。" + }, + "janetWasm.link": { + "translation": "Janet 公式サイト Janet ドキュメント 「Y分でXを学ぶ」(X=Janet) LiveCodes ドキュメント スターターテンプレートの読み込み " + }, + "janetWasm.name": { + "translation": "Janet (Wasm)" + }, "java.desc": { "translation": "DoppioJVMを使ってブラウザで動作するJVM。" }, diff --git a/src/livecodes/i18n/locales/ja/language-info.ts b/src/livecodes/i18n/locales/ja/language-info.ts index 1c5364cebf..999218c62b 100644 --- a/src/livecodes/i18n/locales/ja/language-info.ts +++ b/src/livecodes/i18n/locales/ja/language-info.ts @@ -221,6 +221,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>公式ウェブサイト', name: 'Imba', }, + janetWasm: { + desc: '<1>Janet インタプリタは WebAssembly にコンパイルされ、完全にブラウザ内で実行されます。標準入力と実際の終了コードをサポートします。', + link: '<1><2>Janet 公式サイト <3> <4>Janet ドキュメント <5> <6>「Y分でXを学ぶ」(X=Janet) <7> <8>LiveCodes ドキュメント <9> <10>スターターテンプレートの読み込み ', + name: 'Janet (Wasm)', + }, java: { desc: 'DoppioJVMを使ってブラウザで動作するJVM。', link: '<1> <2>Java公式サイト <3> <4>DoppioJVM <5> <6>XをY分で学ぶ、X=Java <7> <8>LiveCodes ドキュメント <9> <10>スターターテンプレートのロード ', diff --git a/src/livecodes/i18n/locales/ja/translation.lokalise.json b/src/livecodes/i18n/locales/ja/translation.lokalise.json index 5f887c5989..2615fe58b2 100644 --- a/src/livecodes/i18n/locales/ja/translation.lokalise.json +++ b/src/livecodes/i18n/locales/ja/translation.lokalise.json @@ -2022,6 +2022,9 @@ "templates.starter.imba": { "translation": "Imbaスターター" }, + "templates.starter.janet-wasm": { + "translation": "Janet(Wasm)スターター" + }, "templates.starter.java": { "translation": "Javaスターター" }, diff --git a/src/livecodes/i18n/locales/ja/translation.ts b/src/livecodes/i18n/locales/ja/translation.ts index 571ff39811..36e8d5070f 100644 --- a/src/livecodes/i18n/locales/ja/translation.ts +++ b/src/livecodes/i18n/locales/ja/translation.ts @@ -1014,6 +1014,7 @@ const translation: I18nTranslation = { 'haskell-wasm': 'Haskell (Wasm)スターター', heading: 'スターターテンプレート', imba: 'Imbaスターター', + 'janet-wasm': 'Janet(Wasm)スターター', java: 'Javaスターター', javascript: 'JavaScriptスターター', jest: 'Jestスターター', diff --git a/src/livecodes/i18n/locales/nl/language-info.lokalise.json b/src/livecodes/i18n/locales/nl/language-info.lokalise.json index ed38c74f7c..74218096e5 100644 --- a/src/livecodes/i18n/locales/nl/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/nl/language-info.lokalise.json @@ -387,6 +387,15 @@ "imba.name": { "translation": "Imba" }, + "janetWasm.desc": { + "translation": "De Janet-interpreter wordt gecompileerd naar WebAssembly en draait volledig in de browser. Het ondersteunt standaardinvoer en echte exitcodes." + }, + "janetWasm.link": { + "translation": "Officiële website van Janet Janet-documentatie Leer X in Y minuten, waarbij X = Janet LiveCodes-documentatie Startersjabloon laden " + }, + "janetWasm.name": { + "translation": "Janet (Wasm)" + }, "java.desc": { "translation": "JVM draaiend in de browser met DoppioJVM." }, diff --git a/src/livecodes/i18n/locales/nl/language-info.ts b/src/livecodes/i18n/locales/nl/language-info.ts index 3ede32cef6..b802800959 100644 --- a/src/livecodes/i18n/locales/nl/language-info.ts +++ b/src/livecodes/i18n/locales/nl/language-info.ts @@ -221,6 +221,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>Officiële website', name: 'Imba', }, + janetWasm: { + desc: 'De <1>Janet-interpreter wordt gecompileerd naar WebAssembly en draait volledig in de browser. Het ondersteunt standaardinvoer en echte exitcodes.', + link: '<1><2>Officiële website van Janet <3> <4>Janet-documentatie <5> <6>Leer X in Y minuten, waarbij X = Janet <7> <8>LiveCodes-documentatie <9> <10>Startersjabloon laden ', + name: 'Janet (Wasm)', + }, java: { desc: 'JVM draaiend in de browser met DoppioJVM.', link: '<1> <2>Java officiële website <3> <4>DoppioJVM <5> <6>Leer X in Y minuten, waarbij X=java <7> <8>LiveCodes Documentatie <9> <10>Startsjabloon laden ', diff --git a/src/livecodes/i18n/locales/nl/translation.lokalise.json b/src/livecodes/i18n/locales/nl/translation.lokalise.json index adcc4a3778..76b1e08323 100644 --- a/src/livecodes/i18n/locales/nl/translation.lokalise.json +++ b/src/livecodes/i18n/locales/nl/translation.lokalise.json @@ -2022,6 +2022,9 @@ "templates.starter.imba": { "translation": "Imba-starter" }, + "templates.starter.janet-wasm": { + "translation": "Janet (Wasm)-starter" + }, "templates.starter.java": { "translation": "Java-starter" }, diff --git a/src/livecodes/i18n/locales/nl/translation.ts b/src/livecodes/i18n/locales/nl/translation.ts index 8cd1fcf5d8..328feb3819 100644 --- a/src/livecodes/i18n/locales/nl/translation.ts +++ b/src/livecodes/i18n/locales/nl/translation.ts @@ -1014,6 +1014,7 @@ const translation: I18nTranslation = { 'haskell-wasm': 'Haskell (Wasm)-starter', heading: 'Startsjablonen', imba: 'Imba-starter', + 'janet-wasm': 'Janet (Wasm)-starter', java: 'Java-starter', javascript: 'JavaScript-starter', jest: 'Jest-starter', diff --git a/src/livecodes/i18n/locales/pt/language-info.lokalise.json b/src/livecodes/i18n/locales/pt/language-info.lokalise.json index cbba006288..1a1eabc06a 100644 --- a/src/livecodes/i18n/locales/pt/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/pt/language-info.lokalise.json @@ -387,6 +387,15 @@ "imba.name": { "translation": "Imba" }, + "janetWasm.desc": { + "translation": "O interpretador Janet é compilado para WebAssembly, sendo executado na íntegra no navegador. Ele suporta entrada padrão e códigos de saída reais." + }, + "janetWasm.link": { + "translation": "Site oficial do Janet Documentação do Janet Aprenda X em Y minutos, onde X = Janet Documentação do LiveCodes Carregar modelo inicial " + }, + "janetWasm.name": { + "translation": "Janet (Wasm)" + }, "java.desc": { "translation": "JVM em execução no navegador usando DoppioJVM." }, diff --git a/src/livecodes/i18n/locales/pt/language-info.ts b/src/livecodes/i18n/locales/pt/language-info.ts index 1d2921ed6f..a769b646b8 100644 --- a/src/livecodes/i18n/locales/pt/language-info.ts +++ b/src/livecodes/i18n/locales/pt/language-info.ts @@ -221,6 +221,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>Site oficial', name: 'Imba', }, + janetWasm: { + desc: 'O interpretador <1>Janet é compilado para WebAssembly, sendo executado na íntegra no navegador. Ele suporta entrada padrão e códigos de saída reais.', + link: '<1><2>Site oficial do Janet <3> <4>Documentação do Janet <5> <6>Aprenda X em Y minutos, onde X = Janet <7> <8>Documentação do LiveCodes <9> <10>Carregar modelo inicial ', + name: 'Janet (Wasm)', + }, java: { desc: 'JVM em execução no navegador usando DoppioJVM.', link: '<1> <2>Sítio Web oficial de Java <3> <4> DoppioJVM <5> <6> Aprender X em Y minutos, onde X=java <7> <8>Documentação do LiveCodes <9> <10> Carregar modelo inicial ', diff --git a/src/livecodes/i18n/locales/pt/translation.lokalise.json b/src/livecodes/i18n/locales/pt/translation.lokalise.json index d1f70b68a9..34d5a0ddeb 100644 --- a/src/livecodes/i18n/locales/pt/translation.lokalise.json +++ b/src/livecodes/i18n/locales/pt/translation.lokalise.json @@ -2022,6 +2022,9 @@ "templates.starter.imba": { "translation": "Iniciante Imba" }, + "templates.starter.janet-wasm": { + "translation": "Iniciante Janet (Wasm)" + }, "templates.starter.java": { "translation": "Iniciante Java" }, diff --git a/src/livecodes/i18n/locales/pt/translation.ts b/src/livecodes/i18n/locales/pt/translation.ts index ae36c8bf22..75179bf82f 100644 --- a/src/livecodes/i18n/locales/pt/translation.ts +++ b/src/livecodes/i18n/locales/pt/translation.ts @@ -1014,6 +1014,7 @@ const translation: I18nTranslation = { 'haskell-wasm': 'Iniciante Haskell (Wasm)', heading: 'Modelos Iniciantes', imba: 'Iniciante Imba', + 'janet-wasm': 'Iniciante Janet (Wasm)', java: 'Iniciante Java', javascript: 'Iniciante JavaScript', jest: 'Iniciante Jest', diff --git a/src/livecodes/i18n/locales/ru/language-info.lokalise.json b/src/livecodes/i18n/locales/ru/language-info.lokalise.json index 211d2269dc..dcbe3be84e 100644 --- a/src/livecodes/i18n/locales/ru/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/ru/language-info.lokalise.json @@ -387,6 +387,15 @@ "imba.name": { "translation": "Imba" }, + "janetWasm.desc": { + "translation": "Интерпретатор Janet скомпилирован в WebAssembly и выполняется полностью в браузере. Поддерживает стандартный ввод и реальные коды выхода." + }, + "janetWasm.link": { + "translation": "Официальный сайт Janet Документация по Janet «Изучите X за Y минут», где X = Janet Документация LiveCodes Загрузить стартовый шаблон " + }, + "janetWasm.name": { + "translation": "Janet (Wasm)" + }, "java.desc": { "translation": "JVM, работающая в браузере с помощью DoppioJVM." }, diff --git a/src/livecodes/i18n/locales/ru/language-info.ts b/src/livecodes/i18n/locales/ru/language-info.ts index 210da01c91..b12e0d175f 100644 --- a/src/livecodes/i18n/locales/ru/language-info.ts +++ b/src/livecodes/i18n/locales/ru/language-info.ts @@ -223,6 +223,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>Официальный сайт', name: 'Imba', }, + janetWasm: { + desc: 'Интерпретатор <1>Janet скомпилирован в WebAssembly и выполняется полностью в браузере. Поддерживает стандартный ввод и реальные коды выхода.', + link: '<1><2>Официальный сайт Janet <3> <4>Документация по Janet <5> <6>«Изучите X за Y минут», где X = Janet <7> <8>Документация LiveCodes <9> <10>Загрузить стартовый шаблон ', + name: 'Janet (Wasm)', + }, java: { desc: 'JVM, работающая в браузере с помощью DoppioJVM.', link: '<1> <2>Официальный сайт Java <3> <4> DoppioJVM <5> <6> Узнай X за Y минут, где X=java <7> <8>Документация LiveCodes <9> <10> Загрузи стартовый шаблон ', diff --git a/src/livecodes/i18n/locales/ru/translation.lokalise.json b/src/livecodes/i18n/locales/ru/translation.lokalise.json index 8ad794a9c1..39febf5514 100644 --- a/src/livecodes/i18n/locales/ru/translation.lokalise.json +++ b/src/livecodes/i18n/locales/ru/translation.lokalise.json @@ -2022,6 +2022,9 @@ "templates.starter.imba": { "translation": "Стартер Imba" }, + "templates.starter.janet-wasm": { + "translation": "Стартер Janet (Wasm)" + }, "templates.starter.java": { "translation": "Стартер Java" }, diff --git a/src/livecodes/i18n/locales/ru/translation.ts b/src/livecodes/i18n/locales/ru/translation.ts index d8cce61b19..d318c7a32e 100644 --- a/src/livecodes/i18n/locales/ru/translation.ts +++ b/src/livecodes/i18n/locales/ru/translation.ts @@ -1013,6 +1013,7 @@ const translation: I18nTranslation = { 'haskell-wasm': 'Стартер Haskell (Wasm)', heading: 'Стартовые шаблоны', imba: 'Стартер Imba', + 'janet-wasm': 'Стартер Janet (Wasm)', java: 'Стартер Java', javascript: 'Стартер JavaScript', jest: 'Стартер Jest', diff --git a/src/livecodes/i18n/locales/tr/language-info.lokalise.json b/src/livecodes/i18n/locales/tr/language-info.lokalise.json index 639b33a252..9646b7f1b8 100644 --- a/src/livecodes/i18n/locales/tr/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/tr/language-info.lokalise.json @@ -387,6 +387,15 @@ "imba.name": { "translation": "Imba" }, + "janetWasm.desc": { + "translation": "Janet yorumlayıcısı WebAssembly'ye derlenir ve tamamen tarayıcı içinde çalışır. Standart girişi ve gerçek çıkış kodlarını destekler." + }, + "janetWasm.link": { + "translation": "Janet resmi web sitesi Janet belgeleri Y dakikada X'i öğrenin, burada X=Janet LiveCodes Belgeleri Başlangıç şablonunu yükle " + }, + "janetWasm.name": { + "translation": "Janet (Wasm)" + }, "java.desc": { "translation": "DoppioJVM kullanılarak tarayıcıda çalışan JVM." }, diff --git a/src/livecodes/i18n/locales/tr/language-info.ts b/src/livecodes/i18n/locales/tr/language-info.ts index 31ae1a1b82..1748d35742 100644 --- a/src/livecodes/i18n/locales/tr/language-info.ts +++ b/src/livecodes/i18n/locales/tr/language-info.ts @@ -222,6 +222,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>Resmi web sitesi', name: 'Imba', }, + janetWasm: { + desc: "<1>Janet yorumlayıcısı WebAssembly'ye derlenir ve tamamen tarayıcı içinde çalışır. Standart girişi ve gerçek çıkış kodlarını destekler.", + link: "<1><2>Janet resmi web sitesi <3> <4>Janet belgeleri <5> <6>Y dakikada X'i öğrenin, burada X=Janet <7> <8>LiveCodes Belgeleri <9> <10>Başlangıç şablonunu yükle ", + name: 'Janet (Wasm)', + }, java: { desc: 'DoppioJVM kullanılarak tarayıcıda çalışan JVM.', link: '<1> <2>Java resmi web sitesi <3> <4>DoppioJVM <5> <6>Y Dakikada X Öğrenin, X=java <7> <8>LiveCodes Dokümantasyonu <9> <10>Başlangıç şablonunu yükle ', diff --git a/src/livecodes/i18n/locales/tr/translation.lokalise.json b/src/livecodes/i18n/locales/tr/translation.lokalise.json index f8cc07260f..0f4f4d838e 100644 --- a/src/livecodes/i18n/locales/tr/translation.lokalise.json +++ b/src/livecodes/i18n/locales/tr/translation.lokalise.json @@ -2022,6 +2022,9 @@ "templates.starter.imba": { "translation": "Imba Başlangıç" }, + "templates.starter.janet-wasm": { + "translation": "Janet (Wasm) Başlangıç" + }, "templates.starter.java": { "translation": "Java Başlangıç" }, diff --git a/src/livecodes/i18n/locales/tr/translation.ts b/src/livecodes/i18n/locales/tr/translation.ts index 292f4fe710..c7db42fc4f 100644 --- a/src/livecodes/i18n/locales/tr/translation.ts +++ b/src/livecodes/i18n/locales/tr/translation.ts @@ -1014,6 +1014,7 @@ const translation: I18nTranslation = { 'haskell-wasm': 'Haskell (Wasm) Başlangıç', heading: 'Başlangıç Şablonları', imba: 'Imba Başlangıç', + 'janet-wasm': 'Janet (Wasm) Başlangıç', java: 'Java Başlangıç', javascript: 'JavaScript Başlangıç', jest: 'Jest Başlangıç', diff --git a/src/livecodes/i18n/locales/ur/language-info.lokalise.json b/src/livecodes/i18n/locales/ur/language-info.lokalise.json index 4e3d1ec1e7..943ff62f7c 100644 --- a/src/livecodes/i18n/locales/ur/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/ur/language-info.lokalise.json @@ -387,6 +387,15 @@ "imba.name": { "translation": "امبا" }, + "janetWasm.desc": { + "translation": "Janet انٹرپریٹر کو WebAssembly میں مرتب کیا گیا ہے جو مکمل طور پر براؤزر میں چلتا ہے۔ یہ معیاری ان پٹ اور حقیقی ایگزٹ کوڈز کی حمایت کرتا ہے۔" + }, + "janetWasm.link": { + "translation": "Janet آفیشل ویب سائٹ Janet دستاویزات Y منٹ میں X سیکھیں، جہاں X=Janet LiveCodes دستاویزی لوڈ اسٹارٹر ٹیمپلیٹ " + }, + "janetWasm.name": { + "translation": "Janet (Wasm)" + }, "java.desc": { "translation": "DoppioJVM کا استعمال کرتے ہوئے براؤزر میں JVM چل رہا ہے۔" }, diff --git a/src/livecodes/i18n/locales/ur/language-info.ts b/src/livecodes/i18n/locales/ur/language-info.ts index 5d3799f7fe..dc8a0a0075 100644 --- a/src/livecodes/i18n/locales/ur/language-info.ts +++ b/src/livecodes/i18n/locales/ur/language-info.ts @@ -222,6 +222,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>سرکاری ویب سائٹ', name: 'امبا', }, + janetWasm: { + desc: '<1>Janet انٹرپریٹر کو WebAssembly میں مرتب کیا گیا ہے جو مکمل طور پر براؤزر میں چلتا ہے۔ یہ معیاری ان پٹ اور حقیقی ایگزٹ کوڈز کی حمایت کرتا ہے۔', + link: '<1><2>Janet آفیشل ویب سائٹ <3> <4>Janet دستاویزات <5> <6>Y منٹ میں X سیکھیں، جہاں X=Janet <7> <8>LiveCodes دستاویزی <9> <10>لوڈ اسٹارٹر ٹیمپلیٹ ', + name: 'Janet (Wasm)', + }, java: { desc: 'DoppioJVM کا استعمال کرتے ہوئے براؤزر میں JVM چل رہا ہے۔', link: '<1> <2>Java آفیشل ویب سائٹ <3> <4>DoppioJVM <5> <6>Y منٹ میں X سیکھیں، جہاں X=java <7> <8>LiveCodes دستاویزات <9> <10>ابتدائی سانچہ لوڈ کریں ', diff --git a/src/livecodes/i18n/locales/ur/translation.lokalise.json b/src/livecodes/i18n/locales/ur/translation.lokalise.json index 3eae8e410a..823e2d0ff6 100644 --- a/src/livecodes/i18n/locales/ur/translation.lokalise.json +++ b/src/livecodes/i18n/locales/ur/translation.lokalise.json @@ -2022,6 +2022,9 @@ "templates.starter.imba": { "translation": "امبا شروعاتی" }, + "templates.starter.janet-wasm": { + "translation": "Janet (واسم) شروعاتی" + }, "templates.starter.java": { "translation": "جاوا شروعاتی" }, diff --git a/src/livecodes/i18n/locales/ur/translation.ts b/src/livecodes/i18n/locales/ur/translation.ts index 12555e19db..987d390160 100644 --- a/src/livecodes/i18n/locales/ur/translation.ts +++ b/src/livecodes/i18n/locales/ur/translation.ts @@ -1013,6 +1013,7 @@ const translation: I18nTranslation = { 'haskell-wasm': 'ہاسکل (واسم) شروعاتی', heading: 'شروعاتی سانچے', imba: 'امبا شروعاتی', + 'janet-wasm': 'Janet (واسم) شروعاتی', java: 'جاوا شروعاتی', javascript: 'جاوا اسکرپٹ شروعاتی', jest: 'جیسٹ شروعاتی', diff --git a/src/livecodes/i18n/locales/zh-CN/language-info.lokalise.json b/src/livecodes/i18n/locales/zh-CN/language-info.lokalise.json index 959c95c047..49c630ae7d 100644 --- a/src/livecodes/i18n/locales/zh-CN/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/zh-CN/language-info.lokalise.json @@ -387,6 +387,15 @@ "imba.name": { "translation": "Imba" }, + "janetWasm.desc": { + "translation": "Janet 解释器编译为 WebAssembly,并在浏览器中完全运行。它支持标准输入和真实的退出代码。" + }, + "janetWasm.link": { + "translation": "Janet 官方网站 Janet 文档 《Y分钟学会X》,其中X=Janet LiveCodes 文档 加载入门模板 " + }, + "janetWasm.name": { + "translation": "Janet (Wasm)" + }, "java.desc": { "translation": "使用 DoppioJVM 在浏览器中运行的 JVM。" }, diff --git a/src/livecodes/i18n/locales/zh-CN/language-info.ts b/src/livecodes/i18n/locales/zh-CN/language-info.ts index bed3b61ab8..0d84bf7e95 100644 --- a/src/livecodes/i18n/locales/zh-CN/language-info.ts +++ b/src/livecodes/i18n/locales/zh-CN/language-info.ts @@ -217,6 +217,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>官方网站', name: 'Imba', }, + janetWasm: { + desc: '<1>Janet 解释器编译为 WebAssembly,并在浏览器中完全运行。它支持标准输入和真实的退出代码。', + link: '<1><2>Janet 官方网站 <3> <4>Janet 文档 <5> <6>《Y分钟学会X》,其中X=Janet <7> <8>LiveCodes 文档 <9> <10>加载入门模板 ', + name: 'Janet (Wasm)', + }, java: { desc: '使用 DoppioJVM 在浏览器中运行的 JVM。', link: '<1> <2>Java 官方网站 <3> <4>DoppioJVM <5> <6>在 Y 分钟内学习 X,其中 X=java <7> <8>LiveCodes 文档 <9> <10>加载启动模板 ', diff --git a/src/livecodes/i18n/locales/zh-CN/translation.lokalise.json b/src/livecodes/i18n/locales/zh-CN/translation.lokalise.json index b905a7d816..a839b5dfd5 100644 --- a/src/livecodes/i18n/locales/zh-CN/translation.lokalise.json +++ b/src/livecodes/i18n/locales/zh-CN/translation.lokalise.json @@ -2022,6 +2022,9 @@ "templates.starter.imba": { "translation": "Imba 启动模板" }, + "templates.starter.janet-wasm": { + "translation": "Janet(Wasm)启动模板" + }, "templates.starter.java": { "translation": "Java 启动模板" }, diff --git a/src/livecodes/i18n/locales/zh-CN/translation.ts b/src/livecodes/i18n/locales/zh-CN/translation.ts index 9857c05d16..457f481eb3 100644 --- a/src/livecodes/i18n/locales/zh-CN/translation.ts +++ b/src/livecodes/i18n/locales/zh-CN/translation.ts @@ -1011,6 +1011,7 @@ const translation: I18nTranslation = { 'haskell-wasm': 'Haskell (Wasm) 启动模板', heading: '启动模板', imba: 'Imba 启动模板', + 'janet-wasm': 'Janet(Wasm)启动模板', java: 'Java 启动模板', javascript: 'JavaScript 启动模板', jest: 'Jest 启动模板',