如何在 Next.js 中根据语言动态生成自定义 Metadata


本文介绍如何利用 next.js 13+ 的 `generatemetadata` 函数,结合国际化(i18n)路由参数,为不同语言版本(如英语和葡萄牙语)动态注入本地化 seo 元数据,包括标题、描述、关键词及 open graph 属性。

在 Next.js App Router 中,静态 metadata 对象无法响应运行时上下文(如当前语言),因此不能直接用于多语言 SEO 场景。正确的做法是使用 generateMetadata —— 一个支持异步逻辑、可访问路由参数(params)、搜索参数(searchParams)甚至服务端数据的专用函数。

假设你已配置了基于路径前缀的国际化路由(例如 /en-US/ 和 /pt-BR/),且页面结构为 app/[lang]/page.tsx,则可按如下方式实现语言感知的元数据:

// app/[lang]/page.tsx
import { Metadata } from 'next';

const englishMetadata: Metadata = {
  title: {
    default: 'brand',
    template: '%s | brand.xyz',
  },
  description: 'Some description',
  openGraph: {
    title: 'brand',
    description: 'Some description',
    url: 'https://brand.xyz',
    siteName: 'brand',
    type: 'website',
  },
  robots: {
    index: true,
    follow: true,
    googleBot: {
      index: true,
      follow: true,
      'max-video-preview': -1,
      'max-image-preview': 'large',
      'max-snippet': -1,
    },
  },
  icons: {
    shortcut: '/favicon.png',
  },
  keywords: 'events clothing, fashion, online store',
};

const portugueseMetadata: Metadata = {
  title: {
    default: 'Brand',
    template: '%s | brand.xyz',
  },
  description: 'Alguma descrição',
  openGraph: {
    title: 'Brand',
    description: 'Alguma descrição',
    url: 'https://brand.xyz',
    siteName: 'brand',
    type: 'website',
  },
  robots: {
    index: true,
    follow: true,
    googleBot: {
      index: true,
      follow: true,
      'max-video-preview': -1,
      'max-image-preview': 'large',
      'max-snippet': -1,
    },
  },
  icons: {
    shortcut: '/favicon.png',
  },
  keywords: 'eventos, vestuário, moda, loja online',
};

export async function generateMetadata({ params }: { params: { lang: string } }): Promise {
  // 安全判断:避免未定义或非法语言值导致崩溃
  if (params.lang === 'pt-BR' || params.lang === 'pt-PT') {
    return portugueseMetadata;
  }
  return englishMetadata; // 默认回退至英文
}

export default function Page() {
  return 
...
; }

关键要点说明:

  • generateMetadata 必须定义在与页面同级的文件中(如 page.tsx、layout.tsx),不能放在 layout.tsx 中用于整个布局的通用元数据(除非你明确需要该层级统一处理);若需在 layout 级别复用逻辑,请改用 generateMetadata + params 组合,并确保其位于对应动态段(如 [lang]/layout.tsx)。
  • 参数解构必须显式声明类型 { params: { lang: string } },以获得 TypeScript 类型安全和 IDE 支持。
  • 建议添加默认语言兜底逻辑(如上例中 else 返回 englishMetadata),防止路由异常或新语言未覆盖时出现元数据缺失。
  • 所有字段(如 keywords)虽非标准 HTML5 Meta,但被主流搜索引擎(Google、Bing)及社交平台解析支持,建议保留并本地化。
  • 若需从 CMS 或翻译服务动态拉取文案,generateMetadata 支持 await,可轻松集成 fetch 或 i18n 库(如 i18next SSR)。

通过此方式,你的每条语言路由都将输出精准匹配目标用户的 SEO 元数据,显著提升多语言站点的搜索可见性与点击率。


# word  # html  # js  # go  # html5  # typescript  # cms  # seo  # app  # ai  # 路由  # 多语言  # 搜索引擎  # String 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: 跨文件调用类方法怎么用_php作用域操作符与自动加载配合【介绍】  Linux如何申请SSL免费证书_Linux下Certbot安装与Nginx自动续期【指南】  本地php环境出现502错误_nginx或apache502badgateway解决技巧【解答】  如何使用Golang安装依赖库_管理模块和第三方包  C++中的协变与逆变是什么?C++函数指针与返回类型详解【类型系统】  Windows怎样拦截QQ浏览器广告_Windows拦截QQ浏览器广告方法【方法】  c++ namespace命名空间用法_c++避免命名冲突  如何在 Django 中修改用户密码后保持会话不丢失  Win10怎么关闭自动更新错误弹窗_Win10策略屏蔽失败提示减少干扰【防护】  Win10如何更改任务栏高度_Windows10解锁任务栏调整大小  Win10怎么关闭自动更新错误重启 Win10策略禁止失败补丁强制重启【防护】  Windows10系统怎么查看防火墙状态_Win10安全中心网络保护  Win11怎样安装微信开发者工具_Win11安装开发者工具教程【步骤】  手机php文件怎么变成mp4_安卓苹果打开php转mp4方法【教程】  如何使用Golang实现容器安全扫描_Golang Docker镜像漏洞检测方法  Win11怎么调整屏幕亮度_Windows 11调节显示器亮度护眼设置【步骤】  Win10如何设置双wan路由器 Win10双wan路由器设置方法【指南】  如何在Golang中实现RPC异步返回_Golang RPC异步处理与回调方法  Windows资源管理器总是卡顿或重启怎么办?(修复方法)  Win10怎样卸载TeamViewer_Win10卸载TeamViewer步骤【教程】  php本地部署后session无法保存_session存储路径与权限设置技巧【技巧】  Win11怎么设置开机自动连接宽带_Windows11创建拨号连接计划任务  如何在Windows上设置闹钟和计时器_系统自带的时钟应用全攻略【生活技巧】  Win11怎么关闭搜索历史_Win11清除设备上的搜索历史记录  Win10怎样清理C盘Steam游戏缓存_Win10清理Steam游戏缓存步骤【步骤】  如何使用Golang encoding/json解析JSON_Golang encoding/json解析与序列化示例  php修改数据怎么改富文本_update更新html内容注意事项【说明】  Win11此电脑不在桌面上_Windows 11桌面图标设置找回【步骤】  如何使用Golang实现微服务事件驱动_使用消息总线解耦服务  如何使用Golang管理跨项目依赖_Golang多模块项目依赖实践  如何测试您的网站全球打开速度-网站海外测速工  Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解  PythonGIL机制理解_多线程限制解析【教程】  c++怎么使用std::unique实现去重_c++ 容器元素排序与连续重复删除【教程】  Win11怎样安装企业微信_Win11安装企业微信教程【步骤】  Python对象生命周期管理_创建销毁说明【指导】  Win11怎么关闭系统透明度_Windows11个性化颜色透明效果  如何用正则与预处理高效拦截带干扰符的恶意域名  Windows笔记本无法进入睡眠模式怎么办?(电源疑难解答)  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  如何在JavaScript中动态拼接PHP的base_url与前端变量  Python数据抓取合法性_合规说明【指导】  Win11如何添加/删除输入法 Win11切换中英文输入法快捷键【设置】  Python多进程教程_multiprocessing模块实战  Win11怎么更改计算机名_Windows11系统信息重命名设备教程  如何使用正则表达式批量替换重复的星号-短横模式为固定字符串  Win11如何开启系统更新 Win11开启系统更新方法【步骤】  Win10如何卸载WindowsDefender_Win10卸载Defender教程【方法】  Mac的“预览”如何合并多个PDF_Mac文件处理技巧【效率】  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】 

 2025-12-27

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.