- Новый порядок этапов (D-026): фаза 1 — концепт на dev без внешних сервисов (1b сайт, 1c вход, 1d ключи, 1e счёт и демо-оплата, 1f демо-выдача, 1g продления, 1h рефералы); фаза 2 — Telegram; фаза 3 — ALTCHA, ЮKassa, почта, Twenty, Chatwoot, Umami, выдача через API и публичный запуск; фаза 4 — звёзды и эквайринги. - Решения: демо-оплата по списку IP (D-027), выдача ключей через адаптер manual/demo/api (D-028), страницы сайта из блоков Payload (D-029), пересборка через revalidatePath (D-030), RU-адрес у mass (D-031), счётчик свободных серверов (D-032), переводы на 5 языков в каждом этапе (D-033). - Тексты описывают работающий продукт; Вейликс — выделенный IP на общем сервере; Telegram поддержки — @veilix_support; сроки ответа не обещаем; VPN-серверы не ведут журналов. - Ссылки на этапы во всех документах, Q-12 решён (ЮKassa для RUB), R-19 (библиотеки для headless Chromium) сделано. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
80 lines
8.0 KiB
Markdown
80 lines
8.0 KiB
Markdown
# 06. Языки и валюты на сайте
|
||
|
||
## 1. Языки
|
||
|
||
1. Сейчас: `en` (по умолчанию), `ru`, `de`, `fr`, `es`.
|
||
2. Позже: `pt-br` (бразильский португальский) и `ja`. Для японского понадобится запасной шрифт: Commissioner и Unbounded не содержат японских знаков.
|
||
3. Список языков задаётся в конфиге Payload и next-intl (код). У каждого домена в базе — включённые языки и язык по умолчанию.
|
||
4. Интерфейс админки — `ru` и `en`.
|
||
|
||
## 2. Два слоя переводов
|
||
|
||
| Что | Где | Кто правит |
|
||
|---|---|---|
|
||
| Интерфейс: кнопки, подписи, ошибки, сообщения форм | `src/i18n/messages/{en,ru,de,fr,es}.json`, next-intl | разработка, через git |
|
||
| Контент: тарифы, локации, FAQ, страницы, шаблоны писем, тексты бота | локализованные поля Payload | админка, без деплоя |
|
||
|
||
1. В коде компонентов нет строк на конкретном языке, только ключи переводов.
|
||
2. Нет перевода на языке — показывается английский. Отдельная проверка выводит список непереведённых ключей.
|
||
3. Множественные числа — ICU в next-intl: «12 серверов», «3 сервера», «1 сервер».
|
||
|
||
## 3. URL
|
||
|
||
1. Английский без префикса, остальные — с префиксом: `veilix.app/pricing`, `veilix.app/ru/pricing`, `veilix.app/de/pricing`. Точнее, без префикса открывается язык домена по умолчанию (`domains.defaultLocale`, сейчас везде en), а адрес с его префиксом (`/en/pricing`) перенаправляется на адрес без префикса.
|
||
2. Так же в кабинете: `my.veilix.app/keys`, `my.veilix.app/ru/keys`.
|
||
3. MiniApp: адрес в BotFather один, поэтому язык берётся из профиля пользователя или из Telegram; префикс в URL необязателен.
|
||
4. Пути одинаковые для всех языков (английские): `/pricing`, `/locations`, `/support`, `/legal/terms`, `/keys`, `/billing`, `/referral`, `/order`, `/login`.
|
||
5. Язык, не включённый на домене, — 404.
|
||
|
||
## 4. Определение языка
|
||
|
||
1. Порядок: язык из URL → выбранный ранее (cookie `NEXT_LOCALE`, у вошедшего — язык профиля) → язык браузера (`Accept-Language`) среди включённых → страна из заголовка nginx `X-Geo-Country` (MaxMind) → `en`.
|
||
2. Перенаправление на версию с префиксом — с адреса без префикса и только если выбран не язык домена по умолчанию ([D-024](decisions/D-024-locale-redirect.md)). Есть cookie `NEXT_LOCALE` — ведём на язык из cookie; cookie нет — определяем по языку браузера и стране. Перенаправляются только GET и HEAD. Поисковых ботов не перенаправляем никогда: так рекомендует Google.
|
||
3. Переключатель языка ставит cookie `NEXT_LOCALE`. У вошедшего пользователя язык сохраняется ещё и в профиле: на нём уходят письма и сообщения бота.
|
||
4. Соответствие стран языкам по умолчанию: RU, BY, KZ, KG → ru; DE, AT → de; FR → fr; ES и испаноязычные страны Латинской Америки → es (Бразилия — en, пока нет pt-br); остальные → en. Таблица — `src/core/routing/locale.ts`.
|
||
|
||
## 5. SEO
|
||
|
||
1. `hreflang` на все включённые языки и `x-default` на английскую версию.
|
||
2. `canonical` на основной домен.
|
||
3. `sitemap.xml` для каждого маркетингового домена с вариантами всех языков.
|
||
4. Кабинет и MiniApp не индексируются (`noindex`).
|
||
5. Атрибут `lang` у `<html>` соответствует языку страницы.
|
||
|
||
## 6. Валюта
|
||
|
||
1. Переключатель валюты отдельный от языка, стоит рядом с переключателем языка в шапке и подвале. В макете его нет — добавляется в стиле переключателя языка.
|
||
2. Валюта не определяется по стране: из России часто заходят через VPN.
|
||
3. По умолчанию — валюта домена для языка (`domains.localeCurrency`: ru → RUB), иначе `domains.defaultCurrency` (USD).
|
||
4. Выбор хранится в cookie `vx_currency`. Валюта не входит в URL: маркетинговые страницы заранее собраны во всех валютах, proxy выбирает вариант по cookie. Поисковые боты видят валюту по умолчанию.
|
||
5. Ссылка «Купить» передаёт валюту в оформление заказа (`?currency=`). У вошедшего пользователя в кабинете всегда валюта аккаунта ([04-billing.md](04-billing.md), раздел 2).
|
||
6. Форматирование — `Intl.NumberFormat` с узким символом валюты: «4 900 ₽» в русском, «₽4,900» в английском, «$49». Неразрывные пробелы ставит Intl. Даты — `Intl.DateTimeFormat`: «14 октября 2026».
|
||
|
||
## 7. Как переводим
|
||
|
||
1. Источник: русские тексты макетов и английские из словаря макета `design/handoff/project/i18n.js` (около 515 строк). Интерфейс ложится в `messages/*.json`, тексты страниц и остальной контент — в Payload ([D-029](decisions/D-029-pages-blocks.md)).
|
||
2. Немецкий, французский, испанский переводит Claude с глоссарием в каждом этапе, вместе с RU и EN ([D-033](decisions/D-033-translations.md)). Вычитки носителями нет, поэтому глоссарий и контекст обязательны. Финальная проверка — на публичном запуске (этап 3h).
|
||
3. В юридических текстах пункт: «При расхождениях между версиями действует английская».
|
||
4. Новая строка интерфейса или контента сразу появляется на 5 языках.
|
||
|
||
## 8. Глоссарий
|
||
|
||
| RU | EN | Примечание |
|
||
|---|---|---|
|
||
| Вейликс / ВейликсВПН | Veilix / VeilixVPN | не переводится |
|
||
| ключ | key | купленная единица доступа |
|
||
| локация | location | |
|
||
| тариф | plan | |
|
||
| подключение | connection | |
|
||
| устройство | device | |
|
||
| индивидуальный IP | dedicated IP | |
|
||
| RU-адрес | RU address | |
|
||
| баланс, счёт | balance | |
|
||
| пополнить | top up | |
|
||
| продление, автопродление | renewal, auto-renewal | |
|
||
| льготный период | grace period | |
|
||
| реферальная программа | referral program | |
|
||
| установим за 24 часа | ready within 24 hours | статус локации dedicated |
|
||
|
||
Колонки для de, fr, es добавляются на этапе 1b.
|