From 04ac6e03437102d12d35d9b413f06c5861f86e9a Mon Sep 17 00:00:00 2001 From: Hatem Hosny Date: Sun, 4 Oct 2026 08:34:59 +0300 Subject: [PATCH 1/7] feat(Compilers): add Blazor support --- .../language-support/references/languages.md | 1 + README.md | 2 +- docs/docs/languages/blazor-wasm.mdx | 134 +++++++++++ docs/src/components/LanguageSliders.tsx | 1 + docs/src/components/TemplateList.tsx | 1 + e2e/specs/starter.spec.ts | 46 ++++ functions/vendors/templates.js | 1 + scripts/build.js | 1 + server/php/inc/starter-templates.json | 1 + src/livecodes/UI/command-menu-actions.ts | 1 + src/livecodes/assets/templates/blazor.svg | 1 + src/livecodes/html/language-info.html | 44 ++++ .../locales/en/language-info.lokalise.json | 12 + .../i18n/locales/en/language-info.ts | 5 + .../i18n/locales/en/translation.lokalise.json | 4 + src/livecodes/i18n/locales/en/translation.ts | 1 + .../__tests__/lang-blazor-wasm.spec.ts | 40 ++++ src/livecodes/languages/blazor-wasm/index.ts | 1 + .../blazor-wasm/lang-blazor-wasm-script.ts | 218 ++++++++++++++++++ .../languages/blazor-wasm/lang-blazor-wasm.ts | 31 +++ src/livecodes/languages/languages.ts | 2 + src/livecodes/models.ts | 3 + .../templates/starter/blazor-wasm-starter.ts | 53 +++++ src/livecodes/templates/starter/index.ts | 2 + src/livecodes/vendors.ts | 7 +- src/sdk/models.ts | 7 + storybook/_stories/EmbedOptions/template.ts | 1 + vendor-licenses.md | 4 + 28 files changed, 620 insertions(+), 5 deletions(-) create mode 100644 docs/docs/languages/blazor-wasm.mdx create mode 100644 src/livecodes/assets/templates/blazor.svg create mode 100644 src/livecodes/languages/blazor-wasm/__tests__/lang-blazor-wasm.spec.ts create mode 100644 src/livecodes/languages/blazor-wasm/index.ts create mode 100644 src/livecodes/languages/blazor-wasm/lang-blazor-wasm-script.ts create mode 100644 src/livecodes/languages/blazor-wasm/lang-blazor-wasm.ts create mode 100644 src/livecodes/templates/starter/blazor-wasm-starter.ts diff --git a/.agents/skills/livecodes/language-support/references/languages.md b/.agents/skills/livecodes/language-support/references/languages.md index 2927816918..66a48dcb2f 100644 --- a/.agents/skills/livecodes/language-support/references/languages.md +++ b/.agents/skills/livecodes/language-support/references/languages.md @@ -125,6 +125,7 @@ Enabled via `processors` config: | Objective-C++ | `objcpp-wasm`, `objcpp`, `wasm.mm` | Clang WASM | | Java | `java` | Java runtime | | C# | `csharp-wasm`, `cs`, `cs-wasm`, `wasm.cs` | C# WASM | +| Blazor (Wasm) | `blazor-wasm`, `blazor`, `razor`, `razor-wasm`, `wasm.razor` | Razor components rendered by Blazor (WASM) | | VB.NET | `vb-wasm`, `vb`, `vbnet`, `wasm.vb` | VB.NET WASM | | F# | `fsharp`, `fs`, `fsx` | Fable (F# -> JS) | | F# (Wasm) | `fsharp-wasm`, `fs-wasm`, `wasm.fs` | .NET WASM | diff --git a/README.md b/README.md index f9caeb6746..332177b006 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-113-blue)](https://livecodes.io/docs/languages/) +[![LiveCodes: languages](https://img.shields.io/badge/languages-114-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/blazor-wasm.mdx b/docs/docs/languages/blazor-wasm.mdx new file mode 100644 index 0000000000..4fea18ccd7 --- /dev/null +++ b/docs/docs/languages/blazor-wasm.mdx @@ -0,0 +1,134 @@ +# Blazor (Wasm) + +[Blazor](https://dotnet.microsoft.com/en-us/apps/aspnet/web-apps/blazor) is a framework for building interactive web UIs with C# and Razor, running on .NET WebAssembly. + +In LiveCodes, Razor components are compiled in the browser by the real Razor compiler and Roslyn, and rendered by Blazor WebAssembly. Nothing is sent to a server: the compiler, the .NET runtime and the reference assemblies all run in the page. + +## Usage + +Demo: + + +import LiveCodes from '../../src/components/LiveCodes.tsx'; +export const blazorConfig = { + activeEditor: 'script', + script: { + language: 'blazor-wasm', + content: `

Counter

+ +

Current count: @count

+ + + +@code { + private int count = 0; + + private void IncrementCount() => count++; +}`, + }, + style: { + language: 'css', + content: `.btn { + font: inherit; + padding: 0.4em 1.1em; + cursor: pointer; +}`, + }, + mode: 'simple', + editor: 'auto', + tools: { + status: 'full', + }, +}; + + + + +### Communication with JavaScript + +The component runs in the context of the result page. A few helpers are available in the browser global `livecodes.blazorWasm` object: + +- `livecodes.blazorWasm.loaded`: A promise that resolves when the .NET WebAssembly runtime, Roslyn and the Razor compiler are loaded. Other helpers should be used after this promise resolves. +- `livecodes.blazorWasm.render`: A function that compiles and renders Razor markup. It takes a string of Razor markup as input and returns a promise that resolves with an object containing the `output`, `error`, and `exitCode` properties. +- `livecodes.blazorWasm.runner`: The underlying [`@live-codes/blazor-wasm`](https://www.npmjs.com/package/@live-codes/blazor-wasm) runner, which also exposes `renderProject` (multi-file projects), `render`, `navigateTo` (for `@page` routing) and `payloads`. +- `livecodes.blazorWasm.routes`: The routes declared by `@page` directives in the rendered component. +- `livecodes.blazorWasm.navigateTo`: A function that drives the host's client-side navigation, for `@page` routing. + +Example: + + + + + +## Language Info + +### Name + +`blazor-wasm` + +### Aliases / Extensions + +`razor`, `blazor`, `razor-wasm`, `wasm.razor` + +### Editor + +`script` + +## Compiler + +The real Razor compiler and Roslyn, compiled to WebAssembly, together with the .NET WebAssembly runtime and the Blazor WebAssembly host — loaded at run time from the [`@live-codes/blazor-wasm`](https://www.npmjs.com/package/@live-codes/blazor-wasm) package. + +### Version + +.NET 10 + +## Limitations + +### Blazor components only + +Only **Blazor components** (`.razor`) are supported, not Razor Pages or MVC views. MVC-only directives such as `@model`, `@section` and tag helpers neither compile nor run. Use the Blazor equivalents: + +| Razor Pages / MVC | Blazor equivalent | +| ------------------------------------- | ------------------------------------------------------------------------- | +| `@model T` | `[Parameter] public T Model { get; set; }` | +| `@section Name { ... }` | a layout component that renders `@Body` (or a `RenderFragment` parameter) | +| tag helpers (`@addTagHelper`, `asp-`) | Blazor components and plain HTML with `@onclick` / `@bind` | +| `@functions { ... }` | `@code { ... }` | +| `@inherits RazorPage` | `@inherits ComponentBase` (components already derive from `ComponentBase`) | + +`@inject` works, but only for services the host already registers (`NavigationManager`, `IJSRuntime`, ...). `Program.cs` is not editable, so custom services cannot be registered. Razor Pages need the MVC view engine (`ViewContext`, tag-helper activation, sections, model binding, `HttpContext`), which a Blazor WebAssembly host does not include — even compiling a `.cshtml` file would fail at run time. + +### Other limitations + +- The first Razor compile takes a few seconds while the Razor generator warms up. Warm renders are fast. +- The runtime and the reference assemblies are downloaded on the first run, so the first compile is a large download. +- `wwwroot/` files are served as data URLs, so `url(...)` inside CSS and `fetch()` do not resolve; only `src`/`href`/`poster` attributes are rewritten. + +## Example Usage + +```razor +

Hello, Blazor!

+ + + +@code { + private int count; + + private void Increment() => count++; +} +``` + +## Live Reload + +Because the component tree is rendered into the result page DOM, a code change reloads the result page and initializes the .NET WebAssembly runtime again. Adding the code comment `// __livecodes_reload__` has no additional effect (a full reload is always used). + +## Starter Template + +https://livecodes.io/?template=blazor-wasm + +## Links + +- [Blazor](https://dotnet.microsoft.com/en-us/apps/aspnet/web-apps/blazor) +- [Blazor components](https://learn.microsoft.com/en-us/aspnet/core/blazor/components/) +- [Razor syntax reference](https://learn.microsoft.com/en-us/aspnet/core/mvc/views/razor) +- [@live-codes/blazor-wasm](https://www.npmjs.com/package/@live-codes/blazor-wasm) diff --git a/docs/src/components/LanguageSliders.tsx b/docs/src/components/LanguageSliders.tsx index 956e0935b8..aec340f1d8 100644 --- a/docs/src/components/LanguageSliders.tsx +++ b/docs/src/components/LanguageSliders.tsx @@ -99,6 +99,7 @@ export default function Sliders() { { name: 'zig-wasm', title: 'Zig (Wasm)' }, { name: 'java', title: 'Java' }, { name: 'csharp-wasm', title: 'C# (Wasm)' }, + { name: 'blazor-wasm', title: 'Blazor (Wasm)' }, { name: 'vb-wasm', title: 'VB.NET (Wasm)' }, { name: 'fsharp', title: 'F#' }, { name: 'fsharp-wasm', title: 'F# (Wasm)' }, diff --git a/docs/src/components/TemplateList.tsx b/docs/src/components/TemplateList.tsx index 7db8a59c35..31772d078a 100644 --- a/docs/src/components/TemplateList.tsx +++ b/docs/src/components/TemplateList.tsx @@ -57,6 +57,7 @@ const templates = [ { name: 'zig-wasm', title: 'Zig (Wasm) Starter', thumbnail: 'zig.svg' }, { name: 'java', title: 'Java Starter', thumbnail: 'java.svg' }, { name: 'csharp-wasm', title: 'C# (Wasm)', thumbnail: 'csharp.svg' }, + { name: 'blazor-wasm', title: 'Blazor (Wasm) Starter', thumbnail: 'blazor.svg' }, { 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' }, diff --git a/e2e/specs/starter.spec.ts b/e2e/specs/starter.spec.ts index 5ef88c2b79..8dae79225d 100644 --- a/e2e/specs/starter.spec.ts +++ b/e2e/specs/starter.spec.ts @@ -561,6 +561,31 @@ test.describe('Starter Templates from UI', () => { await expect(getResult().locator('text=You clicked')).toHaveText('You clicked 3 times.'); }); + test('Blazor (Wasm) Starter', async ({ page, getTestUrl }) => { + // the .NET runtime, Roslyn and the Razor compiler (~40 MB) are downloaded on the first run + test.slow(); + + await page.goto(getTestUrl()); + + const { app, getResult, waitForResultUpdate } = await getLoadedApp(page); + + await app.click('[aria-label="Project"]'); + await app.click('text=New'); + await app.click('text=Blazor (Wasm) Starter'); + + await waitForEditorFocus(app); + await waitForResultUpdate(); + + // the component renders once the runtime and the Razor compiler have loaded + await expect(getResult().locator('h1')).toHaveText('Hello, Blazor!', { timeout: 280_000 }); + + await getResult().click('text=Click me'); + await getResult().click('text=Click me'); + await getResult().click('text=Click me'); + + await expect(getResult().locator('text=You clicked')).toHaveText('You clicked 3 times.'); + }); + test('d3 Starter', async ({ page, getTestUrl, editor }) => { test.slow(); @@ -1308,6 +1333,27 @@ test.describe('Starter Templates from URL', () => { await expect(getResult().locator('text=You clicked')).toHaveText('You clicked 3 times.'); }); + test('Blazor (Wasm) Starter (in URL)', async ({ page, getTestUrl }) => { + // the .NET runtime, Roslyn and the Razor compiler (~40 MB) are downloaded on the first run + test.slow(); + + await page.goto(getTestUrl({ template: 'blazor-wasm' })); + + const { app, getResult, waitForResultUpdate } = await getLoadedApp(page); + + await waitForEditorFocus(app); + await waitForResultUpdate(); + + // the component renders once the runtime and the Razor compiler have loaded + await expect(getResult().locator('h1')).toHaveText('Hello, Blazor!', { timeout: 280_000 }); + + await getResult().click('text=Click me'); + await getResult().click('text=Click me'); + await getResult().click('text=Click me'); + + await expect(getResult().locator('text=You clicked')).toHaveText('You clicked 3 times.'); + }); + test('D3 Starter (in URL)', async ({ page, getTestUrl, editor }) => { test.slow(); diff --git a/functions/vendors/templates.js b/functions/vendors/templates.js index 2313e9b4ca..3f6a851976 100644 --- a/functions/vendors/templates.js +++ b/functions/vendors/templates.js @@ -55,6 +55,7 @@ export const starterTemplates = { "zig-wasm": "Zig (Wasm) Starter", "java": "Java Starter", "csharp-wasm": "C# (Wasm) Starter", + "blazor-wasm": "Blazor (Wasm) Starter", "vb-wasm": "VB.NET (Wasm) Starter", "fsharp": "F# Starter", "fsharp-wasm": "F# (Wasm) Starter", diff --git a/scripts/build.js b/scripts/build.js index a08e3f1385..53bc4f1d29 100644 --- a/scripts/build.js +++ b/scripts/build.js @@ -270,6 +270,7 @@ const iifeBuild = () => 'languages/swift-wasm/lang-swift-wasm-script.ts', 'languages/ada-wasm/lang-ada-wasm-script.ts', 'languages/assembly-wasm/lang-assembly-wasm-script.ts', + 'languages/blazor-wasm/lang-blazor-wasm-script.ts', 'languages/sql/lang-sql-script.ts', 'languages/svelte/lang-svelte-compiler.ts', 'languages/tcl/lang-tcl-script.ts', diff --git a/server/php/inc/starter-templates.json b/server/php/inc/starter-templates.json index 058e77398d..5b465e2502 100644 --- a/server/php/inc/starter-templates.json +++ b/server/php/inc/starter-templates.json @@ -55,6 +55,7 @@ "zig-wasm": "Zig (Wasm) Starter", "java": "Java Starter", "csharp-wasm": "C# (Wasm) Starter", + "blazor-wasm": "Blazor (Wasm) Starter", "vb-wasm": "VB.NET (Wasm) Starter", "fsharp": "F# Starter", "fsharp-wasm": "F# (Wasm) Starter", diff --git a/src/livecodes/UI/command-menu-actions.ts b/src/livecodes/UI/command-menu-actions.ts index 1ea5817699..62a0f18e71 100644 --- a/src/livecodes/UI/command-menu-actions.ts +++ b/src/livecodes/UI/command-menu-actions.ts @@ -311,6 +311,7 @@ export const getCommandMenuActions = ({ 'zig-wasm', 'java', 'csharp-wasm', + 'blazor-wasm', 'vb-wasm', 'fsharp', 'fsharp-wasm', diff --git a/src/livecodes/assets/templates/blazor.svg b/src/livecodes/assets/templates/blazor.svg new file mode 100644 index 0000000000..2f5a30cfe0 --- /dev/null +++ b/src/livecodes/assets/templates/blazor.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/livecodes/html/language-info.html b/src/livecodes/html/language-info.html index 39874d1926..dbb840cc43 100644 --- a/src/livecodes/html/language-info.html +++ b/src/livecodes/html/language-info.html @@ -595,6 +595,50 @@

C# (Wasm)

+
+

Blazor (Wasm)

+
+ Razor components compiled by the real + Razor compiler and + Roslyn, and rendered + by + Blazor WebAssembly + on the .NET WebAssembly runtime — all in the browser, with no server. +
+ +

Diagrams

(Experimental)
diff --git a/src/livecodes/i18n/locales/en/language-info.lokalise.json b/src/livecodes/i18n/locales/en/language-info.lokalise.json index f5011ad020..956ae87da4 100644 --- a/src/livecodes/i18n/locales/en/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/en/language-info.lokalise.json @@ -96,6 +96,18 @@ "notes": "", "translation": "BBCode" }, + "blazorWasm.desc": { + "notes": "### ###\n\n\n### ###\n\n\n### ###\n\n\n", + "translation": "Razor components compiled by the real Razor compiler and Roslyn, and rendered by Blazor WebAssembly on the .NET WebAssembly runtime — all in the browser, with no server." + }, + "blazorWasm.link": { + "notes": "### ###\n
  • \n\n### ###\n\n\n### ###\n
  • \n\n### ###\n\n\n### ###\n
  • \n\n### ###\n\n\n### ###\n
  • \n\n### ###\n\n\n", + "translation": " Blazor documentation ASP.NET Core Blazor components LiveCodes Documentation Load starter template " + }, + "blazorWasm.name": { + "notes": "", + "translation": "Blazor (Wasm)" + }, "blockly.desc": { "notes": "", "translation": "A JavaScript library for building visual programming editors." diff --git a/src/livecodes/i18n/locales/en/language-info.ts b/src/livecodes/i18n/locales/en/language-info.ts index 4315e876a3..b203fa7174 100644 --- a/src/livecodes/i18n/locales/en/language-info.ts +++ b/src/livecodes/i18n/locales/en/language-info.ts @@ -50,6 +50,11 @@ const languageInfo = { link: '<1><2>bbcode.org <3> <4>BBCode guide <5> <6>BBCode on Wikipedia ', name: 'BBCode', }, + blazorWasm: { + desc: 'Razor components compiled by the real <1>Razor compiler and <2>Roslyn, and rendered by <3>Blazor WebAssembly on the .NET WebAssembly runtime — all in the browser, with no server.', + link: '<1> <2>Blazor documentation <3> <4>ASP.NET Core Blazor components <5> <6>LiveCodes Documentation <7> <8>Load starter template ', + name: 'Blazor (Wasm)', + }, blockly: { desc: 'A JavaScript library for building visual programming editors.', link: '<1> <2>Official website <3> <4>Guides <5> <6>Reference <7> <8>Samples <9> <10>Load starter template ', diff --git a/src/livecodes/i18n/locales/en/translation.lokalise.json b/src/livecodes/i18n/locales/en/translation.lokalise.json index 2a6eb9c881..092739ff83 100644 --- a/src/livecodes/i18n/locales/en/translation.lokalise.json +++ b/src/livecodes/i18n/locales/en/translation.lokalise.json @@ -2572,6 +2572,10 @@ "notes": "", "translation": "Blank Project" }, + "templates.starter.blazor-wasm": { + "notes": "", + "translation": "Blazor (Wasm) Starter" + }, "templates.starter.blockly": { "notes": "", "translation": "Blockly Starter" diff --git a/src/livecodes/i18n/locales/en/translation.ts b/src/livecodes/i18n/locales/en/translation.ts index 747a090e42..6510d84663 100644 --- a/src/livecodes/i18n/locales/en/translation.ts +++ b/src/livecodes/i18n/locales/en/translation.ts @@ -989,6 +989,7 @@ const translation = { astro: 'Astro Starter', backbone: 'Backbone Starter', blank: 'Blank Project', + 'blazor-wasm': 'Blazor (Wasm) Starter', blockly: 'Blockly Starter', bootstrap: 'Bootstrap Starter', 'c-wasm': 'C (Wasm) Starter', diff --git a/src/livecodes/languages/blazor-wasm/__tests__/lang-blazor-wasm.spec.ts b/src/livecodes/languages/blazor-wasm/__tests__/lang-blazor-wasm.spec.ts new file mode 100644 index 0000000000..83b330eef6 --- /dev/null +++ b/src/livecodes/languages/blazor-wasm/__tests__/lang-blazor-wasm.spec.ts @@ -0,0 +1,40 @@ +import type { CompileOptions, Compiler, Config } from '../../../models'; +import { blazorWasm } from '../lang-blazor-wasm'; + +describe('blazor-wasm', () => { + const compiler = blazorWasm.compiler as Compiler; + + test('has the expected name, title and extensions', () => { + expect(blazorWasm.name).toBe('blazor-wasm'); + expect(blazorWasm.title).toBe('Blazor (Wasm)'); + expect(blazorWasm.extensions).toEqual( + expect.arrayContaining(['razor', 'blazor', 'razor-wasm', 'wasm.razor']), + ); + }); + + test('uses the script editor with the text/razor script type', () => { + expect(blazorWasm.editor).toBe('script'); + expect(compiler.scriptType).toBe('text/razor'); + expect(compiler.compiledCodeLanguage).toBe('blazor-wasm'); + }); + + test('loads only the runner script on the page (compilation happens in the result page)', () => { + const scripts = + typeof compiler.scripts === 'function' + ? compiler.scripts({ baseUrl: 'base/', config: {} as Config, compiled: '' }) + : compiler.scripts; + expect(scripts).toEqual(['base/{{hash:lang-blazor-wasm-script.js}}']); + }); + + test('compiler factory is the identity (Razor compiles in the result page)', async () => { + const fn = await compiler.factory({} as Config, ''); + const code = '

    Hello, @name!

    '; + expect(await fn(code, {} as CompileOptions as any)).toBe(code); + }); + + test('advertises editor support for Razor', () => { + expect(blazorWasm.editorSupport?.monaco?.language).toBe('razor'); + expect(blazorWasm.editorSupport?.monaco?.languageSupport).toMatch(/razor\.js$/); + expect(blazorWasm.editorSupport?.codejar?.language).toBe('razor'); + }); +}); diff --git a/src/livecodes/languages/blazor-wasm/index.ts b/src/livecodes/languages/blazor-wasm/index.ts new file mode 100644 index 0000000000..9a7613f601 --- /dev/null +++ b/src/livecodes/languages/blazor-wasm/index.ts @@ -0,0 +1 @@ +export * from './lang-blazor-wasm'; diff --git a/src/livecodes/languages/blazor-wasm/lang-blazor-wasm-script.ts b/src/livecodes/languages/blazor-wasm/lang-blazor-wasm-script.ts new file mode 100644 index 0000000000..e0a8ab8683 --- /dev/null +++ b/src/livecodes/languages/blazor-wasm/lang-blazor-wasm-script.ts @@ -0,0 +1,218 @@ +/* eslint-disable no-console */ +import { getErrorMessage } from '../../utils/utils'; +import { blazorWasmBaseUrl } from '../../vendors'; + +// Razor markup (and C#) is compiled and rendered in the result page by +// @live-codes/blazor-wasm. The bundle loads the .NET WebAssembly runtime, Roslyn and the Razor +// compiler into the page (no server), which is why the language is marked `largeDownload`. +// +// The language source arrives in a `text/razor` script tag. This script loads the bundle's +// loader (`blazor-wasm.js`), creates a runner and renders the component. `baseUrl` is passed +// explicitly so the payloads (refs.zip / razor.zip) are fetched from the pinned version; the +// loader patches `fetch` for `credentials: 'omit'` on its own. +// +// The component tree is bound to the result page DOM, so the language does not use live reload: +// a code change reloads the result page (see the docs). + +const SCRIPT_TYPE = 'text/razor'; +// Downloading the .NET runtime, Roslyn and the Razor compiler is a large download. +const BOOT_TIMEOUT_MS = 5 * 60_000; + +interface Diagnostic { + id?: string; + message: string; + severity?: string; + line?: number; + column?: number; +} + +interface RenderResult { + success: boolean; + routes?: string[]; + errors?: Diagnostic[]; +} + +interface Runner { + ready: () => Promise; + renderRazor: (source: string, componentName?: string) => Promise; + navigateTo: (url: string) => Promise; +} + +interface RunResult { + output: string | null; + error: string | null; + exitCode: number; +} + +interface BlazorWasmApi { + ready: boolean; + failed: boolean; + error: string | null; + routes: string[]; + loaded: Promise; + init: Promise | null; + runner?: Runner; + render: (source?: string) => Promise; + navigateTo: (url: string) => Promise; +} + +declare const window: Window & { + livecodes: Record; + BlazorRunner?: { + create: (options?: { baseUrl?: string; root?: string | Element }) => Runner; + }; +}; + +window.livecodes.blazorWasm ??= {} as BlazorWasmApi; + +const blazorWasm = window.livecodes.blazorWasm; +blazorWasm.ready = false; +blazorWasm.failed = false; +blazorWasm.routes = []; +blazorWasm.error = null; + +const withTimeout = ( + promise: Promise, + ms: number, + message: string, + onTimeout?: () => void, +): Promise => + new Promise((resolve, reject) => { + const timer = setTimeout(() => { + onTimeout?.(); + reject(new Error(message)); + }, ms); + promise.then( + (value) => { + clearTimeout(timer); + resolve(value); + }, + (error) => { + clearTimeout(timer); + reject(error); + }, + ); + }); + +const loadScript = (src: string) => + new Promise((resolve, reject) => { + if (document.querySelector(`script[src="${src}"]`)) { + resolve(); + return; + } + const script = document.createElement('script'); + script.src = src; + script.onload = () => resolve(); + script.onerror = () => reject(new Error(`Failed to load ${src}`)); + document.head.appendChild(script); + }); + +const getSource = () => { + let code = ''; + document.querySelectorAll(`script[type="${SCRIPT_TYPE}"]`).forEach((script) => { + code += `${script.innerHTML}\n`; + }); + return code; +}; + +const formatErrors = (errors?: Diagnostic[]) => + errors?.length ? errors.map((error) => error.message).join('\n') : null; + +const getRunner = async (): Promise => { + if (blazorWasm.runner) return blazorWasm.runner; + await loadScript(`${blazorWasmBaseUrl}blazor-wasm.js`); + const factory = window.BlazorRunner; + if (!factory) throw new Error('Failed to load the Blazor WebAssembly runner.'); + blazorWasm.runner = factory.create({ baseUrl: blazorWasmBaseUrl }); + return blazorWasm.runner; +}; + +/** Boot the runtime once (downloading it). */ +const ensureLoaded = (): Promise => { + let init = blazorWasm.init; + if (!init) { + blazorWasm.failed = false; + init = (async () => { + const runner = await getRunner(); + await withTimeout( + runner.ready(), + BOOT_TIMEOUT_MS, + 'Timed out while loading the Blazor WebAssembly runtime.', + () => { + blazorWasm.runner = undefined; + }, + ); + blazorWasm.ready = true; + })().catch((error: Error) => { + // Reset so a later render can retry the download. + blazorWasm.init = null; + blazorWasm.failed = true; + throw error; + }); + // The failure is surfaced through `render`; do not also report it unhandled. + init.catch(() => undefined); + blazorWasm.init = init; + } + return init; +}; + +blazorWasm.loaded = new Promise((resolve, reject) => { + const interval = setInterval(() => { + if (blazorWasm.failed) { + clearInterval(interval); + reject(new Error(blazorWasm.error || 'Failed to initialize Blazor WebAssembly')); + } else if (blazorWasm.ready) { + clearInterval(interval); + resolve(); + } + }, 50); +}); + +blazorWasm.render = async (source?: string): Promise => { + const razor = source ?? getSource(); + blazorWasm.error = null; + blazorWasm.routes = []; + + if (!razor.trim()) { + blazorWasm.ready = true; + return { output: null, error: null, exitCode: 0 }; + } + + // The runtime download and the first compile are both slow; keep the loading indicator up. + parent.postMessage({ type: 'loading', payload: true }, '*'); + try { + await ensureLoaded(); + const result = await (blazorWasm.runner as Runner).renderRazor(razor); + blazorWasm.routes = result?.routes ?? []; + + const error = formatErrors(result?.errors); + if (error != null) { + blazorWasm.error = error; + console.error(error); + return { output: null, error, exitCode: 1 }; + } + if (result && result.success === false) { + const failure = 'Failed to render the Blazor component.'; + blazorWasm.error = failure; + console.error(failure); + return { output: null, error: failure, exitCode: 1 }; + } + return { output: null, error: null, exitCode: 0 }; + } catch (error) { + const message = `Error: ${getErrorMessage(error)}`; + blazorWasm.error = message; + console.error(message); + return { output: null, error: message, exitCode: 1 }; + } finally { + parent.postMessage({ type: 'loading', payload: false }, '*'); + } +}; + +blazorWasm.navigateTo = async (url: string) => { + await ensureLoaded(); + await blazorWasm.runner?.navigateTo(url); +}; + +window.addEventListener('load', async () => { + await blazorWasm.render(); +}); diff --git a/src/livecodes/languages/blazor-wasm/lang-blazor-wasm.ts b/src/livecodes/languages/blazor-wasm/lang-blazor-wasm.ts new file mode 100644 index 0000000000..6df1245a2f --- /dev/null +++ b/src/livecodes/languages/blazor-wasm/lang-blazor-wasm.ts @@ -0,0 +1,31 @@ +import type { LanguageSpecs } from '../../models'; +import { monacoLanguagesBaseUrl } from '../../vendors'; + +/** + * Blazor WebAssembly. Razor markup (and C#) is compiled and rendered in the result page by + * `@live-codes/blazor-wasm`, which loads the .NET WebAssembly runtime, Roslyn and the Razor + * compiler into the page. The source is not transformed at compile time: it is handed to the + * result page in a `text/razor` script tag and rendered there by `lang-blazor-wasm-script.ts`. + */ +export const blazorWasm: LanguageSpecs = { + name: 'blazor-wasm', + title: 'Blazor (Wasm)', + compiler: { + factory: () => async (code) => code, + scripts: ({ baseUrl }) => [baseUrl + '{{hash:lang-blazor-wasm-script.js}}'], + scriptType: 'text/razor', + compiledCodeLanguage: 'blazor-wasm', + }, + extensions: ['razor', 'blazor', 'razor-wasm', 'wasm.razor'], + editor: 'script', + // Razor is markup with embedded C#. The HTML editor language is the closest fallback for + // CodeMirror, which has no Razor mode. + editorLanguage: 'html', + editorSupport: { + // Monaco's Razor grammar (Razor markup + embedded C#) from the monaco-languages package. + monaco: { languageSupport: monacoLanguagesBaseUrl + 'razor.js', language: 'razor' }, + // Prism's `razor` grammar is an alias of its `cshtml` component (Razor C#). + codejar: { language: 'razor' }, + }, + largeDownload: true, +}; diff --git a/src/livecodes/languages/languages.ts b/src/livecodes/languages/languages.ts index b5956ef373..52b7e66dc6 100644 --- a/src/livecodes/languages/languages.ts +++ b/src/livecodes/languages/languages.ts @@ -7,6 +7,7 @@ import { assemblyscript } from './assemblyscript'; import { astro } from './astro'; import { babel } from './babel'; import { bbcode } from './bbcode'; +import { blazorWasm } from './blazor-wasm'; import { blockly } from './blockly'; import { civet } from './civet'; import { cWasm, cppWasm, objcWasm, objcppWasm } from './clang-wasm'; @@ -173,6 +174,7 @@ export const languages: LanguageSpecs[] = [ zigWasm, java, csharpWasm, + blazorWasm, vbWasm, fsharp, fsharpWasm, diff --git a/src/livecodes/models.ts b/src/livecodes/models.ts index 18985c3877..7ac9aa95e1 100644 --- a/src/livecodes/models.ts +++ b/src/livecodes/models.ts @@ -205,6 +205,7 @@ export interface Compiler { | 'text/zig-wasm' | 'text/java' | 'text/csharp-wasm' + | 'text/razor' | 'text/fanak' | 'text/vb-wasm' | 'text/fsharp-wasm' @@ -259,6 +260,8 @@ export type TemplateAlias = | 'c++-wasm' | 'c#-wasm' | 'cs-wasm' + | 'blazor' + | 'razor' | 'vb.net-wasm' | 'vb' | 'f#' diff --git a/src/livecodes/templates/starter/blazor-wasm-starter.ts b/src/livecodes/templates/starter/blazor-wasm-starter.ts new file mode 100644 index 0000000000..e2b9cd7cd4 --- /dev/null +++ b/src/livecodes/templates/starter/blazor-wasm-starter.ts @@ -0,0 +1,53 @@ +import type { Template } from '../../models'; + +export const blazorWasmStarter: Template = { + name: 'blazor-wasm', + aliases: ['blazor', 'razor'], + title: window.deps.translateString('templates.starter.blazor-wasm', 'Blazor (Wasm) Starter'), + thumbnail: 'assets/templates/blazor.svg', + activeEditor: 'script', + markup: { + language: 'html', + content: ` +
    + +
    Loading...
    +
    +`.trimStart(), + }, + style: { + language: 'css', + content: ` +body { + font: 1em system-ui, -apple-system, sans-serif; +} +.container { + text-align: center; +} +.logo { + width: 120px; +} +#counter-button { + font: inherit; + padding: 0.4em 1.1em; + cursor: pointer; +} +`.trimStart(), + }, + script: { + language: 'blazor-wasm', + content: ` +

    Hello, Blazor!

    + +

    You clicked @count times.

    + + + +@code { + private int count; + + private void Increment() => count++; +} +`.trimStart(), + }, +}; diff --git a/src/livecodes/templates/starter/index.ts b/src/livecodes/templates/starter/index.ts index 58f46841e0..07558aa9d1 100644 --- a/src/livecodes/templates/starter/index.ts +++ b/src/livecodes/templates/starter/index.ts @@ -7,6 +7,7 @@ import { assemblyscriptStarter } from './assemblyscript-starter'; import { astroStarter } from './astro-starter'; import { backboneStarter } from './backbone-starter'; import { blank } from './blank'; +import { blazorWasmStarter } from './blazor-wasm-starter'; import { blocklyStarter } from './blockly-starter'; import { bootstrapStarter } from './bootstrap-starter'; import { civetStarter } from './civet-starter'; @@ -141,6 +142,7 @@ export const starterTemplates = [ zigWasmStarter, javaStarter, csharpWasmStarter, + blazorWasmStarter, vbWasmStarter, fsharpStarter, fsharpWasmStarter, diff --git a/src/livecodes/vendors.ts b/src/livecodes/vendors.ts index 1e22247936..f5a3e93fa1 100644 --- a/src/livecodes/vendors.ts +++ b/src/livecodes/vendors.ts @@ -40,6 +40,8 @@ export const bbobPresetHtmlUrl = /* @__PURE__ */ getUrl( export const biwaschemeUrl = /* @__PURE__ */ getUrl('biwascheme@0.8.0/release/biwascheme.js'); +export const blazorWasmBaseUrl = /* @__PURE__ */ getUrl('@live-codes/blazor-wasm@0.1.1/'); + export const blocklyCdnBaseUrl = /* @__PURE__ */ getUrl('blockly@11.1.1/'); export const browserfsUrl = /* @__PURE__ */ getUrl('browserfs@1.4.3/dist/browserfs.min.js'); @@ -309,9 +311,6 @@ export const jsZipUrl = /* @__PURE__ */ getUrl('jszip@3.10.1/dist/jszip.js'); export const juliaWasmBaseUrl = /* @__PURE__ */ getUrl('@chriskoch/julia-wasm@1.0.4'); -// The x86-64 assembler and CPU emulator behind the `assembly-wasm` language. Both are -// published separately and are loaded at run time by @live-codes/assembly-wasm, which -// deliberately bundles neither of them. export const keystoneJsUrl = /* @__PURE__ */ getUrl( '@alexaltea/keystone-js@0.9.2/dist/keystone.js', ); @@ -359,7 +358,7 @@ export const monacoBaseUrl = /* @__PURE__ */ getUrl('@live-codes/monaco-editor@0 export const monacoEmacsUrl = /* @__PURE__ */ getUrl('monaco-emacs@0.3.0/dist/monaco-emacs.js'); export const monacoLanguagesBaseUrl = /* @__PURE__ */ getUrl( - '@live-codes/monaco-languages@0.3.9/dist/', + '@live-codes/monaco-languages@0.3.10/dist/', ); export const monacoThemesBaseUrl = /* @__PURE__ */ getUrl('monaco-themes@0.4.4/themes/'); diff --git a/src/sdk/models.ts b/src/sdk/models.ts index b9e13aeaa0..6eb0f544d9 100644 --- a/src/sdk/models.ts +++ b/src/sdk/models.ts @@ -202,6 +202,11 @@ export type Language = | 'cs' | 'cs-wasm' | 'wasm.cs' + | 'blazor' + | 'blazor-wasm' + | 'razor' + | 'razor-wasm' + | 'wasm.razor' | 'vb' | 'vb-wasm' | 'vbnet' @@ -470,6 +475,7 @@ export type TemplateName = | 'objc-wasm' | 'java' | 'csharp-wasm' + | 'blazor-wasm' | 'vb-wasm' | 'fsharp' | 'fsharp-wasm' @@ -880,6 +886,7 @@ export type CustomSettings = Partial< | 'text/objcpp-wasm' | 'text/java' | 'text/csharp-wasm' + | 'text/razor' | 'text/fanak' | 'text/vb-wasm' | 'text/perl' diff --git a/storybook/_stories/EmbedOptions/template.ts b/storybook/_stories/EmbedOptions/template.ts index 25427ce6a6..d9ff83d65c 100644 --- a/storybook/_stories/EmbedOptions/template.ts +++ b/storybook/_stories/EmbedOptions/template.ts @@ -56,6 +56,7 @@ const storyDef: StoryDef = { ZigWasm: { props: { template: 'zig-wasm' } }, Java: { props: { template: 'java' } }, CSharpWasm: { props: { template: 'csharp-wasm' } }, + BlazorWasm: { props: { template: 'blazor-wasm' }, storyName: 'Blazor (Wasm)' }, VbWasm: { props: { template: 'vb-wasm' } }, FSharp: { props: { template: 'fsharp' } }, FSharpWasm: { props: { template: 'fsharp-wasm' } }, diff --git a/vendor-licenses.md b/vendor-licenses.md index b1fbab4d56..5af4f1b220 100644 --- a/vendor-licenses.md +++ b/vendor-licenses.md @@ -30,6 +30,8 @@ BBob: [MIT License](https://github.com/JiLiZART/BBob/blob/17edb9e3e6572e72ab9cb0 BiwaScheme: [MIT License](https://github.com/biwascheme/biwascheme/blob/7a95e757af8b7278d19a87d6067bf1f91f59bc62/MIT-LICENSE.txt) +Blazor (Wasm): [MIT License](https://github.com/live-codes/browser-blazor/blob/main/LICENSE) (the [@live-codes/blazor-wasm](https://www.npmjs.com/package/@live-codes/blazor-wasm) package, which loads the .NET WebAssembly runtime, Roslyn and the Razor compiler; see .NET runtime and Roslyn) + Blockly: [Apache-2.0 License](https://github.com/google/blockly/blob/3ae4a618429c87fc002e512e5a2504af382325fd/LICENSE) browser_wasi_shim: [MIT License](https://github.com/bjorn3/browser_wasi_shim/blob/b068ec2c22d68581c48f2592f8cca1681bf71a98/LICENSE-MIT) OR [Apache License 2.0](https://github.com/bjorn3/browser_wasi_shim/blob/b068ec2c22d68581c48f2592f8cca1681bf71a98/LICENSE-APACHE) @@ -266,6 +268,8 @@ reset.css: [The Unlicense](https://github.com/shannonmoeller/reset-css/blob/d4b2 Riot: [MIT License](https://github.com/riot/riot/blob/2b08ebf8c7fa3f338d24b7320ee7f18c36b7ae74/LICENSE.txt) +Roslyn: [MIT License](https://github.com/dotnet/roslyn/blob/main/License.txt) (the C# and Visual Basic compiler, used by Blazor (Wasm) and the .NET-based languages; loaded at run time, not bundled by LiveCodes) + ruby.wasm: [MIT License](https://github.com/ruby/ruby.wasm/blob/097b7ca8d2ed2a98eea4dcf2da8089bb8ff06e07/LICENSE) Rust (compiler and standard library): [MIT License](https://github.com/rust-lang/rust/blob/018018e881e2db0956f229dbb543e21f058d1ce7/LICENSE-MIT) OR [Apache License 2.0](https://github.com/rust-lang/rust/blob/018018e881e2db0956f229dbb543e21f058d1ce7/LICENSE-APACHE) From 8249f7ad2fd90e25da6bb5be16b14b77fbb7a657 Mon Sep 17 00:00:00 2001 From: Hatem Hosny Date: Sun, 4 Oct 2026 10:30:16 +0300 Subject: [PATCH 2/7] reuse blazor-wasm for C# --- docs/docs/languages/csharp-wasm.mdx | 22 +-- .../csharp-wasm/lang-csharp-wasm-script.ts | 161 ++++++++++-------- src/livecodes/vendors.ts | 2 - vendor-licenses.md | 4 +- 4 files changed, 100 insertions(+), 89 deletions(-) diff --git a/docs/docs/languages/csharp-wasm.mdx b/docs/docs/languages/csharp-wasm.mdx index bd51c03f6b..be279cc32b 100644 --- a/docs/docs/languages/csharp-wasm.mdx +++ b/docs/docs/languages/csharp-wasm.mdx @@ -14,17 +14,14 @@ export const csharpConfig = { activeEditor: 'script', script: { language: 'csharp-wasm', - content: `using System; - + content: `using System;\n public class Program { public static void Main() { int[] sortedArray = { 1, 3, 5, 7, 9, 11, 13, 15 }; - int itemToSearch = 7; - - int result = BinarySearch(sortedArray, 0, sortedArray.Length - 1, itemToSearch); - + int itemToSearch = 7;\n + int result = BinarySearch(sortedArray, 0, sortedArray.Length - 1, itemToSearch);\n if (result == -1) { Console.WriteLine("Result: Item not found in the array."); @@ -33,8 +30,7 @@ public class Program { Console.WriteLine($"Result: Item found at index -> {result}"); } - } - + }\n public static int BinarySearch(int[] arr, int left, int right, int item) { if (right >= left) @@ -43,13 +39,11 @@ public class Program if (arr[mid] == item) { return mid; - } - + }\n if (arr[mid] > item) { return BinarySearch(arr, left, mid - 1, item); - } - + }\n return BinarySearch(arr, mid + 1, right, item); } return -1; @@ -97,11 +91,11 @@ Example: ## Compiler -Blazor WebAssembly with .NET WebAssembly runtime. +The .NET WebAssembly runtime with Roslyn, loaded at run time from the [`@live-codes/blazor-wasm`](https://www.npmjs.com/package/@live-codes/blazor-wasm) package — the same bundle that backs the [Blazor (Wasm)](./blazor-wasm.mdx) language. Console programs are compiled and run through the bundle's `RunCode`. ### Version -.NET 9.0 +.NET 10 ## Code Formatting diff --git a/src/livecodes/languages/csharp-wasm/lang-csharp-wasm-script.ts b/src/livecodes/languages/csharp-wasm/lang-csharp-wasm-script.ts index 66a1305eca..0c517884a9 100644 --- a/src/livecodes/languages/csharp-wasm/lang-csharp-wasm-script.ts +++ b/src/livecodes/languages/csharp-wasm/lang-csharp-wasm-script.ts @@ -1,85 +1,108 @@ -import { csharpWasmBaseUrl } from '../../vendors'; +import { getErrorMessage } from '../../utils/utils'; +import { blazorWasmBaseUrl } from '../../vendors'; -declare global { - interface Window { - DotNet: any; - Blazor: { start: (options: any) => Promise }; - } +// The C# console language and the Blazor language are backed by the same bundle +// (@live-codes/blazor-wasm): its host runs console programs through `RunCode` as well as rendering +// components. The bundle's loader boots the .NET WebAssembly runtime and patches `fetch` for +// `credentials: 'omit'` itself, so LiveCodes does not hand-roll the boot any more. + +declare const window: Window & { + BlazorRunner?: { + create: (options?: { baseUrl?: string; root?: string | Element }) => CSharpRunner; + }; +}; + +interface Diagnostic { + id?: string; + message: string; + severity?: string; + line?: number; + column?: number; +} + +interface RunResult { + success: boolean; + output?: string; + errors?: Diagnostic[]; +} + +interface CSharpRunner { + ready: () => Promise; + run: (source: string, stdin?: string) => Promise; } livecodes.csharp ??= {}; livecodes.csharp.ready = false; -const waitFor = (condition: () => boolean | Promise, timeout = 30_000) => - new Promise((resolve) => { - const startTime = Date.now(); - const check = async () => { - if (await condition()) resolve(true); - else if (Date.now() - startTime > timeout) resolve(false); - else setTimeout(check, 100); - }; - check(); +const BOOT_TIMEOUT_MS = 5 * 60_000; + +const withTimeout = ( + promise: Promise, + ms: number, + message: string, + onTimeout?: () => void, +): Promise => + new Promise((resolve, reject) => { + const timer = setTimeout(() => { + onTimeout?.(); + reject(new Error(message)); + }, ms); + promise.then( + (value) => { + clearTimeout(timer); + resolve(value); + }, + (error) => { + clearTimeout(timer); + reject(error); + }, + ); }); -/** - * Only patches Blazor's fetches with `credentials: 'omit'` - */ -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(csharpWasmBaseUrl)) { - return originalFetch(resource, { ...init, credentials: 'omit' as RequestCredentials }); - } - return originalFetch(resource, init); - }; -}; - -const loadBlazorScript = () => +const loadScript = (src: string) => new Promise((resolve, reject) => { - const scriptSrc = `${csharpWasmBaseUrl}_framework/blazor.webassembly.js`; - if (document.querySelector(`script[src="${scriptSrc}"]`)) { + if (document.querySelector(`script[src="${src}"]`)) { resolve(); return; } const script = document.createElement('script'); - script.src = scriptSrc; - script.setAttribute('autostart', 'false'); + script.src = src; script.onload = () => resolve(); - script.onerror = (err) => reject(new Error(`Failed to load Blazor script: ${err}`)); + script.onerror = () => reject(new Error(`Failed to load ${src}`)); document.head.appendChild(script); }); -const isReady = async () => { - try { - await window.DotNet.invokeMethodAsync('MyRunnyApp', 'RunCode', 'int x = 1 + 1;', ''); - return true; - } catch (err) { - return false; - } +const getRunner = async (): Promise => { + if (livecodes.csharp.runner) return livecodes.csharp.runner as CSharpRunner; + await loadScript(`${blazorWasmBaseUrl}blazor-wasm.js`); + const factory = window.BlazorRunner; + if (!factory) throw new Error('Failed to load the C# WebAssembly runner.'); + livecodes.csharp.runner = factory.create({ baseUrl: blazorWasmBaseUrl }); + // The host always owns a mount element, even though a console program never renders into it. + // Hide it so an empty node cannot affect the result page layout. + const style = document.createElement('style'); + style.textContent = '#blazor-app { display: none; }'; + document.head.appendChild(style); + return livecodes.csharp.runner as CSharpRunner; }; +const formatErrors = (errors?: Diagnostic[]) => + errors?.length + ? errors + .map((error) => `${error.message}${error.line ? ` (line ${error.line})` : ''}`) + .join('\n') + : null; + const runCSharpCode = async ( code: string, input = '', ): Promise<{ output: string | null; error: string | null }> => { - await livecodes.csharp.init; try { - const { output, errors } = await window.DotNet.invokeMethodAsync( - 'MyRunnyApp', - 'RunCode', - code, - input, - ); - return { output, error: errors || null }; + await livecodes.csharp.init; + const { output, errors } = await (livecodes.csharp.runner as CSharpRunner).run(code, input); + return { output: output ?? null, error: formatErrors(errors) }; } catch (err) { - const error = 'Error: ' + (err as Error).message; - return { output: null, error }; + return { output: null, error: 'Error: ' + getErrorMessage(err) }; } }; @@ -89,19 +112,15 @@ livecodes.csharp.init ??= (async () => { // eslint-disable-next-line no-console console.log('Initializing C# environment...'); try { - await loadBlazorScript(); - - if (!window.Blazor) throw new Error('Blazor failed to load properly'); - - patchFetch(); - await window.Blazor.start({ - loadBootResource: (_type: string, name: string) => `${csharpWasmBaseUrl}_framework/${name}`, - }); - - if (!(await waitFor(isReady))) { - throw new Error('Timeout waiting for DotNet to be ready'); - } - + const runner = await getRunner(); + await withTimeout( + runner.ready(), + BOOT_TIMEOUT_MS, + 'Timed out while loading the C# WebAssembly runtime.', + () => { + livecodes.csharp.runner = undefined; + }, + ); // eslint-disable-next-line no-console console.log('C# environment initialized successfully'); } catch (err) { @@ -137,7 +156,7 @@ livecodes.csharp.run ??= async (input?: string) => { livecodes.csharp.error = error; livecodes.csharp.exitCode = error ? 1 : 0; livecodes.csharp.ready = true; - return { output, error, exitCode: 0 }; + return { output, error, exitCode: error ? 1 : 0 }; }; livecodes.csharp.loaded = new Promise((resolve) => { diff --git a/src/livecodes/vendors.ts b/src/livecodes/vendors.ts index f5a3e93fa1..08e728fe74 100644 --- a/src/livecodes/vendors.ts +++ b/src/livecodes/vendors.ts @@ -122,8 +122,6 @@ export const comlinkBaseUrl = /* @__PURE__ */ getUrl('comlink@4.4.1/dist/'); export const creltUrl = /* @__PURE__ */ getUrl('crelt@1.0.6/index.js'); -export const csharpWasmBaseUrl = /* @__PURE__ */ getUrl('@seth0x41/csharp-wasm@1.0.3/'); - export const yaegiWasmBaseUrl = /* @__PURE__ */ getUrl('yaegi-wasm@1.0.2/src/'); export const csstreeUrl = /* @__PURE__ */ getUrl('css-tree@2.3.1/dist/csstree.js'); diff --git a/vendor-licenses.md b/vendor-licenses.md index 5af4f1b220..a38bc040fa 100644 --- a/vendor-licenses.md +++ b/vendor-licenses.md @@ -30,7 +30,7 @@ BBob: [MIT License](https://github.com/JiLiZART/BBob/blob/17edb9e3e6572e72ab9cb0 BiwaScheme: [MIT License](https://github.com/biwascheme/biwascheme/blob/7a95e757af8b7278d19a87d6067bf1f91f59bc62/MIT-LICENSE.txt) -Blazor (Wasm): [MIT License](https://github.com/live-codes/browser-blazor/blob/main/LICENSE) (the [@live-codes/blazor-wasm](https://www.npmjs.com/package/@live-codes/blazor-wasm) package, which loads the .NET WebAssembly runtime, Roslyn and the Razor compiler; see .NET runtime and Roslyn) +Blazor (Wasm): [MIT License](https://github.com/live-codes/browser-blazor/blob/a66e9afd1c1c8df641111c21b88f84c9f191eb7e/LICENSE) Blockly: [Apache-2.0 License](https://github.com/google/blockly/blob/3ae4a618429c87fc002e512e5a2504af382325fd/LICENSE) @@ -268,7 +268,7 @@ reset.css: [The Unlicense](https://github.com/shannonmoeller/reset-css/blob/d4b2 Riot: [MIT License](https://github.com/riot/riot/blob/2b08ebf8c7fa3f338d24b7320ee7f18c36b7ae74/LICENSE.txt) -Roslyn: [MIT License](https://github.com/dotnet/roslyn/blob/main/License.txt) (the C# and Visual Basic compiler, used by Blazor (Wasm) and the .NET-based languages; loaded at run time, not bundled by LiveCodes) +Roslyn: [MIT License](https://github.com/dotnet/roslyn/blob/8d2c75f24c88ea99a01a8579ecb67e303d566670/License.txt) ruby.wasm: [MIT License](https://github.com/ruby/ruby.wasm/blob/097b7ca8d2ed2a98eea4dcf2da8089bb8ff06e07/LICENSE) From 73b5a411c8c2177f3e91e20c509d69f60cc46840 Mon Sep 17 00:00:00 2001 From: "pullfrog[bot]" <226033991+pullfrog[bot]@users.noreply.github.com> Date: Sun, 4 Oct 2026 08:12:01 +0000 Subject: [PATCH 3/7] fix(blazor): add translations, fix runtime retry and sort language info Add the blazorWasm language-info keys and starter label to all non-en locales. Retry the runtime download after a failed blazor-wasm.js load for both Blazor and C#, removing the failed script element first. Narrow the documented `livecodes.blazorWasm.loaded` wording and sort the language-info sections alphabetically. --- docs/docs/languages/blazor-wasm.mdx | 2 +- src/livecodes/html/language-info.html | 690 +++++++++--------- .../locales/ar/language-info.lokalise.json | 9 + .../i18n/locales/ar/language-info.ts | 5 + .../i18n/locales/ar/translation.lokalise.json | 3 + src/livecodes/i18n/locales/ar/translation.ts | 1 + .../locales/bn/language-info.lokalise.json | 9 + .../i18n/locales/bn/language-info.ts | 5 + .../i18n/locales/bn/translation.lokalise.json | 3 + src/livecodes/i18n/locales/bn/translation.ts | 1 + .../locales/de/language-info.lokalise.json | 9 + .../i18n/locales/de/language-info.ts | 5 + .../i18n/locales/de/translation.lokalise.json | 3 + src/livecodes/i18n/locales/de/translation.ts | 1 + .../locales/es/language-info.lokalise.json | 9 + .../i18n/locales/es/language-info.ts | 5 + .../i18n/locales/es/translation.lokalise.json | 3 + src/livecodes/i18n/locales/es/translation.ts | 1 + .../locales/fa/language-info.lokalise.json | 9 + .../i18n/locales/fa/language-info.ts | 5 + .../i18n/locales/fa/translation.lokalise.json | 3 + src/livecodes/i18n/locales/fa/translation.ts | 1 + .../locales/fr/language-info.lokalise.json | 9 + .../i18n/locales/fr/language-info.ts | 5 + .../i18n/locales/fr/translation.lokalise.json | 3 + src/livecodes/i18n/locales/fr/translation.ts | 1 + .../locales/hi/language-info.lokalise.json | 9 + .../i18n/locales/hi/language-info.ts | 5 + .../i18n/locales/hi/translation.lokalise.json | 3 + src/livecodes/i18n/locales/hi/translation.ts | 1 + .../locales/hu/language-info.lokalise.json | 9 + .../i18n/locales/hu/language-info.ts | 5 + .../i18n/locales/hu/translation.lokalise.json | 3 + src/livecodes/i18n/locales/hu/translation.ts | 1 + .../locales/id/language-info.lokalise.json | 9 + .../i18n/locales/id/language-info.ts | 5 + .../i18n/locales/id/translation.lokalise.json | 3 + src/livecodes/i18n/locales/id/translation.ts | 1 + .../locales/it/language-info.lokalise.json | 9 + .../i18n/locales/it/language-info.ts | 5 + .../i18n/locales/it/translation.lokalise.json | 3 + src/livecodes/i18n/locales/it/translation.ts | 1 + .../locales/ja/language-info.lokalise.json | 9 + .../i18n/locales/ja/language-info.ts | 5 + .../i18n/locales/ja/translation.lokalise.json | 3 + src/livecodes/i18n/locales/ja/translation.ts | 1 + .../locales/nl/language-info.lokalise.json | 9 + .../i18n/locales/nl/language-info.ts | 5 + .../i18n/locales/nl/translation.lokalise.json | 3 + src/livecodes/i18n/locales/nl/translation.ts | 1 + .../locales/pt/language-info.lokalise.json | 9 + .../i18n/locales/pt/language-info.ts | 5 + .../i18n/locales/pt/translation.lokalise.json | 3 + src/livecodes/i18n/locales/pt/translation.ts | 1 + .../locales/ru/language-info.lokalise.json | 9 + .../i18n/locales/ru/language-info.ts | 5 + .../i18n/locales/ru/translation.lokalise.json | 3 + src/livecodes/i18n/locales/ru/translation.ts | 1 + .../locales/tr/language-info.lokalise.json | 9 + .../i18n/locales/tr/language-info.ts | 5 + .../i18n/locales/tr/translation.lokalise.json | 3 + src/livecodes/i18n/locales/tr/translation.ts | 1 + .../locales/ur/language-info.lokalise.json | 9 + .../i18n/locales/ur/language-info.ts | 5 + .../i18n/locales/ur/translation.lokalise.json | 3 + src/livecodes/i18n/locales/ur/translation.ts | 1 + .../locales/zh-CN/language-info.lokalise.json | 9 + .../i18n/locales/zh-CN/language-info.ts | 5 + .../locales/zh-CN/translation.lokalise.json | 3 + .../i18n/locales/zh-CN/translation.ts | 1 + .../blazor-wasm/lang-blazor-wasm-script.ts | 6 +- .../csharp-wasm/lang-csharp-wasm-script.ts | 68 +- 72 files changed, 698 insertions(+), 374 deletions(-) diff --git a/docs/docs/languages/blazor-wasm.mdx b/docs/docs/languages/blazor-wasm.mdx index 4fea18ccd7..b455a6434a 100644 --- a/docs/docs/languages/blazor-wasm.mdx +++ b/docs/docs/languages/blazor-wasm.mdx @@ -48,7 +48,7 @@ export const blazorConfig = { The component runs in the context of the result page. A few helpers are available in the browser global `livecodes.blazorWasm` object: -- `livecodes.blazorWasm.loaded`: A promise that resolves when the .NET WebAssembly runtime, Roslyn and the Razor compiler are loaded. Other helpers should be used after this promise resolves. +- `livecodes.blazorWasm.loaded`: A promise that resolves when the .NET WebAssembly runtime has loaded. The Roslyn and Razor compiler payloads are fetched lazily on the first render, so other helpers should be used after this promise resolves. - `livecodes.blazorWasm.render`: A function that compiles and renders Razor markup. It takes a string of Razor markup as input and returns a promise that resolves with an object containing the `output`, `error`, and `exitCode` properties. - `livecodes.blazorWasm.runner`: The underlying [`@live-codes/blazor-wasm`](https://www.npmjs.com/package/@live-codes/blazor-wasm) runner, which also exposes `renderProject` (multi-file projects), `render`, `navigateTo` (for `@page` routing) and `payloads`. - `livecodes.blazorWasm.routes`: The routes declared by `@page` directives in the rendered component. diff --git a/src/livecodes/html/language-info.html b/src/livecodes/html/language-info.html index dbb840cc43..e18804b742 100644 --- a/src/livecodes/html/language-info.html +++ b/src/livecodes/html/language-info.html @@ -190,105 +190,79 @@

    BBCode

  • -
    -

    Blockly

    -
    - A JavaScript library for building visual programming editors. +
    +

    Blazor (Wasm)

    +
    + Razor components compiled by the real + Razor compiler and + Roslyn, and + rendered by + Blazor WebAssembly + on the .NET WebAssembly runtime — all in the browser, with no server.
    -
    -
    -

    Civet

    -
    - Civet is a programming language that compiles to TypeScript or JavaScript, so you can use - existing tooling but enable concise and powerful syntax. -
    -
    -
    -

    Clio

    -
    - Clio is a fast, distributed, functional programming language that compiles to JavaScript. +
    +

    Blockly

    +
    + A JavaScript library for building visual programming editors.
    -
    -
    -

    C++

    -
    - C++ support using JSCPP (a simple C++ interpreter written in JavaScript). -
    -
    - It is not a complete implementation of C++. Please refer to - JSCPP documentation - for details. -
    -
    -
    -

    C++ (Wasm)

    -
    - C++ compiled to WebAssembly by - Clang, running entirely in - the browser. This provides a real C++ compiler, unlike the - JSCPP-based C++ - interpreter. +
    +

    Civet

    +
    + Civet is a programming language that compiles to TypeScript or JavaScript, so you can use + existing tooling but enable concise and powerful syntax.
    -
    -
    -

    Objective-C (Wasm)

    -
    - Objective-C compiled to WebAssembly by - Clang, using the - GNUstep - Objective-C runtime. This is a runtime and not a class library, so Foundation is not available. +
    +

    Clio

    +
    + Clio is a fast, distributed, functional programming language that compiles to JavaScript.
    -
    -
    -

    Objective-C++ (Wasm)

    -
    - Objective-C++ compiled to WebAssembly by - Clang, using the - GNUstep - Objective-C runtime. This is a runtime and not a class library, so Foundation is not available. -
    - -

    ClojureScript (Cherry)

    @@ -561,79 +474,99 @@

    Common Lisp

    -
    -

    C# (Wasm)

    -
    - C# compiler running on WebAssembly, using - Blazor +

    C++

    +
    + C++ support using JSCPP (a simple C++ interpreter written in JavaScript). +
    +
    + It is not a complete implementation of C++. Please refer to + JSCPP documentation + for details.
    -
    +
    +

    C++ (Wasm)

    +
    + C++ compiled to WebAssembly by + Clang, running entirely in + the browser. This provides a real C++ compiler, unlike the + JSCPP-based C++ + interpreter. +
    +
    -
    -

    Blazor (Wasm)

    -
    - Razor components compiled by the real - Razor compiler and - Roslyn, and rendered - by +
    +

    C# (Wasm)

    +
    + C# compiler running on WebAssembly, using Blazor WebAssemblyBlazor - on the .NET WebAssembly runtime — all in the browser, with no server.
    -
    +
    +

    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. +
    + +

    Fennel

    @@ -861,36 +824,6 @@

    F# (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

    @@ -1482,32 +1415,99 @@

    Mustache

    >
  • - JavaScript implementationJavaScript implementation +
  • +
  • + LiveCodes Documentations +
  • + +
    +
    +

    Nunjucks

    +
    + A rich and powerful templating language for JavaScript. Nunjucks is essentially a port of + jinja2 +
    + +
    +
    +

    Objective-C (Wasm)

    +
    + Objective-C compiled to WebAssembly by + Clang, using the + GNUstep + Objective-C runtime. This is a runtime and not a class library, so Foundation is not available. +
    + +
    +
    +

    Objective-C++ (Wasm)

    +
    + Objective-C++ compiled to WebAssembly by + Clang, using the + GNUstep + Objective-C runtime. This is a runtime and not a class library, so Foundation is not available. +
    + -
    -
    -

    Nunjucks

    -
    - A rich and powerful templating language for JavaScript. Nunjucks is essentially a port of - jinja2 -
    - @@ -1600,37 +1600,6 @@

    Perl

    -
    -

    PostgreSQL

    -
    PostgreSQL packaged as WASM using PGlite
    - -

    PHP

    PHP running in the browser using Uniter.
    @@ -1693,6 +1662,37 @@

    PHP (Wasm)

    +
    +

    PostgreSQL

    +
    PostgreSQL packaged as WASM using PGlite
    + +

    Tau Prolog

    An open source Prolog interpreter in JavaScript.
    @@ -1743,65 +1743,65 @@

    Pug

    -
    -

    Python (Wasm)

    -
    - Python with the scientific stack, compiled to WebAssembly using Pyodide. -
    -
    - Pyodide allows using Python scientific stack including NumPy, Pandas, Matplotlib, SciPy, - scikit-learn and many more. In addition it’s possible to install pure Python wheels from PyPi. -
    -
      +
      +

      Python

      +
      Python running in the browser using Brython.
      +
      -
      -

      Python

      -
      Python running in the browser using Brython.
      -
      -
      -

      Solid

      -
      - A declarative, efficient and flexible JavaScript library for building user interfaces. -
      - -

      SQLite

      SQLite compiled to JavaScript using SQL.js
      diff --git a/src/livecodes/i18n/locales/ar/language-info.lokalise.json b/src/livecodes/i18n/locales/ar/language-info.lokalise.json index 24d66cc510..086fa7cfff 100644 --- a/src/livecodes/i18n/locales/ar/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/ar/language-info.lokalise.json @@ -72,6 +72,15 @@ "bbcode.name": { "translation": "BBCode" }, + "blazorWasm.desc": { + "translation": "يتم تجميع مكوّنات Razor بواسطة مُترجم Razor الحقيقي وRoslyn، ويتم عرضها بواسطة Blazor WebAssembly على بيئة تشغيل .NET WebAssembly — كل ذلك في المتصفح، دون خادم." + }, + "blazorWasm.link": { + "translation": " وثائق Blazor مكوّنات ASP.NET Core Blazor وثائق LiveCodes تحميل قالب البدء " + }, + "blazorWasm.name": { + "translation": "Blazor (Wasm)" + }, "blockly.desc": { "translation": "مكتبة جافاسكريبت لبناء محررات البرمجة المرئية." }, diff --git a/src/livecodes/i18n/locales/ar/language-info.ts b/src/livecodes/i18n/locales/ar/language-info.ts index f9e3135c14..cb9f8a6724 100644 --- a/src/livecodes/i18n/locales/ar/language-info.ts +++ b/src/livecodes/i18n/locales/ar/language-info.ts @@ -43,6 +43,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>bbcode.org <3> <4>دليل BBCode <5> <6>BBCode على ويكيبيديا ', name: 'BBCode', }, + blazorWasm: { + desc: 'يتم تجميع مكوّنات Razor بواسطة <1>مُترجم Razor الحقيقي و<2>Roslyn، ويتم عرضها بواسطة <3>Blazor WebAssembly على بيئة تشغيل .NET WebAssembly — كل ذلك في المتصفح، دون خادم.', + link: '<1> <2>وثائق Blazor <3> <4>مكوّنات ASP.NET Core Blazor <5> <6>وثائق LiveCodes <7> <8>تحميل قالب البدء ', + name: 'Blazor (Wasm)', + }, blockly: { desc: 'مكتبة جافاسكريبت لبناء محررات البرمجة المرئية.', link: '<1> <2>الموقع الرسمي <3> <4>الأدلة <5> <6>المرجع <7> <8>النماذج <9> <10>تحميل القالب الأولي ', diff --git a/src/livecodes/i18n/locales/ar/translation.lokalise.json b/src/livecodes/i18n/locales/ar/translation.lokalise.json index b02834b394..d5bb68f4a3 100644 --- a/src/livecodes/i18n/locales/ar/translation.lokalise.json +++ b/src/livecodes/i18n/locales/ar/translation.lokalise.json @@ -1929,6 +1929,9 @@ "templates.starter.blank": { "translation": "قالب فارغ" }, + "templates.starter.blazor-wasm": { + "translation": "قالب Blazor (Wasm)" + }, "templates.starter.blockly": { "translation": "قالب Blockly" }, diff --git a/src/livecodes/i18n/locales/ar/translation.ts b/src/livecodes/i18n/locales/ar/translation.ts index b3a1ed9853..621ee22988 100644 --- a/src/livecodes/i18n/locales/ar/translation.ts +++ b/src/livecodes/i18n/locales/ar/translation.ts @@ -982,6 +982,7 @@ const translation: I18nTranslation = { astro: 'قالب Astro', backbone: 'قالب Backbone', blank: 'قالب فارغ', + 'blazor-wasm': 'قالب Blazor (Wasm)', blockly: 'قالب Blockly', bootstrap: 'قالب Bootstrap', 'c-wasm': 'قالب C (Wasm)', diff --git a/src/livecodes/i18n/locales/bn/language-info.lokalise.json b/src/livecodes/i18n/locales/bn/language-info.lokalise.json index 64c4f25dc2..78ca5d4361 100644 --- a/src/livecodes/i18n/locales/bn/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/bn/language-info.lokalise.json @@ -72,6 +72,15 @@ "bbcode.name": { "translation": "BBCode" }, + "blazorWasm.desc": { + "translation": "Razor কম্পোনেন্টগুলি প্রকৃত Razor কম্পাইলার এবং Roslyn দ্বারা কম্পাইল করা হয় এবং .NET WebAssembly রানটাইমে Blazor WebAssembly দ্বারা রেন্ডার করা হয় — সবই ব্রাউজারে, কোনো সার্ভার ছাড়াই।" + }, + "blazorWasm.link": { + "translation": " Blazor ডকুমেন্টেশন ASP.NET Core Blazor কম্পোনেন্ট LiveCodes ডকুমেন্টেশন স্টার্টার টেমপ্লেট লোড করুন " + }, + "blazorWasm.name": { + "translation": "Blazor (Wasm)" + }, "blockly.desc": { "translation": "ভিজুয়াল প্রোগ্রামিং এডিটর তৈরির জন্য একটি JavaScript লাইব্রেরি।" }, diff --git a/src/livecodes/i18n/locales/bn/language-info.ts b/src/livecodes/i18n/locales/bn/language-info.ts index ae0df20a7f..ab5fa08321 100644 --- a/src/livecodes/i18n/locales/bn/language-info.ts +++ b/src/livecodes/i18n/locales/bn/language-info.ts @@ -43,6 +43,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>bbcode.org <3> <4>BBCode গাইড <5> <6>উইকিপিডিয়ায় BBCode ', name: 'BBCode', }, + blazorWasm: { + desc: 'Razor কম্পোনেন্টগুলি প্রকৃত <1>Razor কম্পাইলার এবং <2>Roslyn দ্বারা কম্পাইল করা হয় এবং .NET WebAssembly রানটাইমে <3>Blazor WebAssembly দ্বারা রেন্ডার করা হয় — সবই ব্রাউজারে, কোনো সার্ভার ছাড়াই।', + link: '<1> <2>Blazor ডকুমেন্টেশন <3> <4>ASP.NET Core Blazor কম্পোনেন্ট <5> <6>LiveCodes ডকুমেন্টেশন <7> <8>স্টার্টার টেমপ্লেট লোড করুন ', + name: 'Blazor (Wasm)', + }, blockly: { desc: 'ভিজুয়াল প্রোগ্রামিং এডিটর তৈরির জন্য একটি JavaScript লাইব্রেরি।', link: '<1> <2>অফিসিয়াল ওয়েবসাইট <3> <4>গাইড <5> <6>রেফারেন্স <7> <8>নমুনা <9> <10>স্টার্টার টেমপ্লেট লোড করুন ', diff --git a/src/livecodes/i18n/locales/bn/translation.lokalise.json b/src/livecodes/i18n/locales/bn/translation.lokalise.json index 5a2977c506..c57a38af50 100644 --- a/src/livecodes/i18n/locales/bn/translation.lokalise.json +++ b/src/livecodes/i18n/locales/bn/translation.lokalise.json @@ -1929,6 +1929,9 @@ "templates.starter.blank": { "translation": "ফাঁকা প্রজেক্ট" }, + "templates.starter.blazor-wasm": { + "translation": "Blazor (Wasm) স্টার্টার" + }, "templates.starter.blockly": { "translation": "Blockly স্টার্টার" }, diff --git a/src/livecodes/i18n/locales/bn/translation.ts b/src/livecodes/i18n/locales/bn/translation.ts index 00143090f9..8466e873de 100644 --- a/src/livecodes/i18n/locales/bn/translation.ts +++ b/src/livecodes/i18n/locales/bn/translation.ts @@ -982,6 +982,7 @@ const translation: I18nTranslation = { astro: 'Astro স্টার্টার', backbone: 'Backbone স্টার্টার', blank: 'ফাঁকা প্রজেক্ট', + 'blazor-wasm': 'Blazor (Wasm) স্টার্টার', blockly: 'Blockly স্টার্টার', bootstrap: 'Bootstrap স্টার্টার', 'c-wasm': 'C (Wasm) স্টার্টার', diff --git a/src/livecodes/i18n/locales/de/language-info.lokalise.json b/src/livecodes/i18n/locales/de/language-info.lokalise.json index c2300e23ac..05a7613a52 100644 --- a/src/livecodes/i18n/locales/de/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/de/language-info.lokalise.json @@ -72,6 +72,15 @@ "bbcode.name": { "translation": "BBCode" }, + "blazorWasm.desc": { + "translation": "Razor-Komponenten, kompiliert vom echten Razor-Compiler und Roslyn und gerendert von Blazor WebAssembly auf der .NET-WebAssembly-Laufzeitumgebung — alles im Browser, ohne Server." + }, + "blazorWasm.link": { + "translation": " Blazor-Dokumentation ASP.NET Core Blazor-Komponenten LiveCodes Dokumentation Startervorlage laden " + }, + "blazorWasm.name": { + "translation": "Blazor (Wasm)" + }, "blockly.desc": { "translation": "Eine JavaScript-Bibliothek zum Erstellen visueller Programmiereditoren." }, diff --git a/src/livecodes/i18n/locales/de/language-info.ts b/src/livecodes/i18n/locales/de/language-info.ts index 9dd8c20ae2..92e2724cdf 100644 --- a/src/livecodes/i18n/locales/de/language-info.ts +++ b/src/livecodes/i18n/locales/de/language-info.ts @@ -43,6 +43,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>bbcode.org <3> <4>BBCode-Anleitung <5> <6>BBCode auf Wikipedia ', name: 'BBCode', }, + blazorWasm: { + desc: 'Razor-Komponenten, kompiliert vom echten <1>Razor-Compiler und <2>Roslyn und gerendert von <3>Blazor WebAssembly auf der .NET-WebAssembly-Laufzeitumgebung — alles im Browser, ohne Server.', + link: '<1> <2>Blazor-Dokumentation <3> <4>ASP.NET Core Blazor-Komponenten <5> <6>LiveCodes Dokumentation <7> <8>Startervorlage laden ', + name: 'Blazor (Wasm)', + }, blockly: { desc: 'Eine JavaScript-Bibliothek zum Erstellen visueller Programmiereditoren.', link: '<1> <2>Offizielle Website <3> <4>Anleitungen <5> <6>Referenz <7> <8>Beispiele <9> <10>Starter-Vorlage laden ', diff --git a/src/livecodes/i18n/locales/de/translation.lokalise.json b/src/livecodes/i18n/locales/de/translation.lokalise.json index d7328176fa..b38218bee1 100644 --- a/src/livecodes/i18n/locales/de/translation.lokalise.json +++ b/src/livecodes/i18n/locales/de/translation.lokalise.json @@ -1929,6 +1929,9 @@ "templates.starter.blank": { "translation": "Leeres Projekt" }, + "templates.starter.blazor-wasm": { + "translation": "Blazor (Wasm)-Starter" + }, "templates.starter.blockly": { "translation": "Blockly-Starter" }, diff --git a/src/livecodes/i18n/locales/de/translation.ts b/src/livecodes/i18n/locales/de/translation.ts index 7ddcbb9e51..dfe09c0c60 100644 --- a/src/livecodes/i18n/locales/de/translation.ts +++ b/src/livecodes/i18n/locales/de/translation.ts @@ -984,6 +984,7 @@ const translation: I18nTranslation = { astro: 'Astro-Starter', backbone: 'Backbone-Starter', blank: 'Leeres Projekt', + 'blazor-wasm': 'Blazor (Wasm)-Starter', blockly: 'Blockly-Starter', bootstrap: 'Bootstrap-Starter', 'c-wasm': 'C (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 c50938599b..7a926ed07f 100644 --- a/src/livecodes/i18n/locales/es/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/es/language-info.lokalise.json @@ -72,6 +72,15 @@ "bbcode.name": { "translation": "BBCode" }, + "blazorWasm.desc": { + "translation": "Componentes de Razor compilados por el verdadero compilador de Razor y Roslyn, y renderizados por Blazor WebAssembly en el tiempo de ejecución de .NET WebAssembly — todo en el navegador, sin servidor." + }, + "blazorWasm.link": { + "translation": " Documentación de Blazor Componentes de ASP.NET Core Blazor Documentación de LiveCodes Cargar plantilla de inicio " + }, + "blazorWasm.name": { + "translation": "Blazor (Wasm)" + }, "blockly.desc": { "translation": "Una biblioteca JavaScript para construir editores de programación visual." }, diff --git a/src/livecodes/i18n/locales/es/language-info.ts b/src/livecodes/i18n/locales/es/language-info.ts index e94adaaa34..62d1066c43 100644 --- a/src/livecodes/i18n/locales/es/language-info.ts +++ b/src/livecodes/i18n/locales/es/language-info.ts @@ -43,6 +43,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>bbcode.org <3> <4>Guía de BBCode <5> <6>BBCode en Wikipedia ', name: 'BBCode', }, + blazorWasm: { + desc: 'Componentes de Razor compilados por el verdadero <1>compilador de Razor y <2>Roslyn, y renderizados por <3>Blazor WebAssembly en el tiempo de ejecución de .NET WebAssembly — todo en el navegador, sin servidor.', + link: '<1> <2>Documentación de Blazor <3> <4>Componentes de ASP.NET Core Blazor <5> <6>Documentación de LiveCodes <7> <8>Cargar plantilla de inicio ', + name: 'Blazor (Wasm)', + }, blockly: { desc: 'Una biblioteca JavaScript para construir editores de programación visual.', link: '<1> <2>Sitio web oficial <3> <4>Guías <5> <6>Referencia <7> <8>Ejemplos <9> <10>Cargar plantilla inicial ', diff --git a/src/livecodes/i18n/locales/es/translation.lokalise.json b/src/livecodes/i18n/locales/es/translation.lokalise.json index 6f04665844..4fe29610e9 100644 --- a/src/livecodes/i18n/locales/es/translation.lokalise.json +++ b/src/livecodes/i18n/locales/es/translation.lokalise.json @@ -1929,6 +1929,9 @@ "templates.starter.blank": { "translation": "Proyecto en Blanco" }, + "templates.starter.blazor-wasm": { + "translation": "Inicio Blazor (Wasm)" + }, "templates.starter.blockly": { "translation": "Inicio Blockly" }, diff --git a/src/livecodes/i18n/locales/es/translation.ts b/src/livecodes/i18n/locales/es/translation.ts index 0a4e249d19..c0dcc4f94b 100644 --- a/src/livecodes/i18n/locales/es/translation.ts +++ b/src/livecodes/i18n/locales/es/translation.ts @@ -982,6 +982,7 @@ const translation: I18nTranslation = { astro: 'Inicio Astro', backbone: 'Inicio Backbone', blank: 'Proyecto en Blanco', + 'blazor-wasm': 'Inicio Blazor (Wasm)', blockly: 'Inicio Blockly', bootstrap: 'Inicio Bootstrap', 'c-wasm': 'Inicio C (Wasm)', diff --git a/src/livecodes/i18n/locales/fa/language-info.lokalise.json b/src/livecodes/i18n/locales/fa/language-info.lokalise.json index 694fd8eff2..99959dbeb5 100644 --- a/src/livecodes/i18n/locales/fa/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/fa/language-info.lokalise.json @@ -72,6 +72,15 @@ "bbcode.name": { "translation": "BBCode" }, + "blazorWasm.desc": { + "translation": "کامپوننت‌های Razor توسط کامپایلر واقعی Razor و Roslyn کامپایل می‌شوند و توسط Blazor WebAssembly روی محیط اجرایی .NET WebAssembly رندر می‌شوند — همه در مرورگر، بدون سرور." + }, + "blazorWasm.link": { + "translation": " مستندات Blazor کامپوننت‌های ASP.NET Core Blazor مستندات LiveCodes بارگذاری قالب شروع " + }, + "blazorWasm.name": { + "translation": "Blazor (Wasm)" + }, "blockly.desc": { "translation": "یک کتابخانه JavaScript برای ساخت ویرایشگرهای برنامه‌نویسی بصری." }, diff --git a/src/livecodes/i18n/locales/fa/language-info.ts b/src/livecodes/i18n/locales/fa/language-info.ts index d3c2a78414..b5c77cac3c 100644 --- a/src/livecodes/i18n/locales/fa/language-info.ts +++ b/src/livecodes/i18n/locales/fa/language-info.ts @@ -43,6 +43,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>bbcode.org <3> <4>راهنمای BBCode <5> <6>BBCode در ویکی‌پدیا ', name: 'BBCode', }, + blazorWasm: { + desc: 'کامپوننت‌های Razor توسط <1>کامپایلر واقعی Razor و <2>Roslyn کامپایل می‌شوند و توسط <3>Blazor WebAssembly روی محیط اجرایی .NET WebAssembly رندر می‌شوند — همه در مرورگر، بدون سرور.', + link: '<1> <2>مستندات Blazor <3> <4>کامپوننت‌های ASP.NET Core Blazor <5> <6>مستندات LiveCodes <7> <8>بارگذاری قالب شروع ', + name: 'Blazor (Wasm)', + }, blockly: { desc: 'یک کتابخانه JavaScript برای ساخت ویرایشگرهای برنامه‌نویسی بصری.', link: '<1> <2>وب‌سایت رسمی <3> <4>راهنماها <5> <6>مرجع <7> <8>نمونه‌ها <9> <10>بارگذاری قالب شروع کننده ', diff --git a/src/livecodes/i18n/locales/fa/translation.lokalise.json b/src/livecodes/i18n/locales/fa/translation.lokalise.json index 50f2f283e4..38326e71a4 100644 --- a/src/livecodes/i18n/locales/fa/translation.lokalise.json +++ b/src/livecodes/i18n/locales/fa/translation.lokalise.json @@ -1929,6 +1929,9 @@ "templates.starter.blank": { "translation": "پروژه خالی" }, + "templates.starter.blazor-wasm": { + "translation": "شروع کننده Blazor (Wasm)" + }, "templates.starter.blockly": { "translation": "شروع کننده Blockly" }, diff --git a/src/livecodes/i18n/locales/fa/translation.ts b/src/livecodes/i18n/locales/fa/translation.ts index 8e3d1e7fbf..41ad249a0f 100644 --- a/src/livecodes/i18n/locales/fa/translation.ts +++ b/src/livecodes/i18n/locales/fa/translation.ts @@ -983,6 +983,7 @@ const translation: I18nTranslation = { astro: 'شروع کننده Astro', backbone: 'شروع کننده Backbone', blank: 'پروژه خالی', + 'blazor-wasm': 'شروع کننده Blazor (Wasm)', blockly: 'شروع کننده Blockly', bootstrap: 'شروع کننده Bootstrap', 'c-wasm': 'شروع کننده C (Wasm)', diff --git a/src/livecodes/i18n/locales/fr/language-info.lokalise.json b/src/livecodes/i18n/locales/fr/language-info.lokalise.json index 9df6ba33ad..e585706a2b 100644 --- a/src/livecodes/i18n/locales/fr/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/fr/language-info.lokalise.json @@ -72,6 +72,15 @@ "bbcode.name": { "translation": "BBCode" }, + "blazorWasm.desc": { + "translation": "Composants Razor compilés par le véritable compilateur Razor et Roslyn, et rendus par Blazor WebAssembly sur le runtime .NET WebAssembly — le tout dans le navigateur, sans serveur." + }, + "blazorWasm.link": { + "translation": " Documentation Blazor Composants ASP.NET Core Blazor Documentation LiveCodes Charger le modèle de démarrage " + }, + "blazorWasm.name": { + "translation": "Blazor (Wasm)" + }, "blockly.desc": { "translation": "Une bibliothèque JavaScript pour créer des éditeurs de programmation visuelle." }, diff --git a/src/livecodes/i18n/locales/fr/language-info.ts b/src/livecodes/i18n/locales/fr/language-info.ts index 9a6469fd01..782205f43a 100644 --- a/src/livecodes/i18n/locales/fr/language-info.ts +++ b/src/livecodes/i18n/locales/fr/language-info.ts @@ -43,6 +43,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>bbcode.org <3> <4>Guide BBCode <5> <6>BBCode sur Wikipédia ', name: 'BBCode', }, + blazorWasm: { + desc: 'Composants Razor compilés par le véritable <1>compilateur Razor et <2>Roslyn, et rendus par <3>Blazor WebAssembly sur le runtime .NET WebAssembly — le tout dans le navigateur, sans serveur.', + link: '<1> <2>Documentation Blazor <3> <4>Composants ASP.NET Core Blazor <5> <6>Documentation LiveCodes <7> <8>Charger le modèle de démarrage ', + name: 'Blazor (Wasm)', + }, blockly: { desc: 'Une bibliothèque JavaScript pour créer des éditeurs de programmation visuelle.', link: '<1> <2>Site officiel <3> <4>Guides <5> <6>Référence <7> <8>Exemples <9> <10>Charger le modèle de démarrage ', diff --git a/src/livecodes/i18n/locales/fr/translation.lokalise.json b/src/livecodes/i18n/locales/fr/translation.lokalise.json index 3c9ae859fd..4147e5091a 100644 --- a/src/livecodes/i18n/locales/fr/translation.lokalise.json +++ b/src/livecodes/i18n/locales/fr/translation.lokalise.json @@ -1929,6 +1929,9 @@ "templates.starter.blank": { "translation": "Projet Vide" }, + "templates.starter.blazor-wasm": { + "translation": "Démarrage Blazor (Wasm)" + }, "templates.starter.blockly": { "translation": "Démarrage Blockly" }, diff --git a/src/livecodes/i18n/locales/fr/translation.ts b/src/livecodes/i18n/locales/fr/translation.ts index 4c755179c7..65b64c3f8a 100644 --- a/src/livecodes/i18n/locales/fr/translation.ts +++ b/src/livecodes/i18n/locales/fr/translation.ts @@ -984,6 +984,7 @@ const translation: I18nTranslation = { astro: 'Démarrage Astro', backbone: 'Démarrage Backbone', blank: 'Projet Vide', + 'blazor-wasm': 'Démarrage Blazor (Wasm)', blockly: 'Démarrage Blockly', bootstrap: 'Démarrage Bootstrap', 'c-wasm': 'Démarrage C (Wasm)', diff --git a/src/livecodes/i18n/locales/hi/language-info.lokalise.json b/src/livecodes/i18n/locales/hi/language-info.lokalise.json index 98246a1fe0..6e6dbaf91f 100644 --- a/src/livecodes/i18n/locales/hi/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/hi/language-info.lokalise.json @@ -72,6 +72,15 @@ "bbcode.name": { "translation": "BBCode" }, + "blazorWasm.desc": { + "translation": "Razor घटकों को वास्तविक Razor कंपाइलर और Roslyn द्वारा संकलित किया जाता है और .NET WebAssembly रनटाइम पर Blazor WebAssembly द्वारा रेंडर किया जाता है — सब कुछ ब्राउज़र में, बिना किसी सर्वर के।" + }, + "blazorWasm.link": { + "translation": " Blazor दस्तावेज़ीकरण ASP.NET Core Blazor घटक लाइवकोड दस्तावेज़ीकरण स्टार्टर टेम्पलेट लोड करें " + }, + "blazorWasm.name": { + "translation": "Blazor (Wasm)" + }, "blockly.desc": { "translation": "दृश्य प्रोग्रामिंग संपादकों के निर्माण के लिए एक जावास्क्रिप्ट लाइब्रेरी।" }, diff --git a/src/livecodes/i18n/locales/hi/language-info.ts b/src/livecodes/i18n/locales/hi/language-info.ts index d647bad026..3c3a8a152d 100644 --- a/src/livecodes/i18n/locales/hi/language-info.ts +++ b/src/livecodes/i18n/locales/hi/language-info.ts @@ -43,6 +43,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>bbcode.org <3> <4>BBCode गाइड <5> <6>विकिपीडिया पर BBCode ', name: 'BBCode', }, + blazorWasm: { + desc: 'Razor घटकों को वास्तविक <1>Razor कंपाइलर और <2>Roslyn द्वारा संकलित किया जाता है और .NET WebAssembly रनटाइम पर <3>Blazor WebAssembly द्वारा रेंडर किया जाता है — सब कुछ ब्राउज़र में, बिना किसी सर्वर के।', + link: '<1> <2>Blazor दस्तावेज़ीकरण <3> <4>ASP.NET Core Blazor घटक <5> <6>लाइवकोड दस्तावेज़ीकरण <7> <8>स्टार्टर टेम्पलेट लोड करें ', + name: 'Blazor (Wasm)', + }, blockly: { desc: 'दृश्य प्रोग्रामिंग संपादकों के निर्माण के लिए एक जावास्क्रिप्ट लाइब्रेरी।', link: '<1> <2>आधिकारिक वेबसाइट <3> <4>गाइड <5> <6>संदर्भ <7> <8>नमूने <9> <10>स्टार्टर टेम्पलेट लोड करें ', diff --git a/src/livecodes/i18n/locales/hi/translation.lokalise.json b/src/livecodes/i18n/locales/hi/translation.lokalise.json index d81fc34e0a..a1ea325fc3 100644 --- a/src/livecodes/i18n/locales/hi/translation.lokalise.json +++ b/src/livecodes/i18n/locales/hi/translation.lokalise.json @@ -1929,6 +1929,9 @@ "templates.starter.blank": { "translation": "खाली प्रोजेक्ट" }, + "templates.starter.blazor-wasm": { + "translation": "Blazor (Wasm) स्टार्टर" + }, "templates.starter.blockly": { "translation": "Blockly स्टार्टर" }, diff --git a/src/livecodes/i18n/locales/hi/translation.ts b/src/livecodes/i18n/locales/hi/translation.ts index 66520c90b8..0f2cf0d132 100644 --- a/src/livecodes/i18n/locales/hi/translation.ts +++ b/src/livecodes/i18n/locales/hi/translation.ts @@ -982,6 +982,7 @@ const translation: I18nTranslation = { astro: 'Astro स्टार्टर', backbone: 'Backbone स्टार्टर', blank: 'खाली प्रोजेक्ट', + 'blazor-wasm': 'Blazor (Wasm) स्टार्टर', blockly: 'Blockly स्टार्टर', bootstrap: 'Bootstrap स्टार्टर', 'c-wasm': 'C (Wasm) स्टार्टर', diff --git a/src/livecodes/i18n/locales/hu/language-info.lokalise.json b/src/livecodes/i18n/locales/hu/language-info.lokalise.json index 391304fef1..42f6a024a6 100644 --- a/src/livecodes/i18n/locales/hu/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/hu/language-info.lokalise.json @@ -72,6 +72,15 @@ "bbcode.name": { "translation": "BBCode" }, + "blazorWasm.desc": { + "translation": "A Razor komponenseket a valódi Razor-fordító és a Roslyn fordítja, és a Blazor WebAssembly jeleníti meg a .NET WebAssembly futtatókörnyezetben — mindez a böngészőben, szerver nélkül." + }, + "blazorWasm.link": { + "translation": " Blazor dokumentáció ASP.NET Core Blazor komponensek LiveCodes dokumentáció Kezdő sablon betöltése " + }, + "blazorWasm.name": { + "translation": "Blazor (Wasm)" + }, "blockly.desc": { "translation": "JavaScript könyvtár vizuális programozási szerkesztők építéséhez." }, diff --git a/src/livecodes/i18n/locales/hu/language-info.ts b/src/livecodes/i18n/locales/hu/language-info.ts index 303d6fcca6..ca4ecbe4e3 100644 --- a/src/livecodes/i18n/locales/hu/language-info.ts +++ b/src/livecodes/i18n/locales/hu/language-info.ts @@ -43,6 +43,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>bbcode.org <3> <4>BBCode útmutató <5> <6>BBCode a Wikipédián ', name: 'BBCode', }, + blazorWasm: { + desc: 'A Razor komponenseket a valódi <1>Razor-fordító és a <2>Roslyn fordítja, és a <3>Blazor WebAssembly jeleníti meg a .NET WebAssembly futtatókörnyezetben — mindez a böngészőben, szerver nélkül.', + link: '<1> <2>Blazor dokumentáció <3> <4>ASP.NET Core Blazor komponensek <5> <6>LiveCodes dokumentáció <7> <8>Kezdő sablon betöltése ', + name: 'Blazor (Wasm)', + }, blockly: { desc: 'JavaScript könyvtár vizuális programozási szerkesztők építéséhez.', link: '<1> <2>Hivatalos weboldal <3> <4>Útmutatók <5> <6>Referencia <7> <8>Példák <9> <10>Kezdő sablon betöltése ', diff --git a/src/livecodes/i18n/locales/hu/translation.lokalise.json b/src/livecodes/i18n/locales/hu/translation.lokalise.json index 6a3364c1d3..d9cd4eec30 100644 --- a/src/livecodes/i18n/locales/hu/translation.lokalise.json +++ b/src/livecodes/i18n/locales/hu/translation.lokalise.json @@ -1929,6 +1929,9 @@ "templates.starter.blank": { "translation": "Üres projekt" }, + "templates.starter.blazor-wasm": { + "translation": "Blazor (Wasm) kezdő" + }, "templates.starter.blockly": { "translation": "Blockly kezdő" }, diff --git a/src/livecodes/i18n/locales/hu/translation.ts b/src/livecodes/i18n/locales/hu/translation.ts index 0aeb141498..d4f8d60fac 100644 --- a/src/livecodes/i18n/locales/hu/translation.ts +++ b/src/livecodes/i18n/locales/hu/translation.ts @@ -983,6 +983,7 @@ const translation: I18nTranslation = { astro: 'Astro kezdő', backbone: 'Backbone kezdő', blank: 'Üres projekt', + 'blazor-wasm': 'Blazor (Wasm) kezdő', blockly: 'Blockly kezdő', bootstrap: 'Bootstrap kezdő', 'c-wasm': 'C (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 6b37b8bf0c..3f56880fb4 100644 --- a/src/livecodes/i18n/locales/id/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/id/language-info.lokalise.json @@ -72,6 +72,15 @@ "bbcode.name": { "translation": "BBCode" }, + "blazorWasm.desc": { + "translation": "Komponen Razor dikompilasi oleh kompiler Razor asli dan Roslyn, lalu dirender oleh Blazor WebAssembly pada runtime .NET WebAssembly — semuanya di browser, tanpa server." + }, + "blazorWasm.link": { + "translation": " Dokumentasi Blazor Komponen ASP.NET Core Blazor Dokumentasi LiveCodes Muat template pemula " + }, + "blazorWasm.name": { + "translation": "Blazor (Wasm)" + }, "blockly.desc": { "translation": "Pustaka JavaScript untuk membangun editor pemrograman visual." }, diff --git a/src/livecodes/i18n/locales/id/language-info.ts b/src/livecodes/i18n/locales/id/language-info.ts index e0132ccb91..30cf03ffc1 100644 --- a/src/livecodes/i18n/locales/id/language-info.ts +++ b/src/livecodes/i18n/locales/id/language-info.ts @@ -43,6 +43,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>bbcode.org <3> <4>Panduan BBCode <5> <6>BBCode di Wikipedia ', name: 'BBCode', }, + blazorWasm: { + desc: 'Komponen Razor dikompilasi oleh <1>kompiler Razor asli dan <2>Roslyn, lalu dirender oleh <3>Blazor WebAssembly pada runtime .NET WebAssembly — semuanya di browser, tanpa server.', + link: '<1> <2>Dokumentasi Blazor <3> <4>Komponen ASP.NET Core Blazor <5> <6>Dokumentasi LiveCodes <7> <8>Muat template pemula ', + name: 'Blazor (Wasm)', + }, blockly: { desc: 'Pustaka JavaScript untuk membangun editor pemrograman visual.', link: '<1> <2>Situs web resmi <3> <4>Panduan <5> <6>Referensi <7> <8>Contoh <9> <10>Muat template pemula ', diff --git a/src/livecodes/i18n/locales/id/translation.lokalise.json b/src/livecodes/i18n/locales/id/translation.lokalise.json index 69e8f87aaf..13e4fc80f6 100644 --- a/src/livecodes/i18n/locales/id/translation.lokalise.json +++ b/src/livecodes/i18n/locales/id/translation.lokalise.json @@ -1929,6 +1929,9 @@ "templates.starter.blank": { "translation": "Proyek Kosong" }, + "templates.starter.blazor-wasm": { + "translation": "Pemula Blazor (Wasm)" + }, "templates.starter.blockly": { "translation": "Pemula Blockly" }, diff --git a/src/livecodes/i18n/locales/id/translation.ts b/src/livecodes/i18n/locales/id/translation.ts index 95e06641a4..fe0b44985b 100644 --- a/src/livecodes/i18n/locales/id/translation.ts +++ b/src/livecodes/i18n/locales/id/translation.ts @@ -982,6 +982,7 @@ const translation: I18nTranslation = { astro: 'Pemula Astro', backbone: 'Pemula Backbone', blank: 'Proyek Kosong', + 'blazor-wasm': 'Pemula Blazor (Wasm)', blockly: 'Pemula Blockly', bootstrap: 'Pemula Bootstrap', 'c-wasm': 'Pemula C (Wasm)', diff --git a/src/livecodes/i18n/locales/it/language-info.lokalise.json b/src/livecodes/i18n/locales/it/language-info.lokalise.json index a1739a5d64..ca679f4d0d 100644 --- a/src/livecodes/i18n/locales/it/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/it/language-info.lokalise.json @@ -72,6 +72,15 @@ "bbcode.name": { "translation": "BBCode" }, + "blazorWasm.desc": { + "translation": "Componenti Razor compilati dal vero compilatore Razor e Roslyn, e renderizzati da Blazor WebAssembly sul runtime .NET WebAssembly — tutto nel browser, senza server." + }, + "blazorWasm.link": { + "translation": " Documentazione Blazor Componenti ASP.NET Core Blazor Documentazione LiveCodes Carica il modello iniziale " + }, + "blazorWasm.name": { + "translation": "Blazor (Wasm)" + }, "blockly.desc": { "translation": "Una libreria JavaScript per la creazione di editor di programmazione visuale." }, diff --git a/src/livecodes/i18n/locales/it/language-info.ts b/src/livecodes/i18n/locales/it/language-info.ts index 234af4ecc3..8313202392 100644 --- a/src/livecodes/i18n/locales/it/language-info.ts +++ b/src/livecodes/i18n/locales/it/language-info.ts @@ -43,6 +43,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>bbcode.org <3> <4>Guida BBCode <5> <6>BBCode su Wikipedia ', name: 'BBCode', }, + blazorWasm: { + desc: 'Componenti Razor compilati dal vero <1>compilatore Razor e <2>Roslyn, e renderizzati da <3>Blazor WebAssembly sul runtime .NET WebAssembly — tutto nel browser, senza server.', + link: '<1> <2>Documentazione Blazor <3> <4>Componenti ASP.NET Core Blazor <5> <6>Documentazione LiveCodes <7> <8>Carica il modello iniziale ', + name: 'Blazor (Wasm)', + }, blockly: { desc: 'Una libreria JavaScript per la creazione di editor di programmazione visuale.', link: '<1> <2>Sito ufficiale <3> <4>Guide <5> <6>Riferimento <7> <8>Esempi <9> <10>Carica il modello di partenza ', diff --git a/src/livecodes/i18n/locales/it/translation.lokalise.json b/src/livecodes/i18n/locales/it/translation.lokalise.json index f7e259999a..e381a0cf8c 100644 --- a/src/livecodes/i18n/locales/it/translation.lokalise.json +++ b/src/livecodes/i18n/locales/it/translation.lokalise.json @@ -1929,6 +1929,9 @@ "templates.starter.blank": { "translation": "Progetto Vuoto" }, + "templates.starter.blazor-wasm": { + "translation": "Starter Blazor (Wasm)" + }, "templates.starter.blockly": { "translation": "Starter Blockly" }, diff --git a/src/livecodes/i18n/locales/it/translation.ts b/src/livecodes/i18n/locales/it/translation.ts index 0358572363..11eb69165c 100644 --- a/src/livecodes/i18n/locales/it/translation.ts +++ b/src/livecodes/i18n/locales/it/translation.ts @@ -983,6 +983,7 @@ const translation: I18nTranslation = { astro: 'Starter Astro', backbone: 'Starter Backbone', blank: 'Progetto Vuoto', + 'blazor-wasm': 'Starter Blazor (Wasm)', blockly: 'Starter Blockly', bootstrap: 'Starter Bootstrap', 'c-wasm': 'Starter C (Wasm)', diff --git a/src/livecodes/i18n/locales/ja/language-info.lokalise.json b/src/livecodes/i18n/locales/ja/language-info.lokalise.json index ab663ecb8a..16a9ed05ea 100644 --- a/src/livecodes/i18n/locales/ja/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/ja/language-info.lokalise.json @@ -72,6 +72,15 @@ "bbcode.name": { "translation": "BBCode" }, + "blazorWasm.desc": { + "translation": "Razor コンポーネントは本物の Razor コンパイラ と Roslyn によってコンパイルされ、.NET WebAssembly ランタイム上の Blazor WebAssembly によってレンダリングされます — すべてブラウザ内で、サーバーは不要です。" + }, + "blazorWasm.link": { + "translation": " Blazor ドキュメント ASP.NET Core Blazor コンポーネント LiveCodes ドキュメント スターターテンプレートをロードする " + }, + "blazorWasm.name": { + "translation": "Blazor (Wasm)" + }, "blockly.desc": { "translation": "ビジュアルプログラミングエディタを構築するための JavaScript ライブラリ。" }, diff --git a/src/livecodes/i18n/locales/ja/language-info.ts b/src/livecodes/i18n/locales/ja/language-info.ts index d98b215e23..a55dec2d71 100644 --- a/src/livecodes/i18n/locales/ja/language-info.ts +++ b/src/livecodes/i18n/locales/ja/language-info.ts @@ -43,6 +43,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>bbcode.org <3> <4>BBCode ガイド <5> <6>Wikipedia の BBCode ', name: 'BBCode', }, + blazorWasm: { + desc: 'Razor コンポーネントは本物の <1>Razor コンパイラ と <2>Roslyn によってコンパイルされ、.NET WebAssembly ランタイム上の <3>Blazor WebAssembly によってレンダリングされます — すべてブラウザ内で、サーバーは不要です。', + link: '<1> <2>Blazor ドキュメント <3> <4>ASP.NET Core Blazor コンポーネント <5> <6>LiveCodes ドキュメント <7> <8>スターターテンプレートをロードする ', + name: 'Blazor (Wasm)', + }, blockly: { desc: 'ビジュアルプログラミングエディタを構築するための JavaScript ライブラリ。', link: '<1> <2>公式ウェブサイト <3> <4>ガイド <5> <6>リファレンス <7> <8>サンプル <9> <10>スターターテンプレートを読み込む ', diff --git a/src/livecodes/i18n/locales/ja/translation.lokalise.json b/src/livecodes/i18n/locales/ja/translation.lokalise.json index ed3507a305..ff74129476 100644 --- a/src/livecodes/i18n/locales/ja/translation.lokalise.json +++ b/src/livecodes/i18n/locales/ja/translation.lokalise.json @@ -1929,6 +1929,9 @@ "templates.starter.blank": { "translation": "空のプロジェクト" }, + "templates.starter.blazor-wasm": { + "translation": "Blazor(Wasm)スターター" + }, "templates.starter.blockly": { "translation": "Blocklyスターター" }, diff --git a/src/livecodes/i18n/locales/ja/translation.ts b/src/livecodes/i18n/locales/ja/translation.ts index cc63e6d7eb..536c0a407d 100644 --- a/src/livecodes/i18n/locales/ja/translation.ts +++ b/src/livecodes/i18n/locales/ja/translation.ts @@ -983,6 +983,7 @@ const translation: I18nTranslation = { astro: 'Astroスターター', backbone: 'Backboneスターター', blank: '空のプロジェクト', + 'blazor-wasm': 'Blazor(Wasm)スターター', blockly: 'Blocklyスターター', bootstrap: 'Bootstrapスターター', 'c-wasm': 'C(Wasm)スターター', diff --git a/src/livecodes/i18n/locales/nl/language-info.lokalise.json b/src/livecodes/i18n/locales/nl/language-info.lokalise.json index 8c3055253e..ddce6eee66 100644 --- a/src/livecodes/i18n/locales/nl/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/nl/language-info.lokalise.json @@ -72,6 +72,15 @@ "bbcode.name": { "translation": "BBCode" }, + "blazorWasm.desc": { + "translation": "Razor-componenten gecompileerd door de echte Razor-compiler en Roslyn, en weergegeven door Blazor WebAssembly op de .NET WebAssembly-runtime — allemaal in de browser, zonder server." + }, + "blazorWasm.link": { + "translation": " Blazor-documentatie ASP.NET Core Blazor-componenten LiveCodes Documentatie Startsjabloon laden " + }, + "blazorWasm.name": { + "translation": "Blazor (Wasm)" + }, "blockly.desc": { "translation": "Een JavaScript-bibliotheek voor het bouwen van visuele programmeereditoren." }, diff --git a/src/livecodes/i18n/locales/nl/language-info.ts b/src/livecodes/i18n/locales/nl/language-info.ts index f0f6aba81e..e6fb73cb20 100644 --- a/src/livecodes/i18n/locales/nl/language-info.ts +++ b/src/livecodes/i18n/locales/nl/language-info.ts @@ -43,6 +43,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>bbcode.org <3> <4>BBCode-gids <5> <6>BBCode op Wikipedia ', name: 'BBCode', }, + blazorWasm: { + desc: 'Razor-componenten gecompileerd door de echte <1>Razor-compiler en <2>Roslyn, en weergegeven door <3>Blazor WebAssembly op de .NET WebAssembly-runtime — allemaal in de browser, zonder server.', + link: '<1> <2>Blazor-documentatie <3> <4>ASP.NET Core Blazor-componenten <5> <6>LiveCodes Documentatie <7> <8>Startsjabloon laden ', + name: 'Blazor (Wasm)', + }, blockly: { desc: 'Een JavaScript-bibliotheek voor het bouwen van visuele programmeereditoren.', link: '<1> <2>Officiële website <3> <4>Handleidingen <5> <6>Referentie <7> <8>Voorbeelden <9> <10>Startsjabloon laden ', diff --git a/src/livecodes/i18n/locales/nl/translation.lokalise.json b/src/livecodes/i18n/locales/nl/translation.lokalise.json index e3c5513aca..1e00aa47a2 100644 --- a/src/livecodes/i18n/locales/nl/translation.lokalise.json +++ b/src/livecodes/i18n/locales/nl/translation.lokalise.json @@ -1929,6 +1929,9 @@ "templates.starter.blank": { "translation": "Leeg project" }, + "templates.starter.blazor-wasm": { + "translation": "Blazor (Wasm)-starter" + }, "templates.starter.blockly": { "translation": "Blockly-starter" }, diff --git a/src/livecodes/i18n/locales/nl/translation.ts b/src/livecodes/i18n/locales/nl/translation.ts index 762d4b36ef..1c90fdddec 100644 --- a/src/livecodes/i18n/locales/nl/translation.ts +++ b/src/livecodes/i18n/locales/nl/translation.ts @@ -983,6 +983,7 @@ const translation: I18nTranslation = { astro: 'Astro-starter', backbone: 'Backbone-starter', blank: 'Leeg project', + 'blazor-wasm': 'Blazor (Wasm)-starter', blockly: 'Blockly-starter', bootstrap: 'Bootstrap-starter', 'c-wasm': 'C (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 24e1a64883..79595f2966 100644 --- a/src/livecodes/i18n/locales/pt/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/pt/language-info.lokalise.json @@ -72,6 +72,15 @@ "bbcode.name": { "translation": "BBCode" }, + "blazorWasm.desc": { + "translation": "Componentes Razor compilados pelo verdadeiro compilador Razor e pelo Roslyn, e renderizados pelo Blazor WebAssembly no runtime .NET WebAssembly — tudo no navegador, sem servidor." + }, + "blazorWasm.link": { + "translation": " Documentação do Blazor Componentes do ASP.NET Core Blazor Documentação LiveCodes Carregar modelo inicial " + }, + "blazorWasm.name": { + "translation": "Blazor (Wasm)" + }, "blockly.desc": { "translation": "Uma biblioteca JavaScript para construir editores de programação visual." }, diff --git a/src/livecodes/i18n/locales/pt/language-info.ts b/src/livecodes/i18n/locales/pt/language-info.ts index 2f261bc6ad..c2f8902db7 100644 --- a/src/livecodes/i18n/locales/pt/language-info.ts +++ b/src/livecodes/i18n/locales/pt/language-info.ts @@ -43,6 +43,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>bbcode.org <3> <4>Guia do BBCode <5> <6>BBCode na Wikipedia ', name: 'BBCode', }, + blazorWasm: { + desc: 'Componentes Razor compilados pelo verdadeiro <1>compilador Razor e pelo <2>Roslyn, e renderizados pelo <3>Blazor WebAssembly no runtime .NET WebAssembly — tudo no navegador, sem servidor.', + link: '<1> <2>Documentação do Blazor <3> <4>Componentes do ASP.NET Core Blazor <5> <6>Documentação LiveCodes <7> <8>Carregar modelo inicial ', + name: 'Blazor (Wasm)', + }, blockly: { desc: 'Uma biblioteca JavaScript para construir editores de programação visual.', link: '<1> <2>Site oficial <3> <4>Guias <5> <6>Referência <7> <8>Exemplos <9> <10>Carregar modelo inicial ', diff --git a/src/livecodes/i18n/locales/pt/translation.lokalise.json b/src/livecodes/i18n/locales/pt/translation.lokalise.json index 3e79d9e4f9..e7c50d3a59 100644 --- a/src/livecodes/i18n/locales/pt/translation.lokalise.json +++ b/src/livecodes/i18n/locales/pt/translation.lokalise.json @@ -1929,6 +1929,9 @@ "templates.starter.blank": { "translation": "Projeto em Branco" }, + "templates.starter.blazor-wasm": { + "translation": "Iniciante Blazor (Wasm)" + }, "templates.starter.blockly": { "translation": "Iniciante Blockly" }, diff --git a/src/livecodes/i18n/locales/pt/translation.ts b/src/livecodes/i18n/locales/pt/translation.ts index f62e9b413a..e970099e2a 100644 --- a/src/livecodes/i18n/locales/pt/translation.ts +++ b/src/livecodes/i18n/locales/pt/translation.ts @@ -983,6 +983,7 @@ const translation: I18nTranslation = { astro: 'Iniciante Astro', backbone: 'Iniciante Backbone', blank: 'Projeto em Branco', + 'blazor-wasm': 'Iniciante Blazor (Wasm)', blockly: 'Iniciante Blockly', bootstrap: 'Iniciante Bootstrap', 'c-wasm': 'Iniciante C (Wasm)', diff --git a/src/livecodes/i18n/locales/ru/language-info.lokalise.json b/src/livecodes/i18n/locales/ru/language-info.lokalise.json index 4165231bb9..9d6cd73614 100644 --- a/src/livecodes/i18n/locales/ru/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/ru/language-info.lokalise.json @@ -72,6 +72,15 @@ "bbcode.name": { "translation": "BBCode" }, + "blazorWasm.desc": { + "translation": "Компоненты Razor компилируются настоящим компилятором Razor и Roslyn, а отображаются Blazor WebAssembly в среде выполнения .NET WebAssembly — всё в браузере, без сервера." + }, + "blazorWasm.link": { + "translation": " Документация Blazor Компоненты ASP.NET Core Blazor Документация LiveCodes Загрузите стартовый шаблон " + }, + "blazorWasm.name": { + "translation": "Blazor (Wasm)" + }, "blockly.desc": { "translation": "Библиотека JavaScript для создания визуальных редакторов программирования." }, diff --git a/src/livecodes/i18n/locales/ru/language-info.ts b/src/livecodes/i18n/locales/ru/language-info.ts index 55bb228a4c..d98a9ce610 100644 --- a/src/livecodes/i18n/locales/ru/language-info.ts +++ b/src/livecodes/i18n/locales/ru/language-info.ts @@ -43,6 +43,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>bbcode.org <3> <4>Руководство по BBCode <5> <6>BBCode в Википедии ', name: 'BBCode', }, + blazorWasm: { + desc: 'Компоненты Razor компилируются настоящим <1>компилятором Razor и <2>Roslyn, а отображаются <3>Blazor WebAssembly в среде выполнения .NET WebAssembly — всё в браузере, без сервера.', + link: '<1> <2>Документация Blazor <3> <4>Компоненты ASP.NET Core Blazor <5> <6>Документация LiveCodes <7> <8>Загрузите стартовый шаблон ', + name: 'Blazor (Wasm)', + }, blockly: { desc: 'Библиотека JavaScript для создания визуальных редакторов программирования.', link: '<1> <2>Официальный сайт <3> <4>Руководства <5> <6>Справочник <7> <8>Примеры <9> <10>Загрузить стартовый шаблон ', diff --git a/src/livecodes/i18n/locales/ru/translation.lokalise.json b/src/livecodes/i18n/locales/ru/translation.lokalise.json index 9f48b67701..1cfaba72af 100644 --- a/src/livecodes/i18n/locales/ru/translation.lokalise.json +++ b/src/livecodes/i18n/locales/ru/translation.lokalise.json @@ -1929,6 +1929,9 @@ "templates.starter.blank": { "translation": "Пустой проект" }, + "templates.starter.blazor-wasm": { + "translation": "Стартер Blazor (Wasm)" + }, "templates.starter.blockly": { "translation": "Стартер Blockly" }, diff --git a/src/livecodes/i18n/locales/ru/translation.ts b/src/livecodes/i18n/locales/ru/translation.ts index 2836e79de6..0102d8a8df 100644 --- a/src/livecodes/i18n/locales/ru/translation.ts +++ b/src/livecodes/i18n/locales/ru/translation.ts @@ -982,6 +982,7 @@ const translation: I18nTranslation = { astro: 'Стартер Astro', backbone: 'Стартер Backbone', blank: 'Пустой проект', + 'blazor-wasm': 'Стартер Blazor (Wasm)', blockly: 'Стартер Blockly', bootstrap: 'Стартер Bootstrap', 'c-wasm': 'Стартер C (Wasm)', diff --git a/src/livecodes/i18n/locales/tr/language-info.lokalise.json b/src/livecodes/i18n/locales/tr/language-info.lokalise.json index 8d0dfb505b..9d625c4e90 100644 --- a/src/livecodes/i18n/locales/tr/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/tr/language-info.lokalise.json @@ -72,6 +72,15 @@ "bbcode.name": { "translation": "BBCode" }, + "blazorWasm.desc": { + "translation": "Razor bileşenleri gerçek Razor derleyicisi ve Roslyn tarafından derlenir ve .NET WebAssembly çalışma zamanı üzerindeki Blazor WebAssembly tarafından işlenir — hepsi tarayıcıda, sunucu olmadan." + }, + "blazorWasm.link": { + "translation": " Blazor belgeleri ASP.NET Core Blazor bileşenleri LiveCodes Dokümantasyonu Başlangıç şablonunu yükle " + }, + "blazorWasm.name": { + "translation": "Blazor (Wasm)" + }, "blockly.desc": { "translation": "Görsel programlama düzenleyicileri oluşturmak için bir JavaScript kütüphanesi." }, diff --git a/src/livecodes/i18n/locales/tr/language-info.ts b/src/livecodes/i18n/locales/tr/language-info.ts index 4ac3888403..7012f752d5 100644 --- a/src/livecodes/i18n/locales/tr/language-info.ts +++ b/src/livecodes/i18n/locales/tr/language-info.ts @@ -43,6 +43,11 @@ const languageInfo: I18nLangInfoTranslation = { link: "<1><2>bbcode.org <3> <4>BBCode rehberi <5> <6>Wikipedia'da BBCode ", name: 'BBCode', }, + blazorWasm: { + desc: 'Razor bileşenleri gerçek <1>Razor derleyicisi ve <2>Roslyn tarafından derlenir ve .NET WebAssembly çalışma zamanı üzerindeki <3>Blazor WebAssembly tarafından işlenir — hepsi tarayıcıda, sunucu olmadan.', + link: '<1> <2>Blazor belgeleri <3> <4>ASP.NET Core Blazor bileşenleri <5> <6>LiveCodes Dokümantasyonu <7> <8>Başlangıç şablonunu yükle ', + name: 'Blazor (Wasm)', + }, blockly: { desc: 'Görsel programlama düzenleyicileri oluşturmak için bir JavaScript kütüphanesi.', link: '<1> <2>Resmi web sitesi <3> <4>Rehberler <5> <6>Referans <7> <8>Örnekler <9> <10>Başlangıç şablonunu yükle ', diff --git a/src/livecodes/i18n/locales/tr/translation.lokalise.json b/src/livecodes/i18n/locales/tr/translation.lokalise.json index 1e27dd6857..48c14ddbf9 100644 --- a/src/livecodes/i18n/locales/tr/translation.lokalise.json +++ b/src/livecodes/i18n/locales/tr/translation.lokalise.json @@ -1929,6 +1929,9 @@ "templates.starter.blank": { "translation": "Boş Proje" }, + "templates.starter.blazor-wasm": { + "translation": "Blazor (Wasm) Başlangıç" + }, "templates.starter.blockly": { "translation": "Blockly Başlangıç" }, diff --git a/src/livecodes/i18n/locales/tr/translation.ts b/src/livecodes/i18n/locales/tr/translation.ts index 53150fdfd6..15ee86f629 100644 --- a/src/livecodes/i18n/locales/tr/translation.ts +++ b/src/livecodes/i18n/locales/tr/translation.ts @@ -983,6 +983,7 @@ const translation: I18nTranslation = { astro: 'Astro Başlangıç', backbone: 'Backbone Başlangıç', blank: 'Boş Proje', + 'blazor-wasm': 'Blazor (Wasm) Başlangıç', blockly: 'Blockly Başlangıç', bootstrap: 'Bootstrap Başlangıç', 'c-wasm': 'C (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 31c9125847..3f76004454 100644 --- a/src/livecodes/i18n/locales/ur/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/ur/language-info.lokalise.json @@ -72,6 +72,15 @@ "bbcode.name": { "translation": "بی بی کوڈ" }, + "blazorWasm.desc": { + "translation": "Razor کمپونینٹس کو حقیقی Razor کمپائلر اور Roslyn کے ذریعے مرتب کیا جاتا ہے، اور .NET WebAssembly رن ٹائم پر Blazor WebAssembly کے ذریعے رینڈر کیا جاتا ہے — سب کچھ براؤزر میں، بغیر کسی سرور کے۔" + }, + "blazorWasm.link": { + "translation": " Blazor دستاویزات ASP.NET Core Blazor کمپونینٹس LiveCodes دستاویزی لوڈ اسٹارٹر ٹیمپلیٹ " + }, + "blazorWasm.name": { + "translation": "Blazor (Wasm)" + }, "blockly.desc": { "translation": "بصری پروگرامنگ ایڈیٹرز بنانے کے لیے ایک جاوا اسکرپٹ لائبریری۔" }, diff --git a/src/livecodes/i18n/locales/ur/language-info.ts b/src/livecodes/i18n/locales/ur/language-info.ts index 13d630c56b..4fef221cb5 100644 --- a/src/livecodes/i18n/locales/ur/language-info.ts +++ b/src/livecodes/i18n/locales/ur/language-info.ts @@ -43,6 +43,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>bbcode.org <3> <4>بی بی کوڈ گائیڈ <5> <6>ویکیپیڈیا پر بی بی کوڈ ', name: 'بی بی کوڈ', }, + blazorWasm: { + desc: 'Razor کمپونینٹس کو حقیقی <1>Razor کمپائلر اور <2>Roslyn کے ذریعے مرتب کیا جاتا ہے، اور .NET WebAssembly رن ٹائم پر <3>Blazor WebAssembly کے ذریعے رینڈر کیا جاتا ہے — سب کچھ براؤزر میں، بغیر کسی سرور کے۔', + link: '<1> <2>Blazor دستاویزات <3> <4>ASP.NET Core Blazor کمپونینٹس <5> <6>LiveCodes دستاویزی <7> <8>لوڈ اسٹارٹر ٹیمپلیٹ ', + name: 'Blazor (Wasm)', + }, blockly: { desc: 'بصری پروگرامنگ ایڈیٹرز بنانے کے لیے ایک جاوا اسکرپٹ لائبریری۔', link: '<1> <2>سرکاری ویب سائٹ <3> <4>رہنما <5> <6>حوالہ <7> <8>نمونے <9> <10>ابتدائی سانچہ لوڈ کریں ', diff --git a/src/livecodes/i18n/locales/ur/translation.lokalise.json b/src/livecodes/i18n/locales/ur/translation.lokalise.json index afd752a9fc..32ec27b9c1 100644 --- a/src/livecodes/i18n/locales/ur/translation.lokalise.json +++ b/src/livecodes/i18n/locales/ur/translation.lokalise.json @@ -1929,6 +1929,9 @@ "templates.starter.blank": { "translation": "خالی پروجیکٹ" }, + "templates.starter.blazor-wasm": { + "translation": "Blazor (واسم) شروعاتی" + }, "templates.starter.blockly": { "translation": "بلاکلی شروعاتی" }, diff --git a/src/livecodes/i18n/locales/ur/translation.ts b/src/livecodes/i18n/locales/ur/translation.ts index 3626affbca..9d235cb585 100644 --- a/src/livecodes/i18n/locales/ur/translation.ts +++ b/src/livecodes/i18n/locales/ur/translation.ts @@ -982,6 +982,7 @@ const translation: I18nTranslation = { astro: 'ایسٹرو شروعاتی', backbone: 'بیک بون شروعاتی', blank: 'خالی پروجیکٹ', + 'blazor-wasm': 'Blazor (واسم) شروعاتی', blockly: 'بلاکلی شروعاتی', bootstrap: 'بوٹ اسٹریپ شروعاتی', 'c-wasm': 'C (واسم) شروعاتی', 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 75e3cc94d4..94d2c1ea6d 100644 --- a/src/livecodes/i18n/locales/zh-CN/language-info.lokalise.json +++ b/src/livecodes/i18n/locales/zh-CN/language-info.lokalise.json @@ -72,6 +72,15 @@ "bbcode.name": { "translation": "BBCode" }, + "blazorWasm.desc": { + "translation": "Razor 组件由真正的 Razor 编译器 和 Roslyn 编译,并由 .NET WebAssembly 运行时上的 Blazor WebAssembly 渲染 — 全部在浏览器中完成,无需服务器。" + }, + "blazorWasm.link": { + "translation": " Blazor 文档 ASP.NET Core Blazor 组件 LiveCodes 文档 加载入门模板 " + }, + "blazorWasm.name": { + "translation": "Blazor (Wasm)" + }, "blockly.desc": { "translation": "用于构建可视化编程编辑器的 JavaScript 库。" }, diff --git a/src/livecodes/i18n/locales/zh-CN/language-info.ts b/src/livecodes/i18n/locales/zh-CN/language-info.ts index 7a0599b0ad..0d6f3b6d41 100644 --- a/src/livecodes/i18n/locales/zh-CN/language-info.ts +++ b/src/livecodes/i18n/locales/zh-CN/language-info.ts @@ -43,6 +43,11 @@ const languageInfo: I18nLangInfoTranslation = { link: '<1><2>bbcode.org <3> <4>BBCode 指南 <5> <6>维基百科上的 BBCode ', name: 'BBCode', }, + blazorWasm: { + desc: 'Razor 组件由真正的 <1>Razor 编译器 和 <2>Roslyn 编译,并由 .NET WebAssembly 运行时上的 <3>Blazor WebAssembly 渲染 — 全部在浏览器中完成,无需服务器。', + link: '<1> <2>Blazor 文档 <3> <4>ASP.NET Core Blazor 组件 <5> <6>LiveCodes 文档 <7> <8>加载入门模板 ', + name: 'Blazor (Wasm)', + }, blockly: { desc: '用于构建可视化编程编辑器的 JavaScript 库。', link: '<1> <2>官方网站 <3> <4>指南 <5> <6>参考 <7> <8>样例 <9> <10>加载启动模板 ', diff --git a/src/livecodes/i18n/locales/zh-CN/translation.lokalise.json b/src/livecodes/i18n/locales/zh-CN/translation.lokalise.json index 07b4f929b8..5a56391f6e 100644 --- a/src/livecodes/i18n/locales/zh-CN/translation.lokalise.json +++ b/src/livecodes/i18n/locales/zh-CN/translation.lokalise.json @@ -1929,6 +1929,9 @@ "templates.starter.blank": { "translation": "空白项目" }, + "templates.starter.blazor-wasm": { + "translation": "Blazor(WASM)启动模板" + }, "templates.starter.blockly": { "translation": "Blockly 启动模板" }, diff --git a/src/livecodes/i18n/locales/zh-CN/translation.ts b/src/livecodes/i18n/locales/zh-CN/translation.ts index efe5773dd6..a2082920c7 100644 --- a/src/livecodes/i18n/locales/zh-CN/translation.ts +++ b/src/livecodes/i18n/locales/zh-CN/translation.ts @@ -980,6 +980,7 @@ const translation: I18nTranslation = { astro: 'Astro 启动模板', backbone: 'Backbone 启动模板', blank: '空白项目', + 'blazor-wasm': 'Blazor(WASM)启动模板', blockly: 'Blockly 启动模板', bootstrap: 'Bootstrap 启动模板', 'c-wasm': 'C(WASM)启动模板', diff --git a/src/livecodes/languages/blazor-wasm/lang-blazor-wasm-script.ts b/src/livecodes/languages/blazor-wasm/lang-blazor-wasm-script.ts index e0a8ab8683..e5b44a7155 100644 --- a/src/livecodes/languages/blazor-wasm/lang-blazor-wasm-script.ts +++ b/src/livecodes/languages/blazor-wasm/lang-blazor-wasm-script.ts @@ -103,7 +103,11 @@ const loadScript = (src: string) => const script = document.createElement('script'); script.src = src; script.onload = () => resolve(); - script.onerror = () => reject(new Error(`Failed to load ${src}`)); + script.onerror = () => { + // Remove the failed script so a later attempt can issue a fresh request. + script.remove(); + reject(new Error(`Failed to load ${src}`)); + }; document.head.appendChild(script); }); diff --git a/src/livecodes/languages/csharp-wasm/lang-csharp-wasm-script.ts b/src/livecodes/languages/csharp-wasm/lang-csharp-wasm-script.ts index 0c517884a9..3d842ba983 100644 --- a/src/livecodes/languages/csharp-wasm/lang-csharp-wasm-script.ts +++ b/src/livecodes/languages/csharp-wasm/lang-csharp-wasm-script.ts @@ -68,7 +68,11 @@ const loadScript = (src: string) => const script = document.createElement('script'); script.src = src; script.onload = () => resolve(); - script.onerror = () => reject(new Error(`Failed to load ${src}`)); + script.onerror = () => { + // Remove the failed script so a later attempt can issue a fresh request. + script.remove(); + reject(new Error(`Failed to load ${src}`)); + }; document.head.appendChild(script); }); @@ -93,12 +97,45 @@ const formatErrors = (errors?: Diagnostic[]) => .join('\n') : null; +const initCSharp = (): Promise => { + if (!livecodes.csharp.init) { + const init = (async () => { + // eslint-disable-next-line no-console + console.log('Initializing C# environment...'); + try { + const runner = await getRunner(); + await withTimeout( + runner.ready(), + BOOT_TIMEOUT_MS, + 'Timed out while loading the C# WebAssembly runtime.', + () => { + livecodes.csharp.runner = undefined; + }, + ); + // eslint-disable-next-line no-console + console.log('C# environment initialized successfully'); + } catch (err) { + // eslint-disable-next-line no-console + console.error('Failed to initialize C# environment:', err); + livecodes.csharp.ready = false; + // Reset so a later run recreates the initialization and retries the download. + livecodes.csharp.init = null; + throw err; + } + })(); + // The failure is surfaced through `run`; do not also report it unhandled. + init.catch(() => undefined); + livecodes.csharp.init = init; + } + return livecodes.csharp.init; +}; + const runCSharpCode = async ( code: string, input = '', ): Promise<{ output: string | null; error: string | null }> => { try { - await livecodes.csharp.init; + await initCSharp(); const { output, errors } = await (livecodes.csharp.runner as CSharpRunner).run(code, input); return { output: output ?? null, error: formatErrors(errors) }; } catch (err) { @@ -106,31 +143,8 @@ const runCSharpCode = async ( } }; -livecodes.csharp.init ??= (async () => { - if (livecodes.csharp.ready) return; - - // eslint-disable-next-line no-console - console.log('Initializing C# environment...'); - try { - const runner = await getRunner(); - await withTimeout( - runner.ready(), - BOOT_TIMEOUT_MS, - 'Timed out while loading the C# WebAssembly runtime.', - () => { - livecodes.csharp.runner = undefined; - }, - ); - // eslint-disable-next-line no-console - console.log('C# environment initialized successfully'); - } catch (err) { - // eslint-disable-next-line no-console - console.error('Failed to initialize C# environment:', err); - livecodes.csharp.ready = false; - livecodes.csharp.init = null; - throw err; - } -})(); +// Start downloading the runtime as soon as the result page loads. +initCSharp(); livecodes.csharp.run ??= async (input?: string) => { let code = ''; From 8705d98cadd09504b9d25a2f8fda217d224f2c34 Mon Sep 17 00:00:00 2001 From: Hatem Hosny Date: Sun, 4 Oct 2026 11:24:03 +0300 Subject: [PATCH 4/7] edit blazor docs --- docs/docs/languages/blazor-wasm.mdx | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/docs/docs/languages/blazor-wasm.mdx b/docs/docs/languages/blazor-wasm.mdx index b455a6434a..7e2e1a2724 100644 --- a/docs/docs/languages/blazor-wasm.mdx +++ b/docs/docs/languages/blazor-wasm.mdx @@ -36,9 +36,6 @@ export const blazorConfig = { }, mode: 'simple', editor: 'auto', - tools: { - status: 'full', - }, }; @@ -48,17 +45,12 @@ export const blazorConfig = { The component runs in the context of the result page. A few helpers are available in the browser global `livecodes.blazorWasm` object: -- `livecodes.blazorWasm.loaded`: A promise that resolves when the .NET WebAssembly runtime has loaded. The Roslyn and Razor compiler payloads are fetched lazily on the first render, so other helpers should be used after this promise resolves. +- `livecodes.blazorWasm.loaded`: A promise that resolves when the .NET WebAssembly runtime, Roslyn and the Razor compiler are loaded. Other helpers should be used after this promise resolves. - `livecodes.blazorWasm.render`: A function that compiles and renders Razor markup. It takes a string of Razor markup as input and returns a promise that resolves with an object containing the `output`, `error`, and `exitCode` properties. - `livecodes.blazorWasm.runner`: The underlying [`@live-codes/blazor-wasm`](https://www.npmjs.com/package/@live-codes/blazor-wasm) runner, which also exposes `renderProject` (multi-file projects), `render`, `navigateTo` (for `@page` routing) and `payloads`. - `livecodes.blazorWasm.routes`: The routes declared by `@page` directives in the rendered component. - `livecodes.blazorWasm.navigateTo`: A function that drives the host's client-side navigation, for `@page` routing. -Example: - - - - ## Language Info @@ -106,7 +98,7 @@ Only **Blazor components** (`.razor`) are supported, not Razor Pages or MVC view ## Example Usage -```razor +```html

      Hello, Blazor!

      @@ -118,10 +110,6 @@ Only **Blazor components** (`.razor`) are supported, not Razor Pages or MVC view } ``` -## Live Reload - -Because the component tree is rendered into the result page DOM, a code change reloads the result page and initializes the .NET WebAssembly runtime again. Adding the code comment `// __livecodes_reload__` has no additional effect (a full reload is always used). - ## Starter Template https://livecodes.io/?template=blazor-wasm From 36160ed89d6009669ca38c473d638e85235b37c5 Mon Sep 17 00:00:00 2001 From: Hatem Hosny Date: Sun, 4 Oct 2026 11:25:04 +0300 Subject: [PATCH 5/7] edit docs --- docs/docs/languages/blazor-wasm.mdx | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/docs/docs/languages/blazor-wasm.mdx b/docs/docs/languages/blazor-wasm.mdx index 7e2e1a2724..39e654aa59 100644 --- a/docs/docs/languages/blazor-wasm.mdx +++ b/docs/docs/languages/blazor-wasm.mdx @@ -14,15 +14,11 @@ export const blazorConfig = { activeEditor: 'script', script: { language: 'blazor-wasm', - content: `

      Counter

      - -

      Current count: @count

      - - - + content: `

      Counter

      \n +

      Current count: @count

      \n +\n @code { - private int count = 0; - + private int count = 0;\n private void IncrementCount() => count++; }`, }, From 9503f3f536c047b929f3f14a2f41340765e45194 Mon Sep 17 00:00:00 2001 From: Hatem Hosny Date: Sun, 4 Oct 2026 14:59:25 +0300 Subject: [PATCH 6/7] edit docs --- docs/docs/languages/blazor-wasm.mdx | 2 +- src/livecodes/languages/blazor-wasm/lang-blazor-wasm-script.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/docs/languages/blazor-wasm.mdx b/docs/docs/languages/blazor-wasm.mdx index 39e654aa59..56d58ae69f 100644 --- a/docs/docs/languages/blazor-wasm.mdx +++ b/docs/docs/languages/blazor-wasm.mdx @@ -41,7 +41,7 @@ export const blazorConfig = { The component runs in the context of the result page. A few helpers are available in the browser global `livecodes.blazorWasm` object: -- `livecodes.blazorWasm.loaded`: A promise that resolves when the .NET WebAssembly runtime, Roslyn and the Razor compiler are loaded. Other helpers should be used after this promise resolves. +`livecodes.blazorWasm.loaded`: A promise that resolves when the .NET WebAssembly runtime has loaded. The Roslyn and Razor compiler payloads are fetched lazily on the first render, so other helpers should be used after this promise resolves. - `livecodes.blazorWasm.render`: A function that compiles and renders Razor markup. It takes a string of Razor markup as input and returns a promise that resolves with an object containing the `output`, `error`, and `exitCode` properties. - `livecodes.blazorWasm.runner`: The underlying [`@live-codes/blazor-wasm`](https://www.npmjs.com/package/@live-codes/blazor-wasm) runner, which also exposes `renderProject` (multi-file projects), `render`, `navigateTo` (for `@page` routing) and `payloads`. - `livecodes.blazorWasm.routes`: The routes declared by `@page` directives in the rendered component. diff --git a/src/livecodes/languages/blazor-wasm/lang-blazor-wasm-script.ts b/src/livecodes/languages/blazor-wasm/lang-blazor-wasm-script.ts index e5b44a7155..baf4aa216f 100644 --- a/src/livecodes/languages/blazor-wasm/lang-blazor-wasm-script.ts +++ b/src/livecodes/languages/blazor-wasm/lang-blazor-wasm-script.ts @@ -12,7 +12,7 @@ import { blazorWasmBaseUrl } from '../../vendors'; // loader patches `fetch` for `credentials: 'omit'` on its own. // // The component tree is bound to the result page DOM, so the language does not use live reload: -// a code change reloads the result page (see the docs). +// a code change reloads the result page. const SCRIPT_TYPE = 'text/razor'; // Downloading the .NET runtime, Roslyn and the Razor compiler is a large download. From 12914379592cba2158d0387ee16891e17b70cea9 Mon Sep 17 00:00:00 2001 From: Hatem Hosny Date: Sun, 4 Oct 2026 15:06:32 +0300 Subject: [PATCH 7/7] edit docs --- docs/docs/languages/blazor-wasm.mdx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/languages/blazor-wasm.mdx b/docs/docs/languages/blazor-wasm.mdx index 56d58ae69f..9909eeea7f 100644 --- a/docs/docs/languages/blazor-wasm.mdx +++ b/docs/docs/languages/blazor-wasm.mdx @@ -41,7 +41,7 @@ export const blazorConfig = { The component runs in the context of the result page. A few helpers are available in the browser global `livecodes.blazorWasm` object: -`livecodes.blazorWasm.loaded`: A promise that resolves when the .NET WebAssembly runtime has loaded. The Roslyn and Razor compiler payloads are fetched lazily on the first render, so other helpers should be used after this promise resolves. +- `livecodes.blazorWasm.loaded`: A promise that resolves when the .NET WebAssembly runtime has loaded. The Roslyn and Razor compiler payloads are fetched lazily on the first render, so other helpers should be used after this promise resolves. - `livecodes.blazorWasm.render`: A function that compiles and renders Razor markup. It takes a string of Razor markup as input and returns a promise that resolves with an object containing the `output`, `error`, and `exitCode` properties. - `livecodes.blazorWasm.runner`: The underlying [`@live-codes/blazor-wasm`](https://www.npmjs.com/package/@live-codes/blazor-wasm) runner, which also exposes `renderProject` (multi-file projects), `render`, `navigateTo` (for `@page` routing) and `payloads`. - `livecodes.blazorWasm.routes`: The routes declared by `@page` directives in the rendered component.