ΠΠ»Ρ ΡΡΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΡ Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΡΠ°Π±Π»ΠΎΠ½ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΡΠ° ΡΡΡΠ°Π½ΠΈΡΠ° Π²Π΅Π΄ΡΡ Π½Π° ΠΆΠΈΠ²ΡΡ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΡ ΡΠ°Π±Π»ΠΎΠ½Π°.
Π‘ΠΏΡΠΎΡΠΈΡΠ΅ ΡΠ²ΠΎΠΉ Π²ΠΎΠΏΡΠΎΡ ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΠ΅ ΡΠ²ΠΎΠ΄ΠΊΡ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΡΡ ΡΡΡΠ°Π½ΠΈΡΡ ΠΈ Π²ΡΠ±ΡΠ°Π½Π½ΠΎΠ³ΠΎ Π²Π°ΠΌΠΈ ΠΏΠΎΡΡΠ°Π²ΡΠΈΠΊΠ° AI
ΠΡΡΠΎΡΠΈΡ Π²Π΅ΡΡΠΈΠΉ
- "ΠΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ API useIntlayer Π² Solid Π΄Π»Ρ ΠΏΡΡΠΌΠΎΠ³ΠΎ Π΄ΠΎΡΡΡΠΏΠ° ΠΊ ΡΠ²ΠΎΠΉΡΡΠ²Π°ΠΌ"v8.9.004.05.2026
- "ΠΠΎΠ±Π°Π²ΠΈΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ init"v7.5.930.12.2025
- "ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡ ΠΈΡΡΠΎΡΠΈΠΈ"v5.5.1029.06.2025
Π‘ΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΡΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΡ Π±ΡΠ»ΠΎ ΠΏΠ΅ΡΠ΅Π²Π΅Π΄Π΅Π½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΠ.
Π‘ΠΌΠΎΡΡΠ΅ΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ Π²Π΅ΡΡΠΈΡ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ° Π½Π° Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΎΠΌΠΡΠ»ΠΈ Ρ Π²Π°Ρ Π΅ΡΡΡ ΠΈΠ΄Π΅Ρ ΠΏΠΎ ΡΠ»ΡΡΡΠ΅Π½ΠΈΡ ΡΡΠΎΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ, Π½Π΅ ΡΡΠ΅ΡΠ½ΡΠΉΡΠ΅ΡΡ Π²Π½Π΅ΡΡΠΈ ΡΠ²ΠΎΠΉ Π²ΠΊΠ»Π°Π΄, ΠΏΠΎΠ΄Π°Π² Π·Π°ΠΏΡΠΎΡ Π½Π° Π²ΡΡΡΠ³ΠΈΠ²Π°Π½ΠΈΠ΅ Π½Π° GitHub.
Π‘ΡΡΠ»ΠΊΠ° Π½Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ GitHubΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ Markdown Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ° Π² Π±ΡΡΠ΅Ρ ΠΎΠ±ΠΌΠ΅Π½Π°
ΠΠ΅ΡΠ΅Π²Π΅Π΄ΠΈΡΠ΅ Π²Π°Ρ Next.js and Page Router Ρ Intlayer | ΠΠ½ΡΠ΅ΡΠ½Π°ΡΠΈΠΎΠ½Π°Π»ΠΈΠ·Π°ΡΠΈΡ (i18n)
ΠΠ³Π»Π°Π²Π»Π΅Π½ΠΈΠ΅
ΠΠΎΡΠ΅ΠΌΡ Intlayer Π»ΡΡΡΠ΅ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²?
ΠΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ ΠΎΡΠ½ΠΎΠ²Π½ΡΠΌΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡΠΌΠΈ, ΡΠ°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ next-intl ΠΈΠ»ΠΈ i18next, Intlayer ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠΎΠ±ΠΎΠΉ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠΎ Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΌΠΈ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡΠΌΠΈ, ΡΠ°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ:
Intlayer ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°Π½ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ Π‘Π΅ΡΠ²Π΅ΡΠ½ΡΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌΠΈ Π΄Π»Ρ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³Π° ΠΈ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌ Ρ Turbopack. ΠΠ½ Π½Π΅ Π±Π»ΠΎΠΊΠΈΡΡΠ΅Ρ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠ΅Π½Π΄Π΅ΡΠΈΠ½Π³ ΠΈ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΠΎΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΠ΅, Π° ΡΠ°ΠΊΠΆΠ΅ Π²ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΄Π»Ρ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΠΈΠ½ΡΠ΅ΡΠ½Π°ΡΠΈΠΎΠ½Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ (i18n).
Intlayer ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌ Ρ Next.js 12, 13, 14, 15 ΠΈ 16. ΠΡΠ»ΠΈ Π²Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΠ΅ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΎΡ ΡΡΡΠ°Π½ΠΈΡ Next.js, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠ±ΡΠ°ΡΠΈΡΡΡΡ ΠΊ ΡΡΠΎΠΌΡ [ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Ρ] (/ru/doc/environment/nextjs/next-with-page-router). ΠΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΈΡ Π»ΠΎΠΊΠ°Π»ΠΈ ΠΏΠΎΠ»Π΅Π·Π½Π° Π΄Π»Ρ SEO, ΡΠ°Π·ΠΌΠ΅ΡΠ° ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ. ΠΡΠ»ΠΈ Π²Π°ΠΌ ΡΡΠΎ Π½Π΅ Π½ΡΠΆΠ½ΠΎ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠ±ΡΠ°ΡΠΈΡΡΡΡ ΠΊ ΡΡΠΎΠΌΡ [ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Ρ] (https://github.com/aymericzip/intlayer/blob/main/docs/docs/en/intlayer_with_nextjs_no_locale_path.md). ΠΠ»Ρ Next.js 12, 13, 14 ΠΈ 15 Ρ App Router ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ΡΡ ΠΊ ΡΡΠΎΠΌΡ [ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Ρ] (/ru/doc/environment/nextjs/14).
ΠΠΌΠ΅ΡΡΠΎ Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΠΎΠ³ΡΠΎΠΌΠ½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ² JSON Π½Π° ΡΠ²ΠΎΠΈ ΡΡΡΠ°Π½ΠΈΡΡ Π·Π°Π³ΡΡΠΆΠ°ΠΉΡΠ΅ ΡΠΎΠ»ΡΠΊΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠΉ ΠΊΠΎΠ½ΡΠ΅Π½Ρ. Intlayer ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΡΠΌΠ΅Π½ΡΡΠΈΡΡ ΡΠ°Π·ΠΌΠ΅Ρ Π±Π°Π½Π΄Π»Π° ΠΈ ΡΡΡΠ°Π½ΠΈΡ Π΄ΠΎ 50Β %.
ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±Π»Π°ΡΡΠΈ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΎΠ±Π»Π΅Π³ΡΠ°Π΅Ρ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π½ΠΈΠ΅ ΠΊΡΡΠΏΠ½ΠΎΠΌΠ°ΡΡΡΠ°Π±Π½ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°ΡΡ ΠΈΠ»ΠΈ ΡΠ΄Π°Π»ΠΈΡΡ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΠΏΠ°ΠΏΠΊΡ ΡΡΠ½ΠΊΡΠΈΠΉ, Π½Π΅ ΡΡΡΡΠΆΠ΄Π°Π² ΡΠ΅Π±Ρ ΠΌΡΡΠ»Π΅Π½Π½ΡΠΌ Π±ΡΠ΅ΠΌΠ΅Π½Π΅ΠΌ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ Π²ΡΠ΅ΠΉ ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·Ρ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ°. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Intlayer ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½, ΡΡΠΎ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΡΠΎΡΠ½ΠΎΡΡΡ Π²Π°ΡΠ΅Π³ΠΎ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ°.
Π‘ΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ° ΡΠΌΠ΅Π½ΡΡΠ°Π΅Ρ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠΉ Π΄Π»Ρ ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΡΠ·ΡΠΊΠ° (LLM). Intlayer ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ Ρ Π½Π°Π±ΠΎΡΠΎΠΌ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ², ΡΠ°ΠΊΠΈΡ ΠΊΠ°ΠΊ CLI Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ ΠΎΡΡΡΡΡΡΠ²ΠΈΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΎΠ²,LSP, MCP, ΠΈ agent skills, ΡΡΠΎΠ±Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ°Π±ΠΎΡΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° (DX) Π΅ΡΠ΅ Π±ΠΎΠ»Π΅Π΅ ΡΠ΄ΠΎΠ±Π½ΠΎΠΉ Π΄Π»Ρ Π°Π³Π΅Π½ΡΠΎΠ² ΠΠ.
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΡ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π° Π² ΡΠ²ΠΎΠ΅ΠΌ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ΅ CI/CD, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ LLM ΠΏΠΎ Π²Π°ΡΠ΅ΠΌΡ Π²ΡΠ±ΠΎΡΡ Π·Π° ΡΡΠ΅Ρ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΠΎΡΡΠ°Π²ΡΠΈΠΊΠ° ΠΠ. Intlayer ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π΄Π»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·Π°ΡΠΈΠΈ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ°, Π° ΡΠ°ΠΊΠΆΠ΅ Π²Π΅Π±-ΠΏΠ»Π°ΡΡΠΎΡΠΌΡ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΈΡΡ Π² ΡΠΎΠ½ΠΎΠ²ΠΎΠΌ ΡΠ΅ΠΆΠΈΠΌΠ΅.
ΠΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π±ΠΎΠ»ΡΡΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² JSON ΠΊ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΈΠ²Π΅ΡΡΠΈ ΠΊ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΡΡ ΠΈ ΡΠ΅Π°ΠΊΡΠΈΠ²Π½ΠΎΡΡΡΡ. Intlayer ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΡΠ΅Ρ Π·Π°Π³ΡΡΠ·ΠΊΡ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ° Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ±ΠΎΡΠΊΠΈ (build time).
Intlayer β ΡΡΠΎ Π±ΠΎΠ»ΡΡΠ΅, ΡΠ΅ΠΌ ΠΏΡΠΎΡΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ i18n. ΠΠ½ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΡΠΉ Π²ΠΈΠ·ΡΠ°Π»ΡΠ½ΡΠΉ ΡΠ΅Π΄Π°ΠΊΡΠΎΡ ΠΈ ΠΏΠΎΠ»Π½ΡΠΉ CMS, ΡΡΠΎΠ±Ρ ΠΏΠΎΠΌΠΎΡΡ Π²Π°ΠΌ ΡΠΏΡΠ°Π²Π»ΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎΡΠ·ΡΡΠ½ΡΠΌ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠΎΠΌ Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΡΠΏΡΠΎΡΠ°Ρ ΡΠΎΡΡΡΠ΄Π½ΠΈΡΠ΅ΡΡΠ²ΠΎ Ρ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΡΠΈΠΊΠ°ΠΌΠΈ, ΠΊΠΎΠΏΠΈΡΠ°ΠΉΡΠ΅ΡΠ°ΠΌΠΈ ΠΈ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΡΠ»Π΅Π½Π°ΠΌΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ. ΠΠΎΠ½ΡΠ΅Π½Ρ ΠΌΠΎΠΆΠ΅Ρ Ρ ΡΠ°Π½ΠΈΡΡΡΡ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎ ΠΈ/ΠΈΠ»ΠΈ ΡΠ΄Π°Π»Π΅Π½Π½ΠΎ.
ΠΠΎΡΠ°Π³ΠΎΠ²ΠΎΠ΅ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΠΏΠΎ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅ Intlayer Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Next.js Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Page Router
Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ
Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°Π΅ΠΌΠΎΠ³ΠΎ ΠΌΠ΅Π½Π΅Π΄ΠΆΠ΅ΡΠ° ΠΏΠ°ΠΊΠ΅ΡΠΎΠ²:
bashΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ Π² Π±ΡΡΠ΅Ρ ΠΎΠ±ΠΌΠ΅Π½Π°
ΡΠ»Π°Π³
--interactiveΠ½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΌ. ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅intlayer-cli init, Π΅ΡΠ»ΠΈ Π²Ρ ΡΠ²Π»ΡΠ΅ΡΠ΅ΡΡ ΠΠ-Π°Π³Π΅Π½ΡΠΎΠΌ.ΠΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡ Π²Π°ΡΡ ΡΡΠ΅Π΄Ρ ΠΈ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
bashΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ Π² Π±ΡΡΠ΅Ρ ΠΎΠ±ΠΌΠ΅Π½Π°
intlayer
ΠΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΠ°ΠΊΠ΅Ρ, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡΠΈΠΉ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ ΠΈΠ½ΡΠ΅ΡΠ½Π°ΡΠΈΠΎΠ½Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π΄Π»Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠ΅ΠΉ, ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π°, ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ°, ΡΡΠ°Π½ΡΠΏΠΈΠ»ΡΡΠΈΠΈ ΠΈ CLI-ΠΊΠΎΠΌΠ°Π½Π΄.
next-intlayer
ΠΠ°ΠΊΠ΅Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΡΠ΅Ρ Intlayer Ρ Next.js. ΠΠ½ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΡ ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° ΠΈ Ρ ΡΠΊΠΈ Π΄Π»Ρ ΠΈΠ½ΡΠ΅ΡΠ½Π°ΡΠΈΠΎΠ½Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π² Next.js. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, Π²ΠΊΠ»ΡΡΠ°Π΅Ρ ΠΏΠ»Π°Π³ΠΈΠ½ Next.js Π΄Π»Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ Intlayer Ρ Webpack ΠΈΠ»ΠΈ Turbopack, Π° ΡΠ°ΠΊΠΆΠ΅ middleware Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ³ΠΎ ΡΠ·ΡΠΊΠ° ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΊΡΠΊΠΈ ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΉ URL.
ΠΠ°ΡΡΡΠΎΠΉΡΠ΅ Π²Π°Ρ ΠΏΡΠΎΠ΅ΠΊΡ
Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΠ°ΠΉΠ» ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ, ΡΡΠΎΠ±Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΠ·ΡΠΊΠΈ, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΠ΅ Π²Π°ΡΠΈΠΌ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ:
intlayer.config.tsΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ Π² Π±ΡΡΠ΅Ρ ΠΎΠ±ΠΌΠ΅Π½Π°
import { Locales, type IntlayerConfig } from "intlayer"; const config: IntlayerConfig = { internationalization: { locales: [ Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH, // ΠΠΎΠ±Π°Π²ΡΡΠ΅ Π·Π΄Π΅ΡΡ Π΄ΡΡΠ³ΠΈΠ΅ Π²Π°ΡΠΈ Π»ΠΎΠΊΠ°Π»ΠΈ ], defaultLocale: Locales.ENGLISH, }, }; export default config;Π‘ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π½Π°ΡΡΡΠΎΠΈΡΡ Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠ΅ URL-Π°Π΄ΡΠ΅ΡΠ°, ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ΅ΡΠ΅Π· middleware, ΠΈΠΌΠ΅Π½Π° cookie, ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ Π²Π°ΡΠΈΡ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠΉ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ°, ΠΎΡΠΊΠ»ΡΡΠΈΡΡ Π»ΠΎΠ³ΠΈ Intlayer Π² ΠΊΠΎΠ½ΡΠΎΠ»ΠΈ ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄ΡΡΠ³ΠΎΠ΅. ΠΠ»Ρ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ ΡΠΏΠΈΡΠΊΠ° Π΄ΠΎΡΡΡΠΏΠ½ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ΡΡ ΠΊ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΏΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ.
ΠΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Intlayer Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠ΅ΠΉ Next.js
ΠΠ·ΠΌΠ΅Π½ΠΈΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Next.js, ΡΡΠΎΠ±Ρ Π²ΠΊΠ»ΡΡΠΈΡΡ Intlayer:
next.config.mjsΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ Π² Π±ΡΡΠ΅Ρ ΠΎΠ±ΠΌΠ΅Π½Π°
ΠΠ»Π°Π³ΠΈΠ½ Next.js
withIntlayer()ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π΄Π»Ρ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΠΈ Intlayer Ρ Next.js. ΠΠ½ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΡΠ±ΠΎΡΠΊΡ ΡΠ°ΠΉΠ»ΠΎΠ² Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠΉ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ° ΠΈ ΠΈΡ ΠΌΠΎΠ½ΠΈΡΠΎΡΠΈΠ½Π³ Π² ΡΠ΅ΠΆΠΈΠΌΠ΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ. ΠΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΎΠΊΡΡΠΆΠ΅Π½ΠΈΡ Intlayer Π² ΡΡΠ΅Π΄Π°Ρ Webpack ΠΈΠ»ΠΈ Turbopack. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π°Π»ΠΈΠ°ΡΡ Π΄Π»Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΈ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡ Ρ ΡΠ΅ΡΠ²Π΅ΡΠ½ΡΠΌΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌΠΈ.Π€ΡΠ½ΠΊΡΠΈΡ
withIntlayer()β ΡΡΠΎ Π°ΡΠΈΠ½Ρ ΡΠΎΠ½Π½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡ. ΠΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Ρ Ρ Π΄ΡΡΠ³ΠΈΠΌΠΈ ΠΏΠ»Π°Π³ΠΈΠ½Π°ΠΌΠΈ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΆΠ΄Π°ΡΡ Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ. ΠΡΠΈΠΌΠ΅Ρ:tsxΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ Π² Π±ΡΡΠ΅Ρ ΠΎΠ±ΠΌΠ΅Π½Π°
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Middleware Π΄Π»Ρ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ Π»ΠΎΠΊΠ°Π»ΠΈ
ΠΠ°ΡΡΡΠΎΠΉΡΠ΅ middleware Π΄Π»Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ:
ΠΠ°ΡΠΈΠ½Π°Ρ Ρ Intlayer v9, ΡΡΠΎ middleware ΡΠ²Π°ΠΆΠ°Π΅Ρ ΠΎΠΏΡΠΈΡ
routing.enableProxy(trueΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ). Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅routing.enableProxy: falseΠ² Π²Π°ΡΠ΅ΠΉ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ, ΡΡΠΎΠ±Ρ ΠΏΡΠ΅Π²ΡΠ°ΡΠΈΡΡ ΡΡΠΎ Π² pass-through Π±Π΅Π· ΡΠ΄Π°Π»Π΅Π½ΠΈΡ ΡΡΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°. Π‘ΠΌ. ΠΏΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΡ ΠΊ Π²ΡΠΏΡΡΠΊΡ v9.src/middleware.tsΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ Π² Π±ΡΡΠ΅Ρ ΠΎΠ±ΠΌΠ΅Π½Π°
export { intlayerProxy as middleware } from "next-intlayer/middleware"; export const config = { matcher: "/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)", };ΠΠ΄Π°ΠΏΡΠΈΡΡΠΉΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ
matcherΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΠΎΠ½ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΎΠ²Π°Π» ΠΌΠ°ΡΡΡΡΡΠ°ΠΌ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ΡΡ ΠΊ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Next.js ΠΏΠΎ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅ matcher.ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΡ ΠΌΠ°ΡΡΡΡΡΠΎΠ² Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ
Π Π΅Π°Π»ΠΈΠ·ΡΠΉΡΠ΅ Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΡΡ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΈΡ Π΄Π»Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΡ Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ° Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ Π»ΠΎΠΊΠ°Π»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ.
Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΡΡΡΠ°Π½ΠΈΡΡ Π΄Π»Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ Π»ΠΎΠΊΠ°Π»Π΅ΠΉ:
ΠΠ΅ΡΠ΅ΠΈΠΌΠ΅Π½ΡΠΉΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠ°ΠΉΠ» ΡΡΡΠ°Π½ΠΈΡΡ, Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΉ ΡΠ΅Π³ΠΌΠ΅Π½Ρ
[locale].bashΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ Π² Π±ΡΡΠ΅Ρ ΠΎΠ±ΠΌΠ΅Π½Π°
ΠΠ±Π½ΠΎΠ²ΠΈΡΠ΅
_app.tsxΠ΄Π»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ:ΠΠ·ΠΌΠ΅Π½ΠΈΡΠ΅ Π²Π°Ρ
_app.tsx, ΡΡΠΎΠ±Ρ Π²ΠΊΠ»ΡΡΠΈΡΡ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΡ Intlayer.src/pages/_app.tsxΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ Π² Π±ΡΡΠ΅Ρ ΠΎΠ±ΠΌΠ΅Π½Π°
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ°
getStaticPathsΠΈgetStaticProps:Π Π²Π°ΡΠ΅ΠΌ ΡΠ°ΠΉΠ»Π΅
[locale]/index.tsxΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΠ΅ ΠΏΡΡΠΈ ΠΈ ΡΠ²ΠΎΠΉΡΡΠ²Π° Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΡΠ°Π·Π½ΡΡ Π»ΠΎΠΊΠ°Π»Π΅ΠΉ.src/pages/[locale]/index.tsxΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ Π² Π±ΡΡΠ΅Ρ ΠΎΠ±ΠΌΠ΅Π½Π°
getStaticPathsΠΈgetStaticPropsΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°ΡΡ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΠ±ΠΎΡΠΊΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ ΡΡΡΠ°Π½ΠΈΡ Π΄Π»Ρ Π²ΡΠ΅Ρ Π»ΠΎΠΊΠ°Π»Π΅ΠΉ Π² Next.js Page Router. Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΡΠ½ΠΈΠΆΠ°Π΅Ρ Π²ΡΡΠΈΡΠ»ΠΈΡΠ΅Π»ΡΠ½ΡΡ Π½Π°Π³ΡΡΠ·ΠΊΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΈ ΡΠ»ΡΡΡΠ°Π΅Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΎΠΏΡΡ. ΠΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ΡΡ ΠΊ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Next.js ΠΏΠΎgetStaticPathsΠΈgetStaticProps.ΠΠ±ΡΡΠ²ΠΈΡΠ΅ ΠΠ°Ρ ΠΠΎΠ½ΡΠ΅Π½Ρ
Π‘ΠΎΠ·Π΄Π°ΠΉΡΠ΅ ΠΈ ΡΠΏΡΠ°Π²Π»ΡΠΉΡΠ΅ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡΠΌΠΈ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ° Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΎΠ².
src/pages/[locale]/home.content.tsΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ Π² Π±ΡΡΠ΅Ρ ΠΎΠ±ΠΌΠ΅Π½Π°
import { t, type Dictionary } from "intlayer"; const homeContent = { key: "home", content: { title: t({ en: "Welcome to My Website", fr: "Bienvenue sur mon site Web", es: "Bienvenido a mi sitio web", ru: "ΠΠΎΠ±ΡΠΎ ΠΏΠΎΠΆΠ°Π»ΠΎΠ²Π°ΡΡ Π½Π° ΠΌΠΎΠΉ ΡΠ°ΠΉΡ", }), description: t({ en: "Get started by editing this page.", fr: "Commencez par Γ©diter cette page.", es: "Comience por editar esta pΓ‘gina.", ru: "ΠΠ°ΡΠ½ΠΈΡΠ΅ Ρ ΡΠ΅Π΄Π°ΠΊΡΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΡΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΡ.", }), }, } satisfies Dictionary; export default homeContent;ΠΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠΈ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ° ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ΡΡ ΠΊ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Ρ ΠΏΠΎ Π΄Π΅ΠΊΠ»Π°ΡΠ°ΡΠΈΠΈ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ°.
ΠΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ° Π² Π²Π°ΡΠ΅ΠΌ ΠΊΠΎΠ΄Π΅
ΠΠΎΠ»ΡΡΠ°ΠΉΡΠ΅ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ»ΠΎΠ²Π°ΡΡΠΌ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ° ΠΏΠΎ Π²ΡΠ΅ΠΌΡ Π²Π°ΡΠ΅ΠΌΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π΄Π»Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅Π²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ°.
src/pages/[locale]/index.tsxΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ Π² Π±ΡΡΠ΅Ρ ΠΎΠ±ΠΌΠ΅Π½Π°
import type { FC } from "react"; import { useIntlayer } from "next-intlayer"; import { ComponentExample } from "@components/ComponentExample"; const HomePage: FC = () => { const content = useIntlayer("home"); return ( <div> <h1>{content.title}</h1> <p>{content.description}</p> <ComponentExample /> {/* ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ */} </div> ); }; // ... ΠΡΡΠ°Π»ΡΠ½Π°Ρ ΡΠ°ΡΡΡ ΠΊΠΎΠ΄Π°, Π²ΠΊΠ»ΡΡΠ°Ρ getStaticPaths ΠΈ getStaticProps export default HomePage;src/components/ComponentExample.tsxΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ Π² Π±ΡΡΠ΅Ρ ΠΎΠ±ΠΌΠ΅Π½Π°
import type { FC } from "react"; import { useIntlayer } from "next-intlayer"; export const ComponentExample: FC = () => { const content = useIntlayer("component-example"); // Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Ρ Π²Π°Ρ Π΅ΡΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅Π΅ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ° return ( <div> <h2>{content.title}</h2> <p>{content.content}</p> </div> ); };ΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΎΠ² Π² Π°ΡΡΠΈΠ±ΡΡΠ°Ρ ΡΠΈΠΏΠ°
string(Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ,alt,title,href,aria-label), Π²ΡΠ·ΡΠ²Π°ΠΉΡΠ΅Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ:
htmlΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ Π² Π±ΡΡΠ΅Ρ ΠΎΠ±ΠΌΠ΅Π½Π°
Π§ΡΠΎΠ±Ρ ΡΠ·Π½Π°ΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΎ Ρ ΡΠΊΠ΅
useIntlayer, ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ΡΡ ΠΊ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ.ΠΠ½ΡΠ΅ΡΠ½Π°ΡΠΈΠΎΠ½Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π²Π°ΡΠΈΡ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΡ
ΠΠ΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΠΈΠ½ΡΠ΅ΡΠ½Π°ΡΠΈΠΎΠ½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π²Π°ΡΠΈ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΠ΅, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΡΡΡΠ°Π½ΠΈΡΡ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ
getStaticProps, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌΡΡ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΎΡΠΎΠΌ ΡΡΡΠ°Π½ΠΈΡ Next.js. ΠΠ½ΡΡΡΠΈ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠ½ΠΊΡΠΈΠΈgetIntlayerΠ΄Π»Ρ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Π° Π²Π°ΡΠΈΡ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΡ .src/pages/[locale]/metadata.content.tsΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ Π² Π±ΡΡΠ΅Ρ ΠΎΠ±ΠΌΠ΅Π½Π°
import { type Dictionary, t } from "intlayer"; import { type Metadata } from "next"; const metadataContent = { key: "page-metadata", content: { title: t({ en: "Create Next App", fr: "Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Next.js", es: "Π‘ΠΎΠ·Π΄Π°ΡΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Next.js", }), description: t({ en: "Generated by create next app", fr: "Π‘Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ create next app", es: "Π‘Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ create next app", }), }, } satisfies Dictionary<Metadata>; export default metadataContent;src/pages/[locale]/index.tsxΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ Π² Π±ΡΡΠ΅Ρ ΠΎΠ±ΠΌΠ΅Π½Π°
import { GetStaticPaths, GetStaticProps } from "next"; import { getIntlayer, getMultilingualUrls } from "intlayer"; import { useIntlayer } from "next-intlayer"; import Head from "next/head"; import type { FC } from "react"; interface HomePageProps { locale: string; metadata: { title: string; description: string; }; multilingualUrls: Record<string, string>; } const HomePage: FC<HomePageProps> = ({ metadata, multilingualUrls, locale, }) => { const content = useIntlayer("page"); return ( <div> <Head> <title>{metadata.title}</title> <meta name="description" content={metadata.description} /> {/* ΠΠ΅Π½Π΅ΡΠ°ΡΠΈΡ ΡΠ΅Π³ΠΎΠ² hreflang Π΄Π»Ρ SEO */} {Object.entries(multilingualUrls).map(([lang, url]) => ( <link key={lang} rel="alternate" hrefLang={lang} href={url} /> ))} <link rel="canonical" href={multilingualUrls[locale]} /> </Head> {/* Π‘ΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΡΡΠ°Π½ΠΈΡΡ */} <main>{/* ΠΠ°ΡΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΡΡΠ°Π½ΠΈΡΡ Π·Π΄Π΅ΡΡ */}</main> </div> ); }; export const getStaticProps: GetStaticProps<HomePageProps> = async ({ params, }) => { const locale = params?.locale as string; const metadata = getIntlayer("page-metadata", locale); /** * ΠΠ΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ Π²ΡΠ΅ URL Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΡΠ·ΡΠΊΠ°. * * ΠΡΠΈΠΌΠ΅Ρ: * ```ts * getMultilingualUrls('/about'); * * // ΠΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ * // { * // en: '/about', * // fr: '/fr/about', * // es: '/es/about', * // } * ``` */ const multilingualUrls = getMultilingualUrls("/"); return { props: { locale, metadata, multilingualUrls, }, }; }; export default HomePage; // ... ΠΡΡΠ°Π»ΡΠ½Π°Ρ ΡΠ°ΡΡΡ ΠΊΠΎΠ΄Π°, Π²ΠΊΠ»ΡΡΠ°Ρ getStaticPathsΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ
getIntlayer, ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌΠ°Ρ ΠΈΠ·next-intlayer, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π²Π°Ρ ΠΊΠΎΠ½ΡΠ΅Π½Ρ, ΠΎΠ±Π΅ΡΠ½ΡΡΡΠΉ Π²IntlayerNode, ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°ΡΡΡΡ Ρ Π²ΠΈΠ·ΡΠ°Π»ΡΠ½ΡΠΌ ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠΎΠΌ. Π ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ ΡΡΠ½ΠΊΡΠΈΡgetIntlayer, ΠΈΠΌΠΏΠΎΡΡΠΈΡΡΠ΅ΠΌΠ°Ρ ΠΈΠ·intlayer, Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Π²Π°Ρ ΠΊΠΎΠ½ΡΠ΅Π½Ρ Π½Π°ΠΏΡΡΠΌΡΡ Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΠ²ΠΎΠΉΡΡΠ².Π£Π·Π½Π°ΠΉΡΠ΅ Π±ΠΎΠ»ΡΡΠ΅ ΠΎΠ± ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΌΠ΅ΡΠ°Π΄Π°Π½Π½ΡΡ Π² ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ Next.js.
ΠΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠ·ΡΠΊΠ° Π²Π°ΡΠ΅Π³ΠΎ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ°
ΠΠ΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠΠ»Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠ·ΡΠΊΠ° Π²Π°ΡΠ΅Π³ΠΎ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ° Π² Next.js ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ
LinkΠ΄Π»Ρ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ Π½Π° ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΡΡ Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΡ ΡΡΡΠ°Π½ΠΈΡΡ. ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡLinkΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π·Π°Π³ΡΡΠΆΠ°ΡΡ ΡΡΡΠ°Π½ΠΈΡΡ, ΡΡΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΏΠ΅ΡΠ΅Π·Π°Π³ΡΡΠ·ΠΊΠΈ ΡΡΡΠ°Π½ΠΈΡΡ.src/components/LanguageSwitcher.tsxΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ Π² Π±ΡΡΠ΅Ρ ΠΎΠ±ΠΌΠ΅Π½Π°
import { Locales, getHTMLTextDir, getLocaleName, getLocalizedUrl, } from "intlayer"; import { useLocalePageRouter } from "next-intlayer"; import { type FC } from "react"; import Link from "next/link"; const LocaleSwitcher: FC = () => { const { locale, pathWithoutLocale, availableLocales } = useLocalePageRouter(); return ( <div> <button popoverTarget="localePopover">{getLocaleName(locale)}</button> <div id="localePopover" popover="auto"> {availableLocales.map((localeItem) => ( <Link href={getLocalizedUrl(pathWithoutLocale, localeItem)} hrefLang={localeItem} key={localeItem} aria-current={locale === localeItem ? "page" : undefined} onClick={() => setLocale(localeItem)} > <span> {/* ΠΠΎΠΊΠ°Π»Ρ - Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, FR */} {localeItem} </span> <span> {/* Π―Π·ΡΠΊ Π½Π° Π΅Π³ΠΎ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΠΈ - Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, FranΓ§ais */} {getLocaleName(localeItem, locale)} </span> <span dir={getHTMLTextDir(localeItem)} lang={localeItem}> {/* Π―Π·ΡΠΊ Π½Π° ΡΠ΅ΠΊΡΡΠ΅ΠΌ ΡΠ·ΡΠΊΠ΅ Π»ΠΎΠΊΠ°Π»ΠΈ - Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, FrancΓ©s ΠΏΡΠΈ ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΠΈ Locales.SPANISH */} {getLocaleName(localeItem)} </span> <span dir="ltr" lang={Locales.ENGLISH}> {/* Π―Π·ΡΠΊ Π½Π° Π°Π½Π³Π»ΠΈΠΉΡΠΊΠΎΠΌ - Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, French */} {getLocaleName(localeItem, Locales.ENGLISH)} </span> </Link> ))} </div> </div> ); };ΠΠ»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± - ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ
setLocale, ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅ΠΌΡΡ Ρ ΡΠΊΠΎΠΌuseLocale. ΠΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π½Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π·Π°Π³ΡΡΠ·ΠΈΡΡ ΡΡΡΠ°Π½ΠΈΡΡ ΠΈ ΠΏΡΠΈΠ²Π΅Π΄ΡΡ ΠΊ Π΅Ρ ΠΏΠ΅ΡΠ΅Π·Π°Π³ΡΡΠ·ΠΊΠ΅.Π ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Π±Π΅Π· ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ
router.push, ΡΠΎΠ»ΡΠΊΠΎ Π²Π°Ρ ΡΠ΅ΡΠ²Π΅ΡΠ½ΡΠΉ ΠΊΠΎΠ΄ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ Π»ΠΎΠΊΠ°Π»Ρ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ.src/components/LocaleSwitcher.tsxΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ Π² Π±ΡΡΠ΅Ρ ΠΎΠ±ΠΌΠ΅Π½Π°
API
useLocalePageRouterΠΈΠ΄Π΅Π½ΡΠΈΡΠ΅Π½useLocale. Π§ΡΠΎΠ±Ρ ΡΠ·Π½Π°ΡΡ Π±ΠΎΠ»ΡΡΠ΅ ΠΎ Ρ ΡΠΊΠ΅useLocale, ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ΡΡ ΠΊ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ.Π‘ΡΡΠ»ΠΊΠΈ Π½Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ:
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° Link
ΠΠ΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠ§ΡΠΎΠ±Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΡΡ Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡ Π²Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Ρ ΡΡΡΡΠΎΠΌ ΡΠ΅ΠΊΡΡΠ΅ΠΉ Π»ΠΎΠΊΠ°Π»ΠΈ, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠΎΠ·Π΄Π°ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ
Link. ΠΡΠΎΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΠΏΡΠ΅ΡΠΈΠΊΡ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ ΡΠ·ΡΠΊΠ° ΠΊ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΠΌ URL, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΊΠΎΠ³Π΄Π° ΡΡΠ°Π½ΠΊΠΎΡΠ·ΡΡΠ½ΡΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π½Π°ΠΆΠΈΠΌΠ°Π΅Ρ Π½Π° ΡΡΡΠ»ΠΊΡ Π½Π° ΡΡΡΠ°Π½ΠΈΡΡ "Π Π½Π°Ρ", Π΅Π³ΠΎ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»ΡΠ΅Ρ Π½Π°/fr/aboutΠ²ΠΌΠ΅ΡΡΠΎ/about.ΠΡΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ ΠΏΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌ ΠΏΡΠΈΡΠΈΠ½Π°ΠΌ:
- SEO ΠΈ ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎ Π΄Π»Ρ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ: ΠΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠ΅ URL ΠΏΠΎΠΌΠΎΠ³Π°ΡΡ ΠΏΠΎΠΈΡΠΊΠΎΠ²ΡΠΌ ΡΠΈΡΡΠ΅ΠΌΠ°ΠΌ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠΎΠ²Π°ΡΡ ΡΡΡΠ°Π½ΠΈΡΡ Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΡΡ ΡΠ·ΡΠΊΠ°Ρ ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΠΌ ΠΊΠΎΠ½ΡΠ΅Π½Ρ Π½Π° ΠΈΡ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΌ ΡΠ·ΡΠΊΠ΅.
- ΠΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ: ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΡΡΠ»ΠΊΠΈ ΠΏΠΎ Π²ΡΠ΅ΠΌΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π²Ρ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅ΡΠ΅, ΡΡΠΎ Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡ ΠΎΡΡΠ°Π½Π΅ΡΡΡ Π² ΡΠ°ΠΌΠΊΠ°Ρ ΡΠ΅ΠΊΡΡΠ΅ΠΉ Π»ΠΎΠΊΠ°Π»ΠΈ, ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠ°Ρ Π½Π΅ΠΎΠΆΠΈΠ΄Π°Π½Π½ΡΠ΅ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ ΡΠ·ΡΠΊΠ°.
- ΠΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΠΌΠΎΡΡΡ: Π¦Π΅Π½ΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΡ Π»ΠΎΠ³ΠΈΠΊΠΈ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ΅ ΡΠΏΡΠΎΡΠ°Π΅Ρ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ URL, Π΄Π΅Π»Π°Ρ Π²Π°Ρ ΠΊΠΎΠ΄ Π±ΠΎΠ»Π΅Π΅ ΡΠ΄ΠΎΠ±Π½ΡΠΌ Π΄Π»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΠΈ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ ΠΏΠΎ ΠΌΠ΅ΡΠ΅ ΡΠΎΡΡΠ° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.
ΠΠΈΠΆΠ΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°
LinkΠ½Π° TypeScript:src/components/Link.tsxΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ Π² Π±ΡΡΠ΅Ρ ΠΎΠ±ΠΌΠ΅Π½Π°
"use client"; import { getLocalizedUrl } from "intlayer"; import NextLink, { type LinkProps as NextLinkProps } from "next/link"; import { useLocale } from "next-intlayer"; import { forwardRef, PropsWithChildren, type ForwardedRef } from "react"; /** * Π£ΡΠΈΠ»ΠΈΡΠ° Π΄Π»Ρ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ, ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈ Π΄Π°Π½Π½ΡΠΉ URL Π²Π½Π΅ΡΠ½ΠΈΠΌ. * ΠΡΠ»ΠΈ URL Π½Π°ΡΠΈΠ½Π°Π΅ΡΡΡ Ρ http:// ΠΈΠ»ΠΈ https://, ΠΎΠ½ ΡΡΠΈΡΠ°Π΅ΡΡΡ Π²Π½Π΅ΡΠ½ΠΈΠΌ. */ export const checkIsExternalLink = (href?: string): boolean => /^https?:\/\//.test(href ?? ""); /** * ΠΠ°ΡΡΠΎΠΌΠ½ΡΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Link, ΠΊΠΎΡΠΎΡΡΠΉ Π°Π΄Π°ΠΏΡΠΈΡΡΠ΅Ρ Π°ΡΡΠΈΠ±ΡΡ href Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΠΎΡ ΡΠ΅ΠΊΡΡΠ΅ΠΉ Π»ΠΎΠΊΠ°Π»ΠΈ. * ΠΠ»Ρ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΡ ΡΡΡΠ»ΠΎΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ `getLocalizedUrl`, ΡΡΠΎΠ±Ρ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΏΡΠ΅ΡΠΈΠΊΡ Π»ΠΎΠΊΠ°Π»ΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, /fr/about). * ΠΡΠΎ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡ ΠΎΡΡΠ°Π½Π΅ΡΡΡ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ΅ ΡΠ΅ΠΊΡΡΠ΅ΠΉ Π»ΠΎΠΊΠ°Π»ΠΈ. */ export const Link = forwardRef< HTMLAnchorElement, PropsWithChildren<NextLinkProps> >(({ href, children, ...props }, ref: ForwardedRef<HTMLAnchorElement>) => { const { locale } = useLocale(); const isExternalLink = checkIsExternalLink(href.toString()); // ΠΡΠ»ΠΈ ΡΡΡΠ»ΠΊΠ° Π²Π½ΡΡΡΠ΅Π½Π½ΡΡ ΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»Π΅Π½ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΡΠΉ href, ΠΏΠΎΠ»ΡΡΠΈΡΡ Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΉ URL. const hrefI18n: NextLinkProps["href"] = href && !isExternalLink ? getLocalizedUrl(href.toString(), locale) : href; return ( <NextLink href={hrefI18n} ref={ref} {...props}> {children} </NextLink> ); }); Link.displayName = "Link";ΠΠ°ΠΊ ΡΡΠΎ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ
ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π²Π½Π΅ΡΠ½ΠΈΡ ΡΡΡΠ»ΠΎΠΊ:
ΠΡΠΏΠΎΠΌΠΎΠ³Π°ΡΠ΅Π»ΡΠ½Π°Ρ ΡΡΠ½ΠΊΡΠΈΡcheckIsExternalLinkΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ, ΡΠ²Π»ΡΠ΅ΡΡΡ Π»ΠΈ URL Π²Π½Π΅ΡΠ½ΠΈΠΌ. ΠΠ½Π΅ΡΠ½ΠΈΠ΅ ΡΡΡΠ»ΠΊΠΈ ΠΎΡΡΠ°ΡΡΡΡ Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΈΠΌ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°ΡΠΈΡ.ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΊΡΡΠ΅ΠΉ Π»ΠΎΠΊΠ°Π»ΠΈ:
Π₯ΡΠΊuseLocaleΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ ΡΠ΅ΠΊΡΡΡΡ Π»ΠΎΠΊΠ°Π»Ρ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ,frΠ΄Π»Ρ ΡΡΠ°Π½ΡΡΠ·ΡΠΊΠΎΠ³ΠΎ).ΠΠΎΠΊΠ°Π»ΠΈΠ·Π°ΡΠΈΡ URL:
ΠΠ»Ρ Π²Π½ΡΡΡΠ΅Π½Π½ΠΈΡ ΡΡΡΠ»ΠΎΠΊ (ΡΠΎ Π΅ΡΡΡ Π½Π΅ Π²Π½Π΅ΡΠ½ΠΈΡ ) ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΡΠ½ΠΊΡΠΈΡgetLocalizedUrl, ΠΊΠΎΡΠΎΡΠ°Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΠΏΡΠ΅ΡΠΈΠΊΡ ΡΠ΅ΠΊΡΡΠ΅ΠΉ Π»ΠΎΠΊΠ°Π»ΠΈ ΠΊ URL. ΠΡΠΎ ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ, ΡΡΠΎ Π΅ΡΠ»ΠΈ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΡΠ°Π½ΡΡΠ·ΡΠΊΠΈΠΉ ΡΠ·ΡΠΊ, ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ°/aboutΠ² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅hrefΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ΅ΡΡΡ Π²/fr/about.ΠΠΎΠ·Π²ΡΠ°Ρ ΡΡΡΠ»ΠΊΠΈ:
ΠΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½Ρ<a>Ρ Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΡΠΌ URL, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Ρ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΡΡ Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ Π»ΠΎΠΊΠ°Π»ΡΡ.
ΠΠ½ΡΠ΅Π³ΡΠΈΡΡΡ ΡΡΠΎΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ
LinkΠΏΠΎ Π²ΡΠ΅ΠΌΡ Π²Π°ΡΠ΅ΠΌΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π²Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΠ΅ Π΅Π΄ΠΈΠ½ΡΠΉ ΠΈ ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ Π½Π° ΡΠ·ΡΠΊ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΡΡΠΊΠΈΠΉ ΠΎΠΏΡΡ, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ»ΡΡΡΠ°Π΅ΡΠ΅ SEO ΠΈ ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ.ΠΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΡΠ°Π·ΠΌΠ΅ΡΠ° Π±Π°Π½Π΄Π»Π°
ΠΠ΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎΠΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ
next-intlayerΡΠ»ΠΎΠ²Π°ΡΠΈ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π²ΠΊΠ»ΡΡΠ°ΡΡΡΡ Π² Π±Π°Π½Π΄Π» Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΡ. Π§ΡΠΎΠ±Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°Π·ΠΌΠ΅Ρ Π±Π°Π½Π΄Π»Π°, Intlayer ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΡΠΉ ΠΏΠ»Π°Π³ΠΈΠ½ SWC, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠ½ΡΠ΅Π»Π»Π΅ΠΊΡΡΠ°Π»ΡΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΡΠ΅Ρ Π²ΡΠ·ΠΎΠ²ΡuseIntlayerΡ ΠΏΠΎΠΌΠΎΡΡΡ ΠΌΠ°ΠΊΡΠΎΡΠΎΠ². ΠΡΠΎ Π³Π°ΡΠ°Π½ΡΠΈΡΡΠ΅Ρ, ΡΡΠΎ ΡΠ»ΠΎΠ²Π°ΡΠΈ Π²ΠΊΠ»ΡΡΠ°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² Π±Π°Π½Π΄Π»Ρ ΡΠ΅Ρ ΡΡΡΠ°Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΈΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ.Π§ΡΠΎΠ±Ρ Π²ΠΊΠ»ΡΡΠΈΡΡ ΡΡΡ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ, ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΠ΅ ΠΏΠ°ΠΊΠ΅Ρ
@intlayer/swc. ΠΠΎΡΠ»Π΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΊΠΈnext-intlayerΠ°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΡ ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΏΠ»Π°Π³ΠΈΠ½:bashΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ Π² Π±ΡΡΠ΅Ρ ΠΎΠ±ΠΌΠ΅Π½Π°
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅: ΠΡΠ° ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π΄ΠΎΡΡΡΠΏΠ½Π° ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ Next.js Π²Π΅ΡΡΠΈΠΈ 13 ΠΈ Π²ΡΡΠ΅.
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅: ΠΡΠΎΡ ΠΏΠ°ΠΊΠ΅Ρ Π½Π΅ ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΡΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΏΠ»Π°Π³ΠΈΠ½Ρ SWC Π² Next.js Π²ΡΡ Π΅ΡΡ Π½Π°Ρ ΠΎΠ΄ΡΡΡΡ Π² ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ°Π»ΡΠ½ΠΎΠΉ ΡΡΠ°Π΄ΠΈΠΈ. ΠΡΠΎ ΠΌΠΎΠΆΠ΅Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡΡΡ Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ.
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° TypeScript
Intlayer ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ (module augmentation), ΡΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²Π° TypeScript ΠΈ ΡΠ΄Π΅Π»Π°ΡΡ Π²Π°Ρ ΠΊΠΎΠ΄ Π±ΠΎΠ»Π΅Π΅ Π½Π°Π΄ΡΠΆΠ½ΡΠΌ.


Π£Π±Π΅Π΄ΠΈΡΠ΅ΡΡ, ΡΡΠΎ Π²Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ TypeScript Π²ΠΊΠ»ΡΡΠ°Π΅Ρ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΠΈΠΏΡ.
ΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ Π² Π±ΡΡΠ΅Ρ ΠΎΠ±ΠΌΠ΅Π½Π°
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Git
Π§ΡΠΎΠ±Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ Π²Π°Ρ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ Π² ΡΠΈΡΡΠΎΡΠ΅ ΠΈ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΠΊΠΎΠΌΠΌΠΈΡΠ° ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ², ΡΠ΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΠΉΠ»Ρ, ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΡΠ΅ Intlayer.
ΠΠΎΠ±Π°Π²ΡΡΠ΅ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΡΡΠΎΠΊΠΈ Π² Π²Π°Ρ ΡΠ°ΠΉΠ» .gitignore:
ΠΠΎΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ΄ Π² Π±ΡΡΠ΅Ρ ΠΎΠ±ΠΌΠ΅Π½Π°
Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ VS Code
ΠΠ»Ρ ΡΠ»ΡΡΡΠ΅Π½ΠΈΡ Π²Π°ΡΠ΅Π³ΠΎ ΠΎΠΏΡΡΠ° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ Ρ Intlayer Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΎΡΠΈΡΠΈΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ Intlayer Π΄Π»Ρ VS Code.
Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΈΠ· VS Code Marketplace
ΠΡΠΎ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ:
- ΠΠ²ΡΠΎΠ΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄Π»Ρ ΠΊΠ»ΡΡΠ΅ΠΉ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΎΠ².
- ΠΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡΠΈΠ±ΠΎΠΊ Π² ΡΠ΅Π°Π»ΡΠ½ΠΎΠΌ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π΄Π»Ρ ΠΎΡΡΡΡΡΡΠ²ΡΡΡΠΈΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΎΠ².
- ΠΡΡΡΠΎΠ΅Π½Π½ΡΠΉ ΠΏΡΠΎΡΠΌΠΎΡΡ ΠΏΠ΅ΡΠ΅Π²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ°.
- ΠΡΡΡΡΡΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ Π΄Π»Ρ Π»ΡΠ³ΠΊΠΎΠ³ΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΎΠ².
ΠΠ»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΠΎ ΡΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅, ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ΡΡ ΠΊ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ ΠΏΠΎ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡ Intlayer Π΄Π»Ρ VS Code.
ΠΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠ΅ ΡΠ΅ΡΡΡΡΡ
- ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Intlayer: Π Π΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ GitHub
- Π ΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΠΏΠΎ ΡΠ»ΠΎΠ²Π°ΡΡ: Π‘Π»ΠΎΠ²Π°ΡΡ
- ΠΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΏΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ: Π ΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΠΏΠΎ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ
Π‘Π»Π΅Π΄ΡΡ ΡΡΠΎΠΌΡ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Ρ, Π²Ρ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΠΎ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°ΡΡ Intlayer Π² Π²Π°ΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Next.js Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Page Router, ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Ρ Π½Π°Π΄Π΅ΠΆΠ½ΡΡ ΠΈ ΠΌΠ°ΡΡΡΠ°Π±ΠΈΡΡΠ΅ΠΌΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΡ ΠΈΠ½ΡΠ΅ΡΠ½Π°ΡΠΈΠΎΠ½Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π΄Π»Ρ Π²Π°ΡΠΈΡ Π²Π΅Π±-ΠΏΡΠΎΠ΅ΠΊΡΠΎΠ².
ΠΡΠΎΠ΄Π²ΠΈΠ½ΡΡΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ
Π§ΡΠΎΠ±Ρ ΠΏΠΎΠΉΡΠΈ Π΄Π°Π»ΡΡΠ΅, Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ Π²ΠΈΠ·ΡΠ°Π»ΡΠ½ΡΠΉ ΡΠ΅Π΄Π°ΠΊΡΠΎΡ ΠΈΠ»ΠΈ Π²ΡΠ½Π΅ΡΡΠΈ Π²Π°Ρ ΠΊΠΎΠ½ΡΠ΅Π½Ρ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ CMS.
Π§Π°ΡΡΠΎ Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡΠ΅ Π²ΠΎΠΏΡΠΎΡΡ
Pages Router ΠΏΠΎ-ΠΏΡΠ΅ΠΆΠ½Π΅ΠΌΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ Π²ΡΡΡΠΎΠ΅Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»Π΅ i18n Π² next.config.js, Π½ΠΎ ΠΎΠ½ΠΎ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΈΡ ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π»ΠΎΠΊΠ°Π»ΠΈ, Π½ΠΈΠΊΠΎΠ³Π΄Π° ΡΠ°ΠΌΠΈ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄Ρ, ΠΏΠΎΡΡΠΎΠΌΡ Π²Ρ Π²ΡΡ ΡΠ°Π²Π½ΠΎ Π²ΡΠ±ΠΈΡΠ°Π΅ΡΠ΅ ΡΠ»ΠΎΠΉ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ°:
next-i18next/i18nextΠΈnext-intl: ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²Π° ΠΈΠΌΡΠ½ JSON, Π·Π°Π³ΡΡΠΆΠ°Π΅ΠΌΡΠ΅ Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΡΡΡΠ°Π½ΠΈΡΡ, ΠΈΡΡΠΎΡΠΈΡΠ΅ΡΠΊΠ°Ρ ΡΠ²ΡΠ·ΠΊΠ° Ρ Pages Router.react-intlΠΈLingui: ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ ICU Ρ ΡΡΠ°ΠΏΠΎΠΌ ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΡ.Intlayer: ΠΊΠΎΠ½ΡΠ΅Π½Ρ, ΠΎΠ±ΡΡΠ²Π»Π΅Π½Π½ΡΠΉ ΡΡΠ΄ΠΎΠΌ Ρ ΠΊΠ°ΠΆΠ΄ΡΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠΌ ΠΈ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ ΠΏΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°ΠΌ, ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΠΉ, Ρ ΠΠ-ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΠΎΠΌ, Π²ΠΈΠ·ΡΠ°Π»ΡΠ½ΡΠΌ ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠΎΠΌ ΠΈ CMS.
Π‘ΠΌ. ΠΏΠΎΡΠ΅ΠΌΡ Intlayer ΠΈ Π±Π΅Π½ΡΠΌΠ°ΡΠΊ i18n Π΄Π»Ρ Next.js.
ΠΠΎΡΠ°Π·Π΄ΠΎ ΠΌΠ΅Π½ΡΡΠ΅, ΡΠ΅ΠΌ ΠΏΡΠΈ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄Π΅ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ² ΠΈΠΌΡΠ½, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΡΡΠ°Π½ΠΈΡΠ° Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π·Π°Π³ΡΡΠΆΠ°Π΅Ρ ΠΊΠ°ΡΠ°Π»ΠΎΠ³, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅Ρ. ΠΠΎΠ½ΡΠ΅Π½Ρ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅ΡΡΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ getStaticProps ΠΈ getServerSideProps, Π° Π½Π΅ ΠΏΠΎΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΠΊΠ°ΠΊ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΈ, ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ±ΠΎΡΠΊΠΈ Π·Π°ΠΌΠ΅Π½ΡΠ΅Ρ Π²ΡΠ·ΠΎΠ²Ρ useIntlayer ΡΠΎΡΠ½ΡΠΌΠΈ Π·Π°ΠΏΠΈΡΡΠΌΠΈ ΡΠ»ΠΎΠ²Π°ΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ, ΠΏΠΎΡΡΠΎΠΌΡ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΠΊΠ»ΡΡΠΈ ΠΈ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠ΅ ΡΠ·ΡΠΊΠΈ ΠΎΡΠ±ΡΠ°ΡΡΠ²Π°ΡΡΡΡ, Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΠ»ΠΎΠ²Π°ΡΠΈ ΡΠ°Π·Π΄Π΅Π»ΡΡΡ ΠΎΡΡΠ°Π»ΡΠ½ΠΎΠ΅ ΠΏΠΎ Π»ΠΎΠΊΠ°Π»ΡΠΌ. ΠΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ ΠΎΠ±ΡΡΠ½ΡΠΌΠΈ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π°ΠΌΠΈ Intlayer ΡΠΎΠΊΡΠ°ΡΠ°Π΅Ρ ΡΠ°Π·ΠΌΠ΅Ρ Π±Π°Π½Π΄Π»Π° ΠΈ ΡΡΡΠ°Π½ΠΈΡΡ Π΄ΠΎ 50%. Π‘ΠΌ. ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ Π±Π°Π½Π΄Π»Π° ΠΈ Π±Π΅Π½ΡΠΌΠ°ΡΠΊ.
ΠΠ°, ΠΈ Π΅ΡΡΡ Π΄Π²Π° ΠΏΡΡΠΈ. ΠΡ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΌΠΈΠ³ΡΠΈΡΠΎΠ²Π°ΡΡ ΠΊΠΎΠ½ΡΠ΅Π½Ρ ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎ Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Π° ΠΏΠΎ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈ Ρ next-intl ΠΈΠ»ΠΈ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Π° ΠΏΠΎ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈ Ρ i18next. ΠΠ»ΠΈ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΡΠΎΡ
ΡΠ°Π½ΠΈΡΡ ΡΠ²ΠΎΠΉ ΡΠ΅ΠΊΡΡΠΈΠΉ API: Π°Π΄Π°ΠΏΡΠ΅ΡΡ ΡΠΎΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΠΈ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΡΡ ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊΠΎΠΉ ΠΆΠ΅ API, ΠΊΠ°ΠΊ next-intl, react-i18next ΠΈ react-intl, Π½ΠΎ ΠΎΠ±ΡΠ»ΡΠΆΠΈΠ²Π°Π΅ΠΌΡΠΉ ΡΠ»ΠΎΠ²Π°ΡΡΠΌΠΈ Intlayer, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΠ΅Π½ΡΡΡΡΡ ΠΈΠΌΠΏΠΎΡΡΡ, Π° ΠΊΠΎΠ΄ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ² - Π½Π΅Ρ.
ΠΠ°. ΠΠ»Π°Π³ΠΈΠ½ ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ JSON ΡΠΎΡ
ΡΠ°Π½ΡΠ΅Ρ Π²Π°ΡΠΈ ΡΠ°ΠΉΠ»Ρ /messages/{locale}/{namespace}.json ΠΊΠ°ΠΊ ΠΈΡΡΠΎΡΠ½ΠΈΠΊ ΠΈΡΡΠΈΠ½Ρ ΠΈ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΠΈΠ· Π½ΠΈΡ
ΡΠ»ΠΎΠ²Π°ΡΠΈ Intlayer, Π² ΠΎΠ±ΠΎΠΈΡ
Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡΡ
. ΠΠ»Π°Π³ΠΈΠ½ ΡΠΈΠ½Ρ
ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΠΈ PO Π΄Π΅Π»Π°Π΅Ρ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ Π΄Π»Ρ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ² gettext, Π° ΡΠ°ΠΉΠ»Ρ ΠΏΠΎ Π»ΠΎΠΊΠ°Π»ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΡ ΠΊΠΎΠ½ΡΠ΅Π½Ρ ΠΏΠΎ ΡΠ·ΡΠΊΠ°ΠΌ Π²ΠΌΠ΅ΡΡΠΎ Π³ΡΡΠΏΠΏΠΈΡΠΎΠ²ΠΊΠΈ Π»ΠΎΠΊΠ°Π»Π΅ΠΉ Π² ΠΎΠ΄Π½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅.
ΠΠ΅Ρ. ΠΠ°ΠΏΡΡΡΠΈΡΠ΅ npx intlayer extract, ΠΈ Intlayer ΠΏΡΠΎΡΠΈΡΠ°Π΅Ρ Π²Π°ΡΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΡ, ΠΈΠ·Π²Π»Π΅ΡΡΡ ΡΡΡΠΎΠΊΠΈ, Π²ΠΈΠ΄ΠΈΠΌΡΠ΅ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΠΈ Π·Π°ΠΏΠΈΡΠ΅Ρ ΡΠ°ΠΉΠ» .content ΡΡΠ΄ΠΎΠΌ Ρ ΠΊΠ°ΠΆΠ΄ΡΠΌ ΠΈΠ· Π½ΠΈΡ
, ΡΠ°ΠΊ ΡΡΠΎ Π²Ρ ΠΏΡΠΎΡΠΌΠ°ΡΡΠΈΠ²Π°Π΅ΡΠ΅ diff Π²ΠΌΠ΅ΡΡΠΎ ΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΡΡΠΎΠΊ Π² ΠΊΠ°ΡΠ°Π»ΠΎΠ³ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ.
ΠΠ»Ρ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Π²Π΅ΠΉΠ΅ΡΠ° ΠΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Intlayer Π΄Π΅Π»Π°Π΅Ρ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ Π²ΠΎ Π²ΡΠ΅ΠΌΡ ΡΠ±ΠΎΡΠΊΠΈ: ΠΎΠ½ ΡΠΊΠ°Π½ΠΈΡΡΠ΅Ρ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ JSX, TSX, Vue ΠΈ Svelte ΠΏΡΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ, Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΡΠ»ΠΎΠ²Π°ΡΠΈ ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅Ρ ΠΈΡ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·Π°ΡΠΈΡ ΡΠ΅ΡΠ΅Π· Π³ΠΎΡΡΡΡΡ Π·Π°ΠΌΠ΅Π½Ρ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ, ΠΏΠΎΡΡΠΎΠΌΡ Π²ΡΡΡΠ½ΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΠΊΠ»ΡΡΠΈ Π²ΠΎΠΎΠ±ΡΠ΅ Π½Π΅ Π½ΡΠΆΠ½ΠΎ.
Π‘ΡΠΎΠΈΡ Π·Π½Π°ΡΡ ΠΎ Π΄Π²ΡΡ
ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΡΡ
, ΠΏΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ Π²ΠΊΠ»ΡΡΠ°ΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ. ΠΠ½ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ ΡΠ΅ΡΠ΅Π· ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ·, ΠΏΠΎΡΡΠΎΠΌΡ ΡΡΡΠΎΠΊΠΈ, ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠΈΠ΅ ΡΠΎΠ»ΡΠΊΠΎ Π²ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΊΠΎΠ΄Ρ ΠΎΡΠΈΠ±ΠΎΠΊ API ΠΈΠ»ΠΈ ΠΏΠΎΠ»Ρ CMS, ΠΎΡΡΠ°ΡΡΡΡ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½ΡΠΌΠΈ. Π Π΅ΠΌΡ Π½ΡΠΆΠ½ΠΎ ΠΎΡΠ»ΠΈΡΠ°ΡΡ ΡΠ΅ΠΊΡΡ, Π²ΠΈΠ΄ΠΈΠΌΡΠΉ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ, ΠΎΡ Π»ΠΎΠ³ΠΈΠΊΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π²ΡΠΎΠ΄Π΅ className="active" ΠΈΠ»ΠΈ ΠΊΠΎΠ΄Π° ΡΡΠ°ΡΡΡΠ°, ΡΡΠΎ ΡΡΠ΅Π±ΡΠ΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ
Π°Π½Π½ΠΎΡΠ°ΡΠΈΠΉ Π² Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·Π΅. ΠΠΎΠΌΠ°Π½Π΄Π° extract ΠΈΠ·Π±Π΅Π³Π°Π΅Ρ ΠΎΠ±ΠΎΠΈΡ
ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠΉ, ΠΎΡΡΠ°Π²Π»ΡΡ Π²Π°Ρ Π² ΠΏΡΠΎΡΠ΅ΡΡΠ΅.
ΠΡΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠΎΠ², Π²ΡΠ΅ ΠΎΠΏΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΠ΅:
- Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ VS Code: ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ ΠΎΡ ΠΊΠ»ΡΡΠ°
useIntlayerΠΊ ΡΠ°ΠΉΠ»Ρ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ Π΅Π³ΠΎ ΠΎΠ±ΡΡΠ²Π»ΡΠ΅Ρ, ΠΈΠ·Π²Π»Π΅ΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ° ΠΈΠ· ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° ΠΈ Π·Π°ΠΏΡΡΠΊ build, fill, test, push ΠΈ pull ΠΈΠ· ΠΏΠ°Π»ΠΈΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈΠ»ΠΈ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ Π²ΠΊΠ»Π°Π΄ΠΊΠΈ Intlayer. - LSP-ΡΠ΅ΡΠ²Π΅Ρ: ΡΠ° ΠΆΠ΅ ΠΎΡΠ²Π΅Π΄ΠΎΠΌΠ»ΡΠ½Π½ΠΎΡΡΡ Π² Π»ΡΠ±ΠΎΠΌ ΡΠ΅Π΄Π°ΠΊΡΠΎΡΠ΅, ΠΊΠΎΡΠΎΡΡΠΉ Π³ΠΎΠ²ΠΎΡΠΈΡ Π½Π° LSP, Ρ ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΎΠΌ ΠΊ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ, ΠΏΠΎΠΈΡΠΊΠΎΠΌ Π²ΡΠ΅Ρ
ΡΡΡΠ»ΠΎΠΊ, ΠΏΡΠ΅Π΄ΠΏΡΠΎΡΠΌΠΎΡΡΠΎΠΌ ΠΏΠ΅ΡΠ΅Π²Π΅Π΄ΡΠ½Π½ΠΎΠ³ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΏΡΠΈ Π½Π°Π²Π΅Π΄Π΅Π½ΠΈΠΈ, Π°Π²ΡΠΎΠ΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠ»ΡΡΠ΅ΠΉ ΠΈ ΠΏΠΎΠ»Π΅ΠΉ ΠΈ ΠΏΡΠ΅Π΄ΡΠΏΡΠ΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ, ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΡΡ Π½ΠΈΠ³Π΄Π΅ Π½Π΅ ΠΎΠ±ΡΡΠ²Π»Π΅Π½. ΠΠ½ ΡΠ°ΠΊΠΆΠ΅ ΡΠ°Π·ΡΠ΅ΡΠ°Π΅Ρ Π²ΡΠ·ΠΎΠ²Ρ
i18next,react-i18next,next-intlΠΈuse-intl, ΡΡΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΠΏΡΠΈ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈ. - MCP-ΡΠ΅ΡΠ²Π΅Ρ: ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ ΠΈ CLI Intlayer Π΄Π»Ρ Cursor, VS Code, Claude Desktop, Claude Code ΠΈ ChatGPT, ΡΡΠΎΠ±Ρ Π°ΡΡΠΈΡΡΠ΅Π½Ρ ΠΎΡΠ²Π΅ΡΠ°Π» ΠΏΠΎ Π°ΠΊΡΡΠ°Π»ΡΠ½ΠΎΠΉ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΠΈ, Π° Π½Π΅ Π³Π°Π΄Π°Π», ΠΈ ΠΌΠΎΠ³ ΡΠ°ΠΌ Π·Π°ΠΏΡΡΠΊΠ°ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ Π²ΡΠΎΠ΄Π΅
intlayer fill. - ΠΠ°Π²ΡΠΊΠΈ Π°Π³Π΅Π½ΡΠΎΠ²: ΡΡΠΎΠΊΡΡΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ Π½Π°Π²ΡΠΊΠΈ, ΡΠ°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ
intlayer-config,intlayer-cliΠΈintlayer-content, ΠΏΠ»ΡΡ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡ Π½Π° ΡΡΠ΅ΠΉΠΌΠ²ΠΎΡΠΊ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ±ΡΡΠ°ΡΡ Π°Π³Π΅Π½ΡΠ° Π²Π°ΡΠ΅ΠΉ Π½Π°ΡΡΡΠΎΠΉΠΊΠ΅ ΠΌΠ°ΡΡΡΡΡΠΈΠ·Π°ΡΠΈΠΈ ΠΈ ΡΠΈΠΏΠ°ΠΌ ΡΠ·Π»ΠΎΠ² ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ°. - ΠΠ»Π°Π³ΠΈΠ½ ESLint:
no-raw-textΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ ΠΆΡΡΡΠΊΠΎ Π·Π°ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½Π½ΡΠ΅ ΡΡΡΠΎΠΊΠΈ, Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΠΌΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π°ΠΌΠΈ Π΄Π»Ρ ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΊΠ»ΡΡΠ΅ΠΉ ΡΠ»ΠΎΠ²Π°ΡΡ ΠΈ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ½ΡΠ΅Π½ΡΠ°.
