пять языков
Блог теперь говорит по-китайски и по-русски. Точнее, говорит его «обстановка»: навигация, кнопки, формы, подвалы страниц, всё это, под /zh и /ru. Сами посты подтянутся следом, по мере того как я буду их переводить, а это честная работа, которую я не собираюсь гнать.

Главная страница на русском. Тот же остров, новые слова.
Переход с трёх языков на пять заставил меня сделать уборку, которую я давно откладывал. Списки языков незаметно расползлись: один в роутинге, один в переключателе, один в форматировании дат, один в карте сайта. Теперь есть один общий реестр, и всё остальное берётся из него. Я доказал это себе тестом, который выдумывает несуществующий шестой язык и проверяет, что роутинг, переключатель, цели перевода и карта сайта подхватывают его без каких-либо других правок. Добавить язык номер шесть будет означать одну запись в реестре и один файл строк.
Переключатель тоже пришлось менять. Три языка ещё помещались ссылками в боковой панели, пять уже начинают выглядеть как записка с требованием выкупа. Теперь это выпадающий список, на том же месте, каждый язык написан на своём собственном языке: English, norsk, español, 中文, русский. Выбираешь язык, на котором существует текущая страница, и попадаешь именно на эту версию; выбираешь тот, на котором её нет, и попадаешь на главную страницу этого языка вместо 404.
У отсутствующих переводов есть мягкая посадка и в других местах. Страница политики конфиденциальности под /ru показывает английский текст внутри русскоязычной обвязки, пока я не напишу русский вариант, а это лучше, чем страница ошибки на любом языке.
А чтобы не запутаться, в админке появился новый раздел «Языки»: сетка всех страниц сайта против всех языков, показывающая, что есть, а чего не хватает. Пустая ячейка даёт мне две кнопки: перевести или создать на основе английской версии как отправной точки, так что я переписываю текст, а не смотрю на пустое поле. Посты в эту сетку намеренно не попадают, их я перевожу по одному прямо в редакторе, когда пост этого заслуживает.
Реестр, на котором всё держится:
const LANGUAGE_REGISTRY = [
{ code: 'en', nativeName: 'English', locale: 'en-US' },
{ code: 'no', nativeName: 'norsk', locale: 'nb-NO' },
{ code: 'es', nativeName: 'español', locale: 'es-ES' },
{ code: 'zh', nativeName: '中文', locale: 'zh-CN' },
{ code: 'ru', nativeName: 'русский', locale: 'ru-RU' }
] as const;
export type Language = (typeof LANGUAGE_REGISTRY)[number]['code'];Шрифты оказались самой лёгкой частью: приличные резервные шрифты для CJK и кириллицы на месте, а засечный стиль по-прежнему держится. Теперь дело за малым: осталось наполнить полки книгами.