Add SEO basics: separate EN/RU pages, sitemap, OG banner

Splits the landing page into /  and /ru/ so each language can rank on
its own, with hreflang links between them; boot.js/main.js now do a
real navigation between the two instead of toggling text in place.
Adds robots.txt and sitemap.xml, JSON-LD SoftwareApplication markup,
Twitter Card tags, and a proper 1200x630 og-image.png in place of the
SVG favicon for social previews.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-10 23:57:28 +05:00
co-authored by Claude Sonnet 5
parent 8fe0e72664
commit b6733f37fa
9 changed files with 847 additions and 51 deletions
+22 -16
View File
@@ -385,16 +385,19 @@ dotnet build Packaging\Installer\CursorLang.wixproj -p:SuppressValidation=false
Partner Center не требует политику от приложения, которое не собирает данных, но
страница, сказавшая это вслух, снимает вопрос у проверяющего.
Всё это — пять файлов в `site`, и ничего больше ниоткуда не подгружается: ни
фреймворка, ни сборки, ни шрифта из сети.
Ничего больше ниоткуда не подгружается: ни фреймворка, ни сборки, ни шрифта из
сети.
| Файл | Что внутри |
|---|---|
| `index.html` | Разметка, оба языка сразу |
| `index.html` | Английская страница — разметка, оба языка сразу |
| `ru/index.html` | Та же разметка, впереди по умолчанию — русский |
| `styles.css` | Все правила, включая палитру |
| `boot.js` | Язык и тема прошлого визита — до первого кадра |
| `main.js` | Остальное: переключатели, меню, демонстрация, предпросмотр |
| `favicon.svg` | Та же тёмная плашка с «Aя», что и у иконки приложения |
| `robots.txt` | Указывает краулерам на sitemap, ничего не запрещает |
| `sitemap.xml` | Обе страницы, связанные между собой через `hreflang` |
`boot.js` вынесен отдельно и мал по одной причине: он должен отработать до
разбора `body`. Он читает выбранное в прошлый раз и ставит это на элемент
@@ -402,21 +405,24 @@ Partner Center не требует политику от приложения,
на глазах исправлялся бы. `main.js` работает по разметке, которая к тому времени
должна существовать, поэтому он отложенный.
Оба языка живут в разметке одновременно, а переключатель в углу выбирает один.
Каждый переведённый кусок — это `<span lang="en">` рядом с `<span lang="ru">`, и
тот, который не совпадает с языком на элементе `<html>`, скрывается правилом в
две строки. С выключенными скриптами страница всё равно читается — по-английски.
Оба языка живут в разметке каждой из страниц одновременно, а переключатель в
углу выбирает один. Каждый переведённый кусок — это `<span lang="en">` рядом с
`<span lang="ru">`, и тот, который не совпадает с языком на элементе `<html>`,
скрывается правилом в две строки. С выключенными скриптами любая из страниц
всё равно читается — на том языке, что у неё по умолчанию.
Выкладка сводится к копированию этих пяти файлов как есть. До неё адреса ждут
две вещи.
Английский и русский — это две страницы, а не одна с переключателем на клиенте,
чтобы каждая могла ранжироваться в поиске сама по себе: `/` и `/ru/`, со
ссылками `hreflang` друг на друга и в разметке, и в `sitemap.xml`, и у каждой —
свой заголовок, описание и canonical. Клик по EN или RU — это настоящий переход
между ними, а не перерисовка на месте, а `boot.js` отправляет посетителя,
зашедшего впервые, на страницу под язык его браузера — но никогда не уводит с
той из двух, на которую уже привела ссылка: иначе раздельное ранжирование
пропадало бы для всех, кто пришёл именно так, включая краулеров.
Первая — страница в Store: обе кнопки загрузки сейчас не ссылки, а
`<span class="btn disabled" role="link">`, потому что заглушка в `href` была бы
относительным адресом и всякий, кто по ней пойдёт, получил бы 404. С адресом
каждая возвращается в `<a class="btn" href="…">`, а примечание рядом уходит.
Вторая — адрес самого сайта: его ждут три тега, которых в шапке документа пока
нет, — `og:image`, `og:url` и canonical.
Выкладка сводится к копированию файлов как есть — на общие файлы (`/styles.css`
и другие) ссылаются по абсолютному пути, так что `ru/index.html` обращается к
той же копии, не заводя свою.
Поддержка — `support@alrakis.kz`: адрес стоит в разделе о данных, под кнопками
загрузки и в подвале.