# sanity: Быстрый старт с Sanity
URL: https://generaltranslation.com/ru/docs/sanity/guides/quickstart.mdx
---
title: Быстрый старт с Sanity
description: Интегрируйте General Translation с Sanity CMS с помощью gt-sanity
---
**Предварительные требования:** Sanity Studio v5+, React 19+, существующий проект Sanity
**Требуются изменения в схеме и на фронтенде.** Каждый тип документа, который вы переводите, должен включать поле `language` в своей схеме — подробности см. в разделе [настройка поля language](/docs/sanity#language-field).
Переводы хранятся в виде отдельных документов, поэтому вам также потребуется обновить запросы на фронтенде, чтобы получать нужную языковую версию.
Примеры см. ниже в разделе [Запрос переведённого контента](#querying-translated-content).
## Установка
Установите пакет `gt-sanity` в каталоге студии Sanity:
```bash
npm install gt-sanity
```
```bash
yarn add gt-sanity
```
```bash
bun add gt-sanity
```
```bash
pnpm add gt-sanity
```
## Конфигурация
```typescript title="sanity.config.ts"
import { defineConfig } from 'sanity'
import { gtPlugin } from 'gt-sanity'
export default defineConfig({
// ... ваша текущая конфигурация
plugins: [
gtPlugin({
sourceLocale: 'en',
locales: ['es', 'zh', 'ja'], // Замените на целевые локали
translateDocuments: [{ type: 'article' }, { type: 'page' }], // Типы документов, для которых нужно включить переводы
})
]
})
```
Если указан `translateDocuments`, плагин автоматически добавляет возможности @sanity/document-internationalization: языковые бейджи, меню переводов в панели инструментов документа и шаблоны документов для каждого языка. Чтобы отключить это, задайте `showDocumentInternationalization: false`.
Каждый тип документа, который вы переводите, должен иметь поле `language`:
```typescript title="schema/article.ts"
import { defineField, defineType } from 'sanity'
export const articleType = defineType({
name: 'article',
title: 'Article',
type: 'document',
fields: [
// ... ваши существующие поля
defineField({
name: 'language',
type: 'string',
readOnly: true,
hidden: true,
}),
],
})
```
Если вы настроили пользовательское `languageField` в параметрах плагина, используйте это имя вместо `'language'`.
В папке Studio создайте файл `populateSecrets.js` со следующим содержимым:
```javascript title="populateSecrets.js"
import { getCliClient } from 'sanity/cli';
const client = getCliClient({ apiVersion: '2026-04-06' });
client.createOrReplace({
// `.` в этом _id гарантирует, что документ будет приватным
// даже в публичном датасете!
_id: 'generaltranslation.secrets',
_type: 'generaltranslationSettings',
secret: process.env.GT_API_KEY,
project: process.env.GT_PROJECT_ID,
});
```
Затем получите API-ключ для продакшена на [dash.generaltranslation.com](https://dash.generaltranslation.com).
Запустите скрипт, подставив свои учетные данные:
```bash
GT_API_KEY=your-api-key GT_PROJECT_ID=your-project-id npx sanity exec populateSecrets.js --with-user-token
```
Убедитесь, что документ был создан: откройте инструмент Vision в Studio и выполните запрос `*[_id == 'generaltranslation.secrets']`.
Примечание: если у вас несколько датасетов, это нужно сделать для каждого из них.
Если документ появился в вашем датасете или датасетах, удалите `populateSecrets.js`.
Эти учетные данные будут храниться в базе данных Sanity. По умолчанию они сохраняются в документе `generaltranslation.secrets`, который по умолчанию является приватным даже в публичном датасете.
Однако, если вас беспокоит, что они могут быть доступны аутентифицированным пользователям Studio, вы можете ограничить доступ к этому пути с помощью [ролевого управления доступом](https://www.sanity.io/docs/access-control).
Плагин автоматически добавляет действие **Translate** в каждый документ — оно открывает диалоговое окно. Если вам также нужна отдельная вкладка, добавьте компонент `TranslationsTab` в представления документа:
```typescript title="sanity.config.ts"
import { defineConfig } from 'sanity'
import { structureTool } from 'sanity/structure'
import { gtPlugin, TranslationsTab } from 'gt-sanity'
export default defineConfig({
// ... ваша конфигурация
plugins: [
structureTool({
structure: (S) =>
S.list()
.title('Content')
.items(S.documentTypeListItems()),
defaultDocumentNode: (S, { schemaType }) => {
return S.document().views([
S.view.form(),
S.view
.component(TranslationsTab)
.title('General Translation')
])
}
}),
gtPlugin({
sourceLocale: 'en',
locales: ['es', 'zh', 'ja']
})
]
})
```
## Использование
После настройки вы сможете переводить документы напрямую из Sanity Studio:
1. Откройте любой документ в Studio
2. Нажмите кнопку **Translate** на панели действий документа — откроется диалоговое окно
3. Выберите целевые языки
4. Нажмите **Generate Translations**, чтобы отправить контент на перевод
5. По умолчанию плагин автоматически импортирует переводы обратно в документ, как только они будут готовы.
6. Кроме того, импортированные документы будут автоматически проверяться на наличие ссылок на другие документы, а затем в них будут автоматически обновляться ссылки, чтобы они указывали на правильные переводы этих документов.
## Запрос переведённого контента
Плагин хранит переводы в виде отдельных документов с полем `language` (настраивается через [`languageField`](/docs/sanity/api/plugin-config)). Ваши существующие GROQ-запросы к исходному контенту продолжат работать без изменений.
Чтобы получить переведённый контент, добавьте фильтрацию по полю `language`:
Ваши существующие запросы остаются прежними — ничего менять не нужно:
```plaintext
// Получить все статьи (возвращает документы на исходном языке)
*[_type == "article"]{
title,
slug,
body
}
```
Чтобы получить переведённые документы, добавьте фильтр по `language`:
```plaintext
// Получить статьи на испанском языке
*[_type == "article" && language == "es"]{
title,
slug,
body
}
// Получить конкретную статью на определённом языке
*[_type == "article" && slug.current == "hello-world" && language == "es"][0]{
title,
body
}
// Получить статьи на любом языке
*[_type == "article"]{
title,
slug,
body,
language
}
```
У исходных документов по умолчанию поле `language` не задано. Чтобы запрашивать исходный контент вместе с переводами, можно отфильтровать документы, у которых `language` либо равно исходной локали, либо не задано: `language == "en" || !defined(language)`.
## Что дальше
* [Руководство по настройке](/docs/sanity/guides/configuration) - Настройка поведения плагина
* [Руководство по сериализации](/docs/sanity/guides/serialization) - Пользовательские правила сериализации
* [Справочник API](/docs/sanity/api/plugin-config) - Полный список параметров конфигурации