# General Translation Integrations: 管理翻译
URL: https://generaltranslation.com/zh/docs/integrations/sanity/guides/managing-translations.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: 如何导入、修复引用、批量发布以及管理 Sanity 翻译的字段行为。

完成设置后，您可以使用插件的翻译工具来管理已生成的 Sanity 翻译。

本指南涵盖全站范围的 **Translations** 工具、引用修复、批量发布、字段行为以及自定义序列化。

## 使用 Translations 工具 [#translations-tool]

该插件会注册一个全站范围的 **Translations** 工具，列出所有可翻译的文档。你可以在这里：

* 为所有文档生成翻译 (**Translate All**) 。
* 在后续运行前保留当前的 Sanity 翻译 (**Save local edits**) 。
* 将当前的 Sanity 翻译发送到 General Translation，而不启动运行 (**Save Local Edits**) 。
* 导入所有已就绪的翻译，并覆盖现有内容 (**Import All**) 。
* 仅导入尚未记录到源文档元数据中的翻译 (**Import Missing**) 。
* 修复翻译后的文档之间的引用 (**Patch References**) 。
* 发布其源文档已发布的翻译后的文档 (**Publish Translations**) 。

默认开启自动刷新和自动导入。自动修复和自动发布默认关闭。对这些开关及 **Save local edits** 所做的更改会保存在当前 Sanity 项目和数据集的浏览器存储中。

*注意：**Import Missing**、**Patch References** 和 **Publish Translations** 依赖文档级的 `translation.metadata`。对于字段级本地化，请使用 **Import All**，或从其状态行导入某个区域设置，然后通过 Sanity 的常规工作流程审校并发布源文档。*

 (请参阅[保留翻译编辑](/docs/integrations/sanity/guides/translating-content#preserve-edits)，以便在开关和按需操作之间进行选择) 。

## 导入翻译 [#import]

生成的翻译必须先导入 Sanity。对于文档级本地化，插件会将已翻译的字段合并到区域设置文档中，因此未发送翻译的字段也会一并保留。对于字段级本地化，它会将已翻译的值合并到源文档的国际化数组中。

* 对于单个文档，可通过 **Translate** 操作或可选的 **General Translation** 选项卡进行导入。
* 对于多个文档，请在 Translations 工具中使用 **Import All** 或 **Import Missing**。

如果某个文档级翻译已被删除，但其 `translation.metadata` 条目仍然存在，则导入该区域设置会创建一个替代翻译并更新元数据引用。请使用 **Import All** 或直接导入该区域设置；**Import Missing** 会跳过已记录在元数据中的区域设置。如果文档的源已不存在，则该文档的导入会失败。

## 修复引用 [#patch-references]

翻译后的文档可能会引用其他文档。引用修复会重写每个引用 `_ref`：如果被引用文档在同一区域设置下存在对应译文，就将其指向该译文。插件会从 `translation.metadata` 文档中解析这些引用。

在 Translations 工具中使用 **Patch References**，即可对现有的翻译后的文档执行此操作，或者在单文档对话框中启用 **Auto-patch after import**。默认关闭自动修复。

如果翻译后的文档已发布且没有草稿，修复会根据已发布的文档创建草稿并更新该草稿。它不会直接更改已发布的文档。

## Publish Translations [#publish]

使用 **Publish Translations** 可批量发布翻译后的文档。该插件只会发布其源文档已发布的翻译后的文档。这在导入大量译文后，或在某个区域设置中批量修补引用之后非常有用。

导入的文档级翻译会创建为草稿。开启 **Auto-publish after import** 可自动发布它们，或保持默认关闭状态，以便在发布前审校。

## 查看调试信息 [#debug-info]

**Translations** 工具和文档对话框的页脚会显示已安装的 `gt-sanity` 版本。点击 **调试信息** 可查看并复制插件的实际配置，以便提交支持请求。

输出包括解析后的区域设置、翻译模式、文档和字段规则、当前偏好设置值、翻译数量、Sanity 项目和数据集，以及是否找到密钥文档。输出绝不会包含 API 密钥，只会显示是否已配置 API 密钥。

## 管理字段行为 [#field-behavior]

当某些字段不应按常规方式进行翻译时，请使用字段匹配器。每个匹配器都通过 JSONPath `property` 表达式匹配字段，并且还可以选择指定文档 `_id`。

### 复制字段而不进行翻译

对于应从源文档复制、但不发送到翻译 API 的字段，请使用 `ignoreFields`，例如类别、标签或内部元数据。

```ts
gtPlugin({
  sourceLocale: 'en',
  locales: ['es', 'zh', 'ja'],
  ignoreFields: [
    { fields: [{ property: '$.category' }] },
    { fields: [{ property: '$..linkType' }] },
  ],
});
```

### 复制字段并设为唯一

对于需要以源值为起点、但随后在每个区域设置中保持唯一的字段，请使用 `dedupeFields`。这种情况在 slug 字段中很常见。

```ts
gtPlugin({
  sourceLocale: 'en',
  locales: ['es', 'zh', 'ja'],
  dedupeFields: [{ fields: [{ property: '$.slug', type: 'slug' }] }],
});
```

对于 Sanity 的 slug，`{ _type: 'slug', current: 'about' }` 在西班牙语中会变成 `{ _type: 'slug', current: 'about-es' }`。如果之后有编辑者修改了翻译后的 slug，后续导入时会保留该修改后的值。

### 从翻译中排除字段

对于完全不应复制到翻译后的文档中的字段，请使用 `skipFields`，例如仅用于 source 的元数据，或需要编辑者按语言手动设置的 slug。

```ts
gtPlugin({
  sourceLocale: 'en',
  locales: ['es', 'zh', 'ja'],
  skipFields: [
    { fields: [{ property: '$.slug', type: 'slug' }] },
    { fields: [{ property: '$.canonicalUrl' }] },
  ],
});
```

 (完整类型请参见[字段匹配器参考](/docs/integrations/sanity/reference/plugin-configuration#field-matchers)) 。

## 阻止自定义类型被翻译 [#stop-types]

默认情况下，插件 会保留一组不会被翻译的 schema 类型。使用 `additionalStopTypes` 添加你自己的自定义类型。

```ts
gtPlugin({
  sourceLocale: 'en',
  locales: ['es', 'zh', 'ja'],
  additionalStopTypes: ['codeBlock', 'mux.video', 'mux.videoAsset'],
});
```

 (请参阅完整的[默认 stop types](/docs/integrations/sanity/reference/plugin-configuration#stop-types)) 。

## 自定义序列化 [#serialization]

该 插件 会先将文档转换为 HTML 以便翻译，之后再转换回来。大多数项目都不需要修改这部分。只有当你的 schema 中包含默认序列化器无法处理的自定义 marks 或 block types 时，才需要使用自定义序列化器。

```ts title="sanity.config.ts"
import { attachGTData, gtPlugin } from 'gt-sanity';

gtPlugin({
  sourceLocale: 'en',
  locales: ['es', 'zh', 'ja'],
  additionalSerializers: {
    marks: {
      link: ({ value, children }) =>
        attachGTData(`<a>${children}</a>`, value, 'markDef'),
      inlineMath: ({ value, children }) =>
        attachGTData(`<span>${children}</span>`, value, 'markDef'),
    },
  },
});
```

`attachGTData(html, data, 'markDef')` 会将该标记的数据嵌入序列化后的 HTML 中，以便 插件 在将翻译合并回来时重建该标记。 (请参阅[序列化参考](/docs/integrations/sanity/reference/plugin-configuration#serialization)) 。

## Next steps

- /docs/integrations/sanity/guides/translating-content
- /docs/integrations/sanity/guides/querying-translations
- /docs/integrations/sanity/guides/configuring-sanity

## Sitemap

See the full [sitemap](https://generaltranslation.com/sitemap.md) for all pages.
