# General Translation Knowledge Base: 如何翻译 SEO 标题和meta 描述？
URL: https://generaltranslation.com/zh/kb/translate-seo-metadata.mdx
Docs index: https://generaltranslation.com/llms.txt
Description: 用各语言版本对应的语言撰写标题和meta 描述，并采用该市场用户实际搜索的词语——这些词往往与字面翻译不同。然后本地化与之相关的标签，包括 Open Graph、规范网址、hreflang、html lang 和结构化数据。General Translation 的 gt-next 可在 generateMetadata 中通过 getGT 翻译标题和描述。
Category: 多语言 SEO
Last updated: 2026-10-28
Authors: General Translation Team
Published: 2026-10-28

为页面的每个语言版本单独编写标题和meta 描述，使用该页面的语言，并采用该市场用户实际搜索的词语。然后确保相关标签与之保持一致：指向页面自身的规范网址、hreflang 替代项、`lang` 属性、Open Graph 区域设置，以及翻译后的结构化数据。搜索引擎会依据这些信息生成每条搜索结果的标题和摘要；如果标题的语言或文字体系与页面不符，Google 可能会改写该标题。

## 每个页面需要本地化的内容

这些内容大多位于 `<head>` 或属性中，因此在审校渲染后的页面时看不到。

| 元素              | 所在位置                                                              | 处理方式                                                                                                |
| --------------- | ----------------------------------------------------------------- | --------------------------------------------------------------------------------------------------- |
| 标题              | `<title>`                                                         | 结合目标市场的搜索词改写，使用页面对应的语言和文字体系                                                                         |
| Meta 描述         | `<meta name="description">`                                       | 逐页翻译；Google 可能会将其用作搜索结果摘要                                                                           |
| 社交预览            | `og:title`、`og:description`、`twitter:title`、`twitter:description` | 与标题和描述一同翻译                                                                                          |
| Open Graph 区域设置 | `og:locale`、`og:locale:alternate`                                 | 以 `language_TERRITORY` 格式 (如 `pt_BR`) 设置页面的区域设置，并列出其他版本                                             |
| 分享图片            | `og:image`、`og:image:alt`                                         | 翻译替代文本；如果图片中含有文字，则使用本地化图片                                                                           |
| 规范网址            | `<link rel="canonical">`                                          | 让每个版本都指向自身                                                                                          |
| Hreflang 替代项    | `<link rel="alternate" hreflang>`                                 | 列出所有版本，包括当前页面本身 (参见[什么是 hreflang](/kb/what-is-hreflang))                                            |
| 文档语言            | `<html lang>`                                                     | 设置页面的区域设置代码；浏览器和屏幕阅读器会用到它                                                                           |
| 结构化数据           | JSON-LD                                                           | 翻译名称和描述，并设置 `inLanguage`                                                                            |
| 图片              | `<img alt>`、文件名                                                   | 翻译替代文本，以及本地化图片的文件名                                                                                  |
| URL slug        | 路径                                                                | 可选：使用 `/de/preise` 而非 `/de/pricing` (参见[本地化 slug](/kb/multilingual-url-structure#localized-slugs))  |

[Open Graph 协议](https://ogp.me/)规定 `og:locale` 采用 `language_TERRITORY` 格式，默认值为 `en_US`，并要求设置了 `og:image` 的页面同时设置 `og:image:alt`。对于 JSON-LD，schema.org 的 [`inLanguage`](https://schema.org/inLanguage) 接受 BCP 47 代码；而根据 Google 的[结构化数据指南](https://developers.google.com/search/docs/appearance/structured-data/sd-policies)，标记必须描述页面上可见的内容，因此德语页面的标记应使用德语名称和描述。Google 的[图片指南](https://developers.google.com/search/docs/appearance/google-images)指出，Google 会借助替代文本理解图片，并建议同时翻译本地化图片的文件名。

## 搜索引擎如何使用已翻译的元数据

搜索结果中的标题和摘要来自你的元数据，但不完全取决于元数据：

* **标题。** Google 的[标题链接指南](https://developers.google.com/search/docs/appearance/title-link)要求 `<title>` 与页面主要内容使用相同的语言和文字体系。如果两者不一致，例如印地语页面配了英文标题或音译标题，Google 可能会改为根据页面内容自动生成标题链接。
* **描述。** Google [主要根据页面内容生成摘要](https://developers.google.com/search/docs/appearance/snippet)，只有当 meta 描述 能更准确地描述页面时才会采用它。Google 建议为每个页面提供独一无二的描述；对多语言网站来说，这意味着每个页面的每种语言版本都需要单独的描述。
* **页面本身才是关键。** 只有当[主要内容未经翻译](https://developers.google.com/search/docs/specialty/international/localized-versions)时，Google 才会将本地化版本视为重复内容；而且 Google 在检测页面语言时会忽略 `lang` 和 hreflang。已翻译的元数据无法替代已翻译的页面。

## 常见错误

### 逐字翻译关键词

每个市场的用户都有自己的搜索习惯用语。英国购物者搜的是 trainers，美国人搜的则是 sneakers；手机在巴西叫“celular”，在葡萄牙叫“telemóvel”，在德国则叫“Handy”。照字面翻译英文标题，可能会漏掉当地用户真正输入的搜索词。请为每个区域设置选定目标词汇 (在 Search Console 的效果报告中按国家/地区筛选，即可查看已为你带来流量的搜索查询) ，然后确保所有标题和描述都使用该词汇。

### 沿用英文的长度限制

Google 并未对标题或描述设置字符数上限，而是会[根据设备宽度进行截断](https://developers.google.com/search/docs/appearance/title-link)。为英文制定的字符数预算并不适用于其他语言。W3C 关于[翻译中的文本长度](https://www.w3.org/International/articles/article-text-size)的文章引用了 IBM 的指南：31 到 50 个字符的英文文本 (典型的标题长度) 翻译后，长度平均会达到原文的 140% 到 160%；文章还指出，每个中文或韩文字符的宽度约等于两个拉丁字符。请把主要关键词放在最前面，这样即使被截断，也只会切掉标题末尾，关键词仍能保留。

### 将所有规范网址都指向源语言页面

如果翻译页面的规范网址指向英文页面，就等于告诉 Google 该翻译页面是重复内容。根据 Google 的[重复网址指南](https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls)，使用 hreflang 时，应将规范网址指向同一语言的页面。 (参见[自引用规范网址](/kb/what-is-hreflang#should-hreflang-pages-use-self-referencing-canonicals)。)

### 遗漏了看不见的标签

Open Graph 标签、JSON-LD 和图片替代文本不会显示在渲染后的页面上，因此审校人员在浏览器中查看德语页面时，并不会发现它们仍是英文。上线前，请逐一检查每个区域设置的页面源代码或社交分享预览。

## 生成已翻译的元数据的方式

| 方式                                   | 针对特定市场的术语                                 | 源文案变更时                                                                            | 长度                  | 审校         |
| ------------------------------------ | ----------------------------------------- | --------------------------------------------------------------------------------- | ------------------- | ---------- |
| 按市场手动撰写                              | 通过关键词调研选定                                 | 需有人逐一更新每种语言                                                                       | 由撰写者把控              | 流程内置       |
| 机器翻译 (Google Translate、DeepL)        | 直接翻译源措辞；DeepL 词汇表可锁定术语                    | 手动粘贴，或通过其 API 自动处理                                                                | 无法控制                | 需单独进行      |
| 直接调用 AI API (OpenAI API、Claude API)  | 遵循指令，例如为每个市场指定所用术语                        | 重新运行脚本                                                                            | 可要求设定长度上限           | 需单独进行      |
| General Translation                  | 按区域设置配置的词汇表术语、自定义提示词，以及按字符串设置的 `$context` | 由 [`npx gt translate`](/docs/cli/reference/commands/translate) 或 Locadex 翻译变更的字符串 | 通过 `$maxChars` 设定上限 | 仪表板中的翻译编辑器 |

对于在各重点市场带来大部分搜索流量的少数页面，经过调研的标题值得投入时间，建议手动撰写元数据。如果只需要一份供人后续编辑的初稿，可以使用机器翻译。如果标题和描述存放在代码或 CMS 中，且每次源内容变更后都需要重新翻译，请使用 General Translation，然后在仪表板中手动编辑最重要的页面。

## 如何实现

### 在 Next.js 应用中

在 App Router 中，元数据来自 `generateMetadata`，因此需要翻译它返回的字符串。本页使用 General Translation 的 [`getGT`](/docs/react/nextjs/reference/functions/get-gt)，它会根据当前请求的区域设置返回对应的翻译函数。本页还假定路由带有区域设置前缀，例如 `/de/pricing`：

```tsx title="app/[locale]/pricing/page.tsx"
import type { Metadata } from 'next';
import { getGT, getLocale } from 'gt-next/server';

const LOCALES = ['en', 'de', 'fr', 'pt-BR'];
const pageUrl = (locale: string) => `https://example.com/${locale}/pricing`;

// 将 BCP 47（pt-BR）转换为 Open Graph 的 language_TERRITORY 格式（pt_BR）。
// maximize() 会为不带地区的代码补全最可能的地区：de 会变为 de-Latn-DE。
function ogLocale(locale: string) {
  const { language, region } = new Intl.Locale(locale).maximize();
  return `${language}_${region}`;
}

export async function generateMetadata(): Promise<Metadata> {
  const gt = await getGT();
  const locale = await getLocale();

  // $context 用于告诉译者该字符串的用途。
  const title = gt('Pricing for teams of every size', {
    $context: 'SEO title of the pricing page',
  });
  const description = gt(
    'Compare plans, see what each one includes, and start for free.',
    { $context: 'Meta description of the pricing page' },
  );

  return {
    title,
    description,
    alternates: { canonical: pageUrl(locale) }, // 也可在此添加 hreflang 替代项
    openGraph: {
      title,
      description,
      url: pageUrl(locale),
      locale: ogLocale(locale),
      alternateLocale: LOCALES.filter((l) => l !== locale).map(ogLocale),
      images: [
        {
          url: `https://example.com/og/pricing-${locale}.png`, // 如果图片含有文字，则为每个区域设置单独准备一张图片
          alt: gt('Plan comparison table', { $context: 'Alt text of the share image' }),
        },
      ],
    },
    twitter: { card: 'summary_large_image', title, description },
  };
}
```

基于 Next.js 16.4.3 和 `gt-next` 11.4.16 构建时，`/de/pricing` 除了 title、description 和 Twitter 标签外，还渲染了以下特定于区域设置的标签：

```html title="/de/pricing"
<html lang="de">
<link rel="canonical" href="https://example.com/de/pricing"/>
<meta property="og:url" content="https://example.com/de/pricing"/>
<meta property="og:locale" content="de_DE"/>
<meta property="og:image" content="https://example.com/og/pricing-de.png"/>
<meta property="og:locale:alternate" content="en_US"/>
<meta property="og:locale:alternate" content="fr_FR"/>
<meta property="og:locale:alternate" content="pt_BR"/>
```

`lang` 属性来自 `[locale]` 布局。关于区域设置路由、hreflang 替代项和站点地图，请参阅[如何为多语言 Next.js 应用设置 SEO？](/kb/multilingual-nextjs-seo)，该文会根据已发布区域设置组成的 Record 构建 `alternates.languages`。

### 静态站点

静态站点生成器通常从页面的 front matter 中读取标题和描述，因此每个翻译后的文件都带有各自的标题和描述。以 Docusaurus 为例，[`description` front matter](https://docusaurus.io/docs/api/plugins/@docusaurus/plugin-content-docs) 会同时用于生成 `<meta name="description">` 和 `og:description`，翻译后的文档则存放在 `i18n/[locale]/docusaurus-plugin-content-docs/current/` 下。翻译正文时，请一并翻译 front matter。

### 在 CMS 或建站工具中

SEO 字段应与页面正文一样按区域设置分别存储，让每种语言都有自己的标题和描述。如果网站基于 WordPress 或 Shopify 搭建、而非通过代码构建，可以使用 Weglot 等代理服务，它会在翻译页面的同时[翻译标题、meta 描述和结构化数据](https://support.weglot.com/article/293-how-does-weglot-manage-the-seo)。 (参见 [General Translation 与 Weglot 对比](/kb/general-translation-vs-weglot)。)

## General Translation 如何翻译 SEO 元数据

在 Next.js App Router 中，General Translation 的 `gt-next` 会翻译你在 `generateMetadata` 中传给 [`getGT`](/docs/react/nextjs/reference/functions/get-gt) 的字符串。请传入字符串字面量，以便 CLI 能够识别，并在 `next build` 之前运行 [`npx gt translate`](/docs/cli/reference/commands/translate)。修改英文标题后，下一次构建会将新文本翻译为所有区域设置。在上面的页面中，CLI 的离线模板命令 [`npx gt generate`](/docs/cli/reference/commands/generate) 会将标题、描述和替代文本列为源字符串。

有两个[翻译选项](/docs/react/reference/types/inline-translation-options)可用于元数据。`$context` 用于说明该字符串的用途，例如“定价页面的 SEO 标题”。`$maxChars` 要求译文控制在指定字符数以内；如果译文仍然超出，`gt-next` 会在渲染时将其截断至上限并添加省略号。因此，应将其视为长度上限，而非精确到像素的限制。该选项并非必需：Google 并未规定固定长度，设置上限反而可能截断原本不错的译文，因此仅在你自己的布局 (例如分享卡片或 CMS 字段) 有硬性长度限制时才需添加。

对于特定市场的关键词，请将该术语添加到[上下文分组](/docs/platform/dashboard/guides/defining-context-for-translations)中：词汇表条目可按区域设置保存对应译法，而 自定义提示词 可以只作用于单个区域设置。General Translation 会将两者应用于新生成的译文，无论是标题、描述还是正文。发布之前，请在[仪表板翻译编辑器](/docs/platform/dashboard/guides/reviewing-translations)中审校结果。

我们在一个未配置词汇表的新项目中进行了测试 (使用 `gt` 2.26.11 和 `gt-next` 11.4.16) ：一个以 `en-US` 编写的跑鞋分类页面，返回的译文均采用了各市场的本地用语。标题和描述均通过 [`getGT`](/docs/react/nextjs/reference/functions/get-gt) 处理，且各自带有一个说明页面用途的 `$context` (一家在线鞋店的跑鞋分类页) ，构建后的页面渲染结果如下：

```html title="Rendered metadata"
<!-- /en-US/running（源语言） -->
<title>Running Sneakers for Trail and Road</title>
<meta name="description" content="Shop lightweight running sneakers with cushioned soles for long runs on trails and city streets."/>

<!-- /en-GB/running -->
<title>Running Trainers for Trail and Road</title>
<meta name="description" content="Shop lightweight running trainers with cushioned soles for long runs on trails and city streets."/>

<!-- /de/running -->
<title>Laufschuhe für Gelände und Straße</title>
<meta name="description" content="Entdecke leichte Laufschuhe mit gut dämpfenden Sohlen für lange Läufe auf Trails und Straßen."/>
```

英国版页面用的是 trainers，德语标题则用了 Laufschuhe (德语中&quot;跑鞋&quot;的说法，参见 [Duden](https://www.duden.de/rechtschreibung/Laufschuh)) ，而不是逐字直译的 &quot;Lauf-Sneaker&quot;。去掉 `$context` 后，同一标题的翻译结果完全相同，可见对于含义如此明确的字符串，仅凭目标区域设置就已足够。德语标题也比英语标题更短 (33 个字符对 35 个字符) ，因此请逐个测量每个区域设置的长度，不要默认译文总会更长。有两件事仍需人工把关：一是德语描述以非正式口吻称呼读者 (*Entdecke*) ，如果你的品牌使用正式的 *Sie*，请为德语添加 自定义提示词；二是模型选用的词汇体现的是对搜索行为的判断，因此请对照 Search Console 中该国家的搜索查询进行核实，必要时将其固定到词汇表中。

应用代码之外：

* **Payload CMS：** 使用 `gt-payload` 时，由 Payload SEO 插件渲染的字段会应用[推荐长度](/docs/integrations/payload/reference/supported-content#character-limits)：meta 标题为 60 个字符，meta 描述为 150 个字符。译文超长时会重新请求更短的版本；只有当字段同时设置了 `maxLength` 时，才会在单词边界处截断，并附加该区域设置对应的省略号。
* **Mintlify：** Locadex 会[翻译 frontmatter](/docs/integrations/mintlify/reference/supported-content) (如页面标题和描述) ，让文档站点的 SEO 元数据覆盖每种语言。

Ramp 借助 General Translation 将其仪表板、落地页和 iOS 应用本地化为 11 种以上的区域设置。 (参见[生产环境部署案例](https://generaltranslation.com/enterprise)。)

## 要点总结

* 将每个标题和 meta 描述都翻译为页面自身的语言和文字体系；如果标题与页面语言不一致，Google 可能会将其替换。
* 针对不同市场选择关键词，例如在 `en-GB` 中使用 trainers，在 `en-US` 中使用 sneakers，而不是直接翻译英文术语。
* 不要照搬英文的字符数限制：Google 按设备宽度截断，而译文长度因语言和字符串而异，因此请针对每个区域设置分别测量。
* 标题周边的标签也要一并本地化：自引用的规范网址、hreflang、`lang`、`og:locale`、替代文本和 JSON-LD。
* 在 Next.js 中，General Translation 的 [`getGT`](/docs/react/nextjs/reference/functions/get-gt) 可在 `generateMetadata` 中翻译元数据：用 `$context` 说明意图；对于有硬性长度限制的布局，还可以通过可选的 `$maxChars` 设置长度上限。

## Related questions

- [如何为多语言 Next.js 应用设置 SEO？](https://generaltranslation.com/zh/kb/multilingual-nextjs-seo.mdx): 为每种语言提供带前缀的独立 URL，例如 /en/about 和 /es/about，然后为每种已发布的语言提供 html lang、自引用的规范网址、包含 x-default 的 hreflang 替代项、翻译后的 title 和 description，以及站点地图条目。将未发布的版本标记为 noindex。General Translation 的 gt-next 会将每种语言路由到各自的 URL，并通过 getGT 翻译标题。
- [什么是 hreflang？如何设置？](https://generaltranslation.com/zh/kb/what-is-hreflang.mdx): Hreflang 用于告诉 Google 哪些 URL 是同一页面的不同语言或区域版本，以便在搜索结果中展示正确的版本。你可以通过 HTML link 标签、HTTP Link 响应头或站点地图来添加它，确保所有链接相互指向，并使用有效的代码，例如 en-GB，而不是 en-UK。
- [如何为多语言网站创建站点地图？](https://generaltranslation.com/zh/kb/multilingual-sitemap.mdx): 将每个页面的每个语言版本都列为独立的 url 条目。如果由站点地图承载 hreflang，则为每个条目添加指向所有版本（包括其自身）的 xhtml:link 替代项，并可选择添加 x-default；文件超过 50,000 个 URL 或 50MB 时需拆分。General Translation 的 gt-next 会为每个区域设置生成独立的 URL，供站点地图列出。
- [多语言 SEO：子目录、子域名与 ccTLD 对比](https://generaltranslation.com/zh/kb/multilingual-url-structure.mdx): 如果同一产品共用一个站点和发布流程，请使用 example.com/de/ 这样的子目录。只有 ccTLD 能指明目标国家，子域名便于独立托管；Google 不建议使用 ?lang= 参数，并会将 .io、.ai 等个性化域名视为通用域名。
- [如何让网站支持多语言？](https://generaltranslation.com/zh/kb/make-website-multilingual.mdx): 先确定译文放在哪里：代理、CMS 插件、建站工具，还是你自己的代码；然后按照 Google 的建议，为每种语言分配独立的 URL。完整翻译页面以及标题和元描述，用 hreflang 关联各语言版本，并提供语言切换器，而不是自动重定向访问者。

## Previous and next questions

- Previous question: [如何翻译 PO 和 POT 文件？](https://generaltranslation.com/zh/kb/translate-po-files.mdx)
- Next question: [如何翻译 YAML 区域设置文件？](https://generaltranslation.com/zh/kb/translate-yaml-files.mdx)

## Sitemap

See the [Knowledge Base sitemap](https://generaltranslation.com/zh/kb/sitemap.md) for every article.
