80 lines
7.2 KiB
Markdown
80 lines
7.2 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`.
|
||
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. Перенаправление на версию с префиксом — только при первом заходе на адрес без префикса, без cookie, и только если выбран не английский. Поисковых ботов не перенаправляем никогда: так рекомендует Google.
|
||
3. Переключатель языка ставит cookie `NEXT_LOCALE`. У вошедшего пользователя язык сохраняется ещё и в профиле: на нём уходят письма и сообщения бота.
|
||
4. Соответствие стран языкам по умолчанию: RU, BY, KZ, KG → ru; DE, AT → de; FR → fr; ES и страны Латинской Америки → es; остальные → en.
|
||
|
||
## 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 строк). Они ложатся в `ru.json` и `en.json` и в контент Payload.
|
||
2. Немецкий, французский, испанский — машинный перевод LLM с глоссарием на этапе 1h. Вычитки носителями нет, поэтому глоссарий и контекст обязательны.
|
||
3. В юридических текстах пункт: «При расхождениях между версиями действует английская».
|
||
4. Новая строка интерфейса: разработчик добавляет ключ в `en.json` и `ru.json`; de, fr, es переводятся пакетно перед выкладкой.
|
||
|
||
## 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 добавляются на этапе 1h.
|