Π˜ΡΡ…ΠΎΠ΄Π½Π°Ρ ΡΡ‚Π°Ρ‚ΡŒΡ: https://aralroca.com/blog/i18n-translations-nextjs-13-app-dir

Π’ этом постС я объясню, ΠΊΠ°ΠΊ Π»Π΅Π³ΠΊΠΎ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ Π½Π° страницах Π² app ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Next.js 13, Π½ΠΎΠ²ΠΎΠΉ ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΡ‹ для управлСния вашими страницами. Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΌ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Π³ΠΎΠ»ΠΎΠ²Π½ΠΎΠΉ Π±ΠΎΠ»ΠΈ.

ΠŸΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΌΡ‹ начнСм… НСмного контСкста

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, ΠΏΠΎΠ·Π²ΠΎΠ»ΡŒΡ‚Π΅ ΠΌΠ½Π΅ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ Π²Π°ΠΌ ΠΎ Next-translate. Π­Ρ‚ΠΎ ΠΎΠ΄Π½Π° ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ использования ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠ² Π½Π° страницах Next.js (ΠΎΠΊΠΎΠ»ΠΎ 70Β 000 Π·Π°Π³Ρ€ΡƒΠ·ΠΎΠΊ Π² нСдСлю). Next.js 9.

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ хранятся Π² locales/{lang}/{namespace}.json:

.
β”œβ”€β”€ en
β”‚   β”œβ”€β”€ common.json
β”‚   └── home.json
└── es
    β”œβ”€β”€ common.json
    └── home.json

*Однако ΠΈΡ… Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΈΠ· CDN ΠΈΠ»ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с ΠΎΠ½Π»Π°ΠΉΠ½-ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠΎΠΉ ΠΈΠ½Ρ‚Π΅Ρ€Π½Π°Ρ†ΠΈΠΎΠ½Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ°ΠΊ локализация.

πŸ¦„ Одна ΠΈΠ· Ρ†Π΅Π»Π΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ β€” Π±Ρ‹Ρ‚ΡŒ простой Π² использовании. Π‘ нСбольшой настройкой Π² Ρ„Π°ΠΉΠ»Π΅ i18n.js Π²Ρ‹ ΡƒΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эти ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ Π½Π° своих страницах ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ…:

import useTranslation from 'next-translate/useTranslation'

export default function Example() {
  const { t, lang } = useTranslation('common')
  return <h1>{t('example')}</h1>
}

🌍 Π•Ρ‰Π΅ ΠΎΠ΄Π½Π° Ρ†Π΅Π»ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ β€” ΠΈΠΌΠ΅Ρ‚ΡŒ всС основы i18n: ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΠΎΠ»ΡΡ†ΠΈΡŽ, мноТСствСнноС число, срСдства форматирования, ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ с HTML-Ρ‚Π΅Π³Π°ΠΌΠΈ ΠΈ Ρ‚.Β Π΄.

πŸ“¦ И Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° Ρ†Π΅Π»ΡŒ β€” Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³Ρ‡Π΅. Π’ вСрсии 1.0 ΠΌΡ‹ заставили Π΅Π³ΠΎ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ ~1 ΠšΠ‘, Π½ΠΎ Π² вСрсии 2.0 Π±Ρ‹Π»ΠΎ Π΅Ρ‰Π΅ большС ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ Π² этом постС.

Π― Π½Π΅ Π±ΡƒΠ΄Ρƒ Π²Π΄Π°Π²Π°Ρ‚ΡŒΡΡ Π² подробности Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°. Π― ΠΏΡ€ΠΈΠ³Π»Π°ΡˆΠ°ΡŽ вас ΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠ΅ΠΉ, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° я прСдставил Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π»ΠΈ ΠΎΠ½Π° проста Π² использовании, лСгковСсна ΠΈ содСрТит Π»ΠΈ всС основныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ i18n Π² Π½ΠΎΠ²ΠΎΠΉ ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Next.js 13 прСдставил Π² ΠΊΠΎΠ½Ρ†Π΅ 2022 Π³ΠΎΠ΄Π°: ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ прилоТСния…

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ прилоТСния?

Π’ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π² Next.js 13 (Π±Π΅Ρ‚Π°-вСрсия) прСдставлСна ​​новая систСма ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, которая ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΌΠ°ΠΊΠ΅Ρ‚Ρ‹, Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹ ΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ сСрвСрныС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ React 18.

Π‘Π΅Ρ€Π²Π΅Ρ€Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ β€” это Π½ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² React, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Π½Π° сСрвСрС ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° сСрвСрС. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²Π»ΡΡŽΡ‚ΡΡ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ ΡΠΎΠΊΡ€Π°Ρ‰Π΅Π½ΠΈΡŽ объСма ΠΊΠΎΠ΄Π°, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€. Π’Π°ΠΊΠΎΠ΅ сокращСниС объСма ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ React, особСнно Ρ‚Π΅Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с большими объСмами Π΄Π°Π½Π½Ρ‹Ρ….

Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΠΎΠ½ΠΈ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°Π»ΠΈΡΡŒ ΠΊΠ°ΠΊ способ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ "ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π²ΠΎΠ΄ΠΎΠΏΠ°Π΄Π°" Π² прилоТСниях React. Π­Ρ‚ΠΎ происходит, ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ React Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ Π΄Π°Π½Π½Ρ‹Π΅ с сСрвСра, Π½ΠΎ эти Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠΊΠ° нСдоступны. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ Β«Π²ΠΎΠ΄ΠΎΠΏΠ°Π΄ΡƒΒ» сСтСвых запросов, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ Π½ΡƒΠΆΠ½Ρ‹Ρ… Π΅ΠΌΡƒ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΡ€Π΅ΠΆΠ΄Π΅ Ρ‡Π΅ΠΌ ΠΎΠ½ смоТСт ΠΈΡ… ΠΎΡ‚ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΏΡ€ΠΈ отрисовкС ΠΈ влияСт Π½Π° взаимодСйствиС с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ. .

ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ сСрвСра ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ сСрвСру ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π·Π° ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ Ρ‚ΡƒΠ΄Π° ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌΡƒ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ React.

Они Ρ‚Π°ΠΊΠΆΠ΅ ΡΠΎΠΊΡ€Π°Ρ‰Π°ΡŽΡ‚ объСм ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ врСмя Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ React. Они Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ… Π² Π±ΠΎΠ»ΡŒΡˆΠΈΡ… прилоТСниях.

Однако Ссли Π² вашСм ΠΊΠΎΠ΄Π΅ Π΅ΡΡ‚ΡŒ части, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠ΅ взаимодСйствия с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ островки клиСнтских ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², Π³Π΄Π΅ страница ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅ ΠΊΠΈΠ»ΠΎΠ±Π°ΠΉΡ‚Ρ‹ JavaScript, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π½Π° этих участках. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ мСньшС JavaScript всСгда Π»ΡƒΡ‡ΡˆΠ΅, этот ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΈΠ΄Π΅Π°Π»Π΅Π½.

Одна ΠΈΠ· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ, связанных с ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΡ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с сСрвСрными ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ ΠΈ клиСнтскими островами, Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΡƒΡŽΡ‚ ΠΏΠΎ-Ρ€Π°Π·Π½ΠΎΠΌΡƒ ΠΈ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ собой Π΄Π²Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠΈΡ€Π°. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ†Π΅Π»ΡŒ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ способ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ использованиС ΠΎΠ±ΠΎΠΈΡ… простым ΠΈ согласованным насколько это Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.

Π“ΠΎΠ»ΠΎΠ²Π½Ρ‹Π΅ Π±ΠΎΠ»ΠΈ сСрвСрных ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ²

Если программист Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΈ с сСрвСрными, ΠΈ с клиСнтскими ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΡ‚ΡŒΡΡ с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ ΠΈ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ†ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ. Π΄Π²Π° Ρ‚ΠΈΠΏΠ° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ².

Одной ΠΈΠ· основных ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΌΠΈ Π½Π° сСрвСрС ΠΈ Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅. НапримСр, Ссли сСрвСрная страница Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ пространство ΠΈΠΌΠ΅Π½ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° ΠΈ всС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ страницы Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эти ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹, клиСнтскиС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ островного Ρ‚ΠΈΠΏΠ° Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ доступ ΠΊ Ρ‚Π΅ΠΌ ΠΆΠ΅ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π°ΠΌ Π±Π΅Π· получСния ΠΈΡ… ΠΎΡ‚ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, Ρ‡Ρ‚ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ >координация запросов Π΄Π°Π½Π½Ρ‹Ρ…, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Ρ… ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠΉ ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Ρ… эффСктивно Π²ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ сайта ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Π½Π΅Π½ΡƒΠΆΠ½ΠΎΠ΅ использованиС пропускной способности.

НаконСц, ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ с ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠ΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с сСрвСрными ΠΈ клиСнтскими ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ. ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ эти инструмСнты Ρ…ΠΎΡ€ΠΎΡˆΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ вмСстС, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ. Π˜Ρ‚Π°ΠΊ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΊΠ°ΠΊ ΠΌΡ‹ ΡΠΏΡ€Π°Π²ΠΈΠ»ΠΈΡΡŒ с этими ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ Π² Next-translate.

Π—Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ прилоТСния Next.js 13

Π’ Next-translate 2.0 ΠΌΡ‹ ΠΈΠ·ΠΎ всСх сил ΠΏΡ‹Ρ‚Π°Π»ΠΈΡΡŒ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ максимально ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ для ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ½Ρ†ΠΎΠ², ΠΌΡ‹ достигли этой Ρ†Π΅Π»ΠΈ, ΠΈ Π² вашСм i18n.js Π½Π΅Ρ‚ нСобходимости Π² Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ настройкС. πŸŽ‰

ΠŸΡ€ΠΎΡΡ‚ΠΎ ΠΈΠΌΠ΅ΠΉΡ‚Π΅ Π² Π²ΠΈΠ΄Ρƒ, 🧠 Ρ‡Ρ‚ΠΎ страницы, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ для страниц Π² >ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ прилоТСния:

// i18n.js
module.exports = {
  locales: ['en', 'ca', 'es'],
  defaultLocale: 'en',
  pages: {
    '*': ['common'],
    '/': ['home'], // app/page.tsx
    '/checkout': ['checkout'], // app/checkout/page.tsx
  },
}

Π­Ρ‚ΠΎ всС, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ! 😜

Наш ΠΏΠ»Π°Π³ΠΈΠ½, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΡƒΠΆΠ΅ присутствовал Π² Next-translate 1.0, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π² Next-translate 2.0 обСспСчиваСт Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠ² ΠΊΠ°ΠΊ Π½Π° сСрвСрных, Ρ‚Π°ΠΊ ΠΈ Π½Π° клиСнтских страницах, Π° Ρ‚Π°ΠΊΠΆΠ΅ островков клиСнтских ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π½Π° сСрвСрной страницС. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΡ‹ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠ»ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ€ нашСй Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ с 1,8Β ΠšΠ‘ Π΄ΠΎ 498Β Π‘ (ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ + gzip).

Π”ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ страницы всСгда ΠΈΠΌΠ΅Π»ΠΈ 1,8 ΠšΠ‘ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠ² Π² ΠΏΠ°ΠΊΠ΅Ρ‚Π΅, Π½ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ:

  • Если Ρƒ вас Π΅ΡΡ‚ΡŒ всС ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ Π² сСрвСрных ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°Ρ…: 0kb πŸ₯³
  • Если Π²Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ клиСнтскиС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ острова, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠ΅Π½ΡΡŽΡ‚ тСкст Π² зависимости ΠΎΡ‚ взаимодСйствия с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ: 498B πŸŽ‰

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эти ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ…ΡƒΠΊ useTranslation ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Trans:

🌊 Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° сСрвСра (+0kb): app/page.js:

import useTranslation from 'next-translate/useTranslation'

export default function HomePage() {
  const { t, lang } = useTranslation('home')
  return <h1>{t('title')}</h1>
}

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ Π΄Π΅Π»ΠΎ со страницСй сСрвСра, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ страницы ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΡΠ²Π»ΡΡŽΡ‚ΡΡ сСрвСрными ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ. Под ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ next-translate-plugin динамичСски Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ, Π±Π΅Π· использования Π»ΠΎΠ²ΡƒΡˆΠ΅ΠΊ useEffect ΠΈΠ»ΠΈ context. Он Ρ‚Π°ΠΊΠΆΠ΅ устанавливаСт язык ΠΈ пространство ΠΈΠΌΠ΅Π½ Π² HTML, позволяя Π΄Ρ€ΡƒΠ³ΠΈΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌ, Ρ‚Π°ΠΊΠΈΠΌ ΠΊΠ°ΠΊ островки Π½Π° сторонС ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹. загруТаСтся для страницы.

🏝️ Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° (+498B): app/checkout/page.js

"use client"
import useTranslation from 'next-translate/useTranslation'

export default function CheckoutPage() {
  const { t, lang } = useTranslation('checkout')
  return <h1>{t('title')}</h1>
}

Для клиСнтских страниц, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ стандартными Π² Next.js, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ клиСнтскиС, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ строки "use client", которая являСтся Π½ΠΎΠ²ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ app Next.js. 13. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ссли эта строка отсутствуСт, страница являСтся сСрвСрной. Под ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ next-translate-plugin Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ для этих страниц с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ…ΡƒΠΊΠ° useEffect. Π’ этом случаС Π½Π΅Ρ‚ нСобходимости Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ Π² HTML, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ всС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΡƒΠΆΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ доступ ΠΊ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π°ΠΌ. ΡΠΈΠ»ΡŒΠ½Ρ‹ΠΉ> Π±Π΅Π· нСобходимости увлаТнСния.

🏝️ ΠšΠ»ΠΈΠ΅Π½Ρ‚ΡΠΊΠΈΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ (+498B): components/ClientIsland

"use client"
import useTranslation from 'next-translate/useTranslation'

export default function ClientIsland() {
  const { t, lang } = useTranslation('common')
  return <h1>{t('island')}</h1>
}

Π’Π° ΠΆΠ΅ Π»ΠΎΠ³ΠΈΠΊΠ° ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΠΌΠ° ΠΈ ΠΊ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌ: Ссли Ρƒ Π½ΠΈΡ… Π½Π΅Ρ‚ строки "use client", ΠΎΠ½ΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΡΠ²Π»ΡΡŽΡ‚ΡΡ сСрвСрными, Π½ΠΎ Ссли ΠΎΠ½ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π΅Π΅, ΠΎΠ½ΠΈ становятся клиСнтскими островами ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° страницС сСрвСра. .

Π’ этом случаС next-translate-plugin ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚, Π½ΡƒΠΆΠ½Π° Π»ΠΈ гидратация, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ ΡƒΠΆΠ΅ доступны, Ссли Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠ°Ρ страница ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ Π±Ρ‹Π»ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΠΌ.

🌊 Π‘Π΅Ρ€Π²Π΅Ρ€Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ (+0kb): components/ServerSea

import useTranslation from 'next-translate/useTranslation'

export default function ServerSea() {
  const { t, lang } = useTranslation('common')
  return <h1>{t('sea')}</h1>
}

Для сСрвСрных ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΏΠ»Π°Π³ΠΈΠ½ Π½Π΅ выполняСт Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ ΡƒΠΆΠ΅ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Ρ‹ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ страницы, Π° прямой доступ ΠΊ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π°ΠΌ доступСн Ρ‡Π΅Ρ€Π΅Π· Ρ…ΡƒΠΊ useTranslation.

🌊🏝️🏝️ Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° сСрвСра с клиСнтскими островами (+498B): app/page.js

import ServerSea from '@components/ServerSea' // this part 0kb
import ClientIsland from '@components/ClientIsland'
import AnotherClientIsland from '@components/AnotherClientIsland'

export default function HomePage() {
  return (
    <>
      <ServerSea />
      <ClientIsland />
      <AnotherClientIsland />
    </>
}

Однако Ссли имССтся сСрвСрная страница с клиСнтскими ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ, клиСнтскиС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π³ΠΈΠ΄Ρ€Π°Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ прСдоставлСно Π½Π° сСрвСрной страницС, ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΡƒΡŽ Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ.

ΠœΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΡ i18n с ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ

Next.js 10 прСдставил ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ i18n, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΡƒΡŽ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒ страницы ΠΏΡƒΡ‚Π΅ΠΌ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° ΠΊ /es/page-name, Π³Π΄Π΅ доступ ΠΊ страницС pages/page-name.js осущСствлялся с использованиСм Ρ…ΡƒΠΊΠ° useRouter для получСния locale.

Однако, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ страницы Π±Ρ‹Π»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½Ρ‹ ΠΈΠ· ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° pages Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, эта ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΡ i18n большС Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ.

Π’ Next-translate ΠΌΡ‹ Ρ€Π΅ΡˆΠΈΠ»ΠΈ Π½Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ стрСмимся Π±Ρ‹Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ для ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° страниц, Π° Π½Π΅ для ΠΈΡ… ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ. ΠœΡ‹ надССмся, Ρ‡Ρ‚ΠΎ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ эта функция Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ app, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½Π° всС Π΅Ρ‰Π΅ находится Π² стадии Π±Π΅Ρ‚Π°-тСстирования ΠΈ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΅Ρ‰Π΅ Π½ΡƒΠΆΠ΄Π°ΡŽΡ‚ΡΡ Π² ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ΅.

Однако вся доступная Π² настоящСС врСмя ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° связана с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ lang. Π’ΠΎ Π΅ΡΡ‚ΡŒ /es/page-name?lang=es ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ страницу app/page-name/page.js, Π³Π΄Π΅ Ρƒ нас Π΅ΡΡ‚ΡŒ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ доступ ΠΊ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρƒ lang, ΠΈ Π²Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅, ΠΊΡ€ΠΎΠΌΠ΅ использования Ρ…ΡƒΠΊΠ° useTranslation для потрСблСния ваши ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹.

Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ язык Π² качСствС ΠΏΠΎΠ΄ΠΏΡƒΡ‚ΠΈ /es/page-name Π±Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ ПО, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ lang ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΠΈΡΡŒ:

// middleware.ts
import { NextResponse } from 'next/server'
import type { NextRequest } from 'next/server'
import i18n from './i18n'

// /es/page-name -> rewrites to -> /es/page-name?lang=es
export function middleware(request: NextRequest) {
  const locale = request.nextUrl.locale || i18n.defaultLocale
  request.nextUrl.searchParams.set('lang', locale)
  return NextResponse.rewrite(request.nextUrl)
}

Π—Π΄Π΅ΡΡŒ, Π² ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ обСспСчСнии, ΠΌΡ‹ Π½Π΅ добавляСм локаль Π² качСствС ΠΏΠΎΠ΄ΠΏΡƒΡ‚ΠΈ, Π° устраняСм Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π΄ΠΎΠ±Π°Π²Π»ΡΡ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ lang. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ всС Π΅Ρ‰Π΅ сущСствуСт, Π½ΠΎ Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ useRouter ΠΈΠ· next/router для доступа ΠΊ locale Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° app. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½Π°ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ Π½ΡƒΠΆΠ΅Π½, Π΄Π°ΠΆΠ΅ Ссли ΠΌΡ‹ скроСм Π΅Π³ΠΎ ΠΈΠ· поля зрСния.

И для Π½Π°Π²ΠΈΠ³Π°Ρ†ΠΈΠΈ:

<Link href={`/?lang=${locale}`} as={`/${locale}`}>{locale}</Link>

Если Π²Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ i18n, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ автоматичСскоС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π»ΠΎΠΊΠ°Π»ΠΈ, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ шаги ΠΈΠ· Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ Next.js:

ΠœΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹ Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… языках

Π”Π΅ΠΌΠΎ

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ прилоТСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ Next.js с ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠΌ app ΠΈ Next-translate, Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π²Π·Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π½Π° этот ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ обсуТдаСтся ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΡ‹ Next.js 13 Π² ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠΈ страницами, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ прСдставляСт Π½ΠΎΠ²ΡƒΡŽ систСму ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ Π²Ρ‹Π±ΠΎΡ€ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‰ΡƒΡŽ ΠΌΠ°ΠΊΠ΅Ρ‚Ρ‹, Π²Π»ΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹ ΠΈ сСрвСрныС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹. Π‘Π΅Ρ€Π²Π΅Ρ€Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ β€” это Π½ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° React, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ выполняСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° сСрвСрС, Ρ‡Ρ‚ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ объСм ΠΊΠΎΠ΄Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ Π² Π±Ρ€Π°ΡƒΠ·Π΅Ρ€, ΠΈ ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ React.

Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ Ρ‚Π°ΠΊΠΆΠ΅ обсуТдаСтся Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Next-translate, которая являСтся ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΈ использования ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠ² Π½Π° страницах Next.js. Он стрСмится Π±Ρ‹Ρ‚ΡŒ простым Π² использовании, ΠΈΠΌΠ΅Ρ‚ΡŒ всС Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ΅ для i18n ΠΈ Π±Ρ‹Ρ‚ΡŒ максимально Π»Π΅Π³ΠΊΠΈΠΌ. Π’ ΡΡ‚Π°Ρ‚ΡŒΠ΅ оцСниваСтся, остаСтся Π»ΠΈ Next-translate простым Π² использовании, Π»Π΅Π³ΠΊΠΈΠΌ ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ Π»ΠΈ ΠΎΠ½ всС основныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ i18n Π² Π½ΠΎΠ²ΠΎΠΉ ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΠ΅ Next.js 13, ΠΈ ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ ΠΊΠ°ΠΊ ΠΈΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ.

Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ