Next.js App Router 元数据 - 生成规范 URL 和元“替代”语言

问题描述 投票:0回答:1

在 Next.js 多语言应用程序中,我设置了

metadataBase
,并且
alternates#canonical
会使用
./
自动填充当前路由的路径名。

export const metadata = {
  metadataBase: new URL(process.env.NEXT_PUBLIC_APP_BASE_URL),
  alternates: {
    canonical: "./"
  }
}

我也想生成元数据

alternates#languages

从文档中,我发现

alternates: {
  canonical: './',
  languages: {
    'en': '/en',
    'fr': '/fr',
  },
},

但它会产生以下输出: 例如:

默认语言:

https://acme.com/salaries

en:
https://acme.com/en/

fr:
https://acme.com/fr/

请注意,替代语言中缺少当前路径名。

我想要实现的是向路径名添加区域设置前缀

./
解析为。

例如: 默认语言:

https://acme.com/salaries

en:
https://acme.com/en/salaries

fr:
https://acme.com/fr/salaries

next.js
1个回答
0
投票

在Next.js 14中,您可以使用App Router中的generateMetadata函数动态生成元数据。

// layout.js or page.js (inside your app directory)
import { headers } from 'next/headers'; // for getting request info like pathname
import { resolveBaseUrl } from 'next/metadata'; // Utility for resolving base URLs

export async function generateMetadata({ params }) {
  // Get the base URL dynamically (if needed)
  const baseUrl = resolveBaseUrl(process.env.NEXT_PUBLIC_APP_BASE_URL);

  // Extract the current pathname from the request headers
  const pathname = headers().get('x-invoke-pathname') || '/'; // Default to '/' if missing

  // Define your languages
  const languages = ['en', 'fr']; // You can extend this list for other locales

  // Generate language-specific alternate URLs
  const alternateLanguages = languages.reduce((acc, lang) => {
    acc[lang] = `/${lang}${pathname}`; // Append current path to each language
    return acc;
  }, {});

  // Return dynamic metadata object
  return {
    metadataBase: new URL(baseUrl),
    alternates: {
      canonical: `${baseUrl}${pathname}`, // Canonical URL
      languages: alternateLanguages, // Alternate URLs for each language
    },
  };
}

export default function RootLayout({ children }) {
  return (
    <html>
      <head />
      <body>{children}</body>
    </html>
  );
}

© www.soinside.com 2019 - 2024. All rights reserved.