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 /forum | |
| 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.
Diffstat (limited to 'forum')
| -rw-r--r-- | forum/index.html | 6 | ||||
| -rw-r--r-- | forum/site.css | 10 | ||||
| -rw-r--r-- | forum/site.js | 34 |
3 files changed, 36 insertions, 14 deletions
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(); }); |