Работа языка вчера имела побочный эффект что я только заметила когда я открыла админ панель сегодня: список постов утроился. Каждый пост это теперь реальный ряд за язык под капотом, что права модель данных, но админ список показал всё из них. 34 поста, 102 ряда, и тот что я хотела редактировать похоронена между его собственных норвежских и испанских двойников. Это выглядело как беспорядок потому что это один был.
Исправление имеет две половины. Список теперь фильтрует на один язык по умолчанию (английский), поэтому каждый пост показывается раз, и каждый ряд несёт маленькую полоску чипов показывающую какие версии существуют и их статус. Зелёный чип, опубликовано. Серый чип, всё ещё черновик. Нажми на чип и ты приземляешься в том версии редакторе. Отфильтрованный выбор позволяет мне переключить весь список на норвежский, испанский, или старый все когда я действительно хочу.

Вторая половина внутри редактора. Маленький язык значок в углу стал выпадающим. Выбери язык что уже существует и ты прыгаешь прямо в ту версию. Выбери тот что не существует ещё и это создаёт предзаполненный черновик на месте и берёт тебя туда. Логика решения достаточно маленькая для тестирования как чистая функция:
export function resolveLanguageSwitch(
current: Language,
siblings: LanguageSwitchSibling[],
selected: Language
): LanguageSwitchResult {
if (selected === current) return { type: 'noop' };
const sibling = siblings.find((s) => s.language === selected);
return sibling ? { type: 'navigate', id: sibling.id } : { type: 'create' };
}Есть один race скрывающийся в том создать пути: если версия каким-то образом получает созданной между загрузкой страницы и выбором языка, создай запрос ответов 409. Первый инстинкт это показать ошибку, но от редактора клик означал «возьми меня к испанской версии», поэтому на 409 серверное действие просто смотрит вверх какой ряд выиграл и навигирует там вместо этого. Пользователь просил переключиться, поэтому переключись.
Чипы нужны небольшого бэкэнд прибавления тоже. Endpoint списка не имела идеи о родственниках, и спрашивание за ряд означало бы запрос за пост на каждой загрузке страницы. Вместо одного батча запроса получает каждого родственника поперёк весь групп перевода страницы за раз и обработчик складывает их в каждый ряд. Один дополнительный запрос всего, не тридцать.
Ревью поймало один реальный баг до слияния: нераспознанный язык в URL (говори старую закладку с ?language=de) правильно упали назад на английский для данных, но фильтра выпадающее было сказано сырое значение и молча десинхронизировалось от того что список действительно показывал. Одна строка, но точно вид лжи UI не должна говорить.
Честный остаток: редактор всё ещё имеет старую панель переводов ниже, сейчас избыточное рядом выпадающее. Это работает, это просто дублировано, и это может идти в позже очистку. Список, хотя, назад к 34 рядам, и грязная неделя где каждый пост существовал в тройне завершена.