diff options
| author | Leitwolf11 | 2026-10-03 01:43:43 +0300 |
|---|---|---|
| committer | Leitwolf11 | 2026-10-03 01:43:43 +0300 |
| commit | f25c01f1d173b9e206565207472b58ca51f90803 (patch) | |
| tree | c4244396690eb895815b89802a8c5cb7261f47a9 | |
| parent | 1045265e9ae018cb3d2d94a47d780888c26d04a2 (diff) | |
| download | website-feature/russian-locale.tar.gz | |
Add Russian to the language site and the forum placeholderfeature/russian-locale
Russian (ru-RU) is the third locale of the language site: the shell, the
home, overview and getting-started pages, and the page metadata are fully
translated, and the language menu offers it. The documentation sidebar reads
its labels from the page messages instead of a two-way locale test, and the
stored preference is accepted only when it names a supported locale.
The forum placeholder gets the same three languages. Its language control
is now a menu instead of a two-state button, and an unknown stored or
selected value keeps the current language.
The site API lists the new locale. Verified locally: prettier, the frontend
tests, vue-tsc and the Vite build, the backend tests, and a browser run of
the home and overview pages in Russian.
| -rw-r--r-- | Documents/CONTENT.md | 12 | ||||
| -rw-r--r-- | README.md | 2 | ||||
| -rw-r--r-- | backend/src/main/kotlin/com/progmasoft/visual/xsharp/website/SiteController.kt | 2 | ||||
| -rw-r--r-- | backend/src/test/kotlin/com/progmasoft/visual/xsharp/website/SiteControllerTest.kt | 2 | ||||
| -rw-r--r-- | forum/index.html | 6 | ||||
| -rw-r--r-- | forum/site.css | 10 | ||||
| -rw-r--r-- | forum/site.js | 34 | ||||
| -rw-r--r-- | frontend/src/App.vue | 12 | ||||
| -rw-r--r-- | frontend/src/pages/GettingStartedPage.vue | 71 | ||||
| -rw-r--r-- | frontend/src/pages/HomePage.vue | 62 | ||||
| -rw-r--r-- | frontend/src/pages/OverviewPage.vue | 127 | ||||
| -rw-r--r-- | frontend/src/preferences.ts | 6 | ||||
| -rw-r--r-- | frontend/src/seo.ts | 17 | ||||
| -rw-r--r-- | frontend/tests/forum.test.mjs | 39 | ||||
| -rw-r--r-- | frontend/tests/seo.test.mjs | 16 |
15 files changed, 375 insertions, 43 deletions
diff --git a/Documents/CONTENT.md b/Documents/CONTENT.md index 05d5eb8..d9d43bb 100644 --- a/Documents/CONTENT.md +++ b/Documents/CONTENT.md @@ -94,20 +94,20 @@ management flow to link from this guide. The placeholder may say the forum will come later, once the community is ready. It must not imply that an account can be created now or that discussion posts are stored elsewhere. Its default is English and dark, -with German and light options for consistency. Its noindex status applies +with German, Russian and light options for consistency. Its noindex status applies both in HTML and at the server boundary. ## Translation rules -`en-US` is the default and must carry complete content. `de-DE` should -express the same meaning, not mechanically mirror sentence length. Keep +`en-US` is the default and must carry complete content. `de-DE` and `ru-RU` +should express the same meaning, not mechanically mirror sentence length. Keep technical spellings such as `Visual.XSharp.kts`, `CorePrep`, `Xpp`, and `Xmm` stable. Translate navigation labels, help text, figure descriptions, -and accessible names. When adding a paragraph or an interaction, add both -languages in the same change so a locale switch never leaves mixed copy. +and accessible names. When adding a paragraph or an interaction, add every +language in the same change so a locale switch never leaves mixed copy. The URL is shared between language preferences. Do not emit inaccurate -`hreflang` alternatives implying separate German URLs. The document `lang` +`hreflang` alternatives implying separate German or Russian URLs. The document `lang` attribute and browser metadata should follow the selected locale. The canonical URL should remain the supported route without tracking query parameters. @@ -24,7 +24,7 @@ and an explicit rollout decision. The forum placeholder can be deployed independ ## Frontend -The frontend is Vue 3 + Vite + TypeScript. It defaults to dark mode and `en-US`, with a `de-DE` option and a light theme. +The frontend is Vue 3 + Vite + TypeScript. It defaults to dark mode and `en-US`, with `de-DE` and `ru-RU` options and a light theme. Preferences stay in local storage. Motion is limited to short interaction transitions and obeys reduced-motion preferences. The site uses self-hosted Fira Sans and no third-party runtime font request. diff --git a/backend/src/main/kotlin/com/progmasoft/visual/xsharp/website/SiteController.kt b/backend/src/main/kotlin/com/progmasoft/visual/xsharp/website/SiteController.kt index 8d486f4..707772d 100644 --- a/backend/src/main/kotlin/com/progmasoft/visual/xsharp/website/SiteController.kt +++ b/backend/src/main/kotlin/com/progmasoft/visual/xsharp/website/SiteController.kt @@ -25,7 +25,7 @@ class SiteController { name = "Visual X#", phase = "development", defaultLocale = "en-US", - supportedLocales = listOf("en-US", "de-DE"), + supportedLocales = listOf("en-US", "de-DE", "ru-RU"), forumOpen = false, ) diff --git a/backend/src/test/kotlin/com/progmasoft/visual/xsharp/website/SiteControllerTest.kt b/backend/src/test/kotlin/com/progmasoft/visual/xsharp/website/SiteControllerTest.kt index ea190bd..6a7fd03 100644 --- a/backend/src/test/kotlin/com/progmasoft/visual/xsharp/website/SiteControllerTest.kt +++ b/backend/src/test/kotlin/com/progmasoft/visual/xsharp/website/SiteControllerTest.kt @@ -27,7 +27,7 @@ class SiteControllerTest( val body = response.contentAsString assertTrue(body.contains("\"name\":\"Visual X#\"")) assertTrue(body.contains("\"defaultLocale\":\"en-US\"")) - assertTrue(body.contains("\"supportedLocales\":[\"en-US\",\"de-DE\"]")) + assertTrue(body.contains("\"supportedLocales\":[\"en-US\",\"de-DE\",\"ru-RU\"]")) assertTrue(body.contains("\"forumOpen\":false")) assertFalse(body.contains("viget", ignoreCase = true)) } diff --git a/forum/index.html b/forum/index.html index 2ad2267..3758b28 100644 --- a/forum/index.html +++ b/forum/index.html @@ -18,7 +18,11 @@ <img src="/visual-xsharp-mark.svg" alt="" />Visual X# </a> <div class="tools"> - <button id="language" type="button" aria-label="Switch to German">DE</button> + <select id="language" aria-label="Language"> + <option value="en" lang="en">EN</option> + <option value="de" lang="de">DE</option> + <option value="ru" lang="ru">RU</option> + </select> <button id="theme" type="button" aria-label="Switch color theme">☀</button> </div> </header> diff --git a/forum/site.css b/forum/site.css index a4c767e..107faae 100644 --- a/forum/site.css +++ b/forum/site.css @@ -55,7 +55,8 @@ header { display: flex; gap: 8px; } -button { +button, +select { min-height: 36px; padding: 0 12px; border: 1px solid var(--line); @@ -64,10 +65,15 @@ button { color: var(--text); cursor: pointer; } -button:hover { +button:hover, +select:hover { border-color: var(--accent); } +select { + font: inherit; +} button:focus-visible, +select:focus-visible, a:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; diff --git a/forum/site.js b/forum/site.js index 030d0ad..9261222 100644 --- a/forum/site.js +++ b/forum/site.js @@ -9,8 +9,7 @@ const copy = { "We will open the Visual X# forum when the community is ready for it. There are no accounts, posts, or discussion service here today. For now, follow the language and compiler in the public repository.", home: "Visual X# home →", source: "Source repository ↗", - languageButton: "DE", - languageLabel: "Switch to German", + languageLabel: "Language", themeLabel: "Switch color theme", }, de: { @@ -20,15 +19,25 @@ const copy = { "Wir eröffnen das Visual X# Forum, wenn die Community dafür bereit ist. Derzeit gibt es hier keine Konten, Beiträge oder Diskussionen. Folgen Sie bis dahin der Sprache und dem Compiler im öffentlichen Repository.", home: "Visual X# Startseite →", source: "Quellcode-Repository ↗", - languageButton: "EN", - languageLabel: "Zu Englisch wechseln", + languageLabel: "Sprache", themeLabel: "Farbschema wechseln", }, + ru: { + eyebrow: "Сообщество / позже", + title: "Форум пока не открыт.", + message: + "Мы откроем форум Visual X#, когда сообщество будет к этому готово. Сейчас здесь нет ни аккаунтов, ни сообщений, ни сервиса обсуждений. Пока следите за языком и компилятором в публичном репозитории.", + home: "На главную Visual X# →", + source: "Репозиторий с исходным кодом ↗", + languageLabel: "Язык", + themeLabel: "Сменить цветовую тему", + }, }; -const languageButton = document.getElementById("language"); +const languageSelect = document.getElementById("language"); const themeButton = document.getElementById("theme"); -let language = localStorage.getItem("vxs-forum-language") === "de" ? "de" : "en"; +const storedLanguage = localStorage.getItem("vxs-forum-language"); +let language = Object.hasOwn(copy, storedLanguage ?? "") ? storedLanguage : "en"; function renderLanguage() { const selected = copy[language]; @@ -37,14 +46,17 @@ function renderLanguage() { for (const key of ["eyebrow", "title", "message", "home", "source"]) { document.getElementById(key).textContent = selected[key]; } - languageButton.textContent = selected.languageButton; - languageButton.setAttribute("aria-label", selected.languageLabel); + languageSelect.value = language; + languageSelect.setAttribute("aria-label", selected.languageLabel); themeButton.setAttribute("aria-label", selected.themeLabel); } -languageButton.addEventListener("click", () => { - language = language === "en" ? "de" : "en"; - localStorage.setItem("vxs-forum-language", language); +languageSelect.addEventListener("change", () => { + // The menu only offers known languages; anything else keeps the current one. + if (Object.hasOwn(copy, languageSelect.value)) { + language = languageSelect.value; + localStorage.setItem("vxs-forum-language", language); + } renderLanguage(); }); diff --git a/frontend/src/App.vue b/frontend/src/App.vue index d13addf..1aaa109 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -29,6 +29,17 @@ const labels = { status: "In aktiver Entwicklung", footer: "Ein Progmasoft-Projekt. Visual X# hat eine eigenständige Sprachidentität.", }, + "ru-RU": { + home: "Главная", + overview: "Обзор", + start: "Начало работы", + forum: "Форум", + source: "Исходный код", + theme: "Сменить цветовую тему", + language: "Язык", + status: "В активной разработке", + footer: "Проект Progmasoft. Visual X# — самостоятельный язык со своей идентичностью.", + }, } as const; const copy = computed(() => labels[locale.value]); @@ -57,6 +68,7 @@ function toggleTheme() { <select v-model="locale" :aria-label="copy.language"> <option value="en-US">EN</option> <option value="de-DE">DE</option> + <option value="ru-RU">RU</option> </select> </label> <button class="icon-button" type="button" :aria-label="copy.theme" @click="toggleTheme"> diff --git a/frontend/src/pages/GettingStartedPage.vue b/frontend/src/pages/GettingStartedPage.vue index 78a6889..abbd8d9 100644 --- a/frontend/src/pages/GettingStartedPage.vue +++ b/frontend/src/pages/GettingStartedPage.vue @@ -8,6 +8,8 @@ import { locale } from "../preferences"; const text = { "en-US": { + navOverview: "Overview", + navStart: "Getting started", section: "DOCUMENTATION / GETTING STARTED", title: "Start with the source", lead: "Visual X# is in active development. For now, the repository is the reliable entry point for building the compiler and checking which language features run end to end.", @@ -65,6 +67,8 @@ const text = { examples: "More examples", }, "de-DE": { + navOverview: "Überblick", + navStart: "Erste Schritte", section: "DOKUMENTATION / ERSTE SCHRITTE", title: "Mit dem Quellcode beginnen", lead: "Visual X# wird aktiv entwickelt. Das Repository ist derzeit der zuverlässige Einstieg, um den Compiler zu bauen und den tatsächlich funktionierenden Sprachumfang zu prüfen.", @@ -121,6 +125,65 @@ const text = { spec: "Öffentliche Spezifikation", examples: "Weitere Beispiele", }, + "ru-RU": { + navOverview: "Обзор", + navStart: "Начало работы", + section: "ДОКУМЕНТАЦИЯ / НАЧАЛО РАБОТЫ", + title: "Начните с исходного кода", + lead: "Visual X# находится в активной разработке. Пока что репозиторий — надёжная отправная точка, чтобы собрать компилятор и проверить, какие возможности языка работают от начала до конца.", + step1: "1. Получите репозиторий", + step1Text: + "Клонируйте репозиторий компилятора вместе с подмодулями. Используйте поддерживаемую машину разработки с Windows 10/11 или актуальной macOS.", + step2: "2. Проверьте набор инструментов", + step2Text: + "Команда разработки на Go из репозитория проверяет локальные требования. Компилятор использует GHC2024 для фронтенда на Haskell, Clang/LLVM для нативных стадий на C++20, Bazel для нативных сборок и Temurin JDK 25 для DSL проектов.", + platform: + "Поддерживаемые машины разработки — Windows 10/11 и macOS Sequoia/Tahoe. В Windows используются отдельные LLVM clang-cl и LLD вместе с Windows SDK и библиотеками MSVC CRT/STL. В macOS установите Xcode Command Line Tools; полное приложение Xcode не требуется.", + toolchainHelp: + "Если проверка сообщает об отсутствующих инструментах, необязательная начальная настройка может установить их через менеджер пакетов системы. После этого откройте новый терминал, чтобы изменения PATH вступили в силу. LLVM_ROOT может указывать на каталог установки LLVM для разработки; не записывайте путь, относящийся к конкретной машине, в файлы проекта.", + bootstrap: "Необязательная начальная настройка системы", + step3: "3. Соберите и протестируйте", + step3Text: + "Соберите нативный компилятор и запустите его нативные контрактные наборы тестов. Команда на Go координирует проверки; графом сборки C++20 по-прежнему владеет Bazel. Cabal и Gradle отвечают за свои области — Haskell и Kotlin.", + step4: "4. Прочитайте и проверьте настоящую программу", + step4Text: + "В примере HelloWorld точкой входа служит метод класса. В Visual X# функция верхнего уровня не является точкой входа программы. Проверьте сам исходный файл, а затем соберите его текущим подмножеством компилятора.", + fileCheck: "Проверить один исходный файл", + fileBuild: "Собрать нативный исполняемый файл", + subset: + "Принимаемое подмножество исходного кода уже полной публичной спецификации. Успешная сборка — более сильное свидетельство для конкретной программы, чем синтаксический пример в спецификации; успешный прогон тестов — более сильное свидетельство для семейства возможностей.", + step5: "5. Следуйте публичному контракту", + step5Text: + "Задуманную семантику языка смотрите в публичной спецификации, а сведения о реализации и инструментах — в каталоге Documents репозитория. Вывод -Help компилятора описывает флаги, которые принимает установленный исполняемый файл.", + links: [ + { + title: "Спецификация языка", + detail: "Синтаксические и семантические контракты с допустимыми и недопустимыми примерами.", + href: "https://github.com/Progmasoft/visual-xsharp/tree/main/Spec", + }, + { + title: "Руководство по сборке", + detail: "Официальные платформы, поиск набора инструментов и цели нативной сборки.", + href: "https://github.com/Progmasoft/visual-xsharp/blob/main/Documents/BUILDING.md", + }, + { + title: "Справочник по CLI", + detail: "Текущие команды, флаги, поведение артефактов и состояние реализации.", + href: "https://github.com/Progmasoft/visual-xsharp/blob/main/Documents/CLI.md", + }, + { + title: "Примеры программ", + detail: "Примеры исходного кода рядом с вариантами на C# 13, C++20 и Java 21.", + href: "https://github.com/Progmasoft/visual-xsharp/tree/main/Examples", + }, + ], + note: "Состояние реализации", + noteText: + "Пример из спецификации не доказывает поддержку в компиляторе. Прежде чем полагаться на возможность, запустите тесты репозитория и сверьтесь с актуальными заметками о реализации. Готовые двоичные сборки и стабильный процесс установки пока не обещаны.", + more: "Понять замысел", + spec: "Публичная спецификация", + examples: "Больше примеров", + }, } as const; const c = computed(() => text[locale.value]); const hello = `namespace Examples.HelloWorld; @@ -137,12 +200,8 @@ public class HelloWorld { <div class="doc-layout section-wrap"> <aside class="doc-sidebar"> <span class="kicker">VISUAL X#</span - ><RouterLink to="/docs/overview">{{ - locale === "de-DE" ? "Überblick" : "Overview" - }}</RouterLink - ><RouterLink to="/docs/getting-started" aria-current="page">{{ - locale === "de-DE" ? "Erste Schritte" : "Getting started" - }}</RouterLink + ><RouterLink to="/docs/overview">{{ c.navOverview }}</RouterLink + ><RouterLink to="/docs/getting-started" aria-current="page">{{ c.navStart }}</RouterLink ><a href="https://github.com/Progmasoft/visual-xsharp/tree/main/Spec">Specification ↗</a> </aside> <article class="doc-content"> diff --git a/frontend/src/pages/HomePage.vue b/frontend/src/pages/HomePage.vue index ac11833..9b0d617 100644 --- a/frontend/src/pages/HomePage.vue +++ b/frontend/src/pages/HomePage.vue @@ -131,6 +131,68 @@ const translations = { disclaimer: "Status: Sprache und Compiler entwickeln sich weiter. Beispiele in der Spezifikation können dem derzeitigen Implementierungsstand voraus sein.", }, + "ru-RU": { + eyebrow: "Язык для ясной разработки", + title: "Сделать понятной всю программу.", + intro: + "Visual X# стремится соединить выразительный исходный код с явным владением, прозрачным конвейером компилятора и нативным результатом. Он создаётся открыто: спецификация описывает задуманный язык, а охват реализации пока растёт.", + start: "Начать чтение", + overview: "Почему Visual X#?", + github: "Следить за разработкой", + stage: "Язык и компилятор в активной разработке", + why: "Почему Visual X#?", + whyIntro: + "Хорошие инструменты помогают рассуждать о том, что означает ваш код, чем он владеет и что компилятор сделает дальше.", + features: [ + { + number: "01", + title: "Читаемый код, явный смысл", + text: "Спецификация языка отделяет синтаксис от семантических правил и помечает в примерах допустимые и недопустимые формы. Чем меньше скрытых допущений, тем проще обсуждать большие кодовые базы.", + }, + { + number: "02", + title: "Владение — часть языка", + text: "Ссылочные типы, типы-значения и типы с копированием при записи различаются; AARC и явные промежуточные операции входят в проект компилятора. Это направление в процессе реализации, а не заявление о готовой поддержке во время выполнения.", + }, + { + number: "03", + title: "Компилятор, который можно изучить", + text: "У разбора, разрешения имён, проверки типов, Core, Xpp и Xmm отдельные обязанности. Путь к LLVM и нативному исполняемому файлу виден, а не скрыт в чёрном ящике.", + }, + ], + codeTitle: "Знакомая отправная точка", + codeCaption: + "Первая программа намеренно обычна. Глубина замысла проявляется по мере роста программ.", + statusLabel: "ТЕКУЩЕЕ СОСТОЯНИЕ", + statusTitle: "Проект, который можно изучить. Компилятор, который ещё растёт.", + statusLead: + "У спецификации и реализации разные задачи. Мы показываем обе, чтобы задуманное правило можно было отличить от возможности, которую уже можно запустить.", + statusItems: [ + { + title: "Прочитайте контракт", + body: "Публичная спецификация фиксирует грамматику и семантику языка, включая примеры, различающие допустимые и недопустимые формы. Она может описывать поведение раньше, чем его поддержит компилятор.", + link: "Открыть спецификацию", + href: "https://github.com/Progmasoft/visual-xsharp/tree/main/Spec", + }, + { + title: "Проверьте реализацию", + body: "Текущий компилятор, тесты его компонентов и справочник по CLI показывают, какие пути исходного кода и результаты работают сейчас. Новую возможность сначала проверьте на небольшой программе.", + link: "Читать справочник по CLI", + href: "https://github.com/Progmasoft/visual-xsharp/blob/main/Documents/CLI.md", + }, + { + title: "Следите за работой", + body: "В репозитории находятся язык, нативные стадии компилятора, инструменты проектов, примеры и документы для разработчиков. Этот сайт — путеводитель по этой работе, а не заявление о готовом наборе инструментов.", + link: "Перейти в репозиторий", + href: "https://github.com/Progmasoft/visual-xsharp", + }, + ], + journey: "Познакомьтесь с языком", + journeyText: + "Прочитайте обзор, чтобы понять замысел, затем следуйте руководству по началу работы с текущим набором инструментов. Незавершённое мы честно помечаем.", + disclaimer: + "Статус: язык и компилятор развиваются. Примеры в спецификации могут описывать задуманное поведение раньше его полной поддержки компилятором.", + }, } as const; const c = computed(() => translations[locale.value]); const example = `namespace Examples.HelloWorld; diff --git a/frontend/src/pages/OverviewPage.vue b/frontend/src/pages/OverviewPage.vue index 55529c6..b61347a 100644 --- a/frontend/src/pages/OverviewPage.vue +++ b/frontend/src/pages/OverviewPage.vue @@ -8,6 +8,8 @@ import { locale } from "../preferences"; const text = { "en-US": { + navOverview: "Overview", + navStart: "Getting started", section: "DOCUMENTATION / OVERVIEW", title: "What Visual X# is trying to solve", lead: "Visual X# is designed around a simple question: can expressive code remain understandable when ownership, types, and native compilation matter? This page explains the direction, not a promise that every feature is finished.", @@ -121,6 +123,8 @@ const text = { source: "View source", }, "de-DE": { + navOverview: "Überblick", + navStart: "Erste Schritte", section: "DOKUMENTATION / ÜBERBLICK", title: "Welches Problem Visual X# lösen will", lead: "Visual X# stellt eine Frage: Kann ausdrucksstarker Code verständlich bleiben, wenn Ownership, Typen und native Kompilierung wichtig sind? Diese Seite erklärt das Ziel, nicht die Fertigstellung aller Funktionen.", @@ -233,6 +237,121 @@ const text = { spec: "Spezifikation lesen", source: "Quellcode ansehen", }, + "ru-RU": { + navOverview: "Обзор", + navStart: "Начало работы", + section: "ДОКУМЕНТАЦИЯ / ОБЗОР", + title: "Какую задачу решает Visual X#", + lead: "Visual X# строится вокруг простого вопроса: может ли выразительный код оставаться понятным, когда важны владение, типы и нативная компиляция? Эта страница объясняет направление и не обещает, что каждая возможность уже готова.", + goals: "Цели проектирования", + modelHeading: "Несколько решений языка", + modelIntro: + "Это проектные контракты, описанные в публичной спецификации. Прежде чем считать контракт возможностью, пригодной для реальной работы, проверьте текущий охват компилятора.", + model: [ + { + title: "Точка входа принадлежит классу", + body: "Программа начинается в методе public static void Main() без параметров в настроенном классе входа. Класс может находиться в любом исходном файле; его пространство имён не обязано повторять каталоги.", + }, + { + title: "Типы определяют владение", + body: "Тип остаётся типом-значением, только если каждый вложенный обобщённый аргумент — тип-значение. Ссылочный тип в любом месте обобщённой структуры делает результат ссылочным типом.", + }, + { + title: "Единая стандартная библиотека", + body: "Пространства имён System содержат базовые средства: консольный ввод-вывод, массивы, текст и математику. Пространство имён стандартной библиотеки не является отдельно объявляемой зависимостью-пакетом.", + }, + { + title: "Нативный результат без видимости готового конвейера", + body: "Для реализованного подмножества у компилятора есть путь от исходного кода до нативного кода. Цель — более широкий охват семантики, проверяемые промежуточные границы и надёжная диагностика по мере роста языка.", + }, + ], + pipelineHeading: "У компилятора видимые границы", + pipelineIntro: + "Архитектура намеренно разделена, чтобы каждая стадия могла отклонить некорректный вход и сохранить установленное предыдущей стадией.", + pipeline: [ + { + title: "Исходный код и синтаксис", + body: "Лексер и парсер на Haskell строят разобранное AST, сохраняя позиции в исходном коде для диагностики.", + }, + { + title: "Имена и типы", + body: "Переименование, разрешение имён и проверка типов создают отдельные формы AST: разрешённую и типизированную.", + }, + { + title: "Семантика языка", + body: "Раскрытие синтаксического сахара и оптимизации Core выполняются до внутреннего адаптера CorePrep.", + }, + { + title: "Нативная адаптация", + body: "Стадии Xpp и Xmm на C++20 переносят проверенное, не зависящее от целевой платформы представление к LLVM.", + }, + { + title: "Исполняемый файл", + body: "LLVM понижает проверенную программу до объектного кода, после чего шаг компоновки для платформы создаёт артефакт .vxse.", + }, + ], + boundariesHeading: "Где проходят границы сегодня", + boundaries: [ + { + label: "Публичный контракт языка", + value: "Примеры в Spec/ и связанные руководства в Documents/", + }, + { + label: "Фактическая реализация", + value: "Тесты компилятора, поддерживаемое подмножество и явная диагностика", + }, + { + label: "Описание проекта", + value: "Visual.XSharp.kts, который интерпретирует система проектов на Kotlin", + }, + { + label: "Сайт", + value: "Введение в язык и руководства; без аккаунтов и управления пакетами", + }, + ], + questionHeading: "Частые вопросы", + questions: [ + { + q: "Готов ли Visual X# к использованию в продакшене?", + a: "Общего заявления о готовности к продакшену нет. Компилятор и среда выполнения ещё развиваются. Оценивайте конкретную возможность по тестам репозитория и заметкам к выпускам.", + }, + { + q: "Является ли публичная спецификация исполняемым набором тестов?", + a: "Не целиком. В ней есть задуманные допустимые и недопустимые фрагменты. Некоторые примеры описывают семантику до появления полной поддержки в компиляторе.", + }, + { + q: "Зачем показывать промежуточные стадии?", + a: "У каждой стадии есть владелец и граница проверки. Так поведение компилятора можно проверить, а поздние стадии не придумывают смысл исходного языка.", + }, + { + q: "Нужна ли для Visual X# определённая IDE?", + a: "Нет. Поддерживаемый процесс разработки использует инструменты командной строки в Windows и macOS; проект Xide — будущий интерфейс, а не обязательное условие.", + }, + ], + items: [ + { + title: "Семантика важнее обходных путей", + body: "У исходного языка есть письменная спецификация. Компилятор разделяет разобранный, разрешённый и типизированный синтаксис, чтобы поздние проходы получали явный смысл, а не догадывались.", + }, + { + title: "Владение, за которым можно проследить", + body: "Поведение ссылок и значений определяется составом типов. Автоматический подсчёт ссылок и правила копирования при записи входят в модель языка; поддержка во время выполнения и понижение ещё завершаются.", + }, + { + title: "Продуманный нативный конвейер", + body: "Фронтенд понижает программу через Core и CorePrep, затем Xpp и Xmm подготавливают её к генерации кода LLVM. Границы позволяют выполнять проверку и диагностику на каждой стадии.", + }, + ], + not: "Чем он не является", + notText: + "Visual X# не представлен как готовая замена устоявшимся языкам для продакшена. Спецификация фиксирует задуманную семантику; фактически собираемый охват компилятора следует проверять отдельно. На этом сайте языка нет аккаунтов и управления пакетами.", + next: "Хотите узнать больше?", + nextText: + "Начните с небольшой программы, а затем изучите публичную спецификацию и репозиторий с исходным кодом.", + start: "Начало работы", + spec: "Читать спецификацию", + source: "Смотреть исходный код", + }, } as const; const c = computed(() => text[locale.value]); </script> @@ -241,12 +360,8 @@ const c = computed(() => text[locale.value]); < |