關於 generateMetadata (Metadata動態版) === ###### With Next.js App Router :::info :radio_button: [回到目錄攻略](https://hackmd.io/@hJJ8etrATgudRfKA1gryew/BJiplPwMC) ::: 0.啥是generateMetadata? --- :round_pushpin:據[Next.Js官方](https://nextjs.org/docs/app/api-reference/functions/generate-metadata#generatemetadata-function)文件所說的: > Dynamic metadata depends on dynamic information, such as the current route parameters, external data, or metadata in parent segments, can be set by exporting a generateMetadata function that returns a Metadata object `generateMetadata`的函數的作用,主要目的是根據不同的情況來生成Metadata(元數據)。Metadata可以根據不同的情況而改變,比如根據目前的網頁路徑參數、外部的數據,或是父級的段落中的Metadata來設置。 就我目前所需,也就是title語言可以切換的話,就要使用`generateMetadata`,因此在上一章講到的[靜態Metadata](https://hackmd.io/@hJJ8etrATgudRfKA1gryew/B1x5fhlXA)便不支援使用。 1.使用目標 --- `generateMetadata`使用的目的還有很多,此專案就先以可以動態改變網標上的語言做為此成果展現。 <font color="#F7A004">**先看最後成果**</font> 可以看到各頁面網標的部分也會隨著語言做變動! ![chrome_jXx4N5Svze](https://hackmd.io/_uploads/SJALHTywA.gif) :rocket: 此章會針對在[基礎設置Metadata](https://hackmd.io/@hJJ8etrATgudRfKA1gryew/B1x5fhlXA)的寫法基礎上做更動與調整。 2.主頁網標的動態語言調整加入 --- >> @locale/main/layout.tsx ```typescript ... import { getTranslations } from "next-intl/server"; export async function generateMetadata() { const t = await getTranslations(); return { title: { template: `%s | ${t("web-title")}`, default: `${t("web-title")}`, }, openGraph: { title: "Tourist Attractions in Taiwan", description: "Let's travel around Taiwan! Explore this beautiful island through this website and discover the myriad attractions and destinations it has to offer.", }, metadataBase: new URL("http://localhost:3000"), alternates: { languages: { en: "/en/main", zh: "/zh/main", }, }, }; } ... ``` 3.子頁網標的動態語言調整加入 --- >> @locale/${AREA}/layout.tsx ```typescript import { getTranslations } from "next-intl/server"; export async function generateMetadata() { const t = await getTranslations(); return { title: { template: `%s | ${t(${Your Own Title})}`, default: `${t(${Your Own Title})}`, }, openGraph: { title: ${Your Own Title}, description: "Let's travel around Taiwan! Explore the east in Taiwan through this website and discover the myriad attractions and destinations it has to offer.", }, metadataBase: new URL("http://localhost:3000"), alternates: { languages: { en: "/en/east", zh: "/zh/east", }, }, }; } ``` 4.各頁page.tsx動態語言調整加入 --- import { getTranslations } from "next-intl/server"; ```typescript export async function generateMetadata() { const t = await getTranslations(); return { title: t(${CITY}), metadataBase: new URL("http://localhost:3000"), alternates: { languages: { en: "/en/${AREA}/${CITY}", zh: "/zh/${AREA}/${CITY}", }, }, }; } ``` 參考 --- - [Next.Js: Metadata Object and generateMetadata Options](https://nextjs.org/docs/app/api-reference/functions/generate-metadata)