diff --git a/src/livecodes/i18n/locales/ar/language-info.lokalise.json b/src/livecodes/i18n/locales/ar/language-info.lokalise.json
index 0447c7ed5c..0b88a3529a 100644
--- a/src/livecodes/i18n/locales/ar/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/ar/language-info.lokalise.json
@@ -930,6 +930,15 @@
"typescript.name": {
"translation": "TypeScript"
},
+ "v-wasm.desc": {
+ "translation": "مترجم V يعمل على WebAssembly."
+ },
+ "v-wasm.link": {
+ "translation": "
موقع V وثائق لغة V تعلم X في Y دقيقة، حيث X = V وثائق LiveCodes تحميل قالب البداية "
+ },
+ "v-wasm.name": {
+ "translation": "V (Wasm)"
+ },
"vbWasm.desc": {
"translation": "مترجم VB.NET الذي يعمل على WebAssembly، باستخدام
Roslyn و
بيئة تشغيل .NET WebAssembly"
},
diff --git a/src/livecodes/i18n/locales/ar/language-info.ts b/src/livecodes/i18n/locales/ar/language-info.ts
index 41531bea8a..5737241424 100644
--- a/src/livecodes/i18n/locales/ar/language-info.ts
+++ b/src/livecodes/i18n/locales/ar/language-info.ts
@@ -521,6 +521,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1> <2>الموقع الرسمي2> 1> <3> <4>وثائق TypeScript4> 3> <5> <6>تعلم X في Y دقائق، حيث X=TypeScript6> 5> <7> <8>تحميل القالب الأولي8> 7>',
name: 'TypeScript',
},
+ 'v-wasm': {
+ desc: 'مترجم V يعمل على WebAssembly.',
+ link: '<1> <2>موقع V2> 1> <3> <4>وثائق لغة V4> 3> <5> <6>تعلم X في Y دقيقة، حيث X = V6> 5> <7> <8>وثائق LiveCodes8> 7> <9> <10>تحميل قالب البداية10> 9>',
+ name: 'V (Wasm)',
+ },
vbWasm: {
desc: 'مترجم VB.NET الذي يعمل على WebAssembly، باستخدام <1>Roslyn1> و<2>بيئة تشغيل .NET WebAssembly2>',
link: '<1> <2>وثائق لغة Visual Basic2> 1> <3> <4> تعلم X في دقائق Y، حيث X = Visual Basic4> 3> <5> <6> وثائق LiveCodes6> 5> <7> <8> تحميل قالب البدء8> 7>',
diff --git a/src/livecodes/i18n/locales/ar/translation.lokalise.json b/src/livecodes/i18n/locales/ar/translation.lokalise.json
index 8c045f3f0f..ab71cbd71a 100644
--- a/src/livecodes/i18n/locales/ar/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/ar/translation.lokalise.json
@@ -2166,6 +2166,9 @@
"templates.starter.typescript": {
"translation": "قالب TypeScript"
},
+ "templates.starter.v-wasm": {
+ "translation": "قالب V"
+ },
"templates.starter.vb-wasm": {
"translation": "قالب VB.NET (Wasm)"
},
diff --git a/src/livecodes/i18n/locales/ar/translation.ts b/src/livecodes/i18n/locales/ar/translation.ts
index 7b719d0bf4..65c712d703 100644
--- a/src/livecodes/i18n/locales/ar/translation.ts
+++ b/src/livecodes/i18n/locales/ar/translation.ts
@@ -1061,6 +1061,7 @@ const translation: I18nTranslation = {
tcl: 'قالب Tcl',
teal: 'قالب Teal',
typescript: 'قالب TypeScript',
+ 'v-wasm': 'قالب V',
'vb-wasm': 'قالب VB.NET (Wasm)',
vue: 'قالب Vue',
vue2: 'قالب Vue 2',
diff --git a/src/livecodes/i18n/locales/bn/language-info.lokalise.json b/src/livecodes/i18n/locales/bn/language-info.lokalise.json
index 47a2f4a2e5..cc18eaca54 100644
--- a/src/livecodes/i18n/locales/bn/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/bn/language-info.lokalise.json
@@ -930,6 +930,15 @@
"typescript.name": {
"translation": "TypeScript"
},
+ "v-wasm.desc": {
+ "translation": "V কম্পাইলার ওয়েবঅ্যাসেম্বলিতে চলছে।"
+ },
+ "v-wasm.link": {
+ "translation": "
V ওয়েবসাইট V ল্যাঙ্গুয়েজ ডকুমেন্টেশন Y মিনিটে X শিখুন, যেখানে X=V LiveCodes ডকুমেন্টেশন স্টার্টার টেমপ্লেট লোড করুন "
+ },
+ "v-wasm.name": {
+ "translation": "V (Wasm)"
+ },
"vbWasm.desc": {
"translation": "WebAssembly-তে চলমান VB.NET কম্পাইলার,
Roslyn এবং
.NET WebAssembly রানটাইম ব্যবহার করে"
},
diff --git a/src/livecodes/i18n/locales/bn/language-info.ts b/src/livecodes/i18n/locales/bn/language-info.ts
index a9ec413195..419cd4d990 100644
--- a/src/livecodes/i18n/locales/bn/language-info.ts
+++ b/src/livecodes/i18n/locales/bn/language-info.ts
@@ -523,6 +523,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1> <2>অফিসিয়াল ওয়েবসাইট2> 1> <3> <4>TypeScript ডকুমেন্টেশন4> 3> <5> <6>Y মিনিটে X শিখুন, যেখানে X=TypeScript6> 5> <7> <8>স্টার্টার টেমপ্লেট লোড করুন8> 7>',
name: 'TypeScript',
},
+ 'v-wasm': {
+ desc: 'V কম্পাইলার ওয়েবঅ্যাসেম্বলিতে চলছে।',
+ link: '<1> <2>V ওয়েবসাইট2> 1> <3> <4>V ল্যাঙ্গুয়েজ ডকুমেন্টেশন4> 3> <5> <6>Y মিনিটে X শিখুন, যেখানে X=V6> 5> <7> <8>LiveCodes ডকুমেন্টেশন8> 7> <9> <10>স্টার্টার টেমপ্লেট লোড করুন10> 9>',
+ name: 'V (Wasm)',
+ },
vbWasm: {
desc: 'WebAssembly-তে চলমান VB.NET কম্পাইলার, <1>Roslyn1> এবং <2>.NET WebAssembly রানটাইম2> ব্যবহার করে',
link: '<1> <2>Visual Basic ভাষা ডকুমেন্টেশন2> 1> <3> <4>Y মিনিটে X শিখুন, যেখানে X=Visual Basic4> 3> <5> <6>LiveCodes ডকুমেন্টেশন6> 5> <7> <8>স্টার্টার টেমপ্লেট লোড করুন8> 7>',
diff --git a/src/livecodes/i18n/locales/bn/translation.lokalise.json b/src/livecodes/i18n/locales/bn/translation.lokalise.json
index b20db58da1..f285a5c91f 100644
--- a/src/livecodes/i18n/locales/bn/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/bn/translation.lokalise.json
@@ -2166,6 +2166,9 @@
"templates.starter.typescript": {
"translation": "TypeScript স্টার্টার"
},
+ "templates.starter.v-wasm": {
+ "translation": "V স্টার্টার"
+ },
"templates.starter.vb-wasm": {
"translation": "VB.NET (Wasm) স্টার্টার"
},
diff --git a/src/livecodes/i18n/locales/bn/translation.ts b/src/livecodes/i18n/locales/bn/translation.ts
index 2909de69fc..64df2f4167 100644
--- a/src/livecodes/i18n/locales/bn/translation.ts
+++ b/src/livecodes/i18n/locales/bn/translation.ts
@@ -1061,6 +1061,7 @@ const translation: I18nTranslation = {
tcl: 'Tcl স্টার্টার',
teal: 'Teal স্টার্টার',
typescript: 'TypeScript স্টার্টার',
+ 'v-wasm': 'V স্টার্টার',
'vb-wasm': 'VB.NET (Wasm) স্টার্টার',
vue: 'Vue SFC স্টার্টার',
vue2: 'Vue 2 স্টার্টার',
diff --git a/src/livecodes/i18n/locales/de/language-info.lokalise.json b/src/livecodes/i18n/locales/de/language-info.lokalise.json
index 3885d58cba..bbc5e5c73d 100644
--- a/src/livecodes/i18n/locales/de/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/de/language-info.lokalise.json
@@ -930,6 +930,15 @@
"typescript.name": {
"translation": "TypeScript"
},
+ "v-wasm.desc": {
+ "translation": "V-Compiler, der auf WebAssembly läuft."
+ },
+ "v-wasm.link": {
+ "translation": "
V-Website V-Sprachdokumentation Lerne X in Y Minuten, wobei X = V LiveCodes-Dokumentation Starter-Vorlage laden "
+ },
+ "v-wasm.name": {
+ "translation": "V (Wasm)"
+ },
"vbWasm.desc": {
"translation": "VB.NET-Compiler, der auf WebAssembly läuft, unter Verwendung von
Roslyn und der
.NET-WebAssembly-Laufzeitumgebung"
},
diff --git a/src/livecodes/i18n/locales/de/language-info.ts b/src/livecodes/i18n/locales/de/language-info.ts
index 262639c238..05a1c8ea30 100644
--- a/src/livecodes/i18n/locales/de/language-info.ts
+++ b/src/livecodes/i18n/locales/de/language-info.ts
@@ -525,6 +525,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1> <2>Offizielle Website2> 1> <3> <4>TypeScript-Dokumentation4> 3> <5> <6>Lerne X in Y Minuten, wobei X=TypeScript6> 5> <7> <8>Starter-Vorlage laden8> 7>',
name: 'TypeScript',
},
+ 'v-wasm': {
+ desc: 'V-Compiler, der auf WebAssembly läuft.',
+ link: '<1> <2>V-Website2> 1> <3> <4>V-Sprachdokumentation4> 3> <5> <6>Lerne X in Y Minuten, wobei X = V6> 5> <7> <8>LiveCodes-Dokumentation8> 7> <9> <10>Starter-Vorlage laden10> 9>',
+ name: 'V (Wasm)',
+ },
vbWasm: {
desc: 'VB.NET-Compiler, der auf WebAssembly läuft, unter Verwendung von <1>Roslyn1> und der <2>.NET-WebAssembly-Laufzeitumgebung2>',
link: '<1> <2>Dokumentation der Sprache Visual Basic2> 1> <3> <4> Lernen Sie X in Y Minuten, wobei X=Visual Basic4> 3> <5> <6> LiveCodes Dokumentation6> 5> <7> <8> Laden Sie die Startvorlage8> 7>',
diff --git a/src/livecodes/i18n/locales/de/translation.lokalise.json b/src/livecodes/i18n/locales/de/translation.lokalise.json
index c0fc6c8503..275f7c7581 100644
--- a/src/livecodes/i18n/locales/de/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/de/translation.lokalise.json
@@ -2166,6 +2166,9 @@
"templates.starter.typescript": {
"translation": "TypeScript-Starter"
},
+ "templates.starter.v-wasm": {
+ "translation": "V-Starter"
+ },
"templates.starter.vb-wasm": {
"translation": "VB.NET (Wasm)-Starter"
},
diff --git a/src/livecodes/i18n/locales/de/translation.ts b/src/livecodes/i18n/locales/de/translation.ts
index e9defc5f53..45ec909d01 100644
--- a/src/livecodes/i18n/locales/de/translation.ts
+++ b/src/livecodes/i18n/locales/de/translation.ts
@@ -1063,6 +1063,7 @@ const translation: I18nTranslation = {
tcl: 'Tcl-Starter',
teal: 'Teal-Starter',
typescript: 'TypeScript-Starter',
+ 'v-wasm': 'V-Starter',
'vb-wasm': 'VB.NET (Wasm)-Starter',
vue: 'Vue-Starter',
vue2: 'Vue 2-Starter',
diff --git a/src/livecodes/i18n/locales/en/language-info.lokalise.json b/src/livecodes/i18n/locales/en/language-info.lokalise.json
index 3a5927087d..9255770289 100644
--- a/src/livecodes/i18n/locales/en/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/en/language-info.lokalise.json
@@ -1240,6 +1240,18 @@
"notes": "",
"translation": "TypeScript"
},
+ "v-wasm.desc": {
+ "notes": "",
+ "translation": "V compiler running on WebAssembly."
+ },
+ "v-wasm.link": {
+ "notes": "###
###\n\n\n### ###\n\n\n### ###\n\n\n### ###\n\n\n### ###\n\n\n### ###\n\n\n### ###\n\n\n### ###\n\n\n### ###\n\n\n### ###\n\n\n",
+ "translation": " V website V language documentation Learn X in Y minutes, where X=V LiveCodes Documentation Load starter template "
+ },
+ "v-wasm.name": {
+ "notes": "",
+ "translation": "V (Wasm)"
+ },
"vbWasm.desc": {
"notes": "### ###\n\n\n### ###\n\n\n",
"translation": "VB.NET compiler running on WebAssembly, using Roslyn and the .NET WebAssembly runtime"
diff --git a/src/livecodes/i18n/locales/en/language-info.ts b/src/livecodes/i18n/locales/en/language-info.ts
index 59e146c7d9..e24ba7406f 100644
--- a/src/livecodes/i18n/locales/en/language-info.ts
+++ b/src/livecodes/i18n/locales/en/language-info.ts
@@ -531,6 +531,11 @@ const languageInfo = {
link: '<1> <2>Official website2> 1> <3> <4>TypeScript documentation4> 3> <5> <6>Learn X in Y minutes, where X=TypeScript6> 5> <7> <8>Load starter template8> 7>',
name: 'TypeScript',
},
+ 'v-wasm': {
+ desc: 'V compiler running on WebAssembly.',
+ link: '<1> <2>V website2> 1> <3> <4>V language documentation4> 3> <5> <6>Learn X in Y minutes, where X=V6> 5> <7> <8>LiveCodes Documentation8> 7> <9> <10>Load starter template10> 9>',
+ name: 'V (Wasm)',
+ },
vbWasm: {
desc: 'VB.NET compiler running on WebAssembly, using <1>Roslyn1> and the <2>.NET WebAssembly runtime2>',
link: '<1> <2>Visual Basic language documentation2> 1> <3> <4>Learn X in Y minutes, where X=Visual Basic4> 3> <5> <6>LiveCodes Documentation6> 5> <7> <8>Load starter template8> 7>',
diff --git a/src/livecodes/i18n/locales/en/translation.lokalise.json b/src/livecodes/i18n/locales/en/translation.lokalise.json
index f7990a76fe..9699373161 100644
--- a/src/livecodes/i18n/locales/en/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/en/translation.lokalise.json
@@ -2888,6 +2888,10 @@
"notes": "",
"translation": "TypeScript Starter"
},
+ "templates.starter.v-wasm": {
+ "notes": "",
+ "translation": "V Starter"
+ },
"templates.starter.vb-wasm": {
"notes": "",
"translation": "VB.NET (Wasm) Starter"
diff --git a/src/livecodes/i18n/locales/en/translation.ts b/src/livecodes/i18n/locales/en/translation.ts
index a368d5972b..212c10234b 100644
--- a/src/livecodes/i18n/locales/en/translation.ts
+++ b/src/livecodes/i18n/locales/en/translation.ts
@@ -1068,6 +1068,7 @@ const translation = {
tcl: 'Tcl Starter',
teal: 'Teal Starter',
typescript: 'TypeScript Starter',
+ 'v-wasm': 'V Starter',
'vb-wasm': 'VB.NET (Wasm) Starter',
vue: 'Vue SFC Starter',
vue2: 'Vue 2 Starter',
diff --git a/src/livecodes/i18n/locales/es/language-info.lokalise.json b/src/livecodes/i18n/locales/es/language-info.lokalise.json
index 39bac57f40..4668820787 100644
--- a/src/livecodes/i18n/locales/es/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/es/language-info.lokalise.json
@@ -930,6 +930,15 @@
"typescript.name": {
"translation": "TypeScript"
},
+ "v-wasm.desc": {
+ "translation": "Compilador V que se ejecuta en WebAssembly."
+ },
+ "v-wasm.link": {
+ "translation": " Página web de V Documentación del lenguaje V Aprende X en Y minutos, donde X = V Documentación de LiveCodes Cargar plantilla de inicio "
+ },
+ "v-wasm.name": {
+ "translation": "V (Wasm)"
+ },
"vbWasm.desc": {
"translation": "Compilador de VB.NET que funciona con WebAssembly, utilizando Roslyn y el entorno de ejecución de .NET para WebAssembly"
},
diff --git a/src/livecodes/i18n/locales/es/language-info.ts b/src/livecodes/i18n/locales/es/language-info.ts
index e519db1429..68b7f20ddd 100644
--- a/src/livecodes/i18n/locales/es/language-info.ts
+++ b/src/livecodes/i18n/locales/es/language-info.ts
@@ -525,6 +525,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1> <2>Sitio web oficial2> 1> <3> <4>Documentación de TypeScript4> 3> <5> <6>Aprende X en Y minutos, donde X=TypeScript6> 5> <7> <8>Cargar plantilla inicial8> 7>',
name: 'TypeScript',
},
+ 'v-wasm': {
+ desc: 'Compilador V que se ejecuta en WebAssembly.',
+ link: '<1> <2>Página web de V2> 1> <3> <4>Documentación del lenguaje V4> 3> <5> <6>Aprende X en Y minutos, donde X = V6> 5> <7> <8>Documentación de LiveCodes8> 7> <9> <10>Cargar plantilla de inicio10> 9>',
+ name: 'V (Wasm)',
+ },
vbWasm: {
desc: 'Compilador de VB.NET que funciona con WebAssembly, utilizando <1>Roslyn1> y el <2>entorno de ejecución de .NET para WebAssembly2>',
link: '<1> <2>Documentación del lenguaje Visual Basic2> 1> <3> <4> Aprenda X en Y minutos, donde X=Visual Basic4> 3> <5> <6> Documentación de LiveCodes6> 5> <7> <8> Cargue la plantilla de inicio8> 7>',
diff --git a/src/livecodes/i18n/locales/es/translation.lokalise.json b/src/livecodes/i18n/locales/es/translation.lokalise.json
index ae4253147e..788309925a 100644
--- a/src/livecodes/i18n/locales/es/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/es/translation.lokalise.json
@@ -2166,6 +2166,9 @@
"templates.starter.typescript": {
"translation": "Inicio TypeScript"
},
+ "templates.starter.v-wasm": {
+ "translation": "Inicio V"
+ },
"templates.starter.vb-wasm": {
"translation": "Inicio VB.NET (Wasm)"
},
diff --git a/src/livecodes/i18n/locales/es/translation.ts b/src/livecodes/i18n/locales/es/translation.ts
index d167c42597..d7adbae72c 100644
--- a/src/livecodes/i18n/locales/es/translation.ts
+++ b/src/livecodes/i18n/locales/es/translation.ts
@@ -1061,6 +1061,7 @@ const translation: I18nTranslation = {
tcl: 'Inicio Tcl',
teal: 'Inicio Teal',
typescript: 'Inicio TypeScript',
+ 'v-wasm': 'Inicio V',
'vb-wasm': 'Inicio VB.NET (Wasm)',
vue: 'Inicio Vue',
vue2: 'Inicio Vue 2',
diff --git a/src/livecodes/i18n/locales/fa/language-info.lokalise.json b/src/livecodes/i18n/locales/fa/language-info.lokalise.json
index e61a2d9ebb..d3c4c511a9 100644
--- a/src/livecodes/i18n/locales/fa/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/fa/language-info.lokalise.json
@@ -930,6 +930,15 @@
"typescript.name": {
"translation": "TypeScript"
},
+ "v-wasm.desc": {
+ "translation": "کامپایلر V که روی WebAssembly اجرا میشود."
+ },
+ "v-wasm.link": {
+ "translation": " وبسایت V مستندات زبان V زبان V را در چند دقیقه بیاموزید مستندات LiveCodes بارگذاری قالب شروع "
+ },
+ "v-wasm.name": {
+ "translation": "V (Wasm)"
+ },
"vbWasm.desc": {
"translation": "کامپایلر VB.NET که روی WebAssembly اجرا میشود، با استفاده از Roslyn و محیط اجرایی .NET WebAssembly"
},
diff --git a/src/livecodes/i18n/locales/fa/language-info.ts b/src/livecodes/i18n/locales/fa/language-info.ts
index 49d563bfd1..947ded750e 100644
--- a/src/livecodes/i18n/locales/fa/language-info.ts
+++ b/src/livecodes/i18n/locales/fa/language-info.ts
@@ -524,6 +524,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1> <2>وبسایت رسمی2> 1> <3> <4>مستندات TypeScript4> 3> <5> <6>یادگیری X در Y دقیقه، جایی که X=TypeScript6> 5> <7> <8>بارگذاری قالب شروع کننده8> 7>',
name: 'TypeScript',
},
+ 'v-wasm': {
+ desc: 'کامپایلر V که روی WebAssembly اجرا میشود.',
+ link: '<1> <2>وبسایت V2> 1> <3> <4>مستندات زبان V4> 3> <5> <6>زبان V را در چند دقیقه بیاموزید6> 5> <7> <8>مستندات LiveCodes8> 7> <9> <10>بارگذاری قالب شروع10> 9>',
+ name: 'V (Wasm)',
+ },
vbWasm: {
desc: 'کامپایلر VB.NET که روی WebAssembly اجرا میشود، با استفاده از <1>Roslyn1> و <2>محیط اجرایی .NET WebAssembly2>',
link: '<1> <2>مستندات زبان Visual Basic2> 1> <3> <4>یادگیری X در Y دقیقه، جایی که X=Visual Basic4> 3> <5> <6>مستندات LiveCodes6> 5> <7> <8>بارگذاری قالب شروع کننده8> 7>',
diff --git a/src/livecodes/i18n/locales/fa/translation.lokalise.json b/src/livecodes/i18n/locales/fa/translation.lokalise.json
index 905c675853..340c54aecd 100644
--- a/src/livecodes/i18n/locales/fa/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/fa/translation.lokalise.json
@@ -2166,6 +2166,9 @@
"templates.starter.typescript": {
"translation": "شروع کننده تایپاسکریپت"
},
+ "templates.starter.v-wasm": {
+ "translation": "شروع کننده V"
+ },
"templates.starter.vb-wasm": {
"translation": "شروع کننده VB.NET (Wasm)"
},
diff --git a/src/livecodes/i18n/locales/fa/translation.ts b/src/livecodes/i18n/locales/fa/translation.ts
index 2b7263659b..14d4410ff6 100644
--- a/src/livecodes/i18n/locales/fa/translation.ts
+++ b/src/livecodes/i18n/locales/fa/translation.ts
@@ -1062,6 +1062,7 @@ const translation: I18nTranslation = {
tcl: 'شروع کننده Tcl',
teal: 'شروع کننده Teal',
typescript: 'شروع کننده تایپاسکریپت',
+ 'v-wasm': 'شروع کننده V',
'vb-wasm': 'شروع کننده VB.NET (Wasm)',
vue: 'شروع کننده Vue SFC',
vue2: 'شروع کننده Vue 2',
diff --git a/src/livecodes/i18n/locales/fr/language-info.lokalise.json b/src/livecodes/i18n/locales/fr/language-info.lokalise.json
index 5157c8fab7..56e4e45238 100644
--- a/src/livecodes/i18n/locales/fr/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/fr/language-info.lokalise.json
@@ -930,6 +930,15 @@
"typescript.name": {
"translation": "TypeScript"
},
+ "v-wasm.desc": {
+ "translation": "Compilateur V fonctionnant sur WebAssembly."
+ },
+ "v-wasm.link": {
+ "translation": " Site web de V Documentation du langage V Apprenez X en Y minutes, où X = V Documentation LiveCodes Charger un modèle de démarrage "
+ },
+ "v-wasm.name": {
+ "translation": "V (Wasm)"
+ },
"vbWasm.desc": {
"translation": "Compilateur VB.NET fonctionnant sur WebAssembly, utilisant Roslyn et le runtime .NET WebAssembly"
},
diff --git a/src/livecodes/i18n/locales/fr/language-info.ts b/src/livecodes/i18n/locales/fr/language-info.ts
index dbe5be9557..a7c5839edb 100644
--- a/src/livecodes/i18n/locales/fr/language-info.ts
+++ b/src/livecodes/i18n/locales/fr/language-info.ts
@@ -525,6 +525,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1> <2>Site officiel2> 1> <3> <4>Documentation TypeScript4> 3> <5> <6>Apprenez X en Y minutes, où X=TypeScript6> 5> <7> <8>Charger le modèle de démarrage8> 7>',
name: 'TypeScript',
},
+ 'v-wasm': {
+ desc: 'Compilateur V fonctionnant sur WebAssembly.',
+ link: '<1> <2>Site web de V2> 1> <3> <4>Documentation du langage V4> 3> <5> <6>Apprenez X en Y minutes, où X = V6> 5> <7> <8>Documentation LiveCodes8> 7> <9> <10>Charger un modèle de démarrage10> 9>',
+ name: 'V (Wasm)',
+ },
vbWasm: {
desc: 'Compilateur VB.NET fonctionnant sur WebAssembly, utilisant <1>Roslyn1> et le <2>runtime .NET WebAssembly2>',
link: '<1> <2>Documentation sur le langage Visual Basic2> 1> <3> <4> Apprenez X en Y minutes, où X=Visual Basic4> 3> <5> <6> Documentation LiveCodes6> 5> <7> <8> Charger le modèle de démarrage8> 7>',
diff --git a/src/livecodes/i18n/locales/fr/translation.lokalise.json b/src/livecodes/i18n/locales/fr/translation.lokalise.json
index 09b40d9059..f83fb22676 100644
--- a/src/livecodes/i18n/locales/fr/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/fr/translation.lokalise.json
@@ -2166,6 +2166,9 @@
"templates.starter.typescript": {
"translation": "Démarrage TypeScript"
},
+ "templates.starter.v-wasm": {
+ "translation": "Démarrage V"
+ },
"templates.starter.vb-wasm": {
"translation": "Démarrage VB.NET (Wasm)"
},
diff --git a/src/livecodes/i18n/locales/fr/translation.ts b/src/livecodes/i18n/locales/fr/translation.ts
index cbb57761ae..bde75f5e8e 100644
--- a/src/livecodes/i18n/locales/fr/translation.ts
+++ b/src/livecodes/i18n/locales/fr/translation.ts
@@ -1063,6 +1063,7 @@ const translation: I18nTranslation = {
tcl: 'Démarrage Tcl',
teal: 'Démarrage Teal',
typescript: 'Démarrage TypeScript',
+ 'v-wasm': 'Démarrage V',
'vb-wasm': 'Démarrage VB.NET (Wasm)',
vue: 'Démarrage Vue',
vue2: 'Démarrage Vue 2',
diff --git a/src/livecodes/i18n/locales/hi/language-info.lokalise.json b/src/livecodes/i18n/locales/hi/language-info.lokalise.json
index a8602ccb42..3e2d897d53 100644
--- a/src/livecodes/i18n/locales/hi/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/hi/language-info.lokalise.json
@@ -930,6 +930,15 @@
"typescript.name": {
"translation": "TypeScript"
},
+ "v-wasm.desc": {
+ "translation": "वेबअसेंबली पर चल रहा V कंपाइलर।"
+ },
+ "v-wasm.link": {
+ "translation": " V वेबसाइट V भाषा दस्तावेज़ीकरण वाई मिनटों में एक्स सीखें, जहां एक्स=V लाइवकोड दस्तावेज़ीकरण स्टार्टर टेम्पलेट लोड करें "
+ },
+ "v-wasm.name": {
+ "translation": "V (Wasm)"
+ },
"vbWasm.desc": {
"translation": "VB.NET कंपाइलर WebAssembly पर चल रहा है, Roslyn और .NET वेबअसेंबली रनटाइम का उपयोग करके"
},
diff --git a/src/livecodes/i18n/locales/hi/language-info.ts b/src/livecodes/i18n/locales/hi/language-info.ts
index e6e6f30bbb..92aca6bfee 100644
--- a/src/livecodes/i18n/locales/hi/language-info.ts
+++ b/src/livecodes/i18n/locales/hi/language-info.ts
@@ -526,6 +526,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1> <2>आधिकारिक वेबसाइट2> 1> <3> <4>TypeScript दस्तावेज़ीकरण4> 3> <5> <6>X को Y मिनटों में सीखें, जहां X=TypeScript6> 5> <7> <8>स्टार्टर टेम्पलेट लोड करें8> 7>',
name: 'TypeScript',
},
+ 'v-wasm': {
+ desc: 'वेबअसेंबली पर चल रहा V कंपाइलर।',
+ link: '<1> <2>V वेबसाइट2> 1> <3> <4>V भाषा दस्तावेज़ीकरण4> 3> <5> <6>वाई मिनटों में एक्स सीखें, जहां एक्स=V6> 5> <7> <8>लाइवकोड दस्तावेज़ीकरण8> 7> <9> <10>स्टार्टर टेम्पलेट लोड करें10> 9>',
+ name: 'V (Wasm)',
+ },
vbWasm: {
desc: 'VB.NET कंपाइलर WebAssembly पर चल रहा है, <1>Roslyn1> और <2>.NET वेबअसेंबली रनटाइम2> का उपयोग करके',
link: '<1> <2>Visual Basic भाषा दस्तावेज़ीकरण2> 1> <3> <4>एक्स को वाई मिनटों में सीखें, जहां एक्स=Visual Basic4> 3> <5> <6>लाइवकोड दस्तावेज़ीकरण6> 5> <7> <8>स्टार्टर टेम्पलेट लोड करें8> 7>',
diff --git a/src/livecodes/i18n/locales/hi/translation.lokalise.json b/src/livecodes/i18n/locales/hi/translation.lokalise.json
index bd32d66fe2..8426deb82e 100644
--- a/src/livecodes/i18n/locales/hi/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/hi/translation.lokalise.json
@@ -2166,6 +2166,9 @@
"templates.starter.typescript": {
"translation": "TypeScript स्टार्टर"
},
+ "templates.starter.v-wasm": {
+ "translation": "V स्टार्टर"
+ },
"templates.starter.vb-wasm": {
"translation": "VB.NET (Wasm) स्टार्टर"
},
diff --git a/src/livecodes/i18n/locales/hi/translation.ts b/src/livecodes/i18n/locales/hi/translation.ts
index 1194034c04..c5e8705f1c 100644
--- a/src/livecodes/i18n/locales/hi/translation.ts
+++ b/src/livecodes/i18n/locales/hi/translation.ts
@@ -1061,6 +1061,7 @@ const translation: I18nTranslation = {
tcl: 'Tcl स्टार्टर',
teal: 'Teal स्टार्टर',
typescript: 'TypeScript स्टार्टर',
+ 'v-wasm': 'V स्टार्टर',
'vb-wasm': 'VB.NET (Wasm) स्टार्टर',
vue: 'Vue स्टार्टर',
vue2: 'Vue 2 स्टार्टर',
diff --git a/src/livecodes/i18n/locales/hu/language-info.lokalise.json b/src/livecodes/i18n/locales/hu/language-info.lokalise.json
index 6df56e54c5..ff0c937ead 100644
--- a/src/livecodes/i18n/locales/hu/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/hu/language-info.lokalise.json
@@ -930,6 +930,15 @@
"typescript.name": {
"translation": "TypeScript"
},
+ "v-wasm.desc": {
+ "translation": "A V fordító WebAssembly-en fut."
+ },
+ "v-wasm.link": {
+ "translation": " A V weboldala A V nyelv dokumentációja Tanulj meg X-et Y perc alatt, ahol X=V LiveCodes dokumentáció Indító sablon betöltése "
+ },
+ "v-wasm.name": {
+ "translation": "V (Wasm)"
+ },
"vbWasm.desc": {
"translation": "VB.NET fordító WebAssembly-n futva, a Roslyn és a .NET WebAssembly futtatókörnyezet használatával"
},
diff --git a/src/livecodes/i18n/locales/hu/language-info.ts b/src/livecodes/i18n/locales/hu/language-info.ts
index e6b178d781..812ffb5649 100644
--- a/src/livecodes/i18n/locales/hu/language-info.ts
+++ b/src/livecodes/i18n/locales/hu/language-info.ts
@@ -525,6 +525,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1> <2>Hivatalos weboldal2> 1> <3> <4>TypeScript dokumentáció4> 3> <5> <6>Tanulj X-et Y perc alatt, ahol X=TypeScript6> 5> <7> <8>Kezdő sablon betöltése8> 7>',
name: 'TypeScript',
},
+ 'v-wasm': {
+ desc: 'A V fordító WebAssembly-en fut.',
+ link: '<1> <2>A V weboldala2> 1> <3> <4>A V nyelv dokumentációja4> 3> <5> <6>Tanulj meg X-et Y perc alatt, ahol X=V6> 5> <7> <8>LiveCodes dokumentáció8> 7> <9> <10>Indító sablon betöltése10> 9>',
+ name: 'V (Wasm)',
+ },
vbWasm: {
desc: 'VB.NET fordító WebAssembly-n futva, a <1>Roslyn1> és a <2>.NET WebAssembly futtatókörnyezet2> használatával',
link: '<1> <2>Visual Basic nyelvi dokumentáció2> 1> <3> <4>Tanulj X-et Y perc alatt, ahol X=Visual Basic4> 3> <5> <6>LiveCodes dokumentáció6> 5> <7> <8>Kezdő sablon betöltése8> 7>',
diff --git a/src/livecodes/i18n/locales/hu/translation.lokalise.json b/src/livecodes/i18n/locales/hu/translation.lokalise.json
index 17f2b46fb2..f979de40ee 100644
--- a/src/livecodes/i18n/locales/hu/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/hu/translation.lokalise.json
@@ -2166,6 +2166,9 @@
"templates.starter.typescript": {
"translation": "TypeScript kezdő"
},
+ "templates.starter.v-wasm": {
+ "translation": "V kezdő"
+ },
"templates.starter.vb-wasm": {
"translation": "VB.NET (Wasm) kezdő"
},
diff --git a/src/livecodes/i18n/locales/hu/translation.ts b/src/livecodes/i18n/locales/hu/translation.ts
index 15a4e6e9c0..e5d5504b54 100644
--- a/src/livecodes/i18n/locales/hu/translation.ts
+++ b/src/livecodes/i18n/locales/hu/translation.ts
@@ -1062,6 +1062,7 @@ const translation: I18nTranslation = {
tcl: 'Tcl kezdő',
teal: 'Teal kezdő',
typescript: 'TypeScript kezdő',
+ 'v-wasm': 'V kezdő',
'vb-wasm': 'VB.NET (Wasm) kezdő',
vue: 'Vue SFC kezdő',
vue2: 'Vue 2 kezdő',
diff --git a/src/livecodes/i18n/locales/id/language-info.lokalise.json b/src/livecodes/i18n/locales/id/language-info.lokalise.json
index 570030c2a6..ea2a4a5d90 100644
--- a/src/livecodes/i18n/locales/id/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/id/language-info.lokalise.json
@@ -930,6 +930,15 @@
"typescript.name": {
"translation": "TypeScript"
},
+ "v-wasm.desc": {
+ "translation": "Kompiler V yang berjalan di WebAssembly."
+ },
+ "v-wasm.link": {
+ "translation": " Situs web V Dokumentasi bahasa V Pelajari X dalam Y menit, di mana X = V Dokumentasi LiveCodes Muat templat awal "
+ },
+ "v-wasm.name": {
+ "translation": "V (Wasm)"
+ },
"vbWasm.desc": {
"translation": "Kompiler VB.NET berjalan di WebAssembly, menggunakan Roslyn dan runtime .NET WebAssembly"
},
diff --git a/src/livecodes/i18n/locales/id/language-info.ts b/src/livecodes/i18n/locales/id/language-info.ts
index 03d6c57a8e..c2f3c88859 100644
--- a/src/livecodes/i18n/locales/id/language-info.ts
+++ b/src/livecodes/i18n/locales/id/language-info.ts
@@ -525,6 +525,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1> <2>Situs web resmi2> 1> <3> <4>Dokumentasi TypeScript4> 3> <5> <6>Pelajari X dalam Y menit, dengan X=TypeScript6> 5> <7> <8>Muat template pemula8> 7>',
name: 'TypeScript',
},
+ 'v-wasm': {
+ desc: 'Kompiler V yang berjalan di WebAssembly.',
+ link: '<1> <2>Situs web V2> 1> <3> <4>Dokumentasi bahasa V4> 3> <5> <6>Pelajari X dalam Y menit, di mana X = V6> 5> <7> <8>Dokumentasi LiveCodes8> 7> <9> <10>Muat templat awal10> 9>',
+ name: 'V (Wasm)',
+ },
vbWasm: {
desc: 'Kompiler VB.NET berjalan di WebAssembly, menggunakan <1>Roslyn1> dan <2>runtime .NET WebAssembly2>',
link: '<1> <2>Dokumentasi bahasa Visual Basic2> 1> <3> <4>Pelajari X dalam Y menit, dengan X=Visual Basic4> 3> <5> <6>Dokumentasi LiveCodes6> 5> <7> <8>Muat template pemula8> 7>',
diff --git a/src/livecodes/i18n/locales/id/translation.lokalise.json b/src/livecodes/i18n/locales/id/translation.lokalise.json
index 47ce60c852..5ef5aa11c1 100644
--- a/src/livecodes/i18n/locales/id/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/id/translation.lokalise.json
@@ -2166,6 +2166,9 @@
"templates.starter.typescript": {
"translation": "Pemula TypeScript"
},
+ "templates.starter.v-wasm": {
+ "translation": "Pemula V"
+ },
"templates.starter.vb-wasm": {
"translation": "Pemula VB.NET (Wasm)"
},
diff --git a/src/livecodes/i18n/locales/id/translation.ts b/src/livecodes/i18n/locales/id/translation.ts
index fd6180395c..77bb7d5166 100644
--- a/src/livecodes/i18n/locales/id/translation.ts
+++ b/src/livecodes/i18n/locales/id/translation.ts
@@ -1061,6 +1061,7 @@ const translation: I18nTranslation = {
tcl: 'Pemula Tcl',
teal: 'Pemula Teal',
typescript: 'Pemula TypeScript',
+ 'v-wasm': 'Pemula V',
'vb-wasm': 'Pemula VB.NET (Wasm)',
vue: 'Pemula Vue SFC',
vue2: 'Pemula Vue 2',
diff --git a/src/livecodes/i18n/locales/it/language-info.lokalise.json b/src/livecodes/i18n/locales/it/language-info.lokalise.json
index 53042e8e1f..a06cdb1a6e 100644
--- a/src/livecodes/i18n/locales/it/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/it/language-info.lokalise.json
@@ -930,6 +930,15 @@
"typescript.name": {
"translation": "TypeScript"
},
+ "v-wasm.desc": {
+ "translation": "Compilatore V in esecuzione su WebAssembly."
+ },
+ "v-wasm.link": {
+ "translation": " Sito web di V Documentazione sul linguaggio V Impara X in Y minuti, dove X = V Documentazione LiveCodes Carica il modello di avvio "
+ },
+ "v-wasm.name": {
+ "translation": "V (Wasm)"
+ },
"vbWasm.desc": {
"translation": "Compilatore VB.NET in esecuzione su WebAssembly, utilizzando Roslyn e il runtime .NET per WebAssembly"
},
diff --git a/src/livecodes/i18n/locales/it/language-info.ts b/src/livecodes/i18n/locales/it/language-info.ts
index 5536561e6e..171cebb171 100644
--- a/src/livecodes/i18n/locales/it/language-info.ts
+++ b/src/livecodes/i18n/locales/it/language-info.ts
@@ -524,6 +524,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1> <2>Sito ufficiale2> 1> <3> <4>Documentazione di TypeScript4> 3> <5> <6>Impara X in Y minuti, dove X=TypeScript6> 5> <7> <8>Carica modello di partenza8> 7>',
name: 'TypeScript',
},
+ 'v-wasm': {
+ desc: 'Compilatore V in esecuzione su WebAssembly.',
+ link: '<1> <2>Sito web di V2> 1> <3> <4>Documentazione sul linguaggio V4> 3> <5> <6>Impara X in Y minuti, dove X = V6> 5> <7> <8>Documentazione LiveCodes8> 7> <9> <10>Carica il modello di avvio10> 9>',
+ name: 'V (Wasm)',
+ },
vbWasm: {
desc: 'Compilatore VB.NET in esecuzione su WebAssembly, utilizzando <1>Roslyn1> e il <2>runtime .NET per WebAssembly2>',
link: '<1> <2>Documentazione sul linguaggio Visual Basic2> 1> <3> <4> Imparare X in Y minuti, dove X=Visual Basic4> 3> <5> <6> Documentazione LiveCodes6> 5> <7> <8> Carica il modello iniziale8> 7>',
diff --git a/src/livecodes/i18n/locales/it/translation.lokalise.json b/src/livecodes/i18n/locales/it/translation.lokalise.json
index fbc62938c2..c7652d3c64 100644
--- a/src/livecodes/i18n/locales/it/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/it/translation.lokalise.json
@@ -2166,6 +2166,9 @@
"templates.starter.typescript": {
"translation": "Starter TypeScript"
},
+ "templates.starter.v-wasm": {
+ "translation": "Starter V"
+ },
"templates.starter.vb-wasm": {
"translation": "Starter VB.NET (Wasm)"
},
diff --git a/src/livecodes/i18n/locales/it/translation.ts b/src/livecodes/i18n/locales/it/translation.ts
index b67c6fe4f0..d3bffdef42 100644
--- a/src/livecodes/i18n/locales/it/translation.ts
+++ b/src/livecodes/i18n/locales/it/translation.ts
@@ -1062,6 +1062,7 @@ const translation: I18nTranslation = {
tcl: 'Starter Tcl',
teal: 'Starter Teal',
typescript: 'Starter TypeScript',
+ 'v-wasm': 'Starter V',
'vb-wasm': 'Starter VB.NET (Wasm)',
vue: 'Starter Vue',
vue2: 'Starter Vue 2',
diff --git a/src/livecodes/i18n/locales/ja/language-info.lokalise.json b/src/livecodes/i18n/locales/ja/language-info.lokalise.json
index 96896268d0..16a32bc4bc 100644
--- a/src/livecodes/i18n/locales/ja/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/ja/language-info.lokalise.json
@@ -930,6 +930,15 @@
"typescript.name": {
"translation": "TypeScript"
},
+ "v-wasm.desc": {
+ "translation": "WebAssembly上で動作するVコンパイラ。"
+ },
+ "v-wasm.link": {
+ "translation": " Vのウェブサイト V言語のドキュメント 「XをY分で学ぶ」(X=V) LiveCodes ドキュメント スターターテンプレートを読み込む "
+ },
+ "v-wasm.name": {
+ "translation": "V (Wasm)"
+ },
"vbWasm.desc": {
"translation": "WebAssembly 上で動作する VB.NET コンパイラ。Roslyn と .NET WebAssembly ランタイム を使用。"
},
diff --git a/src/livecodes/i18n/locales/ja/language-info.ts b/src/livecodes/i18n/locales/ja/language-info.ts
index d1cf93881d..3f9ca3dfe2 100644
--- a/src/livecodes/i18n/locales/ja/language-info.ts
+++ b/src/livecodes/i18n/locales/ja/language-info.ts
@@ -525,6 +525,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1> <2>公式ウェブサイト2> 1> <3> <4>TypeScript ドキュメント4> 3> <5> <6>X分でYを学ぶ、X=TypeScript6> 5> <7> <8>スターターテンプレートを読み込む8> 7>',
name: 'TypeScript',
},
+ 'v-wasm': {
+ desc: 'WebAssembly上で動作するVコンパイラ。',
+ link: '<1> <2>Vのウェブサイト2> 1> <3> <4>V言語のドキュメント4> 3> <5> <6>「XをY分で学ぶ」(X=V)6> 5> <7> <8>LiveCodes ドキュメント8> 7> <9> <10>スターターテンプレートを読み込む10> 9>',
+ name: 'V (Wasm)',
+ },
vbWasm: {
desc: 'WebAssembly 上で動作する VB.NET コンパイラ。<1>Roslyn1> と <2>.NET WebAssembly ランタイム2> を使用。',
link: '<1> <2>Visual Basic 言語のドキュメント2> 1> <3> <4>X を Y 分で学習します (X=Visual Basic の場合)4> 3> <5> <6>LiveCodesドキュメンテーション6> 5> <7> <8>スターターテンプレートをロードする8> 7>',
diff --git a/src/livecodes/i18n/locales/ja/translation.lokalise.json b/src/livecodes/i18n/locales/ja/translation.lokalise.json
index 408515a6fc..ae50b5c4f5 100644
--- a/src/livecodes/i18n/locales/ja/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/ja/translation.lokalise.json
@@ -2166,6 +2166,9 @@
"templates.starter.typescript": {
"translation": "TypeScriptスターター"
},
+ "templates.starter.v-wasm": {
+ "translation": "Vスターター"
+ },
"templates.starter.vb-wasm": {
"translation": "VB.NET(Wasm)スターター"
},
diff --git a/src/livecodes/i18n/locales/ja/translation.ts b/src/livecodes/i18n/locales/ja/translation.ts
index ff4f4c6064..41edea9f56 100644
--- a/src/livecodes/i18n/locales/ja/translation.ts
+++ b/src/livecodes/i18n/locales/ja/translation.ts
@@ -1062,6 +1062,7 @@ const translation: I18nTranslation = {
tcl: 'Tclスターター',
teal: 'Tealスターター',
typescript: 'TypeScriptスターター',
+ 'v-wasm': 'Vスターター',
'vb-wasm': 'VB.NET(Wasm)スターター',
vue: 'Vue スターター',
vue2: 'Vue 2スターター',
diff --git a/src/livecodes/i18n/locales/nl/language-info.lokalise.json b/src/livecodes/i18n/locales/nl/language-info.lokalise.json
index f16a44febd..86e51ff73d 100644
--- a/src/livecodes/i18n/locales/nl/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/nl/language-info.lokalise.json
@@ -930,6 +930,15 @@
"typescript.name": {
"translation": "TypeScript"
},
+ "v-wasm.desc": {
+ "translation": "V-compiler die op WebAssembly draait."
+ },
+ "v-wasm.link": {
+ "translation": " V-website Documentatie over de taal V Leer X in Y minuten, waarbij X = V LiveCodes-documentatie Starterssjabloon laden "
+ },
+ "v-wasm.name": {
+ "translation": "V (Wasm)"
+ },
"vbWasm.desc": {
"translation": "VB.NET-compiler draaiend op WebAssembly, met Roslyn en de .NET WebAssembly-runtime"
},
diff --git a/src/livecodes/i18n/locales/nl/language-info.ts b/src/livecodes/i18n/locales/nl/language-info.ts
index 558fa2d990..67c0c3d2de 100644
--- a/src/livecodes/i18n/locales/nl/language-info.ts
+++ b/src/livecodes/i18n/locales/nl/language-info.ts
@@ -524,6 +524,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1> <2>Officiële website2> 1> <3> <4>TypeScript documentatie4> 3> <5> <6>Leer X in Y minuten, waarbij X=TypeScript6> 5> <7> <8>Startsjabloon laden8> 7>',
name: 'TypeScript',
},
+ 'v-wasm': {
+ desc: 'V-compiler die op WebAssembly draait.',
+ link: '<1> <2>V-website2> 1> <3> <4>Documentatie over de taal V4> 3> <5> <6>Leer X in Y minuten, waarbij X = V6> 5> <7> <8>LiveCodes-documentatie8> 7> <9> <10>Starterssjabloon laden10> 9>',
+ name: 'V (Wasm)',
+ },
vbWasm: {
desc: 'VB.NET-compiler draaiend op WebAssembly, met <1>Roslyn1> en de <2>.NET WebAssembly-runtime2>',
link: '<1> <2>Visual Basic-taaldocumentatie2> 1> <3> <4>Leer X in Y minuten, waarbij X=Visual Basic4> 3> <5> <6>LiveCodes Documentatie6> 5> <7> <8>Startsjabloon laden8> 7>',
diff --git a/src/livecodes/i18n/locales/nl/translation.lokalise.json b/src/livecodes/i18n/locales/nl/translation.lokalise.json
index ef30f62d0f..e8c564c803 100644
--- a/src/livecodes/i18n/locales/nl/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/nl/translation.lokalise.json
@@ -2166,6 +2166,9 @@
"templates.starter.typescript": {
"translation": "TypeScript-starter"
},
+ "templates.starter.v-wasm": {
+ "translation": "V-starter"
+ },
"templates.starter.vb-wasm": {
"translation": "VB.NET (Wasm)-starter"
},
diff --git a/src/livecodes/i18n/locales/nl/translation.ts b/src/livecodes/i18n/locales/nl/translation.ts
index 1a1109093b..b442290053 100644
--- a/src/livecodes/i18n/locales/nl/translation.ts
+++ b/src/livecodes/i18n/locales/nl/translation.ts
@@ -1062,6 +1062,7 @@ const translation: I18nTranslation = {
tcl: 'Tcl-starter',
teal: 'Teal-starter',
typescript: 'TypeScript-starter',
+ 'v-wasm': 'V-starter',
'vb-wasm': 'VB.NET (Wasm)-starter',
vue: 'Vue SFC-starter',
vue2: 'Vue 2-starter',
diff --git a/src/livecodes/i18n/locales/pt/language-info.lokalise.json b/src/livecodes/i18n/locales/pt/language-info.lokalise.json
index ffc35b6ec4..9377f9d23f 100644
--- a/src/livecodes/i18n/locales/pt/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/pt/language-info.lokalise.json
@@ -930,6 +930,15 @@
"typescript.name": {
"translation": "TypeScript"
},
+ "v-wasm.desc": {
+ "translation": "Compilador V a funcionar no WebAssembly."
+ },
+ "v-wasm.link": {
+ "translation": " Site do V Documentação da linguagem V Aprenda X em Y minutos, em que X = V Documentação do LiveCodes Carregar modelo inicial "
+ },
+ "v-wasm.name": {
+ "translation": "V (Wasm)"
+ },
"vbWasm.desc": {
"translation": "Compilador VB.NET executado no WebAssembly, usando Roslyn e o ambiente de execução .NET para WebAssembly"
},
diff --git a/src/livecodes/i18n/locales/pt/language-info.ts b/src/livecodes/i18n/locales/pt/language-info.ts
index 95355064e8..0f98e050d8 100644
--- a/src/livecodes/i18n/locales/pt/language-info.ts
+++ b/src/livecodes/i18n/locales/pt/language-info.ts
@@ -524,6 +524,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1> <2>Site oficial2> 1> <3> <4>Documentação do TypeScript4> 3> <5> <6>Aprenda X em Y minutos, onde X=TypeScript6> 5> <7> <8>Carregar modelo inicial8> 7>',
name: 'TypeScript',
},
+ 'v-wasm': {
+ desc: 'Compilador V a funcionar no WebAssembly.',
+ link: '<1> <2>Site do V2> 1> <3> <4>Documentação da linguagem V4> 3> <5> <6>Aprenda X em Y minutos, em que X = V6> 5> <7> <8>Documentação do LiveCodes8> 7> <9> <10>Carregar modelo inicial10> 9>',
+ name: 'V (Wasm)',
+ },
vbWasm: {
desc: 'Compilador VB.NET executado no WebAssembly, usando <1>Roslyn1> e o <2>ambiente de execução .NET para WebAssembly2>',
link: '<1> <2>Documentação da linguagem Visual Basic2> 1> <3> <4> Aprenda X em Y minutos, onde X=Visual Basic4> 3> <5> <6> Documentação LiveCodes6> 5> <7> <8> Carregar modelo inicial8> 7>',
diff --git a/src/livecodes/i18n/locales/pt/translation.lokalise.json b/src/livecodes/i18n/locales/pt/translation.lokalise.json
index 54a56130a0..daa395e79b 100644
--- a/src/livecodes/i18n/locales/pt/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/pt/translation.lokalise.json
@@ -2166,6 +2166,9 @@
"templates.starter.typescript": {
"translation": "Iniciante TypeScript"
},
+ "templates.starter.v-wasm": {
+ "translation": "Iniciante V"
+ },
"templates.starter.vb-wasm": {
"translation": "Iniciante VB.NET (Wasm)"
},
diff --git a/src/livecodes/i18n/locales/pt/translation.ts b/src/livecodes/i18n/locales/pt/translation.ts
index cc93458c63..b01bfe6f14 100644
--- a/src/livecodes/i18n/locales/pt/translation.ts
+++ b/src/livecodes/i18n/locales/pt/translation.ts
@@ -1062,6 +1062,7 @@ const translation: I18nTranslation = {
tcl: 'Iniciante Tcl',
teal: 'Iniciante Teal',
typescript: 'Iniciante TypeScript',
+ 'v-wasm': 'Iniciante V',
'vb-wasm': 'Iniciante VB.NET (Wasm)',
vue: 'Iniciante Vue',
vue2: 'Iniciante Vue 2',
diff --git a/src/livecodes/i18n/locales/ru/language-info.lokalise.json b/src/livecodes/i18n/locales/ru/language-info.lokalise.json
index a397a84a49..ccfa471ec2 100644
--- a/src/livecodes/i18n/locales/ru/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/ru/language-info.lokalise.json
@@ -930,6 +930,15 @@
"typescript.name": {
"translation": "TypeScript"
},
+ "v-wasm.desc": {
+ "translation": "Компилятор V, работающий на WebAssembly."
+ },
+ "v-wasm.link": {
+ "translation": " Сайт V Документация по языку V Изучите X за Y минут, где X = V Документация LiveCodes Загрузить стартовый шаблон "
+ },
+ "v-wasm.name": {
+ "translation": "V (Wasm)"
+ },
"vbWasm.desc": {
"translation": "Компилятор VB.NET, работающий на WebAssembly, с использованием Roslyn и среды выполнения .NET для WebAssembly"
},
diff --git a/src/livecodes/i18n/locales/ru/language-info.ts b/src/livecodes/i18n/locales/ru/language-info.ts
index 18c1b9f17b..289680a1be 100644
--- a/src/livecodes/i18n/locales/ru/language-info.ts
+++ b/src/livecodes/i18n/locales/ru/language-info.ts
@@ -526,6 +526,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1> <2>Официальный сайт2> 1> <3> <4>Документация TypeScript4> 3> <5> <6>Изучите X за Y минут, где X=TypeScript6> 5> <7> <8>Загрузить стартовый шаблон8> 7>',
name: 'TypeScript',
},
+ 'v-wasm': {
+ desc: 'Компилятор V, работающий на WebAssembly.',
+ link: '<1> <2>Сайт V2> 1> <3> <4>Документация по языку V4> 3> <5> <6>Изучите X за Y минут, где X = V6> 5> <7> <8>Документация LiveCodes8> 7> <9> <10>Загрузить стартовый шаблон10> 9>',
+ name: 'V (Wasm)',
+ },
vbWasm: {
desc: 'Компилятор VB.NET, работающий на WebAssembly, с использованием <1>Roslyn1> и <2>среды выполнения .NET для WebAssembly2>',
link: '<1> <2>Документация по языку Visual Basic2> 1> <3> <4> Узнайте X за Y минут, где X=Visual Basic4> 3> <5> <6> Документация LiveCodes6> 5> <7> <8> Загрузите стартовый шаблон8> 7>',
diff --git a/src/livecodes/i18n/locales/ru/translation.lokalise.json b/src/livecodes/i18n/locales/ru/translation.lokalise.json
index ec8c67ad93..a148d38992 100644
--- a/src/livecodes/i18n/locales/ru/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/ru/translation.lokalise.json
@@ -2166,6 +2166,9 @@
"templates.starter.typescript": {
"translation": "Стартер TypeScript"
},
+ "templates.starter.v-wasm": {
+ "translation": "Стартер V"
+ },
"templates.starter.vb-wasm": {
"translation": "Стартер VB.NET (Wasm)"
},
diff --git a/src/livecodes/i18n/locales/ru/translation.ts b/src/livecodes/i18n/locales/ru/translation.ts
index e9f7029b8e..cebb340fd9 100644
--- a/src/livecodes/i18n/locales/ru/translation.ts
+++ b/src/livecodes/i18n/locales/ru/translation.ts
@@ -1061,6 +1061,7 @@ const translation: I18nTranslation = {
tcl: 'Стартер Tcl',
teal: 'Стартер Teal',
typescript: 'Стартер TypeScript',
+ 'v-wasm': 'Стартер V',
'vb-wasm': 'Стартер VB.NET (Wasm)',
vue: 'Стартер Vue',
vue2: 'Стартер Vue 2',
diff --git a/src/livecodes/i18n/locales/tr/language-info.lokalise.json b/src/livecodes/i18n/locales/tr/language-info.lokalise.json
index 8e1d342fe8..20dde82452 100644
--- a/src/livecodes/i18n/locales/tr/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/tr/language-info.lokalise.json
@@ -930,6 +930,15 @@
"typescript.name": {
"translation": "TypeScript"
},
+ "v-wasm.desc": {
+ "translation": "WebAssembly üzerinde çalışan V derleyicisi."
+ },
+ "v-wasm.link": {
+ "translation": " V web sitesi V dil belgeleri Y dakikada X'i öğrenin, burada X=V LiveCodes Belgeleri Başlangıç şablonunu yükle "
+ },
+ "v-wasm.name": {
+ "translation": "V (Wasm)"
+ },
"vbWasm.desc": {
"translation": "WebAssembly üzerinde çalışan VB.NET derleyicisi, Roslyn ve .NET WebAssembly çalışma zamanı kullanılarak."
},
diff --git a/src/livecodes/i18n/locales/tr/language-info.ts b/src/livecodes/i18n/locales/tr/language-info.ts
index f072ea97e3..8e0ea55a92 100644
--- a/src/livecodes/i18n/locales/tr/language-info.ts
+++ b/src/livecodes/i18n/locales/tr/language-info.ts
@@ -525,6 +525,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1> <2>Resmi web sitesi2> 1> <3> <4>TypeScript dokümantasyonu4> 3> <5> <6>Y Dakikada X Öğrenin, X=TypeScript6> 5> <7> <8>Başlangıç şablonunu yükle8> 7>',
name: 'TypeScript',
},
+ 'v-wasm': {
+ desc: 'WebAssembly üzerinde çalışan V derleyicisi.',
+ link: "<1> <2>V web sitesi2> 1> <3> <4>V dil belgeleri4> 3> <5> <6>Y dakikada X'i öğrenin, burada X=V6> 5> <7> <8>LiveCodes Belgeleri8> 7> <9> <10>Başlangıç şablonunu yükle10> 9>",
+ name: 'V (Wasm)',
+ },
vbWasm: {
desc: 'WebAssembly üzerinde çalışan VB.NET derleyicisi, <1>Roslyn1> ve <2>.NET WebAssembly çalışma zamanı2> kullanılarak.',
link: '<1> <2>Visual Basic dil dokümantasyonu2> 1> <3> <4>Y Dakikada X Öğrenin, X=Visual Basic4> 3> <5> <6>LiveCodes Dokümantasyonu6> 5> <7> <8>Başlangıç şablonunu yükle8> 7>',
diff --git a/src/livecodes/i18n/locales/tr/translation.lokalise.json b/src/livecodes/i18n/locales/tr/translation.lokalise.json
index fef8e96051..3a54800460 100644
--- a/src/livecodes/i18n/locales/tr/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/tr/translation.lokalise.json
@@ -2166,6 +2166,9 @@
"templates.starter.typescript": {
"translation": "TypeScript Başlangıç"
},
+ "templates.starter.v-wasm": {
+ "translation": "V Başlangıç"
+ },
"templates.starter.vb-wasm": {
"translation": "VB.NET (Wasm) Başlangıç"
},
diff --git a/src/livecodes/i18n/locales/tr/translation.ts b/src/livecodes/i18n/locales/tr/translation.ts
index 58e5dfc274..a776643c6a 100644
--- a/src/livecodes/i18n/locales/tr/translation.ts
+++ b/src/livecodes/i18n/locales/tr/translation.ts
@@ -1062,6 +1062,7 @@ const translation: I18nTranslation = {
tcl: 'Tcl Başlangıç',
teal: 'Teal Başlangıç',
typescript: 'TypeScript Başlangıç',
+ 'v-wasm': 'V Başlangıç',
'vb-wasm': 'VB.NET (Wasm) Başlangıç',
vue: 'Vue SFC Başlangıç',
vue2: 'Vue 2 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 8c27972788..d470645ae8 100644
--- a/src/livecodes/i18n/locales/ur/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/ur/language-info.lokalise.json
@@ -930,6 +930,15 @@
"typescript.name": {
"translation": "TypeScript"
},
+ "v-wasm.desc": {
+ "translation": "V کمپائلر WebAssembly پر چل رہا ہے۔"
+ },
+ "v-wasm.link": {
+ "translation": " V ویب سائٹ V زبان کی دستاویزات X=V — V کو چند منٹوں میں سیکھیں LiveCodes دستاویزات اسٹارٹر ٹیمپلیٹ لوڈ کریں "
+ },
+ "v-wasm.name": {
+ "translation": "V (Wasm)"
+ },
"vbWasm.desc": {
"translation": "VB.NET کمپائلر ویب اسمبلی پر چل رہا ہے، Roslyn اور .NET WebAssembly رن ٹائم استعمال کر رہا ہے"
},
diff --git a/src/livecodes/i18n/locales/ur/language-info.ts b/src/livecodes/i18n/locales/ur/language-info.ts
index ee9a1d3e92..bb80a63e0c 100644
--- a/src/livecodes/i18n/locales/ur/language-info.ts
+++ b/src/livecodes/i18n/locales/ur/language-info.ts
@@ -527,6 +527,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1> <2>سرکاری ویب سائٹ2> 1> <3> <4>TypeScript دستاویزات4> 3> <5> <6>X کو Y منٹ میں سیکھیں، جہاں X=TypeScript6> 5> <7> <8>شروعاتی سانچہ لوڈ کریں8> 7>',
name: 'TypeScript',
},
+ 'v-wasm': {
+ desc: 'V کمپائلر WebAssembly پر چل رہا ہے۔',
+ link: '<1> <2>V ویب سائٹ2> 1> <3> <4>V زبان کی دستاویزات4> 3> <5> <6>X=V — V کو چند منٹوں میں سیکھیں6> 5> <7> <8>LiveCodes دستاویزات8> 7> <9> <10>اسٹارٹر ٹیمپلیٹ لوڈ کریں10> 9>',
+ name: 'V (Wasm)',
+ },
vbWasm: {
desc: 'VB.NET کمپائلر ویب اسمبلی پر چل رہا ہے، <1>Roslyn1> اور <2>.NET WebAssembly رن ٹائم2> استعمال کر رہا ہے',
link: '<1> <2> Visual Basic زبان کی دستاویزات 2> 1> <3> <4> Y منٹوں میں X سیکھیں، جہاں X=Visual Basic 4> 3> <5> <6> LiveCodes ڈاکومینٹیشن 6> 5> <7> <8> اسٹارٹر ٹیمپلیٹ لوڈ کریں 8> 7>',
diff --git a/src/livecodes/i18n/locales/ur/translation.lokalise.json b/src/livecodes/i18n/locales/ur/translation.lokalise.json
index c830900131..f367e132bf 100644
--- a/src/livecodes/i18n/locales/ur/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/ur/translation.lokalise.json
@@ -2166,6 +2166,9 @@
"templates.starter.typescript": {
"translation": "ٹائپ اسکرپٹ شروعاتی"
},
+ "templates.starter.v-wasm": {
+ "translation": "V شروعاتی"
+ },
"templates.starter.vb-wasm": {
"translation": "VB.NET (واسم) شروعاتی"
},
diff --git a/src/livecodes/i18n/locales/ur/translation.ts b/src/livecodes/i18n/locales/ur/translation.ts
index 73f962da93..5dd4d3a86b 100644
--- a/src/livecodes/i18n/locales/ur/translation.ts
+++ b/src/livecodes/i18n/locales/ur/translation.ts
@@ -1061,6 +1061,7 @@ const translation: I18nTranslation = {
tcl: 'ٹی سی ایل شروعاتی',
teal: 'ٹیل شروعاتی',
typescript: 'ٹائپ اسکرپٹ شروعاتی',
+ 'v-wasm': 'V شروعاتی',
'vb-wasm': 'VB.NET (واسم) شروعاتی',
vue: 'ویو شروعاتی',
vue2: 'ویو 2 شروعاتی',
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 62e481aa39..16b785d973 100644
--- a/src/livecodes/i18n/locales/zh-CN/language-info.lokalise.json
+++ b/src/livecodes/i18n/locales/zh-CN/language-info.lokalise.json
@@ -930,6 +930,15 @@
"typescript.name": {
"translation": "TypeScript"
},
+ "v-wasm.desc": {
+ "translation": "在 WebAssembly 上运行的 V 编译器。"
+ },
+ "v-wasm.link": {
+ "translation": " V 网站 V 语言文档 Y分钟掌握X,其中X=V LiveCodes 文档 加载入门模板 "
+ },
+ "v-wasm.name": {
+ "translation": "V (Wasm)"
+ },
"vbWasm.desc": {
"translation": "在 WebAssembly 上运行的 VB.NET 编译器,使用 Roslyn 和 .NET WebAssembly 运行时"
},
diff --git a/src/livecodes/i18n/locales/zh-CN/language-info.ts b/src/livecodes/i18n/locales/zh-CN/language-info.ts
index 31c50ef7c9..964c178103 100644
--- a/src/livecodes/i18n/locales/zh-CN/language-info.ts
+++ b/src/livecodes/i18n/locales/zh-CN/language-info.ts
@@ -518,6 +518,11 @@ const languageInfo: I18nLangInfoTranslation = {
link: '<1> <2>官方网站2> 1> <3> <4>TypeScript 文档4> 3> <5> <6>在 Y 分钟内学习 X,其中 X=TypeScript6> 5> <7> <8>加载启动模板8> 7>',
name: 'TypeScript',
},
+ 'v-wasm': {
+ desc: '在 WebAssembly 上运行的 V 编译器。',
+ link: '<1> <2>V 网站2> 1> <3> <4>V 语言文档4> 3> <5> <6>Y分钟掌握X,其中X=V6> 5> <7> <8>LiveCodes 文档8> 7> <9> <10>加载入门模板10> 9>',
+ name: 'V (Wasm)',
+ },
vbWasm: {
desc: '在 WebAssembly 上运行的 VB.NET 编译器,使用 <1>Roslyn1> 和 <2>.NET WebAssembly 运行时2>',
link: '<1> <2> Visual Basic 语言文档2> 1> <3> <4>在 Y 分钟内学习 X,其中 X=Visual Basic 4> 3> <5> <6> LiveCodes 文档6> 5> <7> <8>加载入门模板8> 7>',
diff --git a/src/livecodes/i18n/locales/zh-CN/translation.lokalise.json b/src/livecodes/i18n/locales/zh-CN/translation.lokalise.json
index fcd92ab6a4..9cac7be2c7 100644
--- a/src/livecodes/i18n/locales/zh-CN/translation.lokalise.json
+++ b/src/livecodes/i18n/locales/zh-CN/translation.lokalise.json
@@ -2166,6 +2166,9 @@
"templates.starter.typescript": {
"translation": "TypeScript 启动模板"
},
+ "templates.starter.v-wasm": {
+ "translation": "V 启动模板"
+ },
"templates.starter.vb-wasm": {
"translation": "VB.NET(WASM)启动模板"
},
diff --git a/src/livecodes/i18n/locales/zh-CN/translation.ts b/src/livecodes/i18n/locales/zh-CN/translation.ts
index 6e6646cbf2..234934ca20 100644
--- a/src/livecodes/i18n/locales/zh-CN/translation.ts
+++ b/src/livecodes/i18n/locales/zh-CN/translation.ts
@@ -1059,6 +1059,7 @@ const translation: I18nTranslation = {
tcl: 'Tcl 启动模板',
teal: 'Teal 启动模板',
typescript: 'TypeScript 启动模板',
+ 'v-wasm': 'V 启动模板',
'vb-wasm': 'VB.NET(WASM)启动模板',
vue: 'Vue 单文件组件启动模板',
vue2: 'Vue 2 启动模板',
diff --git a/src/livecodes/languages/assembly-wasm/lang-assembly-wasm-script.ts b/src/livecodes/languages/assembly-wasm/lang-assembly-wasm-script.ts
index b2b031da86..a01b634c8c 100644
--- a/src/livecodes/languages/assembly-wasm/lang-assembly-wasm-script.ts
+++ b/src/livecodes/languages/assembly-wasm/lang-assembly-wasm-script.ts
@@ -1,11 +1,11 @@
/* eslint-disable no-console */
-import { getErrorMessage } from '../../utils/utils';
import {
assemblyWasmBaseUrl,
keystoneJsUrl,
keystoneJsWasmUrl,
unicornJsX86Url,
} from '../../vendors';
+import { runCompiler } from '../wasm-runtime';
import { createWorkerRunner, type Runner } from '../worker-runner';
// x86-64 assembly is assembled and executed by @live-codes/assembly-wasm, which loads
@@ -190,24 +190,7 @@ assemblyWasm.run = async (input?: string) => {
const runner = (assemblyWasm.runner =
assemblyWasm.runner || createWorkerRunner({ getWorkerSrc, label: 'Assembly' }));
- try {
- await ensureLoaded(runner);
- } catch (error) {
- return setResult(stdin, null, `Error: ${getErrorMessage(error)}`, 1);
- }
-
- try {
- const result = await runner.run(code, stdin);
- // `errors` holds the assembler's diagnostics and any runtime fault, and is empty
- // when the program assembled and exited cleanly.
- const errors = (result.errors || []).filter(Boolean);
- if (errors.length) {
- return setResult(stdin, null, errors.join('\n'), result.exitCode ?? 1);
- }
- return setResult(stdin, result.output ?? '', null, result.exitCode ?? 0);
- } catch (error) {
- return setResult(stdin, null, `Error: ${getErrorMessage(error)}`, 1);
- }
+ return runCompiler(runner, ensureLoaded, code, stdin, setResult);
};
// Alias, so both `livecodes.assemblyWasm` and `livecodes.asm` are available in markup.
diff --git a/src/livecodes/languages/clang-wasm/lang-clang-wasm-script.ts b/src/livecodes/languages/clang-wasm/lang-clang-wasm-script.ts
index 6d53ab349b..47177e7103 100644
--- a/src/livecodes/languages/clang-wasm/lang-clang-wasm-script.ts
+++ b/src/livecodes/languages/clang-wasm/lang-clang-wasm-script.ts
@@ -1,6 +1,6 @@
/* eslint-disable no-console */
-import { getErrorMessage } from '../../utils/utils';
import { clangWasmBaseUrl } from '../../vendors';
+import { runCompiler } from '../wasm-runtime';
import { createWorkerRunner, type Runner } from '../worker-runner';
// One runner serves all four Clang languages. The language is read from the script tags the
@@ -197,23 +197,7 @@ clangWasm.run = async (input?: string) => {
clangWasm.runners[language] ||
createWorkerRunner({ getWorkerSrc: () => getWorkerSrc(language), label: 'Clang' }));
- try {
- await ensureLoaded(runner);
- } catch (error) {
- return setResult(stdin, null, `Error: ${getErrorMessage(error)}`, 1);
- }
-
- try {
- const result = await runner.run(code, stdin, getSettings(language));
- // `errors` holds the compiler's diagnostics and is empty when the program compiled.
- const errors = (result.errors || []).filter(Boolean);
- if (errors.length) {
- return setResult(stdin, null, errors.join('\n'), result.exitCode ?? 1);
- }
- return setResult(stdin, result.output ?? '', null, result.exitCode ?? 0);
- } catch (error) {
- return setResult(stdin, null, `Error: ${getErrorMessage(error)}`, 1);
- }
+ return runCompiler(runner, ensureLoaded, code, stdin, setResult, getSettings(language));
};
// One alias per language, plus `cpp` for playgrounds written before the languages were split.
diff --git a/src/livecodes/languages/cobol-wasm/lang-cobol-wasm-script.ts b/src/livecodes/languages/cobol-wasm/lang-cobol-wasm-script.ts
index 720c6d53e7..549284e28a 100644
--- a/src/livecodes/languages/cobol-wasm/lang-cobol-wasm-script.ts
+++ b/src/livecodes/languages/cobol-wasm/lang-cobol-wasm-script.ts
@@ -1,6 +1,6 @@
/* eslint-disable no-console */
-import { getErrorMessage } from '../../utils/utils';
-import { cobolWasmBaseUrl, cobolWasmClangBaseUrl } from '../../vendors';
+import { clangWasmBaseUrl, cobolWasmBaseUrl } from '../../vendors';
+import { createLoadingReporter, runCompiler } from '../wasm-runtime';
import { createWorkerRunner, type Runner } from '../worker-runner';
// One runner for one language. GnuCOBOL is the real compiler (@live-codes/cobol-wasm), loaded from
@@ -54,7 +54,7 @@ const getCompiler = () => {
self.cobolWasm.createCompiler({
baseUrl: ${JSON.stringify(cobolWasmBaseUrl + 'assets/')},
// The Clang half is pinned by the package, so it comes from that exact version's assets.
- clangBaseUrl: ${JSON.stringify(cobolWasmClangBaseUrl)},
+ clangBaseUrl: ${JSON.stringify(clangWasmBaseUrl + 'assets/')},
});
return compiler;
};
@@ -133,25 +133,8 @@ cobolWasm.failed = false;
// ~25 MiB toolchain is not downloaded again, instead of spawning a new one.
cobolWasm.runner ??= null;
-// The result runs in an iframe; post status updates to the app origin. Mirrors
-// the other WASM language scripts (`fanak`, `haskell-wasm`).
-const parentOrigin =
- window.parent === window
- ? window.location.origin
- : window.location.ancestorOrigins?.[0] ||
- (() => {
- if (!document.referrer) return '*';
- try {
- return new URL(document.referrer).origin;
- } catch {
- // Ignore malformed referrers and use the wildcard fallback below.
- return '*';
- }
- })();
-
-const postLoading = (payload: boolean) => {
- parent.postMessage({ type: 'loading', payload }, parentOrigin); // NOSONAR - fallback is safe with source/origin checks in the parent.
-};
+// The result runs in an iframe; post status updates to the app origin.
+const postLoading = createLoadingReporter();
/** Start (once) downloading the compiler, showing the loading indicator while it happens. */
const ensureLoaded = (runner: Runner): Promise => {
@@ -206,23 +189,7 @@ cobolWasm.run = async (input?: string) => {
cobolWasm.runner ||
createWorkerRunner({ getWorkerSrc, label: 'COBOL', timeoutMs: RUN_TIMEOUT_MS }));
- try {
- await ensureLoaded(runner);
- } catch (error) {
- return setResult(stdin, null, `Error: ${getErrorMessage(error)}`, 1);
- }
-
- try {
- const result = await runner.run(code, stdin, cobolWasm.settings);
- // `errors` holds the compiler's diagnostics and is empty when the program ran.
- const errors = (result.errors || []).filter(Boolean);
- if (errors.length) {
- return setResult(stdin, null, errors.join('\n'), result.exitCode ?? 1);
- }
- return setResult(stdin, result.output ?? '', null, result.exitCode ?? 0);
- } catch (error) {
- return setResult(stdin, null, `Error: ${getErrorMessage(error)}`, 1);
- }
+ return runCompiler(runner, ensureLoaded, code, stdin, setResult, cobolWasm.settings);
};
// Aliases so both `livecodes.cobol` and `livecodes.cobolWasm` are available.
diff --git a/src/livecodes/languages/fanak/lang-fanak-script.ts b/src/livecodes/languages/fanak/lang-fanak-script.ts
index 72816c348d..b6635133e1 100644
--- a/src/livecodes/languages/fanak/lang-fanak-script.ts
+++ b/src/livecodes/languages/fanak/lang-fanak-script.ts
@@ -1,5 +1,6 @@
import { getErrorMessage } from '../../utils';
import { fanakBaseUrl } from '../../vendors';
+import { getParentOrigin } from '../wasm-runtime';
declare const livecodes: any;
@@ -24,21 +25,8 @@ const waitFor = async (condition: () => boolean | Promise, timeout = 60
return true;
};
-// The result runs in an iframe; post status updates to the app origin. Mirrors
-// the other WASM language scripts (`haskell-wasm`).
-const parentOrigin =
- window.parent === window
- ? window.location.origin
- : window.location.ancestorOrigins?.[0] ||
- (() => {
- if (!document.referrer) return '*';
- try {
- return new URL(document.referrer).origin;
- } catch {
- // Ignore malformed referrers and use the wildcard fallback below.
- return '*';
- }
- })();
+// The result runs in an iframe; post status updates to the app origin.
+const parentOrigin = getParentOrigin();
let activeRuns = 0;
const postLoading = (payload: boolean) => {
diff --git a/src/livecodes/languages/fortran-wasm/lang-fortran-wasm-script.ts b/src/livecodes/languages/fortran-wasm/lang-fortran-wasm-script.ts
index 5ba0b8e61c..2c237702aa 100644
--- a/src/livecodes/languages/fortran-wasm/lang-fortran-wasm-script.ts
+++ b/src/livecodes/languages/fortran-wasm/lang-fortran-wasm-script.ts
@@ -1,6 +1,6 @@
/* eslint-disable no-console */
-import { getErrorMessage } from '../../utils/utils';
import { fortranWasmBaseUrl } from '../../vendors';
+import { runCompiler } from '../wasm-runtime';
import { createWorkerRunner, type Runner } from '../worker-runner';
// One runner for one language. The compiler itself is @live-codes/lfortran-wasm, loaded from its
@@ -166,23 +166,7 @@ fortranWasm.run = async (input?: string) => {
fortranWasm.runner ||
createWorkerRunner({ getWorkerSrc, label: 'Fortran', timeoutMs: RUN_TIMEOUT_MS }));
- try {
- await ensureLoaded(runner);
- } catch (error) {
- return setResult(stdin, null, `Error: ${getErrorMessage(error)}`, 1);
- }
-
- try {
- const result = await runner.run(code, stdin);
- // `errors` holds the compiler's diagnostics and is empty when the program ran.
- const errors = (result.errors || []).filter(Boolean);
- if (errors.length) {
- return setResult(stdin, null, errors.join('\n'), result.exitCode ?? 1);
- }
- return setResult(stdin, result.output ?? '', null, result.exitCode ?? 0);
- } catch (error) {
- return setResult(stdin, null, `Error: ${getErrorMessage(error)}`, 1);
- }
+ return runCompiler(runner, ensureLoaded, code, stdin, setResult);
};
window.livecodes.fortran = fortranWasm;
diff --git a/src/livecodes/languages/haskell-wasm/lang-haskell-wasm-script.ts b/src/livecodes/languages/haskell-wasm/lang-haskell-wasm-script.ts
index 4bf5f38bab..e4a6f10ee3 100644
--- a/src/livecodes/languages/haskell-wasm/lang-haskell-wasm-script.ts
+++ b/src/livecodes/languages/haskell-wasm/lang-haskell-wasm-script.ts
@@ -1,5 +1,6 @@
import { getErrorMessage } from '../../utils/utils';
import { ghcBrowserBaseUrl, haskellWasiShimUrl } from '../../vendors';
+import { getParentOrigin } from '../wasm-runtime';
// @ts-ignore
// eslint-disable-next-line import/no-unresolved
import workerContent from './lang-haskell-wasm-worker.raw.js?raw';
@@ -135,19 +136,7 @@ const createRunner = (createWorker: () => Worker) => {
return { init, run };
};
-const parentOrigin =
- window.parent === window
- ? window.location.origin
- : window.location.ancestorOrigins?.[0] ||
- (() => {
- if (!document.referrer) return '*';
- try {
- return new URL(document.referrer).origin;
- } catch {
- // Ignore malformed referrers and use the wildcard fallback below.
- return '*';
- }
- })();
+const parentOrigin = getParentOrigin();
window.livecodes.haskellWasm ??= {};
const haskellWasm = window.livecodes.haskellWasm;
diff --git a/src/livecodes/languages/languages.ts b/src/livecodes/languages/languages.ts
index 6e0423b0a4..bce826559c 100644
--- a/src/livecodes/languages/languages.ts
+++ b/src/livecodes/languages/languages.ts
@@ -92,6 +92,7 @@ import { tcl } from './tcl';
import { teal } from './teal';
import { twig } from './twig';
import { typescript } from './typescript';
+import { vWasm } from './v-wasm';
import { vbWasm } from './vb-wasm';
import { vento } from './vento';
import { vue, vueApp } from './vue';
@@ -181,6 +182,7 @@ export const languages: LanguageSpecs[] = [
java,
csharpWasm,
blazorWasm,
+ vWasm,
vbWasm,
fsharp,
fsharpWasm,
diff --git a/src/livecodes/languages/v-wasm/__tests__/lang-v-wasm.spec.ts b/src/livecodes/languages/v-wasm/__tests__/lang-v-wasm.spec.ts
new file mode 100644
index 0000000000..ec6348854e
--- /dev/null
+++ b/src/livecodes/languages/v-wasm/__tests__/lang-v-wasm.spec.ts
@@ -0,0 +1,32 @@
+import { vWasm } from '../lang-v-wasm';
+
+describe('V (Wasm) language spec', () => {
+ test('is registered as v-wasm, with the wasm compiler script', () => {
+ expect(vWasm.name).toBe('v-wasm');
+ expect(vWasm.title).toBe('V (Wasm)');
+ expect(vWasm.compiler).toMatchObject({
+ scriptType: 'text/v-wasm',
+ compiledCodeLanguage: 'v',
+ liveReload: true,
+ });
+ });
+
+ test('accepts the common V extensions', () => {
+ expect(vWasm.extensions).toEqual(
+ expect.arrayContaining(['v', 'vlang', 'v-wasm', 'wasm.v', 'vsh']),
+ );
+ });
+
+ test('warns that the first run is a large download', () => {
+ // The V compiler and the Clang toolchain together are tens of megabytes.
+ expect(vWasm.largeDownload).toBe(true);
+ });
+
+ test('uses a code editor with V support', () => {
+ expect(vWasm.editor).toBe('script');
+ // Monaco ships a V mode; CodeMirror has none, so the Go mode stands in there.
+ expect(vWasm.editorSupport?.monaco?.language).toBe('v');
+ // Prism does ship a V grammar, so CodeJar uses the real one.
+ expect(vWasm.editorSupport?.codejar?.language).toBe('v');
+ });
+});
diff --git a/src/livecodes/languages/v-wasm/index.ts b/src/livecodes/languages/v-wasm/index.ts
new file mode 100644
index 0000000000..33584b8e7c
--- /dev/null
+++ b/src/livecodes/languages/v-wasm/index.ts
@@ -0,0 +1 @@
+export * from './lang-v-wasm';
diff --git a/src/livecodes/languages/v-wasm/lang-v-wasm-script.ts b/src/livecodes/languages/v-wasm/lang-v-wasm-script.ts
new file mode 100644
index 0000000000..26dc50fec7
--- /dev/null
+++ b/src/livecodes/languages/v-wasm/lang-v-wasm-script.ts
@@ -0,0 +1,195 @@
+/* eslint-disable no-console */
+import { clangWasmBaseUrl, vWasmBaseUrl } from '../../vendors';
+import { createLoadingReporter, runCompiler } from '../wasm-runtime';
+import { createWorkerRunner, type Runner } from '../worker-runner';
+
+// One runner for one language. The compiler is @live-codes/v-wasm, loaded from its CDN build: the
+// IIFE defines `self.vWasm`, which the worker reaches with importScripts. It compiles V to C and
+// hands that to the same Clang toolchain the C/C++ languages use, then runs the linked module in
+// place, because a browser has no linker subprocess to hand a binary to.
+//
+// The V compiler is a classic Emscripten bundle: it decides it is in a worker by finding
+// `importScripts`, so it has to run in a classic worker (the one createWorkerFromContent builds).
+const SCRIPT_TYPE = 'text/v-wasm';
+
+interface RunResult {
+ input: string;
+ output: string | null;
+ error: string | null;
+ exitCode: number | null;
+}
+
+interface VWasmApi {
+ ready: boolean;
+ failed: boolean;
+ input: string;
+ output: string | null;
+ error: string | null;
+ exitCode: number | null;
+ loaded: Promise;
+ init: Promise | null;
+ runner: Runner | null;
+ run: (input?: string) => Promise;
+}
+
+declare const window: Window & {
+ livecodes: Record;
+};
+
+const getWorkerSrc = () => `
+importScripts(${JSON.stringify(vWasmBaseUrl + 'dist/v-wasm.global.js')});
+
+let compiler = null;
+
+const getCompiler = () => {
+ compiler =
+ compiler ||
+ self.vWasm.createCompiler({
+ baseUrl: ${JSON.stringify(vWasmBaseUrl + 'assets/v/')},
+ // The Clang half is pinned by the package, so it comes from that exact version's assets.
+ clangBaseUrl: ${JSON.stringify(clangWasmBaseUrl + 'assets/')},
+ });
+ return compiler;
+};
+
+addEventListener('message', async (event) => {
+ const { id, code, input } = event.data;
+ try {
+ const result = await (await getCompiler()).run(code, input);
+ postMessage({
+ id,
+ result: {
+ output: result.output,
+ // The package reports V's, clang's and the linker's diagnostics as a list of lines, empty
+ // when the program built and ran.
+ errors: result.errors || [],
+ exitCode: result.exitCode,
+ },
+ });
+ } catch (error) {
+ postMessage({ id, error: String((error && error.message) || error) });
+ }
+});
+
+getCompiler().then(
+ () => postMessage({ type: 'ready' }),
+ (error) => postMessage({ type: 'error', message: String((error && error.message) || error) }),
+);
+`;
+
+// A single compile + run is normally quick; a long timeout guards against hangs (e.g. an infinite
+// loop in the user program) by killing and respawning the worker.
+const RUN_TIMEOUT_MS = 120000;
+
+/**
+ * Reads the program out of the result page.
+ *
+ * The result page writes the code inline as the `innerHTML` of a
+ * `
+`.trimStart(),
+ },
+ style: {
+ language: 'css',
+ content: `
+.container,
+.container button {
+ text-align: center;
+ font: 1em sans-serif;
+}
+.logo {
+ width: 150px;
+}
+`.trimStart(),
+ },
+ script: {
+ language: 'v-wasm',
+ content: `
+import os
+
+fn main() {
+ count := os.input('').int()
+ println('V')
+ println(count + 1)
+}
+`.trimStart(),
+ },
+};
diff --git a/src/livecodes/vendors.ts b/src/livecodes/vendors.ts
index d2badfe390..18e1005509 100644
--- a/src/livecodes/vendors.ts
+++ b/src/livecodes/vendors.ts
@@ -62,7 +62,7 @@ export const cherryCljsBaseUrl = /* @__PURE__ */ getUrl('cherry-cljs@0.6.38/');
export const cjs2esUrl = /* @__PURE__ */ getUrl('cjs2es@1.1.1/dist/cjs2es.browser.js');
-export const clangWasmBaseUrl = /* @__PURE__ */ getUrl('@live-codes/clang-wasm@0.2.0/');
+export const clangWasmBaseUrl = /* @__PURE__ */ getUrl('@live-codes/clang-wasm@0.3.0/');
export const clioBaseUrl = /* @__PURE__ */ getUrl(
'@live-codes/clio-browser-compiler@0.0.3/public/build/',
@@ -104,10 +104,6 @@ export const cm6ThemeSolarizedDarkUrl = /* @__PURE__ */ getUrl(
export const cobolWasmBaseUrl = /* @__PURE__ */ getUrl('@live-codes/cobol-wasm@0.1.0/');
-// `@live-codes/cobol-wasm` pins this exact `@live-codes/clang-wasm` version for the Clang half of its
-// toolchain, and the runtime re-derives those assets' digests, so the two must stay in step.
-export const cobolWasmClangBaseUrl = /* @__PURE__ */ getUrl('@live-codes/clang-wasm@0.3.0/assets/');
-
export const codeiumProviderUrl = /* @__PURE__ */ getUrl(
'@live-codes/monaco-codeium-provider@0.2.2/dist/index.js',
);
@@ -539,6 +535,8 @@ export const unicornJsX86Url = /* @__PURE__ */ getUrl(
export const uniterUrl = /* @__PURE__ */ getUrl('uniter@2.18.0/dist/uniter.js');
+export const vWasmBaseUrl = /* @__PURE__ */ getUrl('@live-codes/v-wasm@0.1.0/');
+
export const vbWasmBaseUrl = /* @__PURE__ */ getUrl('@live-codes/vb-wasm@0.1.1/');
export const vegaCdnUrl = /* @__PURE__ */ getUrl('vega@5.25.0/build/vega.js');
diff --git a/src/sdk/models.ts b/src/sdk/models.ts
index b1dc2a4692..e1c41d24e1 100644
--- a/src/sdk/models.ts
+++ b/src/sdk/models.ts
@@ -197,6 +197,11 @@ export type Language =
| 'dlang'
| 'dmd'
| 'd-wasm'
+ | 'v'
+ | 'vlang'
+ | 'v-wasm'
+ | 'wasm.v'
+ | 'vsh'
| 'cpp-wasm'
| 'cppwasm'
| 'wasm.cpp'
@@ -498,6 +503,7 @@ export type TemplateName =
| 'fortran-wasm'
| 'd-wasm'
| 'cobol-wasm'
+ | 'v-wasm'
| 'java'
| 'csharp-wasm'
| 'blazor-wasm'
@@ -925,6 +931,7 @@ export type CustomSettings = Partial<
| 'text/minizinc'
| 'text/go-wasm'
| 'text/zig-wasm'
+ | 'text/v-wasm'
| 'application/json'
| 'application/lua'
| 'text/fennel'
diff --git a/storybook/_stories/EmbedOptions/template.ts b/storybook/_stories/EmbedOptions/template.ts
index 39ab1ecc63..199c3c74c2 100644
--- a/storybook/_stories/EmbedOptions/template.ts
+++ b/storybook/_stories/EmbedOptions/template.ts
@@ -54,6 +54,7 @@ const storyDef: StoryDef = {
DWasm: { props: { template: 'd-wasm' } },
CobolWasm: { props: { template: 'cobol-wasm' }, storyName: 'COBOL (Wasm)' },
FortranWasm: { props: { template: 'fortran-wasm' }, storyName: 'Fortran (Wasm)' },
+ VWasm: { props: { template: 'v-wasm' } },
RustWasm: { props: { template: 'rust-wasm' } },
SwiftWasm: { props: { template: 'swift-wasm' } },
ZigWasm: { props: { template: 'zig-wasm' } },
diff --git a/storybook/preact/stories/EmbedOptions/template.stories.ts b/storybook/preact/stories/EmbedOptions/template.stories.ts
index 9425051cdd..51eecb58d4 100644
--- a/storybook/preact/stories/EmbedOptions/template.stories.ts
+++ b/storybook/preact/stories/EmbedOptions/template.stories.ts
@@ -67,6 +67,7 @@ export const CppWasm = livecodesStory({ template: 'cpp-wasm' });
export const ObjcWasm = livecodesStory({ template: 'objc-wasm' });
export const FortranWasm = livecodesStory({ template: 'fortran-wasm' });
export const DWasm = livecodesStory({ template: 'd-wasm' });
+export const VWasm = livecodesStory({ template: 'v-wasm' });
export const RustWasm = livecodesStory({ template: 'rust-wasm' });
export const SwiftWasm = livecodesStory({ template: 'swift-wasm' });
export const ZigWasm = livecodesStory({ template: 'zig-wasm' });
diff --git a/storybook/react/stories/EmbedOptions/template.stories.ts b/storybook/react/stories/EmbedOptions/template.stories.ts
index 9425051cdd..51eecb58d4 100644
--- a/storybook/react/stories/EmbedOptions/template.stories.ts
+++ b/storybook/react/stories/EmbedOptions/template.stories.ts
@@ -67,6 +67,7 @@ export const CppWasm = livecodesStory({ template: 'cpp-wasm' });
export const ObjcWasm = livecodesStory({ template: 'objc-wasm' });
export const FortranWasm = livecodesStory({ template: 'fortran-wasm' });
export const DWasm = livecodesStory({ template: 'd-wasm' });
+export const VWasm = livecodesStory({ template: 'v-wasm' });
export const RustWasm = livecodesStory({ template: 'rust-wasm' });
export const SwiftWasm = livecodesStory({ template: 'swift-wasm' });
export const ZigWasm = livecodesStory({ template: 'zig-wasm' });
diff --git a/storybook/solid/stories/EmbedOptions/template.stories.ts b/storybook/solid/stories/EmbedOptions/template.stories.ts
index 9425051cdd..51eecb58d4 100644
--- a/storybook/solid/stories/EmbedOptions/template.stories.ts
+++ b/storybook/solid/stories/EmbedOptions/template.stories.ts
@@ -67,6 +67,7 @@ export const CppWasm = livecodesStory({ template: 'cpp-wasm' });
export const ObjcWasm = livecodesStory({ template: 'objc-wasm' });
export const FortranWasm = livecodesStory({ template: 'fortran-wasm' });
export const DWasm = livecodesStory({ template: 'd-wasm' });
+export const VWasm = livecodesStory({ template: 'v-wasm' });
export const RustWasm = livecodesStory({ template: 'rust-wasm' });
export const SwiftWasm = livecodesStory({ template: 'swift-wasm' });
export const ZigWasm = livecodesStory({ template: 'zig-wasm' });
diff --git a/storybook/svelte/stories/EmbedOptions/template.stories.ts b/storybook/svelte/stories/EmbedOptions/template.stories.ts
index 9425051cdd..51eecb58d4 100644
--- a/storybook/svelte/stories/EmbedOptions/template.stories.ts
+++ b/storybook/svelte/stories/EmbedOptions/template.stories.ts
@@ -67,6 +67,7 @@ export const CppWasm = livecodesStory({ template: 'cpp-wasm' });
export const ObjcWasm = livecodesStory({ template: 'objc-wasm' });
export const FortranWasm = livecodesStory({ template: 'fortran-wasm' });
export const DWasm = livecodesStory({ template: 'd-wasm' });
+export const VWasm = livecodesStory({ template: 'v-wasm' });
export const RustWasm = livecodesStory({ template: 'rust-wasm' });
export const SwiftWasm = livecodesStory({ template: 'swift-wasm' });
export const ZigWasm = livecodesStory({ template: 'zig-wasm' });
diff --git a/storybook/vue/stories/EmbedOptions/template.stories.ts b/storybook/vue/stories/EmbedOptions/template.stories.ts
index 9425051cdd..51eecb58d4 100644
--- a/storybook/vue/stories/EmbedOptions/template.stories.ts
+++ b/storybook/vue/stories/EmbedOptions/template.stories.ts
@@ -67,6 +67,7 @@ export const CppWasm = livecodesStory({ template: 'cpp-wasm' });
export const ObjcWasm = livecodesStory({ template: 'objc-wasm' });
export const FortranWasm = livecodesStory({ template: 'fortran-wasm' });
export const DWasm = livecodesStory({ template: 'd-wasm' });
+export const VWasm = livecodesStory({ template: 'v-wasm' });
export const RustWasm = livecodesStory({ template: 'rust-wasm' });
export const SwiftWasm = livecodesStory({ template: 'swift-wasm' });
export const ZigWasm = livecodesStory({ template: 'zig-wasm' });
diff --git a/storybook/web-components/stories/EmbedOptions/template.stories.ts b/storybook/web-components/stories/EmbedOptions/template.stories.ts
index 9425051cdd..51eecb58d4 100644
--- a/storybook/web-components/stories/EmbedOptions/template.stories.ts
+++ b/storybook/web-components/stories/EmbedOptions/template.stories.ts
@@ -67,6 +67,7 @@ export const CppWasm = livecodesStory({ template: 'cpp-wasm' });
export const ObjcWasm = livecodesStory({ template: 'objc-wasm' });
export const FortranWasm = livecodesStory({ template: 'fortran-wasm' });
export const DWasm = livecodesStory({ template: 'd-wasm' });
+export const VWasm = livecodesStory({ template: 'v-wasm' });
export const RustWasm = livecodesStory({ template: 'rust-wasm' });
export const SwiftWasm = livecodesStory({ template: 'swift-wasm' });
export const ZigWasm = livecodesStory({ template: 'zig-wasm' });
diff --git a/vendor-licenses.md b/vendor-licenses.md
index 6c1d2e0339..0af0caf3bf 100644
--- a/vendor-licenses.md
+++ b/vendor-licenses.md
@@ -356,6 +356,10 @@ GnuCOBOL (Wasm): [GPL-3.0-or-later License](https://github.com/OCamlPro/gnucobol
LFortran (Wasm): [BSD 3-Clause License](https://github.com/lfortran/lfortran/blob/main/LICENSE)
+@live-codes/v-wasm: [MIT License](https://github.com/live-codes/browser-v/blob/main/LICENSE)
+
+V (Wasm): [MIT License](https://github.com/vlang/v/blob/master/LICENSE) (the V compiler and its standard library, compiled to WebAssembly by @live-codes/v-wasm; the Clang toolchain it links through is covered by LLVM / LLD below)
+
LLVM / LLD (Wasm): [Apache License 2.0 with LLVM-exception](https://github.com/llvm/llvm-project/blob/main/LICENSE.TXT)
@wasm-fmt/clang-format: [MIT License](https://github.com/wasm-fmt/clang-format/blob/6a84f2d980e5ff4145bd9178a49cd5146e48df78/LICENSE)