From be6a0d712f4baf1ecc87f4cb4f33ead369a0c226 Mon Sep 17 00:00:00 2001 From: emil Date: Sat, 9 May 2026 16:57:11 +0300 Subject: [PATCH] Fix Russian generator pages: use individual pages instead of dynamic route The dynamic [slug].astro imported all 10 generator components, causing Astro to bundle all their scripts into every Russian page. Scripts then crashed trying to find DOM elements that don't exist on the page. Each Russian generator page now imports only its own component, matching the English page structure. Co-Authored-By: Claude Sonnet 4.6 --- src/pages/ru/generators/[slug].astro | 227 ------------------------- src/pages/ru/generators/cards.astro | 40 +++++ src/pages/ru/generators/coin.astro | 40 +++++ src/pages/ru/generators/colors.astro | 39 +++++ src/pages/ru/generators/dice.astro | 40 +++++ src/pages/ru/generators/list.astro | 40 +++++ src/pages/ru/generators/lottery.astro | 40 +++++ src/pages/ru/generators/numbers.astro | 41 +++++ src/pages/ru/generators/password.astro | 40 +++++ src/pages/ru/generators/uuid.astro | 40 +++++ src/pages/ru/generators/wheel.astro | 40 +++++ 11 files changed, 400 insertions(+), 227 deletions(-) delete mode 100644 src/pages/ru/generators/[slug].astro create mode 100644 src/pages/ru/generators/cards.astro create mode 100644 src/pages/ru/generators/coin.astro create mode 100644 src/pages/ru/generators/colors.astro create mode 100644 src/pages/ru/generators/dice.astro create mode 100644 src/pages/ru/generators/list.astro create mode 100644 src/pages/ru/generators/lottery.astro create mode 100644 src/pages/ru/generators/numbers.astro create mode 100644 src/pages/ru/generators/password.astro create mode 100644 src/pages/ru/generators/uuid.astro create mode 100644 src/pages/ru/generators/wheel.astro diff --git a/src/pages/ru/generators/[slug].astro b/src/pages/ru/generators/[slug].astro deleted file mode 100644 index 09e3804..0000000 --- a/src/pages/ru/generators/[slug].astro +++ /dev/null @@ -1,227 +0,0 @@ ---- -import { generators } from '../../../data/generators'; -import BaseLayout from '../../../layouts/BaseLayout.astro'; -import AdBanner from '../../../components/AdBanner.astro'; -import SeoBlock from '../../../components/SeoBlock.astro'; - -import NumberGenerator from '../../../components/generators/NumberGenerator.astro'; -import ColorGenerator from '../../../components/generators/ColorGenerator.astro'; -import PasswordGenerator from '../../../components/generators/PasswordGenerator.astro'; -import LotteryGenerator from '../../../components/generators/LotteryGenerator.astro'; -import DiceGenerator from '../../../components/generators/DiceGenerator.astro'; -import CardGenerator from '../../../components/generators/CardGenerator.astro'; -import CoinGenerator from '../../../components/generators/CoinGenerator.astro'; -import ListGenerator from '../../../components/generators/ListGenerator.astro'; -import UuidGenerator from '../../../components/generators/UuidGenerator.astro'; -import WheelSpinner from '../../../components/generators/WheelSpinner.astro'; - -export function getStaticPaths() { - return generators.map((g) => ({ - params: { slug: g.slug }, - props: { generator: g }, - })); -} - -const { generator } = Astro.props; -const { slug } = Astro.params; - -const seoContent: Record = { - numbers: { - howTo: [ - 'Введите минимальное значение в поле «От».', - 'Введите максимальное значение в поле «До».', - 'Нажмите «Сгенерировать» — случайное число появится мгновенно.', - 'Нажмите на число, чтобы скопировать его в буфер обмена.', - ], - whenTo: [ - 'Выбор победителя в розыгрыше или конкурсе.', - 'Определение случайного первого игрока в настольной игре.', - 'Быстрое принятие решения между пронумерованными вариантами.', - 'Генерация тестовых данных с числами в заданном диапазоне.', - ], - }, - colors: { - howTo: [ - 'Нажмите «Сгенерировать», чтобы получить случайный цвет.', - 'Цвет отображается в форматах HEX, RGB и HSL одновременно.', - 'Нажмите на иконку копирования рядом с нужным форматом.', - ], - whenTo: [ - 'Поиск вдохновения для цветовой палитры.', - 'Случайный выбор цвета для дизайна или иллюстрации.', - 'Генерация тестовых данных с цветовыми значениями.', - ], - }, - password: { - howTo: [ - 'Задайте длину пароля с помощью ползунка.', - 'Выберите типы символов: заглавные, строчные, цифры, спецсимволы.', - 'Нажмите «Сгенерировать» — готовый пароль появится на экране.', - 'Нажмите на пароль, чтобы скопировать его.', - ], - whenTo: [ - 'Создание надёжного пароля для нового аккаунта.', - 'Генерация секретного ключа или токена.', - 'Регулярное обновление паролей для повышения безопасности.', - ], - }, - lottery: { - howTo: [ - 'Укажите диапазон чисел в полях «От» и «До».', - 'Задайте количество чисел для розыгрыша.', - 'Нажмите «Тянуть» — выпавшие числа появятся на экране.', - 'Нажмите «Копировать», чтобы сохранить результат.', - ], - whenTo: [ - 'Розыгрыш лотерейных номеров.', - 'Жеребьёвка участников конкурса.', - 'Случайный выбор нескольких уникальных чисел.', - ], - }, - dice: { - howTo: [ - 'Укажите количество кубиков (до 20).', - 'Выберите количество граней: d4, d6, d8, d10, d12, d20 или d100.', - 'Нажмите «Бросить» — результаты отобразятся мгновенно.', - 'Нажмите «Копировать», чтобы сохранить результат.', - ], - whenTo: [ - 'Броски в настольных ролевых играх (D&D и другие).', - 'Генерация случайных чисел для настольных игр.', - 'Проверка вероятностей и симуляции.', - ], - }, - cards: { - howTo: [ - 'Укажите количество карт для розыгрыша.', - 'Включите «Разрешить повторения», если нужны дубли.', - 'Нажмите «Тянуть» — карты появятся на экране.', - 'Нажмите «Копировать», чтобы скопировать результат.', - ], - whenTo: [ - 'Случайная раздача карт для карточных игр.', - 'Выбор случайных карт для гаданий.', - 'Генерация случайных комбинаций карт для тестирования.', - ], - }, - coin: { - howTo: [ - 'Выберите количество монет с помощью ползунка.', - 'Нажмите «Подбросить» — орёл или решка.', - 'При нескольких монетах отображается итоговый счёт.', - 'Нажмите «Копировать», чтобы сохранить результат.', - ], - whenTo: [ - 'Принятие решений по принципу «орёл или решка».', - 'Определение очерёдности в игре.', - 'Симуляция случайных событий с равной вероятностью.', - ], - }, - list: { - howTo: [ - 'Введите список элементов — по одному на строку.', - 'Укажите, сколько элементов выбрать.', - 'При необходимости разрешите повторения.', - 'Нажмите «Выбрать» — победители выделятся на экране.', - ], - whenTo: [ - 'Розыгрыш победителей конкурса.', - 'Случайное распределение задач между участниками команды.', - 'Выбор случайного варианта из списка.', - ], - }, - uuid: { - howTo: [ - 'Выберите тип: UUID v4, Hex или Base64.', - 'Для Hex и Base64 задайте длину в байтах.', - 'Укажите количество токенов.', - 'Нажмите «Сгенерировать» и скопируйте результат.', - ], - whenTo: [ - 'Генерация уникальных идентификаторов для баз данных.', - 'Создание токенов для API и сессий.', - 'Генерация случайных ключей шифрования.', - ], - }, - wheel: { - howTo: [ - 'Введите варианты в поле — по одному на строку (от 2 до 24).', - 'Колесо обновляется автоматически.', - 'Нажмите «Крутить» и дождитесь результата.', - 'Победитель выделяется — скопируйте его кнопкой «Копировать».', - ], - whenTo: [ - 'Случайный выбор победителя розыгрыша.', - 'Принятие решений в команде.', - 'Распределение ролей или задач между участниками.', - ], - }, -}; - -const seo = seoContent[slug] ?? { howTo: [], whenTo: [] }; ---- - - -
- - -
-
- - randify -
-

- Генератор {generator.ruTitle.toLowerCase()} -

-

{generator.ruDescription}

-
- -
- {slug === 'numbers' && } - {slug === 'colors' && } - {slug === 'password' && } - {slug === 'lottery' && } - {slug === 'dice' && } - {slug === 'cards' && } - {slug === 'coin' && } - {slug === 'list' && } - {slug === 'uuid' && } - {slug === 'wheel' && } -
- -
- -
- - -
-
diff --git a/src/pages/ru/generators/cards.astro b/src/pages/ru/generators/cards.astro new file mode 100644 index 0000000..3f5d976 --- /dev/null +++ b/src/pages/ru/generators/cards.astro @@ -0,0 +1,40 @@ +--- +import BaseLayout from '../../../layouts/BaseLayout.astro'; +import CardGenerator from '../../../components/generators/CardGenerator.astro'; +import AdBanner from '../../../components/AdBanner.astro'; +import SeoBlock from '../../../components/SeoBlock.astro'; +import { generators } from '../../../data/generators'; + +const generator = generators.find((g) => g.slug === 'cards')!; +--- + + +
+ +
+
+ + randify +
+

Генератор карт

+

{generator.ruDescription}

+
+
+
+ +
+
diff --git a/src/pages/ru/generators/coin.astro b/src/pages/ru/generators/coin.astro new file mode 100644 index 0000000..9399ebc --- /dev/null +++ b/src/pages/ru/generators/coin.astro @@ -0,0 +1,40 @@ +--- +import BaseLayout from '../../../layouts/BaseLayout.astro'; +import CoinGenerator from '../../../components/generators/CoinGenerator.astro'; +import AdBanner from '../../../components/AdBanner.astro'; +import SeoBlock from '../../../components/SeoBlock.astro'; +import { generators } from '../../../data/generators'; + +const generator = generators.find((g) => g.slug === 'coin')!; +--- + + +
+ +
+
+ + randify +
+

Подбросить монетку

+

{generator.ruDescription}

+
+
+
+ +
+
diff --git a/src/pages/ru/generators/colors.astro b/src/pages/ru/generators/colors.astro new file mode 100644 index 0000000..039f4ca --- /dev/null +++ b/src/pages/ru/generators/colors.astro @@ -0,0 +1,39 @@ +--- +import BaseLayout from '../../../layouts/BaseLayout.astro'; +import ColorGenerator from '../../../components/generators/ColorGenerator.astro'; +import AdBanner from '../../../components/AdBanner.astro'; +import SeoBlock from '../../../components/SeoBlock.astro'; +import { generators } from '../../../data/generators'; + +const generator = generators.find((g) => g.slug === 'colors')!; +--- + + +
+ +
+
+ + randify +
+

Генератор цветов

+

{generator.ruDescription}

+
+
+
+ +
+
diff --git a/src/pages/ru/generators/dice.astro b/src/pages/ru/generators/dice.astro new file mode 100644 index 0000000..7ff73ab --- /dev/null +++ b/src/pages/ru/generators/dice.astro @@ -0,0 +1,40 @@ +--- +import BaseLayout from '../../../layouts/BaseLayout.astro'; +import DiceGenerator from '../../../components/generators/DiceGenerator.astro'; +import AdBanner from '../../../components/AdBanner.astro'; +import SeoBlock from '../../../components/SeoBlock.astro'; +import { generators } from '../../../data/generators'; + +const generator = generators.find((g) => g.slug === 'dice')!; +--- + + +
+ +
+
+ + randify +
+

Бросить кубик онлайн

+

{generator.ruDescription}

+
+
+
+ +
+
diff --git a/src/pages/ru/generators/list.astro b/src/pages/ru/generators/list.astro new file mode 100644 index 0000000..00ef839 --- /dev/null +++ b/src/pages/ru/generators/list.astro @@ -0,0 +1,40 @@ +--- +import BaseLayout from '../../../layouts/BaseLayout.astro'; +import ListGenerator from '../../../components/generators/ListGenerator.astro'; +import AdBanner from '../../../components/AdBanner.astro'; +import SeoBlock from '../../../components/SeoBlock.astro'; +import { generators } from '../../../data/generators'; + +const generator = generators.find((g) => g.slug === 'list')!; +--- + + +
+ +
+
+ + randify +
+

Случайный выбор из списка

+

{generator.ruDescription}

+
+
+
+ +
+
diff --git a/src/pages/ru/generators/lottery.astro b/src/pages/ru/generators/lottery.astro new file mode 100644 index 0000000..6419aa5 --- /dev/null +++ b/src/pages/ru/generators/lottery.astro @@ -0,0 +1,40 @@ +--- +import BaseLayout from '../../../layouts/BaseLayout.astro'; +import LotteryGenerator from '../../../components/generators/LotteryGenerator.astro'; +import AdBanner from '../../../components/AdBanner.astro'; +import SeoBlock from '../../../components/SeoBlock.astro'; +import { generators } from '../../../data/generators'; + +const generator = generators.find((g) => g.slug === 'lottery')!; +--- + + +
+ +
+
+ + randify +
+

Генератор лотереи

+

{generator.ruDescription}

+
+
+
+ +
+
diff --git a/src/pages/ru/generators/numbers.astro b/src/pages/ru/generators/numbers.astro new file mode 100644 index 0000000..3a1871f --- /dev/null +++ b/src/pages/ru/generators/numbers.astro @@ -0,0 +1,41 @@ +--- +import BaseLayout from '../../../layouts/BaseLayout.astro'; +import NumberGenerator from '../../../components/generators/NumberGenerator.astro'; +import AdBanner from '../../../components/AdBanner.astro'; +import SeoBlock from '../../../components/SeoBlock.astro'; +import { generators } from '../../../data/generators'; + +const generator = generators.find((g) => g.slug === 'numbers')!; +--- + + +
+ +
+
+ + randify +
+

Генератор чисел

+

{generator.ruDescription}

+
+
+
+ +
+
diff --git a/src/pages/ru/generators/password.astro b/src/pages/ru/generators/password.astro new file mode 100644 index 0000000..e41ff34 --- /dev/null +++ b/src/pages/ru/generators/password.astro @@ -0,0 +1,40 @@ +--- +import BaseLayout from '../../../layouts/BaseLayout.astro'; +import PasswordGenerator from '../../../components/generators/PasswordGenerator.astro'; +import AdBanner from '../../../components/AdBanner.astro'; +import SeoBlock from '../../../components/SeoBlock.astro'; +import { generators } from '../../../data/generators'; + +const generator = generators.find((g) => g.slug === 'password')!; +--- + + +
+ +
+
+ + randify +
+

Генератор паролей

+

{generator.ruDescription}

+
+
+
+ +
+
diff --git a/src/pages/ru/generators/uuid.astro b/src/pages/ru/generators/uuid.astro new file mode 100644 index 0000000..d5c61b3 --- /dev/null +++ b/src/pages/ru/generators/uuid.astro @@ -0,0 +1,40 @@ +--- +import BaseLayout from '../../../layouts/BaseLayout.astro'; +import UuidGenerator from '../../../components/generators/UuidGenerator.astro'; +import AdBanner from '../../../components/AdBanner.astro'; +import SeoBlock from '../../../components/SeoBlock.astro'; +import { generators } from '../../../data/generators'; + +const generator = generators.find((g) => g.slug === 'uuid')!; +--- + + +
+ +
+
+ + randify +
+

Генератор UUID и токенов

+

{generator.ruDescription}

+
+
+
+ +
+
diff --git a/src/pages/ru/generators/wheel.astro b/src/pages/ru/generators/wheel.astro new file mode 100644 index 0000000..bafb5f3 --- /dev/null +++ b/src/pages/ru/generators/wheel.astro @@ -0,0 +1,40 @@ +--- +import BaseLayout from '../../../layouts/BaseLayout.astro'; +import WheelSpinner from '../../../components/generators/WheelSpinner.astro'; +import AdBanner from '../../../components/AdBanner.astro'; +import SeoBlock from '../../../components/SeoBlock.astro'; +import { generators } from '../../../data/generators'; + +const generator = generators.find((g) => g.slug === 'wheel')!; +--- + + +
+ +
+
+ + randify +
+

Колесо фортуны онлайн

+

{generator.ruDescription}

+
+
+
+ +
+