成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Next.js國際化全面指南

開發 前端
在Next.js中實現國際化為來自不同語言背景的用戶提供了無縫體驗。通過調整路由,你可以為全球用戶創建更加包容和易于訪問的應用程序。

Next.js作為一個流行的React框架,為構建多語言支持的應用程序提供了強大的支持。本指南將引導你完成在Next.js項目中實現國際化(i18n)的步驟。我們將涵蓋路由設置、本地化處理和翻譯內容管理。

理解國際化術語

區域設置(Locale)

區域設置是一組語言和格式化偏好的標識符。它包括用戶的首選語言,也可能指示他們的地理區域。例如:

  • 'en-US':美國使用的英語
  • 'nl-NL':荷蘭使用的荷蘭語
  • 'en':沒有特定區域的英語

設置Next.js國際化

創建新的Next.js應用

如果你還沒有,使用以下命令創建一個新的Next.js項目:

$ npx create-next-app@latest my-i18n-app

設置國際化路由

為用戶提供無縫體驗,根據他們的首選語言調整你的應用程序至關重要。這可以通過調整路由機制來實現。

利用用戶的語言偏好

通過使用像@formatjs/intl-localematcher和negotiator這樣的庫,你可以根據用戶的headers和你支持的區域設置來確定用戶的首選區域設置。這有助于確保用戶被導向到你網站的正確語言版本。

$ npm install @formatjs/intl-localematcher negotiator

實現基于區域設置的路由

Next.js允許你通過子路徑(/fr/products)或域名(my-site.fr/products)來國際化路由。這些信息使你能夠在中間件中根據用戶的首選區域設置重定向用戶。

src/目錄下創建middleware.ts文件:

// middleware.ts
import { match } from '@formatjs/intl-localematcher'
import Negotiator from 'negotiator'
import { NextRequest, NextResponse } from 'next/server'

let defaultLocale = 'en'
let locales = ['cn', 'de', 'en']

// 獲取首選區域設置,類似上面或使用庫
function getLocale(request: NextRequest) {
  const acceptedLanguage = request.headers.get('accept-language') ?? undefined
  let headers = { 'accept-language': acceptedLanguage }
  let languages = new Negotiator({ headers }).languages()

  return match(languages, locales, defaultLocale) // -> 'en-US'
}

export function middleware(request: NextRequest) {
  // 檢查路徑中是否有任何支持的區域設置
  const pathname = request.nextUrl.pathname
  const pathnameIsMissingLocale = locales.every(
    (locale) => !pathname.startsWith(`/${locale}/`) && pathname !== `/${locale}`
  )

  // 如果沒有區域設置則重定向
  if (pathnameIsMissingLocale) {
    const locale = getLocale(request)

    // 例如,傳入的請求是/products
    // 新的URL現在是/en-US/products
    return NextResponse.redirect(new URL(`/${locale}/${pathname}`, request.url))
  }
}

export const config = {
  matcher: [
    // 跳過所有內部路徑 (_next, assets, api)
    '/((?!api|assets|.*\\..*|_next).*)',
    // 可選:只在根 (/) URL 上運行
    // '/'
  ],
}

組織文件以進行基于區域設置的處理

為了使Next.js能夠在路由中動態管理不同的區域設置,將所有特殊文件嵌套在app/[lang]中。

例如:

// app/[lang]/page.tsx
export default async function Page({ params: { lang } }) {
  return ...
}

實現本地化

本地化涉及根據用戶的首選區域設置調整顯示的內容。這可以通過為每種支持的語言維護單獨的字典來實現。

創建字典

例如,我們考慮Next.js主頁的英語、荷蘭語和中文翻譯:

app/[lang]/dictionaries

dictionaries/en.json:

{
  "get_started": "Get started by editing",
  "doc": "Find in-depth information about Next.js features and API.",
  "learn": "Learn about Next.js in an interactive course with quizzes!",
  "template": "Explore the Next.js 13 playground.",
  "deploy": "Instantly deploy your Next.js site to a shareable URL with Vercel."
}

dictionaries/de.json:

{
  "get_started": "Beginnen Sie, indem Sie bearbeiten",
  "doc": "Finden Sie ausführliche Informationen zu den Funktionen und der API von Next.js.",
  "learn": "Erfahren Sie mehr über Next.js in einem interaktiven Kurs mit Quizfragen!",
  "template": "Erkunden Sie den Next.js 13-Spielplatz.",
  "deploy": "Bereiten Sie Ihre Next.js-Website sofort für die Bereitstellung auf einer gemeinsam nutzbaren URL mit Vercel vor."
}

dictionaries/cn.json:

{
  "get_started": "通過編輯開始",
  "doc": "查找關于 Next.js 功能和 API 的深入信息。",
  "learn": "通過互動課程學習 Next.js,包括測驗!",
  "template": "探索 Next.js 13 的示范環境。",
  "deploy": "使用 Vercel 立即部署您的 Next.js 網站到可共享的 URL。"
}

加載翻譯

創建一個getDictionary函數來加載請求的區域設置的翻譯。

import 'server-only'

export type Locale = keyof typeof dictionaries

const dictionaries = {
  en: () => import('./dictionaries/en.json').then((module) => module.default),
  de: () => import('./dictionaries/de.json').then((module) => module.default),
  cn: () => import('./dictionaries/cn.json').then((module) => module.default),
}

export const getDictionary = async (locale: Locale) => dictionaries[locale]()

在組件中使用翻譯

現在你可以在布局或頁面中獲取字典以顯示翻譯后的內容。

import SwitchLang from '@/components/SwitchLang/SwitchLang'
import Image from 'next/image'
import { Locale, getDictionary } from './dictionaries'
import styles from './page.module.css'

type Props = {
  params: {
    lang: Locale
  }
}

export default async function Home({ params: { lang } }: Props) {
  const intl = await getDictionary(lang)

  return (
    <main className={styles.main}>
      <div className={styles.description}>
        <p>
          {intl.get_started} 
          <code className={styles.code}>src/app/page.tsx</code>
        </p>
        <SwitchLang />
        {/* ... 其余代碼 ... */}
      </div>

      {/* ... 其余代碼 ... */}

      <div className={styles.grid}>
        <a
          
          className={styles.card}
          target="_blank"
          rel="noopener noreferrer"
        >
          <h2>
            Docs <span>-></span>
          </h2>
          <p>{intl.doc}</p>
        </a>

        {/* ... 其他卡片 ... */}
      </div>
    </main>
  )
}

為多個區域設置進行靜態生成

要為一組區域設置生成靜態路由,在任何頁面或布局中使用generateStaticParams。這可以全局設置,例如在根布局中:

// app/[lang]/layout.ts
export async function generateStaticParams() {
  return [{ lang: 'en' }, { lang: 'de' }, { lang: 'cn' }]
}

export default function Root({ children, params }) {
  return (
    <html lang={params.lang}>
      <body>{children}</body>
    </html>
  )
}

結論

在Next.js中實現國際化為來自不同語言背景的用戶提供了無縫體驗。通過調整路由,你可以為全球用戶創建更加包容和易于訪問的應用程序。

責任編輯:武曉燕 來源: 大遷世界
相關推薦

2024-04-03 13:27:28

Next.js擴展項目

2025-03-21 00:05:00

2025-03-31 00:00:00

?增量靜態再生Next.jsISR

2024-12-16 08:40:51

2024-04-28 10:56:34

Next.jsWeb應用搜索引擎優化

2024-09-18 00:00:01

ChatGPTOpenAI工具型

2022-07-27 10:39:14

Spring代碼IDEA

2023-10-06 23:40:49

Spring開發

2025-02-03 00:00:35

2024-12-13 08:37:32

2011-07-08 11:13:42

Cocoa Touch XCode

2025-03-06 00:00:00

2020-12-14 11:40:27

Next.js SSRReact

2024-03-29 08:32:01

Node.jsNext.js組件

2021-11-26 10:29:24

jsRemix開源

2025-02-05 07:00:00

Next.jsWeb前端

2024-03-04 07:33:39

RemixReact框架

2023-09-20 10:14:03

Next.js前端

2024-11-25 07:39:48

2024-12-20 07:30:00

重定向服務器端指令Next.js
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产成人综合在线 | 日韩欧美综合在线视频 | 91精品麻豆日日躁夜夜躁 | 日本黄色激情视频 | 久久久国产一区二区 | www.色综合| 国产一区二区精品在线 | 爱草视频 | 色婷婷国产精品 | 男人的天堂亚洲 | 免费欧美 | 国产精品久久久久久久久久三级 | 国产精品成人一区二区三区 | 成人在线观看网址 | 免费一级网站 | 日韩免费视频一区二区 | 成人免费观看男女羞羞视频 | 成人免费视频网站在线观看 | 国产精品亚洲片在线播放 | 国产不卡一区在线观看 | 精品久久久久久红码专区 | 国产露脸国语对白在线 | 精品一级电影 | 欧美二区在线 | 色中文在线 | 免费观看一级特黄欧美大片 | 日本韩国欧美在线观看 | 精品视频国产 | 精品国产一区二区国模嫣然 | 亚洲天天干| 一区二区成人在线 | 九色一区 | 成人在线观看免费爱爱 | 精品毛片在线观看 | 日本黄色影片在线观看 | 羞羞的视频免费在线观看 | 91在线第一页 | 国产日韩欧美精品一区二区三区 | 亚洲欧美日韩精品久久亚洲区 | 精品久久久久久亚洲综合网 | 一区二区精品 |