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

summaryrefslogtreecommitdiffhomepage
path: root/frontend/tests
diff options
context:
space:
mode:
authorLeitwolf112026-10-03 01:43:43 +0300
committerLeitwolf112026-10-03 01:43:43 +0300
commitf25c01f1d173b9e206565207472b58ca51f90803 (patch)
treec4244396690eb895815b89802a8c5cb7261f47a9 /frontend/tests
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 'frontend/tests')
-rw-r--r--frontend/tests/forum.test.mjs39
-rw-r--r--frontend/tests/seo.test.mjs16
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",
+ );
+});