Diil Docs
  1. Документация
  2. Справочник API

GET /v1/langs — языки сайта

Обновлено:

Самый маленький запрос в API — и именно его ждёт ваш переключатель языка. Он отвечает на один вопрос: «на каких языках сайт говорит прямо сейчас?» — и перечисляет их ровно в том порядке, в каком их расставили редакторы в CRM.

Он пригодится, когда нужно:

  • показать переключатель языка в шапке, не прописывая en и de руками в пяти местах;
  • убедиться, что язык из адреса (/de/pricing) вообще существует, прежде чем отправлять его в ?lang;
  • собрать адреса страниц на каждом языке, теги hreflang или карту сайта.

Список активных языков

GET/v1/langs

https://back.sitecog.com/content/v1/langs

Возвращает массив активных языков сайта в том порядке, в каком они стоят в CRM. Выключенных языков здесь нет — и если кода нет в этом списке, в ?lang API его тоже не примет.

Параметры

Настраивать нечего: ни параметров пути, ни параметров строки запроса. Только ключ.

x-crm-keyheaderstringобязательно
Ключ сайта. Ключ привязан к одному сайту, поэтому в ответе всегда языки этого сайта. Если заголовок передать нельзя, подойдёт ?key=. Подробнее — в разделе Ключ сайта.

Пример запроса

curl https://back.sitecog.com/content/v1/langs \
  -H "x-crm-key: pk_3f9c2a7e1b4d4c0e8a6f5b2d9c1e7a40"

Пример ответа

200 OKjson
[
  { "key": "en", "title": "English", "index": 0 },
  { "key": "de", "title": "German", "index": 1 }
]

Поля ответа

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

keystring
Код языка: две строчные латинские буквы (en, de) или региональный вариант вроде pt-BR. Именно это значение передаётся в ?lang. Регистр важен: pt-BR и pt-br — разные коды.
titlestring
Название языка в том виде, в каком его вписали в CRM. Хотите, чтобы в переключателе было «Deutsch», а не «German»? Переименуйте язык в CRM — выкладка не понадобится.
indexnumber
Место языка в списке CRM, с нуля. Массив уже отсортирован по нему, так что сортировать самим почти никогда не нужно.

Переключатель языка на React

Обычная схема такая: язык живёт в адресе (/en/…, /de/…), переключатель строится по /v1/langs, а каждый запрос за контентом получает тот же код в ?lang. Вот переключатель, который ничего не знает о конкретных языках: добавите завтра в CRM итальянский — он просто появится.

components/LangSwitcher.tsxtsx
type Lang = { key: string; title: string; index: number };

export function LangSwitcher({ langs, current, path }: {
  langs: Lang[];      // прямо из GET /v1/langs
  current: string;    // язык открытой страницы
  path: string;       // остаток адреса, например "/pricing"
}) {
  return (
    <nav aria-label="Язык">
      {langs.map((lang) => (
        <a
          key={lang.key}
          href={`/${lang.key}${path}`}
          hrefLang={lang.key}
          aria-current={lang.key === current ? 'true' : undefined}
        >
          {lang.title}
        </a>
      ))}
    </nav>
  );
}

Связка с ?lang

Код отсюда — тот самый код, который вы отправляете во все остальные запросы. Сначала сверьте язык из адреса со списком: незнакомый код в ?lang — это 400 unknown_lang, а показывать страницу ошибки только потому, что кто-то вручную набрал /fr/, никому не хочется.

app/[lang]/page.tsxtsx
import { notFound } from 'next/navigation';
import { getLangs } from '@/lib/langs';
import { LangSwitcher } from '@/components/LangSwitcher';

export default async function Home({ params }: { params: Promise<{ lang: string }> }) {
  const { lang } = await params;
  const langs = await getLangs();

  // Незнакомый язык в адресе → обычная 404 вместо 400 от API
  if (!langs.some((l) => l.key === lang)) notFound();

  const res = await fetch(`https://back.sitecog.com/content/v1/pages/home?lang=${lang}`, {
    headers: { 'x-crm-key': process.env.CRM_KEY! },
    next: { revalidate: 60 },
  });
  const page = await res.json();

  return (
    <>
      <LangSwitcher langs={langs} current={lang} path="" />
      <h1>{page.content.hero.content.hero_title.content[lang]}</h1>
    </>
  );
}

Какой язык показать тем, кто зашёл просто на /, — решать вам; многие сайты берут первый язык из списка. Сам API язык за вас не выбирает и недостающий перевод ничем не подменяет. Как аккуратно закрывать такие дыры, рассказано в разделе Языки и запасной язык.

Ошибки

СтатусТело ответаЧто случилось
401{"message":"invalid_key"}Ключа нет, он неправильного вида или отозван.
405{"message":"method_not_allowed"}Принимаются только GET (и HEAD): API работает только на чтение.
429{"message":"rate_limit_exceeded"}Слишком много запросов за эту минуту. См. Лимиты.

Полный список с подсказками, что делать, — на странице Ошибки.

Советы из практики