Авторизоваться

Рекомендации по многоязычной интернационализации Nextjs+next-intl (маршрутизатор приложений)

Автор:нео Ян Время:2024/02/19 Читать: 12489
Nextjs предлагает два маршрутизатора: APP и Page, причем Page постепенно прекращается. Автор ранее использовал интернационализацию маршрутизатора Page, но с тех пор реализовал интернационализацию на основе маршрутизатора APP. Они оценили несколько решений и обнаружили, что next-intl является самым простым и успешным. В посте описывается структура каталогов, маршрутизация, настройка промежуточного программного обеспечения, способы загрузки файлов перевода и способы реализации переводов, подчеркивая, что независимо от выбранного решения интернационализации маршрутизация, файловая структура и реализация перевода являются ключевыми аспектами.

Nextjs имеет два маршрутизатора: маршрутизатор APP и маршрутизатор страницы.

Некоторое время назад под маршрутизатором Page nextjs был интернационализирован и обобщен:

Но маршрутизатор Page будет постепенно выведен из эксплуатации Nextjs. Поэтому недавно Nextjs был интернационализирован на основе маршрутизатора APP.

1. Выбор решения для интернационализации Nextjs

1. i18next + реакция-i18next + i18next-resources-to-backend + next-i18n-router

Кажется, что большинство людей используют это. Я попробовал, и это было довольно сложно. У меня пока не получилось, поэтому я сдался.

2. реакция следующего-i18n-router-intl

Это выглядело довольно сложно, но из-за тени 1 я сдался.

3. следующий-между

next-intl — это полное решение для интернационализации nextjs, не требующее других пакетов программного обеспечения. И конфигурация относительно проста. Что еще более важно, я успешно настроил его и не столкнулся с необъяснимыми проблемами.

Итак, вот оно.

2. Структура каталогов

|app ..[локаль] ...layout.js ...page.js |компоненты ..LangSwitcher.js |public ..locales ...en ....common.json ...es .... common.json |i18n.js |navigation.js |middleware.js |next.config.js

3. Международная маршрутизация

1. навигация.js

Это файл конфигурации, и элементы, настроенные в этом файле, будут вызываться в некоторых других файлах.

импортировать { createSharedPathnamesNavigation } из 'next-intl/navigation'; экспортировать const locales = ['en', 'de', 'es', 'ja','ko','it','pt']; экспортировать const localePrefix = 'по мере необходимости'; экспортировать const defaultLocale="en"; экспортировать const localeItems= [ { name: "English",code: "en", iso: "en-US", dir: "ltr" }, { name : "español",code: "es", iso: "es-ES", dir: "ltr" }, { name: "中文",code: "zh_cn", iso: "zh-CN", dir: " ltr" }, { name: "Deutsch",code: "de", iso: "de-DE", dir: "ltr" }, { name: "Italiano",code: "it", iso: "it- IT", dir: "ltr" }, { name: "日本语", code: "ja", iso: "ja-JP", dir: "ltr" }, { name: "한국인", code: "ko ", iso: "ko-KR", dir: "ltr" }, { name: "Português", code: "pt", iso: "pt-PT", dir: "ltr" }, ]export const { Ссылка , перенаправление, usePathname, useRouter } = createSharedPathnamesNavigation({ locales, localePrefix });

2. каталог [локаль]

Все файлы страниц в каталоге приложения размещаются в каталоге [locale].

3. Промежуточное ПО: middleware.js.

проиллюстрировать:

Реализуйте следующий стиль URL-адреса

URL-адрес языка по умолчанию:

Домашняя страница: www.xxx.com.

Внутренняя страница: www.xxx.com/about.

URL-адреса на других языках: (возьмем испанский в качестве примера)

Домашняя страница: www.xxx.com/es.

Внутренняя страница: www.xxx.com/es/about.

Кроме того, если в URL-адресе указан язык по умолчанию, например, языком по умолчанию является английский, пользователь вводит URL-адрес: www.xxx.com/en.

Затем он автоматически перейдет на www.xxx.com.

Код:

импортировать createMiddleware из "next-intl/middleware"; импортировать { defaultLocale, localePrefix, locales } из '@/navigation'; экспортировать default createMiddleware({ locales, localePrefix , defaultLocale, localeDetection: false, }); экспортировать const config = { / / Пропустить все пути, которые не должны быть интернационализированы. // При этом пропускаются папки «api», «_next» и все файлы // с расширением (например, favicon.ico) сопоставление: ["/((?!api|_next| .*\\..*).*)"], };

4. Загрузите файлы перевода

1. Перевести файлы

иллюстрировать

Мои файлы перевода размещаются в «общедоступном» каталоге, но на самом деле файлы перевода также могут быть размещены в других каталогах, если соответствующий путь настроен в файле i18n.js.

Файл перевода представляет собой файл json, и файл json может быть во вложенном формате или нет. В конечном итоге на эти два понятия будут ссылаться несколько по-разному.

Код (не вложенный)

{ "ааа": "привет", }

Код (вложенный)

{ "bbb":{ "ааа":"привет", } }

2. файл i18n.js

проиллюстрировать:

Этот файл используется для импорта файлов перевода. Ключевым моментом является настройка пути к файлу перевода, который должен совпадать с путем, по которому находится ваш файл перевода.

${локаль} в пути указывает язык.

код

import { getRequestConfig } from "next-intl/server"; // Создаем эту конфигурацию один раз для каждого запроса и // делаем ее доступной всем компонентам сервера. для активной локали. messages: (await import(`./public/locales/${locale}/common.json`)).default, }));

3. Настройка next.config.js

/** @type {import('next').NextConfig} */ const nextConfig = {} const withNextIntl = require("next-intl/plugin")("./i18n.js"); Module.exports =withNextIntl (следующая конфигурация)

5. Реализуйте перевод

Код в макете.js:

импортировать «./globals.css»; импортировать { NextIntlClientProvider, useMessages } из «next-intl»; импортировать { локали } из «@/navigation»; импортировать заголовок из «@/comComponents/Header» импортировать нижний колонтитул из «@/comComponents» /Footer' экспортирует функцию по умолчанию RootLayout({ Children, params: { locale } }) { if (!locales.includes(locale)) { notFound(); } const messages = useMessages(); return (
    <html lang="{locale}">
      <nextintlclientprovider locale="{locale}" messages="{messages}">
      <body><header />{дети}<footer /></body>
      </nextintlclientprovider>
    </html>
  );
}

Код в page.js:

Параметр locale представляет текущий язык.

Если файл перевода не вложен, то const t = useTranslations();

Если файл перевода вложенный, используйте что-то вроде: const t = useTranslations("bbb"); в зависимости от структуры файла и реальных потребностей.

import { useTranslations } from &#039;next-intl&#039;; import { Link } from &#039;@/navigation&#039;; экспортировать функцию по умолчанию Home({ params: { locale } }) { const t = useTranslations(); return (<>   
<link href="{"/"}"><h1>{т(&quot;ааа&quot;)}</h1></Link>
</>)

6. Переключатель языка

1. Эффект

Потяните вниз, чтобы выбрать язык, и текущая страница переключится на страницу на выбранном языке.

2. Код

"use client";
import { useLocale } from "next-intl";
import { localeItems, useRouter, usePathname, defaultLocale } from '@/navigation';
export default function LangSwitcher() {
  const locale = useLocale();
  const router = useRouter();
  const pathname = usePathname();
  console.log(locale)

  const handleChange = (e) => {
    router.push(pathname, { locale: e.target.value });
  };
 
  return (
    <div>
      <select
      value={locale}
        onChange={handleChange}
        className="h-8 m-2 p-1 rounded border-current"
      >
        <option value={locale} > {GetLangData(locale).name}</option>

        {localeItems.map((item) => {

          if (item.code === locale) return null
          return (<option key={item.code} value={item.code}>
            {item.name}
          </option>)
        })}
      </select>
    </div>
  );
}
export function GetLangData(defaultLocale) {
  var res = {}
  {
    localeItems.map(locale => {
      if (locale.code === defaultLocale) {
        console.log(locale)
        res = locale
      }
    })
  }
  return res

}

7. SEO и поисковая оптимизация

1. Метаданные

Маршрутизатор приложений Nextjs генерирует заголовок и метаданные страницы. Я попробовал три метода:

Первый способ: использовать его непосредственно в Layout.js: expert const метаданные={}

Второй способ: использовать динамически генерируемые метаданные в page.js.

Для справки:Оптимизация: метаданные | Next.js (nextjs.org)

Этими двумя способами мне не удалось создать многоязычный заголовок и метаданные. Наконец, был использован третий метод, который также является самым простым и понятным.

Третий способ: написать тег title и мета-тег прямо в page.js.

Поэтому код page.js был изменен на следующий:

import { useTranslations } from &#039;next-intl&#039;; import { Link } from &#039;@/navigation&#039;; экспортировать функцию по умолчанию Home({ params: { locale } }) { const t = useTranslations(); return (<>  
          <title>{t(&quot;имя-сайта&quot;)}</title>
        <meta name="keyword" content="{t("site-name")}"></meta>
        <meta name="description" content="{t(&quot;описание-сайта&quot;)}"></meta>
        <meta property="og:type" content="website"></meta>
        <meta property="og:title" content="{t(&quot;имя-сайта&quot;)}"></meta>
        <meta property="og:description" content="{t(&quot;описание-сайта&quot;)}"></meta>
        <meta property="og:site_name" content="{t(&quot;имя-сайта&quot;)}"></meta>
        <meta property="og:image" content="/images/xxx.png"></meta>
        <meta property="og:image:width" content="512"></meta>
        <meta property="og:image:height" content="512"></meta>
        <meta property="og:image:alt" content=""></meta>
 
<link href="{"/"}"><h1>{т(&quot;ааа&quot;)}</h1></Link>
</>)

2. Многоязычная навигация. Облегчите поисковым системам обнаружение многоязычных URL-адресов.

иллюстрировать

Переключатель языка визуализируется на интерфейсе, поэтому я добавил многоязычную навигацию, отображаемую на серверной части, в нижней части страницы, которая представляет собой компонент Footer.js. Нажатие на соответствующий язык приведет к переходу на домашнюю страницу сайта на этом языке.

Код Footer.js выглядит следующим образом:

import Link from 'next/link'
import { localeItems,defaultLocale } from '@/navigation';


export default function Footer(){


  return (<>
    <div className="divider"></div>
    <footer className="footer footer-center p-10 bg-base-200 text-base-content rounded">
      <nav className="flex flex-wrap gap-4">

     {localeItems.map(locale => {
          if (locale.code === defaultLocale) return(<Link className="link link-hover" href="/"  key={locale.code}>{locale.name}</Link>)
          const thehref="/"+locale.code
          return (<Link className="link link-hover" href={thehref} key={locale.code}> {locale.name}</Link>)
        })} 
  </nav> 
      <aside className='p-6 text-center'>
        <p>Copyright © 2024 - All right reserved by xxx.com</p>
      </aside>
     
    </footer>
  </>
    
  )
}

8. Резюме

Международная маршрутизация, структура и внедрение файлов перевода, а также реализация перевода. Независимо от того, какой план интернационализации, эти три аспекта будут задействованы. Хоть это и не хлопотно, в целом next-intl относительно прост.

9. Справочник

Глубокое погружение в локализацию маршрутизатора приложений Next.js с помощью next-intl

Полное руководство по настройке next-intl с помощью App Router



авторские права © www.lyustu.com, все права защищены.
Тема: TheMoon V3.0 Автор: neo yang