# 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` у `` соответствует языку страницы. ## 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.