From e7f95ecfde58ad672df0201f3067f8ba44022310 Mon Sep 17 00:00:00 2001 From: Ahmed Wael Date: Sun, 27 Sep 2026 15:35:19 +0300 Subject: [PATCH 1/8] feat: add Fanak language support Add a `fanak` language and starter template that run Fanak in the browser via a Blazor WASM compiler runner fetched from a URL (nothing is embedded). The runner is built and deployed by the Fanak project to GitLab Pages; its base URL lives in `vendors.ts` (`fanakBaseUrl`). - language spec, in-page loader script (Blazor boot + `DotNet.invokeMethodAsync` `RunCode`), and a starter template - register the language, template, scriptType (`text/fanak`), and i18n key --- functions/vendors/templates.js | 1 + scripts/build.js | 1 + server/php/inc/starter-templates.json | 1 + src/livecodes/UI/command-menu-actions.ts | 1 + .../i18n/locales/en/translation.lokalise.json | 4 + src/livecodes/i18n/locales/en/translation.ts | 1 + src/livecodes/languages/fanak/index.ts | 1 + .../languages/fanak/lang-fanak-script.ts | 161 ++++++++++++++++++ src/livecodes/languages/fanak/lang-fanak.ts | 31 ++++ src/livecodes/languages/languages.ts | 2 + src/livecodes/models.ts | 1 + .../templates/starter/fanak-starter.ts | 49 ++++++ src/livecodes/templates/starter/index.ts | 2 + src/livecodes/vendors.ts | 13 ++ src/sdk/models.ts | 4 + 15 files changed, 273 insertions(+) create mode 100644 src/livecodes/languages/fanak/index.ts create mode 100644 src/livecodes/languages/fanak/lang-fanak-script.ts create mode 100644 src/livecodes/languages/fanak/lang-fanak.ts create mode 100644 src/livecodes/templates/starter/fanak-starter.ts diff --git a/functions/vendors/templates.js b/functions/vendors/templates.js index ac3cf1f1ef..bd58218dd7 100644 --- a/functions/vendors/templates.js +++ b/functions/vendors/templates.js @@ -57,6 +57,7 @@ export const starterTemplates = { "vb-wasm": "VB.NET (Wasm) Starter", "fsharp": "F# Starter", "fsharp-wasm": "F# (Wasm) Starter", + "fanak": "Fanak Starter", "haskell": "Haskell Starter", "haskell-wasm": "Haskell (Wasm) Starter", "scheme": "Scheme Starter", diff --git a/scripts/build.js b/scripts/build.js index 44e897eb98..72076d948e 100644 --- a/scripts/build.js +++ b/scripts/build.js @@ -230,6 +230,7 @@ const iifeBuild = () => 'languages/clang-wasm/lang-clang-wasm-script.ts', 'languages/go-wasm/lang-go-wasm-script.ts', 'languages/csharp-wasm/lang-csharp-wasm-script.ts', + 'languages/fanak/lang-fanak-script.ts', 'languages/vb-wasm/lang-vb-wasm-script.ts', 'languages/zig-wasm/lang-zig-wasm-script.ts', 'languages/dot/lang-dot-compiler.ts', diff --git a/server/php/inc/starter-templates.json b/server/php/inc/starter-templates.json index cb098ffe1e..03f42ba5e6 100644 --- a/server/php/inc/starter-templates.json +++ b/server/php/inc/starter-templates.json @@ -57,6 +57,7 @@ "vb-wasm": "VB.NET (Wasm) Starter", "fsharp": "F# Starter", "fsharp-wasm": "F# (Wasm) Starter", + "fanak": "Fanak Starter", "haskell": "Haskell Starter", "haskell-wasm": "Haskell (Wasm) Starter", "scheme": "Scheme Starter", diff --git a/src/livecodes/UI/command-menu-actions.ts b/src/livecodes/UI/command-menu-actions.ts index 4af4cc7422..4697c5b7be 100644 --- a/src/livecodes/UI/command-menu-actions.ts +++ b/src/livecodes/UI/command-menu-actions.ts @@ -313,6 +313,7 @@ export const getCommandMenuActions = ({ 'vb-wasm', 'fsharp', 'fsharp-wasm', + 'fanak', 'haskell', 'haskell-wasm', 'scheme', diff --git a/src/livecodes/i18n/locales/en/translation.lokalise.json b/src/livecodes/i18n/locales/en/translation.lokalise.json index d417ff545f..88c5bd8031 100644 --- a/src/livecodes/i18n/locales/en/translation.lokalise.json +++ b/src/livecodes/i18n/locales/en/translation.lokalise.json @@ -2624,6 +2624,10 @@ "notes": "", "translation": "Elm Starter" }, + "templates.starter.fanak": { + "notes": "", + "translation": "Fanak Starter" + }, "templates.starter.fennel": { "notes": "", "translation": "Fennel Starter" diff --git a/src/livecodes/i18n/locales/en/translation.ts b/src/livecodes/i18n/locales/en/translation.ts index a5043674df..d9b46c1138 100644 --- a/src/livecodes/i18n/locales/en/translation.ts +++ b/src/livecodes/i18n/locales/en/translation.ts @@ -1002,6 +1002,7 @@ const translation = { daisyui: 'daisyUI Starter', diagrams: 'Diagrams Starter', elm: 'Elm Starter', + fanak: 'Fanak Starter', fennel: 'Fennel Starter', fsharp: 'F# Starter', 'fsharp-wasm': 'F# (Wasm) Starter', diff --git a/src/livecodes/languages/fanak/index.ts b/src/livecodes/languages/fanak/index.ts new file mode 100644 index 0000000000..3d5b05e0c4 --- /dev/null +++ b/src/livecodes/languages/fanak/index.ts @@ -0,0 +1 @@ +export * from './lang-fanak'; diff --git a/src/livecodes/languages/fanak/lang-fanak-script.ts b/src/livecodes/languages/fanak/lang-fanak-script.ts new file mode 100644 index 0000000000..efe87bbd1c --- /dev/null +++ b/src/livecodes/languages/fanak/lang-fanak-script.ts @@ -0,0 +1,161 @@ +import { fanakBaseUrl } from '../../vendors'; + +declare const livecodes: any; + +declare global { + interface Window { + DotNet: any; + Blazor: { start: (options: any) => Promise }; + } +} + +livecodes.fanak ??= {}; +livecodes.fanak.ready = false; + +const sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); + +const waitFor = async (condition: () => boolean | Promise, timeout = 60_000) => { + const startTime = Date.now(); + while (!(await condition())) { + if (Date.now() - startTime > timeout) return false; + await sleep(100); + } + return true; +}; + +/** + * Only patches Blazor's fetches with `credentials: 'omit'`, so a cross-origin + * compiler URL does not send cookies (mirrors the C# (Wasm) integration). + */ +const patchFetch = () => { + const originalFetch = window.fetch; + window.fetch = (resource: string | Request | URL, init = {}) => { + const url = + typeof resource === 'string' + ? resource + : 'url' in resource // Request + ? resource.url + : resource.href; // URL + if (url.startsWith(fanakBaseUrl)) { + return originalFetch(resource, { ...init, credentials: 'omit' as RequestCredentials }); + } + return originalFetch(resource, init); + }; +}; + +const loadBlazorScript = () => + new Promise((resolve, reject) => { + const scriptSrc = `${fanakBaseUrl}_framework/blazor.webassembly.js`; + if (document.querySelector(`script[src="${scriptSrc}"]`)) { + resolve(); + return; + } + const script = document.createElement('script'); + script.src = scriptSrc; + script.setAttribute('autostart', 'false'); + script.onload = () => resolve(); + script.onerror = (err) => reject(new Error(`Failed to load Blazor script: ${err}`)); + document.head.appendChild(script); + }); + +const isReady = async () => { + try { + await window.DotNet.invokeMethodAsync('Fanak.Runner', 'RunCode', 'Unit main() { }', ''); + return true; + } catch { + return false; + } +}; + +const runFanakCode = async ( + code: string, + input = '', +): Promise<{ output: string | null; error: string | null }> => { + await livecodes.fanak.init; + try { + const { output, errors } = await window.DotNet.invokeMethodAsync( + 'Fanak.Runner', + 'RunCode', + code, + input, + ); + return { output: output ?? null, error: errors ?? null }; + } catch (err) { + return { output: null, error: 'Error: ' + (err as Error).message }; + } +}; + +livecodes.fanak.init ??= (async () => { + if (livecodes.fanak.ready) return; + + // eslint-disable-next-line no-console + console.log('Initializing Fanak environment...'); + parent.postMessage({ type: 'loading', payload: true }, '*'); + try { + await loadBlazorScript(); + + if (!window.Blazor) throw new Error('Blazor failed to load properly'); + + patchFetch(); + await window.Blazor.start({ + loadBootResource: (_type: string, name: string) => `${fanakBaseUrl}_framework/${name}`, + }); + + if (!(await waitFor(isReady))) { + throw new Error('Timeout waiting for the Fanak runner to be ready'); + } + + // eslint-disable-next-line no-console + console.log('Fanak environment initialized successfully'); + } catch (err) { + // eslint-disable-next-line no-console + console.error('Failed to initialize Fanak environment:', err); + livecodes.fanak.ready = false; + livecodes.fanak.init = null; + throw err; + } finally { + parent.postMessage({ type: 'loading', payload: false }, '*'); + } +})(); + +livecodes.fanak.run ??= async (input?: string) => { + let code = ''; + livecodes.fanak.input = input; + livecodes.fanak.output = null; + livecodes.fanak.ready = false; + const scripts = document.querySelectorAll('script[type="text/fanak"]'); + scripts.forEach((script) => (code += script.innerHTML + '\n')); + + const { output, error } = !code.trim() + ? { output: null, error: null } + : await runFanakCode(code, input); + + if (error != null) { + // eslint-disable-next-line no-console + console.error(error); + } else if (output != null) { + // eslint-disable-next-line no-console + console.log(output); + } + + livecodes.fanak.output = output; + livecodes.fanak.error = error; + livecodes.fanak.exitCode = error ? 1 : 0; + livecodes.fanak.ready = true; + return { output, error, exitCode: error ? 1 : 0 }; +}; + +livecodes.fanak.loaded = new Promise((resolve) => { + const interval = setInterval(() => { + if (livecodes.fanak.ready) { + clearInterval(interval); + resolve(); + } + }, 50); +}); + +window.addEventListener('load', async () => { + parent.postMessage({ type: 'loading', payload: true }, '*'); + await livecodes.fanak.run(livecodes.fanak.input); + parent.postMessage({ type: 'loading', payload: false }, '*'); +}); diff --git a/src/livecodes/languages/fanak/lang-fanak.ts b/src/livecodes/languages/fanak/lang-fanak.ts new file mode 100644 index 0000000000..5b1fdcfb04 --- /dev/null +++ b/src/livecodes/languages/fanak/lang-fanak.ts @@ -0,0 +1,31 @@ +import { codemirrorLegacy } from '../../editor/codemirror/utils'; +import type { LanguageSpecs } from '../../models'; +import { codeMirrorBaseUrl, monacoLanguagesBaseUrl } from '../../vendors'; + +export const fanak: LanguageSpecs = { + name: 'fanak', + title: 'Fanak', + compiler: { + // The compiler runs in a Blazor WASM runner that is fetched from + // `fanakBaseUrl` at run time (see lang-fanak-script.ts); LiveCodes just + // hands the source through and the runner reports output/errors. + factory: () => async (code) => code, + scripts: ({ baseUrl }) => [baseUrl + '{{hash:lang-fanak-script.js}}'], + scriptType: 'text/fanak', + compiledCodeLanguage: 'fanak', + liveReload: true, + }, + extensions: ['fnk', 'fanak'], + editor: 'script', + editorSupport: { + // Fanak's syntax is C-like (`Unit main() { ... }`), so reuse the C# + // highlighting until a dedicated Monarch grammar is added. + monaco: { languageSupport: monacoLanguagesBaseUrl + 'csharp.js', language: 'csharp' }, + codemirror: { + languageSupport: async () => + codemirrorLegacy((await import(codeMirrorBaseUrl + 'codemirror-lang-clike.js')).csharp), + }, + codejar: { language: 'csharp' }, + }, + largeDownload: true, +}; diff --git a/src/livecodes/languages/languages.ts b/src/livecodes/languages/languages.ts index 6e1ebd25dc..8e2c250cae 100644 --- a/src/livecodes/languages/languages.ts +++ b/src/livecodes/languages/languages.ts @@ -20,6 +20,7 @@ import { dot } from './dot'; import { ejs } from './ejs'; import { elm } from './elm'; import { eta } from './eta'; +import { fanak } from './fanak'; import { fennel } from './fennel'; import { flow } from './flow'; import { fsharp } from './fsharp'; @@ -169,6 +170,7 @@ export const languages: LanguageSpecs[] = [ vbWasm, fsharp, fsharpWasm, + fanak, haskell, haskellWasm, scheme, diff --git a/src/livecodes/models.ts b/src/livecodes/models.ts index 28509cae32..51311f3bff 100644 --- a/src/livecodes/models.ts +++ b/src/livecodes/models.ts @@ -204,6 +204,7 @@ export interface Compiler { | 'text/zig-wasm' | 'text/java' | 'text/csharp-wasm' + | 'text/fanak' | 'text/vb-wasm' | 'text/fsharp-wasm' | 'text/perl' diff --git a/src/livecodes/templates/starter/fanak-starter.ts b/src/livecodes/templates/starter/fanak-starter.ts new file mode 100644 index 0000000000..22c00031f0 --- /dev/null +++ b/src/livecodes/templates/starter/fanak-starter.ts @@ -0,0 +1,49 @@ +import type { Template } from '../../models'; + +export const fanakStarter: Template = { + name: 'fanak', + title: window.deps.translateString('templates.starter.fanak', 'Fanak Starter'), + thumbnail: 'assets/templates/csharp.svg', + activeEditor: 'script', + markup: { + language: 'html', + content: ` +
+

Fanak

+
Loading...
+
+ + +`.trimStart(), + }, + style: { + language: 'css', + content: ` +.container { + font: 1em sans-serif; +} +#output { + background: #f4f4f4; + padding: 1em; + border-radius: 4px; +} +`.trimStart(), + }, + script: { + language: 'fanak', + content: ` +Unit main() { + println("Hello, Fanak!"); + int answer = 6 * 7; + println(answer); +} +`.trimStart(), + }, +}; diff --git a/src/livecodes/templates/starter/index.ts b/src/livecodes/templates/starter/index.ts index 17fb1ae421..d6577dc362 100644 --- a/src/livecodes/templates/starter/index.ts +++ b/src/livecodes/templates/starter/index.ts @@ -19,6 +19,7 @@ import { d3Starter } from './d3-starter'; import { daisyuiStarter } from './daisyui-starter'; import { diagramsStarter } from './diagrams-starter'; import { elmStarter } from './elm-starter'; +import { fanakStarter } from './fanak-starter'; import { fennelStarter } from './fennel-starter'; import { fsharpStarter } from './fsharp-starter'; import { fsharpWasmStarter } from './fsharp-wasm-starter'; @@ -137,6 +138,7 @@ export const starterTemplates = [ vbWasmStarter, fsharpStarter, fsharpWasmStarter, + fanakStarter, haskellStarter, haskellWasmStarter, schemeStarter, diff --git a/src/livecodes/vendors.ts b/src/livecodes/vendors.ts index 57e0be7c3f..093e7e4340 100644 --- a/src/livecodes/vendors.ts +++ b/src/livecodes/vendors.ts @@ -142,6 +142,19 @@ export const esModuleShimsPath = 'es-module-shims@1.10.0/dist/es-module-shims.js export const etaUrl = /* @__PURE__ */ getUrl('eta@3.4.0/dist/eta.umd.js'); +/** + * Base URL of the Fanak compiler runner (a Blazor WASM bundle). + * + * Published to GitLab Pages by the Fanak repo's `pages` CI job: `latest/` is + * refreshed on every release (and `main`), and each tag is also published + * immutably under `runner//`. + * + * Local development: build and serve the runner from the Fanak repo with + * `make runner-serve` (http://127.0.0.1:8081/) and switch the value below. + */ +export const fanakBaseUrl = 'https://ahmedwael216.gitlab.io/fanak/runner/latest/'; +// export const fanakBaseUrl = 'http://127.0.0.1:8081/'; + export const fflateUrl = /* @__PURE__ */ getUrl('fflate@0.8.1/esm/browser.js'); export const flexSearchUrl = /* @__PURE__ */ getUrl('flexsearch@0.7.21/dist/flexsearch.bundle.js'); diff --git a/src/sdk/models.ts b/src/sdk/models.ts index 9755564ab0..c3457e4e17 100644 --- a/src/sdk/models.ts +++ b/src/sdk/models.ts @@ -213,6 +213,8 @@ export type Language = | 'fs-wasm' | 'wasm.fs' | 'wasm.fsx' + | 'fanak' + | 'fnk' | 'rust' | 'rs' | 'rust-wasm' @@ -447,6 +449,7 @@ export type TemplateName = | 'vb-wasm' | 'fsharp' | 'fsharp-wasm' + | 'fanak' | 'rust-wasm' | 'zig-wasm' | 'perl' @@ -848,6 +851,7 @@ export type CustomSettings = Partial< | 'text/objcpp-wasm' | 'text/java' | 'text/csharp-wasm' + | 'text/fanak' | 'text/vb-wasm' | 'text/perl' | 'text/julia' From acced188f1bfa165a0ece19bacf6bb2e78390c6e Mon Sep 17 00:00:00 2001 From: Ahmed Wael Date: Sun, 27 Sep 2026 19:01:55 +0300 Subject: [PATCH 2/8] fix(fanak): address review feedback and use the IO effect idiom - starter: run console effects with `runUnit(println(...))`. Console operations are `IO` effects in the current prelude and must be run; bare `println` statements in `Unit main()` are discarded, which produced empty output. - loader (`lang-fanak-script.ts`): post status updates to the app origin (`parentOrigin`) instead of `'*'`; surface boot failures by rejecting `loaded` and setting a `failed`/`error` state; guard `window.DotNet`; use `getErrorMessage`; and ignore results from superseded concurrent runs. - add a dedicated `fanak.png` starter icon (was reusing the C# one). - add the language-info panel section and docs LanguageSliders/TemplateList entries, with the generated en `language-info` i18n keys. --- docs/src/components/LanguageSliders.tsx | 1 + docs/src/components/TemplateList.tsx | 1 + src/livecodes/assets/templates/fanak.png | Bin 0 -> 77728 bytes src/livecodes/html/language-info.html | 25 ++++ .../locales/en/language-info.lokalise.json | 12 ++ .../i18n/locales/en/language-info.ts | 5 + .../languages/fanak/lang-fanak-script.ts | 111 ++++++++++++------ .../templates/starter/fanak-starter.ts | 18 +-- src/livecodes/vendors.ts | 11 -- 9 files changed, 133 insertions(+), 51 deletions(-) create mode 100644 src/livecodes/assets/templates/fanak.png diff --git a/docs/src/components/LanguageSliders.tsx b/docs/src/components/LanguageSliders.tsx index 4d2e249cde..f2c703af49 100644 --- a/docs/src/components/LanguageSliders.tsx +++ b/docs/src/components/LanguageSliders.tsx @@ -101,6 +101,7 @@ export default function Sliders() { { name: 'vb-wasm', title: 'VB.NET (Wasm)' }, { name: 'fsharp', title: 'F#' }, { name: 'fsharp-wasm', title: 'F# (Wasm)' }, + { name: 'fanak', title: 'Fanak' }, { name: 'scheme', title: 'Scheme' }, { name: 'commonlisp', title: 'Lisp' }, { name: 'clojurescript', title: 'CLJS' }, diff --git a/docs/src/components/TemplateList.tsx b/docs/src/components/TemplateList.tsx index 21315e9be2..4eb65108a6 100644 --- a/docs/src/components/TemplateList.tsx +++ b/docs/src/components/TemplateList.tsx @@ -59,6 +59,7 @@ const templates = [ { name: 'vb-wasm', title: 'VB.NET (Wasm)', thumbnail: 'vb.svg' }, { name: 'fsharp', title: 'F# Starter', thumbnail: 'fsharp.svg' }, { name: 'fsharp-wasm', title: 'F# (Wasm) Starter', thumbnail: 'fsharp.svg' }, + { name: 'fanak', title: 'Fanak Starter', thumbnail: 'fanak.png' }, { name: 'scheme', title: 'Scheme Starter', thumbnail: 'scheme.svg' }, { name: 'commonlisp', title: 'Common Lisp Starter', thumbnail: 'commonlisp.svg' }, { name: 'clojurescript', title: 'ClojureScript Starter', thumbnail: 'cljs.svg' }, diff --git a/src/livecodes/assets/templates/fanak.png b/src/livecodes/assets/templates/fanak.png new file mode 100644 index 0000000000000000000000000000000000000000..879f4e1462c4f8dfaaf7119ba81c207f94311767 GIT binary patch literal 77728 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%0D~L^ui$@ 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

tv9 zvV+_%cG)CBPkjB}pwZGVWH2i0g@xS3-+Tc2tBVvsA2b<-iMweovVr86fYy@K94FeS ztcyq-dC6282T;+;-u`rhnD&kcYc+H!K-hnj1sy`naG}iSSo;;zD573?|K7dlsT^}u z+Ar>8j@;+KF{THP=SI}^>*W)}!_+0NjLrmn4XqA{j0=~Cc2pC1cq3$bbAA;LFqRy} zc!y9It0({D&w5qGK#g6b#K&<31dCPiWgenijo6Qhn3(1kXf=*aj*l}FNjoBSeafbk?<@aiS-XtZD7!(#v-CL8ilECuKzlmE0$y(rdlvg>PAF{yB zDk>@$1)?NWz&_W{9oBmI`7XaE15+)B7{efT5F3n}<1nbZhiI=!z7AmR5C-z1oFUHo z0p5jgDBl@_UE-)flovc9GaM0Z)HP5D(PgweIgQ^Vk4M;-cBS;a>`iYaW%kwtLT&L1 zzosRo2T2Tv=1?27IRrHD<(a}vM>gYNZN;~v4He2OWUto?96VTWa9_{E?`V1-z`?hu z>xNndg%$G1yIs|pAHqXzMtP{WEP6eW{U@Ahof(liM!6Hoe2mWac#HTL$(i=_|JVM- zIt$-~K)bHGF# (Wasm) +

+

Fanak

+
+ Fanak is a functional programming language that compiles to CIL (.NET). Its compiler and .NET + WebAssembly runtime run entirely in the browser, fetched from the Fanak project, so the first + run downloads the runtime and can take a moment. +
+ +

Gleam

diff --git a/src/livecodes/i18n/locales/en/language-info.lokalise.json b/src/livecodes/i18n/locales/en/language-info.lokalise.json index b9849f399a..8bbc04b5f9 100644 --- a/src/livecodes/i18n/locales/en/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/en/language-info.lokalise.json @@ -264,6 +264,18 @@ "notes": "", "translation": "Eta" }, + "fanak.desc": { + "notes": "", + "translation": "Fanak is a functional programming language that compiles to CIL (.NET). Its compiler and .NET WebAssembly runtime run entirely in the browser, fetched from the Fanak project, so the first run downloads the runtime and can take a moment." + }, + "fanak.link": { + "notes": "### ###\n
  • \n\n### ###\n\n\n### ###\n
  • \n\n### ###\n\n\n### ###\n
  • \n\n### ###\n\n\n", + "translation": " Fanak repository Fanak documentation Load starter template " + }, + "fanak.name": { + "notes": "", + "translation": "Fanak" + }, "fennel.desc": { "notes": "", "translation": "Fennel is a programming language that brings together the speed, simplicity, and reach of Lua with the flexibility of a lisp syntax and macro system." diff --git a/src/livecodes/i18n/locales/en/language-info.ts b/src/livecodes/i18n/locales/en/language-info.ts index c042a288f8..67df2b0cf7 100644 --- a/src/livecodes/i18n/locales/en/language-info.ts +++ b/src/livecodes/i18n/locales/en/language-info.ts @@ -120,6 +120,11 @@ const languageInfo = { link: '<1><2>Official website <3> <4>Documentation <5> <6>LiveCodes Documentations ', name: 'Eta', }, + fanak: { + desc: 'Fanak is a functional programming language that compiles to CIL (.NET). Its compiler and .NET WebAssembly runtime run entirely in the browser, fetched from the Fanak project, so the first run downloads the runtime and can take a moment.', + link: '<1> <2>Fanak repository <3> <4>Fanak documentation <5> <6>Load starter template ', + name: 'Fanak', + }, fennel: { desc: 'Fennel is a programming language that brings together the speed, simplicity, and reach of Lua with the flexibility of a lisp syntax and macro system.', link: '<1> <2>Fennel official website <3> <4>Getting Started with Fennel <5> <6>LiveCodes Documentations <7> <8>Load starter template ', diff --git a/src/livecodes/languages/fanak/lang-fanak-script.ts b/src/livecodes/languages/fanak/lang-fanak-script.ts index efe87bbd1c..72816c348d 100644 --- a/src/livecodes/languages/fanak/lang-fanak-script.ts +++ b/src/livecodes/languages/fanak/lang-fanak-script.ts @@ -1,3 +1,4 @@ +import { getErrorMessage } from '../../utils'; import { fanakBaseUrl } from '../../vendors'; declare const livecodes: any; @@ -23,6 +24,28 @@ const waitFor = async (condition: () => boolean | Promise, timeout = 60 return true; }; +// The result runs in an iframe; post status updates to the app origin. Mirrors +// the other WASM language scripts (`haskell-wasm`). +const parentOrigin = + window.parent === window + ? window.location.origin + : window.location.ancestorOrigins?.[0] || + (() => { + if (!document.referrer) return '*'; + try { + return new URL(document.referrer).origin; + } catch { + // Ignore malformed referrers and use the wildcard fallback below. + return '*'; + } + })(); + +let activeRuns = 0; +const postLoading = (payload: boolean) => { + activeRuns += payload ? 1 : -1; + parent.postMessage({ type: 'loading', payload: activeRuns > 0 }, parentOrigin); // NOSONAR - fallback is safe with source/origin checks in the parent. +}; + /** * Only patches Blazor's fetches with `credentials: 'omit'`, so a cross-origin * compiler URL does not send cookies (mirrors the C# (Wasm) integration). @@ -54,11 +77,13 @@ const loadBlazorScript = () => script.src = scriptSrc; script.setAttribute('autostart', 'false'); script.onload = () => resolve(); - script.onerror = (err) => reject(new Error(`Failed to load Blazor script: ${err}`)); + script.onerror = () => + reject(new Error(`Failed to load the Fanak compiler bundle from ${scriptSrc}`)); document.head.appendChild(script); }); const isReady = async () => { + if (!window.DotNet) return false; try { await window.DotNet.invokeMethodAsync('Fanak.Runner', 'RunCode', 'Unit main() { }', ''); return true; @@ -67,34 +92,18 @@ const isReady = async () => { } }; -const runFanakCode = async ( - code: string, - input = '', -): Promise<{ output: string | null; error: string | null }> => { - await livecodes.fanak.init; - try { - const { output, errors } = await window.DotNet.invokeMethodAsync( - 'Fanak.Runner', - 'RunCode', - code, - input, - ); - return { output: output ?? null, error: errors ?? null }; - } catch (err) { - return { output: null, error: 'Error: ' + (err as Error).message }; - } -}; - livecodes.fanak.init ??= (async () => { if (livecodes.fanak.ready) return; // eslint-disable-next-line no-console console.log('Initializing Fanak environment...'); - parent.postMessage({ type: 'loading', payload: true }, '*'); + postLoading(true); try { await loadBlazorScript(); - if (!window.Blazor) throw new Error('Blazor failed to load properly'); + if (!window.Blazor) { + throw new Error(`The Fanak compiler bundle at ${fanakBaseUrl} did not load`); + } patchFetch(); await window.Blazor.start({ @@ -102,34 +111,64 @@ livecodes.fanak.init ??= (async () => { }); if (!(await waitFor(isReady))) { - throw new Error('Timeout waiting for the Fanak runner to be ready'); + throw new Error(`Timed out waiting for the Fanak runner at ${fanakBaseUrl}`); } // eslint-disable-next-line no-console console.log('Fanak environment initialized successfully'); } catch (err) { + livecodes.fanak.ready = false; + livecodes.fanak.failed = true; + livecodes.fanak.error = getErrorMessage(err); // eslint-disable-next-line no-console console.error('Failed to initialize Fanak environment:', err); - livecodes.fanak.ready = false; - livecodes.fanak.init = null; throw err; } finally { - parent.postMessage({ type: 'loading', payload: false }, '*'); + postLoading(false); } })(); +const runFanakCode = async ( + code: string, + input = '', +): Promise<{ output: string | null; error: string | null }> => { + try { + await livecodes.fanak.init; + if (livecodes.fanak.failed) { + throw new Error(livecodes.fanak.error || 'Fanak runner failed to initialize'); + } + const { output, errors } = await window.DotNet.invokeMethodAsync( + 'Fanak.Runner', + 'RunCode', + code, + input, + ); + return { output: output ?? null, error: errors ?? null }; + } catch (err) { + return { output: null, error: 'Error: ' + getErrorMessage(err) }; + } +}; + +let runSequence = 0; + livecodes.fanak.run ??= async (input?: string) => { - let code = ''; + const runId = ++runSequence; livecodes.fanak.input = input; livecodes.fanak.output = null; livecodes.fanak.ready = false; - const scripts = document.querySelectorAll('script[type="text/fanak"]'); - scripts.forEach((script) => (code += script.innerHTML + '\n')); + + let code = ''; + document + .querySelectorAll('script[type="text/fanak"]') + .forEach((script) => (code += script.innerHTML + '\n')); const { output, error } = !code.trim() ? { output: null, error: null } : await runFanakCode(code, input); + // A newer run started while this one was awaiting; keep the newer result. + if (runId !== runSequence) return { output: null, error: null, exitCode: 0 }; + if (error != null) { // eslint-disable-next-line no-console console.error(error); @@ -145,9 +184,12 @@ livecodes.fanak.run ??= async (input?: string) => { return { output, error, exitCode: error ? 1 : 0 }; }; -livecodes.fanak.loaded = new Promise((resolve) => { +livecodes.fanak.loaded = new Promise((resolve, reject) => { const interval = setInterval(() => { - if (livecodes.fanak.ready) { + if (livecodes.fanak.failed) { + clearInterval(interval); + reject(new Error(livecodes.fanak.error || 'Failed to initialize the Fanak environment')); + } else if (livecodes.fanak.ready) { clearInterval(interval); resolve(); } @@ -155,7 +197,10 @@ livecodes.fanak.loaded = new Promise((resolve) => { }); window.addEventListener('load', async () => { - parent.postMessage({ type: 'loading', payload: true }, '*'); - await livecodes.fanak.run(livecodes.fanak.input); - parent.postMessage({ type: 'loading', payload: false }, '*'); + postLoading(true); + try { + await livecodes.fanak.run(livecodes.fanak.input); + } finally { + postLoading(false); + } }); diff --git a/src/livecodes/templates/starter/fanak-starter.ts b/src/livecodes/templates/starter/fanak-starter.ts index 22c00031f0..d7189b67da 100644 --- a/src/livecodes/templates/starter/fanak-starter.ts +++ b/src/livecodes/templates/starter/fanak-starter.ts @@ -3,7 +3,7 @@ import type { Template } from '../../models'; export const fanakStarter: Template = { name: 'fanak', title: window.deps.translateString('templates.starter.fanak', 'Fanak Starter'), - thumbnail: 'assets/templates/csharp.svg', + thumbnail: 'assets/templates/fanak.png', activeEditor: 'script', markup: { language: 'html', @@ -15,10 +15,14 @@ export const fanakStarter: Template = { `.trimStart(), @@ -40,9 +44,9 @@ export const fanakStarter: Template = { language: 'fanak', content: ` Unit main() { - println("Hello, Fanak!"); + runUnit(println("Hello, Fanak!")); int answer = 6 * 7; - println(answer); + runUnit(println(answer)); } `.trimStart(), }, diff --git a/src/livecodes/vendors.ts b/src/livecodes/vendors.ts index 093e7e4340..41594b6256 100644 --- a/src/livecodes/vendors.ts +++ b/src/livecodes/vendors.ts @@ -142,18 +142,7 @@ export const esModuleShimsPath = 'es-module-shims@1.10.0/dist/es-module-shims.js export const etaUrl = /* @__PURE__ */ getUrl('eta@3.4.0/dist/eta.umd.js'); -/** - * Base URL of the Fanak compiler runner (a Blazor WASM bundle). - * - * Published to GitLab Pages by the Fanak repo's `pages` CI job: `latest/` is - * refreshed on every release (and `main`), and each tag is also published - * immutably under `runner//`. - * - * Local development: build and serve the runner from the Fanak repo with - * `make runner-serve` (http://127.0.0.1:8081/) and switch the value below. - */ export const fanakBaseUrl = 'https://ahmedwael216.gitlab.io/fanak/runner/latest/'; -// export const fanakBaseUrl = 'http://127.0.0.1:8081/'; export const fflateUrl = /* @__PURE__ */ getUrl('fflate@0.8.1/esm/browser.js'); From 393f338798656aa76fa0fdc7e06b90a81eedf02e Mon Sep 17 00:00:00 2001 From: Ahmed Wael Date: Sun, 27 Sep 2026 19:39:08 +0300 Subject: [PATCH 3/8] fix(fanak): show runner errors even when output is empty A panic with no prior output returns `output: ''` and a non-null `errors`; `output ?? error` selected the empty string. Combine both (output then error), filtering empties. --- src/livecodes/templates/starter/fanak-starter.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/livecodes/templates/starter/fanak-starter.ts b/src/livecodes/templates/starter/fanak-starter.ts index d7189b67da..6bb3846fb9 100644 --- a/src/livecodes/templates/starter/fanak-starter.ts +++ b/src/livecodes/templates/starter/fanak-starter.ts @@ -19,7 +19,10 @@ export const fanakStarter: Template = { try { // wait till the compiler + program have run await livecodes.fanak.loaded; - output.innerText = livecodes.fanak.output ?? livecodes.fanak.error ?? ''; + // Show the error even when the program printed nothing (e.g. a panic), + // while keeping any partial output. + const parts = [livecodes.fanak.output, livecodes.fanak.error].filter(Boolean); + output.innerText = parts.join('\n'); } catch (err) { output.innerText = 'Failed to load the Fanak compiler: ' + (err && err.message ? err.message : err); } From b6f48b9443a8e6496c51f983ae9ceb9a3b6200d3 Mon Sep 17 00:00:00 2001 From: Ahmed Wael Date: Sun, 27 Sep 2026 19:39:08 +0300 Subject: [PATCH 4/8] feat(fanak): load Fanak's own Monaco support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the placeholder C# highlighting with the Fanak Monaco module fetched from the Fanak Pages (`fanakMonacoUrl`): Monarch highlighting, snippets and completion, hover, go-to-definition, rename, symbol outline and folding. The module import is fail-soft — if it is not reachable yet, register the language barely so the editor stays usable. --- src/livecodes/languages/fanak/lang-fanak.ts | 16 ++++++++++++---- src/livecodes/vendors.ts | 2 ++ 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/livecodes/languages/fanak/lang-fanak.ts b/src/livecodes/languages/fanak/lang-fanak.ts index 5b1fdcfb04..1ac5e685f0 100644 --- a/src/livecodes/languages/fanak/lang-fanak.ts +++ b/src/livecodes/languages/fanak/lang-fanak.ts @@ -1,6 +1,6 @@ import { codemirrorLegacy } from '../../editor/codemirror/utils'; import type { LanguageSpecs } from '../../models'; -import { codeMirrorBaseUrl, monacoLanguagesBaseUrl } from '../../vendors'; +import { codeMirrorBaseUrl, fanakMonacoUrl } from '../../vendors'; export const fanak: LanguageSpecs = { name: 'fanak', @@ -18,9 +18,17 @@ export const fanak: LanguageSpecs = { extensions: ['fnk', 'fanak'], editor: 'script', editorSupport: { - // Fanak's syntax is C-like (`Unit main() { ... }`), so reuse the C# - // highlighting until a dedicated Monarch grammar is added. - monaco: { languageSupport: monacoLanguagesBaseUrl + 'csharp.js', language: 'csharp' }, + monaco: { + language: 'fanak', + languageSupport: async (monaco: any) => { + try { + const module = await import(/* @vite-ignore */ fanakMonacoUrl); + await module.default?.(monaco, () => undefined); + } catch { + monaco.languages.register({ id: 'fanak' }); + } + }, + }, codemirror: { languageSupport: async () => codemirrorLegacy((await import(codeMirrorBaseUrl + 'codemirror-lang-clike.js')).csharp), diff --git a/src/livecodes/vendors.ts b/src/livecodes/vendors.ts index 41594b6256..727d14d148 100644 --- a/src/livecodes/vendors.ts +++ b/src/livecodes/vendors.ts @@ -144,6 +144,8 @@ export const etaUrl = /* @__PURE__ */ getUrl('eta@3.4.0/dist/eta.umd.js'); export const fanakBaseUrl = 'https://ahmedwael216.gitlab.io/fanak/runner/latest/'; +export const fanakMonacoUrl = 'https://ahmedwael216.gitlab.io/fanak/monaco/fanak.js'; + export const fflateUrl = /* @__PURE__ */ getUrl('fflate@0.8.1/esm/browser.js'); export const flexSearchUrl = /* @__PURE__ */ getUrl('flexsearch@0.7.21/dist/flexsearch.bundle.js'); From 2a654def380d49cb6457ef2bc96311037c908e61 Mon Sep 17 00:00:00 2001 From: Ahmed Wael Date: Tue, 29 Sep 2026 21:51:48 +0300 Subject: [PATCH 5/8] fix(fanak): pass the compiler URL to Monaco and fix the starter newline Hand the Fanak compiler URL to the Monaco language-support module as an explicit option (`{ baseUrl }`) instead of a global, so the module can reach the compiler for formatting, diagnostics and compiler-backed symbols. The starter's markup is a TS template literal, so `'\n'` was emitted as a real newline inside the result script, making it a syntax error; emit the two characters `\n` instead. --- src/livecodes/languages/fanak/lang-fanak.ts | 8 ++++++-- src/livecodes/templates/starter/fanak-starter.ts | 2 +- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/livecodes/languages/fanak/lang-fanak.ts b/src/livecodes/languages/fanak/lang-fanak.ts index 1ac5e685f0..a7011ab8dd 100644 --- a/src/livecodes/languages/fanak/lang-fanak.ts +++ b/src/livecodes/languages/fanak/lang-fanak.ts @@ -1,6 +1,6 @@ import { codemirrorLegacy } from '../../editor/codemirror/utils'; import type { LanguageSpecs } from '../../models'; -import { codeMirrorBaseUrl, fanakMonacoUrl } from '../../vendors'; +import { codeMirrorBaseUrl, fanakBaseUrl, fanakMonacoUrl } from '../../vendors'; export const fanak: LanguageSpecs = { name: 'fanak', @@ -22,8 +22,12 @@ export const fanak: LanguageSpecs = { language: 'fanak', languageSupport: async (monaco: any) => { try { + // The Monaco module runs the Fanak compiler (served from + // `fanakBaseUrl`) in a hidden frame for formatting, diagnostics and + // compiler-backed symbols. Hand it the URL as an explicit option; + // without it the module falls back to its offline heuristics. const module = await import(/* @vite-ignore */ fanakMonacoUrl); - await module.default?.(monaco, () => undefined); + await module.default?.(monaco, () => undefined, { baseUrl: fanakBaseUrl }); } catch { monaco.languages.register({ id: 'fanak' }); } diff --git a/src/livecodes/templates/starter/fanak-starter.ts b/src/livecodes/templates/starter/fanak-starter.ts index 6bb3846fb9..2945527cf2 100644 --- a/src/livecodes/templates/starter/fanak-starter.ts +++ b/src/livecodes/templates/starter/fanak-starter.ts @@ -22,7 +22,7 @@ export const fanakStarter: Template = { // Show the error even when the program printed nothing (e.g. a panic), // while keeping any partial output. const parts = [livecodes.fanak.output, livecodes.fanak.error].filter(Boolean); - output.innerText = parts.join('\n'); + output.innerText = parts.join('\\n'); } catch (err) { output.innerText = 'Failed to load the Fanak compiler: ' + (err && err.message ? err.message : err); } From cf75aebd6ff01e4da9d916c88bb36ab084a4cf8d Mon Sep 17 00:00:00 2001 From: Ahmed Wael Date: Thu, 1 Oct 2026 06:20:31 +0300 Subject: [PATCH 6/8] docs(fanak): add the language doc page, vendor license and bump the badge - docs/docs/languages/fanak.mdx: usage demo, language info, compiler, code formatting, live reload, example and links. Docusaurus autogenerates the languages sidebar, so no config change is needed. - vendor-licenses.md: list the Fanak compiler (Apache License 2.0). - README.md: language-count badge 110 -> 111. --- README.md | 2 +- docs/docs/languages/fanak.mdx | 94 +++++++++++++++++++++++++++++++++++ vendor-licenses.md | 2 + 3 files changed, 97 insertions(+), 1 deletion(-) create mode 100644 docs/docs/languages/fanak.mdx diff --git a/README.md b/README.md index 22186ae7a2..29b061bfdb 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-110-blue)](https://livecodes.io/docs/languages/) +[![LiveCodes: languages](https://img.shields.io/badge/languages-111-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/fanak.mdx b/docs/docs/languages/fanak.mdx new file mode 100644 index 0000000000..a6abfd3973 --- /dev/null +++ b/docs/docs/languages/fanak.mdx @@ -0,0 +1,94 @@ +# Fanak + +Fanak is a functional programming language that compiles to CIL (.NET). It has +algebraic data types with pattern matching, typeclasses, higher-order functions +and a small effectful standard library. + +In LiveCodes, Fanak compiles and runs entirely in the browser: the Fanak +compiler and a .NET WebAssembly runtime (Blazor WebAssembly) are fetched from +the Fanak project, the program's assembly is emitted in memory, and the result +runs in the page. + +## Usage + +Demo: + +import LiveCodes from '../../src/components/LiveCodes.tsx'; +export const fanakConfig = { + activeEditor: 'script', + script: { + language: 'fanak', + content: `import std; + +Unit main() { + List xs = List.empty().add(1).add(2).add(3); + List tens = xs.iter().map((int x) => x * 10).toList(); + runUnit(println(tens)); +}`, + }, + mode: 'simple', + editor: 'auto', + tools: { + status: 'full', + }, +}; + + + +## Language Info + +### Name + +`fanak` + +### Aliases / Extensions + +`fnk`, `fanak` + +### Editor + +`script` + +## Compiler + +The Fanak compiler and .NET WebAssembly runtime (Blazor WebAssembly), fetched +from the [Fanak project](https://gitlab.com/AhmedWael216/fanak) and run entirely +in the browser. There is no server round-trip; the first run downloads the +runtime and can take a moment. + +The prelude is implicit in every file. The standard library is opt-in with +`import std;`. + +### Version + +0.1.0 + +## Code Formatting + +Using the Fanak compiler's own formatter. + +## 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 reinitialize the compiler. + +## Example Usage + +```fanak +import std; + +Unit main() { + // Options, lambdas and pattern matching + Option answer = Some(6 * 7); + runUnit(println(answer.getOr(0))); // 42 +} +``` + +## Starter Template + +https://livecodes.io/?template=fanak + +## Links + +- [Fanak](https://gitlab.com/AhmedWael216/fanak) +- [Fanak documentation](https://ahmedwael216.gitlab.io/fanak/) diff --git a/vendor-licenses.md b/vendor-licenses.md index 9f69e8528a..6bea72150a 100644 --- a/vendor-licenses.md +++ b/vendor-licenses.md @@ -86,6 +86,8 @@ Fable: [MIT License](https://github.com/fable-compiler/Fable/blob/67e8540a211832 F#: [MIT License](https://github.com/dotnet/fsharp/blob/df0e60991911eed31f861bb38403a389346055e2/License.txt) +Fanak: [Apache License 2.0](https://gitlab.com/AhmedWael216/fanak/-/blob/main/LICENSE) + .NET runtime: [MIT License](https://github.com/dotnet/runtime/blob/20f7be9ec07eafd5b756df30de33a9452c9e1c14/LICENSE.TXT) fengari-web: [MIT License](https://github.com/fengari-lua/fengari-web/blob/77d35f5e1516f431cbb96e165b4272f2fc9b0b3a/LICENSE) From 0ba6d26bb38ea107e5b08907dfbdd3f69b8718bf Mon Sep 17 00:00:00 2001 From: Ahmed Wael Date: Thu, 1 Oct 2026 08:12:46 +0300 Subject: [PATCH 7/8] =?UTF-8?q?docs(fanak):=20address=20review=20=E2=80=94?= =?UTF-8?q?=20docs=20link,=20formatter=20wording,=20JS=20interop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - language-info.html: add the "LiveCodes Documentation" link to the Fanak section and regenerate the English i18n files. - docs: clarify that formatting is provided by the Fanak language service in the Monaco editor (compiler-backed); it is not available in CodeMirror/CodeJar. - docs: document the livecodes.fanak JS interop (loaded/output/error/exitCode/run). --- docs/docs/languages/fanak.mdx | 23 ++++++++++++++++++- src/livecodes/html/language-info.html | 5 ++++ .../locales/en/language-info.lokalise.json | 4 ++-- .../i18n/locales/en/language-info.ts | 2 +- 4 files changed, 30 insertions(+), 4 deletions(-) diff --git a/docs/docs/languages/fanak.mdx b/docs/docs/languages/fanak.mdx index a6abfd3973..31ab6e828d 100644 --- a/docs/docs/languages/fanak.mdx +++ b/docs/docs/languages/fanak.mdx @@ -65,7 +65,28 @@ The prelude is implicit in every file. The standard library is opt-in with ## Code Formatting -Using the Fanak compiler's own formatter. +In the Monaco editor, formatting is provided by the Fanak language service +(compiler-backed, using the Fanak compiler's own formatter). It is not +available in the CodeMirror or CodeJar editors. + +## Communication with JavaScript + +The Fanak program runs in the context of the result page. A few helpers are +available on the browser global `livecodes.fanak` object: + +- `livecodes.fanak.loaded`: a promise that resolves when the compiler and the + program have finished running. +- `livecodes.fanak.output`: the program's standard output (a string), or `null`. +- `livecodes.fanak.error`: the program's error output (a string), or `null`. +- `livecodes.fanak.exitCode`: `0` on success, `1` on error. +- `livecodes.fanak.run`: re-runs the program and returns a promise resolving to an + object with `output`, `error` and `exitCode`. (It accepts an `input` argument + for host parity, but Fanak has no standard-input primitive yet, so it is + currently ignored.) + +Example: + + ## Live Reload diff --git a/src/livecodes/html/language-info.html b/src/livecodes/html/language-info.html index 7f4088f0e2..fc54b1d23f 100644 --- a/src/livecodes/html/language-info.html +++ b/src/livecodes/html/language-info.html @@ -799,6 +799,11 @@

    Fanak

    >Fanak documentation
  • +
  • + LiveCodes Documentation +
  • Load starter template ###\n
  • \n\n### ###\n\n\n### ###\n
  • \n\n### ###\n\n\n### ###\n
  • \n\n### ###\n\n\n", - "translation": " Fanak repository Fanak documentation Load starter template " + "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", + "translation": " Fanak repository Fanak documentation LiveCodes Documentation Load starter template " }, "fanak.name": { "notes": "", diff --git a/src/livecodes/i18n/locales/en/language-info.ts b/src/livecodes/i18n/locales/en/language-info.ts index 9b6951dcbf..d77637dc7a 100644 --- a/src/livecodes/i18n/locales/en/language-info.ts +++ b/src/livecodes/i18n/locales/en/language-info.ts @@ -129,7 +129,7 @@ const languageInfo = { }, fanak: { desc: 'Fanak is a functional programming language that compiles to CIL (.NET). Its compiler and .NET WebAssembly runtime run entirely in the browser, fetched from the Fanak project, so the first run downloads the runtime and can take a moment.', - link: '<1> <2>Fanak repository <3> <4>Fanak documentation <5> <6>Load starter template ', + link: '<1> <2>Fanak repository <3> <4>Fanak documentation <5> <6>LiveCodes Documentation <7> <8>Load starter template ', name: 'Fanak', }, fennel: { From a464620dd78b49c4cdfe5dbcba9d1f1a52cddade Mon Sep 17 00:00:00 2001 From: "pullfrog[bot]" <226033991+pullfrog[bot]@users.noreply.github.com> Date: Thu, 1 Oct 2026 07:15:24 +0000 Subject: [PATCH 8/8] i18n: add Fanak translations for all locales --- .../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 + 68 files changed, 306 insertions(+) diff --git a/src/livecodes/i18n/locales/ar/language-info.lokalise.json b/src/livecodes/i18n/locales/ar/language-info.lokalise.json index 2a2565f934..f6fcfee1f1 100644 --- a/src/livecodes/i18n/locales/ar/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/ar/language-info.lokalise.json @@ -207,6 +207,15 @@ "eta.name": { "translation": "Eta" }, + "fanak.desc": { + "translation": "Fanak هي لغة برمجة وظيفية تُترجم إلى CIL ‏(.NET). يعمل مُترجمها وبيئة تشغيل .NET WebAssembly بالكامل في المتصفح، ويتم جلبهما من مشروع Fanak، لذا يؤدي التشغيل الأول إلى تنزيل بيئة التشغيل وقد يستغرق بعض الوقت." + }, + "fanak.link": { + "translation": " مستودع Fanak وثائق Fanak وثائق LiveCodes تحميل قالب البدء " + }, + "fanak.name": { + "translation": "Fanak" + }, "fennel.desc": { "translation": "فينل هي لغة برمجة تجمع بين سرعة وبساطة ونطاق لوا مع مرونة بناء جملة ليسب ونظام الماكرو." }, diff --git a/src/livecodes/i18n/locales/ar/language-info.ts b/src/livecodes/i18n/locales/ar/language-info.ts index f9db2261f8..24fec63268 100644 --- a/src/livecodes/i18n/locales/ar/language-info.ts +++ b/src/livecodes/i18n/locales/ar/language-info.ts @@ -119,6 +119,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>الموقع الرسمي <3> <4>الوثائق <5> <6>وثائق LiveCodes ', name: 'Eta', }, + fanak: { + desc: 'Fanak هي لغة برمجة وظيفية تُترجم إلى CIL ‏(.NET). يعمل مُترجمها وبيئة تشغيل .NET WebAssembly بالكامل في المتصفح، ويتم جلبهما من مشروع Fanak، لذا يؤدي التشغيل الأول إلى تنزيل بيئة التشغيل وقد يستغرق بعض الوقت.', + link: '<1> <2>مستودع Fanak <3> <4>وثائق Fanak <5> <6>وثائق LiveCodes <7> <8>تحميل قالب البدء ', + name: 'Fanak', + }, fennel: { desc: 'فينل هي لغة برمجة تجمع بين سرعة وبساطة ونطاق لوا مع مرونة بناء جملة ليسب ونظام الماكرو.', link: '<1> <2>الموقع الرسمي لفينل <3> <4>البدء مع فينل <5> <6>وثائق LiveCodes <7> <8>تحميل قالب البداية ', diff --git a/src/livecodes/i18n/locales/ar/translation.lokalise.json b/src/livecodes/i18n/locales/ar/translation.lokalise.json index f2feafe7c6..47e2204006 100644 --- a/src/livecodes/i18n/locales/ar/translation.lokalise.json +++ b/src/livecodes/i18n/locales/ar/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.elm": { "translation": "قالب Elm" }, + "templates.starter.fanak": { + "translation": "قالب Fanak" + }, "templates.starter.fennel": { "translation": "قالب Fennel" }, diff --git a/src/livecodes/i18n/locales/ar/translation.ts b/src/livecodes/i18n/locales/ar/translation.ts index 54eb34f467..bb914603ba 100644 --- a/src/livecodes/i18n/locales/ar/translation.ts +++ b/src/livecodes/i18n/locales/ar/translation.ts @@ -996,6 +996,7 @@ const translation: I18nTranslation = { daisyui: 'قالب daisyUI', diagrams: 'قالب الرسوم البيانية', elm: 'قالب Elm', + fanak: 'قالب Fanak', fennel: 'قالب Fennel', fsharp: 'قالب F#', 'fsharp-wasm': 'قالب F# (Wasm)', diff --git a/src/livecodes/i18n/locales/bn/language-info.lokalise.json b/src/livecodes/i18n/locales/bn/language-info.lokalise.json index 5946bb66a4..95f2d27f3d 100644 --- a/src/livecodes/i18n/locales/bn/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/bn/language-info.lokalise.json @@ -207,6 +207,15 @@ "eta.name": { "translation": "Eta" }, + "fanak.desc": { + "translation": "Fanak হলো একটি কার্যকরী প্রোগ্রামিং ভাষা যা CIL (.NET)-এ কম্পাইল হয়। এর কম্পাইলার এবং .NET WebAssembly রানটাইম সম্পূর্ণভাবে ব্রাউজারে চলে, যা Fanak প্রকল্প থেকে আনা হয়, তাই প্রথমবার চালানোর সময় রানটাইমটি ডাউনলোড হয় এবং কিছুটা সময় নিতে পারে।" + }, + "fanak.link": { + "translation": " Fanak রেপো Fanak ডকুমেন্টেশন লাইভকোড ডকুমেন্টেশন স্টার্টার টেমপ্লেট লোড করুন " + }, + "fanak.name": { + "translation": "Fanak" + }, "fennel.desc": { "translation": "Fennel একটি প্রোগ্রামিং ভাষা যা Lua-এর গতি, সরলতা এবং পৌঁছানোকে একটি lisp সিনট্যাক্স এবং ম্যাক্রো সিস্টেমের নমনীয়তার সাথে একত্রিত করে।" }, diff --git a/src/livecodes/i18n/locales/bn/language-info.ts b/src/livecodes/i18n/locales/bn/language-info.ts index 40afdc745c..b519f5bd04 100644 --- a/src/livecodes/i18n/locales/bn/language-info.ts +++ b/src/livecodes/i18n/locales/bn/language-info.ts @@ -119,6 +119,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>অফিসিয়াল ওয়েবসাইট <3> <4>ডকুমেন্টেশন <5> <6>LiveCodes ডকুমেন্টেশন ', name: 'Eta', }, + fanak: { + desc: 'Fanak হলো একটি কার্যকরী প্রোগ্রামিং ভাষা যা CIL (.NET)-এ কম্পাইল হয়। এর কম্পাইলার এবং .NET WebAssembly রানটাইম সম্পূর্ণভাবে ব্রাউজারে চলে, যা Fanak প্রকল্প থেকে আনা হয়, তাই প্রথমবার চালানোর সময় রানটাইমটি ডাউনলোড হয় এবং কিছুটা সময় নিতে পারে।', + link: '<1> <2>Fanak রেপো <3> <4>Fanak ডকুমেন্টেশন <5> <6>লাইভকোড ডকুমেন্টেশন <7> <8>স্টার্টার টেমপ্লেট লোড করুন ', + name: 'Fanak', + }, fennel: { desc: 'Fennel একটি প্রোগ্রামিং ভাষা যা Lua-এর গতি, সরলতা এবং পৌঁছানোকে একটি lisp সিনট্যাক্স এবং ম্যাক্রো সিস্টেমের নমনীয়তার সাথে একত্রিত করে।', link: '<1> <2>Fennel অফিসিয়াল ওয়েবসাইট <3> <4>Fennel দিয়ে শুরু করা <5> <6>LiveCodes ডকুমেন্টেশন <7> <8>স্টার্টার টেমপ্লেট লোড করুন ', diff --git a/src/livecodes/i18n/locales/bn/translation.lokalise.json b/src/livecodes/i18n/locales/bn/translation.lokalise.json index 914792bd9b..9dd80cbdec 100644 --- a/src/livecodes/i18n/locales/bn/translation.lokalise.json +++ b/src/livecodes/i18n/locales/bn/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.elm": { "translation": "Elm স্টার্টার" }, + "templates.starter.fanak": { + "translation": "Fanak স্টার্টার" + }, "templates.starter.fennel": { "translation": "Fennel স্টার্টার" }, diff --git a/src/livecodes/i18n/locales/bn/translation.ts b/src/livecodes/i18n/locales/bn/translation.ts index c677bfcc35..2de63382ef 100644 --- a/src/livecodes/i18n/locales/bn/translation.ts +++ b/src/livecodes/i18n/locales/bn/translation.ts @@ -996,6 +996,7 @@ const translation: I18nTranslation = { daisyui: 'daisyUI স্টার্টার', diagrams: 'Diagrams স্টার্টার', elm: 'Elm স্টার্টার', + fanak: 'Fanak স্টার্টার', fennel: 'Fennel স্টার্টার', fsharp: 'F# স্টার্টার', 'fsharp-wasm': 'F# (Wasm) স্টার্টার', diff --git a/src/livecodes/i18n/locales/de/language-info.lokalise.json b/src/livecodes/i18n/locales/de/language-info.lokalise.json index 0fbdaf2e0c..8287c7b681 100644 --- a/src/livecodes/i18n/locales/de/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/de/language-info.lokalise.json @@ -207,6 +207,15 @@ "eta.name": { "translation": "Eta" }, + "fanak.desc": { + "translation": "Fanak ist eine funktionale Programmiersprache, die zu CIL (.NET) kompiliert wird. Ihr Compiler und die .NET-WebAssembly-Laufzeit laufen vollständig im Browser und werden vom Fanak-Projekt abgerufen, sodass beim ersten Start die Laufzeitumgebung heruntergeladen wird und es einen Moment dauern kann." + }, + "fanak.link": { + "translation": " Fanak-Repository Fanak-Dokumentation LiveCodes-Dokumentation Startervorlage laden " + }, + "fanak.name": { + "translation": "Fanak" + }, "fennel.desc": { "translation": "Fennel ist eine Programmiersprache, die die Geschwindigkeit, Einfachheit und Reichweite von Lua mit der Flexibilität einer Lisp-Syntax und eines Makrosystems verbindet." }, diff --git a/src/livecodes/i18n/locales/de/language-info.ts b/src/livecodes/i18n/locales/de/language-info.ts index f5e540a135..4f0d0f545c 100644 --- a/src/livecodes/i18n/locales/de/language-info.ts +++ b/src/livecodes/i18n/locales/de/language-info.ts @@ -121,6 +121,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>Offizielle Website <3> <4>Dokumentation <5> <6>LiveCodes Dokumentation ', name: 'Eta', }, + fanak: { + desc: 'Fanak ist eine funktionale Programmiersprache, die zu CIL (.NET) kompiliert wird. Ihr Compiler und die .NET-WebAssembly-Laufzeit laufen vollständig im Browser und werden vom Fanak-Projekt abgerufen, sodass beim ersten Start die Laufzeitumgebung heruntergeladen wird und es einen Moment dauern kann.', + link: '<1> <2>Fanak-Repository <3> <4>Fanak-Dokumentation <5> <6>LiveCodes-Dokumentation <7> <8>Startervorlage laden ', + name: 'Fanak', + }, fennel: { desc: 'Fennel ist eine Programmiersprache, die die Geschwindigkeit, Einfachheit und Reichweite von Lua mit der Flexibilität einer Lisp-Syntax und eines Makrosystems verbindet.', link: '<1> <2>Fennel offizielle Website <3> <4>Erste Schritte mit Fennel <5> <6>LiveCodes Dokumentation <7> <8>Starter-Vorlage laden ', diff --git a/src/livecodes/i18n/locales/de/translation.lokalise.json b/src/livecodes/i18n/locales/de/translation.lokalise.json index be9f2e91a9..89a218b453 100644 --- a/src/livecodes/i18n/locales/de/translation.lokalise.json +++ b/src/livecodes/i18n/locales/de/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.elm": { "translation": "Elm-Starter" }, + "templates.starter.fanak": { + "translation": "Fanak-Starter" + }, "templates.starter.fennel": { "translation": "Fennel-Starter" }, diff --git a/src/livecodes/i18n/locales/de/translation.ts b/src/livecodes/i18n/locales/de/translation.ts index 501fbf92ad..502c426666 100644 --- a/src/livecodes/i18n/locales/de/translation.ts +++ b/src/livecodes/i18n/locales/de/translation.ts @@ -998,6 +998,7 @@ const translation: I18nTranslation = { daisyui: 'daisyUI-Starter', diagrams: 'Diagramm-Starter', elm: 'Elm-Starter', + fanak: 'Fanak-Starter', fennel: 'Fennel-Starter', fsharp: 'F# -Starter', 'fsharp-wasm': 'F# (Wasm)-Starter', diff --git a/src/livecodes/i18n/locales/es/language-info.lokalise.json b/src/livecodes/i18n/locales/es/language-info.lokalise.json index 4ff33090fa..472aa29203 100644 --- a/src/livecodes/i18n/locales/es/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/es/language-info.lokalise.json @@ -207,6 +207,15 @@ "eta.name": { "translation": "Eta" }, + "fanak.desc": { + "translation": "Fanak es un lenguaje de programación funcional que compila a CIL (.NET). Su compilador y el entorno de ejecución .NET para WebAssembly se ejecutan completamente en el navegador, obtenidos del proyecto Fanak, por lo que la primera ejecución descarga el entorno de ejecución y puede tardar un momento." + }, + "fanak.link": { + "translation": " repositorio de Fanak Documentación de Fanak Documentación de LiveCodes Cargar plantilla de inicio " + }, + "fanak.name": { + "translation": "Fanak" + }, "fennel.desc": { "translation": "Fennel es un lenguaje de programación que combina la velocidad, simplicidad y alcance de Lua con la flexibilidad de una sintaxis de lisp y un sistema de macros." }, diff --git a/src/livecodes/i18n/locales/es/language-info.ts b/src/livecodes/i18n/locales/es/language-info.ts index 49d5ecdfbc..d7b7681ace 100644 --- a/src/livecodes/i18n/locales/es/language-info.ts +++ b/src/livecodes/i18n/locales/es/language-info.ts @@ -120,6 +120,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>Sitio web oficial <3> <4>Documentación <5> <6>Documentación de LiveCodes ', name: 'Eta', }, + fanak: { + desc: 'Fanak es un lenguaje de programación funcional que compila a CIL (.NET). Su compilador y el entorno de ejecución .NET para WebAssembly se ejecutan completamente en el navegador, obtenidos del proyecto Fanak, por lo que la primera ejecución descarga el entorno de ejecución y puede tardar un momento.', + link: '<1> <2>repositorio de Fanak <3> <4>Documentación de Fanak <5> <6>Documentación de LiveCodes <7> <8>Cargar plantilla de inicio ', + name: 'Fanak', + }, fennel: { desc: 'Fennel es un lenguaje de programación que combina la velocidad, simplicidad y alcance de Lua con la flexibilidad de una sintaxis de lisp y un sistema de macros.', link: '<1> <2>Sitio web oficial de Fennel <3> <4>Introducción a Fennel <5> <6>Documentación de LiveCodes <7> <8>Cargar plantilla inicial ', diff --git a/src/livecodes/i18n/locales/es/translation.lokalise.json b/src/livecodes/i18n/locales/es/translation.lokalise.json index e694648254..45fc39d135 100644 --- a/src/livecodes/i18n/locales/es/translation.lokalise.json +++ b/src/livecodes/i18n/locales/es/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.elm": { "translation": "Inicio Elm" }, + "templates.starter.fanak": { + "translation": "Inicio Fanak" + }, "templates.starter.fennel": { "translation": "Inicio Fennel" }, diff --git a/src/livecodes/i18n/locales/es/translation.ts b/src/livecodes/i18n/locales/es/translation.ts index c943ad56f7..011383c68d 100644 --- a/src/livecodes/i18n/locales/es/translation.ts +++ b/src/livecodes/i18n/locales/es/translation.ts @@ -996,6 +996,7 @@ const translation: I18nTranslation = { daisyui: 'Inicio daisyUI', diagrams: 'Inicio Diagramas', elm: 'Inicio Elm', + fanak: 'Inicio Fanak', fennel: 'Inicio Fennel', fsharp: 'Inicio F#', 'fsharp-wasm': 'Inicio F# (Wasm)', diff --git a/src/livecodes/i18n/locales/fa/language-info.lokalise.json b/src/livecodes/i18n/locales/fa/language-info.lokalise.json index fc3245b201..09c5bb6d7a 100644 --- a/src/livecodes/i18n/locales/fa/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/fa/language-info.lokalise.json @@ -207,6 +207,15 @@ "eta.name": { "translation": "Eta" }, + "fanak.desc": { + "translation": "Fanak یک زبان برنامه‌نویسی تابعی است که به CIL (.NET) کامپایل می‌شود. کامپایلر آن و محیط اجرایی .NET WebAssembly کاملاً در مرورگر اجرا می‌شوند و از پروژه Fanak دریافت می‌شوند، بنابراین اولین اجرا محیط اجرایی را دانلود می‌کند و ممکن است کمی طول بکشد." + }, + "fanak.link": { + "translation": " مخزن Fanak مستندات Fanak مستندات LiveCodes بارگیری قالب شروع " + }, + "fanak.name": { + "translation": "Fanak" + }, "fennel.desc": { "translation": "Fennel یک زبان برنامه‌نویسی است که سرعت، سادگی و دسترسی Lua را با انعطاف‌پذیری نحو لیسپ و سیستم ماکرو ترکیب می‌کند." }, diff --git a/src/livecodes/i18n/locales/fa/language-info.ts b/src/livecodes/i18n/locales/fa/language-info.ts index 0d394b3eb9..952a677ef0 100644 --- a/src/livecodes/i18n/locales/fa/language-info.ts +++ b/src/livecodes/i18n/locales/fa/language-info.ts @@ -120,6 +120,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>وب‌سایت رسمی <3> <4>مستندات <5> <6>مستندات LiveCodes ', name: 'Eta', }, + fanak: { + desc: 'Fanak یک زبان برنامه‌نویسی تابعی است که به CIL (.NET) کامپایل می‌شود. کامپایلر آن و محیط اجرایی .NET WebAssembly کاملاً در مرورگر اجرا می‌شوند و از پروژه Fanak دریافت می‌شوند، بنابراین اولین اجرا محیط اجرایی را دانلود می‌کند و ممکن است کمی طول بکشد.', + link: '<1> <2>مخزن Fanak <3> <4>مستندات Fanak <5> <6>مستندات LiveCodes <7> <8>بارگیری قالب شروع ', + name: 'Fanak', + }, fennel: { desc: 'Fennel یک زبان برنامه‌نویسی است که سرعت، سادگی و دسترسی Lua را با انعطاف‌پذیری نحو لیسپ و سیستم ماکرو ترکیب می‌کند.', link: '<1> <2>وب‌سایت رسمی Fennel <3> <4>شروع کار با Fennel <5> <6>مستندات LiveCodes <7> <8>بارگذاری قالب شروع کننده ', diff --git a/src/livecodes/i18n/locales/fa/translation.lokalise.json b/src/livecodes/i18n/locales/fa/translation.lokalise.json index ec20a37980..615d286f52 100644 --- a/src/livecodes/i18n/locales/fa/translation.lokalise.json +++ b/src/livecodes/i18n/locales/fa/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.elm": { "translation": "شروع کننده Elm" }, + "templates.starter.fanak": { + "translation": "شروع کننده Fanak" + }, "templates.starter.fennel": { "translation": "شروع کننده Fennel" }, diff --git a/src/livecodes/i18n/locales/fa/translation.ts b/src/livecodes/i18n/locales/fa/translation.ts index 55163f22b0..5c96028612 100644 --- a/src/livecodes/i18n/locales/fa/translation.ts +++ b/src/livecodes/i18n/locales/fa/translation.ts @@ -997,6 +997,7 @@ const translation: I18nTranslation = { daisyui: 'شروع کننده daisyUI', diagrams: 'شروع کننده نمودارها', elm: 'شروع کننده Elm', + fanak: 'شروع کننده Fanak', fennel: 'شروع کننده Fennel', fsharp: 'شروع کننده F#', 'fsharp-wasm': 'شروع کننده F# (Wasm)', diff --git a/src/livecodes/i18n/locales/fr/language-info.lokalise.json b/src/livecodes/i18n/locales/fr/language-info.lokalise.json index 30547f00c1..f1d1422767 100644 --- a/src/livecodes/i18n/locales/fr/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/fr/language-info.lokalise.json @@ -207,6 +207,15 @@ "eta.name": { "translation": "Eta" }, + "fanak.desc": { + "translation": "Fanak est un langage de programmation fonctionnel qui se compile en CIL (.NET). Son compilateur et le runtime .NET WebAssembly s'exécutent entièrement dans le navigateur, récupérés depuis le projet Fanak, donc la première exécution télécharge le runtime et peut prendre un moment." + }, + "fanak.link": { + "translation": " dépôt Fanak Documentation Fanak Documentation LiveCodes Charger un modèle de démarrage " + }, + "fanak.name": { + "translation": "Fanak" + }, "fennel.desc": { "translation": "Fennel est un langage de programmation qui allie la vitesse, la simplicité et la portée de Lua à la flexibilité d'une syntaxe lisp et d'un système de macros." }, diff --git a/src/livecodes/i18n/locales/fr/language-info.ts b/src/livecodes/i18n/locales/fr/language-info.ts index 753745d587..57f5f20c1e 100644 --- a/src/livecodes/i18n/locales/fr/language-info.ts +++ b/src/livecodes/i18n/locales/fr/language-info.ts @@ -120,6 +120,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>Site officiel <3> <4>Documentation <5> <6>Documentation LiveCodes ', name: 'Eta', }, + fanak: { + desc: "Fanak est un langage de programmation fonctionnel qui se compile en CIL (.NET). Son compilateur et le runtime .NET WebAssembly s'exécutent entièrement dans le navigateur, récupérés depuis le projet Fanak, donc la première exécution télécharge le runtime et peut prendre un moment.", + link: '<1> <2>dépôt Fanak <3> <4>Documentation Fanak <5> <6>Documentation LiveCodes <7> <8>Charger un modèle de démarrage ', + name: 'Fanak', + }, fennel: { desc: "Fennel est un langage de programmation qui allie la vitesse, la simplicité et la portée de Lua à la flexibilité d'une syntaxe lisp et d'un système de macros.", link: '<1> <2>Site officiel de Fennel <3> <4>Débuter avec Fennel <5> <6>Documentation LiveCodes <7> <8>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 ecf3a38156..c45aed6b64 100644 --- a/src/livecodes/i18n/locales/fr/translation.lokalise.json +++ b/src/livecodes/i18n/locales/fr/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.elm": { "translation": "Démarrage Elm" }, + "templates.starter.fanak": { + "translation": "Démarrage Fanak" + }, "templates.starter.fennel": { "translation": "Démarrage Fennel" }, diff --git a/src/livecodes/i18n/locales/fr/translation.ts b/src/livecodes/i18n/locales/fr/translation.ts index 88b5d1df05..8ecb67e5a8 100644 --- a/src/livecodes/i18n/locales/fr/translation.ts +++ b/src/livecodes/i18n/locales/fr/translation.ts @@ -998,6 +998,7 @@ const translation: I18nTranslation = { daisyui: 'Démarrage daisyUI', diagrams: 'Démarrage Diagrammes', elm: 'Démarrage Elm', + fanak: 'Démarrage Fanak', fennel: 'Démarrage Fennel', fsharp: 'Démarrage F#', 'fsharp-wasm': 'Démarrage F# (Wasm)', diff --git a/src/livecodes/i18n/locales/hi/language-info.lokalise.json b/src/livecodes/i18n/locales/hi/language-info.lokalise.json index beabd6f8ec..21d35a925f 100644 --- a/src/livecodes/i18n/locales/hi/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/hi/language-info.lokalise.json @@ -207,6 +207,15 @@ "eta.name": { "translation": "Eta" }, + "fanak.desc": { + "translation": "Fanak एक कार्यात्मक प्रोग्रामिंग भाषा है जो CIL (.NET) में संकलित होती है। इसका कंपाइलर और .NET WebAssembly रनटाइम पूरी तरह से ब्राउज़र में चलते हैं, जो Fanak प्रोजेक्ट से प्राप्त होते हैं, इसलिए पहली बार चलाने पर रनटाइम डाउनलोड होता है और इसमें कुछ समय लग सकता है।" + }, + "fanak.link": { + "translation": " Fanak रेपो Fanak दस्तावेज लाइवकोड दस्तावेजीकरण स्टार्टर टेम्पलेट लोड करें " + }, + "fanak.name": { + "translation": "Fanak" + }, "fennel.desc": { "translation": "Fennel एक प्रोग्रामिंग भाषा है जो Lua की गति, सरलता, और पहुंच को लिस्प सिंटैक्स और मैक्रो सिस्टम की लचीलेपन के साथ जोड़ती है।" }, diff --git a/src/livecodes/i18n/locales/hi/language-info.ts b/src/livecodes/i18n/locales/hi/language-info.ts index c1cbc04830..0911683d55 100644 --- a/src/livecodes/i18n/locales/hi/language-info.ts +++ b/src/livecodes/i18n/locales/hi/language-info.ts @@ -120,6 +120,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>आधिकारिक वेबसाइट <3> <4>दस्तावेज़ीकरण <5> <6>LiveCodes दस्तावेज़ीकरण ', name: 'Eta', }, + fanak: { + desc: 'Fanak एक कार्यात्मक प्रोग्रामिंग भाषा है जो CIL (.NET) में संकलित होती है। इसका कंपाइलर और .NET WebAssembly रनटाइम पूरी तरह से ब्राउज़र में चलते हैं, जो Fanak प्रोजेक्ट से प्राप्त होते हैं, इसलिए पहली बार चलाने पर रनटाइम डाउनलोड होता है और इसमें कुछ समय लग सकता है।', + link: '<1> <2>Fanak रेपो <3> <4>Fanak दस्तावेज <5> <6>लाइवकोड दस्तावेजीकरण <7> <8>स्टार्टर टेम्पलेट लोड करें ', + name: 'Fanak', + }, fennel: { desc: 'Fennel एक प्रोग्रामिंग भाषा है जो Lua की गति, सरलता, और पहुंच को लिस्प सिंटैक्स और मैक्रो सिस्टम की लचीलेपन के साथ जोड़ती है।', link: '<1> <2>Fennel आधिकारिक वेबसाइट <3> <4>Fennel के साथ शुरुआत करना <5> <6>LiveCodes दस्तावेज़ीकरण <7> <8>स्टार्टर टेम्पलेट लोड करें ', diff --git a/src/livecodes/i18n/locales/hi/translation.lokalise.json b/src/livecodes/i18n/locales/hi/translation.lokalise.json index ff6dc55e66..c9ef803528 100644 --- a/src/livecodes/i18n/locales/hi/translation.lokalise.json +++ b/src/livecodes/i18n/locales/hi/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.elm": { "translation": "Elm स्टार्टर" }, + "templates.starter.fanak": { + "translation": "Fanak स्टार्टर" + }, "templates.starter.fennel": { "translation": "Fennel स्टार्टर" }, diff --git a/src/livecodes/i18n/locales/hi/translation.ts b/src/livecodes/i18n/locales/hi/translation.ts index a815bfa6a4..f553c3463f 100644 --- a/src/livecodes/i18n/locales/hi/translation.ts +++ b/src/livecodes/i18n/locales/hi/translation.ts @@ -996,6 +996,7 @@ const translation: I18nTranslation = { daisyui: 'daisyUI स्टार्टर', diagrams: 'आरेख स्टार्टर', elm: 'Elm स्टार्टर', + fanak: 'Fanak स्टार्टर', fennel: 'Fennel स्टार्टर', fsharp: 'F# स्टार्टर', 'fsharp-wasm': 'F# (Wasm) स्टार्टर', diff --git a/src/livecodes/i18n/locales/hu/language-info.lokalise.json b/src/livecodes/i18n/locales/hu/language-info.lokalise.json index e44f08e61d..9edeaab662 100644 --- a/src/livecodes/i18n/locales/hu/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/hu/language-info.lokalise.json @@ -207,6 +207,15 @@ "eta.name": { "translation": "Eta" }, + "fanak.desc": { + "translation": "A Fanak egy funkcionális programozási nyelv, amely CIL (.NET) kódra fordul. A fordítója és a .NET WebAssembly futtatókörnyezet teljes egészében a böngészőben fut, a Fanak projektből letöltve, ezért az első futtatáskor a futtatókörnyezet letöltése megtörténik, ami eltarthat egy ideig." + }, + "fanak.link": { + "translation": " Fanak tároló Fanak dokumentáció LiveCodes dokumentáció Kezdő sablon betöltése " + }, + "fanak.name": { + "translation": "Fanak" + }, "fennel.desc": { "translation": "A Fennel egy programozási nyelv, amely ötvözi a Lua sebességét, egyszerűségét és elérhetőségét a lisp szintaxis és makrórendszer rugalmasságával." }, diff --git a/src/livecodes/i18n/locales/hu/language-info.ts b/src/livecodes/i18n/locales/hu/language-info.ts index d2306d8a53..49d38e93f7 100644 --- a/src/livecodes/i18n/locales/hu/language-info.ts +++ b/src/livecodes/i18n/locales/hu/language-info.ts @@ -121,6 +121,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>Hivatalos weboldal <3> <4>Dokumentáció <5> <6>LiveCodes dokumentáció ', name: 'Eta', }, + fanak: { + desc: 'A Fanak egy funkcionális programozási nyelv, amely CIL (.NET) kódra fordul. A fordítója és a .NET WebAssembly futtatókörnyezet teljes egészében a böngészőben fut, a Fanak projektből letöltve, ezért az első futtatáskor a futtatókörnyezet letöltése megtörténik, ami eltarthat egy ideig.', + link: '<1> <2>Fanak tároló <3> <4>Fanak dokumentáció <5> <6>LiveCodes dokumentáció <7> <8>Kezdő sablon betöltése ', + name: 'Fanak', + }, fennel: { desc: 'A Fennel egy programozási nyelv, amely ötvözi a Lua sebességét, egyszerűségét és elérhetőségét a lisp szintaxis és makrórendszer rugalmasságával.', link: '<1> <2>Fennel hivatalos weboldal <3> <4>Kezdés a Fennel-lel <5> <6>LiveCodes dokumentáció <7> <8>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 104635491a..0882594eeb 100644 --- a/src/livecodes/i18n/locales/hu/translation.lokalise.json +++ b/src/livecodes/i18n/locales/hu/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.elm": { "translation": "Elm kezdő" }, + "templates.starter.fanak": { + "translation": "Fanak kezdő" + }, "templates.starter.fennel": { "translation": "Fennel kezdő" }, diff --git a/src/livecodes/i18n/locales/hu/translation.ts b/src/livecodes/i18n/locales/hu/translation.ts index 2211b85db4..b56cca5b32 100644 --- a/src/livecodes/i18n/locales/hu/translation.ts +++ b/src/livecodes/i18n/locales/hu/translation.ts @@ -997,6 +997,7 @@ const translation: I18nTranslation = { daisyui: 'daisyUI kezdő', diagrams: 'Diagramok kezdő', elm: 'Elm kezdő', + fanak: 'Fanak kezdő', fennel: 'Fennel kezdő', fsharp: 'F# kezdő', 'fsharp-wasm': 'F# (Wasm) kezdő', diff --git a/src/livecodes/i18n/locales/id/language-info.lokalise.json b/src/livecodes/i18n/locales/id/language-info.lokalise.json index c16b14315e..26225bebf1 100644 --- a/src/livecodes/i18n/locales/id/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/id/language-info.lokalise.json @@ -207,6 +207,15 @@ "eta.name": { "translation": "Eta" }, + "fanak.desc": { + "translation": "Fanak adalah bahasa pemrograman fungsional yang dikompilasi ke CIL (.NET). Kompiler dan runtime .NET WebAssembly-nya berjalan sepenuhnya di browser, diambil dari proyek Fanak, sehingga proses pertama kali dijalankan akan mengunduh runtime dan mungkin membutuhkan waktu sejenak." + }, + "fanak.link": { + "translation": " Repo Fanak Dokumentasi Fanak Dokumentasi LiveCodes Muat templat awal " + }, + "fanak.name": { + "translation": "Fanak" + }, "fennel.desc": { "translation": "Fennel adalah bahasa pemrograman yang menggabungkan kecepatan, kesederhanaan, dan jangkauan Lua dengan fleksibilitas sintaks lisp dan sistem makro." }, diff --git a/src/livecodes/i18n/locales/id/language-info.ts b/src/livecodes/i18n/locales/id/language-info.ts index 29d6af08b0..d62f8faee7 100644 --- a/src/livecodes/i18n/locales/id/language-info.ts +++ b/src/livecodes/i18n/locales/id/language-info.ts @@ -121,6 +121,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>Situs web resmi <3> <4>Dokumentasi <5> <6>Dokumentasi LiveCodes ', name: 'Eta', }, + fanak: { + desc: 'Fanak adalah bahasa pemrograman fungsional yang dikompilasi ke CIL (.NET). Kompiler dan runtime .NET WebAssembly-nya berjalan sepenuhnya di browser, diambil dari proyek Fanak, sehingga proses pertama kali dijalankan akan mengunduh runtime dan mungkin membutuhkan waktu sejenak.', + link: '<1> <2>Repo Fanak <3> <4>Dokumentasi Fanak <5> <6>Dokumentasi LiveCodes <7> <8>Muat templat awal ', + name: 'Fanak', + }, fennel: { desc: 'Fennel adalah bahasa pemrograman yang menggabungkan kecepatan, kesederhanaan, dan jangkauan Lua dengan fleksibilitas sintaks lisp dan sistem makro.', link: '<1> <2>Situs web resmi Fennel <3> <4>Memulai dengan Fennel <5> <6>Dokumentasi LiveCodes <7> <8>Muat template pemula ', diff --git a/src/livecodes/i18n/locales/id/translation.lokalise.json b/src/livecodes/i18n/locales/id/translation.lokalise.json index 88ff86c599..38dbcc7089 100644 --- a/src/livecodes/i18n/locales/id/translation.lokalise.json +++ b/src/livecodes/i18n/locales/id/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.elm": { "translation": "Pemula Elm" }, + "templates.starter.fanak": { + "translation": "Pemula Fanak" + }, "templates.starter.fennel": { "translation": "Pemula Fennel" }, diff --git a/src/livecodes/i18n/locales/id/translation.ts b/src/livecodes/i18n/locales/id/translation.ts index fb8b322120..12038db736 100644 --- a/src/livecodes/i18n/locales/id/translation.ts +++ b/src/livecodes/i18n/locales/id/translation.ts @@ -996,6 +996,7 @@ const translation: I18nTranslation = { daisyui: 'Pemula daisyUI', diagrams: 'Pemula Diagram', elm: 'Pemula Elm', + fanak: 'Pemula Fanak', fennel: 'Pemula Fennel', fsharp: 'Pemula F#', 'fsharp-wasm': 'Pemula F# (Wasm)', diff --git a/src/livecodes/i18n/locales/it/language-info.lokalise.json b/src/livecodes/i18n/locales/it/language-info.lokalise.json index e87184820a..17f73e0add 100644 --- a/src/livecodes/i18n/locales/it/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/it/language-info.lokalise.json @@ -207,6 +207,15 @@ "eta.name": { "translation": "Eta" }, + "fanak.desc": { + "translation": "Fanak è un linguaggio di programmazione funzionale che viene compilato in CIL (.NET). Il suo compilatore e il runtime .NET WebAssembly vengono eseguiti interamente nel browser, recuperati dal progetto Fanak, quindi la prima esecuzione scarica il runtime e può richiedere un po' di tempo." + }, + "fanak.link": { + "translation": " repository di Fanak Documentazione di Fanak Documentazione di LiveCodes Carica il modello di avvio " + }, + "fanak.name": { + "translation": "Fanak" + }, "fennel.desc": { "translation": "Fennel è un linguaggio di programmazione che unisce la velocità, la semplicità e la portata di Lua con la flessibilità di una sintassi lisp e un sistema di macro." }, diff --git a/src/livecodes/i18n/locales/it/language-info.ts b/src/livecodes/i18n/locales/it/language-info.ts index 946954ff46..29e33f1f42 100644 --- a/src/livecodes/i18n/locales/it/language-info.ts +++ b/src/livecodes/i18n/locales/it/language-info.ts @@ -120,6 +120,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>Sito ufficiale <3> <4>Documentazione <5> <6>Documentazione LiveCodes ', name: 'Eta', }, + fanak: { + desc: "Fanak è un linguaggio di programmazione funzionale che viene compilato in CIL (.NET). Il suo compilatore e il runtime .NET WebAssembly vengono eseguiti interamente nel browser, recuperati dal progetto Fanak, quindi la prima esecuzione scarica il runtime e può richiedere un po' di tempo.", + link: '<1> <2>repository di Fanak <3> <4>Documentazione di Fanak <5> <6>Documentazione di LiveCodes <7> <8>Carica il modello di avvio ', + name: 'Fanak', + }, fennel: { desc: 'Fennel è un linguaggio di programmazione che unisce la velocità, la semplicità e la portata di Lua con la flessibilità di una sintassi lisp e un sistema di macro.', link: '<1> <2>Sito ufficiale di Fennel <3> <4>Iniziare con Fennel <5> <6>Documentazione LiveCodes <7> <8>Carica modello di partenza ', diff --git a/src/livecodes/i18n/locales/it/translation.lokalise.json b/src/livecodes/i18n/locales/it/translation.lokalise.json index c8c7981ddd..735d44b92d 100644 --- a/src/livecodes/i18n/locales/it/translation.lokalise.json +++ b/src/livecodes/i18n/locales/it/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.elm": { "translation": "Starter Elm" }, + "templates.starter.fanak": { + "translation": "Starter Fanak" + }, "templates.starter.fennel": { "translation": "Starter Fennel" }, diff --git a/src/livecodes/i18n/locales/it/translation.ts b/src/livecodes/i18n/locales/it/translation.ts index af608f2a13..48b495660f 100644 --- a/src/livecodes/i18n/locales/it/translation.ts +++ b/src/livecodes/i18n/locales/it/translation.ts @@ -997,6 +997,7 @@ const translation: I18nTranslation = { daisyui: 'Starter daisyUI', diagrams: 'Starter Diagrammi', elm: 'Starter Elm', + fanak: 'Starter Fanak', fennel: 'Starter Fennel', fsharp: 'Starter F#', 'fsharp-wasm': 'Starter F# (Wasm)', diff --git a/src/livecodes/i18n/locales/ja/language-info.lokalise.json b/src/livecodes/i18n/locales/ja/language-info.lokalise.json index d510b784d6..86a110c20b 100644 --- a/src/livecodes/i18n/locales/ja/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/ja/language-info.lokalise.json @@ -207,6 +207,15 @@ "eta.name": { "translation": "Eta" }, + "fanak.desc": { + "translation": "Fanak は CIL (.NET) にコンパイルされる関数型プログラミング言語です。そのコンパイラと .NET WebAssembly ランタイムは完全にブラウザ上で動作し、Fanak プロジェクトから取得されるため、初回実行時にはランタイムがダウンロードされ、少し時間がかかることがあります。" + }, + "fanak.link": { + "translation": " Fanak リポジトリ Fanak ドキュメント LiveCodes ドキュメント スターターテンプレートの読み込み " + }, + "fanak.name": { + "translation": "Fanak" + }, "fennel.desc": { "translation": "Fennel は、Lua のスピード、シンプルさ、リーチと、Lisp 構文とマクロシステムの柔軟性を組み合わせたプログラミング言語です。" }, diff --git a/src/livecodes/i18n/locales/ja/language-info.ts b/src/livecodes/i18n/locales/ja/language-info.ts index 2c4fa14c44..1887ed349c 100644 --- a/src/livecodes/i18n/locales/ja/language-info.ts +++ b/src/livecodes/i18n/locales/ja/language-info.ts @@ -120,6 +120,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>公式ウェブサイト <3> <4>ドキュメント <5> <6>LiveCodes ドキュメント ', name: 'Eta', }, + fanak: { + desc: 'Fanak は CIL (.NET) にコンパイルされる関数型プログラミング言語です。そのコンパイラと .NET WebAssembly ランタイムは完全にブラウザ上で動作し、Fanak プロジェクトから取得されるため、初回実行時にはランタイムがダウンロードされ、少し時間がかかることがあります。', + link: '<1> <2>Fanak リポジトリ <3> <4>Fanak ドキュメント <5> <6>LiveCodes ドキュメント <7> <8>スターターテンプレートの読み込み ', + name: 'Fanak', + }, fennel: { desc: 'Fennel は、Lua のスピード、シンプルさ、リーチと、Lisp 構文とマクロシステムの柔軟性を組み合わせたプログラミング言語です。', link: '<1> <2>Fennel 公式ウェブサイト <3> <4>Fennel 入門 <5> <6>LiveCodes ドキュメント <7> <8>スターターテンプレートを読み込む ', diff --git a/src/livecodes/i18n/locales/ja/translation.lokalise.json b/src/livecodes/i18n/locales/ja/translation.lokalise.json index 01185a398e..d68fe42008 100644 --- a/src/livecodes/i18n/locales/ja/translation.lokalise.json +++ b/src/livecodes/i18n/locales/ja/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.elm": { "translation": "Elmスターター" }, + "templates.starter.fanak": { + "translation": "Fanakスターター" + }, "templates.starter.fennel": { "translation": "Fennelスターター" }, diff --git a/src/livecodes/i18n/locales/ja/translation.ts b/src/livecodes/i18n/locales/ja/translation.ts index 000e5cf657..ecac2992c8 100644 --- a/src/livecodes/i18n/locales/ja/translation.ts +++ b/src/livecodes/i18n/locales/ja/translation.ts @@ -997,6 +997,7 @@ const translation: I18nTranslation = { daisyui: 'daisyUIスターター', diagrams: 'ダイアグラムスターター', elm: 'Elmスターター', + fanak: 'Fanakスターター', fennel: 'Fennelスターター', fsharp: 'F#スターター', 'fsharp-wasm': 'F#(Wasm)スターター', diff --git a/src/livecodes/i18n/locales/nl/language-info.lokalise.json b/src/livecodes/i18n/locales/nl/language-info.lokalise.json index f962a695b8..4b720bcd4b 100644 --- a/src/livecodes/i18n/locales/nl/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/nl/language-info.lokalise.json @@ -207,6 +207,15 @@ "eta.name": { "translation": "Eta" }, + "fanak.desc": { + "translation": "Fanak is een functionele programmeertaal die compileert naar CIL (.NET). De compiler en de .NET WebAssembly-runtime draaien volledig in de browser en worden opgehaald uit het Fanak-project, dus de eerste keer dat je het uitvoert wordt de runtime gedownload en kan het even duren." + }, + "fanak.link": { + "translation": " Fanak-repo Fanak-documentatie LiveCodes-documentatie Startersjabloon laden " + }, + "fanak.name": { + "translation": "Fanak" + }, "fennel.desc": { "translation": "Fennel is een programmeertaal die de snelheid, eenvoud en bereik van Lua combineert met de flexibiliteit van een lisp-syntaxis en macrosysteem." }, diff --git a/src/livecodes/i18n/locales/nl/language-info.ts b/src/livecodes/i18n/locales/nl/language-info.ts index d355a2d516..a85454f595 100644 --- a/src/livecodes/i18n/locales/nl/language-info.ts +++ b/src/livecodes/i18n/locales/nl/language-info.ts @@ -120,6 +120,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>Officiële website <3> <4>Documentatie <5> <6>LiveCodes Documentatie ', name: 'Eta', }, + fanak: { + desc: 'Fanak is een functionele programmeertaal die compileert naar CIL (.NET). De compiler en de .NET WebAssembly-runtime draaien volledig in de browser en worden opgehaald uit het Fanak-project, dus de eerste keer dat je het uitvoert wordt de runtime gedownload en kan het even duren.', + link: '<1> <2>Fanak-repo <3> <4>Fanak-documentatie <5> <6>LiveCodes-documentatie <7> <8>Startersjabloon laden ', + name: 'Fanak', + }, fennel: { desc: 'Fennel is een programmeertaal die de snelheid, eenvoud en bereik van Lua combineert met de flexibiliteit van een lisp-syntaxis en macrosysteem.', link: '<1> <2>Fennel officiële website <3> <4>Aan de slag met Fennel <5> <6>LiveCodes Documentatie <7> <8>Startsjabloon laden ', diff --git a/src/livecodes/i18n/locales/nl/translation.lokalise.json b/src/livecodes/i18n/locales/nl/translation.lokalise.json index 28bad6fb4e..4d6665872d 100644 --- a/src/livecodes/i18n/locales/nl/translation.lokalise.json +++ b/src/livecodes/i18n/locales/nl/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.elm": { "translation": "Elm-starter" }, + "templates.starter.fanak": { + "translation": "Fanak-starter" + }, "templates.starter.fennel": { "translation": "Fennel-starter" }, diff --git a/src/livecodes/i18n/locales/nl/translation.ts b/src/livecodes/i18n/locales/nl/translation.ts index eae95d3766..07d5815b61 100644 --- a/src/livecodes/i18n/locales/nl/translation.ts +++ b/src/livecodes/i18n/locales/nl/translation.ts @@ -997,6 +997,7 @@ const translation: I18nTranslation = { daisyui: 'daisyUI-starter', diagrams: 'Diagrammen-starter', elm: 'Elm-starter', + fanak: 'Fanak-starter', fennel: 'Fennel-starter', fsharp: 'F#-starter', 'fsharp-wasm': 'F# (Wasm)-starter', diff --git a/src/livecodes/i18n/locales/pt/language-info.lokalise.json b/src/livecodes/i18n/locales/pt/language-info.lokalise.json index 527e405db1..b99a73afd7 100644 --- a/src/livecodes/i18n/locales/pt/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/pt/language-info.lokalise.json @@ -207,6 +207,15 @@ "eta.name": { "translation": "Eta" }, + "fanak.desc": { + "translation": "Fanak é uma linguagem de programação funcional que compila para CIL (.NET). O seu compilador e o ambiente de execução .NET WebAssembly funcionam inteiramente no navegador, obtidos a partir do projeto Fanak, pelo que a primeira execução descarrega o ambiente de execução e pode demorar um momento." + }, + "fanak.link": { + "translation": " Repositório do Fanak Documentação do Fanak Documentação do LiveCodes Carregar modelo inicial " + }, + "fanak.name": { + "translation": "Fanak" + }, "fennel.desc": { "translation": "Fennel é uma linguagem de programação que une a velocidade, simplicidade e alcance do Lua com a flexibilidade de uma sintaxe lisp e sistema de macros." }, diff --git a/src/livecodes/i18n/locales/pt/language-info.ts b/src/livecodes/i18n/locales/pt/language-info.ts index c30c4689e1..580c368cd3 100644 --- a/src/livecodes/i18n/locales/pt/language-info.ts +++ b/src/livecodes/i18n/locales/pt/language-info.ts @@ -120,6 +120,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>Site oficial <3> <4>Documentação <5> <6>Documentação do LiveCodes ', name: 'Eta', }, + fanak: { + desc: 'Fanak é uma linguagem de programação funcional que compila para CIL (.NET). O seu compilador e o ambiente de execução .NET WebAssembly funcionam inteiramente no navegador, obtidos a partir do projeto Fanak, pelo que a primeira execução descarrega o ambiente de execução e pode demorar um momento.', + link: '<1> <2>Repositório do Fanak <3> <4>Documentação do Fanak <5> <6>Documentação do LiveCodes <7> <8>Carregar modelo inicial ', + name: 'Fanak', + }, fennel: { desc: 'Fennel é uma linguagem de programação que une a velocidade, simplicidade e alcance do Lua com a flexibilidade de uma sintaxe lisp e sistema de macros.', link: '<1> <2>Site oficial do Fennel <3> <4>Começando com Fennel <5> <6>Documentação do LiveCodes <7> <8>Carregar modelo inicial ', diff --git a/src/livecodes/i18n/locales/pt/translation.lokalise.json b/src/livecodes/i18n/locales/pt/translation.lokalise.json index a9f4e98a9f..8d80a73ec9 100644 --- a/src/livecodes/i18n/locales/pt/translation.lokalise.json +++ b/src/livecodes/i18n/locales/pt/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.elm": { "translation": "Iniciante Elm" }, + "templates.starter.fanak": { + "translation": "Iniciante Fanak" + }, "templates.starter.fennel": { "translation": "Iniciante Fennel" }, diff --git a/src/livecodes/i18n/locales/pt/translation.ts b/src/livecodes/i18n/locales/pt/translation.ts index b08a6eb025..27751ab0e3 100644 --- a/src/livecodes/i18n/locales/pt/translation.ts +++ b/src/livecodes/i18n/locales/pt/translation.ts @@ -997,6 +997,7 @@ const translation: I18nTranslation = { daisyui: 'Iniciante daisyUI', diagrams: 'Iniciante Diagrams', elm: 'Iniciante Elm', + fanak: 'Iniciante Fanak', fennel: 'Iniciante Fennel', fsharp: 'Iniciante F#', 'fsharp-wasm': 'Iniciante F# (Wasm)', diff --git a/src/livecodes/i18n/locales/ru/language-info.lokalise.json b/src/livecodes/i18n/locales/ru/language-info.lokalise.json index 76c5c5f4fc..9b8c12ffbf 100644 --- a/src/livecodes/i18n/locales/ru/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/ru/language-info.lokalise.json @@ -207,6 +207,15 @@ "eta.name": { "translation": "Eta" }, + "fanak.desc": { + "translation": "Fanak — это функциональный язык программирования, который компилируется в CIL (.NET). Его компилятор и среда выполнения .NET WebAssembly работают полностью в браузере и загружаются из проекта Fanak, поэтому при первом запуске среда выполнения скачивается, что может занять некоторое время." + }, + "fanak.link": { + "translation": " Репозиторий Fanak Документация по Fanak Документация LiveCodes Загрузить стартовый шаблон " + }, + "fanak.name": { + "translation": "Fanak" + }, "fennel.desc": { "translation": "Fennel - это язык программирования, который объединяет скорость, простоту и охват Lua с гибкостью синтаксиса и системы макросов Lisp." }, diff --git a/src/livecodes/i18n/locales/ru/language-info.ts b/src/livecodes/i18n/locales/ru/language-info.ts index 791f0d80b4..e662aef78c 100644 --- a/src/livecodes/i18n/locales/ru/language-info.ts +++ b/src/livecodes/i18n/locales/ru/language-info.ts @@ -121,6 +121,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>Официальный сайт <3> <4>Документация <5> <6>Документация LiveCodes ', name: 'Eta', }, + fanak: { + desc: 'Fanak — это функциональный язык программирования, который компилируется в CIL (.NET). Его компилятор и среда выполнения .NET WebAssembly работают полностью в браузере и загружаются из проекта Fanak, поэтому при первом запуске среда выполнения скачивается, что может занять некоторое время.', + link: '<1> <2>Репозиторий Fanak <3> <4>Документация по Fanak <5> <6>Документация LiveCodes <7> <8>Загрузить стартовый шаблон ', + name: 'Fanak', + }, fennel: { desc: 'Fennel - это язык программирования, который объединяет скорость, простоту и охват Lua с гибкостью синтаксиса и системы макросов Lisp.', link: '<1> <2>Официальный сайт Fennel <3> <4>Начало работы с Fennel <5> <6>Документация LiveCodes <7> <8>Загрузить стартовый шаблон ', diff --git a/src/livecodes/i18n/locales/ru/translation.lokalise.json b/src/livecodes/i18n/locales/ru/translation.lokalise.json index 555a504e14..d56a419821 100644 --- a/src/livecodes/i18n/locales/ru/translation.lokalise.json +++ b/src/livecodes/i18n/locales/ru/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.elm": { "translation": "Стартер Elm" }, + "templates.starter.fanak": { + "translation": "Стартер Fanak" + }, "templates.starter.fennel": { "translation": "Стартер Fennel" }, diff --git a/src/livecodes/i18n/locales/ru/translation.ts b/src/livecodes/i18n/locales/ru/translation.ts index 37c1cde383..ca892a017b 100644 --- a/src/livecodes/i18n/locales/ru/translation.ts +++ b/src/livecodes/i18n/locales/ru/translation.ts @@ -996,6 +996,7 @@ const translation: I18nTranslation = { daisyui: 'Стартер daisyUI', diagrams: 'Стартер диаграмм', elm: 'Стартер Elm', + fanak: 'Стартер Fanak', fennel: 'Стартер Fennel', fsharp: 'Стартер F#', 'fsharp-wasm': 'Стартер F# (Wasm)', diff --git a/src/livecodes/i18n/locales/tr/language-info.lokalise.json b/src/livecodes/i18n/locales/tr/language-info.lokalise.json index 78771904f1..459e854398 100644 --- a/src/livecodes/i18n/locales/tr/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/tr/language-info.lokalise.json @@ -207,6 +207,15 @@ "eta.name": { "translation": "Eta" }, + "fanak.desc": { + "translation": "Fanak, CIL (.NET) diline derlenen işlevsel bir programlama dilidir. Derleyicisi ve .NET WebAssembly çalışma zamanı tamamen tarayıcıda çalışır ve Fanak projesinden alınır; bu nedenle ilk çalıştırmada çalışma zamanı indirilir ve bu biraz zaman alabilir." + }, + "fanak.link": { + "translation": " Fanak deposu Fanak belgeleri LiveCodes Belgeleri Başlangıç şablonunu yükle " + }, + "fanak.name": { + "translation": "Fanak" + }, "fennel.desc": { "translation": "Fennel, Lua'nın hızını, basitliğini ve erişimini bir lisp sözdizimi ve makro sisteminin esnekliğiyle birleştiren bir programlama dilidir." }, diff --git a/src/livecodes/i18n/locales/tr/language-info.ts b/src/livecodes/i18n/locales/tr/language-info.ts index 81a269936b..1357b5c61b 100644 --- a/src/livecodes/i18n/locales/tr/language-info.ts +++ b/src/livecodes/i18n/locales/tr/language-info.ts @@ -120,6 +120,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>Resmi web sitesi <3> <4>Dokümantasyon <5> <6>LiveCodes Dokümantasyonu ', name: 'Eta', }, + fanak: { + desc: 'Fanak, CIL (.NET) diline derlenen işlevsel bir programlama dilidir. Derleyicisi ve .NET WebAssembly çalışma zamanı tamamen tarayıcıda çalışır ve Fanak projesinden alınır; bu nedenle ilk çalıştırmada çalışma zamanı indirilir ve bu biraz zaman alabilir.', + link: '<1> <2>Fanak deposu <3> <4>Fanak belgeleri <5> <6>LiveCodes Belgeleri <7> <8>Başlangıç şablonunu yükle ', + name: 'Fanak', + }, fennel: { desc: "Fennel, Lua'nın hızını, basitliğini ve erişimini bir lisp sözdizimi ve makro sisteminin esnekliğiyle birleştiren bir programlama dilidir.", link: "<1> <2>Fennel resmi web sitesi <3> <4>Fennel'e Başlarken <5> <6>LiveCodes Dokümantasyonu <7> <8>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 48f581a7e0..f3b871ef0c 100644 --- a/src/livecodes/i18n/locales/tr/translation.lokalise.json +++ b/src/livecodes/i18n/locales/tr/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.elm": { "translation": "Elm Başlangıç" }, + "templates.starter.fanak": { + "translation": "Fanak Başlangıç" + }, "templates.starter.fennel": { "translation": "Fennel Başlangıç" }, diff --git a/src/livecodes/i18n/locales/tr/translation.ts b/src/livecodes/i18n/locales/tr/translation.ts index 77025c5968..317dd798c6 100644 --- a/src/livecodes/i18n/locales/tr/translation.ts +++ b/src/livecodes/i18n/locales/tr/translation.ts @@ -997,6 +997,7 @@ const translation: I18nTranslation = { daisyui: 'daisyUI Başlangıç', diagrams: 'Diyagramlar Başlangıç', elm: 'Elm Başlangıç', + fanak: 'Fanak Başlangıç', fennel: 'Fennel Başlangıç', fsharp: 'F# Başlangıç', 'fsharp-wasm': 'F# (Wasm) 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 e836b2d5b2..8589817f35 100644 --- a/src/livecodes/i18n/locales/ur/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/ur/language-info.lokalise.json @@ -207,6 +207,15 @@ "eta.name": { "translation": "ایٹا" }, + "fanak.desc": { + "translation": "Fanak ایک فنکشنل پروگرامنگ لینگویج ہے جو CIL (.NET) میں کمپائل ہوتی ہے۔ اس کا کمپائلر اور .NET WebAssembly رن ٹائم مکمل طور پر براؤزر میں چلتے ہیں، جو Fanak پروجیکٹ سے حاصل کیے جاتے ہیں، اس لیے پہلی بار چلانے پر رن ٹائم ڈاؤن لوڈ ہوتا ہے اور اس میں کچھ وقت لگ سکتا ہے۔" + }, + "fanak.link": { + "translation": " Fanak ریپو Fanak دستاویزات LiveCodes دستاویزی لوڈ اسٹارٹر ٹیمپلیٹ " + }, + "fanak.name": { + "translation": "Fanak" + }, "fennel.desc": { "translation": "فینل ایک پروگرامنگ زبان ہے جو لوا کی رفتار، سادگی اور پہنچ کو لسپ نحو اور میکرو سسٹم کی لچک کے ساتھ جمع کرتی ہے۔" }, diff --git a/src/livecodes/i18n/locales/ur/language-info.ts b/src/livecodes/i18n/locales/ur/language-info.ts index 894a3292c1..e8f1835f5b 100644 --- a/src/livecodes/i18n/locales/ur/language-info.ts +++ b/src/livecodes/i18n/locales/ur/language-info.ts @@ -121,6 +121,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>سرکاری ویب سائٹ <3> <4>دستاویزات <5> <6>لائیو کوڈز دستاویزات ', name: 'ایٹا', }, + fanak: { + desc: 'Fanak ایک فنکشنل پروگرامنگ لینگویج ہے جو CIL (.NET) میں کمپائل ہوتی ہے۔ اس کا کمپائلر اور .NET WebAssembly رن ٹائم مکمل طور پر براؤزر میں چلتے ہیں، جو Fanak پروجیکٹ سے حاصل کیے جاتے ہیں، اس لیے پہلی بار چلانے پر رن ٹائم ڈاؤن لوڈ ہوتا ہے اور اس میں کچھ وقت لگ سکتا ہے۔', + link: '<1> <2>Fanak ریپو <3> <4>Fanak دستاویزات <5> <6>LiveCodes دستاویزی <7> <8>لوڈ اسٹارٹر ٹیمپلیٹ ', + name: 'Fanak', + }, fennel: { desc: 'فینل ایک پروگرامنگ زبان ہے جو لوا کی رفتار، سادگی اور پہنچ کو لسپ نحو اور میکرو سسٹم کی لچک کے ساتھ جمع کرتی ہے۔', link: '<1> <2>فینل کی سرکاری ویب سائٹ <3> <4>فینل کے ساتھ شروعات <5> <6>لائیو کوڈز دستاویزات <7> <8>ابتدائی سانچہ لوڈ کریں ', diff --git a/src/livecodes/i18n/locales/ur/translation.lokalise.json b/src/livecodes/i18n/locales/ur/translation.lokalise.json index e3c100f646..7480f23a61 100644 --- a/src/livecodes/i18n/locales/ur/translation.lokalise.json +++ b/src/livecodes/i18n/locales/ur/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.elm": { "translation": "ایلم شروعاتی" }, + "templates.starter.fanak": { + "translation": "Fanak شروعاتی" + }, "templates.starter.fennel": { "translation": "فینل شروعاتی" }, diff --git a/src/livecodes/i18n/locales/ur/translation.ts b/src/livecodes/i18n/locales/ur/translation.ts index de0e09e88a..7fa12626f2 100644 --- a/src/livecodes/i18n/locales/ur/translation.ts +++ b/src/livecodes/i18n/locales/ur/translation.ts @@ -996,6 +996,7 @@ const translation: I18nTranslation = { daisyui: 'daisyUI شروعاتی', diagrams: 'ڈایاگرامز شروعاتی', elm: 'ایلم شروعاتی', + fanak: 'Fanak شروعاتی', fennel: 'فینل شروعاتی', fsharp: 'F# شروعاتی', 'fsharp-wasm': 'F# (واسم) شروعاتی', 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 21618b6c8f..d1cea57d39 100644 --- a/src/livecodes/i18n/locales/zh-CN/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/zh-CN/language-info.lokalise.json @@ -207,6 +207,15 @@ "eta.name": { "translation": "Eta" }, + "fanak.desc": { + "translation": "Fanak 是一种编译为 CIL (.NET) 的函数式编程语言。其编译器和 .NET WebAssembly 运行时完全在浏览器中运行,并从 Fanak 项目获取,因此首次运行时会下载运行时,可能需要一些时间。" + }, + "fanak.link": { + "translation": " Fanak 仓库 Fanak 文档 LiveCodes 文档 加载入门模板 " + }, + "fanak.name": { + "translation": "Fanak" + }, "fennel.desc": { "translation": "Fennel 是一种编程语言,它结合了 Lua 的快速、简洁和广泛性以及 Lisp 语法和宏系统的灵活性。" }, diff --git a/src/livecodes/i18n/locales/zh-CN/language-info.ts b/src/livecodes/i18n/locales/zh-CN/language-info.ts index 5673a2f181..2f6e4bdcd3 100644 --- a/src/livecodes/i18n/locales/zh-CN/language-info.ts +++ b/src/livecodes/i18n/locales/zh-CN/language-info.ts @@ -119,6 +119,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>官方网站 <3> <4>文档 <5> <6>LiveCodes 文档 ', name: 'Eta', }, + fanak: { + desc: 'Fanak 是一种编译为 CIL (.NET) 的函数式编程语言。其编译器和 .NET WebAssembly 运行时完全在浏览器中运行,并从 Fanak 项目获取,因此首次运行时会下载运行时,可能需要一些时间。', + link: '<1> <2>Fanak 仓库 <3> <4>Fanak 文档 <5> <6>LiveCodes 文档 <7> <8>加载入门模板 ', + name: 'Fanak', + }, fennel: { desc: 'Fennel 是一种编程语言,它结合了 Lua 的快速、简洁和广泛性以及 Lisp 语法和宏系统的灵活性。', link: '<1> <2>Fennel 官方网站 <3> <4>Fennel 入门 <5> <6>LiveCodes 文档 <7> <8>加载启动模板 ', diff --git a/src/livecodes/i18n/locales/zh-CN/translation.lokalise.json b/src/livecodes/i18n/locales/zh-CN/translation.lokalise.json index 8baeaa45d1..1f9003607d 100644 --- a/src/livecodes/i18n/locales/zh-CN/translation.lokalise.json +++ b/src/livecodes/i18n/locales/zh-CN/translation.lokalise.json @@ -1971,6 +1971,9 @@ "templates.starter.elm": { "translation": "Elm 启动模板" }, + "templates.starter.fanak": { + "translation": "Fanak 启动模板" + }, "templates.starter.fennel": { "translation": "Fennel 启动模板" }, diff --git a/src/livecodes/i18n/locales/zh-CN/translation.ts b/src/livecodes/i18n/locales/zh-CN/translation.ts index c90e5e0ce6..5778e5ca5f 100644 --- a/src/livecodes/i18n/locales/zh-CN/translation.ts +++ b/src/livecodes/i18n/locales/zh-CN/translation.ts @@ -994,6 +994,7 @@ const translation: I18nTranslation = { daisyui: 'daisyUI 启动模板', diagrams: '图表启动模板', elm: 'Elm 启动模板', + fanak: 'Fanak 启动模板', fennel: 'Fennel 启动模板', fsharp: 'F# 启动模板', 'fsharp-wasm': 'F#(WASM)启动模板',