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 /frontend/tests | |
| 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 'frontend/tests')
| -rw-r--r-- | frontend/tests/forum.test.mjs | 39 | ||||
| -rw-r--r-- | frontend/tests/seo.test.mjs | 16 |
2 files changed, 49 insertions, 6 deletions
diff --git a/frontend/tests/forum.test.mjs b/frontend/tests/forum.test.mjs index 38771aa..c04df30 100644 --- a/frontend/tests/forum.test.mjs +++ b/frontend/tests/forum.test.mjs @@ -18,6 +18,7 @@ function createElement() { const attributes = new Map(); return { textContent: "", + value: "", listeners, attributes, addEventListener(name, callback) { @@ -29,6 +30,10 @@ function createElement() { click() { listeners.get("click")(); }, + choose(value) { + this.value = value; + listeners.get("change")(); + }, }; } @@ -65,7 +70,8 @@ test("forum starts in English and dark mode without offering sign-up", () => { const { document, elements } = loadForum(); assert.equal(document.documentElement.lang, "en"); assert.equal(document.documentElement.dataset.theme, "dark"); - assert.equal(elements.get("language").textContent, "DE"); + assert.equal(elements.get("language").value, "en"); + assert.equal(elements.get("language").attributes.get("aria-label"), "Language"); assert.match(elements.get("title").textContent, /isn't open yet/); assert.match(elements.get("message").textContent, /no accounts, posts/); assert.doesNotMatch(elements.get("message").textContent, /sign up/i); @@ -73,18 +79,39 @@ test("forum starts in English and dark mode without offering sign-up", () => { test("forum switches language and keeps the choice", () => { const { document, elements, values } = loadForum(); - elements.get("language").click(); + elements.get("language").choose("de"); assert.equal(document.documentElement.lang, "de"); assert.equal(values.get("vxs-forum-language"), "de"); - assert.equal(elements.get("language").textContent, "EN"); + assert.equal(elements.get("language").value, "de"); assert.match(elements.get("title").textContent, /nicht geöffnet/); assert.match(document.title, /Visual X#/); - assert.equal(elements.get("language").attributes.get("aria-label"), "Zu Englisch wechseln"); - elements.get("language").click(); + assert.equal(elements.get("language").attributes.get("aria-label"), "Sprache"); + elements.get("language").choose("ru"); + assert.equal(document.documentElement.lang, "ru"); + assert.equal(values.get("vxs-forum-language"), "ru"); + assert.match(elements.get("title").textContent, /Форум пока не открыт/); + assert.match(elements.get("message").textContent, /нет ни аккаунтов, ни сообщений/); + assert.equal(elements.get("language").attributes.get("aria-label"), "Язык"); + elements.get("language").choose("en"); assert.equal(document.documentElement.lang, "en"); assert.equal(values.get("vxs-forum-language"), "en"); }); +test("forum ignores a language it does not offer", () => { + const { document, elements, values } = loadForum({ "vxs-forum-language": "tr" }); + assert.equal(document.documentElement.lang, "en"); + elements.get("language").choose("constructor"); + assert.equal(document.documentElement.lang, "en"); + assert.equal(elements.get("language").value, "en"); + assert.equal(values.get("vxs-forum-language"), "tr"); +}); + +test("forum restores a saved Russian preference", () => { + const { document, elements } = loadForum({ "vxs-forum-language": "ru" }); + assert.equal(document.documentElement.lang, "ru"); + assert.equal(elements.get("language").value, "ru"); +}); + test("forum restores the saved German and light preferences", () => { const { document, elements } = loadForum({ "vxs-forum-language": "de", @@ -92,7 +119,7 @@ test("forum restores the saved German and light preferences", () => { }); assert.equal(document.documentElement.lang, "de"); assert.equal(document.documentElement.dataset.theme, "light"); - assert.equal(elements.get("language").textContent, "EN"); + assert.equal(elements.get("language").value, "de"); }); test("forum theme button toggles and persists in both directions", () => { diff --git a/frontend/tests/seo.test.mjs b/frontend/tests/seo.test.mjs index c7014b7..45bb6de 100644 --- a/frontend/tests/seo.test.mjs +++ b/frontend/tests/seo.test.mjs @@ -75,3 +75,19 @@ test("a missing optional metadata tag does not stop the page title", () => { applyPageMetadata("/docs/getting-started", "de-DE"); assert.equal(globalThis.document.title, "Erste Schritte · Visual X#"); }); + +test("the Russian routes have their own titles and keep the canonical URLs", () => { + const { document, elements } = fakeDocument(); + applyPageMetadata("/", "ru-RU"); + assert.match(document.title, /^Visual X# — Сделать понятной всю программу$/); + assert.match(elements.get('meta[name="description"]').content, /нативный язык программирования/); + assert.equal(elements.get('link[rel="canonical"]').href, "https://xsharp-lang.xyz/"); + applyPageMetadata("/docs/overview", "ru-RU"); + assert.equal(document.title, "Обзор · Visual X#"); + applyPageMetadata("/docs/getting-started", "ru-RU"); + assert.equal(document.title, "Начало работы · Visual X#"); + assert.equal( + elements.get('link[rel="canonical"]').href, + "https://xsharp-lang.xyz/docs/getting-started", + ); +}); |