Многоязычный центр помощи без пустых страниц

Product

Центр помощи в проекте Kookee мог быть на английском и немецком, а готовый портал всё равно показывал каждую страницу на английском. Немецкие статьи были в проекте, и API вернул бы их. Портал их не запрашивал.

Переключатель языков в шапке портала только добавлял путаницы. Это был переключатель интерфейса самого Kookee, с шестью языками, на которые переведены его кнопки. Если выбрать Deutsch, меню становились немецкими, а все статьи оставались английскими. Проект на итальянском получал переключатель, в котором не было итальянского.

Я наткнулся на это, когда переносил баннер объявлений портала в @kookee/react, и исправил в том же релизе — Kookee 1.29.0.

У каждого языка свой адрес

Если читатель хочет отправить немецкую страницу коллеге, у неё должен быть немецкий адрес. Я добавил язык в путь, а язык по умолчанию оставил без него. На демо-портале Lumen, где есть английский и немецкий, это выглядит так:

text
lumen.kookee.dev/help/getting-started/invite-your-team       английский, по умолчанию
lumen.kookee.dev/de/help/erste-schritte/dein-team-einladen   немецкий
lumen.kookee.dev/en/help/getting-started/invite-your-team    → /help/getting-started/invite-your-team
lumen.kookee.dev/fr/help/getting-started/invite-your-team    → /help/getting-started/invite-your-team
lumen.kookee.dev/de/help/getting-started/invite-your-team    → /de/help/erste-schritte/dein-team-einladen

У языка по умолчанию нет сегмента, потому что все прежние ссылки на портал вели на язык по умолчанию: ссылки в письмах, в старых постах, в ответах Kookee по MCP и в данных вебхуков. Они работают и ведут туда же, куда раньше, а Kookee и сейчас собирает ссылки так же.

Редиректы оставляют у каждой страницы один адрес. /en/ в проекте, где английский — язык по умолчанию, ведёт на адрес без сегмента. То же происходит с языком, которого в проекте нет или который из него потом убрали: ссылка с /fr/, отправленная до того, как французский убрали, открывает английскую страницу, а не 404. А английский slug под /de/ — такой адрес получится, если поставить /de перед английской ссылкой, — ведёт на собственный slug немецкой статьи.

Если перевода нет, статья открывается на языке по умолчанию

В центре помощи Lumen 12 статей на английском. Три из них, из раздела Getting started, есть и на немецком. Читатель из Германии открывает lumen.kookee.dev/de/help.

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

Мог бы показать их с пометкой «ещё не переведено». Я думал об этом и отказался: читатель и так видит, что статья на английском.

Или мог бы показать английскую статью по немецкому адресу, без пометки, как уже делали API Kookee и виджет для сайта. Теперь портал так и делает. В карточках категорий на /de/help стоит Erste Schritte, немецкая версия Getting started, а рядом — Dashboards, Billing и Guides, которые есть только на английском:

Категории центра помощи на lumen.kookee.dev/de/help: немецкая категория Erste Schritte рядом с Dashboards и Billing, которые есть только на английском

Статья, которая есть только на английском, открывается оттуда по адресу с /de/: в переключателе по-прежнему Deutsch, и по следующей ссылке читатель тоже остаётся под /de/.

Английская статья «Build a retention chart» по немецкому адресу, в переключателе языков выбран Deutsch

У самой статьи стоит lang="en", поэтому скринридер читает её английским голосом, а не произносит английские слова по немецким правилам. Для арабского и иврита статья ещё и получает направление справа налево.

То же правило действует на всём портале. В списках блога, журнала изменений и страниц записи показаны на языке читателя, если перевод есть, и на языке по умолчанию, если его нет. Категории центра помощи связаны между языками, поэтому непереведённая статья открывается внутри немецкой версии своей категории. Поиск ищет сначала на языке страницы, потом на языке по умолчанию.

Почему kookee.dev, наоборот, скрывает непереведённые посты

Мой собственный блог работает наоборот. kookee.dev/de/blog показывает только посты, которые есть на немецком, а немецкая ссылка на пост, который есть только на английском, перенаправляет на английскую страницу.

Всё дело в поисковиках. kookee.dev индексируется, и английская статья по немецкому адресу — это второй URL с тем же текстом. Я предпочитаю давать Google один адрес на один текст. Порталы отдают X-Robots-Tag: noindex, поисковики их страницы не индексируют, а читателю статья на языке по умолчанию полезнее пустого места.

Переключатель языков показывает только ваши языки

Теперь в переключателе языки проекта, каждый под своим названием: Deutsch, Italiano, 日本語. Если выбрать язык, откроется та же страница на нём: перевод статьи, если он есть, или та же статья под новым сегментом, если перевода нет.

Шапка портала на lumen.kookee.dev/de/help с открытым переключателем языков: English и Deutsch

В проекте с одним языком переключателя нет совсем. Языки проекта задаются в разделе Настройки → Проект, в поле Поддерживаемые языки, и как только их становится два, переключатель появляется в шапке, в мобильном меню и в подвале.

Переключатель интерфейса самого Kookee я с порталов убрал совсем. Портал принадлежит проекту, и читатель, который видит там шесть языков, будет ждать статьи на шести. Кнопки и меню по-прежнему следуют последнему выбору читателя или языку браузера, а иначе остаются английскими. Если выбрать язык контента, на который переведён и интерфейс Kookee (английский, русский, испанский, французский, португальский или немецкий), кнопки тоже переключатся. А с итальянским они останутся как были.

Редиректа по языку браузера нет. Читатель, у которого браузер на немецком, попадает на lumen.kookee.dev/help и видит английскую версию с переключателем в шапке.

Что ещё изменилось на портале

  • Виджет для сайта на портале показывает статьи центра помощи и ответы на языке страницы. Раньше он следовал языку интерфейса и мог показать немецкую справку рядом с английской страницей.

  • Баннер объявлений показывает объявления на языке страницы.

  • Главная страница портала считает статью и её переводы за одну статью. Раньше каждый язык считался отдельно.

  • На переведённой странице кнопка Пожаловаться на эту страницу теперь отправляет жалобу на статью. Раньше жалоба уходила на проект целиком.

Без изменений: теги блога и hreflang

Счётчик тега в блоге портала по-прежнему учитывает все языки. Ссылок hreflang и карт сайта у порталов нет, потому что поисковики их не индексируют.

Как пользоваться публичным порталом — про адреса портала, переключатель и редиректы, а Многоязычный контент и подстановка языка по умолчанию — про ту же подстановку через SDK, для центра помощи на вашем сайте.

Читайте также