# sanity: Конфигурация
URL: https://generaltranslation.com/ru/docs/sanity/guides/configuration.mdx
---
title: Конфигурация
description: Настройка плагина gt-sanity для проекта Sanity
---
## Обзор
Функция `gtPlugin` принимает объект конфигурации для настройки поведения перевода, параметров локали и обработки документов.
```typescript title="sanity.config.ts"
import { gtPlugin } from 'gt-sanity';
export default defineConfig({
plugins: [
gtPlugin({
sourceLocale: 'en',
locales: ['es', 'zh', 'ja'], // Замените на целевые локали вашего проекта
languageField: 'language',
singletons: ['siteSettings', 'navigation'],
}),
],
});
```
## Базовая настройка
### Исходная и целевые локали
Укажите исходный язык и целевые локали:
```typescript
gtPlugin({
sourceLocale: 'en', // Исходный язык контента
locales: ['es', 'zh', 'ja'], // Целевые языки для перевода
});
```
### Использование `defaultLocale` из `gt.config.json`
Если у вас уже есть `gt.config.json` (например, если вы используете `gt-next` или `gt-react`), вы можете напрямую передать его в конфигурацию плагина через оператор расширения. Поле `defaultLocale` принимается как псевдоним для `sourceLocale`:
```typescript
import gtConfig from './gt.config.json';
gtPlugin({
...gtConfig, // { defaultLocale: 'en', locales: ['es', 'zh', 'ja'] }
});
```
Если указаны и `sourceLocale`, и `defaultLocale`, приоритет отдается `sourceLocale`.
### Поле локали
Укажите, в каком поле хранится локаль документа. По умолчанию — `'language'`:
```typescript
gtPlugin({
sourceLocale: 'en',
locales: ['es', 'zh', 'ja'],
languageField: 'locale', // По умолчанию документы используют поле 'language'. Здесь мы используем поле 'locale'.
});
```
## Фильтрация документов
### Перевод определённых типов документов
Переводите только документы определённых типов:
```typescript
gtPlugin({
sourceLocale: 'en',
locales: ['es', 'zh', 'ja'],
translateDocuments: [{ type: 'page' }, { type: 'post' }],
});
```
### Перевод отдельных документов
Укажите идентификаторы нужных документов:
```typescript
gtPlugin({
sourceLocale: 'en',
locales: ['es', 'zh', 'ja'],
translateDocuments: [
{ documentId: 'homepage' },
{ documentId: 'about-page' },
],
});
```
## Документы-синглтоны
Документы-синглтоны — это документы Sanity, существующие в единственном экземпляре и имеющие переведённые варианты. Настройте, как именуются переведённые версии:
```typescript
gtPlugin({
sourceLocale: 'en',
locales: ['es', 'zh', 'ja'],
singletons: ['siteSettings', 'navigation', 'footer'], // Список идентификаторов документов-синглтонов
singletonMapping: (docId, locale) => `${docId}-${locale}`, // Необязательная функция для настройки идентификаторов переведённых документов-синглтонов
});
```
По умолчанию у переводов для документов-синглтонов будут случайно сгенерированные идентификаторы, если не задан `singletonMapping`.
## Исключение полей
Поля, которые не нужно переводить или отправлять в API GT, но которые всё равно должны копироваться из исходного документа в перевод. Игнорируемые поля удаляются перед сериализацией (то есть содержимое никогда не отправляется в API), а затем восстанавливаются из исходного документа после создания переведённого документа.
Используйте `ignoreFields` для таких полей, как категории, теги или внутренние метаданные, которые должны иметь одинаковые значения в исходном и переведённом документах, но не требуют перевода:
```typescript
gtPlugin({
sourceLocale: 'en',
locales: ['es', 'zh', 'ja'],
ignoreFields: [
{ fields: [{ property: '$.category' }] }, // одна категория для всех языков
{ fields: [{ property: '$..linkType' }] }, // внутренние метаданные ссылок
{ fields: [{ property: '$..frequencies.default' }] },
],
});
```
`property` — это выражение [JSONPath](https://goessner.net/articles/JsonPath/), которое соответствует одному или нескольким полям в документах.
`type` — необязательный параметр для дополнительной фильтрации игнорируемых полей по определённым типам.
## Дедупликация полей
Поля, которые не нужно переводить или отправлять в API GT, но при этом нужно копировать из исходного документа и делать уникальными при первом создании переведённого документа. Поля, указанные в дедупликации, удаляются перед сериализацией, а затем восстанавливаются из исходного документа с добавлением целевой локали.
Используйте `dedupeFields` для slug в Sanity и других строковых идентификаторов, которые должны сохранять исходное значение, но при этом быть уникальными для каждого языка:
```typescript
gtPlugin({
sourceLocale: 'en',
locales: ['es', 'zh', 'ja'],
dedupeFields: [
{ fields: [{ property: '$.slug', type: 'slug' }] }, // "about" становится "about-es"
],
});
```
Для полей slug в Sanity plugin обновляет значение `current` у объекта slug. Например, `{ _type: 'slug', current: 'about' }` превращается в `{ _type: 'slug', current: 'about-es' }` при создании документа на испанском языке. Если редактор позже изменит переведённый slug, при последующих импортах перевода это изменённое значение будет сохранено.
## Пропуск полей
Поля, которые вообще не должны автоматически копироваться в переводы. В отличие от `ignoreFields` (который сохраняет исходное значение в переводе), `skipFields` полностью удаляет совпадающие поля из переведённого документа.
Используйте `skipFields` для таких полей, как канонические URL для SEO, метаданные, относящиеся только к исходному документу, или slug, которые редакторы должны задавать вручную для каждого языка:
```typescript
gtPlugin({
sourceLocale: 'en',
locales: ['es', 'zh', 'ja'],
skipFields: [
{ fields: [{ property: '$.slug', type: 'slug' }] }, // редакторы задают слаги вручную для каждого языка
{ fields: [{ property: '$.canonicalUrl' }] }, // only relevant on source
{
documentId: 'homepage',
fields: [{ property: '$.debugInfo' }], // source-only debug data
},
],
});
```
## Параметры сериализации
Расширьте стандартное поведение сериализации:
```typescript
import { attachGTData, gtPlugin } from 'gt-sanity';
gtPlugin({
sourceLocale: 'en',
locales: ['es', 'zh', 'ja'],
additionalSerializers: {
// Дополнительные сериализаторы для marks (пользовательские аннотации)
marks: {
link: ({ value, children }) =>
attachGTData(`${children}`, value, 'markDef'),
inlineMath: ({ value, children }) =>
attachGTData(`${children}`, value, 'markDef'),
},
},
});
```
Подробности см. в [Руководстве по сериализации](/docs/sanity/guides/serialization).
## Полный пример
```typescript title="sanity.config.ts"
import { defineConfig } from 'sanity';
import { gtPlugin } from 'gt-sanity';
export default defineConfig({
name: 'default',
title: 'My Project',
projectId: 'your-project-id',
dataset: 'production',
plugins: [
gtPlugin({
sourceLocale: 'en',
locales: ['es', 'fr', 'de', 'ja', 'zh'],
languageField: 'language',
singletons: ['siteSettings', 'navigation'],
translateDocuments: [{ type: 'article' }, { type: 'page' }],
ignoreFields: [
{
fields: [{ property: '$.publishedAt' }],
},
],
dedupeFields: [
{
fields: [{ property: '$.slug', type: 'slug' }],
},
],
skipFields: [
{
fields: [{ property: '$.internalNotes' }],
},
],
}),
],
schema: {
types: schemaTypes,
},
});
```
## Что дальше
* [Руководство по сериализации](/docs/sanity/guides/serialization) - Настраиваемые правила сериализации
* [Справочник API](/docs/sanity/api/plugin-config) - Полный список параметров конфигурации