From e02ce1c629b2f6708821bb24e1ef1e87d89db245 Mon Sep 17 00:00:00 2001 From: root Date: Tue, 15 Sep 2026 23:00:32 +0200 Subject: [PATCH] fix(i18n): keep en navigation within /en/ via pagePrefix - build-pages.mjs: add pagePrefix (locale-root-relative, no en offset) - use pagePrefix for nav links: logo, back-home, footer design-system/ cookie-policy/, FAB #contact, cookie-notice link, cookie-policy body link, case-page #skills/#projects anchors (assetPrefix pointed to site root and leaked en pages to ru) - docs/translation.md: document assetPrefix vs pagePrefix --- docs/translation.md | 7 ++++--- scripts/build-pages.mjs | 3 +++ src/pages/cases/design-system.html | 4 ++-- src/pages/cookie-policy.en.html | 4 ++-- src/pages/cookie-policy.html | 4 ++-- src/partials/cookie-notice.en.html | 2 +- src/partials/cookie-notice.html | 2 +- src/partials/fab-stack-home-contact.html | 2 +- src/partials/footer.html | 2 +- src/partials/header-case.html | 2 +- src/partials/header-minimal.html | 4 ++-- 11 files changed, 20 insertions(+), 16 deletions(-) diff --git a/docs/translation.md b/docs/translation.md index 9c54be8..fd31134 100644 --- a/docs/translation.md +++ b/docs/translation.md @@ -16,9 +16,10 @@ - `src/pages/.en.html` — английский override. Если файла нет, берётся русский. - В сборке базовый walk **исключает** `*.en.html`, чтобы они не собирались как отдельные страницы. 3. **Partials**: для не-дефолтной локали инклуд `{{> name}}` сначала ищет `src/partials/name.en.html`, иначе `name.html`. Так переводятся частично захардкоженные partials (например, `projects-section.en.html`). -4. **`assetPrefix`**: относительный префикс к ассетам. Для `en` к значению из `baseVars` добавляется один уровень `../`, потому что страницы лежат в подпапке `public/en/`. Навигационные ссылки `{{casesPrefix}}cases/...` остаются относительными и для `en` корректно ведут в `/en/cases/...`. -5. **Статик-ассеты** (css/js/vendor/favicon) в partials (`head-links.html`, `head-scripts.html`, `theme-init-script.html`, `head-plyr.html`, `page-scripts.html`) прописаны **root-absolute** (`/css/...`, `/js/...`, `/vendor/...`, `/assets/shared/...`). Причина: dev-сервер (`serve-dev.mjs`) отдаёт `index.html` (200) для отсутствующих файлов, маскируя 404, поэтому относительные `{{assetPrefix}}css` на `/en/` ломались бы. Держи статик-ссылки root-absolute. -6. `` подменяется на текущую локаль (``). +4. **`assetPrefix`**: относительный префикс к ассетам. Для `en` к значению из `baseVars` добавляется один уровень `../`, потому что страницы лежат в подпапке `public/en/`. Используй только для путей к ассетам (css/js/изображения). +5. **`pagePrefix`**: префикс до **корня локали** (`/en/` для en), без en-сдвига. Используй его для ВСЕХ навигационных ссылок (лого, «назад», футер, якоря `#section`, ссылки на другие страницы), чтобы они вели в ту же локаль, а не в корень сайта. `assetPrefix` предназначен только для путей к ассетам — для навигации он «перепрыгивает» через `/en/` и ведёт на ru, поэтому в навигационных `href` его НЕ применяй. +6. **Статик-ассеты** (css/js/vendor/favicon) в partials (`head-links.html`, `head-scripts.html`, `theme-init-script.html`, `head-plyr.html`, `page-scripts.html`) прописаны **root-absolute** (`/css/...`, `/js/...`, `/vendor/...`, `/assets/shared/...`). Причина: dev-сервер (`serve-dev.mjs`) отдаёт `index.html` (200) для отсутствующих файлов, маскируя 404, поэтому относительные `{{assetPrefix}}css` на `/en/` ломались бы. Держи статик-ссылки root-absolute. +7. `` подменяется на текущую локаль (``). > Видимый контент страниц переводится через отдельные `*.en.html` исходники, а НЕ тысячами `{{i18n:}}`-токенов — так проще править большие тексты. diff --git a/scripts/build-pages.mjs b/scripts/build-pages.mjs index ab3da67..151a642 100644 --- a/scripts/build-pages.mjs +++ b/scripts/build-pages.mjs @@ -165,6 +165,9 @@ function build() { const source = readUtf8(sourcePath); const vars = baseVars(relNorm, depth); + // Префикс до КОРНЯ ЛОКАЛИ (без en-сдвига) — для навигационных ссылок, + // чтобы они вели в ту же локаль (/en/), а не в корень сайта (/). + vars.pagePrefix = vars.assetPrefix; // Для не-дефолтной локали всё содержимое уходит на уровень глубже (public//), // поэтому к assetPrefix добавляем один ../, а пустой casesPrefix — в ../cases/. if (!isDefault) { diff --git a/src/pages/cases/design-system.html b/src/pages/cases/design-system.html index 3e44d52..feedfd3 100644 --- a/src/pages/cases/design-system.html +++ b/src/pages/cases/design-system.html @@ -667,9 +667,9 @@

Навыки: мозаика на широком экране — см. - главную, #skills. Портфолио: карусель на + главную, #skills. Портфолио: карусель на 100vw с --projects-card-width и JS-прокруткой — на главной - #projects. + #projects.

Wide в кейсах

diff --git a/src/pages/cookie-policy.en.html b/src/pages/cookie-policy.en.html index 22c244f..e36786f 100644 --- a/src/pages/cookie-policy.en.html +++ b/src/pages/cookie-policy.en.html @@ -70,7 +70,7 @@ Nikolai Mamadaev is the operator of the Site. For questions regarding data processing, please use the contact information in the “Contacts” section on - the home page + the home page (Telegram, VKontakte, Yandex, and email by copying the address using the button).

@@ -126,7 +126,7 @@

Changes

- The text of the policy may be updated as technologies on the site change. The current version is published on the “Cookie Policy” page at /cookie-policy.html relative to the site root. + The text of the policy may be updated as technologies on the site change. The current version is published on the “Cookie Policy” page at /cookie-policy.html relative to the site root.

diff --git a/src/pages/cookie-policy.html b/src/pages/cookie-policy.html index 5f773de..af9b52e 100644 --- a/src/pages/cookie-policy.html +++ b/src/pages/cookie-policy.html @@ -68,7 +68,7 @@

Кто отвечает за сайт

Оператором сайта является Николай Мамадаев. По вопросам обработки данных используйте контакты в блоке «Контакты» на - главной странице + главной странице (Telegram, ВКонтакте, Яндекс и почта через копирование адреса кнопкой).

@@ -124,7 +124,7 @@

Изменения

- Текст политики может обновляться при изменении технологий на сайте. Актуальная версия публикуется на странице «Политика cookie» по адресу /cookie-policy.html относительно корня сайта. + Текст политики может обновляться при изменении технологий на сайте. Актуальная версия публикуется на странице «Политика cookie» по адресу /cookie-policy.html относительно корня сайта.

diff --git a/src/partials/cookie-notice.en.html b/src/partials/cookie-notice.en.html index e206cc8..d983956 100644 --- a/src/partials/cookie-notice.en.html +++ b/src/partials/cookie-notice.en.html @@ -1,7 +1,7 @@