Se connecter

Bonnes pratiques d'internationalisation multilingue Nextjs+I18n (compatible avec les moteurs de recherche)

Auteur:néo yang Temps:2024/01/13 Lire: 9895
Remarque : Cette bonne pratique est basée sur le routage des pages suivantes. Ne convient pas au routage d'applications. L'idée de base du répertoire est d'utiliser next-i18ne […]

Remarque : Cette bonne pratique est basée sur le routage des pages suivantes. Ne convient pas au routage d'applications.

Table des matières

L'idée de base

Utilisez next-i18next.

Ajoutez le répertoire [locales] au répertoire "pages" et placez la logique métier principale dans ce répertoire.

Les pages telles que l'index dans le répertoire des pages sont utilisées pour déterminer la langue, puis appellent la logique de page localisée correspondante.

Ajoutez le répertoire locales au répertoire public pour les fichiers de traduction.

Installer

pnpm ajouter next-i18next réagir-i18next i18nex

Configuration

Répertoire de fichiers

|composants ..LangSwitcher.js ..LocLink.js ..MdRenderer.js |lib ..getStatic.js |pages ..[locales] ....index.js .._app.js .._document.js .. index.js |public ..locales ....en ...common.json ...index.md ....es ...common.json ..... .index.md |next-i18next. config.js | suivant.config.js

suivant.config.js

const { i18n } = require('./next-i18next.config'); const nextConfig = { i18n }

suivant-i18next.config.js

module.exports = { 'development', i18n : { defaultLocale : 'en', // locales : [ 'en', 'de', 'es',"cn"], locales : [ { nom : "English", code : "en", iso : "en-US", dir : "ltr" }, { nom : "español", code : "es", iso : "es-ES", dir : "ltr" }, { nom : "中文", code : "zh_cn", iso : "zh-CN", dir : "ltr" }, { nom : "Deutsch", code : "de", iso : "de-DE", dir : "ltr" }, { nom : "Italiano", code : "it", iso : "it-IT", dir : "ltr" }, { nom : "日本语", code : "ja", iso : " ja-JP", dir: "ltr" }, { nom: "한국인", code: "ko", iso: "ko-KR", dir: "ltr" }, { nom: "Português", code: " pt", iso : "pt-PT", dir : "ltr" }, ], }, }

Pour la configuration des paramètres régionaux, compte tenu du scénario d'affichage de la sélection de langue aux utilisateurs, je n'ai pas suivi la plupart des méthodes de configuration sur Internet.

lib/getStatic.js

importer { serverSideTranslations } depuis "next-i18next/serverSideTranslations" ; importer i18nextConfig depuis "@/next-i18next.config" ; exporter const getI18nPaths = () => i18nextConfig.i18n.locales.map((lng) => ({ params : { locale : lng.code,//ajouter du code }, })); export const getStaticPaths = () => ({ repli : false, chemins : getI18nPaths(), }); export const getI18nProps = async (ctx, ns = ["common"]) => { const locale = ctx?.params?.locale || i18nextConfig.i18n.defaultLocale; let props = { ...(await serverSideTranslations(locale, ns)), }; return props; };export const makeStaticProps = (ns = []) => async (ctx) => ({ props : wait getI18nProps(ctx, ns), });

C'est la logique utilisée pour obtenir le fichier de traduction de langue et le traduire côté serveur.

_app.js

importer { appWithTranslation } depuis "next-i18next" ; importer la mise en page depuis '../components/layout' importer { NextPage } depuis 'next' ; const MyApp = ({ Component, pageProps }) => ; exporter appWithTranslation par défaut (MyApp);

REMARQUE : Si vous n'utilisez pas Cette étiquette peut être supprimée directement.

_document.js

importer i18nextConfig depuis &quot;@/next-i18next.config&quot; ; // Autre code importer un document, { Html, Head, Main, NextScript, } depuis la classe &#039;next/document&#039; MyDocument extends Document { render() { const currentLocale = this. props.__NEXT_DATA__.query.locale || i18nextConfig.i18n.defaultLocale ; console.log(currentLocale) renvoie <html lang="{currentLocale}">
      <head>

        <link href="/app.css" />
        <link rel="shortcut icon" href="/icon.png" />
      </head>
      <body>
        <main />
        <nextscript />
      </body>


    </html>; } } exporter MyDocument par défaut

index.js

importer la maison, { getStaticProps } depuis "./[locale]/index" ; exporter la maison par défaut ; exporter { getStaticProps } ; 

dossier [locales]

Utilisé pour mettre en œuvre un routage international similaire à www.xxx.com/es

dossier public/locales

Utilisé pour stocker les fichiers de traduction.

Composants

Sélecteur de langue : LangSwitcher.js

code


'use client'
import React from "react";
import { useRouter } from "next/router"
import i18nextConfig from '@/next-i18next.config'
console.log(i18nextConfig.i18n.defaultLocale)
 

const LangSwitcher = ({ lang, ...rest}) => {

        const router = useRouter();

const  GetHref=(locale)=> {

    console.log(locale)

    let href = rest.href || router.asPath
    let pName = router.pathname
    Object.keys(router.query).forEach(k => {
      if (k === 'locale') {
        pName = pName.replace(`[${k}]`, locale)
        return
      }
      pName = pName.replace(`[${k}]`, router.query[k])
    })
    if (locale == i18nextConfig.i18n.defaultLocale) {

      if (pName == '/' + i18nextConfig.i18n.defaultLocale) {
        href = '/'
      } else {
        href = `${href}`

      }

    } else {
      if (locale) {
        href = rest.href ? `/${locale}${rest.href}` : pName
      }
      if (href.indexOf(`/${locale}`) < 0) {
        href = `/${locale}${href}`
      }
    }
    return href
  }

  const LocalChanged = (value) => {
    const thehref = GetHref(value)
    router.push(thehref)
  }

  

  return (

    <div>
      🌐
      <select onChange={(e) => LocalChanged(e.target.value)} defaultValue={lang} className="h-8 m-2 p-1 rounded border-current">

        <option value={lang} > {GetLangData(lang).name}</option>

        {i18nextConfig.i18n.locales.map(locale => {
          if (locale.code === lang) return null
          return (<option value={locale.code} key={locale.code}> {locale.name}</option>)
        })}

      </select>
    </div>
  )
}
 //export 

 export function GetLangData(lang) {
    var res = {}
    {
      i18nextConfig.i18n.locales.map(locale => {
        if (locale.code === lang) {
          console.log(locale)
          res = locale
        }
      })
    }
    return res

  }

export default LangSwitcher

Instructions:

Introduire les composants et les utiliser directement , et le paramètre lang est défini sur la langue actuelle.

importer LangSwitcher depuis './LangSwitcher' const { i18n } = useTranslation('home');

Composant Lien localisé : LocLink.js

importer React depuis &quot;react&quot;; importer un lien depuis &quot;next/link&quot;; importer { useRouter } depuis &quot;next/router&quot;; importer i18nextConfig depuis &#039;@/next-i18next.config&#039; const LinkComponent = ({ children, skipLocaleHandling, .. .rest }) =&gt; { const router = useRouter(); const locale = rest.locale || router.query.locale || &quot;&quot;; console.log(router) let href = rest.href || router.asPath; console.log(href) if (href.indexOf(&quot;http&quot;) === 0) skipLocaleHandling = true; if (locale &amp;&amp; !skipLocaleHandling) { // href = href console.log(i18nextConfig.i18n.defaultLocale) console. log(locale) locale==i18nextConfig.i18n.defaultLocale ? href : router.pathname.replace(&quot;[locale]&quot;, locale); } console.log(href) return (
    <>
      <link href="{href}" legacybehavior>
        <a {...rest}>{enfants}</a>
      </Link>
    </>
  ); } ; exporter le LinkComponent par défaut ;

Composants d'acquisition et de rendu de fichiers Markdown localisés : MdRenderer.js

importer ReactMarkdown depuis 'react-markdown' importer { useState, useEffect } depuis "react"; importer { useRouter } depuis "next/router" exporter la fonction par défaut MdRenderer({ chemin }) { const [a, setA] = useState("" ); const router = useRouter() fetch(path, { next: { revalidate: 0 } }) .then(response => réponse.text()) .then(data => { setA(data) } ).catch( err=>{console.log(err)}) retour (
{un && ( {un} )}
) }

Instructions

fonction

  • Présentation de "useTranslation"
  • définir t
  • Utilisez {t('xxx')}, c'est tout
import { useTranslation } from "next-i18next" ; const { t } = useTranslation(["common"]);//common.json est le fichier de traduction {t("xxx")}

Comment obtenir la langue actuelle

importer { useTranslation } depuis "next-i18next" ; const { i18n } = useTranslation('home'); console.log(i18n.langue)

Comment parcourir une liste de langues

Obtenez la liste des langues et personnalisez la navigation linguistique.

importer i18nextConfig depuis '@/next-i18next.config' {i18nextConfig.i18n.locales.map(locale => { if (locale.code === i18nextConfig.i18n.defaultLocale) return( {locale.nom} ) const thehref="/"+locale.code retour ( {locale.nom} ) })} 

Traduction des paragraphes de contenu

Si le contenu est obtenu à partir du backend, cela n'est pas nécessaire.

Cependant, si le contenu existe sur le front-end, il est très difficile de le stocker en json. Par conséquent, il peut être stocké en markdown, puis obtenir le fichier markdown de la version linguistique correspondante dans laquelle le contenu doit être affiché, et puis analysez-le et affichez-le.

importer MdRenderer depuis '../../components/MdRenderer' 

Résumer

Le multilingue permet à un site Web d’obtenir plus de trafic. Cette bonne pratique multilingue nextjs prend pleinement en compte les besoins du référencement. Adapté aux moteurs de recherche.

Convient aux stations d'outils, aux stations de mots clés, aux stations d'actualités et de contenu.



copyright © www.lyustu.com tous droits réservés.
Thème : TheMoon V3.0. Auteur : neo yang