блог теперь говорит на трёх языках

7 сентября 2026 г. goi18nsvelte

Если ты смотришь в адресную строку прямо сейчас есть язык код в нём. Это новое. Весь блог сейчас существует в английском, норвежском и испанском: каждый пост, каждая страница, навигация, сообщения об ошибках, даты. Это была самая большая единственная замена со времени переоформления, и она коснулась почти каждого файла во фронтенде плюс модель содержимого в блог сервисе.

Форма это: каждый публичный URL носит префикс языка, /en, /no или /es. Визит без одного и сервер понимает куда отправить тебя, сначала из cookie если ты выбрал язык раньше, потом из заголовка Accept-Language браузера, потом английский как fallback:

const lang = resolveLanguage(
    event.cookies.get(LANG_COOKIE),
    event.request.headers.get('accept-language')
);
event.locals.lang = lang;
throw redirect(302, `${localizedPath(pathname, lang)}${event.url.search}`);

Твой явный выбор всегда бьёт браузер угадай. Выбери испанский один раз и блог остаётся испанским пока ты не скажешь иное, независимо что твой браузер утверждает ты предпочитаешь.

Содержимое было больший вопрос. Машинный перевод на лету никогда не был на столе (это самостоятельный блог, ничто не покидает коробку), поэтому каждый пост это реальный ряд за язык, и версии связаны в группу перевода. Каждая версия публикуется на её собственном расписании, имеет её собственное тело, и делит slug со своим родственниками, поэтому переключение языка на посте берёт тебя в тот же самый пост, не на переведённую переднюю страницу. Переключатель инертен когда перевод не существует ещё, вместо сбрасывания тебя на 404.

Передняя страница в норвежском, переключатель языка в направляющей

Потом пришло интересный разлом. Движение каждого маршрута под префиксом языка молча сломало что-то что имело ничего общего с языками: лимит загрузки аватара. Caddy сидит впереди всего с пределами размера тела за путь, и его правило для /profile больше не совпадает потому что страница профиля сейчас живёт в /en/profile. Загрузки над дефолтным лимитом начали умирать в передней двери с пустой 413 вместо дружественной ошибки. Исправление это одна строка matcher покрывающая все префиксы, но урок больше: когда ты движешь каждый URL на сайте, grep твою конфиг обратного прокси для путей тоже.

Ревью поймало два ещё реальных. Список тегов в боковой панели считал посты во всех языках, поэтому норвежский сайт показывал теги что привели к пустым страницам (запросы теперь фильтр по языку). И проверка уникальности slug смотрела через все языки когда она должна только смотреть в одну, что заблокировало бы идеально валидные переводы от сохранения.

Перевод интерфейса был несколько дней аккуратной работы с каталогом сообщений 132-ключей что проверитель типа заставляет, поэтому строка отсутствующая в испанском это ошибка построения, не пустая кнопка. Перевод содержимого была честная физическая работа: 34 поста и 3 страницы, каждое переписано дважды. Страницы архива, feeds и sitemap все говорят за язык тоже, с hreflang ссылками поэтому поисковые движки понимают версии принадлежат вместе.

Добро пожаловать, и добро пожаловать. Переключатель в направляющей если ты хочешь видеть как пост про норвежский остров читает в норвежском.

0 комментариев

Войдите , чтобы оставить комментарий.

Войти

Забыли пароль?

Нет аккаунта?