本文详解如何利用 next.js 的 `generatemetadata` 函数,结合国际化路由参数(如 `/en-us/` 或 `/pt-br/`),为不同语言版本页面动态注入定制化 `
在 Next.js App Router(v13.4+)中,静态 metadata 对象无法响应路由参数(如语言标识 lang),因此不能直接用于多语言场景。正确方案是使用 generateMetadata 函数——它是一个异步、服务端执行的元数据生成器,可访问 params、searchParams 甚至 headers(),天然支持基于语言的条件逻辑。
假设你的国际化路由结构为 app/[lang]/page.tsx(例如 /en-US/ 和 /pt-BR/),请将元数据逻辑从 layout.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 shop',
};
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 {
// 注意:确保实际路由参数值与你配置的 locale key 一致(如 en-US / pt-BR)
if (params.lang === 'pt-BR' || params.lang === 'pt') {
return portugueseMetadata;
}
return englishMetadata;
}
export default function HomePage() {
return ... ;
} alternates: {
canonical: `https://brand.xyz/${params.lang}/`,
languages: {
'en-US': 'https://brand.xyz/en-US/',
'pt-BR': 'https://brand.xyz/pt-BR/',
},
}通过 generateMetadata,你不仅能实现语言感知的元数据,还可轻松扩展为基于用户地理位置、设备类型甚至 A/B 测试分组的动态 SEO 策略——真正让元数据成为可编程的 SEO 资产。