Read-only mirrors. Development, issues and pull requests are on GitHub.

summaryrefslogtreecommitdiffhomepage
path: root/forum
diff options
context:
space:
mode:
authorLeitwolf112026-10-03 01:43:43 +0300
committerLeitwolf112026-10-03 01:43:43 +0300
commitf25c01f1d173b9e206565207472b58ca51f90803 (patch)
treec4244396690eb895815b89802a8c5cb7261f47a9 /forum
parent1045265e9ae018cb3d2d94a47d780888c26d04a2 (diff)
downloadwebsite-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.html6
-rw-r--r--forum/site.css10
-rw-r--r--forum/site.js34
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();
});