# sanity: Sanity 快速入门 URL: https://generaltranslation.com/zh/docs/sanity/guides/quickstart.mdx --- title: Sanity 快速入门 description: 使用 gt-sanity 将 General Translation 集成到 Sanity CMS --- **前提条件:** Sanity Studio v5+、React 19+、现有的 Sanity 项目 **需要修改 schema 和前端。** 您要翻译的每种文档类型都必须在其 schema 中包含一个 `language` 字段——详见 [language 字段设置](/docs/sanity#language-field)。 翻译内容会作为独立文档存储,因此您还需要更新前端查询,以获取正确的语言版本。 示例请参见下方的[查询翻译内容](#querying-translated-content)。 ## 安装 在 Sanity Studio 目录中安装 `gt-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 的相关功能:语言徽章、文档工具栏中的翻译菜单,以及各语言的文档 template。将 `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, }); ``` 接下来,在 [dash.generaltranslation.com](https://dash.generaltranslation.com) 获取生产环境 API 密钥。 使用你的凭据运行该脚本: ```bash GT_API_KEY=your-api-key GT_PROJECT_ID=your-project-id npx sanity exec populateSecrets.js --with-user-token ``` 在 Studio 中使用 Vision Tool 验证文档是否已创建,并查询 `*[_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) - 完整的配置选项