RU EN

printacopy

Дневник разработки

О проекте

Боль: надо быстро что-то распечатать, а принтера под рукой нет. Заводить принтер ради одной странички - нерентабельно. При этом вокруг полно мест, где стоят почти неиспользуемые принтеры — в офисах, коворкингах, кафе, у частных людей.

Отсюда появилась мысль: свести тех, кому нужно печатать, и тех, у кого есть принтер.

А дальше?

Сначала думал о приложении и сложной системе с регистрацией, но быстро пришли к пониманию, что это избыточно.

Главное сейчас — проверить спрос и собрать базу.

Поэтому идея упростилась до лендинга с формой, где можно оставить контакты:

Читать далее

Текущая реализация на: https://printacopy.pages.dev

Оглавление

Интеграция email и дополнительные функции

Что было

После создания базового лендинга нужно было добавить:

  • Многоязычность (русский, английский, немецкий)
  • Автодополнение городов
  • Интеграцию с email для отправки подтверждений
  • Улучшения UX (favicon, переключатель языков)

Решение

1. Многоязычность

Добавлена поддержка трёх языков (DE/EN/RU) с автоматическим определением языка по:

  • URL параметру (?lang=de)
  • Сохранённым настройкам в localStorage
  • Языку браузера
  • IP-адресу (через ipapi.co)
Language switcher (EN)
Language switcher (EN)
Переключатель языков (RU)
Переключатель языков (RU)

2. Автодополнение городов

Добавлен справочник из 80+ немецких городов с автодополнением при вводе. По умолчанию установлен город "Konstanz".

City autocomplete (EN)
City autocomplete (EN)
Автодополнение городов (RU)
Автодополнение городов (RU)

3. Интеграция с email через Cloudflare Worker + Resend

Реализована отправка email подтверждений через Cloudflare Worker с использованием Resend API:

  • В тестовом режиме все письма приходят на админский email
  • Админ получает уведомления о новых регистрациях со всеми данными для таблицы
  • Пользователю показывается алерт: "Мы получили твой email и свяжемся с тобой"
Email form (EN)
Email form (EN)
Форма отправки (RU)
Форма отправки (RU)

4. Дополнительные улучшения

  • Добавлен favicon (SVG с буквой "P")
  • Обновлены немецкие переводы (использование "ты" и безличных форм)
  • Добавлен динамический заголовок страницы в зависимости от языка

Почему такое решение

  • Cloudflare Worker + Resend: Простая настройка, бесплатный лимит 3,000 писем/месяц, не требует домена для тестового режима
  • Многоязычность через URL параметры: Простое решение без серверной логики, легко тестировать и деплоить
  • Автодополнение через datalist: Нативное HTML решение, не требует внешних библиотек

Плюсы

  • ✅ Полная многоязычность без дополнительных зависимостей
  • ✅ Работающая интеграция с email (тестовый режим)
  • ✅ Улучшенный UX (автодополнение, favicon, переключатель языков)
  • ✅ Автоматическое определение языка пользователя
  • ✅ Все данные сохраняются для последующей ручной рассылки

Минусы

  • ❌ В тестовом режиме Resend письма не отправляются пользователям (только админу)
  • ❌ Для продакшена нужно верифицировать домен в Resend
  • ❌ Нет автоматической рассылки пользователям (нужно вручную)

Подводные камни

  • Resend в тестовом режиме ограничивает отправку только на верифицированный email
  • Решение: пока все письма приходят админу, который собирает данные в таблицу для ручной рассылки
  • IP-определение языка может быть неточным, поэтому используется каскад: URL → localStorage → браузер → IP → дефолт (DE)

Что сделано

  • Добавлена поддержка трёх языков (DE/EN/RU)
  • Реализован переключатель языков (dropdown)
  • Добавлено автоматическое определение языка
  • Реализовано автодополнение городов (80+ немецких городов)
  • Установлен город "Konstanz" по умолчанию
  • Интегрирован Cloudflare Worker для отправки email
  • Настроен Resend API для отправки писем
  • Добавлен favicon
  • Обновлены переводы (немецкий на "ты"/безличные формы)
  • Динамический заголовок страницы

Что было

Нужно было создать простой статический сайт-лендинг, который продаёт идею сервиса обеим сторонам (пользователям и владельцам принтеров).

Решение

Создан одностраничный лендинг с 4 основными блоками:

  • Хедер с призывом к действию и двумя кнопками
Главная страница (RU)
Главная страница (RU)
Main page (EN)
Main page (EN)
  • Блок для пользователей (форма: город + email + загрузка файла)
Блок для пользователей (RU)
Блок для пользователей (RU)
User section (EN)
User section (EN)
  • Блок для владельцев принтеров (форма: имя + email + город + чекбокс цветного принтера)
Блок для владельцев принтеров (RU)
Блок для владельцев принтеров (RU)
Printer section (EN)
Printer section (EN)
  • Блок "Как это работает" с простой схемой процесса
Как это работает (RU)
Как это работает (RU)
How it works (EN)
How it works (EN)

Мобильная версия:

Мобильная версия (RU)
Мобильная версия (RU)
Mobile view (EN)
Mobile view (EN)

Почему такое решение

  • Статический сайт без зависимостей — быстрая загрузка и простота деплоя
  • Vanilla JavaScript и CSS — нет необходимости в сборке, можно открыть файл напрямую
  • LocalStorage для хранения данных форм — позволяет протестировать функционал без бэкенда
  • Адаптивный дизайн — работает на всех устройствах
  • Современный UI с градиентами и анимациями — привлекательный внешний вид

Плюсы

  • ✅ Быстрая разработка и деплой
  • ✅ Нет зависимостей, нет build процесса
  • ✅ Можно открыть файл напрямую в браузере для тестирования
  • ✅ Легко кастомизировать и изменять
  • ✅ Хорошая производительность (маленький размер файлов)

Минусы

  • ❌ Данные форм хранятся только локально (в LocalStorage браузера)
  • ❌ Нет реальной отправки данных на сервер
  • ❌ Нет валидации на стороне сервера
  • ❌ Нет защиты от спама

Подводные камни

  • Учли, что это MVP для демонстрации идеи, а не полноценный продукт
  • Формы работают "фейково" — показывают alert и сохраняют в LocalStorage
  • В будущем нужно будет добавить бэкенд для реальной обработки данных
  • Сделали адаптивный дизайн с самого начала, чтобы не переделывать позже

Что сделано

  • Создан одностраничный лендинг (index.html)
  • Реализованы все 4 блока согласно требованиям
  • Добавлены две рабочие формы (для пользователей и владельцев принтеров)
  • Реализован адаптивный дизайн для мобильных устройств
  • Добавлена плавная прокрутка к секциям
  • Формы сохраняют данные в LocalStorage (демо-режим)
  • Современный UI с градиентами и анимациями